Test precomputed values
Sanity check
This commit is contained in:
@@ -29,7 +29,7 @@ impl From<&[u8]> for Initiation {
|
|||||||
let mut msg : Self;
|
let mut msg : Self;
|
||||||
owned.copy_from_slice(b);
|
owned.copy_from_slice(b);
|
||||||
|
|
||||||
// cast to MessageInitiate
|
// cast to Initiation
|
||||||
unsafe {
|
unsafe {
|
||||||
msg = mem::transmute::<[u8; mem::size_of::<Self>()], Self>(owned);
|
msg = mem::transmute::<[u8; mem::size_of::<Self>()], Self>(owned);
|
||||||
};
|
};
|
||||||
@@ -61,7 +61,7 @@ impl Into<Vec<u8>> for Initiation {
|
|||||||
impl fmt::Debug for Initiation {
|
impl fmt::Debug for Initiation {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
write!(f,
|
write!(f,
|
||||||
"MessageInitiate {{ type = {} }}",
|
"MessageInitiation {{ type = {} }}",
|
||||||
self.f_type
|
self.f_type
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -101,7 +101,7 @@ impl Eq for Initiation {}
|
|||||||
*/
|
*/
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
pub struct MessageResponse {
|
pub struct Response {
|
||||||
f_type : u8,
|
f_type : u8,
|
||||||
f_reserved : [u8; 3],
|
f_reserved : [u8; 3],
|
||||||
f_sender : u32,
|
f_sender : u32,
|
||||||
@@ -110,14 +110,14 @@ pub struct MessageResponse {
|
|||||||
f_empty : [u8; SIZE_TAG],
|
f_empty : [u8; SIZE_TAG],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&[u8]> for MessageResponse {
|
impl From<&[u8]> for Response {
|
||||||
fn from(b: &[u8]) -> Self {
|
fn from(b: &[u8]) -> Self {
|
||||||
// create owned copy
|
// create owned copy
|
||||||
let mut owned = [0u8; mem::size_of::<Self>()];
|
let mut owned = [0u8; mem::size_of::<Self>()];
|
||||||
let mut msg : Self;
|
let mut msg : Self;
|
||||||
owned.copy_from_slice(b);
|
owned.copy_from_slice(b);
|
||||||
|
|
||||||
// cast to MessageInitiate
|
// cast to MessageResponse
|
||||||
unsafe {
|
unsafe {
|
||||||
msg = mem::transmute::<[u8; mem::size_of::<Self>()], Self>(owned);
|
msg = mem::transmute::<[u8; mem::size_of::<Self>()], Self>(owned);
|
||||||
};
|
};
|
||||||
@@ -130,7 +130,7 @@ impl From<&[u8]> for MessageResponse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Into<Vec<u8>> for MessageResponse {
|
impl Into<Vec<u8>> for Response {
|
||||||
fn into(self) -> Vec<u8> {
|
fn into(self) -> Vec<u8> {
|
||||||
// correct endianness
|
// correct endianness
|
||||||
let mut msg = self;
|
let mut msg = self;
|
||||||
@@ -148,7 +148,7 @@ impl Into<Vec<u8>> for MessageResponse {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Debug for MessageResponse {
|
impl fmt::Debug for Response {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
write!(f,
|
write!(f,
|
||||||
"MessageResponse {{ type = {} }}",
|
"MessageResponse {{ type = {} }}",
|
||||||
@@ -158,7 +158,7 @@ impl fmt::Debug for MessageResponse {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
impl PartialEq for MessageResponse {
|
impl PartialEq for Response {
|
||||||
fn eq(&self, other: &Self) -> bool {
|
fn eq(&self, other: &Self) -> bool {
|
||||||
self.f_type == other.f_type &&
|
self.f_type == other.f_type &&
|
||||||
self.f_reserved == other.f_reserved &&
|
self.f_reserved == other.f_reserved &&
|
||||||
@@ -175,7 +175,7 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn message_response_identity() {
|
fn message_response_identity() {
|
||||||
let msg = MessageResponse {
|
let msg = Response {
|
||||||
f_type : TYPE_RESPONSE,
|
f_type : TYPE_RESPONSE,
|
||||||
f_reserved : [0u8; 3],
|
f_reserved : [0u8; 3],
|
||||||
f_sender : 146252,
|
f_sender : 146252,
|
||||||
@@ -195,7 +195,7 @@ mod tests {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let buf : Vec<u8> = msg.into();
|
let buf : Vec<u8> = msg.into();
|
||||||
assert_eq!(msg, MessageResponse::from(&buf[..]));
|
assert_eq!(msg, Response::from(&buf[..]));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
38
src/noise.rs
38
src/noise.rs
@@ -16,9 +16,6 @@ type HMACBlake2s = Hmac<Blake2s>;
|
|||||||
|
|
||||||
/* Internal functions for processing and creating noise messages */
|
/* 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_CK : usize = 32;
|
||||||
const SIZE_HS : usize = 32;
|
const SIZE_HS : usize = 32;
|
||||||
|
|
||||||
@@ -39,6 +36,14 @@ const INITIAL_HS : [u8; SIZE_HS] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
macro_rules! HASH {
|
macro_rules! HASH {
|
||||||
|
($input1:expr) => {
|
||||||
|
{
|
||||||
|
let mut hsh = <Blake2s as Digest>::new();
|
||||||
|
Digest::input(&mut hsh, $input1);
|
||||||
|
Digest::result(hsh)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
($input1:expr, $input2:expr) => {
|
($input1:expr, $input2:expr) => {
|
||||||
{
|
{
|
||||||
let mut hsh = <Blake2s as Digest>::new();
|
let mut hsh = <Blake2s as Digest>::new();
|
||||||
@@ -51,7 +56,11 @@ macro_rules! HASH {
|
|||||||
|
|
||||||
macro_rules! HMAC {
|
macro_rules! HMAC {
|
||||||
($key:expr, $input:expr) => {
|
($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) => {
|
($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<Vec<u8>, ()> {
|
pub fn create_initiation(peer : &Peer, id : u32) -> Result<Vec<u8>, ()> {
|
||||||
let mut rng = OsRng::new().unwrap();
|
let mut rng = OsRng::new().unwrap();
|
||||||
let mut msg : messages::Initiation = Default::default();
|
let mut msg : messages::Initiation = Default::default();
|
||||||
|
|||||||
Reference in New Issue
Block a user