@@ -45,11 +45,15 @@ import (
4545 */
4646
4747type QueueOutboundElement struct {
48- buffer * [MaxMessageSize ]byte // slice holding the packet data
49- packet []byte // slice of "buffer" (always!)
50- nonce uint64 // nonce for encryption
51- keypair * Keypair // keypair for encryption
52- peer * Peer // related peer
48+ buffer * [MaxMessageSize ]byte // slice holding the packet data
49+ // packet is always a slice of "buffer". The starting offset in buffer
50+ // is either:
51+ // a) MessageEncapsulatingTransportSize+MessageTransportHeaderSize (plaintext)
52+ // b) 0 (post-encryption)
53+ packet []byte
54+ nonce uint64 // nonce for encryption
55+ keypair * Keypair // keypair for encryption
56+ peer * Peer // related peer
5357}
5458
5559type QueueOutboundElementsContainer struct {
@@ -123,14 +127,15 @@ func (peer *Peer) SendHandshakeInitiation(isRetry bool) error {
123127 return err
124128 }
125129
126- packet := make ([]byte , MessageInitiationSize )
130+ buf := make ([]byte , MessageEncapsulatingTransportSize + MessageInitiationSize )
131+ packet := buf [MessageEncapsulatingTransportSize :]
127132 _ = msg .marshal (packet )
128133 peer .cookieGenerator .AddMacs (packet )
129134
130135 peer .timersAnyAuthenticatedPacketTraversal ()
131136 peer .timersAnyAuthenticatedPacketSent ()
132137
133- err = peer .SendBuffers ([][]byte {packet })
138+ err = peer .SendBuffers ([][]byte {buf })
134139 if err != nil {
135140 peer .device .log .Errorf ("%v - Failed to send handshake initiation: %v" , peer , err )
136141 }
@@ -152,7 +157,8 @@ func (peer *Peer) SendHandshakeResponse() error {
152157 return err
153158 }
154159
155- packet := make ([]byte , MessageResponseSize )
160+ buf := make ([]byte , MessageEncapsulatingTransportSize + MessageResponseSize )
161+ packet := buf [MessageEncapsulatingTransportSize :]
156162 _ = response .marshal (packet )
157163 peer .cookieGenerator .AddMacs (packet )
158164
@@ -167,7 +173,7 @@ func (peer *Peer) SendHandshakeResponse() error {
167173 peer .timersAnyAuthenticatedPacketSent ()
168174
169175 // TODO: allocation could be avoided
170- err = peer .SendBuffers ([][]byte {packet })
176+ err = peer .SendBuffers ([][]byte {buf })
171177 if err != nil {
172178 peer .device .log .Errorf ("%v - Failed to send handshake response: %v" , peer , err )
173179 }
@@ -184,10 +190,11 @@ func (device *Device) SendHandshakeCookie(initiatingElem *QueueHandshakeElement)
184190 return err
185191 }
186192
187- packet := make ([]byte , MessageCookieReplySize )
193+ buf := make ([]byte , MessageEncapsulatingTransportSize + MessageCookieReplySize )
194+ packet := buf [MessageEncapsulatingTransportSize :]
188195 _ = reply .marshal (packet )
189196 // TODO: allocation could be avoided
190- device .net .bind .Send ([][]byte {packet }, initiatingElem .endpoint )
197+ device .net .bind .Send ([][]byte {buf }, initiatingElem .endpoint , MessageEncapsulatingTransportSize )
191198
192199 return nil
193200}
@@ -220,7 +227,7 @@ func (device *Device) RoutineReadFromTUN() {
220227 elemsByPeer = make (map [* Peer ]* QueueOutboundElementsContainer , batchSize )
221228 count = 0
222229 sizes = make ([]int , batchSize )
223- offset = MessageTransportHeaderSize
230+ offset = MessageEncapsulatingTransportSize + MessageTransportHeaderSize
224231 )
225232
226233 for i := range elems {
@@ -446,7 +453,7 @@ func (device *Device) RoutineEncryption(id int) {
446453 for elemsContainer := range device .queue .encryption .c {
447454 for _ , elem := range elemsContainer .elems {
448455 // populate header fields
449- header := elem .buffer [: MessageTransportHeaderSize ]
456+ header := elem .buffer [MessageEncapsulatingTransportSize : MessageEncapsulatingTransportSize + MessageTransportHeaderSize ]
450457
451458 fieldType := header [0 :4 ]
452459 fieldReceiver := header [4 :8 ]
@@ -469,6 +476,9 @@ func (device *Device) RoutineEncryption(id int) {
469476 elem .packet ,
470477 nil ,
471478 )
479+
480+ // re-slice packet to include encapsulating transport space
481+ elem .packet = elem .buffer [:MessageEncapsulatingTransportSize + len (elem .packet )]
472482 }
473483 elemsContainer .Unlock ()
474484 }
0 commit comments