diff options
author | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2017-06-24 15:34:17 +0200 |
---|---|---|
committer | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2017-06-24 15:34:44 +0200 |
commit | 25190e43369a79dc77a740dc8cd28b8a9fcb235e (patch) | |
tree | b7057627e0710fe9ef40c077a204904c78bed9cc /src/device.go | |
parent | 521e77fd54fba275405affd790ac91f7998e4559 (diff) |
Restructuring of noise impl.
Diffstat (limited to 'src/device.go')
-rw-r--r-- | src/device.go | 75 |
1 files changed, 47 insertions, 28 deletions
diff --git a/src/device.go b/src/device.go index 9f1daa6..9969034 100644 --- a/src/device.go +++ b/src/device.go @@ -1,17 +1,13 @@ package main import ( - "math/rand" "sync" ) -/* TODO: Locking may be a little broad here - */ - type Device struct { mutex sync.RWMutex peers map[NoisePublicKey]*Peer - sessions map[uint32]*Handshake + indices IndexTable privateKey NoisePrivateKey publicKey NoisePublicKey fwMark uint32 @@ -19,43 +15,66 @@ type Device struct { routingTable RoutingTable } -func (dev *Device) NewID(h *Handshake) uint32 { - dev.mutex.Lock() - defer dev.mutex.Unlock() - for { - id := rand.Uint32() - _, ok := dev.sessions[id] - if !ok { - dev.sessions[id] = h - return id - } +func (device *Device) SetPrivateKey(sk NoisePrivateKey) { + device.mutex.Lock() + defer device.mutex.Unlock() + + // update key material + + device.privateKey = sk + device.publicKey = sk.publicKey() + + // do precomputations + + for _, peer := range device.peers { + h := &peer.handshake + h.mutex.Lock() + h.precomputedStaticStatic = device.privateKey.sharedSecret(h.remoteStatic) + h.mutex.Unlock() } } -func (dev *Device) RemovePeer(key NoisePublicKey) { - dev.mutex.Lock() - defer dev.mutex.Unlock() - peer, ok := dev.peers[key] +func (device *Device) Init() { + device.mutex.Lock() + defer device.mutex.Unlock() + + device.peers = make(map[NoisePublicKey]*Peer) + device.indices.Init() + device.listenPort = 0 + device.routingTable.Reset() +} + +func (device *Device) LookupPeer(pk NoisePublicKey) *Peer { + device.mutex.RLock() + defer device.mutex.RUnlock() + return device.peers[pk] +} + +func (device *Device) RemovePeer(key NoisePublicKey) { + device.mutex.Lock() + defer device.mutex.Unlock() + + peer, ok := device.peers[key] if !ok { return } peer.mutex.Lock() - dev.routingTable.RemovePeer(peer) - delete(dev.peers, key) + device.routingTable.RemovePeer(peer) + delete(device.peers, key) } -func (dev *Device) RemoveAllAllowedIps(peer *Peer) { +func (device *Device) RemoveAllAllowedIps(peer *Peer) { } -func (dev *Device) RemoveAllPeers() { - dev.mutex.Lock() - defer dev.mutex.Unlock() +func (device *Device) RemoveAllPeers() { + device.mutex.Lock() + defer device.mutex.Unlock() - for key, peer := range dev.peers { + for key, peer := range device.peers { peer.mutex.Lock() - dev.routingTable.RemovePeer(peer) - delete(dev.peers, key) + device.routingTable.RemovePeer(peer) + delete(device.peers, key) peer.mutex.Unlock() } } |