ant_quic/crypto/
raw_keys.rs1use ed25519_dalek::{Signature, Signer, SigningKey, Verifier, VerifyingKey};
8use rand::rngs::OsRng;
9use thiserror::Error;
10
11#[derive(Debug, Error)]
13pub enum RawKeyError {
14 #[error("Invalid key format: {0}")]
15 InvalidFormat(String),
16
17 #[error("Verification failed")]
18 VerificationFailed,
19
20 #[error("Encoding error: {0}")]
21 EncodingError(String),
22
23 #[error("Decoding error: {0}")]
24 DecodingError(String),
25}
26
27#[derive(Clone, Debug)]
29pub struct Ed25519KeyPair {
30 signing_key: SigningKey,
31 verifying_key: VerifyingKey,
32}
33
34impl Ed25519KeyPair {
35 pub fn generate() -> Self {
37 let signing_key = SigningKey::generate(&mut OsRng);
38 let verifying_key = VerifyingKey::from(&signing_key);
39
40 Self {
41 signing_key,
42 verifying_key,
43 }
44 }
45
46 pub fn from_signing_key(signing_key: SigningKey) -> Self {
48 let verifying_key = VerifyingKey::from(&signing_key);
49 Self {
50 signing_key,
51 verifying_key,
52 }
53 }
54
55 pub fn public_key_spki(&self) -> Vec<u8> {
57 create_ed25519_subject_public_key_info(&self.verifying_key)
58 }
59
60 pub fn public_key_bytes(&self) -> [u8; 32] {
62 *self.verifying_key.as_bytes()
63 }
64
65 pub fn verifying_key(&self) -> &VerifyingKey {
67 &self.verifying_key
68 }
69
70 pub fn sign(&self, data: &[u8]) -> Signature {
72 self.signing_key.sign(data)
73 }
74
75 pub fn verify(&self, data: &[u8], signature: &Signature) -> Result<(), RawKeyError> {
77 self.verifying_key.verify(data, signature)
78 .map_err(|_| RawKeyError::VerificationFailed)
79 }
80}
81
82pub fn create_ed25519_subject_public_key_info(public_key: &VerifyingKey) -> Vec<u8> {
87 let mut spki = Vec::with_capacity(44);
97
98 spki.extend_from_slice(&[0x30, 0x2a]);
100
101 spki.extend_from_slice(&[0x30, 0x05]);
103
104 spki.extend_from_slice(&[0x06, 0x03, 0x2b, 0x65, 0x70]);
106
107 spki.extend_from_slice(&[0x03, 0x21, 0x00]); spki.extend_from_slice(public_key.as_bytes());
112
113 spki
114}
115
116pub fn extract_ed25519_key_from_spki(spki_der: &[u8]) -> Result<[u8; 32], RawKeyError> {
121 if spki_der.len() != 44 {
123 return Err(RawKeyError::InvalidFormat(format!(
124 "Invalid SPKI length: expected 44 bytes, got {}",
125 spki_der.len()
126 )));
127 }
128
129 let ed25519_oid = [0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70];
131
132 if !spki_der.starts_with(&ed25519_oid) {
133 return Err(RawKeyError::InvalidFormat(
134 "Invalid SPKI format: Ed25519 OID not found".to_string()
135 ));
136 }
137
138 let mut public_key = [0u8; 32];
140 public_key.copy_from_slice(&spki_der[12..44]);
141
142 Ok(public_key)
143}
144
145pub fn verifying_key_from_spki(spki_der: &[u8]) -> Result<VerifyingKey, RawKeyError> {
147 let key_bytes = extract_ed25519_key_from_spki(spki_der)?;
148 VerifyingKey::from_bytes(&key_bytes)
149 .map_err(|e| RawKeyError::InvalidFormat(format!("Invalid Ed25519 public key: {}", e)))
150}
151
152pub fn derive_peer_id_from_public_key(public_key: &VerifyingKey) -> [u8; 32] {
158 use ring::digest::{digest, SHA256};
160
161 let key_bytes = public_key.as_bytes();
162
163 let mut input = Vec::with_capacity(20 + 32); input.extend_from_slice(b"AUTONOMI_PEER_ID_V1:");
166 input.extend_from_slice(key_bytes);
167
168 let hash = digest(&SHA256, &input);
170 let hash_bytes = hash.as_ref();
171
172 let mut peer_id_bytes = [0u8; 32];
173 peer_id_bytes.copy_from_slice(hash_bytes);
174
175 peer_id_bytes
176}
177
178pub fn verify_peer_id(peer_id: &[u8; 32], public_key: &VerifyingKey) -> bool {
180 let derived_id = derive_peer_id_from_public_key(public_key);
181 peer_id == &derived_id
182}
183
184pub fn generate_ed25519_keypair() -> Ed25519KeyPair {
186 Ed25519KeyPair::generate()
187}
188
189#[cfg(test)]
190mod tests {
191 use super::*;
192
193 #[test]
194 fn test_keypair_generation() {
195 let keypair = Ed25519KeyPair::generate();
196 let signature = keypair.sign(b"test message");
197 assert!(keypair.verify(b"test message", &signature).is_ok());
198 assert!(keypair.verify(b"wrong message", &signature).is_err());
199 }
200
201 #[test]
202 fn test_spki_encoding_decoding() {
203 let keypair = Ed25519KeyPair::generate();
204 let spki = keypair.public_key_spki();
205
206 assert_eq!(spki.len(), 44);
208 assert_eq!(&spki[0..2], &[0x30, 0x2a]); let extracted_key = extract_ed25519_key_from_spki(&spki).unwrap();
212 assert_eq!(extracted_key, keypair.public_key_bytes());
213
214 let verifying_key = verifying_key_from_spki(&spki).unwrap();
216 assert_eq!(verifying_key.as_bytes(), keypair.verifying_key().as_bytes());
217 }
218
219 #[test]
220 fn test_peer_id_derivation() {
221 let keypair1 = Ed25519KeyPair::generate();
222 let keypair2 = Ed25519KeyPair::generate();
223
224 let peer_id1 = derive_peer_id_from_public_key(keypair1.verifying_key());
225 let peer_id2 = derive_peer_id_from_public_key(keypair1.verifying_key());
226 let peer_id3 = derive_peer_id_from_public_key(keypair2.verifying_key());
227
228 assert_eq!(peer_id1, peer_id2);
230
231 assert_ne!(peer_id1, peer_id3);
233
234 assert!(verify_peer_id(&peer_id1, keypair1.verifying_key()));
236 assert!(!verify_peer_id(&peer_id1, keypair2.verifying_key()));
237 }
238
239 #[test]
240 fn test_invalid_spki() {
241 let result = extract_ed25519_key_from_spki(&[0; 43]);
243 assert!(result.is_err());
244
245 let mut invalid_spki = vec![0; 44];
247 invalid_spki[7] = 0xFF; let result = extract_ed25519_key_from_spki(&invalid_spki);
249 assert!(result.is_err());
250 }
251}