use crypt_io::mac;
fn main() -> Result<(), crypt_io::Error> {
let shared_key = b"shared-secret-between-parties";
let message = b"please transfer $100 to account 12345";
let tag = mac::hmac_sha256(shared_key, message)?;
println!("tag = {:02x?}", &tag[..]);
let ok = mac::hmac_sha256_verify(shared_key, message, &tag)?;
println!("Authentic message verifies: {ok}");
assert!(ok);
let tampered = b"please transfer $1000000 to account 99999";
let ok = mac::hmac_sha256_verify(shared_key, tampered, &tag)?;
println!("Tampered message verifies: {ok}");
assert!(!ok);
let wrong_key = b"different-key";
let ok = mac::hmac_sha256_verify(wrong_key, message, &tag)?;
println!("Wrong key verifies: {ok}");
assert!(!ok);
let key32 = [0x42u8; 32];
let tag = mac::blake3_keyed(&key32, message);
assert!(mac::blake3_keyed_verify(&key32, message, &tag));
println!("BLAKE3 keyed tag verifies.");
let mut m = mac::HmacSha256::new(shared_key)?;
m.update(b"first chunk ");
m.update(b"second chunk ");
m.update(b"third chunk");
let streamed_tag = m.finalize();
let one_shot_tag = mac::hmac_sha256(shared_key, b"first chunk second chunk third chunk")?;
assert_eq!(streamed_tag, one_shot_tag);
println!("Streaming MAC matches one-shot.");
Ok(())
}