use tholos_pq::*;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let (pub_a, priv_a) = gen_recipient_keypair("A");
let (pub_b, priv_b) = gen_recipient_keypair("B");
let (pub_c, priv_c) = gen_recipient_keypair("C");
println!("Recipients:");
println!(" A: {} bytes public key", pub_a.pk_kyber.len());
println!(" B: {} bytes public key", pub_b.pk_kyber.len());
println!(" C: {} bytes public key\n", pub_c.pk_kyber.len());
let s1 = gen_sender_keypair("S1");
let s2 = gen_sender_keypair("S2");
println!("Senders:");
println!(" S1 + S2 generated (Dilithium-3)\n");
let allowed = vec![
(s1.sid.clone(), sender_pub(&s1).pk_dilithium),
(s2.sid.clone(), sender_pub(&s2).pk_dilithium),
];
let message = b"Hello post-quantum world - one ciphertext, three recipients!";
let recipients = vec![pub_a.clone(), pub_b.clone(), pub_c.clone()];
let wire = encrypt(message, &s1, &recipients)?;
println!("Encrypted bundle size: {} bytes", wire.len());
for (name, privkey) in [
("A", &priv_a.sk_kyber),
("B", &priv_b.sk_kyber),
("C", &priv_c.sk_kyber),
] {
let pt = decrypt(&wire, name, privkey, &allowed)?;
println!("Recipient {name} decrypted: {}", String::from_utf8_lossy(&pt));
assert_eq!(pt, message);
}
println!("\nTesting invalid sender signature rejection...");
let wire_bad = encrypt(b"forbidden", &s1, &[pub_a.clone()])?;
let disallowed = vec![(s2.sid.clone(), sender_pub(&s2).pk_dilithium)];
let res = decrypt(&wire_bad, "A", &priv_a.sk_kyber, &disallowed);
assert!(res.is_err());
println!("Invalid sender rejected as expected: {:?}", res.err().unwrap());
println!("\n✅ All tests passed.");
Ok(())
}