rns_crypto/ed25519/
mod.rs1use 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}