use bsv::primitives::private_key::PrivateKey;
use bsv::wallet::types::{Counterparty, CounterpartyType, Protocol};
use bsv::wallet::ProtoWallet;
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("=== Create HMAC ===\n");
let key =
PrivateKey::from_hex("b3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a1b2c3d4")?;
let wallet = ProtoWallet::new(key);
let data = b"Important message requiring integrity";
println!("Data: \"{}\"", std::str::from_utf8(data).unwrap());
let protocol = Protocol {
protocol: "message authentication".to_string(),
security_level: 2,
};
let key_id = "hmac-key-1";
let counterparty = Counterparty {
counterparty_type: CounterpartyType::Self_,
public_key: None,
};
let hmac = wallet.create_hmac_sync(data, &protocol, key_id, &counterparty)?;
println!(
"HMAC: {}",
hmac.iter().map(|b| format!("{b:02x}")).collect::<String>()
);
println!("Length: {} bytes", hmac.len());
let valid = wallet.verify_hmac_sync(data, &hmac, &protocol, key_id, &counterparty)?;
println!("Valid: {valid}");
assert!(valid, "HMAC verification must succeed");
let tampered = b"Tampered message requiring integrity";
let invalid = wallet.verify_hmac_sync(tampered, &hmac, &protocol, key_id, &counterparty)?;
println!("Tampered: {invalid} (expected false)");
assert!(!invalid, "Tampered HMAC must fail verification");
println!("\nHMAC create + verify succeeded.");
Ok(())
}