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 get_private_key(&self, did: &str) -> Result<(Vec<u8>, KeyType)> {
152 if let Ok(generated_keys) = self.generated_keys.read() {
154 if let Some(key) = generated_keys.get(did) {
155 return Ok((key.private_key.clone(), key.key_type));
156 }
157 } else {
158 return Err(Error::FailedToAcquireResolverReadLock);
159 }
160
161 if let Ok(secrets) = self.secrets.read() {
163 if let Some(secret) = secrets.get(did) {
164 return crate::key_manager::extract_private_key_from_secret(secret);
165 }
166 } else {
167 return Err(Error::FailedToAcquireResolverReadLock);
168 }
169
170 Err(Error::KeyNotFound(format!(
171 "Private key not found for DID: {}",
172 did
173 )))
174 }
175
176 pub fn save_to_storage(&self) -> Result<()> {
178 if self.storage_path.is_none() {
180 return Ok(());
181 }
182
183 let mut key_storage = KeyStorage::new();
185
186 if let Ok(secrets) = self.secrets.read() {
188 for (did, secret) in secrets.iter() {
189 let key_type = match secret.secret_material {
191 SecretMaterial::JWK {
192 ref private_key_jwk,
193 } => {
194 let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
195 let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
196
197 match (kty, crv) {
198 #[cfg(feature = "crypto-ed25519")]
199 (Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
200 #[cfg(feature = "crypto-p256")]
201 (Some("EC"), Some("P-256")) => KeyType::P256,
202 #[cfg(feature = "crypto-secp256k1")]
203 (Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
204 _ => KeyType::Ed25519, }
206 }
207 };
208
209 let private_key_b64 = match &secret.secret_material {
211 SecretMaterial::JWK { private_key_jwk } => private_key_jwk
212 .get("d")
213 .and_then(|v| v.as_str())
214 .unwrap_or("")
215 .to_string(),
216 };
217
218 let public_key_b64 = match &secret.secret_material {
219 SecretMaterial::JWK { private_key_jwk } => private_key_jwk
220 .get("x")
221 .and_then(|v| v.as_str())
222 .unwrap_or("")
223 .to_string(),
224 };
225
226 let stored_key = StoredKey {
228 did: did.clone(),
229 label: String::new(), key_type,
231 private_key: private_key_b64,
232 public_key: public_key_b64,
233 metadata: HashMap::new(),
234 };
235 key_storage.add_key(stored_key);
236 }
237 }
238
239 if let Some(path) = &self.storage_path {
241 key_storage.save_to_path(path)?;
242 } else {
243 key_storage.save_default()?;
244 }
245
246 Ok(())
247 }
248
249 pub fn load_from_default_storage(mut self) -> Result<Self> {
251 self.storage_path = None;
252 self.load_keys_from_storage()
253 }
254
255 pub fn load_from_path(mut self, path: PathBuf) -> Result<Self> {
257 self.storage_path = Some(path);
258 self.load_keys_from_storage()
259 }
260
261 fn load_keys_from_storage(&self) -> Result<Self> {
263 let storage = if let Some(path) = &self.storage_path {
265 KeyStorage::load_from_path(path)?
266 } else {
267 KeyStorage::load_default()?
268 };
269
270 for (did, stored_key) in storage.keys {
272 let secret = KeyStorage::to_secret(&stored_key);
274
275 if let Ok(mut secrets) = self.secrets.write() {
277 secrets.insert(did.clone(), secret.clone());
278 } else {
279 return Err(Error::FailedToAcquireResolverWriteLock);
280 }
281
282 let key_type = stored_key.key_type;
284 let agent_key = LocalAgentKey::new(secret, key_type);
285 let key_id = AgentKey::key_id(&agent_key).to_string();
286
287 self.store_agent_key(&agent_key, &key_id)?;
289 }
290
291 Ok(self.clone())
292 }
293
294 fn add_key_internal(&self, key: &GeneratedKey, save_to_storage: bool) -> Result<()> {
296 let agent_key = self.agent_key_from_generated(key)?;
298 let key_id = AgentKey::key_id(&agent_key).to_string();
299
300 if let Ok(mut secrets) = self.secrets.write() {
302 secrets.insert(key.did.clone(), agent_key.clone().secret);
303 } else {
304 return Err(Error::FailedToAcquireResolverWriteLock);
305 }
306
307 self.store_agent_key(&agent_key, &key_id)?;
309
310 if save_to_storage {
312 self.save_to_storage()?;
313 }
314
315 Ok(())
316 }
317
318 pub fn add_key_without_save(&self, key: &GeneratedKey) -> Result<()> {
321 self.add_key_internal(key, false)
322 }
323
324 pub fn generate_key_without_save(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
327 self.generate_key_internal(options, false)
328 }
329
330 fn generate_key_internal(
332 &self,
333 options: DIDGenerationOptions,
334 save_to_storage: bool,
335 ) -> Result<GeneratedKey> {
336 let key = self.generator.generate_did(options)?;
338
339 let agent_key = self.agent_key_from_generated(&key)?;
341 let key_id = AgentKey::key_id(&agent_key).to_string();
342
343 if let Ok(mut secrets) = self.secrets.write() {
345 secrets.insert(key.did.clone(), agent_key.clone().secret);
346 } else {
347 return Err(Error::FailedToAcquireResolverWriteLock);
348 }
349
350 if let Ok(mut generated_keys) = self.generated_keys.write() {
352 generated_keys.insert(key.did.clone(), key.clone());
353 } else {
354 return Err(Error::FailedToAcquireResolverWriteLock);
355 }
356
357 self.store_agent_key(&agent_key, &key_id)?;
359
360 if save_to_storage {
362 self.save_to_storage()?;
363 }
364
365 Ok(key)
366 }
367
368 pub fn generate_web_did_without_save(
371 &self,
372 domain: &str,
373 options: DIDGenerationOptions,
374 ) -> Result<GeneratedKey> {
375 self.generate_web_did_internal(domain, options, false)
376 }
377
378 fn generate_web_did_internal(
380 &self,
381 domain: &str,
382 options: DIDGenerationOptions,
383 save_to_storage: bool,
384 ) -> Result<GeneratedKey> {
385 let key = self.generator.generate_web_did(domain, options)?;
387
388 let agent_key = self.agent_key_from_generated(&key)?;
390 let key_id = AgentKey::key_id(&agent_key).to_string();
391
392 if let Ok(mut secrets) = self.secrets.write() {
394 secrets.insert(key.did.clone(), agent_key.clone().secret);
395 } else {
396 return Err(Error::FailedToAcquireResolverWriteLock);
397 }
398
399 if let Ok(mut generated_keys) = self.generated_keys.write() {
401 generated_keys.insert(key.did.clone(), key.clone());
402 } else {
403 return Err(Error::FailedToAcquireResolverWriteLock);
404 }
405
406 self.store_agent_key(&agent_key, &key_id)?;
408
409 if save_to_storage {
411 self.save_to_storage()?;
412 }
413
414 Ok(key)
415 }
416}
417
418impl Default for AgentKeyManager {
419 fn default() -> Self {
420 Self::new()
421 }
422}
423
424#[async_trait]
425impl KeyManager for AgentKeyManager {
426 fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>> {
428 Arc::clone(&self.secrets)
429 }
430
431 fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, KeyType)> {
433 AgentKeyManager::get_private_key(self, did)
434 }
435
436 fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
438 self.generate_key_internal(options, true)
439 }
440
441 fn generate_web_did(
443 &self,
444 domain: &str,
445 options: DIDGenerationOptions,
446 ) -> Result<GeneratedKey> {
447 self.generate_web_did_internal(domain, options, true)
448 }
449
450 fn add_key(&self, key: &GeneratedKey) -> Result<()> {
452 self.add_key_internal(key, true)
453 }
454
455 fn remove_key(&self, did: &str) -> Result<()> {
457 if let Ok(mut secrets) = self.secrets.write() {
459 secrets.remove(did);
460 } else {
461 return Err(Error::FailedToAcquireResolverWriteLock);
462 }
463
464 if let Ok(mut signing_keys) = self.signing_keys.write() {
466 signing_keys.retain(|k, _| !k.starts_with(did));
467 } else {
468 return Err(Error::FailedToAcquireResolverWriteLock);
469 }
470
471 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
473 encryption_keys.retain(|k, _| !k.starts_with(did));
474 } else {
475 return Err(Error::FailedToAcquireResolverWriteLock);
476 }
477
478 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
480 decryption_keys.retain(|k, _| !k.starts_with(did));
481 } else {
482 return Err(Error::FailedToAcquireResolverWriteLock);
483 }
484
485 if let Ok(mut verification_keys) = self.verification_keys.write() {
487 verification_keys.retain(|k, _| !k.starts_with(did));
488 } else {
489 return Err(Error::FailedToAcquireResolverWriteLock);
490 }
491
492 self.save_to_storage()?;
494
495 Ok(())
496 }
497
498 fn has_key(&self, did: &str) -> Result<bool> {
500 if let Ok(secrets) = self.secrets.read() {
502 if secrets.contains_key(did) {
503 return Ok(true);
504 }
505 } else {
506 return Err(Error::FailedToAcquireResolverReadLock);
507 }
508
509 if let Ok(signing_keys) = self.signing_keys.read() {
511 if signing_keys.values().any(|k| k.did() == did) {
512 return Ok(true);
513 }
514 } else {
515 return Err(Error::FailedToAcquireResolverReadLock);
516 }
517
518 Ok(false)
519 }
520
521 fn list_keys(&self) -> Result<Vec<String>> {
523 let mut dids = Vec::new();
525
526 if let Ok(secrets) = self.secrets.read() {
528 dids.extend(secrets.keys().cloned());
529 } else {
530 return Err(Error::FailedToAcquireResolverReadLock);
531 }
532
533 if let Ok(signing_keys) = self.signing_keys.read() {
535 for key in signing_keys.values() {
536 if !dids.contains(&key.did().to_string()) {
537 dids.push(key.did().to_string());
538 }
539 }
540 } else {
541 return Err(Error::FailedToAcquireResolverReadLock);
542 }
543
544 Ok(dids)
545 }
546
547 async fn add_signing_key(&self, key: Arc<dyn SigningKey + Send + Sync>) -> Result<()> {
549 if let Ok(mut signing_keys) = self.signing_keys.write() {
550 signing_keys.insert(key.key_id().to_string(), key);
551 Ok(())
552 } else {
553 Err(Error::FailedToAcquireResolverWriteLock)
554 }
555 }
556
557 async fn add_encryption_key(&self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Result<()> {
559 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
560 encryption_keys.insert(key.key_id().to_string(), key);
561 Ok(())
562 } else {
563 Err(Error::FailedToAcquireResolverWriteLock)
564 }
565 }
566
567 async fn add_decryption_key(&self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Result<()> {
569 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
570 decryption_keys.insert(key.key_id().to_string(), key);
571 Ok(())
572 } else {
573 Err(Error::FailedToAcquireResolverWriteLock)
574 }
575 }
576
577 async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
579 if let Ok(signing_keys) = self.signing_keys.read() {
581 if let Some(key) = signing_keys.get(kid) {
582 return Ok(key.clone());
583 }
584 } else {
585 return Err(Error::FailedToAcquireResolverReadLock);
586 }
587
588 if let Ok(secrets) = self.secrets.read() {
590 let did = kid.split('#').next().unwrap_or(kid);
592 if let Some(secret) = secrets.get(did) {
593 let key_type = match &secret.secret_material {
595 SecretMaterial::JWK { private_key_jwk } => {
596 let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
597 let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
598 match (kty, crv) {
599 #[cfg(feature = "crypto-ed25519")]
600 (Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
601 #[cfg(feature = "crypto-p256")]
602 (Some("EC"), Some("P-256")) => KeyType::P256,
603 #[cfg(feature = "crypto-secp256k1")]
604 (Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
605 _ => KeyType::Ed25519, }
607 }
608 };
609 let agent_key = LocalAgentKey::new(secret.clone(), key_type);
611
612 if let Ok(mut signing_keys) = self.signing_keys.write() {
614 let arc_key = Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>;
615 signing_keys.insert(AgentKey::key_id(&agent_key).to_string(), arc_key.clone());
616 return Ok(arc_key);
617 }
618 }
619 }
620
621 Err(Error::Cryptography(format!(
622 "No signing key found with ID: {}",
623 kid
624 )))
625 }
626
627 async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
629 if let Ok(encryption_keys) = self.encryption_keys.read() {
631 if let Some(key) = encryption_keys.get(kid) {
632 return Ok(key.clone());
633 }
634 } else {
635 return Err(Error::FailedToAcquireResolverReadLock);
636 }
637
638 if let Ok(secrets) = self.secrets.read() {
640 let did = kid.split('#').next().unwrap_or(kid);
642 if let Some(secret) = secrets.get(did) {
643 let key_type = match &secret.secret_material {
645 SecretMaterial::JWK { private_key_jwk } => {
646 let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
647 let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
648 match (kty, crv) {
649 #[cfg(feature = "crypto-ed25519")]
650 (Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
651 #[cfg(feature = "crypto-p256")]
652 (Some("EC"), Some("P-256")) => KeyType::P256,
653 #[cfg(feature = "crypto-secp256k1")]
654 (Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
655 _ => KeyType::Ed25519, }
657 }
658 };
659 let agent_key = LocalAgentKey::new(secret.clone(), key_type);
661
662 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
664 let arc_key =
665 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>;
666 encryption_keys
667 .insert(AgentKey::key_id(&agent_key).to_string(), arc_key.clone());
668 return Ok(arc_key);
669 }
670 }
671 }
672
673 Err(Error::Cryptography(format!(
674 "No encryption key found with ID: {}",
675 kid
676 )))
677 }
678
679 async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
681 if let Ok(decryption_keys) = self.decryption_keys.read() {
683 if let Some(key) = decryption_keys.get(kid) {
684 return Ok(key.clone());
685 }
686 } else {
687 return Err(Error::FailedToAcquireResolverReadLock);
688 }
689
690 if let Ok(secrets) = self.secrets.read() {
692 let did = kid.split('#').next().unwrap_or(kid);
694 if let Some(secret) = secrets.get(did) {
695 let key_type = match &secret.secret_material {
697 SecretMaterial::JWK { private_key_jwk } => {
698 let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
699 let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
700 match (kty, crv) {
701 #[cfg(feature = "crypto-ed25519")]
702 (Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
703 #[cfg(feature = "crypto-p256")]
704 (Some("EC"), Some("P-256")) => KeyType::P256,
705 #[cfg(feature = "crypto-secp256k1")]
706 (Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
707 _ => KeyType::Ed25519, }
709 }
710 };
711 let agent_key = LocalAgentKey::new(secret.clone(), key_type);
713
714 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
716 let arc_key =
717 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>;
718 decryption_keys
719 .insert(AgentKey::key_id(&agent_key).to_string(), arc_key.clone());
720 return Ok(arc_key);
721 }
722 }
723 }
724
725 Err(Error::Cryptography(format!(
726 "No decryption key found with ID: {}",
727 kid
728 )))
729 }
730
731 async fn resolve_verification_key(
733 &self,
734 kid: &str,
735 ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
736 if let Ok(verification_keys) = self.verification_keys.read() {
738 if let Some(key) = verification_keys.get(kid) {
739 return Ok(key.clone());
740 }
741 } else {
742 return Err(Error::FailedToAcquireResolverReadLock);
743 }
744
745 let signing_key = KeyManager::get_signing_key(self, kid).await;
747 if let Ok(key) = signing_key {
748 let public_jwk = key.public_key_jwk()?;
750 let verification_key = Arc::new(PublicVerificationKey::new(kid.to_string(), public_jwk))
751 as Arc<dyn VerificationKey + Send + Sync>;
752
753 if let Ok(mut verification_keys) = self.verification_keys.write() {
755 verification_keys.insert(kid.to_string(), verification_key.clone());
756 }
757
758 return Ok(verification_key);
759 }
760
761 let did = kid.split('#').next().unwrap_or(kid);
763 if did.starts_with("did:key:") {
764 let resolver = crate::did::KeyResolver::new();
765 #[cfg(not(target_arch = "wasm32"))]
766 let did_doc_result = {
767 use crate::did::DIDMethodResolver;
768 resolver.resolve_method(did).await
769 };
770 #[cfg(target_arch = "wasm32")]
771 let did_doc_result = {
772 use crate::did::WasmDIDMethodResolver;
773 resolver.resolve_method(did)
774 };
775
776 if let Ok(Some(did_doc)) = did_doc_result {
777 if let Some(vm) = did_doc.verification_method.iter().find(|vm| vm.id == kid) {
779 if let Ok(vk) = PublicVerificationKey::from_verification_material(
780 kid.to_string(),
781 &vm.verification_material,
782 ) {
783 let verification_key =
784 Arc::new(vk) as Arc<dyn VerificationKey + Send + Sync>;
785
786 if let Ok(mut verification_keys) = self.verification_keys.write() {
788 verification_keys.insert(kid.to_string(), verification_key.clone());
789 }
790
791 return Ok(verification_key);
792 }
793 }
794 }
795 }
796
797 Err(Error::Cryptography(format!(
798 "No verification key found with ID: {}",
799 kid
800 )))
801 }
802
803 async fn sign_jws(
805 &self,
806 kid: &str,
807 payload: &[u8],
808 protected_header: Option<JwsProtected>,
809 ) -> Result<String> {
810 let signing_key = KeyManager::get_signing_key(self, kid).await?;
812
813 let jws = signing_key
815 .create_jws(payload, protected_header)
816 .await
817 .map_err(|e| Error::Cryptography(e.to_string()))?;
818
819 serde_json::to_string(&jws).map_err(|e| Error::Serialization(e.to_string()))
821 }
822
823 async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
825 let jws: crate::message::Jws = serde_json::from_str(jws)
827 .map_err(|e| Error::Serialization(format!("Failed to parse JWS: {}", e)))?;
828
829 let signature = if let Some(kid) = expected_kid {
831 jws.signatures
832 .iter()
833 .find(|s| s.get_kid().as_deref() == Some(kid))
834 .ok_or_else(|| {
835 Error::Cryptography(format!("No signature found with kid: {}", kid))
836 })?
837 } else {
838 jws.signatures
840 .first()
841 .ok_or_else(|| Error::Cryptography("No signatures in JWS".to_string()))?
842 };
843
844 let protected = signature.get_protected_header().map_err(|e| {
846 Error::Cryptography(format!("Failed to decode protected header: {}", e))
847 })?;
848
849 let kid = signature
851 .get_kid()
852 .ok_or_else(|| Error::Cryptography("No kid found in JWS signature".to_string()))?;
853 let verification_key = KeyManager::resolve_verification_key(self, &kid).await?;
854
855 let signature_bytes = base64::engine::general_purpose::STANDARD
857 .decode(&signature.signature)
858 .map_err(|e| Error::Cryptography(format!("Failed to decode signature: {}", e)))?;
859
860 let signing_input = format!("{}.{}", signature.protected, jws.payload);
862
863 let verified = verification_key
865 .verify_signature(signing_input.as_bytes(), &signature_bytes, &protected)
866 .await
867 .map_err(|e| Error::Cryptography(e.to_string()))?;
868
869 if !verified {
870 return Err(Error::Cryptography(
871 "Signature verification failed".to_string(),
872 ));
873 }
874
875 let payload_bytes = base64::engine::general_purpose::STANDARD
877 .decode(&jws.payload)
878 .map_err(|e| Error::Cryptography(format!("Failed to decode payload: {}", e)))?;
879
880 Ok(payload_bytes)
881 }
882
883 async fn encrypt_jwe(
885 &self,
886 sender_kid: &str,
887 recipient_kid: &str,
888 plaintext: &[u8],
889 protected_header: Option<JweProtected>,
890 ) -> Result<String> {
891 let encryption_key = KeyManager::get_encryption_key(self, sender_kid).await?;
893
894 let recipient_key = KeyManager::resolve_verification_key(self, recipient_kid).await?;
896
897 let jwe = encryption_key
899 .create_jwe(plaintext, &[recipient_key], protected_header)
900 .await
901 .map_err(|e| Error::Cryptography(e.to_string()))?;
902
903 serde_json::to_string(&jwe).map_err(|e| Error::Serialization(e.to_string()))
905 }
906
907 async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
909 let jwe: crate::message::Jwe = serde_json::from_str(jwe)
911 .map_err(|e| Error::Serialization(format!("Failed to parse JWE: {}", e)))?;
912
913 if let Some(kid) = expected_kid {
915 jwe.recipients
917 .iter()
918 .find(|r| r.header.kid == kid)
919 .ok_or_else(|| {
920 Error::Cryptography(format!("No recipient found with kid: {}", kid))
921 })?;
922
923 let decryption_key = KeyManager::get_decryption_key(self, kid).await?;
925
926 decryption_key
928 .unwrap_jwe(&jwe)
929 .await
930 .map_err(|e| Error::Cryptography(e.to_string()))
931 } else {
932 for recipient in &jwe.recipients {
934 if let Ok(decryption_key) =
936 KeyManager::get_decryption_key(self, &recipient.header.kid).await
937 {
938 if let Ok(plaintext) = decryption_key.unwrap_jwe(&jwe).await {
940 return Ok(plaintext);
941 }
942 }
943 }
944
945 Err(Error::Cryptography(
946 "Failed to decrypt JWE for any recipient".to_string(),
947 ))
948 }
949 }
950}
951
952#[derive(Debug, Clone)]
954pub struct AgentKeyManagerBuilder {
955 secrets: HashMap<String, Secret>,
957 signing_keys: HashMap<String, Arc<dyn SigningKey + Send + Sync>>,
959 encryption_keys: HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>,
961 decryption_keys: HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>,
963 verification_keys: HashMap<String, Arc<dyn VerificationKey + Send + Sync>>,
965 load_from_storage: bool,
967 storage_path: Option<PathBuf>,
969}
970
971impl Default for AgentKeyManagerBuilder {
972 fn default() -> Self {
973 Self::new()
974 }
975}
976
977impl AgentKeyManagerBuilder {
978 pub fn new() -> Self {
980 Self {
981 secrets: HashMap::new(),
982 signing_keys: HashMap::new(),
983 encryption_keys: HashMap::new(),
984 decryption_keys: HashMap::new(),
985 verification_keys: HashMap::new(),
986 load_from_storage: false,
987 storage_path: None,
988 }
989 }
990
991 pub fn load_from_default_storage(mut self) -> Self {
993 self.load_from_storage = true;
994 self.storage_path = None;
995 self
996 }
997
998 pub fn load_from_path(mut self, path: PathBuf) -> Self {
1000 self.load_from_storage = true;
1001 self.storage_path = Some(path);
1002 self
1003 }
1004
1005 pub fn add_secret(mut self, did: String, secret: Secret) -> Self {
1007 self.secrets.insert(did, secret);
1008 self
1009 }
1010
1011 pub fn add_signing_key(mut self, key: Arc<dyn SigningKey + Send + Sync>) -> Self {
1013 self.signing_keys.insert(key.key_id().to_string(), key);
1014 self
1015 }
1016
1017 pub fn add_encryption_key(mut self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Self {
1019 self.encryption_keys.insert(key.key_id().to_string(), key);
1020 self
1021 }
1022
1023 pub fn add_decryption_key(mut self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Self {
1025 self.decryption_keys.insert(key.key_id().to_string(), key);
1026 self
1027 }
1028
1029 pub fn add_verification_key(mut self, key: Arc<dyn VerificationKey + Send + Sync>) -> Self {
1031 self.verification_keys.insert(key.key_id().to_string(), key);
1032 self
1033 }
1034
1035 pub fn build(self) -> Result<AgentKeyManager> {
1037 let mut key_manager = AgentKeyManager {
1038 generator: DIDKeyGenerator::new(),
1039 secrets: Arc::new(RwLock::new(self.secrets)),
1040 signing_keys: Arc::new(RwLock::new(self.signing_keys)),
1041 encryption_keys: Arc::new(RwLock::new(self.encryption_keys)),
1042 decryption_keys: Arc::new(RwLock::new(self.decryption_keys)),
1043 verification_keys: Arc::new(RwLock::new(self.verification_keys)),
1044 generated_keys: Arc::new(RwLock::new(HashMap::new())),
1045 storage_path: self.storage_path.clone(),
1046 };
1047
1048 if self.load_from_storage {
1050 key_manager = if let Some(path) = self.storage_path {
1051 key_manager.load_from_path(path)?
1052 } else {
1053 key_manager.load_from_default_storage()?
1054 };
1055 }
1056
1057 Ok(key_manager)
1058 }
1059}
1060
1061#[async_trait]
1062impl KeyManagerPacking for AgentKeyManager {
1063 async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
1064 KeyManager::get_signing_key(self, kid)
1065 .await
1066 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
1067 }
1068
1069 async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
1070 KeyManager::get_encryption_key(self, kid)
1071 .await
1072 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
1073 }
1074
1075 async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
1076 KeyManager::get_decryption_key(self, kid)
1077 .await
1078 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
1079 }
1080
1081 async fn resolve_verification_key(
1082 &self,
1083 kid: &str,
1084 ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
1085 KeyManager::resolve_verification_key(self, kid)
1086 .await
1087 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
1088 }
1089}
1090
1091#[cfg(test)]
1092mod tests {
1093 use super::*;
1094 use crate::agent::TapAgent;
1095 use crate::did::{DIDGenerationOptions, KeyType};
1096 use crate::key_manager::KeyManager;
1097
1098 #[test]
1099 fn test_get_private_key_for_generated_key() {
1100 let km = AgentKeyManager::new();
1101 let key = km
1102 .generate_key(DIDGenerationOptions {
1103 key_type: KeyType::Ed25519,
1104 })
1105 .unwrap();
1106
1107 let (private_key, key_type) = km.get_private_key(&key.did).unwrap();
1108 assert_eq!(private_key, key.private_key);
1109 assert_eq!(key_type, KeyType::Ed25519);
1110 }
1111
1112 #[test]
1113 fn test_get_private_key_for_storage_loaded_key() {
1114 let km = AgentKeyManager::new();
1116 let key = km
1117 .generate_key(DIDGenerationOptions {
1118 key_type: KeyType::Ed25519,
1119 })
1120 .unwrap();
1121
1122 let km2 = AgentKeyManager::new();
1124 let secret = km.secrets().read().unwrap().get(&key.did).cloned().unwrap();
1125 km2.secrets()
1126 .write()
1127 .unwrap()
1128 .insert(key.did.clone(), secret);
1129
1130 let (private_key, key_type) = km2.get_private_key(&key.did).unwrap();
1132 assert_eq!(private_key, key.private_key);
1133 assert_eq!(key_type, KeyType::Ed25519);
1134 }
1135
1136 #[cfg(feature = "crypto-p256")]
1137 #[test]
1138 fn test_get_private_key_p256() {
1139 let km = AgentKeyManager::new();
1140 let key = km
1141 .generate_key(DIDGenerationOptions {
1142 key_type: KeyType::P256,
1143 })
1144 .unwrap();
1145
1146 let (private_key, key_type) = km.get_private_key(&key.did).unwrap();
1147 assert_eq!(private_key, key.private_key);
1148 assert_eq!(key_type, KeyType::P256);
1149 }
1150
1151 #[cfg(feature = "crypto-secp256k1")]
1152 #[test]
1153 fn test_get_private_key_secp256k1() {
1154 let km = AgentKeyManager::new();
1155 let key = km
1156 .generate_key(DIDGenerationOptions {
1157 key_type: KeyType::Secp256k1,
1158 })
1159 .unwrap();
1160
1161 let (private_key, key_type) = km.get_private_key(&key.did).unwrap();
1162 assert_eq!(private_key, key.private_key);
1163 assert_eq!(key_type, KeyType::Secp256k1);
1164 }
1165
1166 #[test]
1167 fn test_get_private_key_unknown_did() {
1168 let km = AgentKeyManager::new();
1169 let result = km.get_private_key("did:key:nonexistent");
1170 assert!(result.is_err());
1171 match result.unwrap_err() {
1172 Error::KeyNotFound(_) => {} other => panic!("Expected KeyNotFound, got: {:?}", other),
1174 }
1175 }
1176
1177 #[tokio::test]
1178 async fn test_get_private_key_roundtrip() {
1179 let km = AgentKeyManager::new();
1180 let key = km
1181 .generate_key(DIDGenerationOptions {
1182 key_type: KeyType::Ed25519,
1183 })
1184 .unwrap();
1185
1186 let (private_key, key_type) = km.get_private_key(&key.did).unwrap();
1188
1189 let (_agent, new_did) = TapAgent::from_private_key(&private_key, key_type, false)
1191 .await
1192 .unwrap();
1193
1194 assert_eq!(new_did, key.did);
1196 }
1197}