1use std::{collections::HashSet, fmt::Debug, sync::Arc};
8
9use rustls::{
10 CertificateError, ClientConfig, DigitallySignedStruct, Error as TlsError, ServerConfig,
11 SignatureScheme,
12 client::danger::{HandshakeSignatureValid, ServerCertVerifier},
13 pki_types::{CertificateDer, ServerName, UnixTime},
14 server::ResolvesServerCert,
15 sign::{CertifiedKey, SigningKey},
16};
17
18use super::tls_extension_simulation::{Rfc7250ClientConfig, Rfc7250ServerConfig};
19
20use ed25519_dalek::{
21 Signature, Signer, SigningKey as Ed25519SecretKey, Verifier, VerifyingKey as Ed25519PublicKey,
22};
23
24use tracing::{debug, info, warn};
25
26#[derive(Debug)]
28pub struct RawPublicKeyVerifier {
29 trusted_keys: HashSet<[u8; 32]>,
31 allow_any_key: bool,
33}
34
35impl RawPublicKeyVerifier {
36 pub fn new(trusted_keys: Vec<[u8; 32]>) -> Self {
38 Self {
39 trusted_keys: trusted_keys.into_iter().collect(),
40 allow_any_key: false,
41 }
42 }
43
44 pub fn allow_any() -> Self {
47 Self {
48 trusted_keys: HashSet::new(),
49 allow_any_key: true,
50 }
51 }
52
53 pub fn add_trusted_key(&mut self, public_key: [u8; 32]) {
55 self.trusted_keys.insert(public_key);
56 }
57
58 fn extract_ed25519_key(&self, spki_der: &[u8]) -> Result<[u8; 32], TlsError> {
60 if spki_der.len() < 44 {
69 return Err(TlsError::InvalidCertificate(CertificateError::BadEncoding));
70 }
71
72 let ed25519_oid = [0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70];
74
75 if !spki_der.starts_with(&ed25519_oid) {
76 return Err(TlsError::InvalidCertificate(
77 CertificateError::UnknownIssuer,
78 ));
79 }
80
81 if spki_der.len() != 44 {
83 return Err(TlsError::InvalidCertificate(CertificateError::BadEncoding));
84 }
85
86 let mut public_key = [0u8; 32];
87 public_key.copy_from_slice(&spki_der[12..44]);
88
89 debug!(
90 "Extracted Ed25519 public key: {:?}",
91 hex::encode(&public_key)
92 );
93 Ok(public_key)
94 }
95}
96
97impl ServerCertVerifier for RawPublicKeyVerifier {
98 fn verify_server_cert(
99 &self,
100 end_entity: &CertificateDer<'_>,
101 _intermediates: &[CertificateDer<'_>],
102 _server_name: &ServerName,
103 _ocsp_response: &[u8],
104 _now: UnixTime,
105 ) -> Result<rustls::client::danger::ServerCertVerified, TlsError> {
106 debug!("Verifying server certificate with Raw Public Key verifier");
107
108 let public_key = self.extract_ed25519_key(end_entity.as_ref())?;
110
111 if self.allow_any_key {
113 info!("Accepting any Ed25519 public key (development mode)");
114 return Ok(rustls::client::danger::ServerCertVerified::assertion());
115 }
116
117 if self.trusted_keys.contains(&public_key) {
118 info!("Server public key is trusted: {}", hex::encode(&public_key));
119 Ok(rustls::client::danger::ServerCertVerified::assertion())
120 } else {
121 warn!("Unknown server public key: {}", hex::encode(&public_key));
122 Err(TlsError::InvalidCertificate(
123 CertificateError::UnknownIssuer,
124 ))
125 }
126 }
127
128 fn verify_tls12_signature(
129 &self,
130 _message: &[u8],
131 _cert: &CertificateDer<'_>,
132 _dss: &DigitallySignedStruct,
133 ) -> Result<HandshakeSignatureValid, TlsError> {
134 Err(TlsError::UnsupportedNameType)
136 }
137
138 fn verify_tls13_signature(
139 &self,
140 message: &[u8],
141 cert: &CertificateDer<'_>,
142 dss: &DigitallySignedStruct,
143 ) -> Result<HandshakeSignatureValid, TlsError> {
144 debug!("Verifying TLS 1.3 signature with Raw Public Key");
145
146 let public_key_bytes = self.extract_ed25519_key(cert.as_ref())?;
148
149 let public_key = Ed25519PublicKey::from_bytes(&public_key_bytes)
151 .map_err(|_| TlsError::InvalidCertificate(CertificateError::BadEncoding))?;
152
153 if dss.signature().len() != 64 {
155 return Err(TlsError::General(
156 "Invalid signature length".to_string(),
157 ));
158 }
159
160 let mut sig_bytes = [0u8; 64];
161 sig_bytes.copy_from_slice(dss.signature());
162 let signature = Signature::from(sig_bytes);
163
164 public_key
165 .verify(message, &signature)
166 .map_err(|_| TlsError::General("Signature verification failed".to_string()))?;
167
168 debug!("TLS 1.3 signature verification successful");
169 Ok(HandshakeSignatureValid::assertion())
170 }
171
172 fn supported_verify_schemes(&self) -> Vec<SignatureScheme> {
173 vec![SignatureScheme::ED25519]
174 }
175}
176
177#[derive(Debug)]
179pub struct RawPublicKeyResolver {
180 certified_key: Arc<CertifiedKey>,
182}
183
184impl RawPublicKeyResolver {
185 pub fn new(private_key: Ed25519SecretKey) -> Result<Self, TlsError> {
187 let public_key = private_key.verifying_key();
189
190 let public_key_der = create_ed25519_subject_public_key_info(&public_key);
192
193 let signing_key = Ed25519SigningKey::new(private_key);
195
196 let certified_key = Arc::new(CertifiedKey {
198 cert: vec![CertificateDer::from(public_key_der)],
199 key: Arc::new(signing_key),
200 ocsp: None,
201 });
202
203 Ok(Self { certified_key })
204 }
205}
206
207impl ResolvesServerCert for RawPublicKeyResolver {
208 fn resolve(&self, _client_hello: rustls::server::ClientHello) -> Option<Arc<CertifiedKey>> {
209 debug!("Resolving server certificate with Raw Public Key");
210 Some(self.certified_key.clone())
211 }
212}
213
214#[derive(Debug)]
216struct Ed25519SigningKey {
217 private_key: Ed25519SecretKey,
218}
219
220impl Ed25519SigningKey {
221 fn new(private_key: Ed25519SecretKey) -> Self {
222 Self {
223 private_key,
224 }
225 }
226}
227
228impl SigningKey for Ed25519SigningKey {
229 fn choose_scheme(&self, offered: &[SignatureScheme]) -> Option<Box<dyn rustls::sign::Signer>> {
230 if offered.contains(&SignatureScheme::ED25519) {
231 Some(Box::new(Ed25519Signer {
232 private_key: self.private_key.clone(),
233 }))
234 } else {
235 None
236 }
237 }
238
239 fn algorithm(&self) -> rustls::SignatureAlgorithm {
240 rustls::SignatureAlgorithm::ED25519
241 }
242}
243
244#[derive(Debug)]
246struct Ed25519Signer {
247 private_key: Ed25519SecretKey,
248}
249
250impl rustls::sign::Signer for Ed25519Signer {
251 fn sign(&self, message: &[u8]) -> Result<Vec<u8>, TlsError> {
252 let signature = self.private_key.sign(message);
253 Ok(signature.to_bytes().to_vec())
254 }
255
256 fn scheme(&self) -> SignatureScheme {
257 SignatureScheme::ED25519
258 }
259}
260
261pub fn create_ed25519_subject_public_key_info(public_key: &Ed25519PublicKey) -> Vec<u8> {
263 let mut spki = Vec::new();
272
273 spki.extend_from_slice(&[0x30, 0x2a]);
275
276 spki.extend_from_slice(&[0x30, 0x05]);
278
279 spki.extend_from_slice(&[0x06, 0x03, 0x2b, 0x65, 0x70]);
281
282 spki.extend_from_slice(&[0x03, 0x21, 0x00]); spki.extend_from_slice(public_key.as_bytes());
287
288 spki
289}
290
291#[derive(Debug, Default, Clone)]
293pub struct RawPublicKeyConfigBuilder {
294 trusted_keys: Vec<[u8; 32]>,
295 allow_any: bool,
296 server_key: Option<(Ed25519SecretKey, Ed25519PublicKey)>,
297 enable_extensions: bool,
299 cert_type_preferences: Option<super::tls_extensions::CertificateTypePreferences>,
301}
302
303impl RawPublicKeyConfigBuilder {
304 pub fn new() -> Self {
306 Self::default()
307 }
308
309 pub fn add_trusted_key(mut self, public_key: [u8; 32]) -> Self {
311 self.trusted_keys.push(public_key);
312 self
313 }
314
315 pub fn allow_any_key(mut self) -> Self {
317 self.allow_any = true;
318 self
319 }
320
321 pub fn with_server_key(mut self, private_key: Ed25519SecretKey) -> Self {
323 let public_key = private_key.verifying_key();
324 self.server_key = Some((private_key, public_key));
325 self
326 }
327
328 pub fn with_certificate_type_extensions(mut self, preferences: super::tls_extensions::CertificateTypePreferences) -> Self {
330 self.enable_extensions = true;
331 self.cert_type_preferences = Some(preferences);
332 self
333 }
334
335 pub fn enable_certificate_type_extensions(mut self) -> Self {
337 self.enable_extensions = true;
338 self.cert_type_preferences = Some(super::tls_extensions::CertificateTypePreferences::prefer_raw_public_key());
339 self
340 }
341
342 pub fn build_client_config(self) -> Result<ClientConfig, TlsError> {
344 let verifier = if self.allow_any {
345 RawPublicKeyVerifier::allow_any()
346 } else {
347 RawPublicKeyVerifier::new(self.trusted_keys)
348 };
349
350 let config = ClientConfig::builder()
353 .dangerous()
354 .with_custom_certificate_verifier(Arc::new(verifier))
355 .with_no_client_auth();
356
357 if self.enable_extensions {
361 }
366
367 Ok(config)
368 }
369
370 pub fn build_server_config(self) -> Result<ServerConfig, TlsError> {
372 let (private_key, _public_key) = self
373 .server_key
374 .ok_or_else(|| TlsError::General("Server key pair required".into()))?;
375
376 let resolver = RawPublicKeyResolver::new(private_key)?;
377
378 let config = ServerConfig::builder()
379 .with_no_client_auth()
380 .with_cert_resolver(Arc::new(resolver));
381
382 if self.enable_extensions {
384 if let Some(_preferences) = self.cert_type_preferences {
385 }
388 }
389
390 Ok(config)
391 }
392
393 pub fn build_rfc7250_client_config(self) -> Result<Rfc7250ClientConfig, TlsError> {
395 let preferences = self.cert_type_preferences.clone()
396 .unwrap_or_else(|| super::tls_extensions::CertificateTypePreferences::prefer_raw_public_key());
397 let base_config = self.build_client_config()?;
398
399 Ok(Rfc7250ClientConfig::new(base_config, preferences))
400 }
401
402 pub fn build_rfc7250_server_config(self) -> Result<Rfc7250ServerConfig, TlsError> {
404 let preferences = self.cert_type_preferences.clone()
405 .unwrap_or_else(|| super::tls_extensions::CertificateTypePreferences::prefer_raw_public_key());
406 let base_config = self.build_server_config()?;
407
408 Ok(Rfc7250ServerConfig::new(base_config, preferences))
409 }
410}
411
412pub mod key_utils {
414 use super::*;
415
416
417 pub fn generate_ed25519_keypair() -> (Ed25519SecretKey, Ed25519PublicKey) {
419 use rand::rngs::OsRng;
420 let private_key = Ed25519SecretKey::generate(&mut OsRng);
421 let public_key = private_key.verifying_key();
422 (private_key, public_key)
423 }
424
425 pub fn public_key_to_bytes(public_key: &Ed25519PublicKey) -> [u8; 32] {
427 *public_key.as_bytes()
428 }
429
430 pub fn public_key_from_bytes(bytes: &[u8; 32]) -> Result<Ed25519PublicKey, &'static str> {
432 Ed25519PublicKey::from_bytes(bytes).map_err(|_| "Invalid public key bytes")
433 }
434
435 pub fn create_test_keypair() -> (Ed25519SecretKey, Ed25519PublicKey) {
437 let seed = [43u8; 32]; let private_key = Ed25519SecretKey::from_bytes(&seed);
440 let public_key = private_key.verifying_key();
441 (private_key, public_key)
442 }
443
444 pub fn derive_peer_id_from_public_key(public_key: &Ed25519PublicKey) -> crate::nat_traversal_api::PeerId {
450 #[cfg(feature = "ring")]
451 {
452 use ring::digest::{digest, SHA256};
453
454 let key_bytes = public_key.as_bytes();
455
456 let mut input = Vec::with_capacity(20 + 32); input.extend_from_slice(b"AUTONOMI_PEER_ID_V1:");
459 input.extend_from_slice(key_bytes);
460
461 let hash = digest(&SHA256, &input);
463 let hash_bytes = hash.as_ref();
464
465 let mut peer_id_bytes = [0u8; 32];
466 peer_id_bytes.copy_from_slice(hash_bytes);
467
468 crate::nat_traversal_api::PeerId(peer_id_bytes)
469 }
470 #[cfg(not(feature = "ring"))]
471 {
472 let key_bytes = public_key.as_bytes();
475 let mut peer_id_bytes = [0u8; 32];
476 peer_id_bytes.copy_from_slice(key_bytes);
477
478 crate::nat_traversal_api::PeerId(peer_id_bytes)
479 }
480 }
481
482 pub fn derive_peer_id_from_key_bytes(key_bytes: &[u8; 32]) -> Result<crate::nat_traversal_api::PeerId, &'static str> {
487 let public_key = public_key_from_bytes(key_bytes)?;
488 Ok(derive_peer_id_from_public_key(&public_key))
489 }
490
491 pub fn verify_peer_id(peer_id: &crate::nat_traversal_api::PeerId, public_key: &Ed25519PublicKey) -> bool {
496 let derived_id = derive_peer_id_from_public_key(public_key);
497 *peer_id == derived_id
498 }
499}
500
501#[cfg(test)]
502mod tests {
503 use super::key_utils::*;
504 use super::*;
505
506 #[test]
507 fn test_create_ed25519_subject_public_key_info() {
508 let (_, public_key) = generate_ed25519_keypair();
509 let spki = create_ed25519_subject_public_key_info(&public_key);
510
511 assert_eq!(spki.len(), 44);
513
514 assert_eq!(
516 &spki[0..9],
517 &[0x30, 0x2a, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70]
518 );
519
520 assert_eq!(&spki[12..], public_key.as_bytes());
522 }
523
524 #[test]
525 fn test_raw_public_key_verifier_trusted_key() {
526 let (_, public_key) = generate_ed25519_keypair();
527 let key_bytes = public_key_to_bytes(&public_key);
528
529 let verifier = RawPublicKeyVerifier::new(vec![key_bytes]);
530
531 let spki = create_ed25519_subject_public_key_info(&public_key);
533 let cert = CertificateDer::from(spki);
534
535 let result = verifier.verify_server_cert(
537 &cert,
538 &[],
539 &ServerName::try_from("test").unwrap(),
540 &[],
541 UnixTime::now(),
542 );
543
544 assert!(result.is_ok());
545 }
546
547 #[test]
548 fn test_raw_public_key_verifier_unknown_key() {
549 let (_, public_key1) = generate_ed25519_keypair();
550 let (_, public_key2) = generate_ed25519_keypair();
551
552 let key1_bytes = public_key_to_bytes(&public_key1);
553 let verifier = RawPublicKeyVerifier::new(vec![key1_bytes]);
554
555 let spki = create_ed25519_subject_public_key_info(&public_key2);
557 let cert = CertificateDer::from(spki);
558
559 let result = verifier.verify_server_cert(
561 &cert,
562 &[],
563 &ServerName::try_from("test").unwrap(),
564 &[],
565 UnixTime::now(),
566 );
567
568 assert!(result.is_err());
569 }
570
571 #[test]
572 fn test_raw_public_key_verifier_allow_any() {
573 let (_, public_key) = generate_ed25519_keypair();
574 let verifier = RawPublicKeyVerifier::allow_any();
575
576 let spki = create_ed25519_subject_public_key_info(&public_key);
577 let cert = CertificateDer::from(spki);
578
579 let result = verifier.verify_server_cert(
581 &cert,
582 &[],
583 &ServerName::try_from("test").unwrap(),
584 &[],
585 UnixTime::now(),
586 );
587
588 assert!(result.is_ok());
589 }
590
591 #[test]
592 fn test_config_builder() {
593 let (private_key, public_key) = generate_ed25519_keypair();
594 let key_bytes = public_key_to_bytes(&public_key);
595
596 let client_config = RawPublicKeyConfigBuilder::new()
598 .add_trusted_key(key_bytes)
599 .build_client_config();
600 assert!(client_config.is_ok());
601
602 let server_config = RawPublicKeyConfigBuilder::new()
604 .with_server_key(private_key)
605 .build_server_config();
606 assert!(server_config.is_ok());
607 }
608
609 #[test]
610 fn test_extract_ed25519_key() {
611 let (_, public_key) = generate_ed25519_keypair();
612 let spki = create_ed25519_subject_public_key_info(&public_key);
613
614 let verifier = RawPublicKeyVerifier::allow_any();
615 let extracted_key = verifier.extract_ed25519_key(&spki).unwrap();
616
617 assert_eq!(extracted_key, public_key_to_bytes(&public_key));
618 }
619
620 #[test]
621 fn test_derive_peer_id_from_public_key() {
622 let (_, public_key) = generate_ed25519_keypair();
623
624 let peer_id1 = derive_peer_id_from_public_key(&public_key);
626 let peer_id2 = derive_peer_id_from_public_key(&public_key);
627
628 assert_eq!(peer_id1, peer_id2);
629
630 let (_, public_key2) = create_test_keypair();
632 let peer_id3 = derive_peer_id_from_public_key(&public_key2);
633
634 assert_ne!(peer_id1, peer_id3);
635 }
636
637 #[test]
638 fn test_derive_peer_id_from_key_bytes() {
639 let (_, public_key) = generate_ed25519_keypair();
640 let key_bytes = public_key_to_bytes(&public_key);
641
642 let peer_id1 = derive_peer_id_from_public_key(&public_key);
644 let peer_id2 = derive_peer_id_from_key_bytes(&key_bytes).unwrap();
645
646 assert_eq!(peer_id1, peer_id2);
647
648 let (_, public_key2) = create_test_keypair();
650 let key_bytes2 = public_key_to_bytes(&public_key2);
651 let peer_id3 = derive_peer_id_from_key_bytes(&key_bytes2).unwrap();
652
653 assert_ne!(peer_id1, peer_id3);
654 }
655
656 #[test]
657 fn test_verify_peer_id() {
658 let (_, public_key) = generate_ed25519_keypair();
659 let peer_id = derive_peer_id_from_public_key(&public_key);
660
661 assert!(verify_peer_id(&peer_id, &public_key));
663
664 let (_, other_public_key) = create_test_keypair();
666 assert!(!verify_peer_id(&peer_id, &other_public_key));
667
668 let wrong_peer_id = crate::nat_traversal_api::PeerId([0u8; 32]);
670 assert!(!verify_peer_id(&wrong_peer_id, &public_key));
671 }
672
673 #[test]
674 fn test_peer_id_domain_separation() {
675 let (_, public_key) = generate_ed25519_keypair();
676 let peer_id = derive_peer_id_from_public_key(&public_key);
677
678 let key_bytes = public_key_to_bytes(&public_key);
680 assert_ne!(peer_id.0, key_bytes);
681
682 let peer_id2 = derive_peer_id_from_public_key(&public_key);
684 assert_eq!(peer_id, peer_id2);
685 }
686}