pub use microvms_domain::identity::*;
#[cfg(test)]
mod tests {
use super::*;
use crate::prelude::*;
#[test]
fn generated_material_is_fresh_and_valid() {
let first = LaunchIdentity::generate().expect("the pool is available");
let second = LaunchIdentity::generate().expect("the pool is available");
assert_ne!(first.seed_field(), second.seed_field());
assert_ne!(first.host_public_field(), second.host_public_field());
assert_eq!(first.seed_field().len(), 44);
assert_eq!(first.host_public_field().len(), 44);
}
#[test]
fn the_initiator_completes_against_a_responder_built_from_the_payload_fields() {
use base64::Engine as _;
let b64 = base64::engine::general_purpose::STANDARD;
let launch = LaunchIdentity::from_seeds([7_u8; 32], [9_u8; 32]).expect("valid seeds");
let vm_seed_bytes: [u8; 32] = b64
.decode(launch.seed_field())
.expect("valid base64")
.try_into()
.expect("32 bytes");
let host_public_bytes: [u8; 32] = b64
.decode(launch.host_public_field())
.expect("valid base64")
.try_into()
.expect("32 bytes");
let mut responder =
snow::Builder::new(protocol::identity::NOISE_PATTERN.parse().expect("parses"))
.local_private_key(&vm_seed_bytes)
.expect("a 32-byte secret")
.remote_public_key(&host_public_bytes)
.expect("a 32-byte key")
.build_responder()
.expect("builds");
let kept = launch.keep();
let mut initiator = kept.initiator().expect("builds");
let mut buffer = [0_u8; 1024];
let mut scratch = [0_u8; 1024];
let written = initiator.write_message(&[], &mut buffer).expect("writes");
responder
.read_message(&buffer[..written], &mut scratch)
.expect("the daemon accepts the launching host");
let written = responder.write_message(&[], &mut buffer).expect("writes");
initiator
.read_message(&buffer[..written], &mut scratch)
.expect("the host accepts its own VM");
let mut host_transport = initiator.into_transport_mode().expect("transport");
let mut vm_transport = responder.into_transport_mode().expect("transport");
let sent = host_transport
.write_message(b"ping", &mut buffer)
.expect("encrypts");
let received = vm_transport
.read_message(&buffer[..sent], &mut scratch)
.expect("decrypts");
assert_eq!(&scratch[..received], b"ping");
}
}