aboutsummaryrefslogtreecommitdiffstats
path: root/src/device.rs
diff options
context:
space:
mode:
authorMathias Hall-Andersen <mathias@hall-andersen.dk>2019-07-18 19:52:23 +0200
committerMathias Hall-Andersen <mathias@hall-andersen.dk>2019-07-18 19:52:23 +0200
commite0e95d9679e4cb0eb905d9f0910a49fe86586982 (patch)
tree290fe613430ea4a30fa7ee947cf95d0dbab0ccab /src/device.rs
parentBegin processing of initation (diff)
downloadwireguard-rs-e0e95d9679e4cb0eb905d9f0910a49fe86586982.tar.xz
wireguard-rs-e0e95d9679e4cb0eb905d9f0910a49fe86586982.zip
Begin creation of response
Diffstat (limited to 'src/device.rs')
-rw-r--r--src/device.rs36
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 {