volli-core 0.1.11

Shared types for volli
Documentation
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());
    }
}