summaryrefslogtreecommitdiffhomepage
path: root/src/peer.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/peer.go')
-rw-r--r--src/peer.go43
1 files changed, 34 insertions, 9 deletions
diff --git a/src/peer.go b/src/peer.go
index f6eb555..42b9e8d 100644
--- a/src/peer.go
+++ b/src/peer.go
@@ -1,39 +1,64 @@
package main
import (
+ "errors"
+ "golang.org/x/crypto/blake2s"
"net"
"sync"
"time"
)
+const (
+ OutboundQueueSize = 64
+)
+
type Peer struct {
mutex sync.RWMutex
endpointIP net.IP //
endpointPort uint16 //
persistentKeepaliveInterval time.Duration // 0 = disabled
+ keyPairs KeyPairs
handshake Handshake
device *Device
+ macKey [blake2s.Size]byte // Hash(Label-Mac1 || publicKey)
+ cookie []byte // cookie
+ cookieExpire time.Time
+ queueInbound chan []byte
+ queueOutbound chan *OutboundWorkQueueElement
+ queueOutboundRouting chan []byte
}
func (device *Device) NewPeer(pk NoisePublicKey) *Peer {
var peer Peer
+ // create peer
+
+ peer.mutex.Lock()
+ peer.device = device
+ peer.queueOutbound = make(chan *OutboundWorkQueueElement, OutboundQueueSize)
+
// map public key
device.mutex.Lock()
+ _, ok := device.peers[pk]
+ if ok {
+ panic(errors.New("bug: adding existing peer"))
+ }
device.peers[pk] = &peer
device.mutex.Unlock()
- // precompute
+ // precompute DH
- peer.mutex.Lock()
- peer.device = device
- func(h *Handshake) {
- h.mutex.Lock()
- h.remoteStatic = pk
- h.precomputedStaticStatic = device.privateKey.sharedSecret(h.remoteStatic)
- h.mutex.Unlock()
- }(&peer.handshake)
+ handshake := &peer.handshake
+ handshake.mutex.Lock()
+ handshake.remoteStatic = pk
+ handshake.precomputedStaticStatic = device.privateKey.sharedSecret(handshake.remoteStatic)
+
+ // compute mac key
+
+ peer.macKey = blake2s.Sum256(append([]byte(WGLabelMAC1[:]), handshake.remoteStatic[:]...))
+
+ handshake.mutex.Unlock()
peer.mutex.Unlock()
return &peer