Skip to main content

shadow_crypto/
signature.rs

1use ed25519_dalek::{Signature, Signer, SigningKey as Ed25519SigningKey, Verifier, VerifyingKey as Ed25519VerifyingKey};
2use serde::{Deserialize, Serialize};
3use anyhow::{Result, Context};
4use zeroize::Zeroize;
5
6/// Ed25519 signing key
7#[derive(Clone)]
8pub struct SigningKey(Ed25519SigningKey);
9
10impl SigningKey {
11    /// Generate new signing key
12    pub fn generate() -> Self {
13        let secret = Ed25519SigningKey::from_bytes(&rand::random::<[u8; 32]>());
14        Self(secret)
15    }
16
17    /// Create from seed bytes
18    pub fn from_bytes(bytes: &[u8; 32]) -> Self {
19        let secret = Ed25519SigningKey::from_bytes(bytes);
20        Self(secret)
21    }
22
23    /// Get corresponding verification key
24    pub fn verify_key(&self) -> VerifyKey {
25        VerifyKey(self.0.verifying_key())
26    }
27
28    /// Sign message
29    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/// Ed25519 verification key
41#[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    /// Create from bytes
72    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    /// Get key as bytes
79    pub fn as_bytes(&self) -> [u8; 32] {
80        self.0.to_bytes()
81    }
82
83    /// Verify signature
84    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
92/// Sign a message
93pub fn sign(signing_key: &SigningKey, message: &[u8]) -> [u8; 64] {
94    signing_key.sign(message)
95}
96
97/// Verify a signature
98pub 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}