Skip to main content

rns_crypto/ed25519/
mod.rs

1use crate::Rng;
2use ed25519_dalek::Signer;
3use ed25519_dalek::Verifier;
4
5pub struct Ed25519PrivateKey {
6    inner: ed25519_dalek::SigningKey,
7}
8
9pub struct Ed25519PublicKey {
10    inner: ed25519_dalek::VerifyingKey,
11}
12
13impl Ed25519PrivateKey {
14    pub fn from_bytes(seed: &[u8; 32]) -> Self {
15        Ed25519PrivateKey {
16            inner: ed25519_dalek::SigningKey::from_bytes(seed),
17        }
18    }
19
20    pub fn generate(rng: &mut dyn Rng) -> Self {
21        let mut seed = [0u8; 32];
22        rng.fill_bytes(&mut seed);
23        Self::from_bytes(&seed)
24    }
25
26    pub fn private_bytes(&self) -> [u8; 32] {
27        self.inner.to_bytes()
28    }
29
30    pub fn public_key(&self) -> Ed25519PublicKey {
31        Ed25519PublicKey {
32            inner: self.inner.verifying_key(),
33        }
34    }
35
36    pub fn sign(&self, message: &[u8]) -> [u8; 64] {
37        self.inner.sign(message).to_bytes()
38    }
39}
40
41impl Ed25519PublicKey {
42    pub fn from_bytes(data: &[u8; 32]) -> Self {
43        Ed25519PublicKey {
44            inner: ed25519_dalek::VerifyingKey::from_bytes(data)
45                .expect("invalid Ed25519 public key bytes"),
46        }
47    }
48
49    pub fn public_bytes(&self) -> [u8; 32] {
50        self.inner.to_bytes()
51    }
52
53    pub fn verify(&self, signature: &[u8; 64], message: &[u8]) -> bool {
54        let sig = ed25519_dalek::Signature::from_bytes(signature);
55        self.inner.verify(message, &sig).is_ok()
56    }
57}
58
59#[cfg(test)]
60mod tests {
61    use super::*;
62
63    #[test]
64    fn test_ed25519_sign_verify_roundtrip() {
65        let seed = [42u8; 32];
66        let key = Ed25519PrivateKey::from_bytes(&seed);
67        let pubkey = key.public_key();
68        let msg = b"Hello, Ed25519!";
69        let sig = key.sign(msg);
70        assert!(pubkey.verify(&sig, msg));
71    }
72
73    #[test]
74    fn test_ed25519_verify_tampered() {
75        let seed = [42u8; 32];
76        let key = Ed25519PrivateKey::from_bytes(&seed);
77        let pubkey = key.public_key();
78        let msg = b"Hello, Ed25519!";
79        let sig = key.sign(msg);
80        assert!(!pubkey.verify(&sig, b"Hello, Ed25519?"));
81    }
82
83    #[test]
84    fn test_ed25519_pubkey_deterministic() {
85        let seed = [1u8; 32];
86        let key1 = Ed25519PrivateKey::from_bytes(&seed);
87        let key2 = Ed25519PrivateKey::from_bytes(&seed);
88        assert_eq!(key1.public_key().public_bytes(), key2.public_key().public_bytes());
89    }
90}