Skip to main content

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    /// Get the raw private key bytes and key type for a DID
148    ///
149    /// Checks generated_keys first (raw bytes), falls back to extracting
150    /// from the secrets JWK "d" parameter.
151    pub fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, KeyType)> {
152        // Check generated_keys first (has raw bytes)
153        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        // Fall back to secrets (JWK format)
162        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    /// Save keys to storage if a storage path is configured
177    pub fn save_to_storage(&self) -> Result<()> {
178        // Skip if no storage path is configured
179        if self.storage_path.is_none() {
180            return Ok(());
181        }
182
183        // Create a KeyStorage object from our secrets
184        let mut key_storage = KeyStorage::new();
185
186        // Add all secrets
187        if let Ok(secrets) = self.secrets.read() {
188            for (did, secret) in secrets.iter() {
189                // Extract key type from the key
190                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, // Default
205                        }
206                    }
207                };
208
209                // Get private and public keys from the JWK
210                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                // Create a StoredKey and add to key storage
227                let stored_key = StoredKey {
228                    did: did.clone(),
229                    label: String::new(), // Will be auto-generated when added
230                    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        // Save to storage
240        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    /// Load from default storage location
250    pub fn load_from_default_storage(mut self) -> Result<Self> {
251        self.storage_path = None;
252        self.load_keys_from_storage()
253    }
254
255    /// Load from a specific storage path
256    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    /// Load keys from configured storage
262    fn load_keys_from_storage(&self) -> Result<Self> {
263        // Load storage
264        let storage = if let Some(path) = &self.storage_path {
265            KeyStorage::load_from_path(path)?
266        } else {
267            KeyStorage::load_default()?
268        };
269
270        // Process each stored key
271        for (did, stored_key) in storage.keys {
272            // Convert to a legacy secret
273            let secret = KeyStorage::to_secret(&stored_key);
274
275            // Add to secrets
276            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            // Create an agent key
283            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            // Store in all collections
288            self.store_agent_key(&agent_key, &key_id)?;
289        }
290
291        Ok(self.clone())
292    }
293
294    /// Add a key to the key manager with option to save to storage
295    fn add_key_internal(&self, key: &GeneratedKey, save_to_storage: bool) -> Result<()> {
296        // Create a LocalAgentKey
297        let agent_key = self.agent_key_from_generated(key)?;
298        let key_id = AgentKey::key_id(&agent_key).to_string();
299
300        // Store the legacy secret
301        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        // Store in all collections
308        self.store_agent_key(&agent_key, &key_id)?;
309
310        // Save to storage if configured and requested
311        if save_to_storage {
312            self.save_to_storage()?;
313        }
314
315        Ok(())
316    }
317
318    /// Add a key to the key manager without saving to storage
319    /// This is useful when you plan to save to storage manually later
320    pub fn add_key_without_save(&self, key: &GeneratedKey) -> Result<()> {
321        self.add_key_internal(key, false)
322    }
323
324    /// Generate a new key with the specified options without saving to storage
325    /// This is useful when you plan to save to storage manually later
326    pub fn generate_key_without_save(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
327        self.generate_key_internal(options, false)
328    }
329
330    /// Internal method to generate a key with optional storage save
331    fn generate_key_internal(
332        &self,
333        options: DIDGenerationOptions,
334        save_to_storage: bool,
335    ) -> Result<GeneratedKey> {
336        // Generate the key
337        let key = self.generator.generate_did(options)?;
338
339        // Create a LocalAgentKey
340        let agent_key = self.agent_key_from_generated(&key)?;
341        let key_id = AgentKey::key_id(&agent_key).to_string();
342
343        // Store the legacy secret
344        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        // Store the generated key for DID document access
351        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        // Store in all collections
358        self.store_agent_key(&agent_key, &key_id)?;
359
360        // Save to storage if configured and requested
361        if save_to_storage {
362            self.save_to_storage()?;
363        }
364
365        Ok(key)
366    }
367
368    /// Generate a new web DID with the specified domain and options without saving to storage
369    /// This is useful when you plan to save to storage manually later
370    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    /// Internal method to generate a web DID with optional storage save
379    fn generate_web_did_internal(
380        &self,
381        domain: &str,
382        options: DIDGenerationOptions,
383        save_to_storage: bool,
384    ) -> Result<GeneratedKey> {
385        // Generate the key
386        let key = self.generator.generate_web_did(domain, options)?;
387
388        // Create a LocalAgentKey
389        let agent_key = self.agent_key_from_generated(&key)?;
390        let key_id = AgentKey::key_id(&agent_key).to_string();
391
392        // Store the legacy secret
393        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        // Store the generated key for DID document access
400        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        // Store in all collections
407        self.store_agent_key(&agent_key, &key_id)?;
408
409        // Save to storage if configured and requested
410        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    /// Get access to the secrets storage
427    fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>> {
428        Arc::clone(&self.secrets)
429    }
430
431    /// Get the raw private key bytes and key type for a DID
432    fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, KeyType)> {
433        AgentKeyManager::get_private_key(self, did)
434    }
435
436    /// Generate a new key with the specified options
437    fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
438        self.generate_key_internal(options, true)
439    }
440
441    /// Generate a new web DID with the specified domain and options
442    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    /// Add an existing key to the key manager
451    fn add_key(&self, key: &GeneratedKey) -> Result<()> {
452        self.add_key_internal(key, true)
453    }
454
455    /// Remove a key from the key manager
456    fn remove_key(&self, did: &str) -> Result<()> {
457        // Remove from legacy secrets
458        if let Ok(mut secrets) = self.secrets.write() {
459            secrets.remove(did);
460        } else {
461            return Err(Error::FailedToAcquireResolverWriteLock);
462        }
463
464        // Remove from signing keys
465        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        // Remove from encryption keys
472        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        // Remove from decryption keys
479        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        // Remove from verification keys
486        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        // Save to storage if configured
493        self.save_to_storage()?;
494
495        Ok(())
496    }
497
498    /// Check if the key manager has a key for the given DID
499    fn has_key(&self, did: &str) -> Result<bool> {
500        // Check legacy secrets first
501        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        // Check if any signing key has this DID
510        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    /// Get a list of all DIDs in the key manager
522    fn list_keys(&self) -> Result<Vec<String>> {
523        // Collect DIDs from both legacy secrets and new keys
524        let mut dids = Vec::new();
525
526        // Add DIDs from legacy secrets
527        if let Ok(secrets) = self.secrets.read() {
528            dids.extend(secrets.keys().cloned());
529        } else {
530            return Err(Error::FailedToAcquireResolverReadLock);
531        }
532
533        // Add DIDs from signing keys
534        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    /// Add a signing key to the key manager
548    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    /// Add an encryption key to the key manager
558    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    /// Add a decryption key to the key manager
568    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    /// Get a signing key by ID
578    async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
579        // Check if we have a signing key with this ID
580        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 not, check legacy secrets
589        if let Ok(secrets) = self.secrets.read() {
590            // Try to find a secret with this DID or kid
591            let did = kid.split('#').next().unwrap_or(kid);
592            if let Some(secret) = secrets.get(did) {
593                // Detect key type from the JWK
594                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, // Default
606                        }
607                    }
608                };
609                // Create a LocalAgentKey
610                let agent_key = LocalAgentKey::new(secret.clone(), key_type);
611
612                // Add to signing keys for next time
613                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    /// Get an encryption key by ID
628    async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
629        // Check if we have an encryption key with this ID
630        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 not, check legacy secrets
639        if let Ok(secrets) = self.secrets.read() {
640            // Try to find a secret with this DID or kid
641            let did = kid.split('#').next().unwrap_or(kid);
642            if let Some(secret) = secrets.get(did) {
643                // Detect key type from the JWK
644                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, // Default
656                        }
657                    }
658                };
659                // Create a LocalAgentKey
660                let agent_key = LocalAgentKey::new(secret.clone(), key_type);
661
662                // Add to encryption keys for next time
663                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    /// Get a decryption key by ID
680    async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
681        // Check if we have a decryption key with this ID
682        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 not, check legacy secrets
691        if let Ok(secrets) = self.secrets.read() {
692            // Try to find a secret with this DID or kid
693            let did = kid.split('#').next().unwrap_or(kid);
694            if let Some(secret) = secrets.get(did) {
695                // Detect key type from the JWK
696                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, // Default
708                        }
709                    }
710                };
711                // Create a LocalAgentKey
712                let agent_key = LocalAgentKey::new(secret.clone(), key_type);
713
714                // Add to decryption keys for next time
715                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    /// Resolve a verification key by ID
732    async fn resolve_verification_key(
733        &self,
734        kid: &str,
735    ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
736        // Check if we have a verification key with this ID
737        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        // If not found locally, try to derive from a signing key
746        let signing_key = KeyManager::get_signing_key(self, kid).await;
747        if let Ok(key) = signing_key {
748            // Create a verification key from the signing key
749            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            // Add to verification keys for next time
754            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        // Resolve did:key DIDs directly from the DID string (public key is embedded)
762        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                // Find the verification method matching the kid
778                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                        // Cache for future lookups
787                        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    /// Sign data with a key
804    async fn sign_jws(
805        &self,
806        kid: &str,
807        payload: &[u8],
808        protected_header: Option<JwsProtected>,
809    ) -> Result<String> {
810        // Get the signing key
811        let signing_key = KeyManager::get_signing_key(self, kid).await?;
812
813        // Sign the payload
814        let jws = signing_key
815            .create_jws(payload, protected_header)
816            .await
817            .map_err(|e| Error::Cryptography(e.to_string()))?;
818
819        // Serialize the JWS
820        serde_json::to_string(&jws).map_err(|e| Error::Serialization(e.to_string()))
821    }
822
823    /// Verify a JWS
824    async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
825        // Parse the JWS
826        let jws: crate::message::Jws = serde_json::from_str(jws)
827            .map_err(|e| Error::Serialization(format!("Failed to parse JWS: {}", e)))?;
828
829        // Find the signature to verify
830        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            // Use the first signature
839            jws.signatures
840                .first()
841                .ok_or_else(|| Error::Cryptography("No signatures in JWS".to_string()))?
842        };
843
844        // Get the protected header
845        let protected = signature.get_protected_header().map_err(|e| {
846            Error::Cryptography(format!("Failed to decode protected header: {}", e))
847        })?;
848
849        // Get the verification key using kid from protected header
850        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        // Decode the signature
856        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        // Create the signing input (protected.payload)
861        let signing_input = format!("{}.{}", signature.protected, jws.payload);
862
863        // Verify the signature
864        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        // Decode the payload
876        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    /// Encrypt data for a recipient
884    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        // Get the encryption key
892        let encryption_key = KeyManager::get_encryption_key(self, sender_kid).await?;
893
894        // Resolve the recipient's verification key
895        let recipient_key = KeyManager::resolve_verification_key(self, recipient_kid).await?;
896
897        // Encrypt the plaintext
898        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        // Serialize the JWE
904        serde_json::to_string(&jwe).map_err(|e| Error::Serialization(e.to_string()))
905    }
906
907    /// Decrypt a JWE
908    async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
909        // Parse the JWE
910        let jwe: crate::message::Jwe = serde_json::from_str(jwe)
911            .map_err(|e| Error::Serialization(format!("Failed to parse JWE: {}", e)))?;
912
913        // Find the recipient if expected_kid is provided
914        if let Some(kid) = expected_kid {
915            // Just verify recipient exists, we don't need the actual instance
916            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            // Get the decryption key
924            let decryption_key = KeyManager::get_decryption_key(self, kid).await?;
925
926            // Decrypt the JWE
927            decryption_key
928                .unwrap_jwe(&jwe)
929                .await
930                .map_err(|e| Error::Cryptography(e.to_string()))
931        } else {
932            // Try each recipient
933            for recipient in &jwe.recipients {
934                // Try to get the decryption key
935                if let Ok(decryption_key) =
936                    KeyManager::get_decryption_key(self, &recipient.header.kid).await
937                {
938                    // Try to decrypt
939                    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/// A builder for AgentKeyManager
953#[derive(Debug, Clone)]
954pub struct AgentKeyManagerBuilder {
955    /// Legacy secrets
956    secrets: HashMap<String, Secret>,
957    /// Signing keys
958    signing_keys: HashMap<String, Arc<dyn SigningKey + Send + Sync>>,
959    /// Encryption keys
960    encryption_keys: HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>,
961    /// Decryption keys
962    decryption_keys: HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>,
963    /// Verification keys
964    verification_keys: HashMap<String, Arc<dyn VerificationKey + Send + Sync>>,
965    /// Load from storage
966    load_from_storage: bool,
967    /// Storage path
968    storage_path: Option<PathBuf>,
969}
970
971impl Default for AgentKeyManagerBuilder {
972    fn default() -> Self {
973        Self::new()
974    }
975}
976
977impl AgentKeyManagerBuilder {
978    /// Create a new KeyManagerBuilder
979    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    /// Load keys from default storage location
992    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    /// Load keys from a specific storage path
999    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    /// Add a legacy secret
1006    pub fn add_secret(mut self, did: String, secret: Secret) -> Self {
1007        self.secrets.insert(did, secret);
1008        self
1009    }
1010
1011    /// Add a signing key
1012    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    /// Add an encryption key
1018    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    /// Add a decryption key
1024    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    /// Add a verification key
1030    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    /// Build the KeyManager
1036    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        // Load keys from storage if requested
1049        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        // Simulate a key loaded from storage (only in secrets, not in generated_keys)
1115        let km = AgentKeyManager::new();
1116        let key = km
1117            .generate_key(DIDGenerationOptions {
1118                key_type: KeyType::Ed25519,
1119            })
1120            .unwrap();
1121
1122        // Create a new key manager and load only the secret (simulating storage load)
1123        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        // Should still be able to extract the private key from the secret
1131        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(_) => {} // expected
1173            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        // Export
1187        let (private_key, key_type) = km.get_private_key(&key.did).unwrap();
1188
1189        // Reimport
1190        let (_agent, new_did) = TapAgent::from_private_key(&private_key, key_type, false)
1191            .await
1192            .unwrap();
1193
1194        // Same DID
1195        assert_eq!(new_did, key.did);
1196    }
1197}