use arrayvec::ArrayVec;
use clatter::bytearray::{ByteArray, SensitiveByteArray};
use clatter::crypto::cipher::ChaChaPoly;
use clatter::crypto::kem::pqclean_ml_kem::MlKem1024;
use clatter::crypto::kem::rust_crypto_ml_kem::MlKem512;
use clatter::handshakepattern::noise_pqnn;
use clatter::traits::Handshaker;
use clatter::PqHandshake;
#[derive(Default, Clone)]
struct MySillyHash(u128);
impl clatter::traits::CryptoComponent for MySillyHash {
fn name() -> &'static str {
"SillyHash"
}
}
impl clatter::traits::Hash for MySillyHash {
type Block = [u8; 32];
type Output = SensitiveByteArray<ArrayVec<u8, 32>>;
fn input(&mut self, data: &[u8]) {
for d in data {
self.0 ^= *d as u128;
}
}
fn result(self) -> Self::Output {
let mut out = [0u8; 32];
out[..16].copy_from_slice(&self.0.to_be_bytes());
Self::Output::from_slice(&out)
}
}
fn main() {
let mut alice = PqHandshake::<MlKem512, MlKem1024, ChaChaPoly, MySillyHash>::new(
noise_pqnn(),
&[],
true,
None,
None,
None,
None,
)
.unwrap();
let mut bob = PqHandshake::<MlKem512, MlKem1024, ChaChaPoly, MySillyHash>::new(
noise_pqnn(),
&[],
false,
None,
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();
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()
);
}