use hiss::noise::{Blake2b, ChaChaPoly, HandshakeError, Transport, X25519};
use hiss::provider::{EphemeralOnly, ProviderExt};
hiss::noise! {
pub XX<X25519, ChaChaPoly, Blake2b> {
-> e
<- e, ee, s, es
-> s, se
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut alice_keys = EphemeralOnly::new(rand::rng());
let alice_static = alice_keys.generate::<X25519>()?;
let alice_pub = alice_keys.public(&alice_static)?;
let mut bob_keys = EphemeralOnly::new(rand::rng());
let bob_static = bob_keys.generate::<X25519>()?;
let bob_pub = bob_keys.public(&bob_static)?;
const PROLOGUE: &[u8] = b"prologue";
let accept = |ok: bool| match ok {
true => Ok(()),
false => Err(HandshakeError::PeerRejected {
reason: "unknown peer".into(),
}),
};
let (msg1, alice) = XX::initiator(alice_keys, PROLOGUE).write_message_1()?;
let bob = XX::responder(bob_keys, PROLOGUE).read_message_1(&msg1)?;
let (msg2, bob) = bob.write_message_2(bob_static)?;
let alice = alice.read_message_2_with(&msg2, |peer| accept(peer == &bob_pub))?;
let (msg3, mut alice) = alice.write_message_3(alice_static)?;
let mut bob = bob.read_message_3_with(&msg3, |peer| accept(peer == &alice_pub))?;
let mut wire = [0u8; 4 + Transport::<XX>::OVERHEAD];
let mut got = [0u8; 4];
let n = alice.send(b"ping", &mut wire)?;
let m = bob.receive(&wire[..n], &mut got)?;
assert_eq!(&got[..m], b"ping");
println!("bob received: {}", String::from_utf8_lossy(&got[..m]));
let n = bob.send(b"pong", &mut wire)?;
let m = alice.receive(&wire[..n], &mut got)?;
assert_eq!(&got[..m], b"pong");
println!("alice received: {}", String::from_utf8_lossy(&got[..m]));
Ok(())
}