use miden_protocol::Word;
use miden_protocol::crypto::dsa::falcon512_rpo::{PublicKey, SecretKey, Signature};
pub fn generate_keypair() -> (SecretKey, PublicKey) {
let secret_key = SecretKey::new();
let public_key = secret_key.public_key();
(secret_key, public_key)
}
pub fn sign_message(secret_key: &SecretKey, message: Word) -> Signature {
secret_key.sign(message)
}
pub fn verify_signature(public_key: &PublicKey, message: Word, signature: &Signature) -> bool {
public_key.verify(message, signature)
}
#[cfg(test)]
mod tests {
use super::*;
use miden_protocol::Felt;
#[test]
fn test_keypair_generation() {
let (_secret_key, _public_key) = generate_keypair();
}
#[test]
fn test_sign_and_verify() {
let (secret_key, public_key) = generate_keypair();
let message: Word = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)].into();
let signature = sign_message(&secret_key, message);
let is_valid = verify_signature(&public_key, message, &signature);
assert!(is_valid, "Signature should be valid");
}
#[test]
fn test_verify_with_wrong_message() {
let (secret_key, public_key) = generate_keypair();
let message: Word = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)].into();
let signature = sign_message(&secret_key, message);
let wrong_message: Word = [Felt::new(5), Felt::new(6), Felt::new(7), Felt::new(8)].into();
let is_valid = verify_signature(&public_key, wrong_message, &signature);
assert!(!is_valid, "Signature should be invalid for wrong message");
}
#[test]
fn test_verify_with_wrong_key() {
let (secret_key1, _public_key1) = generate_keypair();
let (_secret_key2, public_key2) = generate_keypair();
let message: Word = [Felt::new(1), Felt::new(2), Felt::new(3), Felt::new(4)].into();
let signature = sign_message(&secret_key1, message);
let is_valid = verify_signature(&public_key2, message, &signature);
assert!(
!is_valid,
"Signature should be invalid for wrong public key"
);
}
}