1use crate::agent_key::{AgentKey, DecryptionKey, EncryptionKey, SigningKey, VerificationKey};
6use crate::did::{DIDGenerationOptions, DIDKeyGenerator, GeneratedKey};
7use crate::error::{Error, Result};
8use crate::local_agent_key::{LocalAgentKey, PublicVerificationKey};
9use crate::message_packing::{KeyManagerPacking, MessageError};
10
11use async_trait::async_trait;
12use serde::{Deserialize, Serialize};
13use serde_json::Value;
14use std::collections::HashMap;
15use std::sync::{Arc, RwLock};
16
17#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
21#[serde(rename_all = "camelCase")]
22pub enum SecretType {
23 JsonWebKey2020,
25}
26
27#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
29#[serde(untagged)]
30pub enum SecretMaterial {
31 JWK {
33 private_key_jwk: Value,
35 },
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
40pub struct Secret {
41 pub id: String,
43
44 pub type_: SecretType,
46
47 pub secret_material: SecretMaterial,
49}
50
51#[async_trait]
53pub trait KeyManager: Send + Sync + std::fmt::Debug + 'static {
54 fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>>;
56
57 fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey>;
59
60 fn generate_web_did(&self, domain: &str, options: DIDGenerationOptions)
62 -> Result<GeneratedKey>;
63
64 fn add_key(&self, key: &GeneratedKey) -> Result<()>;
66
67 fn remove_key(&self, did: &str) -> Result<()>;
69
70 fn has_key(&self, did: &str) -> Result<bool>;
72
73 fn list_keys(&self) -> Result<Vec<String>>;
75
76 fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, crate::did::KeyType)>;
78
79 async fn add_signing_key(&self, key: Arc<dyn SigningKey + Send + Sync>) -> Result<()>;
81
82 async fn add_encryption_key(&self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Result<()>;
84
85 async fn add_decryption_key(&self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Result<()>;
87
88 async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>>;
90
91 async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>>;
93
94 async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>>;
96
97 async fn resolve_verification_key(
99 &self,
100 kid: &str,
101 ) -> Result<Arc<dyn VerificationKey + Send + Sync>>;
102
103 async fn sign_jws(
105 &self,
106 kid: &str,
107 payload: &[u8],
108 protected_header: Option<crate::message::JwsProtected>,
109 ) -> Result<String>;
110
111 async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>>;
113
114 async fn encrypt_jwe(
116 &self,
117 sender_kid: &str,
118 recipient_kid: &str,
119 plaintext: &[u8],
120 protected_header: Option<crate::message::JweProtected>,
121 ) -> Result<String>;
122
123 async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>>;
125}
126
127pub fn extract_private_key_from_secret(secret: &Secret) -> Result<(Vec<u8>, crate::did::KeyType)> {
129 match &secret.secret_material {
130 SecretMaterial::JWK { private_key_jwk } => {
131 let d = private_key_jwk
132 .get("d")
133 .and_then(|v| v.as_str())
134 .ok_or_else(|| {
135 Error::KeyNotFound("Secret JWK missing 'd' parameter".to_string())
136 })?;
137
138 let private_key = base64::Engine::decode(&base64::engine::general_purpose::STANDARD, d)
139 .map_err(|e| {
140 Error::Cryptography(format!("Failed to decode private key from JWK: {}", e))
141 })?;
142
143 let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
144 let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
145
146 let key_type = match (kty, crv) {
147 #[cfg(feature = "crypto-ed25519")]
148 (Some("OKP"), Some("Ed25519")) => crate::did::KeyType::Ed25519,
149 #[cfg(feature = "crypto-p256")]
150 (Some("EC"), Some("P-256")) => crate::did::KeyType::P256,
151 #[cfg(feature = "crypto-secp256k1")]
152 (Some("EC"), Some("secp256k1")) => crate::did::KeyType::Secp256k1,
153 _ => {
154 return Err(Error::KeyNotFound(format!(
155 "Unsupported key type: kty={:?}, crv={:?}",
156 kty, crv
157 )))
158 }
159 };
160
161 Ok((private_key, key_type))
162 }
163 }
164}
165
166#[derive(Debug, Clone)]
168pub struct DefaultKeyManager {
169 pub generator: DIDKeyGenerator,
171 pub secrets: Arc<RwLock<HashMap<String, Secret>>>,
173 signing_keys: Arc<RwLock<HashMap<String, Arc<dyn SigningKey + Send + Sync>>>>,
175 encryption_keys: Arc<RwLock<HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>>>,
177 decryption_keys: Arc<RwLock<HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>>>,
179 verification_keys: Arc<RwLock<HashMap<String, Arc<dyn VerificationKey + Send + Sync>>>>,
181}
182
183impl DefaultKeyManager {
184 pub fn new() -> Self {
186 Self {
187 generator: DIDKeyGenerator::new(),
188 secrets: Arc::new(RwLock::new(HashMap::new())),
189 signing_keys: Arc::new(RwLock::new(HashMap::new())),
190 encryption_keys: Arc::new(RwLock::new(HashMap::new())),
191 decryption_keys: Arc::new(RwLock::new(HashMap::new())),
192 verification_keys: Arc::new(RwLock::new(HashMap::new())),
193 }
194 }
195
196 pub fn agent_key_from_generated(&self, key: &GeneratedKey) -> Result<LocalAgentKey> {
198 let secret = self.generator.create_secret_from_key(key);
200
201 Ok(LocalAgentKey::new(secret, key.key_type))
203 }
204}
205
206impl Default for DefaultKeyManager {
207 fn default() -> Self {
208 Self::new()
209 }
210}
211
212#[async_trait]
213impl KeyManager for DefaultKeyManager {
214 fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>> {
216 Arc::clone(&self.secrets)
217 }
218
219 fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, crate::did::KeyType)> {
221 if let Ok(secrets) = self.secrets.read() {
222 if let Some(secret) = secrets.get(did) {
223 return extract_private_key_from_secret(secret);
224 }
225 } else {
226 return Err(Error::FailedToAcquireResolverReadLock);
227 }
228
229 Err(Error::KeyNotFound(format!(
230 "Private key not found for DID: {}",
231 did
232 )))
233 }
234
235 fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
237 let key = self.generator.generate_did(options)?;
239
240 let agent_key = self.agent_key_from_generated(&key)?;
242
243 if let Ok(mut secrets) = self.secrets.write() {
245 secrets.insert(key.did.clone(), agent_key.clone().secret);
246 } else {
247 return Err(Error::FailedToAcquireResolverWriteLock);
248 }
249
250 if let Ok(mut signing_keys) = self.signing_keys.write() {
252 signing_keys.insert(
253 AgentKey::key_id(&agent_key).to_string(),
254 Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
255 );
256 } else {
257 return Err(Error::FailedToAcquireResolverWriteLock);
258 }
259
260 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
261 encryption_keys.insert(
262 AgentKey::key_id(&agent_key).to_string(),
263 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
264 );
265 } else {
266 return Err(Error::FailedToAcquireResolverWriteLock);
267 }
268
269 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
270 decryption_keys.insert(
271 AgentKey::key_id(&agent_key).to_string(),
272 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
273 );
274 } else {
275 return Err(Error::FailedToAcquireResolverWriteLock);
276 }
277
278 if let Ok(mut verification_keys) = self.verification_keys.write() {
280 verification_keys.insert(
281 AgentKey::key_id(&agent_key).to_string(),
282 Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
283 );
284 } else {
285 return Err(Error::FailedToAcquireResolverWriteLock);
286 }
287
288 Ok(key)
289 }
290
291 fn generate_web_did(
293 &self,
294 domain: &str,
295 options: DIDGenerationOptions,
296 ) -> Result<GeneratedKey> {
297 let key = self.generator.generate_web_did(domain, options)?;
299
300 let agent_key = self.agent_key_from_generated(&key)?;
302
303 if let Ok(mut secrets) = self.secrets.write() {
305 secrets.insert(key.did.clone(), agent_key.clone().secret);
306 } else {
307 return Err(Error::FailedToAcquireResolverWriteLock);
308 }
309
310 if let Ok(mut signing_keys) = self.signing_keys.write() {
312 signing_keys.insert(
313 AgentKey::key_id(&agent_key).to_string(),
314 Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
315 );
316 } else {
317 return Err(Error::FailedToAcquireResolverWriteLock);
318 }
319
320 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
321 encryption_keys.insert(
322 AgentKey::key_id(&agent_key).to_string(),
323 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
324 );
325 } else {
326 return Err(Error::FailedToAcquireResolverWriteLock);
327 }
328
329 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
330 decryption_keys.insert(
331 AgentKey::key_id(&agent_key).to_string(),
332 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
333 );
334 } else {
335 return Err(Error::FailedToAcquireResolverWriteLock);
336 }
337
338 if let Ok(mut verification_keys) = self.verification_keys.write() {
340 verification_keys.insert(
341 AgentKey::key_id(&agent_key).to_string(),
342 Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
343 );
344 } else {
345 return Err(Error::FailedToAcquireResolverWriteLock);
346 }
347
348 Ok(key)
349 }
350
351 fn add_key(&self, key: &GeneratedKey) -> Result<()> {
353 let agent_key = self.agent_key_from_generated(key)?;
355
356 if let Ok(mut secrets) = self.secrets.write() {
358 secrets.insert(key.did.clone(), agent_key.clone().secret);
359 } else {
360 return Err(Error::FailedToAcquireResolverWriteLock);
361 }
362
363 if let Ok(mut signing_keys) = self.signing_keys.write() {
365 signing_keys.insert(
366 AgentKey::key_id(&agent_key).to_string(),
367 Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
368 );
369 } else {
370 return Err(Error::FailedToAcquireResolverWriteLock);
371 }
372
373 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
374 encryption_keys.insert(
375 AgentKey::key_id(&agent_key).to_string(),
376 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
377 );
378 } else {
379 return Err(Error::FailedToAcquireResolverWriteLock);
380 }
381
382 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
383 decryption_keys.insert(
384 AgentKey::key_id(&agent_key).to_string(),
385 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
386 );
387 } else {
388 return Err(Error::FailedToAcquireResolverWriteLock);
389 }
390
391 if let Ok(mut verification_keys) = self.verification_keys.write() {
393 verification_keys.insert(
394 AgentKey::key_id(&agent_key).to_string(),
395 Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
396 );
397 } else {
398 return Err(Error::FailedToAcquireResolverWriteLock);
399 }
400
401 Ok(())
402 }
403
404 fn remove_key(&self, did: &str) -> Result<()> {
406 if let Ok(mut secrets) = self.secrets.write() {
408 secrets.remove(did);
409 } else {
410 return Err(Error::FailedToAcquireResolverWriteLock);
411 }
412
413 if let Ok(mut signing_keys) = self.signing_keys.write() {
415 signing_keys.retain(|k, _| !k.starts_with(did));
416 } else {
417 return Err(Error::FailedToAcquireResolverWriteLock);
418 }
419
420 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
422 encryption_keys.retain(|k, _| !k.starts_with(did));
423 } else {
424 return Err(Error::FailedToAcquireResolverWriteLock);
425 }
426
427 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
429 decryption_keys.retain(|k, _| !k.starts_with(did));
430 } else {
431 return Err(Error::FailedToAcquireResolverWriteLock);
432 }
433
434 if let Ok(mut verification_keys) = self.verification_keys.write() {
436 verification_keys.retain(|k, _| !k.starts_with(did));
437 } else {
438 return Err(Error::FailedToAcquireResolverWriteLock);
439 }
440
441 Ok(())
442 }
443
444 fn has_key(&self, did: &str) -> Result<bool> {
446 if let Ok(secrets) = self.secrets.read() {
448 if secrets.contains_key(did) {
449 return Ok(true);
450 }
451 } else {
452 return Err(Error::FailedToAcquireResolverReadLock);
453 }
454
455 if let Ok(signing_keys) = self.signing_keys.read() {
457 if signing_keys.values().any(|k| k.did() == did) {
458 return Ok(true);
459 }
460 } else {
461 return Err(Error::FailedToAcquireResolverReadLock);
462 }
463
464 Ok(false)
465 }
466
467 fn list_keys(&self) -> Result<Vec<String>> {
469 let mut dids = Vec::new();
471
472 if let Ok(secrets) = self.secrets.read() {
474 dids.extend(secrets.keys().cloned());
475 } else {
476 return Err(Error::FailedToAcquireResolverReadLock);
477 }
478
479 if let Ok(signing_keys) = self.signing_keys.read() {
481 for key in signing_keys.values() {
482 if !dids.contains(&key.did().to_string()) {
483 dids.push(key.did().to_string());
484 }
485 }
486 } else {
487 return Err(Error::FailedToAcquireResolverReadLock);
488 }
489
490 Ok(dids)
491 }
492
493 async fn add_signing_key(&self, key: Arc<dyn SigningKey + Send + Sync>) -> Result<()> {
495 if let Ok(mut signing_keys) = self.signing_keys.write() {
496 signing_keys.insert(key.key_id().to_string(), key);
497 Ok(())
498 } else {
499 Err(Error::FailedToAcquireResolverWriteLock)
500 }
501 }
502
503 async fn add_encryption_key(&self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Result<()> {
505 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
506 encryption_keys.insert(key.key_id().to_string(), key);
507 Ok(())
508 } else {
509 Err(Error::FailedToAcquireResolverWriteLock)
510 }
511 }
512
513 async fn add_decryption_key(&self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Result<()> {
515 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
516 decryption_keys.insert(key.key_id().to_string(), key);
517 Ok(())
518 } else {
519 Err(Error::FailedToAcquireResolverWriteLock)
520 }
521 }
522
523 async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
525 if let Ok(signing_keys) = self.signing_keys.read() {
527 if let Some(key) = signing_keys.get(kid) {
528 return Ok(key.clone());
529 }
530 } else {
531 return Err(Error::FailedToAcquireResolverReadLock);
532 }
533
534 if let Ok(secrets) = self.secrets.read() {
536 let did = kid.split('#').next().unwrap_or(kid);
538 if let Some(secret) = secrets.get(did) {
539 let key_type = crate::did::KeyType::Ed25519; let agent_key = LocalAgentKey::new(secret.clone(), key_type);
542
543 if let Ok(mut signing_keys) = self.signing_keys.write() {
545 let arc_key = Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>;
546 let agent_kid = AgentKey::key_id(&agent_key).to_string();
548 signing_keys.insert(agent_kid.clone(), arc_key.clone());
549 if agent_kid != kid {
551 signing_keys.insert(kid.to_string(), arc_key.clone());
552 }
553 return Ok(arc_key);
554 }
555 }
556 }
557
558 Err(Error::Cryptography(format!(
559 "No signing key found with ID: {}",
560 kid
561 )))
562 }
563
564 async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
566 if let Ok(encryption_keys) = self.encryption_keys.read() {
568 if let Some(key) = encryption_keys.get(kid) {
569 return Ok(key.clone());
570 }
571 } else {
572 return Err(Error::FailedToAcquireResolverReadLock);
573 }
574
575 if let Ok(secrets) = self.secrets.read() {
577 let did = kid.split('#').next().unwrap_or(kid);
579 if let Some(secret) = secrets.get(did) {
580 let key_type = crate::did::KeyType::Ed25519; let agent_key = LocalAgentKey::new(secret.clone(), key_type);
583
584 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
586 let arc_key =
587 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>;
588 let agent_kid = AgentKey::key_id(&agent_key).to_string();
590 encryption_keys.insert(agent_kid.clone(), arc_key.clone());
591 if agent_kid != kid {
593 encryption_keys.insert(kid.to_string(), arc_key.clone());
594 }
595 return Ok(arc_key);
596 }
597 }
598 }
599
600 Err(Error::Cryptography(format!(
601 "No encryption key found with ID: {}",
602 kid
603 )))
604 }
605
606 async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
608 if let Ok(decryption_keys) = self.decryption_keys.read() {
610 if let Some(key) = decryption_keys.get(kid) {
611 return Ok(key.clone());
612 }
613 } else {
614 return Err(Error::FailedToAcquireResolverReadLock);
615 }
616
617 if let Ok(secrets) = self.secrets.read() {
619 let did = kid.split('#').next().unwrap_or(kid);
621 if let Some(secret) = secrets.get(did) {
622 let key_type = crate::did::KeyType::Ed25519; let agent_key = LocalAgentKey::new(secret.clone(), key_type);
625
626 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
628 let arc_key =
629 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>;
630 let agent_kid = AgentKey::key_id(&agent_key).to_string();
632 decryption_keys.insert(agent_kid.clone(), arc_key.clone());
633 if agent_kid != kid {
635 decryption_keys.insert(kid.to_string(), arc_key.clone());
636 }
637 return Ok(arc_key);
638 }
639 }
640 }
641
642 Err(Error::Cryptography(format!(
643 "No decryption key found with ID: {}",
644 kid
645 )))
646 }
647
648 async fn resolve_verification_key(
650 &self,
651 kid: &str,
652 ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
653 if let Ok(verification_keys) = self.verification_keys.read() {
655 if let Some(key) = verification_keys.get(kid) {
656 return Ok(key.clone());
657 }
658 } else {
659 return Err(Error::FailedToAcquireResolverReadLock);
660 }
661
662 let signing_key = KeyManager::get_signing_key(self, kid).await;
667 if let Ok(key) = signing_key {
668 let public_jwk = key.public_key_jwk()?;
670 let verification_key = Arc::new(PublicVerificationKey::new(kid.to_string(), public_jwk))
671 as Arc<dyn VerificationKey + Send + Sync>;
672
673 if let Ok(mut verification_keys) = self.verification_keys.write() {
675 verification_keys.insert(kid.to_string(), verification_key.clone());
676 }
677
678 return Ok(verification_key);
679 }
680
681 let did = kid.split('#').next().unwrap_or(kid);
683 if did.starts_with("did:key:") {
684 let resolver = crate::did::KeyResolver::new();
685 #[cfg(not(target_arch = "wasm32"))]
686 let did_doc_result = {
687 use crate::did::DIDMethodResolver;
688 resolver.resolve_method(did).await
689 };
690 #[cfg(target_arch = "wasm32")]
691 let did_doc_result = {
692 use crate::did::WasmDIDMethodResolver;
693 resolver.resolve_method(did)
694 };
695
696 if let Ok(Some(did_doc)) = did_doc_result {
697 if let Some(vm) = did_doc.verification_method.iter().find(|vm| vm.id == kid) {
698 if let Ok(vk) = PublicVerificationKey::from_verification_material(
699 kid.to_string(),
700 &vm.verification_material,
701 ) {
702 let verification_key =
703 Arc::new(vk) as Arc<dyn VerificationKey + Send + Sync>;
704
705 if let Ok(mut verification_keys) = self.verification_keys.write() {
706 verification_keys.insert(kid.to_string(), verification_key.clone());
707 }
708
709 return Ok(verification_key);
710 }
711 }
712 }
713 }
714
715 Err(Error::Cryptography(format!(
716 "No verification key found with ID: {}",
717 kid
718 )))
719 }
720
721 async fn sign_jws(
723 &self,
724 kid: &str,
725 payload: &[u8],
726 protected_header: Option<crate::message::JwsProtected>,
727 ) -> Result<String> {
728 let signing_key = KeyManager::get_signing_key(self, kid).await?;
730
731 let jws = signing_key
733 .create_jws(payload, protected_header)
734 .await
735 .map_err(|e| Error::Cryptography(e.to_string()))?;
736
737 serde_json::to_string(&jws).map_err(|e| Error::Serialization(e.to_string()))
739 }
740
741 async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
743 let jws: crate::message::Jws = serde_json::from_str(jws)
745 .map_err(|e| Error::Serialization(format!("Failed to parse JWS: {}", e)))?;
746
747 let signature = if let Some(kid) = expected_kid {
749 jws.signatures
750 .iter()
751 .find(|s| s.get_kid().as_deref() == Some(kid))
752 .ok_or_else(|| {
753 Error::Cryptography(format!("No signature found with kid: {}", kid))
754 })?
755 } else {
756 jws.signatures
757 .first()
758 .ok_or_else(|| Error::Cryptography("No signatures in JWS".to_string()))?
759 };
760
761 let protected = signature.get_protected_header().map_err(|e| {
763 Error::Cryptography(format!("Failed to decode protected header: {}", e))
764 })?;
765
766 let kid = signature
768 .get_kid()
769 .ok_or_else(|| Error::Cryptography("No kid found in JWS signature".to_string()))?;
770 let verification_key = KeyManager::resolve_verification_key(self, &kid).await?;
771
772 let signature_bytes = crate::message::base64_decode_flexible(&signature.signature)
774 .map_err(|e| Error::Cryptography(format!("Failed to decode signature: {}", e)))?;
775
776 let signing_input = format!("{}.{}", signature.protected, jws.payload);
778
779 let verified = verification_key
781 .verify_signature(signing_input.as_bytes(), &signature_bytes, &protected)
782 .await
783 .map_err(|e| Error::Cryptography(e.to_string()))?;
784
785 if !verified {
786 return Err(Error::Cryptography(
787 "Signature verification failed".to_string(),
788 ));
789 }
790
791 let payload_bytes = crate::message::base64_decode_flexible(&jws.payload)
793 .map_err(|e| Error::Cryptography(format!("Failed to decode payload: {}", e)))?;
794
795 Ok(payload_bytes)
796 }
797
798 async fn encrypt_jwe(
800 &self,
801 sender_kid: &str,
802 recipient_kid: &str,
803 plaintext: &[u8],
804 protected_header: Option<crate::message::JweProtected>,
805 ) -> Result<String> {
806 let encryption_key = KeyManager::get_encryption_key(self, sender_kid).await?;
808
809 let recipient_key = KeyManager::resolve_verification_key(self, recipient_kid).await?;
811
812 let jwe = encryption_key
814 .create_jwe(plaintext, &[recipient_key], protected_header)
815 .await
816 .map_err(|e| Error::Cryptography(e.to_string()))?;
817
818 serde_json::to_string(&jwe).map_err(|e| Error::Serialization(e.to_string()))
820 }
821
822 async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
824 let jwe: crate::message::Jwe = serde_json::from_str(jwe)
826 .map_err(|e| Error::Serialization(format!("Failed to parse JWE: {}", e)))?;
827
828 if let Some(kid) = expected_kid {
829 jwe.recipients
831 .iter()
832 .find(|r| r.header.kid == kid)
833 .ok_or_else(|| {
834 Error::Cryptography(format!("No recipient found with kid: {}", kid))
835 })?;
836
837 let decryption_key = KeyManager::get_decryption_key(self, kid).await?;
839 decryption_key
840 .unwrap_jwe(&jwe)
841 .await
842 .map_err(|e| Error::Cryptography(e.to_string()))
843 } else {
844 for recipient in &jwe.recipients {
846 if let Ok(decryption_key) =
847 KeyManager::get_decryption_key(self, &recipient.header.kid).await
848 {
849 if let Ok(plaintext) = decryption_key.unwrap_jwe(&jwe).await {
850 return Ok(plaintext);
851 }
852 }
853 }
854
855 Err(Error::Cryptography(
856 "Failed to decrypt JWE for any recipient".to_string(),
857 ))
858 }
859 }
860}
861
862#[async_trait]
863impl KeyManagerPacking for DefaultKeyManager {
864 async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
865 KeyManager::get_signing_key(self, kid)
866 .await
867 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
868 }
869
870 async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
871 KeyManager::get_encryption_key(self, kid)
872 .await
873 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
874 }
875
876 async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
877 KeyManager::get_decryption_key(self, kid)
878 .await
879 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
880 }
881
882 async fn resolve_verification_key(
883 &self,
884 kid: &str,
885 ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
886 KeyManager::resolve_verification_key(self, kid)
887 .await
888 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
889 }
890}
891
892#[derive(Debug, Clone)]
894pub struct KeyManagerBuilder {
895 generator: DIDKeyGenerator,
897 secrets: HashMap<String, Secret>,
899 signing_keys: HashMap<String, Arc<dyn SigningKey + Send + Sync>>,
901 encryption_keys: HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>,
903 decryption_keys: HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>,
905 verification_keys: HashMap<String, Arc<dyn VerificationKey + Send + Sync>>,
907 load_from_storage: bool,
909 storage_path: Option<std::path::PathBuf>,
911}
912
913impl Default for KeyManagerBuilder {
914 fn default() -> Self {
915 Self::new()
916 }
917}
918
919impl KeyManagerBuilder {
920 pub fn new() -> Self {
922 Self {
923 generator: DIDKeyGenerator::new(),
924 secrets: HashMap::new(),
925 signing_keys: HashMap::new(),
926 encryption_keys: HashMap::new(),
927 decryption_keys: HashMap::new(),
928 verification_keys: HashMap::new(),
929 load_from_storage: false,
930 storage_path: None,
931 }
932 }
933
934 pub fn load_from_default_storage(mut self) -> Self {
936 self.load_from_storage = true;
937 self.storage_path = None;
938 self
939 }
940
941 pub fn load_from_path(mut self, path: std::path::PathBuf) -> Self {
943 self.load_from_storage = true;
944 self.storage_path = Some(path);
945 self
946 }
947
948 pub fn add_secret(mut self, did: String, secret: Secret) -> Self {
950 self.secrets.insert(did, secret);
951 self
952 }
953
954 pub fn add_signing_key(mut self, key: Arc<dyn SigningKey + Send + Sync>) -> Self {
956 self.signing_keys.insert(key.key_id().to_string(), key);
957 self
958 }
959
960 pub fn add_encryption_key(mut self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Self {
962 self.encryption_keys.insert(key.key_id().to_string(), key);
963 self
964 }
965
966 pub fn add_decryption_key(mut self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Self {
968 self.decryption_keys.insert(key.key_id().to_string(), key);
969 self
970 }
971
972 pub fn add_verification_key(mut self, key: Arc<dyn VerificationKey + Send + Sync>) -> Self {
974 self.verification_keys.insert(key.key_id().to_string(), key);
975 self
976 }
977
978 pub fn with_auto_generated_ed25519_key(self, kid: &str) -> Result<Self> {
980 let local_key = LocalAgentKey::generate_ed25519(kid)?;
982
983 let arc_key = Arc::new(local_key.clone());
985 let builder = self
986 .add_signing_key(arc_key.clone() as Arc<dyn SigningKey + Send + Sync>)
987 .add_encryption_key(arc_key.clone() as Arc<dyn EncryptionKey + Send + Sync>)
988 .add_decryption_key(arc_key.clone() as Arc<dyn DecryptionKey + Send + Sync>)
989 .add_verification_key(arc_key as Arc<dyn VerificationKey + Send + Sync>);
990
991 let builder = builder.add_secret(local_key.did().to_string(), local_key.secret.clone());
993
994 Ok(builder)
995 }
996
997 pub fn build(self) -> Result<DefaultKeyManager> {
999 let key_manager = DefaultKeyManager {
1000 generator: self.generator,
1001 secrets: Arc::new(RwLock::new(self.secrets)),
1002 signing_keys: Arc::new(RwLock::new(self.signing_keys)),
1003 encryption_keys: Arc::new(RwLock::new(self.encryption_keys)),
1004 decryption_keys: Arc::new(RwLock::new(self.decryption_keys)),
1005 verification_keys: Arc::new(RwLock::new(self.verification_keys)),
1006 };
1007
1008 if self.load_from_storage {
1010 use crate::storage::KeyStorage;
1011
1012 let storage = if let Some(path) = self.storage_path {
1013 KeyStorage::load_from_path(&path)?
1014 } else {
1015 KeyStorage::load_default()?
1016 };
1017
1018 for (did, stored_key) in storage.keys {
1020 let secret = KeyStorage::to_secret(&stored_key);
1022
1023 if let Ok(mut secrets) = key_manager.secrets.write() {
1025 secrets.insert(did.clone(), secret.clone());
1026 } else {
1027 return Err(Error::FailedToAcquireResolverWriteLock);
1028 }
1029
1030 let key_type = stored_key.key_type;
1032 let agent_key = LocalAgentKey::new(secret, key_type);
1033
1034 if let Ok(mut signing_keys) = key_manager.signing_keys.write() {
1036 signing_keys.insert(
1037 AgentKey::key_id(&agent_key).to_string(),
1038 Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
1039 );
1040 } else {
1041 return Err(Error::FailedToAcquireResolverWriteLock);
1042 }
1043
1044 if let Ok(mut encryption_keys) = key_manager.encryption_keys.write() {
1046 encryption_keys.insert(
1047 AgentKey::key_id(&agent_key).to_string(),
1048 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
1049 );
1050 } else {
1051 return Err(Error::FailedToAcquireResolverWriteLock);
1052 }
1053
1054 if let Ok(mut decryption_keys) = key_manager.decryption_keys.write() {
1056 decryption_keys.insert(
1057 AgentKey::key_id(&agent_key).to_string(),
1058 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
1059 );
1060 } else {
1061 return Err(Error::FailedToAcquireResolverWriteLock);
1062 }
1063
1064 if let Ok(mut verification_keys) = key_manager.verification_keys.write() {
1066 verification_keys.insert(
1067 AgentKey::key_id(&agent_key).to_string(),
1068 Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
1069 );
1070 } else {
1071 return Err(Error::FailedToAcquireResolverWriteLock);
1072 }
1073 }
1074 }
1075
1076 Ok(key_manager)
1077 }
1078}
1079
1080#[derive(Debug, Clone)]
1082pub struct SecretAccessor {
1083 secrets: Arc<RwLock<HashMap<String, Secret>>>,
1085}
1086
1087impl SecretAccessor {
1088 pub fn new(key_manager: Arc<dyn KeyManager>) -> Self {
1090 Self {
1091 secrets: key_manager.secrets(),
1092 }
1093 }
1094
1095 pub fn new_from_secrets(secrets: Arc<RwLock<HashMap<String, Secret>>>) -> Self {
1097 Self { secrets }
1098 }
1099
1100 pub fn get_secret_by_id(&self, secret_id: &str) -> Option<Secret> {
1102 if let Ok(secrets) = self.secrets.read() {
1103 if let Some(secret) = secrets.get(secret_id) {
1104 return Some(secret.clone());
1105 }
1106 }
1107 None
1108 }
1109}
1110
1111#[cfg(test)]
1112mod tests {
1113 use super::*;
1114
1115 #[test]
1116 fn test_key_manager() {
1117 let manager = DefaultKeyManager::new();
1118
1119 let options = crate::did::DIDGenerationOptions {
1121 key_type: crate::did::KeyType::Ed25519,
1122 };
1123
1124 let key = manager.generate_key(options).unwrap();
1125
1126 assert!(manager.has_key(&key.did).unwrap());
1128
1129 let keys = manager.list_keys().unwrap();
1131 assert_eq!(keys.len(), 1);
1132 assert_eq!(keys[0], key.did);
1133
1134 manager.remove_key(&key.did).unwrap();
1136 assert!(!manager.has_key(&key.did).unwrap());
1137
1138 manager.add_key(&key).unwrap();
1140 assert!(manager.has_key(&key.did).unwrap());
1141 }
1142
1143 #[tokio::test]
1144 async fn test_agent_key_operations() {
1145 let manager = DefaultKeyManager::new();
1146
1147 let ed25519_key = manager
1149 .generate_key(DIDGenerationOptions {
1150 key_type: crate::did::KeyType::Ed25519,
1151 })
1152 .unwrap();
1153
1154 let test_data = b"Hello, world!";
1156
1157 let ed25519_kid = format!("{}#keys-1", ed25519_key.did);
1159 let signing_key = KeyManager::get_signing_key(&manager, &ed25519_kid)
1160 .await
1161 .unwrap();
1162
1163 assert!(signing_key.key_id().contains(ed25519_key.did.as_str()));
1165
1166 assert!(signing_key.did().contains(&ed25519_key.did));
1168
1169 let jws = signing_key.create_jws(test_data, None).await.unwrap();
1171 assert!(jws.signatures.len() == 1);
1172 assert!(jws.signatures[0]
1173 .get_kid()
1174 .unwrap()
1175 .contains(ed25519_key.did.as_str()));
1176
1177 let protected_header = jws.signatures[0].get_protected_header().unwrap();
1179 assert!(
1180 !protected_header.kid.is_empty(),
1181 "kid should be in protected header"
1182 );
1183 assert_eq!(&protected_header.kid, &jws.signatures[0].get_kid().unwrap());
1184
1185 }
1187
1188 #[test]
1189 fn test_web_did_generation() {
1190 let manager = DefaultKeyManager::new();
1191
1192 let domain = "example.com";
1194 let options = DIDGenerationOptions {
1195 key_type: crate::did::KeyType::Ed25519,
1196 };
1197
1198 let key = manager.generate_web_did(domain, options).unwrap();
1199
1200 assert!(manager.has_key(&key.did).unwrap());
1202
1203 assert_eq!(key.did, format!("did:web:{}", domain));
1205 }
1206
1207 #[tokio::test]
1208 async fn test_jws_operations() {
1209 let manager = DefaultKeyManager::new();
1210
1211 let options = crate::did::DIDGenerationOptions {
1213 key_type: crate::did::KeyType::Ed25519,
1214 };
1215
1216 let key = manager.generate_key(options).unwrap();
1217 let key_part = &key.did["did:key:".len()..];
1219 let kid = format!("{}#{}", key.did, key_part);
1220
1221 let test_data = b"Hello, world!";
1223
1224 let jws = manager.sign_jws(&kid, test_data, None).await.unwrap();
1226
1227 let payload = manager.verify_jws(&jws, Some(&kid)).await.unwrap();
1229 assert_eq!(payload, test_data);
1230
1231 let payload = manager.verify_jws(&jws, None).await.unwrap();
1233 assert_eq!(payload, test_data);
1234 }
1235
1236 #[tokio::test]
1237 #[cfg(feature = "crypto-p256")]
1238 async fn test_jwe_operations() {
1239 let manager = DefaultKeyManager::new();
1240
1241 let options = crate::did::DIDGenerationOptions {
1243 key_type: crate::did::KeyType::P256,
1244 };
1245
1246 let sender_key = manager.generate_key(options.clone()).unwrap();
1247 let sender_part = &sender_key.did["did:key:".len()..];
1248 let sender_kid = format!("{}#{}", sender_key.did, sender_part);
1249
1250 let recipient_key = manager.generate_key(options).unwrap();
1251 let recipient_part = &recipient_key.did["did:key:".len()..];
1252 let recipient_kid = format!("{}#{}", recipient_key.did, recipient_part);
1253
1254 let test_data = b"Hello, world!";
1256
1257 let jwe = manager
1259 .encrypt_jwe(&sender_kid, &recipient_kid, test_data, None)
1260 .await
1261 .unwrap();
1262
1263 let plaintext = manager
1265 .decrypt_jwe(&jwe, Some(&recipient_kid))
1266 .await
1267 .unwrap();
1268 assert_eq!(plaintext, test_data);
1269 }
1270}