use clatter::crypto::cipher::ChaChaPoly;
use clatter::crypto::dh::X25519;
use clatter::crypto::hash::Sha512;
use clatter::handshakepattern::noise_xx;
use clatter::traits::{Dh, Handshaker};
use clatter::NqHandshakeCore;
#[derive(Default, Clone)]
struct MyRng;
impl rand_core::RngCore for MyRng {
fn next_u32(&mut self) -> u32 {
return 42; }
fn next_u64(&mut self) -> u64 {
return 42; }
fn fill_bytes(&mut self, dest: &mut [u8]) {
dest.fill_with(|| 42); }
fn try_fill_bytes(&mut self, dest: &mut [u8]) -> Result<(), rand::Error> {
dest.fill_with(|| 42); Ok(())
}
}
impl rand_core::CryptoRng for MyRng {}
fn main() {
let mut rng_alice = MyRng;
let mut rng_bob = MyRng;
let alice_s = X25519::genkey_rng(&mut rng_alice).unwrap();
let bob_s = X25519::genkey_rng(&mut rng_bob).unwrap();
let mut alice = NqHandshakeCore::<
X25519,
ChaChaPoly,
Sha512,
MyRng,
>::new(noise_xx(), &[], true, Some(alice_s), None, None, None)
.unwrap();
let mut bob = NqHandshakeCore::<X25519, ChaChaPoly, Sha512, MyRng>::new(
noise_xx(),
&[],
false,
Some(bob_s),
None,
None,
None,
)
.unwrap();
let mut buf_alice = [0u8; 4096];
let mut buf_bob = [0u8; 4096];
let n = alice.write_message(&[], &mut buf_alice).unwrap();
let _ = bob.read_message(&buf_alice[..n], &mut buf_bob).unwrap();
let n = bob.write_message(&[], &mut buf_bob).unwrap();
let _ = alice.read_message(&buf_bob[..n], &mut buf_alice).unwrap();
let n = alice.write_message(&[], &mut buf_alice).unwrap();
let _ = bob.read_message(&buf_alice[..n], &mut buf_bob).unwrap();
assert!(alice.is_finished() && bob.is_finished());
let mut alice = alice.finalize().unwrap();
let mut bob = bob.finalize().unwrap();
let msg = b"Hello from initiator";
let n = alice.send(msg, &mut buf_alice).unwrap();
let n = bob.receive(&buf_alice[..n], &mut buf_bob).unwrap();
println!(
"Bob received from Alice: {}",
str::from_utf8(&buf_bob[..n]).unwrap()
);
}