use ed25519_dalek::{Signature, Signer, SigningKey, VerifyingKey};
use eyre::Report;
pub fn sign_nonce(sk: &SigningKey, nonce: &[u8; 32]) -> Vec<u8> {
sk.sign(nonce).to_bytes().to_vec()
}
pub fn verify_nonce(pk: &VerifyingKey, nonce: &[u8; 32], sig: &[u8]) -> Result<(), Report> {
let sig = Signature::from_slice(sig)?;
pk.verify_strict(nonce, &sig)?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use rand_core::OsRng;
#[test]
fn sign_and_verify_roundtrip() {
let mut rng = OsRng;
let sk = SigningKey::generate(&mut rng);
let pk: VerifyingKey = sk.verifying_key();
let nonce = [1u8; 32];
let sig = sign_nonce(&sk, &nonce);
verify_nonce(&pk, &nonce, &sig).unwrap();
}
#[test]
fn verify_fails_on_mismatch() {
let mut rng = OsRng;
let sk = SigningKey::generate(&mut rng);
let pk: VerifyingKey = sk.verifying_key();
let nonce = [2u8; 32];
let wrong_nonce = [3u8; 32];
let sig = sign_nonce(&sk, &nonce);
assert!(verify_nonce(&pk, &wrong_nonce, &sig).is_err());
}
}