shadow_crypto/
signature.rs1use ed25519_dalek::{Signature, Signer, SigningKey as Ed25519SigningKey, Verifier, VerifyingKey as Ed25519VerifyingKey};
2use serde::{Deserialize, Serialize};
3use anyhow::{Result, Context};
4use zeroize::Zeroize;
5
6#[derive(Clone)]
8pub struct SigningKey(Ed25519SigningKey);
9
10impl SigningKey {
11 pub fn generate() -> Self {
13 let secret = Ed25519SigningKey::from_bytes(&rand::random::<[u8; 32]>());
14 Self(secret)
15 }
16
17 pub fn from_bytes(bytes: &[u8; 32]) -> Self {
19 let secret = Ed25519SigningKey::from_bytes(bytes);
20 Self(secret)
21 }
22
23 pub fn verify_key(&self) -> VerifyKey {
25 VerifyKey(self.0.verifying_key())
26 }
27
28 pub fn sign(&self, message: &[u8]) -> [u8; 64] {
30 self.0.sign(message).to_bytes()
31 }
32}
33
34impl std::fmt::Debug for SigningKey {
35 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
36 write!(f, "SigningKey([REDACTED])")
37 }
38}
39
40#[derive(Debug, Clone, Copy)]
42pub struct VerifyKey(Ed25519VerifyingKey);
43
44impl Serialize for VerifyKey {
45 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
46 where
47 S: serde::Serializer,
48 {
49 serializer.serialize_bytes(&self.0.to_bytes())
50 }
51}
52
53impl<'de> Deserialize<'de> for VerifyKey {
54 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
55 where
56 D: serde::Deserializer<'de>,
57 {
58 let bytes: Vec<u8> = Deserialize::deserialize(deserializer)?;
59 if bytes.len() != 32 {
60 return Err(serde::de::Error::custom("Invalid key length"));
61 }
62 let mut array = [0u8; 32];
63 array.copy_from_slice(&bytes);
64 Ed25519VerifyingKey::from_bytes(&array)
65 .map(VerifyKey)
66 .map_err(serde::de::Error::custom)
67 }
68}
69
70impl VerifyKey {
71 pub fn from_bytes(bytes: &[u8; 32]) -> Result<Self> {
73 let key = Ed25519VerifyingKey::from_bytes(bytes)
74 .context("Invalid verification key bytes")?;
75 Ok(Self(key))
76 }
77
78 pub fn as_bytes(&self) -> [u8; 32] {
80 self.0.to_bytes()
81 }
82
83 pub fn verify(&self, message: &[u8], signature: &[u8; 64]) -> Result<()> {
85 let sig = Signature::from_bytes(signature);
86 self.0.verify(message, &sig)
87 .context("Signature verification failed")?;
88 Ok(())
89 }
90}
91
92pub fn sign(signing_key: &SigningKey, message: &[u8]) -> [u8; 64] {
94 signing_key.sign(message)
95}
96
97pub fn verify(verify_key: &VerifyKey, message: &[u8], signature: &[u8; 64]) -> Result<()> {
99 verify_key.verify(message, signature)
100}
101
102#[cfg(test)]
103mod tests {
104 use super::*;
105
106 #[test]
107 fn test_sign_verify() {
108 let signing_key = SigningKey::generate();
109 let verify_key = signing_key.verify_key();
110
111 let message = b"Test message";
112 let signature = sign(&signing_key, message);
113
114 assert!(verify(&verify_key, message, &signature).is_ok());
115 }
116
117 #[test]
118 fn test_wrong_message_fails() {
119 let signing_key = SigningKey::generate();
120 let verify_key = signing_key.verify_key();
121
122 let message = b"Test message";
123 let signature = sign(&signing_key, message);
124
125 let wrong_message = b"Wrong message";
126 assert!(verify(&verify_key, wrong_message, &signature).is_err());
127 }
128
129 #[test]
130 fn test_wrong_key_fails() {
131 let signing_key1 = SigningKey::generate();
132 let signing_key2 = SigningKey::generate();
133 let verify_key2 = signing_key2.verify_key();
134
135 let message = b"Test message";
136 let signature = sign(&signing_key1, message);
137
138 assert!(verify(&verify_key2, message, &signature).is_err());
139 }
140}