beaconcrypt 0.5.2

Cryptographic transport for C2 channels
use beaconcrypt::*;

fn test_register_pqxdh_beacon(server: &mut Server, beacon: &mut Beacon) -> Vec<u8> {
	let message = [0xFFu8; 32];

	let phase_1 = beacon.get_registration_bundle().unwrap();
	let reg_out = server.get_shared_secret(&phase_1).unwrap();
	let phase2 = server
		.build_registration_response(reg_out, Some(&message))
		.unwrap();
	beacon.finish_registration(&phase2.serialized).unwrap()
}

#[test]
fn beacon_can_catch_up() {
	let mut server = Server::new(0, None);
	let server_id = server.identity_pk().to_owned();

	let mut b1 = Beacon::new(0, server_id.as_bytes());
	let _ = test_register_pqxdh_beacon(&mut server, &mut b1);
	assert!(server.pk_by_kid(1).is_some());

	let message = [0xFFu8; 32];
	let b1_m1 = server.encrypt_message(&message, 1).unwrap();
	let b1_m2 = server.encrypt_message(&message, 1).unwrap();
	assert_ne!(b1_m1, b1_m2);

	let dec_b1_m1 = b1.decrypt_message(&b1_m1).unwrap();
	let dec_b1_m2 = b1.decrypt_message(&b1_m2).unwrap();
	assert_eq!(dec_b1_m1.plaintext, dec_b1_m2.plaintext);
	assert_eq!(dec_b1_m1.key_id, dec_b1_m2.key_id);
}