summaryrefslogtreecommitdiffhomepage
path: root/noise-protocol.go
diff options
context:
space:
mode:
authorJason A. Donenfeld <Jason@zx2c4.com>2018-05-13 19:50:58 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2018-05-13 19:52:13 +0200
commit729773fdf3cbec5f75d5981fc1fe6f7f21b0e00c (patch)
tree81d86b767cce3b641884bc143c03712df0716bc4 /noise-protocol.go
parent680a57faaefbb7ca4be10ef7beefdc70b74f59c2 (diff)
More odds and ends
Diffstat (limited to 'noise-protocol.go')
-rw-r--r--noise-protocol.go33
1 files changed, 27 insertions, 6 deletions
diff --git a/noise-protocol.go b/noise-protocol.go
index 82d553e..f72dcc4 100644
--- a/noise-protocol.go
+++ b/noise-protocol.go
@@ -319,6 +319,9 @@ func (device *Device) ConsumeMessageInitiation(msg *MessageInitiation) *Peer {
handshake.mutex.Unlock()
+ setZero(hash[:])
+ setZero(chainKey[:])
+
return peer
}
@@ -362,7 +365,7 @@ func (device *Device) CreateMessageResponse(peer *Peer) (*MessageResponse, error
handshake.mixKey(ss[:])
}()
- // add preshared key (psk)
+ // add preshared key
var tau [blake2s.Size]byte
var key [chacha20poly1305.KeySize]byte
@@ -457,7 +460,6 @@ func (device *Device) ConsumeMessageResponse(msg *MessageResponse) *Peer {
aead, _ := chacha20poly1305.New(key[:])
_, err := aead.Open(nil, ZeroNonce[:], msg.Empty[:], hash[:])
if err != nil {
- device.log.Debug.Println("failed to open")
return false
}
mixHash(&hash, &hash, msg.Empty[:])
@@ -485,10 +487,10 @@ func (device *Device) ConsumeMessageResponse(msg *MessageResponse) *Peer {
return lookup.peer
}
-/* Derives a new key-pair from the current handshake state
+/* Derives a new keypair from the current handshake state
*
*/
-func (peer *Peer) NewKeypair() *Keypair {
+func (peer *Peer) DeriveNewKeypair() error {
device := peer.device
handshake := &peer.handshake
handshake.mutex.Lock()
@@ -517,12 +519,13 @@ func (peer *Peer) NewKeypair() *Keypair {
)
isInitiator = false
} else {
- return nil
+ return errors.New("invalid state for keypair derivation")
}
// zero handshake
setZero(handshake.chainKey[:])
+ setZero(handshake.hash[:]) // Doesn't necessarily need to be zeroed. Could be used for something interesting down the line.
setZero(handshake.localEphemeral[:])
peer.handshake.state = HandshakeZeroed
@@ -576,5 +579,23 @@ func (peer *Peer) NewKeypair() *Keypair {
}
kp.mutex.Unlock()
- return keypair
+ return nil
+}
+
+func (peer *Peer) ReceivedWithKeypair(receivedKeypair *Keypair) bool {
+ kp := &peer.keypairs
+ if kp.next != receivedKeypair {
+ return false
+ }
+ kp.mutex.Lock()
+ defer kp.mutex.Unlock()
+ if kp.next != receivedKeypair {
+ return false
+ }
+ old := kp.previous
+ kp.previous = kp.current
+ peer.device.DeleteKeypair(old)
+ kp.current = kp.next
+ kp.next = nil
+ return true
}