diff --git a/src/messages.rs b/src/messages.rs index 92a5a3e..805de8d 100644 --- a/src/messages.rs +++ b/src/messages.rs @@ -29,7 +29,7 @@ impl From<&[u8]> for Initiation { let mut msg : Self; owned.copy_from_slice(b); - // cast to MessageInitiate + // cast to Initiation unsafe { msg = mem::transmute::<[u8; mem::size_of::()], Self>(owned); }; @@ -61,7 +61,7 @@ impl Into> for Initiation { impl fmt::Debug for Initiation { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, - "MessageInitiate {{ type = {} }}", + "MessageInitiation {{ type = {} }}", self.f_type ) } @@ -101,7 +101,7 @@ impl Eq for Initiation {} */ #[repr(C)] #[derive(Copy, Clone)] -pub struct MessageResponse { +pub struct Response { f_type : u8, f_reserved : [u8; 3], f_sender : u32, @@ -110,14 +110,14 @@ pub struct MessageResponse { f_empty : [u8; SIZE_TAG], } -impl From<&[u8]> for MessageResponse { +impl From<&[u8]> for Response { fn from(b: &[u8]) -> Self { // create owned copy let mut owned = [0u8; mem::size_of::()]; let mut msg : Self; owned.copy_from_slice(b); - // cast to MessageInitiate + // cast to MessageResponse unsafe { msg = mem::transmute::<[u8; mem::size_of::()], Self>(owned); }; @@ -130,7 +130,7 @@ impl From<&[u8]> for MessageResponse { } } -impl Into> for MessageResponse { +impl Into> for Response { fn into(self) -> Vec { // correct endianness let mut msg = self; @@ -148,7 +148,7 @@ impl Into> for MessageResponse { } } -impl fmt::Debug for MessageResponse { +impl fmt::Debug for Response { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "MessageResponse {{ type = {} }}", @@ -158,7 +158,7 @@ impl fmt::Debug for MessageResponse { } #[cfg(test)] -impl PartialEq for MessageResponse { +impl PartialEq for Response { fn eq(&self, other: &Self) -> bool { self.f_type == other.f_type && self.f_reserved == other.f_reserved && @@ -175,7 +175,7 @@ mod tests { #[test] fn message_response_identity() { - let msg = MessageResponse { + let msg = Response { f_type : TYPE_RESPONSE, f_reserved : [0u8; 3], f_sender : 146252, @@ -195,7 +195,7 @@ mod tests { }; let buf : Vec = msg.into(); - assert_eq!(msg, MessageResponse::from(&buf[..])); + assert_eq!(msg, Response::from(&buf[..])); } #[test] diff --git a/src/noise.rs b/src/noise.rs index 6d3850c..4d741c0 100644 --- a/src/noise.rs +++ b/src/noise.rs @@ -16,9 +16,6 @@ type HMACBlake2s = Hmac; /* Internal functions for processing and creating noise messages */ -const IDENTIFIER : &[u8] = b"WireGuard v1 zx2c4 Jason@zx2c4.com"; -const CONSTRUCTION : &[u8] = b"Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s"; - const SIZE_CK : usize = 32; const SIZE_HS : usize = 32; @@ -39,6 +36,14 @@ const INITIAL_HS : [u8; SIZE_HS] = [ ]; macro_rules! HASH { + ($input1:expr) => { + { + let mut hsh = ::new(); + Digest::input(&mut hsh, $input1); + Digest::result(hsh) + } + }; + ($input1:expr, $input2:expr) => { { let mut hsh = ::new(); @@ -51,7 +56,11 @@ macro_rules! HASH { macro_rules! HMAC { ($key:expr, $input:expr) => { - HMACBlake2s::new($key).hash($input).result() + { + let mut mac = HMACBlake2s::new($key); + mac.hash($input); + mac.result() + } }; ($key:expr, $input1:expr, $input2:expr) => { @@ -80,6 +89,27 @@ macro_rules! KDF2 { } } +#[cfg(test)] +mod tests { + use super::*; + + const IDENTIFIER : &[u8] = b"WireGuard v1 zx2c4 Jason@zx2c4.com"; + const CONSTRUCTION : &[u8] = b"Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s"; + + #[test] + fn precomputed_chain_key() { + assert_eq!(INITIAL_CK[..], HASH!(CONSTRUCTION)[..]); + } + + #[test] + fn precomputed_hash() { + assert_eq!( + INITIAL_HS[..], + HASH!(INITIAL_CK, IDENTIFIER)[..] + ); + } +} + pub fn create_initiation(peer : &Peer, id : u32) -> Result, ()> { let mut rng = OsRng::new().unwrap(); let mut msg : messages::Initiation = Default::default();