return nil
}
+func (msg *MessageInitiation) marshal(b []byte) error {
+ if len(b) != MessageInitiationSize {
+ return errMessageLengthMismatch
+ }
+
+ binary.LittleEndian.PutUint32(b, msg.Type)
+ binary.LittleEndian.PutUint32(b[4:], msg.Sender)
+ copy(b[8:], msg.Ephemeral[:])
+ copy(b[8+len(msg.Ephemeral):], msg.Static[:])
+ copy(b[8+len(msg.Ephemeral)+len(msg.Static):], msg.Timestamp[:])
+ copy(b[8+len(msg.Ephemeral)+len(msg.Static)+len(msg.Timestamp):], msg.MAC1[:])
+ copy(b[8+len(msg.Ephemeral)+len(msg.Static)+len(msg.Timestamp)+len(msg.MAC1):], msg.MAC2[:])
+
+ return nil
+}
+
func (msg *MessageResponse) unmarshal(b []byte) error {
if len(b) != MessageResponseSize {
return errMessageLengthMismatch
return nil
}
+func (msg *MessageResponse) marshal(b []byte) error {
+ if len(b) != MessageResponseSize {
+ return errMessageLengthMismatch
+ }
+
+ binary.LittleEndian.PutUint32(b, msg.Type)
+ binary.LittleEndian.PutUint32(b[4:], msg.Sender)
+ binary.LittleEndian.PutUint32(b[8:], msg.Receiver)
+ copy(b[12:], msg.Ephemeral[:])
+ copy(b[12+len(msg.Ephemeral):], msg.Empty[:])
+ copy(b[12+len(msg.Ephemeral)+len(msg.Empty):], msg.MAC1[:])
+ copy(b[12+len(msg.Ephemeral)+len(msg.Empty)+len(msg.MAC1):], msg.MAC2[:])
+
+ return nil
+}
+
func (msg *MessageCookieReply) unmarshal(b []byte) error {
if len(b) != MessageCookieReplySize {
return errMessageLengthMismatch
return nil
}
+func (msg *MessageCookieReply) marshal(b []byte) error {
+ if len(b) != MessageCookieReplySize {
+ return errMessageLengthMismatch
+ }
+
+ binary.LittleEndian.PutUint32(b, msg.Type)
+ binary.LittleEndian.PutUint32(b[4:], msg.Receiver)
+ copy(b[8:], msg.Nonce[:])
+ copy(b[8+len(msg.Nonce):], msg.Cookie[:])
+
+ return nil
+}
+
type Handshake struct {
state handshakeState
mutex sync.RWMutex
package device
import (
- "bytes"
"encoding/binary"
"errors"
"net"
return err
}
- var buf [MessageInitiationSize]byte
- writer := bytes.NewBuffer(buf[:0])
- binary.Write(writer, binary.LittleEndian, msg)
- packet := writer.Bytes()
+ packet := make([]byte, MessageInitiationSize)
+ _ = msg.marshal(packet)
peer.cookieGenerator.AddMacs(packet)
peer.timersAnyAuthenticatedPacketTraversal()
return err
}
- var buf [MessageResponseSize]byte
- writer := bytes.NewBuffer(buf[:0])
- binary.Write(writer, binary.LittleEndian, response)
- packet := writer.Bytes()
+ packet := make([]byte, MessageResponseSize)
+ _ = response.marshal(packet)
peer.cookieGenerator.AddMacs(packet)
err = peer.BeginSymmetricSession()
return err
}
- var buf [MessageCookieReplySize]byte
- writer := bytes.NewBuffer(buf[:0])
- binary.Write(writer, binary.LittleEndian, reply)
+ packet := make([]byte, MessageCookieReplySize)
+ _ = reply.marshal(packet)
// TODO: allocation could be avoided
- device.net.bind.Send([][]byte{writer.Bytes()}, initiatingElem.endpoint)
+ device.net.bind.Send([][]byte{packet}, initiatingElem.endpoint)
+
return nil
}