wiretun 0.5.0

WireGuard Library
Documentation
mod cookie;
mod initiation;
mod response;

pub const CONSTRUCTION: [u8; 37] = *b"Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s";
pub const IDENTIFIER: [u8; 34] = *b"WireGuard v1 zx2c4 Jason@zx2c4.com";
pub const LABEL_MAC1: [u8; 8] = *b"mac1----";
pub const LABEL_COOKIE: [u8; 8] = *b"cookie--";

pub use cookie::{Cookie, MacGenerator};
pub use initiation::{IncomingInitiation, OutgoingInitiation};
pub use response::{IncomingResponse, OutgoingResponse};

#[cfg(test)]
mod tests {
    use super::*;
    use crate::noise::crypto::{LocalStaticSecret, PeerStaticSecret};
    use crate::noise::protocol::{HandshakeInitiation, HandshakeResponse};

    #[inline]
    fn gen_2_static_key() -> (PeerStaticSecret, PeerStaticSecret) {
        let p1_local = LocalStaticSecret::random();
        let p2_local = LocalStaticSecret::random();
        let mut p1_secret = p1_local.clone().with_peer(p2_local.public_key().to_bytes());
        let mut p2_secret = p2_local.with_peer(p1_local.public_key().to_bytes());
        let psk = PeerStaticSecret::random_psk();
        p1_secret.set_psk(psk);
        p2_secret.set_psk(psk);

        (p1_secret, p2_secret)
    }

    #[test]
    fn handshake_initiation() {
        let (p1_key, p2_key) = gen_2_static_key();
        let (p1_i, _p2_i) = (42, 88);
        let mut p1_cookie = MacGenerator::new(&p2_key);

        let (init_out, payload) = OutgoingInitiation::new(p1_i, &p1_key, &mut p1_cookie);
        let packet = HandshakeInitiation::try_from(payload.as_slice()).unwrap();
        let init_in = IncomingInitiation::parse(p2_key.local(), &packet).unwrap();

        assert_eq!(init_in.index, p1_i);
        assert_eq!(init_out.hash, init_in.hash);
        assert_eq!(init_out.chaining_key, init_in.chaining_key);
    }

    #[test]
    fn handshake_response() {
        let (p1_key, p2_key) = gen_2_static_key();
        let (p1_i, p2_i) = (42, 88);
        let mut p1_cookie = MacGenerator::new(&p2_key);
        let mut p2_cookie = MacGenerator::new(&p1_key);

        let (init_out, payload) = OutgoingInitiation::new(p1_i, &p1_key, &mut p1_cookie);
        let packet = HandshakeInitiation::try_from(payload.as_slice()).unwrap();
        let init_in = IncomingInitiation::parse(p2_key.local(), &packet).unwrap();

        assert_eq!(init_out.hash, init_in.hash);
        assert_eq!(init_out.chaining_key, init_in.chaining_key);

        let (resp_out, payload) = OutgoingResponse::new(&init_in, p2_i, &p2_key, &mut p2_cookie);
        let packet = HandshakeResponse::try_from(payload.as_slice()).unwrap();
        let resp_in = IncomingResponse::parse(&init_out, &p1_key, &packet).unwrap();

        assert_eq!(resp_in.index, p2_i);
        assert_eq!(resp_out.chaining_key, resp_in.chaining_key);
        assert_eq!(resp_out.hash, resp_in.hash);
    }
}