use rand_chacha::ChaCha20Rng;
use rand_chacha::rand_core::SeedableRng;
use slither::prelude::*;
slither::channel! {
pub MySuite<P256, ChaChaPoly, Blake2b>;
}
fn rng() -> ChaCha20Rng {
let mut seed = [0u8; 32];
getrandom::fill(&mut seed).expect("OS entropy");
ChaCha20Rng::from_seed(seed)
}
fn main() {
block_on(async {
let dialler: SoftwareIdentity<MySuite> =
SoftwareIdentity::generate(rng()).expect("generate dialler identity");
let answerer: SoftwareIdentity<MySuite> =
SoftwareIdentity::generate(rng()).expect("generate answerer identity");
let answerer_key = *answerer.public_static();
println!("answerer public key: {:?}", answerer_key.as_ref());
let dial_sock = tokio::net::UdpSocket::bind("127.0.0.1:0")
.await
.expect("bind dial socket");
let ans_sock = tokio::net::UdpSocket::bind("127.0.0.1:0")
.await
.expect("bind ans socket");
let answerer_addr = ans_sock.local_addr().expect("answerer addr");
let dial_ep = Endpoint::builder()
.identity(dialler)
.wire(dial_sock)
.config(Config::new())
.build();
let answer_ep = Endpoint::builder()
.identity(answerer)
.wire(ans_sock)
.config(Config::new())
.build();
let answering = tokio::task::spawn_local(async move {
let intro = answer_ep.accept().await.expect("answerer: got an intro");
let claimed = intro.read_identity().await.expect("read_identity");
let proven = claimed.authenticate().await.expect("authenticate");
let conn = proven.accept().await.expect("accept");
let msg = conn.recv_message().await.expect("recv_message");
println!("answerer received: {:?}", String::from_utf8_lossy(&msg));
conn.send_message(&msg).await.expect("send_message (echo)");
conn.close(slither::constants::NO_ERROR, b"done").await;
});
let conn = dial_ep
.connect(answerer_addr, answerer_key)
.expect("connect (sync, 0 DH)")
.await
.expect("handshake completed");
conn.send_message(b"hello").await.expect("send_message");
let reply = conn.recv_message().await.expect("recv_message");
println!("dialler received: {:?}", String::from_utf8_lossy(&reply));
conn.close(slither::constants::NO_ERROR, b"done").await;
answering.await.expect("answering task join");
println!("round trip complete");
});
}