use nostringer::{generate_keypair_hex, sign, types::Error, verify, SignatureVariant};
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 (using SAG variant)...");
let compact_signature = sign(
message,
&keypair2.private_key_hex,
&ring_pubkeys_hex,
SignatureVariant::Sag,
)?;
println!("\nGenerated compact signature:");
println!("{}", compact_signature);
println!("\nVerifying signature...");
let is_valid = verify(&compact_signature, message, &ring_pubkeys_hex)?;
println!("Signature valid: {}", is_valid);
assert!(is_valid);
println!("\nCreating a BLSAG signature for comparison...");
let blsag_signature = sign(
message,
&keypair2.private_key_hex,
&ring_pubkeys_hex,
SignatureVariant::Blsag,
)?;
println!("BLSAG signature:");
println!("{}", blsag_signature);
println!("\nVerifying BLSAG signature...");
let is_blsag_valid = verify(&blsag_signature, message, &ring_pubkeys_hex)?;
println!("BLSAG signature valid: {}", is_blsag_valid);
assert!(is_blsag_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(&compact_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(())
}