use bincode::{Encode, Decode};
use toolkit_zero::serialization::{seal, open};
#[derive(Debug, PartialEq, Encode, Decode)]
struct Payload {
user: String,
score: u32,
tags: Vec<String>,
}
fn main() {
let key = "my-secret-key";
let original = Payload {
user: "alice".into(),
score: 9001,
tags: vec!["rust".into(), "crypto".into()],
};
println!("Original : {original:?}");
let blob = seal(&original, Some(key)).expect("seal failed");
println!("Sealed : {} bytes (nonce ‖ ciphertext ‖ Poly1305 tag)", blob.len());
let blob2 = seal(&original, Some(key)).expect("seal failed");
assert_ne!(blob, blob2, "ciphertexts should differ (different nonces)");
println!("Semantic security : two seals of the same value differ ✓");
let recovered: Payload = open(&blob, Some(key)).expect("open failed");
println!("Recovered: {recovered:?}");
assert_eq!(original, recovered, "round-trip mismatch!");
println!("\nRound-trip successful ✓");
let bad: Result<Payload, _> = open(&blob, Some("wrong-key"));
assert!(bad.is_err(), "wrong key should fail to open");
println!("Wrong-key rejection ✓");
let blob3 = seal(&original, None::<&str>).expect("seal with default key failed");
let back3: Payload = open(&blob3, None::<&str>).expect("open with default key failed");
assert_eq!(original, back3);
println!("Default-key round-trip ✓");
}