udpsec 0.2.0

Secure UDP implementation in Rust
Documentation
use super::{rand_u8, xor_encode};
use super::{Packet, Socket};
use super::DATAGRAM_MAX_LENGTH;

use super::rand_core::OsRng;
use super::x25519_dalek::{PublicKey, ReusableSecret};

use std::net::SocketAddr;

fn get_socket() -> Socket {
    let rand_port = 50000 + rand_u8() as u16 * 10;

    match Socket::new(SocketAddr::new("127.0.0.1".parse().unwrap(), rand_port)) {
        Ok(socket) => socket,
        Err(_) => get_socket()
    }
}

fn get_sockets_pair() -> (Socket, Socket) {
    (get_socket(), get_socket())
}

fn get_rand_data(size: usize) -> Vec<u8> {
    let mut data = Vec::with_capacity(size);

    for _ in 0..size {
        data.push(rand_u8());
    }

    data
}

#[test]
fn test_packets() {
    let secret = ReusableSecret::new(OsRng);
    let public = PublicKey::from(&secret);

    let packet = Packet::KeyExchangeInit(public);
    let decoded = Packet::from_bytes(packet.to_bytes().as_slice()).expect("Couldn't decode KeyExchangeInit packet");

    assert_eq!(packet, decoded);
    
    let packet = Packet::KeyExchangeDone(public);
    let decoded = Packet::from_bytes(packet.to_bytes().as_slice()).expect("Couldn't decode KeyExchangeDone packet");

    assert_eq!(packet, decoded);

    let data = get_rand_data(u16::MAX as usize - 64);
    
    let packet = Packet::Datagram(data);
    let decoded = Packet::from_bytes(packet.to_bytes().as_slice()).expect("Couldn't decode Datagram packet");

    assert_eq!(packet, decoded);
}

#[test]
fn test_datagrams() {
    let (socket_a, socket_b) = get_sockets_pair();

    let data = get_rand_data(u16::MAX as usize - 64);

    socket_a.write(socket_b.addr(), Packet::Datagram(data.clone())).expect("Couldn't send datagram to socket_b");

    let received = socket_b.read().expect("Couldn't receive datagram from socket_a");

    assert_eq!(received.0, socket_a.addr());
    assert_eq!(received.1, Packet::Datagram(data.clone()));
}

#[test]
fn test_key_exchange() {
    let (mut socket_a, mut socket_b) = get_sockets_pair();

    socket_a.generate_secret(socket_b.addr()).expect("Couldn't send key exchange request to socket_b");

    socket_b.recv();
    socket_a.recv();

    let shared_a = socket_a.shared_secret(socket_b.addr()).expect("Couldn't generate shared secret with socket_b");
    let shared_b = socket_b.shared_secret(socket_a.addr()).expect("Couldn't generate shared secret with socket_a");

    assert_eq!(shared_a, shared_b);
}

#[test]
fn test_xor_encoding() {
    let mut key = [0u8; 32];

    for i in 0..32 {
        key[i] = rand_u8();
    }

    let data = get_rand_data(u16::MAX as usize);

    assert_eq!(xor_encode(xor_encode(data.clone(), &key), &key), data);
    assert_ne!(xor_encode(data.clone(), &key), data);
}