use microvms_app::error::{Error, ErrorKind};
use microvms_app::identity::TunnelIdentity;
pub use snow::HandshakeState;
pub fn initiator(identity: &TunnelIdentity) -> Result<HandshakeState, Error> {
initiator_with_prologue(identity, &[])
}
pub fn tunnel_initiator(
identity: &TunnelIdentity,
guest_port: u16,
) -> Result<HandshakeState, Error> {
initiator_with_prologue(identity, &protocol::identity::tunnel_prologue(guest_port))
}
fn initiator_with_prologue(
identity: &TunnelIdentity,
prologue: &[u8],
) -> Result<HandshakeState, Error> {
let (host_seed, vm_public_key) = (identity.host_seed(), identity.vm_public_key());
snow::Builder::new(
protocol::identity::NOISE_PATTERN
.parse()
.expect("the pattern is a compile-time constant the protocol crate tests"),
)
.prologue(prologue)
.and_then(|builder| builder.local_private_key(&host_seed))
.and_then(|builder| builder.remote_public_key(&vm_public_key))
.and_then(|builder| builder.build_initiator())
.map_err(|error| {
Error::new(
ErrorKind::Unexpected,
format!("could not build the identity initiator: {error}"),
)
})
}