1use crate::agent_key::{AgentKey, DecryptionKey, EncryptionKey, SigningKey, VerificationKey};
8use crate::did::{DIDGenerationOptions, DIDKeyGenerator, GeneratedKey, KeyType};
9use crate::error::{Error, Result};
10use crate::key_manager::{KeyManager, Secret, SecretMaterial};
11use crate::local_agent_key::{LocalAgentKey, PublicVerificationKey};
12use crate::message::{JweProtected, JwsProtected};
13use crate::message_packing::{KeyManagerPacking, MessageError};
14use crate::storage::{KeyStorage, StoredKey};
15
16use async_trait::async_trait;
17use base64::Engine;
18use std::collections::HashMap;
19use std::path::PathBuf;
20use std::sync::{Arc, RwLock};
21
22#[derive(Debug, Clone)]
24pub struct AgentKeyManager {
25 generator: DIDKeyGenerator,
27 secrets: Arc<RwLock<HashMap<String, Secret>>>,
29 signing_keys: Arc<RwLock<HashMap<String, Arc<dyn SigningKey + Send + Sync>>>>,
31 encryption_keys: Arc<RwLock<HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>>>,
33 decryption_keys: Arc<RwLock<HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>>>,
35 verification_keys: Arc<RwLock<HashMap<String, Arc<dyn VerificationKey + Send + Sync>>>>,
37 generated_keys: Arc<RwLock<HashMap<String, GeneratedKey>>>,
39 storage_path: Option<PathBuf>,
41}
42
43impl AgentKeyManager {
44 pub fn new() -> Self {
46 Self {
47 generator: DIDKeyGenerator::new(),
48 secrets: Arc::new(RwLock::new(HashMap::new())),
49 signing_keys: Arc::new(RwLock::new(HashMap::new())),
50 encryption_keys: Arc::new(RwLock::new(HashMap::new())),
51 decryption_keys: Arc::new(RwLock::new(HashMap::new())),
52 verification_keys: Arc::new(RwLock::new(HashMap::new())),
53 generated_keys: Arc::new(RwLock::new(HashMap::new())),
54 storage_path: None,
55 }
56 }
57
58 pub fn get_generated_key(&self, did: &str) -> Result<GeneratedKey> {
60 if let Ok(generated_keys) = self.generated_keys.read() {
61 if let Some(key) = generated_keys.get(did) {
62 return Ok(key.clone());
63 }
64 } else {
65 return Err(Error::FailedToAcquireResolverReadLock);
66 }
67
68 Err(Error::KeyNotFound(format!(
69 "Generated key not found for DID: {}",
70 did
71 )))
72 }
73
74 pub async fn get_signing_key_type(&self, did: &str) -> Result<String> {
76 if let Ok(signing_keys) = self.signing_keys.read() {
78 for (kid, key) in signing_keys.iter() {
79 if kid.starts_with(did) {
80 if let Ok(jwk) = key.public_key_jwk() {
81 let kty = jwk.get("kty").and_then(|v| v.as_str());
82 let crv = jwk.get("crv").and_then(|v| v.as_str());
83 return Ok(format!("kty: {:?}, crv: {:?}", kty, crv));
84 }
85 }
86 }
87 }
88
89 Err(Error::KeyNotFound(format!(
90 "No signing key found for DID: {}",
91 did
92 )))
93 }
94
95 pub fn agent_key_from_generated(&self, key: &GeneratedKey) -> Result<LocalAgentKey> {
97 let secret = self.generator.create_secret_from_key(key);
99
100 Ok(LocalAgentKey::new(secret, key.key_type))
102 }
103
104 fn store_agent_key(&self, agent_key: &LocalAgentKey, key_id: &str) -> Result<()> {
106 if let Ok(mut signing_keys) = self.signing_keys.write() {
108 signing_keys.insert(
109 key_id.to_string(),
110 Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
111 );
112 } else {
113 return Err(Error::FailedToAcquireResolverWriteLock);
114 }
115
116 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
117 encryption_keys.insert(
118 key_id.to_string(),
119 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
120 );
121 } else {
122 return Err(Error::FailedToAcquireResolverWriteLock);
123 }
124
125 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
126 decryption_keys.insert(
127 key_id.to_string(),
128 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
129 );
130 } else {
131 return Err(Error::FailedToAcquireResolverWriteLock);
132 }
133
134 if let Ok(mut verification_keys) = self.verification_keys.write() {
136 verification_keys.insert(
137 key_id.to_string(),
138 Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
139 );
140 } else {
141 return Err(Error::FailedToAcquireResolverWriteLock);
142 }
143
144 Ok(())
145 }
146
147 pub fn save_to_storage(&self) -> Result<()> {
149 if self.storage_path.is_none() {
151 return Ok(());
152 }
153
154 let mut key_storage = KeyStorage::new();
156
157 if let Ok(secrets) = self.secrets.read() {
159 for (did, secret) in secrets.iter() {
160 let key_type = match secret.secret_material {
162 SecretMaterial::JWK {
163 ref private_key_jwk,
164 } => {
165 let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
166 let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
167
168 match (kty, crv) {
169 (Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
170 (Some("EC"), Some("P-256")) => KeyType::P256,
171 (Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
172 _ => KeyType::Ed25519, }
174 }
175 };
176
177 let private_key_b64 = match &secret.secret_material {
179 SecretMaterial::JWK { private_key_jwk } => private_key_jwk
180 .get("d")
181 .and_then(|v| v.as_str())
182 .unwrap_or("")
183 .to_string(),
184 };
185
186 let public_key_b64 = match &secret.secret_material {
187 SecretMaterial::JWK { private_key_jwk } => private_key_jwk
188 .get("x")
189 .and_then(|v| v.as_str())
190 .unwrap_or("")
191 .to_string(),
192 };
193
194 let stored_key = StoredKey {
196 did: did.clone(),
197 label: String::new(), key_type,
199 private_key: private_key_b64,
200 public_key: public_key_b64,
201 metadata: HashMap::new(),
202 };
203 key_storage.add_key(stored_key);
204 }
205 }
206
207 if let Some(path) = &self.storage_path {
209 key_storage.save_to_path(path)?;
210 } else {
211 key_storage.save_default()?;
212 }
213
214 Ok(())
215 }
216
217 pub fn load_from_default_storage(mut self) -> Result<Self> {
219 self.storage_path = None;
220 self.load_keys_from_storage()
221 }
222
223 pub fn load_from_path(mut self, path: PathBuf) -> Result<Self> {
225 self.storage_path = Some(path);
226 self.load_keys_from_storage()
227 }
228
229 fn load_keys_from_storage(&self) -> Result<Self> {
231 let storage = if let Some(path) = &self.storage_path {
233 KeyStorage::load_from_path(path)?
234 } else {
235 KeyStorage::load_default()?
236 };
237
238 for (did, stored_key) in storage.keys {
240 let secret = KeyStorage::to_secret(&stored_key);
242
243 if let Ok(mut secrets) = self.secrets.write() {
245 secrets.insert(did.clone(), secret.clone());
246 } else {
247 return Err(Error::FailedToAcquireResolverWriteLock);
248 }
249
250 let key_type = stored_key.key_type;
252 let agent_key = LocalAgentKey::new(secret, key_type);
253 let key_id = AgentKey::key_id(&agent_key).to_string();
254
255 self.store_agent_key(&agent_key, &key_id)?;
257 }
258
259 Ok(self.clone())
260 }
261
262 fn add_key_internal(&self, key: &GeneratedKey, save_to_storage: bool) -> Result<()> {
264 let agent_key = self.agent_key_from_generated(key)?;
266 let key_id = AgentKey::key_id(&agent_key).to_string();
267
268 if let Ok(mut secrets) = self.secrets.write() {
270 secrets.insert(key.did.clone(), agent_key.clone().secret);
271 } else {
272 return Err(Error::FailedToAcquireResolverWriteLock);
273 }
274
275 self.store_agent_key(&agent_key, &key_id)?;
277
278 if save_to_storage {
280 self.save_to_storage()?;
281 }
282
283 Ok(())
284 }
285
286 pub fn add_key_without_save(&self, key: &GeneratedKey) -> Result<()> {
289 self.add_key_internal(key, false)
290 }
291
292 pub fn generate_key_without_save(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
295 self.generate_key_internal(options, false)
296 }
297
298 fn generate_key_internal(
300 &self,
301 options: DIDGenerationOptions,
302 save_to_storage: bool,
303 ) -> Result<GeneratedKey> {
304 let key = self.generator.generate_did(options)?;
306
307 let agent_key = self.agent_key_from_generated(&key)?;
309 let key_id = AgentKey::key_id(&agent_key).to_string();
310
311 if let Ok(mut secrets) = self.secrets.write() {
313 secrets.insert(key.did.clone(), agent_key.clone().secret);
314 } else {
315 return Err(Error::FailedToAcquireResolverWriteLock);
316 }
317
318 if let Ok(mut generated_keys) = self.generated_keys.write() {
320 generated_keys.insert(key.did.clone(), key.clone());
321 } else {
322 return Err(Error::FailedToAcquireResolverWriteLock);
323 }
324
325 self.store_agent_key(&agent_key, &key_id)?;
327
328 if save_to_storage {
330 self.save_to_storage()?;
331 }
332
333 Ok(key)
334 }
335
336 pub fn generate_web_did_without_save(
339 &self,
340 domain: &str,
341 options: DIDGenerationOptions,
342 ) -> Result<GeneratedKey> {
343 self.generate_web_did_internal(domain, options, false)
344 }
345
346 fn generate_web_did_internal(
348 &self,
349 domain: &str,
350 options: DIDGenerationOptions,
351 save_to_storage: bool,
352 ) -> Result<GeneratedKey> {
353 let key = self.generator.generate_web_did(domain, options)?;
355
356 let agent_key = self.agent_key_from_generated(&key)?;
358 let key_id = AgentKey::key_id(&agent_key).to_string();
359
360 if let Ok(mut secrets) = self.secrets.write() {
362 secrets.insert(key.did.clone(), agent_key.clone().secret);
363 } else {
364 return Err(Error::FailedToAcquireResolverWriteLock);
365 }
366
367 if let Ok(mut generated_keys) = self.generated_keys.write() {
369 generated_keys.insert(key.did.clone(), key.clone());
370 } else {
371 return Err(Error::FailedToAcquireResolverWriteLock);
372 }
373
374 self.store_agent_key(&agent_key, &key_id)?;
376
377 if save_to_storage {
379 self.save_to_storage()?;
380 }
381
382 Ok(key)
383 }
384}
385
386impl Default for AgentKeyManager {
387 fn default() -> Self {
388 Self::new()
389 }
390}
391
392#[async_trait]
393impl KeyManager for AgentKeyManager {
394 fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>> {
396 Arc::clone(&self.secrets)
397 }
398
399 fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
401 self.generate_key_internal(options, true)
402 }
403
404 fn generate_web_did(
406 &self,
407 domain: &str,
408 options: DIDGenerationOptions,
409 ) -> Result<GeneratedKey> {
410 self.generate_web_did_internal(domain, options, true)
411 }
412
413 fn add_key(&self, key: &GeneratedKey) -> Result<()> {
415 self.add_key_internal(key, true)
416 }
417
418 fn remove_key(&self, did: &str) -> Result<()> {
420 if let Ok(mut secrets) = self.secrets.write() {
422 secrets.remove(did);
423 } else {
424 return Err(Error::FailedToAcquireResolverWriteLock);
425 }
426
427 if let Ok(mut signing_keys) = self.signing_keys.write() {
429 signing_keys.retain(|k, _| !k.starts_with(did));
430 } else {
431 return Err(Error::FailedToAcquireResolverWriteLock);
432 }
433
434 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
436 encryption_keys.retain(|k, _| !k.starts_with(did));
437 } else {
438 return Err(Error::FailedToAcquireResolverWriteLock);
439 }
440
441 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
443 decryption_keys.retain(|k, _| !k.starts_with(did));
444 } else {
445 return Err(Error::FailedToAcquireResolverWriteLock);
446 }
447
448 if let Ok(mut verification_keys) = self.verification_keys.write() {
450 verification_keys.retain(|k, _| !k.starts_with(did));
451 } else {
452 return Err(Error::FailedToAcquireResolverWriteLock);
453 }
454
455 self.save_to_storage()?;
457
458 Ok(())
459 }
460
461 fn has_key(&self, did: &str) -> Result<bool> {
463 if let Ok(secrets) = self.secrets.read() {
465 if secrets.contains_key(did) {
466 return Ok(true);
467 }
468 } else {
469 return Err(Error::FailedToAcquireResolverReadLock);
470 }
471
472 if let Ok(signing_keys) = self.signing_keys.read() {
474 if signing_keys.values().any(|k| k.did() == did) {
475 return Ok(true);
476 }
477 } else {
478 return Err(Error::FailedToAcquireResolverReadLock);
479 }
480
481 Ok(false)
482 }
483
484 fn list_keys(&self) -> Result<Vec<String>> {
486 let mut dids = Vec::new();
488
489 if let Ok(secrets) = self.secrets.read() {
491 dids.extend(secrets.keys().cloned());
492 } else {
493 return Err(Error::FailedToAcquireResolverReadLock);
494 }
495
496 if let Ok(signing_keys) = self.signing_keys.read() {
498 for key in signing_keys.values() {
499 if !dids.contains(&key.did().to_string()) {
500 dids.push(key.did().to_string());
501 }
502 }
503 } else {
504 return Err(Error::FailedToAcquireResolverReadLock);
505 }
506
507 Ok(dids)
508 }
509
510 async fn add_signing_key(&self, key: Arc<dyn SigningKey + Send + Sync>) -> Result<()> {
512 if let Ok(mut signing_keys) = self.signing_keys.write() {
513 signing_keys.insert(key.key_id().to_string(), key);
514 Ok(())
515 } else {
516 Err(Error::FailedToAcquireResolverWriteLock)
517 }
518 }
519
520 async fn add_encryption_key(&self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Result<()> {
522 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
523 encryption_keys.insert(key.key_id().to_string(), key);
524 Ok(())
525 } else {
526 Err(Error::FailedToAcquireResolverWriteLock)
527 }
528 }
529
530 async fn add_decryption_key(&self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Result<()> {
532 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
533 decryption_keys.insert(key.key_id().to_string(), key);
534 Ok(())
535 } else {
536 Err(Error::FailedToAcquireResolverWriteLock)
537 }
538 }
539
540 async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
542 if let Ok(signing_keys) = self.signing_keys.read() {
544 if let Some(key) = signing_keys.get(kid) {
545 return Ok(key.clone());
546 }
547 } else {
548 return Err(Error::FailedToAcquireResolverReadLock);
549 }
550
551 if let Ok(secrets) = self.secrets.read() {
553 let did = kid.split('#').next().unwrap_or(kid);
555 if let Some(secret) = secrets.get(did) {
556 let key_type = match &secret.secret_material {
558 SecretMaterial::JWK { private_key_jwk } => {
559 let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
560 let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
561 match (kty, crv) {
562 (Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
563 (Some("EC"), Some("P-256")) => KeyType::P256,
564 (Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
565 _ => KeyType::Ed25519, }
567 }
568 };
569 let agent_key = LocalAgentKey::new(secret.clone(), key_type);
571
572 if let Ok(mut signing_keys) = self.signing_keys.write() {
574 let arc_key = Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>;
575 signing_keys.insert(AgentKey::key_id(&agent_key).to_string(), arc_key.clone());
576 return Ok(arc_key);
577 }
578 }
579 }
580
581 Err(Error::Cryptography(format!(
582 "No signing key found with ID: {}",
583 kid
584 )))
585 }
586
587 async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
589 if let Ok(encryption_keys) = self.encryption_keys.read() {
591 if let Some(key) = encryption_keys.get(kid) {
592 return Ok(key.clone());
593 }
594 } else {
595 return Err(Error::FailedToAcquireResolverReadLock);
596 }
597
598 if let Ok(secrets) = self.secrets.read() {
600 let did = kid.split('#').next().unwrap_or(kid);
602 if let Some(secret) = secrets.get(did) {
603 let key_type = match &secret.secret_material {
605 SecretMaterial::JWK { private_key_jwk } => {
606 let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
607 let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
608 match (kty, crv) {
609 (Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
610 (Some("EC"), Some("P-256")) => KeyType::P256,
611 (Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
612 _ => KeyType::Ed25519, }
614 }
615 };
616 let agent_key = LocalAgentKey::new(secret.clone(), key_type);
618
619 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
621 let arc_key =
622 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>;
623 encryption_keys
624 .insert(AgentKey::key_id(&agent_key).to_string(), arc_key.clone());
625 return Ok(arc_key);
626 }
627 }
628 }
629
630 Err(Error::Cryptography(format!(
631 "No encryption key found with ID: {}",
632 kid
633 )))
634 }
635
636 async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
638 if let Ok(decryption_keys) = self.decryption_keys.read() {
640 if let Some(key) = decryption_keys.get(kid) {
641 return Ok(key.clone());
642 }
643 } else {
644 return Err(Error::FailedToAcquireResolverReadLock);
645 }
646
647 if let Ok(secrets) = self.secrets.read() {
649 let did = kid.split('#').next().unwrap_or(kid);
651 if let Some(secret) = secrets.get(did) {
652 let key_type = match &secret.secret_material {
654 SecretMaterial::JWK { private_key_jwk } => {
655 let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
656 let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
657 match (kty, crv) {
658 (Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
659 (Some("EC"), Some("P-256")) => KeyType::P256,
660 (Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
661 _ => KeyType::Ed25519, }
663 }
664 };
665 let agent_key = LocalAgentKey::new(secret.clone(), key_type);
667
668 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
670 let arc_key =
671 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>;
672 decryption_keys
673 .insert(AgentKey::key_id(&agent_key).to_string(), arc_key.clone());
674 return Ok(arc_key);
675 }
676 }
677 }
678
679 Err(Error::Cryptography(format!(
680 "No decryption key found with ID: {}",
681 kid
682 )))
683 }
684
685 async fn resolve_verification_key(
687 &self,
688 kid: &str,
689 ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
690 if let Ok(verification_keys) = self.verification_keys.read() {
692 if let Some(key) = verification_keys.get(kid) {
693 return Ok(key.clone());
694 }
695 } else {
696 return Err(Error::FailedToAcquireResolverReadLock);
697 }
698
699 let signing_key = KeyManager::get_signing_key(self, kid).await;
701 if let Ok(key) = signing_key {
702 let public_jwk = key.public_key_jwk()?;
704 let verification_key = Arc::new(PublicVerificationKey::new(kid.to_string(), public_jwk))
705 as Arc<dyn VerificationKey + Send + Sync>;
706
707 if let Ok(mut verification_keys) = self.verification_keys.write() {
709 verification_keys.insert(kid.to_string(), verification_key.clone());
710 }
711
712 return Ok(verification_key);
713 }
714
715 Err(Error::Cryptography(format!(
717 "No verification key found with ID: {}",
718 kid
719 )))
720 }
721
722 async fn sign_jws(
724 &self,
725 kid: &str,
726 payload: &[u8],
727 protected_header: Option<JwsProtected>,
728 ) -> Result<String> {
729 let signing_key = KeyManager::get_signing_key(self, kid).await?;
731
732 let jws = signing_key
734 .create_jws(payload, protected_header)
735 .await
736 .map_err(|e| Error::Cryptography(e.to_string()))?;
737
738 serde_json::to_string(&jws).map_err(|e| Error::Serialization(e.to_string()))
740 }
741
742 async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
744 let jws: crate::message::Jws = serde_json::from_str(jws)
746 .map_err(|e| Error::Serialization(format!("Failed to parse JWS: {}", e)))?;
747
748 let signature = if let Some(kid) = expected_kid {
750 jws.signatures
751 .iter()
752 .find(|s| s.get_kid().as_deref() == Some(kid))
753 .ok_or_else(|| {
754 Error::Cryptography(format!("No signature found with kid: {}", kid))
755 })?
756 } else {
757 jws.signatures
759 .first()
760 .ok_or_else(|| Error::Cryptography("No signatures in JWS".to_string()))?
761 };
762
763 let protected = signature.get_protected_header().map_err(|e| {
765 Error::Cryptography(format!("Failed to decode protected header: {}", e))
766 })?;
767
768 let kid = signature
770 .get_kid()
771 .ok_or_else(|| Error::Cryptography("No kid found in JWS signature".to_string()))?;
772 let verification_key = KeyManager::resolve_verification_key(self, &kid).await?;
773
774 let signature_bytes = base64::engine::general_purpose::STANDARD
776 .decode(&signature.signature)
777 .map_err(|e| Error::Cryptography(format!("Failed to decode signature: {}", e)))?;
778
779 let signing_input = format!("{}.{}", signature.protected, jws.payload);
781
782 let verified = verification_key
784 .verify_signature(signing_input.as_bytes(), &signature_bytes, &protected)
785 .await
786 .map_err(|e| Error::Cryptography(e.to_string()))?;
787
788 if !verified {
789 return Err(Error::Cryptography(
790 "Signature verification failed".to_string(),
791 ));
792 }
793
794 let payload_bytes = base64::engine::general_purpose::STANDARD
796 .decode(&jws.payload)
797 .map_err(|e| Error::Cryptography(format!("Failed to decode payload: {}", e)))?;
798
799 Ok(payload_bytes)
800 }
801
802 async fn encrypt_jwe(
804 &self,
805 sender_kid: &str,
806 recipient_kid: &str,
807 plaintext: &[u8],
808 protected_header: Option<JweProtected>,
809 ) -> Result<String> {
810 let encryption_key = KeyManager::get_encryption_key(self, sender_kid).await?;
812
813 let recipient_key = KeyManager::resolve_verification_key(self, recipient_kid).await?;
815
816 let jwe = encryption_key
818 .create_jwe(plaintext, &[recipient_key], protected_header)
819 .await
820 .map_err(|e| Error::Cryptography(e.to_string()))?;
821
822 serde_json::to_string(&jwe).map_err(|e| Error::Serialization(e.to_string()))
824 }
825
826 async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
828 let jwe: crate::message::Jwe = serde_json::from_str(jwe)
830 .map_err(|e| Error::Serialization(format!("Failed to parse JWE: {}", e)))?;
831
832 if let Some(kid) = expected_kid {
834 jwe.recipients
836 .iter()
837 .find(|r| r.header.kid == kid)
838 .ok_or_else(|| {
839 Error::Cryptography(format!("No recipient found with kid: {}", kid))
840 })?;
841
842 let decryption_key = KeyManager::get_decryption_key(self, kid).await?;
844
845 decryption_key
847 .unwrap_jwe(&jwe)
848 .await
849 .map_err(|e| Error::Cryptography(e.to_string()))
850 } else {
851 for recipient in &jwe.recipients {
853 if let Ok(decryption_key) =
855 KeyManager::get_decryption_key(self, &recipient.header.kid).await
856 {
857 if let Ok(plaintext) = decryption_key.unwrap_jwe(&jwe).await {
859 return Ok(plaintext);
860 }
861 }
862 }
863
864 Err(Error::Cryptography(
865 "Failed to decrypt JWE for any recipient".to_string(),
866 ))
867 }
868 }
869}
870
871#[derive(Debug, Clone)]
873pub struct AgentKeyManagerBuilder {
874 secrets: HashMap<String, Secret>,
876 signing_keys: HashMap<String, Arc<dyn SigningKey + Send + Sync>>,
878 encryption_keys: HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>,
880 decryption_keys: HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>,
882 verification_keys: HashMap<String, Arc<dyn VerificationKey + Send + Sync>>,
884 load_from_storage: bool,
886 storage_path: Option<PathBuf>,
888}
889
890impl Default for AgentKeyManagerBuilder {
891 fn default() -> Self {
892 Self::new()
893 }
894}
895
896impl AgentKeyManagerBuilder {
897 pub fn new() -> Self {
899 Self {
900 secrets: HashMap::new(),
901 signing_keys: HashMap::new(),
902 encryption_keys: HashMap::new(),
903 decryption_keys: HashMap::new(),
904 verification_keys: HashMap::new(),
905 load_from_storage: false,
906 storage_path: None,
907 }
908 }
909
910 pub fn load_from_default_storage(mut self) -> Self {
912 self.load_from_storage = true;
913 self.storage_path = None;
914 self
915 }
916
917 pub fn load_from_path(mut self, path: PathBuf) -> Self {
919 self.load_from_storage = true;
920 self.storage_path = Some(path);
921 self
922 }
923
924 pub fn add_secret(mut self, did: String, secret: Secret) -> Self {
926 self.secrets.insert(did, secret);
927 self
928 }
929
930 pub fn add_signing_key(mut self, key: Arc<dyn SigningKey + Send + Sync>) -> Self {
932 self.signing_keys.insert(key.key_id().to_string(), key);
933 self
934 }
935
936 pub fn add_encryption_key(mut self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Self {
938 self.encryption_keys.insert(key.key_id().to_string(), key);
939 self
940 }
941
942 pub fn add_decryption_key(mut self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Self {
944 self.decryption_keys.insert(key.key_id().to_string(), key);
945 self
946 }
947
948 pub fn add_verification_key(mut self, key: Arc<dyn VerificationKey + Send + Sync>) -> Self {
950 self.verification_keys.insert(key.key_id().to_string(), key);
951 self
952 }
953
954 pub fn build(self) -> Result<AgentKeyManager> {
956 let mut key_manager = AgentKeyManager {
957 generator: DIDKeyGenerator::new(),
958 secrets: Arc::new(RwLock::new(self.secrets)),
959 signing_keys: Arc::new(RwLock::new(self.signing_keys)),
960 encryption_keys: Arc::new(RwLock::new(self.encryption_keys)),
961 decryption_keys: Arc::new(RwLock::new(self.decryption_keys)),
962 verification_keys: Arc::new(RwLock::new(self.verification_keys)),
963 generated_keys: Arc::new(RwLock::new(HashMap::new())),
964 storage_path: self.storage_path.clone(),
965 };
966
967 if self.load_from_storage {
969 key_manager = if let Some(path) = self.storage_path {
970 key_manager.load_from_path(path)?
971 } else {
972 key_manager.load_from_default_storage()?
973 };
974 }
975
976 Ok(key_manager)
977 }
978}
979
980#[async_trait]
981impl KeyManagerPacking for AgentKeyManager {
982 async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
983 KeyManager::get_signing_key(self, kid)
984 .await
985 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
986 }
987
988 async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
989 KeyManager::get_encryption_key(self, kid)
990 .await
991 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
992 }
993
994 async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
995 KeyManager::get_decryption_key(self, kid)
996 .await
997 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
998 }
999
1000 async fn resolve_verification_key(
1001 &self,
1002 kid: &str,
1003 ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
1004 KeyManager::resolve_verification_key(self, kid)
1005 .await
1006 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
1007 }
1008}