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 base64::Engine;
13use serde::{Deserialize, Serialize};
14use serde_json::Value;
15use std::collections::HashMap;
16use std::sync::{Arc, RwLock};
17
18#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
22#[serde(rename_all = "camelCase")]
23pub enum SecretType {
24 JsonWebKey2020,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
30#[serde(untagged)]
31pub enum SecretMaterial {
32 JWK {
34 private_key_jwk: Value,
36 },
37}
38
39#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
41pub struct Secret {
42 pub id: String,
44
45 pub type_: SecretType,
47
48 pub secret_material: SecretMaterial,
50}
51
52#[async_trait]
54pub trait KeyManager: Send + Sync + std::fmt::Debug + 'static {
55 fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>>;
57
58 fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey>;
60
61 fn generate_web_did(&self, domain: &str, options: DIDGenerationOptions)
63 -> Result<GeneratedKey>;
64
65 fn add_key(&self, key: &GeneratedKey) -> Result<()>;
67
68 fn remove_key(&self, did: &str) -> Result<()>;
70
71 fn has_key(&self, did: &str) -> Result<bool>;
73
74 fn list_keys(&self) -> Result<Vec<String>>;
76
77 async fn add_signing_key(&self, key: Arc<dyn SigningKey + Send + Sync>) -> Result<()>;
79
80 async fn add_encryption_key(&self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Result<()>;
82
83 async fn add_decryption_key(&self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Result<()>;
85
86 async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>>;
88
89 async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>>;
91
92 async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>>;
94
95 async fn resolve_verification_key(
97 &self,
98 kid: &str,
99 ) -> Result<Arc<dyn VerificationKey + Send + Sync>>;
100
101 async fn sign_jws(
103 &self,
104 kid: &str,
105 payload: &[u8],
106 protected_header: Option<crate::message::JwsProtected>,
107 ) -> Result<String>;
108
109 async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>>;
111
112 async fn encrypt_jwe(
114 &self,
115 sender_kid: &str,
116 recipient_kid: &str,
117 plaintext: &[u8],
118 protected_header: Option<crate::message::JweProtected>,
119 ) -> Result<String>;
120
121 async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>>;
123}
124
125#[derive(Debug, Clone)]
127pub struct DefaultKeyManager {
128 pub generator: DIDKeyGenerator,
130 pub secrets: Arc<RwLock<HashMap<String, Secret>>>,
132 signing_keys: Arc<RwLock<HashMap<String, Arc<dyn SigningKey + Send + Sync>>>>,
134 encryption_keys: Arc<RwLock<HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>>>,
136 decryption_keys: Arc<RwLock<HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>>>,
138 verification_keys: Arc<RwLock<HashMap<String, Arc<dyn VerificationKey + Send + Sync>>>>,
140}
141
142impl DefaultKeyManager {
143 pub fn new() -> Self {
145 Self {
146 generator: DIDKeyGenerator::new(),
147 secrets: Arc::new(RwLock::new(HashMap::new())),
148 signing_keys: Arc::new(RwLock::new(HashMap::new())),
149 encryption_keys: Arc::new(RwLock::new(HashMap::new())),
150 decryption_keys: Arc::new(RwLock::new(HashMap::new())),
151 verification_keys: Arc::new(RwLock::new(HashMap::new())),
152 }
153 }
154
155 pub fn agent_key_from_generated(&self, key: &GeneratedKey) -> Result<LocalAgentKey> {
157 let secret = self.generator.create_secret_from_key(key);
159
160 Ok(LocalAgentKey::new(secret, key.key_type))
162 }
163}
164
165impl Default for DefaultKeyManager {
166 fn default() -> Self {
167 Self::new()
168 }
169}
170
171#[async_trait]
172impl KeyManager for DefaultKeyManager {
173 fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>> {
175 Arc::clone(&self.secrets)
176 }
177
178 fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
180 let key = self.generator.generate_did(options)?;
182
183 let agent_key = self.agent_key_from_generated(&key)?;
185
186 if let Ok(mut secrets) = self.secrets.write() {
188 secrets.insert(key.did.clone(), agent_key.clone().secret);
189 } else {
190 return Err(Error::FailedToAcquireResolverWriteLock);
191 }
192
193 if let Ok(mut signing_keys) = self.signing_keys.write() {
195 signing_keys.insert(
196 AgentKey::key_id(&agent_key).to_string(),
197 Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
198 );
199 } else {
200 return Err(Error::FailedToAcquireResolverWriteLock);
201 }
202
203 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
204 encryption_keys.insert(
205 AgentKey::key_id(&agent_key).to_string(),
206 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
207 );
208 } else {
209 return Err(Error::FailedToAcquireResolverWriteLock);
210 }
211
212 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
213 decryption_keys.insert(
214 AgentKey::key_id(&agent_key).to_string(),
215 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
216 );
217 } else {
218 return Err(Error::FailedToAcquireResolverWriteLock);
219 }
220
221 if let Ok(mut verification_keys) = self.verification_keys.write() {
223 verification_keys.insert(
224 AgentKey::key_id(&agent_key).to_string(),
225 Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
226 );
227 } else {
228 return Err(Error::FailedToAcquireResolverWriteLock);
229 }
230
231 Ok(key)
232 }
233
234 fn generate_web_did(
236 &self,
237 domain: &str,
238 options: DIDGenerationOptions,
239 ) -> Result<GeneratedKey> {
240 let key = self.generator.generate_web_did(domain, options)?;
242
243 let agent_key = self.agent_key_from_generated(&key)?;
245
246 if let Ok(mut secrets) = self.secrets.write() {
248 secrets.insert(key.did.clone(), agent_key.clone().secret);
249 } else {
250 return Err(Error::FailedToAcquireResolverWriteLock);
251 }
252
253 if let Ok(mut signing_keys) = self.signing_keys.write() {
255 signing_keys.insert(
256 AgentKey::key_id(&agent_key).to_string(),
257 Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
258 );
259 } else {
260 return Err(Error::FailedToAcquireResolverWriteLock);
261 }
262
263 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
264 encryption_keys.insert(
265 AgentKey::key_id(&agent_key).to_string(),
266 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
267 );
268 } else {
269 return Err(Error::FailedToAcquireResolverWriteLock);
270 }
271
272 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
273 decryption_keys.insert(
274 AgentKey::key_id(&agent_key).to_string(),
275 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
276 );
277 } else {
278 return Err(Error::FailedToAcquireResolverWriteLock);
279 }
280
281 if let Ok(mut verification_keys) = self.verification_keys.write() {
283 verification_keys.insert(
284 AgentKey::key_id(&agent_key).to_string(),
285 Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
286 );
287 } else {
288 return Err(Error::FailedToAcquireResolverWriteLock);
289 }
290
291 Ok(key)
292 }
293
294 fn add_key(&self, key: &GeneratedKey) -> Result<()> {
296 let agent_key = self.agent_key_from_generated(key)?;
298
299 if let Ok(mut secrets) = self.secrets.write() {
301 secrets.insert(key.did.clone(), agent_key.clone().secret);
302 } else {
303 return Err(Error::FailedToAcquireResolverWriteLock);
304 }
305
306 if let Ok(mut signing_keys) = self.signing_keys.write() {
308 signing_keys.insert(
309 AgentKey::key_id(&agent_key).to_string(),
310 Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
311 );
312 } else {
313 return Err(Error::FailedToAcquireResolverWriteLock);
314 }
315
316 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
317 encryption_keys.insert(
318 AgentKey::key_id(&agent_key).to_string(),
319 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
320 );
321 } else {
322 return Err(Error::FailedToAcquireResolverWriteLock);
323 }
324
325 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
326 decryption_keys.insert(
327 AgentKey::key_id(&agent_key).to_string(),
328 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
329 );
330 } else {
331 return Err(Error::FailedToAcquireResolverWriteLock);
332 }
333
334 if let Ok(mut verification_keys) = self.verification_keys.write() {
336 verification_keys.insert(
337 AgentKey::key_id(&agent_key).to_string(),
338 Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
339 );
340 } else {
341 return Err(Error::FailedToAcquireResolverWriteLock);
342 }
343
344 Ok(())
345 }
346
347 fn remove_key(&self, did: &str) -> Result<()> {
349 if let Ok(mut secrets) = self.secrets.write() {
351 secrets.remove(did);
352 } else {
353 return Err(Error::FailedToAcquireResolverWriteLock);
354 }
355
356 if let Ok(mut signing_keys) = self.signing_keys.write() {
358 signing_keys.retain(|k, _| !k.starts_with(did));
359 } else {
360 return Err(Error::FailedToAcquireResolverWriteLock);
361 }
362
363 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
365 encryption_keys.retain(|k, _| !k.starts_with(did));
366 } else {
367 return Err(Error::FailedToAcquireResolverWriteLock);
368 }
369
370 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
372 decryption_keys.retain(|k, _| !k.starts_with(did));
373 } else {
374 return Err(Error::FailedToAcquireResolverWriteLock);
375 }
376
377 if let Ok(mut verification_keys) = self.verification_keys.write() {
379 verification_keys.retain(|k, _| !k.starts_with(did));
380 } else {
381 return Err(Error::FailedToAcquireResolverWriteLock);
382 }
383
384 Ok(())
385 }
386
387 fn has_key(&self, did: &str) -> Result<bool> {
389 if let Ok(secrets) = self.secrets.read() {
391 if secrets.contains_key(did) {
392 return Ok(true);
393 }
394 } else {
395 return Err(Error::FailedToAcquireResolverReadLock);
396 }
397
398 if let Ok(signing_keys) = self.signing_keys.read() {
400 if signing_keys.values().any(|k| k.did() == did) {
401 return Ok(true);
402 }
403 } else {
404 return Err(Error::FailedToAcquireResolverReadLock);
405 }
406
407 Ok(false)
408 }
409
410 fn list_keys(&self) -> Result<Vec<String>> {
412 let mut dids = Vec::new();
414
415 if let Ok(secrets) = self.secrets.read() {
417 dids.extend(secrets.keys().cloned());
418 } else {
419 return Err(Error::FailedToAcquireResolverReadLock);
420 }
421
422 if let Ok(signing_keys) = self.signing_keys.read() {
424 for key in signing_keys.values() {
425 if !dids.contains(&key.did().to_string()) {
426 dids.push(key.did().to_string());
427 }
428 }
429 } else {
430 return Err(Error::FailedToAcquireResolverReadLock);
431 }
432
433 Ok(dids)
434 }
435
436 async fn add_signing_key(&self, key: Arc<dyn SigningKey + Send + Sync>) -> Result<()> {
438 if let Ok(mut signing_keys) = self.signing_keys.write() {
439 signing_keys.insert(key.key_id().to_string(), key);
440 Ok(())
441 } else {
442 Err(Error::FailedToAcquireResolverWriteLock)
443 }
444 }
445
446 async fn add_encryption_key(&self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Result<()> {
448 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
449 encryption_keys.insert(key.key_id().to_string(), key);
450 Ok(())
451 } else {
452 Err(Error::FailedToAcquireResolverWriteLock)
453 }
454 }
455
456 async fn add_decryption_key(&self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Result<()> {
458 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
459 decryption_keys.insert(key.key_id().to_string(), key);
460 Ok(())
461 } else {
462 Err(Error::FailedToAcquireResolverWriteLock)
463 }
464 }
465
466 async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
468 if let Ok(signing_keys) = self.signing_keys.read() {
470 if let Some(key) = signing_keys.get(kid) {
471 return Ok(key.clone());
472 }
473 } else {
474 return Err(Error::FailedToAcquireResolverReadLock);
475 }
476
477 if let Ok(secrets) = self.secrets.read() {
479 let did = kid.split('#').next().unwrap_or(kid);
481 if let Some(secret) = secrets.get(did) {
482 let key_type = crate::did::KeyType::Ed25519; let agent_key = LocalAgentKey::new(secret.clone(), key_type);
485
486 if let Ok(mut signing_keys) = self.signing_keys.write() {
488 let arc_key = Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>;
489 let agent_kid = AgentKey::key_id(&agent_key).to_string();
491 signing_keys.insert(agent_kid.clone(), arc_key.clone());
492 if agent_kid != kid {
494 signing_keys.insert(kid.to_string(), arc_key.clone());
495 }
496 return Ok(arc_key);
497 }
498 }
499 }
500
501 Err(Error::Cryptography(format!(
502 "No signing key found with ID: {}",
503 kid
504 )))
505 }
506
507 async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
509 if let Ok(encryption_keys) = self.encryption_keys.read() {
511 if let Some(key) = encryption_keys.get(kid) {
512 return Ok(key.clone());
513 }
514 } else {
515 return Err(Error::FailedToAcquireResolverReadLock);
516 }
517
518 if let Ok(secrets) = self.secrets.read() {
520 let did = kid.split('#').next().unwrap_or(kid);
522 if let Some(secret) = secrets.get(did) {
523 let key_type = crate::did::KeyType::Ed25519; let agent_key = LocalAgentKey::new(secret.clone(), key_type);
526
527 if let Ok(mut encryption_keys) = self.encryption_keys.write() {
529 let arc_key =
530 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>;
531 let agent_kid = AgentKey::key_id(&agent_key).to_string();
533 encryption_keys.insert(agent_kid.clone(), arc_key.clone());
534 if agent_kid != kid {
536 encryption_keys.insert(kid.to_string(), arc_key.clone());
537 }
538 return Ok(arc_key);
539 }
540 }
541 }
542
543 Err(Error::Cryptography(format!(
544 "No encryption key found with ID: {}",
545 kid
546 )))
547 }
548
549 async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
551 if let Ok(decryption_keys) = self.decryption_keys.read() {
553 if let Some(key) = decryption_keys.get(kid) {
554 return Ok(key.clone());
555 }
556 } else {
557 return Err(Error::FailedToAcquireResolverReadLock);
558 }
559
560 if let Ok(secrets) = self.secrets.read() {
562 let did = kid.split('#').next().unwrap_or(kid);
564 if let Some(secret) = secrets.get(did) {
565 let key_type = crate::did::KeyType::Ed25519; let agent_key = LocalAgentKey::new(secret.clone(), key_type);
568
569 if let Ok(mut decryption_keys) = self.decryption_keys.write() {
571 let arc_key =
572 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>;
573 let agent_kid = AgentKey::key_id(&agent_key).to_string();
575 decryption_keys.insert(agent_kid.clone(), arc_key.clone());
576 if agent_kid != kid {
578 decryption_keys.insert(kid.to_string(), arc_key.clone());
579 }
580 return Ok(arc_key);
581 }
582 }
583 }
584
585 Err(Error::Cryptography(format!(
586 "No decryption key found with ID: {}",
587 kid
588 )))
589 }
590
591 async fn resolve_verification_key(
593 &self,
594 kid: &str,
595 ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
596 if let Ok(verification_keys) = self.verification_keys.read() {
598 if let Some(key) = verification_keys.get(kid) {
599 return Ok(key.clone());
600 }
601 } else {
602 return Err(Error::FailedToAcquireResolverReadLock);
603 }
604
605 let signing_key = KeyManager::get_signing_key(self, kid).await;
610 if let Ok(key) = signing_key {
611 let public_jwk = key.public_key_jwk()?;
613 let verification_key = Arc::new(PublicVerificationKey::new(kid.to_string(), public_jwk))
614 as Arc<dyn VerificationKey + Send + Sync>;
615
616 if let Ok(mut verification_keys) = self.verification_keys.write() {
618 verification_keys.insert(kid.to_string(), verification_key.clone());
619 }
620
621 return Ok(verification_key);
622 }
623
624 Err(Error::Cryptography(format!(
626 "No verification key found with ID: {}",
627 kid
628 )))
629 }
630
631 async fn sign_jws(
633 &self,
634 kid: &str,
635 payload: &[u8],
636 protected_header: Option<crate::message::JwsProtected>,
637 ) -> Result<String> {
638 let signing_key = KeyManager::get_signing_key(self, kid).await?;
640
641 let jws = signing_key
643 .create_jws(payload, protected_header)
644 .await
645 .map_err(|e| Error::Cryptography(e.to_string()))?;
646
647 serde_json::to_string(&jws).map_err(|e| Error::Serialization(e.to_string()))
649 }
650
651 async fn verify_jws(&self, jws: &str, _expected_kid: Option<&str>) -> Result<Vec<u8>> {
653 let jws: crate::message::Jws = serde_json::from_str(jws)
655 .map_err(|e| Error::Serialization(format!("Failed to parse JWS: {}", e)))?;
656
657 let payload_bytes = base64::engine::general_purpose::STANDARD
662 .decode(&jws.payload)
663 .map_err(|e| Error::Cryptography(format!("Failed to decode payload: {}", e)))?;
664
665 Ok(payload_bytes)
666 }
667
668 async fn encrypt_jwe(
670 &self,
671 sender_kid: &str,
672 recipient_kid: &str,
673 plaintext: &[u8],
674 protected_header: Option<crate::message::JweProtected>,
675 ) -> Result<String> {
676 let ciphertext = base64::engine::general_purpose::STANDARD.encode(plaintext);
679
680 let ephemeral_key = crate::message::EphemeralPublicKey::Ec {
682 crv: "P-256".to_string(),
683 x: "test".to_string(),
684 y: "test".to_string(),
685 };
686
687 let protected = protected_header.unwrap_or_else(|| crate::message::JweProtected {
689 epk: ephemeral_key,
690 apv: "test".to_string(),
691 typ: crate::message::DIDCOMM_ENCRYPTED.to_string(),
692 enc: "A256GCM".to_string(),
693 alg: "ECDH-ES+A256KW".to_string(),
694 });
695
696 let protected_json = serde_json::to_string(&protected).map_err(|e| {
698 Error::Serialization(format!("Failed to serialize protected header: {}", e))
699 })?;
700 let protected_b64 = base64::engine::general_purpose::STANDARD.encode(protected_json);
701
702 let jwe = crate::message::Jwe {
704 ciphertext,
705 protected: protected_b64,
706 recipients: vec![crate::message::JweRecipient {
707 encrypted_key: "test".to_string(),
708 header: crate::message::JweHeader {
709 kid: recipient_kid.to_string(),
710 sender_kid: Some(sender_kid.to_string()),
711 },
712 }],
713 tag: "test".to_string(),
714 iv: "test".to_string(),
715 };
716
717 serde_json::to_string(&jwe).map_err(|e| Error::Serialization(e.to_string()))
719 }
720
721 async fn decrypt_jwe(&self, jwe: &str, _expected_kid: Option<&str>) -> Result<Vec<u8>> {
723 let jwe: crate::message::Jwe = serde_json::from_str(jwe)
725 .map_err(|e| Error::Serialization(format!("Failed to parse JWE: {}", e)))?;
726
727 let plaintext = base64::engine::general_purpose::STANDARD
730 .decode(&jwe.ciphertext)
731 .map_err(|e| Error::Cryptography(format!("Failed to decode ciphertext: {}", e)))?;
732
733 Ok(plaintext)
734 }
735}
736
737#[async_trait]
738impl KeyManagerPacking for DefaultKeyManager {
739 async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
740 KeyManager::get_signing_key(self, kid)
741 .await
742 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
743 }
744
745 async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
746 KeyManager::get_encryption_key(self, kid)
747 .await
748 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
749 }
750
751 async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
752 KeyManager::get_decryption_key(self, kid)
753 .await
754 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
755 }
756
757 async fn resolve_verification_key(
758 &self,
759 kid: &str,
760 ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
761 KeyManager::resolve_verification_key(self, kid)
762 .await
763 .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
764 }
765}
766
767#[derive(Debug, Clone)]
769pub struct KeyManagerBuilder {
770 generator: DIDKeyGenerator,
772 secrets: HashMap<String, Secret>,
774 signing_keys: HashMap<String, Arc<dyn SigningKey + Send + Sync>>,
776 encryption_keys: HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>,
778 decryption_keys: HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>,
780 verification_keys: HashMap<String, Arc<dyn VerificationKey + Send + Sync>>,
782 load_from_storage: bool,
784 storage_path: Option<std::path::PathBuf>,
786}
787
788impl Default for KeyManagerBuilder {
789 fn default() -> Self {
790 Self::new()
791 }
792}
793
794impl KeyManagerBuilder {
795 pub fn new() -> Self {
797 Self {
798 generator: DIDKeyGenerator::new(),
799 secrets: HashMap::new(),
800 signing_keys: HashMap::new(),
801 encryption_keys: HashMap::new(),
802 decryption_keys: HashMap::new(),
803 verification_keys: HashMap::new(),
804 load_from_storage: false,
805 storage_path: None,
806 }
807 }
808
809 pub fn load_from_default_storage(mut self) -> Self {
811 self.load_from_storage = true;
812 self.storage_path = None;
813 self
814 }
815
816 pub fn load_from_path(mut self, path: std::path::PathBuf) -> Self {
818 self.load_from_storage = true;
819 self.storage_path = Some(path);
820 self
821 }
822
823 pub fn add_secret(mut self, did: String, secret: Secret) -> Self {
825 self.secrets.insert(did, secret);
826 self
827 }
828
829 pub fn add_signing_key(mut self, key: Arc<dyn SigningKey + Send + Sync>) -> Self {
831 self.signing_keys.insert(key.key_id().to_string(), key);
832 self
833 }
834
835 pub fn add_encryption_key(mut self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Self {
837 self.encryption_keys.insert(key.key_id().to_string(), key);
838 self
839 }
840
841 pub fn add_decryption_key(mut self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Self {
843 self.decryption_keys.insert(key.key_id().to_string(), key);
844 self
845 }
846
847 pub fn add_verification_key(mut self, key: Arc<dyn VerificationKey + Send + Sync>) -> Self {
849 self.verification_keys.insert(key.key_id().to_string(), key);
850 self
851 }
852
853 pub fn with_auto_generated_ed25519_key(self, kid: &str) -> Result<Self> {
855 let local_key = LocalAgentKey::generate_ed25519(kid)?;
857
858 let arc_key = Arc::new(local_key.clone());
860 let builder = self
861 .add_signing_key(arc_key.clone() as Arc<dyn SigningKey + Send + Sync>)
862 .add_encryption_key(arc_key.clone() as Arc<dyn EncryptionKey + Send + Sync>)
863 .add_decryption_key(arc_key.clone() as Arc<dyn DecryptionKey + Send + Sync>)
864 .add_verification_key(arc_key as Arc<dyn VerificationKey + Send + Sync>);
865
866 let builder = builder.add_secret(local_key.did().to_string(), local_key.secret.clone());
868
869 Ok(builder)
870 }
871
872 pub fn build(self) -> Result<DefaultKeyManager> {
874 let key_manager = DefaultKeyManager {
875 generator: self.generator,
876 secrets: Arc::new(RwLock::new(self.secrets)),
877 signing_keys: Arc::new(RwLock::new(self.signing_keys)),
878 encryption_keys: Arc::new(RwLock::new(self.encryption_keys)),
879 decryption_keys: Arc::new(RwLock::new(self.decryption_keys)),
880 verification_keys: Arc::new(RwLock::new(self.verification_keys)),
881 };
882
883 if self.load_from_storage {
885 use crate::storage::KeyStorage;
886
887 let storage = if let Some(path) = self.storage_path {
888 KeyStorage::load_from_path(&path)?
889 } else {
890 KeyStorage::load_default()?
891 };
892
893 for (did, stored_key) in storage.keys {
895 let secret = KeyStorage::to_secret(&stored_key);
897
898 if let Ok(mut secrets) = key_manager.secrets.write() {
900 secrets.insert(did.clone(), secret.clone());
901 } else {
902 return Err(Error::FailedToAcquireResolverWriteLock);
903 }
904
905 let key_type = stored_key.key_type;
907 let agent_key = LocalAgentKey::new(secret, key_type);
908
909 if let Ok(mut signing_keys) = key_manager.signing_keys.write() {
911 signing_keys.insert(
912 AgentKey::key_id(&agent_key).to_string(),
913 Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
914 );
915 } else {
916 return Err(Error::FailedToAcquireResolverWriteLock);
917 }
918
919 if let Ok(mut encryption_keys) = key_manager.encryption_keys.write() {
921 encryption_keys.insert(
922 AgentKey::key_id(&agent_key).to_string(),
923 Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
924 );
925 } else {
926 return Err(Error::FailedToAcquireResolverWriteLock);
927 }
928
929 if let Ok(mut decryption_keys) = key_manager.decryption_keys.write() {
931 decryption_keys.insert(
932 AgentKey::key_id(&agent_key).to_string(),
933 Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
934 );
935 } else {
936 return Err(Error::FailedToAcquireResolverWriteLock);
937 }
938
939 if let Ok(mut verification_keys) = key_manager.verification_keys.write() {
941 verification_keys.insert(
942 AgentKey::key_id(&agent_key).to_string(),
943 Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
944 );
945 } else {
946 return Err(Error::FailedToAcquireResolverWriteLock);
947 }
948 }
949 }
950
951 Ok(key_manager)
952 }
953}
954
955#[derive(Debug, Clone)]
957pub struct SecretAccessor {
958 secrets: Arc<RwLock<HashMap<String, Secret>>>,
960}
961
962impl SecretAccessor {
963 pub fn new(key_manager: Arc<dyn KeyManager>) -> Self {
965 Self {
966 secrets: key_manager.secrets(),
967 }
968 }
969
970 pub fn new_from_secrets(secrets: Arc<RwLock<HashMap<String, Secret>>>) -> Self {
972 Self { secrets }
973 }
974
975 pub fn get_secret_by_id(&self, secret_id: &str) -> Option<Secret> {
977 if let Ok(secrets) = self.secrets.read() {
978 if let Some(secret) = secrets.get(secret_id) {
979 return Some(secret.clone());
980 }
981 }
982 None
983 }
984}
985
986#[cfg(test)]
987mod tests {
988 use super::*;
989
990 #[test]
991 fn test_key_manager() {
992 let manager = DefaultKeyManager::new();
993
994 let options = crate::did::DIDGenerationOptions {
996 key_type: crate::did::KeyType::Ed25519,
997 };
998
999 let key = manager.generate_key(options).unwrap();
1000
1001 assert!(manager.has_key(&key.did).unwrap());
1003
1004 let keys = manager.list_keys().unwrap();
1006 assert_eq!(keys.len(), 1);
1007 assert_eq!(keys[0], key.did);
1008
1009 manager.remove_key(&key.did).unwrap();
1011 assert!(!manager.has_key(&key.did).unwrap());
1012
1013 manager.add_key(&key).unwrap();
1015 assert!(manager.has_key(&key.did).unwrap());
1016 }
1017
1018 #[tokio::test]
1019 async fn test_agent_key_operations() {
1020 let manager = DefaultKeyManager::new();
1021
1022 let ed25519_key = manager
1024 .generate_key(DIDGenerationOptions {
1025 key_type: crate::did::KeyType::Ed25519,
1026 })
1027 .unwrap();
1028
1029 let test_data = b"Hello, world!";
1031
1032 let ed25519_kid = format!("{}#keys-1", ed25519_key.did);
1034 let signing_key = KeyManager::get_signing_key(&manager, &ed25519_kid)
1035 .await
1036 .unwrap();
1037
1038 assert!(signing_key.key_id().contains(ed25519_key.did.as_str()));
1040
1041 assert!(signing_key.did().contains(&ed25519_key.did));
1043
1044 let jws = signing_key.create_jws(test_data, None).await.unwrap();
1046 assert!(jws.signatures.len() == 1);
1047 assert!(jws.signatures[0]
1048 .get_kid()
1049 .unwrap()
1050 .contains(ed25519_key.did.as_str()));
1051
1052 let protected_header = jws.signatures[0].get_protected_header().unwrap();
1054 assert!(
1055 !protected_header.kid.is_empty(),
1056 "kid should be in protected header"
1057 );
1058 assert_eq!(&protected_header.kid, &jws.signatures[0].get_kid().unwrap());
1059
1060 }
1062
1063 #[test]
1064 fn test_web_did_generation() {
1065 let manager = DefaultKeyManager::new();
1066
1067 let domain = "example.com";
1069 let options = DIDGenerationOptions {
1070 key_type: crate::did::KeyType::Ed25519,
1071 };
1072
1073 let key = manager.generate_web_did(domain, options).unwrap();
1074
1075 assert!(manager.has_key(&key.did).unwrap());
1077
1078 assert_eq!(key.did, format!("did:web:{}", domain));
1080 }
1081
1082 #[tokio::test]
1083 async fn test_jws_operations() {
1084 let manager = DefaultKeyManager::new();
1085
1086 let options = crate::did::DIDGenerationOptions {
1088 key_type: crate::did::KeyType::Ed25519,
1089 };
1090
1091 let key = manager.generate_key(options).unwrap();
1092 let kid = format!("{}#keys-1", key.did);
1093
1094 let test_data = b"Hello, world!";
1096
1097 let jws = manager.sign_jws(&kid, test_data, None).await.unwrap();
1099
1100 let payload = manager.verify_jws(&jws, Some(&kid)).await.unwrap();
1102 assert_eq!(payload, test_data);
1103 }
1104
1105 #[tokio::test]
1106 async fn test_jwe_operations() {
1107 let manager = DefaultKeyManager::new();
1108
1109 let options = crate::did::DIDGenerationOptions {
1111 key_type: crate::did::KeyType::P256,
1112 };
1113
1114 let sender_key = manager.generate_key(options.clone()).unwrap();
1115 let sender_kid = format!("{}#keys-1", sender_key.did);
1116
1117 let recipient_key = manager.generate_key(options).unwrap();
1118 let recipient_kid = format!("{}#keys-1", recipient_key.did);
1119
1120 let test_data = b"Hello, world!";
1122
1123 let jwe = manager
1125 .encrypt_jwe(&sender_kid, &recipient_kid, test_data, None)
1126 .await
1127 .unwrap();
1128
1129 let plaintext = manager
1131 .decrypt_jwe(&jwe, Some(&recipient_kid))
1132 .await
1133 .unwrap();
1134 assert_eq!(plaintext, test_data);
1135 }
1136}