tap_agent/
agent_key_manager.rs

1//! Agent Key Manager for the TAP Agent
2//!
3//! This module provides an implementation of a key manager that uses the agent key abstraction.
4//! It manages keys for signing, verification, encryption, and decryption operations, with support
5//! for different key types (Ed25519, P-256, secp256k1).
6
7use 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/// Agent Key Manager implements the KeyManager trait using the agent key abstraction
23#[derive(Debug, Clone)]
24pub struct AgentKeyManager {
25    /// The DID key generator
26    generator: DIDKeyGenerator,
27    /// The secret storage (legacy)
28    secrets: Arc<RwLock<HashMap<String, Secret>>>,
29    /// Signing keys
30    signing_keys: Arc<RwLock<HashMap<String, Arc<dyn SigningKey + Send + Sync>>>>,
31    /// Encryption keys
32    encryption_keys: Arc<RwLock<HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>>>,
33    /// Decryption keys
34    decryption_keys: Arc<RwLock<HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>>>,
35    /// Verification keys
36    verification_keys: Arc<RwLock<HashMap<String, Arc<dyn VerificationKey + Send + Sync>>>>,
37    /// Generated keys with DID documents (for key ID resolution)
38    generated_keys: Arc<RwLock<HashMap<String, GeneratedKey>>>,
39    /// Storage path
40    storage_path: Option<PathBuf>,
41}
42
43impl AgentKeyManager {
44    /// Create a new key manager
45    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    /// Get a generated key (with DID document) by DID
59    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    /// Get the key type for a signing key (for debugging)
75    pub async fn get_signing_key_type(&self, did: &str) -> Result<String> {
76        // Try to find a signing key for this DID
77        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    /// Create a LocalAgentKey from a GeneratedKey
96    pub fn agent_key_from_generated(&self, key: &GeneratedKey) -> Result<LocalAgentKey> {
97        // Create a secret for the key
98        let secret = self.generator.create_secret_from_key(key);
99
100        // Create a LocalAgentKey
101        Ok(LocalAgentKey::new(secret, key.key_type))
102    }
103
104    /// Store an agent key in all collections
105    fn store_agent_key(&self, agent_key: &LocalAgentKey, key_id: &str) -> Result<()> {
106        // Store the agent key as signing, encryption, and decryption keys
107        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        // Also store a reference in verification keys
135        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    /// Save keys to storage if a storage path is configured
148    pub fn save_to_storage(&self) -> Result<()> {
149        // Skip if no storage path is configured
150        if self.storage_path.is_none() {
151            return Ok(());
152        }
153
154        // Create a KeyStorage object from our secrets
155        let mut key_storage = KeyStorage::new();
156
157        // Add all secrets
158        if let Ok(secrets) = self.secrets.read() {
159            for (did, secret) in secrets.iter() {
160                // Extract key type from the key
161                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, // Default
173                        }
174                    }
175                };
176
177                // Get private and public keys from the JWK
178                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                // Create a StoredKey and add to key storage
195                let stored_key = StoredKey {
196                    did: did.clone(),
197                    label: String::new(), // Will be auto-generated when added
198                    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        // Save to storage
208        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    /// Load from default storage location
218    pub fn load_from_default_storage(mut self) -> Result<Self> {
219        self.storage_path = None;
220        self.load_keys_from_storage()
221    }
222
223    /// Load from a specific storage path
224    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    /// Load keys from configured storage
230    fn load_keys_from_storage(&self) -> Result<Self> {
231        // Load storage
232        let storage = if let Some(path) = &self.storage_path {
233            KeyStorage::load_from_path(path)?
234        } else {
235            KeyStorage::load_default()?
236        };
237
238        // Process each stored key
239        for (did, stored_key) in storage.keys {
240            // Convert to a legacy secret
241            let secret = KeyStorage::to_secret(&stored_key);
242
243            // Add to secrets
244            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            // Create an agent key
251            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            // Store in all collections
256            self.store_agent_key(&agent_key, &key_id)?;
257        }
258
259        Ok(self.clone())
260    }
261
262    /// Add a key to the key manager with option to save to storage
263    fn add_key_internal(&self, key: &GeneratedKey, save_to_storage: bool) -> Result<()> {
264        // Create a LocalAgentKey
265        let agent_key = self.agent_key_from_generated(key)?;
266        let key_id = AgentKey::key_id(&agent_key).to_string();
267
268        // Store the legacy secret
269        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        // Store in all collections
276        self.store_agent_key(&agent_key, &key_id)?;
277
278        // Save to storage if configured and requested
279        if save_to_storage {
280            self.save_to_storage()?;
281        }
282
283        Ok(())
284    }
285
286    /// Add a key to the key manager without saving to storage
287    /// This is useful when you plan to save to storage manually later
288    pub fn add_key_without_save(&self, key: &GeneratedKey) -> Result<()> {
289        self.add_key_internal(key, false)
290    }
291
292    /// Generate a new key with the specified options without saving to storage
293    /// This is useful when you plan to save to storage manually later
294    pub fn generate_key_without_save(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
295        self.generate_key_internal(options, false)
296    }
297
298    /// Internal method to generate a key with optional storage save
299    fn generate_key_internal(
300        &self,
301        options: DIDGenerationOptions,
302        save_to_storage: bool,
303    ) -> Result<GeneratedKey> {
304        // Generate the key
305        let key = self.generator.generate_did(options)?;
306
307        // Create a LocalAgentKey
308        let agent_key = self.agent_key_from_generated(&key)?;
309        let key_id = AgentKey::key_id(&agent_key).to_string();
310
311        // Store the legacy secret
312        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        // Store the generated key for DID document access
319        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        // Store in all collections
326        self.store_agent_key(&agent_key, &key_id)?;
327
328        // Save to storage if configured and requested
329        if save_to_storage {
330            self.save_to_storage()?;
331        }
332
333        Ok(key)
334    }
335
336    /// Generate a new web DID with the specified domain and options without saving to storage
337    /// This is useful when you plan to save to storage manually later
338    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    /// Internal method to generate a web DID with optional storage save
347    fn generate_web_did_internal(
348        &self,
349        domain: &str,
350        options: DIDGenerationOptions,
351        save_to_storage: bool,
352    ) -> Result<GeneratedKey> {
353        // Generate the key
354        let key = self.generator.generate_web_did(domain, options)?;
355
356        // Create a LocalAgentKey
357        let agent_key = self.agent_key_from_generated(&key)?;
358        let key_id = AgentKey::key_id(&agent_key).to_string();
359
360        // Store the legacy secret
361        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        // Store the generated key for DID document access
368        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        // Store in all collections
375        self.store_agent_key(&agent_key, &key_id)?;
376
377        // Save to storage if configured and requested
378        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    /// Get access to the secrets storage
395    fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>> {
396        Arc::clone(&self.secrets)
397    }
398
399    /// Generate a new key with the specified options
400    fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
401        self.generate_key_internal(options, true)
402    }
403
404    /// Generate a new web DID with the specified domain and options
405    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    /// Add an existing key to the key manager
414    fn add_key(&self, key: &GeneratedKey) -> Result<()> {
415        self.add_key_internal(key, true)
416    }
417
418    /// Remove a key from the key manager
419    fn remove_key(&self, did: &str) -> Result<()> {
420        // Remove from legacy secrets
421        if let Ok(mut secrets) = self.secrets.write() {
422            secrets.remove(did);
423        } else {
424            return Err(Error::FailedToAcquireResolverWriteLock);
425        }
426
427        // Remove from signing keys
428        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        // Remove from encryption keys
435        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        // Remove from decryption keys
442        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        // Remove from verification keys
449        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        // Save to storage if configured
456        self.save_to_storage()?;
457
458        Ok(())
459    }
460
461    /// Check if the key manager has a key for the given DID
462    fn has_key(&self, did: &str) -> Result<bool> {
463        // Check legacy secrets first
464        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        // Check if any signing key has this DID
473        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    /// Get a list of all DIDs in the key manager
485    fn list_keys(&self) -> Result<Vec<String>> {
486        // Collect DIDs from both legacy secrets and new keys
487        let mut dids = Vec::new();
488
489        // Add DIDs from legacy secrets
490        if let Ok(secrets) = self.secrets.read() {
491            dids.extend(secrets.keys().cloned());
492        } else {
493            return Err(Error::FailedToAcquireResolverReadLock);
494        }
495
496        // Add DIDs from signing keys
497        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    /// Add a signing key to the key manager
511    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    /// Add an encryption key to the key manager
521    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    /// Add a decryption key to the key manager
531    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    /// Get a signing key by ID
541    async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
542        // Check if we have a signing key with this ID
543        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 not, check legacy secrets
552        if let Ok(secrets) = self.secrets.read() {
553            // Try to find a secret with this DID or kid
554            let did = kid.split('#').next().unwrap_or(kid);
555            if let Some(secret) = secrets.get(did) {
556                // Detect key type from the JWK
557                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, // Default
566                        }
567                    }
568                };
569                // Create a LocalAgentKey
570                let agent_key = LocalAgentKey::new(secret.clone(), key_type);
571
572                // Add to signing keys for next time
573                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    /// Get an encryption key by ID
588    async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
589        // Check if we have an encryption key with this ID
590        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 not, check legacy secrets
599        if let Ok(secrets) = self.secrets.read() {
600            // Try to find a secret with this DID or kid
601            let did = kid.split('#').next().unwrap_or(kid);
602            if let Some(secret) = secrets.get(did) {
603                // Detect key type from the JWK
604                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, // Default
613                        }
614                    }
615                };
616                // Create a LocalAgentKey
617                let agent_key = LocalAgentKey::new(secret.clone(), key_type);
618
619                // Add to encryption keys for next time
620                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    /// Get a decryption key by ID
637    async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
638        // Check if we have a decryption key with this ID
639        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 not, check legacy secrets
648        if let Ok(secrets) = self.secrets.read() {
649            // Try to find a secret with this DID or kid
650            let did = kid.split('#').next().unwrap_or(kid);
651            if let Some(secret) = secrets.get(did) {
652                // Detect key type from the JWK
653                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, // Default
662                        }
663                    }
664                };
665                // Create a LocalAgentKey
666                let agent_key = LocalAgentKey::new(secret.clone(), key_type);
667
668                // Add to decryption keys for next time
669                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    /// Resolve a verification key by ID
686    async fn resolve_verification_key(
687        &self,
688        kid: &str,
689    ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
690        // Check if we have a verification key with this ID
691        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        // If not found locally, try to derive from a signing key
700        let signing_key = KeyManager::get_signing_key(self, kid).await;
701        if let Ok(key) = signing_key {
702            // Create a verification key from the signing key
703            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            // Add to verification keys for next time
708            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        // In a full implementation, we would use a DID Resolver here
716        Err(Error::Cryptography(format!(
717            "No verification key found with ID: {}",
718            kid
719        )))
720    }
721
722    /// Sign data with a key
723    async fn sign_jws(
724        &self,
725        kid: &str,
726        payload: &[u8],
727        protected_header: Option<JwsProtected>,
728    ) -> Result<String> {
729        // Get the signing key
730        let signing_key = KeyManager::get_signing_key(self, kid).await?;
731
732        // Sign the payload
733        let jws = signing_key
734            .create_jws(payload, protected_header)
735            .await
736            .map_err(|e| Error::Cryptography(e.to_string()))?;
737
738        // Serialize the JWS
739        serde_json::to_string(&jws).map_err(|e| Error::Serialization(e.to_string()))
740    }
741
742    /// Verify a JWS
743    async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
744        // Parse the JWS
745        let jws: crate::message::Jws = serde_json::from_str(jws)
746            .map_err(|e| Error::Serialization(format!("Failed to parse JWS: {}", e)))?;
747
748        // Find the signature to verify
749        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            // Use the first signature
758            jws.signatures
759                .first()
760                .ok_or_else(|| Error::Cryptography("No signatures in JWS".to_string()))?
761        };
762
763        // Get the protected header
764        let protected = signature.get_protected_header().map_err(|e| {
765            Error::Cryptography(format!("Failed to decode protected header: {}", e))
766        })?;
767
768        // Get the verification key using kid from protected header
769        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        // Decode the signature
775        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        // Create the signing input (protected.payload)
780        let signing_input = format!("{}.{}", signature.protected, jws.payload);
781
782        // Verify the signature
783        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        // Decode the payload
795        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    /// Encrypt data for a recipient
803    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        // Get the encryption key
811        let encryption_key = KeyManager::get_encryption_key(self, sender_kid).await?;
812
813        // Resolve the recipient's verification key
814        let recipient_key = KeyManager::resolve_verification_key(self, recipient_kid).await?;
815
816        // Encrypt the plaintext
817        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        // Serialize the JWE
823        serde_json::to_string(&jwe).map_err(|e| Error::Serialization(e.to_string()))
824    }
825
826    /// Decrypt a JWE
827    async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
828        // Parse the JWE
829        let jwe: crate::message::Jwe = serde_json::from_str(jwe)
830            .map_err(|e| Error::Serialization(format!("Failed to parse JWE: {}", e)))?;
831
832        // Find the recipient if expected_kid is provided
833        if let Some(kid) = expected_kid {
834            // Just verify recipient exists, we don't need the actual instance
835            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            // Get the decryption key
843            let decryption_key = KeyManager::get_decryption_key(self, kid).await?;
844
845            // Decrypt the JWE
846            decryption_key
847                .unwrap_jwe(&jwe)
848                .await
849                .map_err(|e| Error::Cryptography(e.to_string()))
850        } else {
851            // Try each recipient
852            for recipient in &jwe.recipients {
853                // Try to get the decryption key
854                if let Ok(decryption_key) =
855                    KeyManager::get_decryption_key(self, &recipient.header.kid).await
856                {
857                    // Try to decrypt
858                    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/// A builder for AgentKeyManager
872#[derive(Debug, Clone)]
873pub struct AgentKeyManagerBuilder {
874    /// Legacy secrets
875    secrets: HashMap<String, Secret>,
876    /// Signing keys
877    signing_keys: HashMap<String, Arc<dyn SigningKey + Send + Sync>>,
878    /// Encryption keys
879    encryption_keys: HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>,
880    /// Decryption keys
881    decryption_keys: HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>,
882    /// Verification keys
883    verification_keys: HashMap<String, Arc<dyn VerificationKey + Send + Sync>>,
884    /// Load from storage
885    load_from_storage: bool,
886    /// Storage path
887    storage_path: Option<PathBuf>,
888}
889
890impl Default for AgentKeyManagerBuilder {
891    fn default() -> Self {
892        Self::new()
893    }
894}
895
896impl AgentKeyManagerBuilder {
897    /// Create a new KeyManagerBuilder
898    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    /// Load keys from default storage location
911    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    /// Load keys from a specific storage path
918    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    /// Add a legacy secret
925    pub fn add_secret(mut self, did: String, secret: Secret) -> Self {
926        self.secrets.insert(did, secret);
927        self
928    }
929
930    /// Add a signing key
931    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    /// Add an encryption key
937    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    /// Add a decryption key
943    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    /// Add a verification key
949    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    /// Build the KeyManager
955    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        // Load keys from storage if requested
968        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}