diff options
author | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2019-07-18 19:52:23 +0200 |
---|---|---|
committer | Mathias Hall-Andersen <mathias@hall-andersen.dk> | 2019-07-18 19:52:23 +0200 |
commit | e0e95d9679e4cb0eb905d9f0910a49fe86586982 (patch) | |
tree | 290fe613430ea4a30fa7ee947cf95d0dbab0ccab /src/device.rs | |
parent | Begin processing of initation (diff) | |
download | wireguard-rs-e0e95d9679e4cb0eb905d9f0910a49fe86586982.tar.xz wireguard-rs-e0e95d9679e4cb0eb905d9f0910a49fe86586982.zip |
Begin creation of response
Diffstat (limited to 'src/device.rs')
-rw-r--r-- | src/device.rs | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/src/device.rs b/src/device.rs index 85adc69..0635a5e 100644 --- a/src/device.rs +++ b/src/device.rs @@ -60,13 +60,13 @@ impl Device { // map : pk -> new index - self.pkmap.insert(*pk.as_bytes(), self.peers.len()); + let idx = self.peers.len(); + self.pkmap.insert(*pk.as_bytes(), idx); // map : new index -> peer self.peers.push(Peer::new( - pk, - self.sk.diffie_hellman(&pk) + idx, pk, self.sk.diffie_hellman(&pk) )); Ok(()) @@ -115,19 +115,12 @@ impl Device { None => Err(HandshakeError::UnknownPublicKey), Some(&idx) => { let peer = &self.peers[idx]; - let id = self.allocate(idx); - noise::create_initiation(self, peer, id) + let sender = self.allocate(idx); + noise::create_initiation(self, peer, sender) } } } - pub fn lookup(&self, pk : &PublicKey) -> Result<&Peer, HandshakeError> { - match self.pkmap.get(pk.as_bytes()) { - Some(&idx) => Ok(&self.peers[idx]), - _ => Err(HandshakeError::UnknownPublicKey) - } - } - /// Process a handshake message. /// /// # Arguments @@ -136,7 +129,17 @@ impl Device { pub fn process(&self, msg : &[u8]) -> Result<Output, HandshakeError> { match msg.get(0) { Some(&messages::TYPE_INITIATION) => { - noise::process_initiation(self, msg) + // consume the initiation + let (peer, receiver, hs, ck) = noise::consume_initiation(self, msg)?; + + // allocate index for response + let sender = self.allocate(peer.idx); + + // create response + noise::create_response(self, peer, sender, receiver, hs, ck).map_err(|e| { + self.release(sender); + e + }) }, Some(&messages::TYPE_RESPONSE) => { Err(HandshakeError::InvalidMessageFormat) @@ -144,6 +147,13 @@ impl Device { _ => Err(HandshakeError::InvalidMessageFormat) } } + + pub fn lookup(&self, pk : &PublicKey) -> Result<&Peer, HandshakeError> { + match self.pkmap.get(pk.as_bytes()) { + Some(&idx) => Ok(&self.peers[idx]), + _ => Err(HandshakeError::UnknownPublicKey) + } + } } impl Device { |