use nostringer::{
generate_keypair_hex,
sag::{sign, verify},
types::Error,
};
fn main() -> Result<(), Error> {
let keypair1 = generate_keypair_hex("xonly");
let keypair2 = generate_keypair_hex("xonly");
let keypair3 = generate_keypair_hex("xonly");
println!("Generated 3 keypairs for the ring:");
println!("1: {}", keypair1.public_key_hex);
println!("2: {}", keypair2.public_key_hex);
println!("3: {}", keypair3.public_key_hex);
let ring_pubkeys_hex = vec![
keypair1.public_key_hex.clone(),
keypair2.public_key_hex.clone(), keypair3.public_key_hex.clone(),
];
let message = b"This is a message signed by one of the ring members.";
println!(
"\nMessage to sign: \"{}\"",
String::from_utf8_lossy(message)
);
println!("\nSigning message using keypair2...");
let signature = sign(message, &keypair2.private_key_hex, &ring_pubkeys_hex)?;
println!("\nGenerated signature:");
println!("c0: {}", signature.c0);
println!("s values:");
for (i, s) in signature.s.iter().enumerate() {
println!(" s[{}]: {}", i, s);
}
println!("\nVerifying signature...");
let is_valid = verify(&signature, message, &ring_pubkeys_hex)?;
println!("Signature valid: {}", is_valid);
assert!(is_valid);
let different_message = b"This is a different message that wasn't signed.";
println!("\nVerifying with a different message...");
let is_different_valid = verify(&signature, different_message, &ring_pubkeys_hex)?;
println!(
"Different message signature valid: {} (expected: false)",
is_different_valid
);
assert!(!is_different_valid);
println!("\nExample completed successfully!");
Ok(())
}