Skip to main content

tap_agent/
key_manager.rs

1//! Key management functionality for the TAP Agent.
2//!
3//! This module provides a key manager for storing and retrieving
4//! cryptographic keys used by the TAP Agent for DID operations.
5use 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 serde::{Deserialize, Serialize};
13use serde_json::Value;
14use std::collections::HashMap;
15use std::sync::{Arc, RwLock};
16
17// Secret key material types
18
19/// Secret key material type
20#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
21#[serde(rename_all = "camelCase")]
22pub enum SecretType {
23    /// JSON Web Key 2020
24    JsonWebKey2020,
25}
26
27/// Secret key material
28#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
29#[serde(untagged)]
30pub enum SecretMaterial {
31    /// JSON Web Key
32    JWK {
33        /// Private key in JWK format
34        private_key_jwk: Value,
35    },
36}
37
38/// Secret for cryptographic operations
39#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
40pub struct Secret {
41    /// Secret ID
42    pub id: String,
43
44    /// Secret type
45    pub type_: SecretType,
46
47    /// Secret material
48    pub secret_material: SecretMaterial,
49}
50
51/// Trait defining the interface for a key manager component
52#[async_trait]
53pub trait KeyManager: Send + Sync + std::fmt::Debug + 'static {
54    /// Get access to the secrets storage for this key manager
55    fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>>;
56
57    /// Generate a new key with the specified options
58    fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey>;
59
60    /// Generate a new web DID with the specified domain and options
61    fn generate_web_did(&self, domain: &str, options: DIDGenerationOptions)
62        -> Result<GeneratedKey>;
63
64    /// Add an existing key to the key manager
65    fn add_key(&self, key: &GeneratedKey) -> Result<()>;
66
67    /// Remove a key from the key manager
68    fn remove_key(&self, did: &str) -> Result<()>;
69
70    /// Check if the key manager has a key for the given DID
71    fn has_key(&self, did: &str) -> Result<bool>;
72
73    /// Get a list of all DIDs in the key manager
74    fn list_keys(&self) -> Result<Vec<String>>;
75
76    /// Get the raw private key bytes and key type for a DID
77    fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, crate::did::KeyType)>;
78
79    /// Add a signing key to the key manager
80    async fn add_signing_key(&self, key: Arc<dyn SigningKey + Send + Sync>) -> Result<()>;
81
82    /// Add an encryption key to the key manager
83    async fn add_encryption_key(&self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Result<()>;
84
85    /// Add a decryption key to the key manager
86    async fn add_decryption_key(&self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Result<()>;
87
88    /// Get a signing key by ID
89    async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>>;
90
91    /// Get an encryption key by ID
92    async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>>;
93
94    /// Get a decryption key by ID
95    async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>>;
96
97    /// Resolve a verification key by ID
98    async fn resolve_verification_key(
99        &self,
100        kid: &str,
101    ) -> Result<Arc<dyn VerificationKey + Send + Sync>>;
102
103    /// Sign data with a key
104    async fn sign_jws(
105        &self,
106        kid: &str,
107        payload: &[u8],
108        protected_header: Option<crate::message::JwsProtected>,
109    ) -> Result<String>;
110
111    /// Verify a JWS
112    async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>>;
113
114    /// Encrypt data for a recipient
115    async fn encrypt_jwe(
116        &self,
117        sender_kid: &str,
118        recipient_kid: &str,
119        plaintext: &[u8],
120        protected_header: Option<crate::message::JweProtected>,
121    ) -> Result<String>;
122
123    /// Decrypt a JWE
124    async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>>;
125}
126
127/// Extract private key bytes and key type from a Secret's JWK "d" parameter
128pub fn extract_private_key_from_secret(secret: &Secret) -> Result<(Vec<u8>, crate::did::KeyType)> {
129    match &secret.secret_material {
130        SecretMaterial::JWK { private_key_jwk } => {
131            let d = private_key_jwk
132                .get("d")
133                .and_then(|v| v.as_str())
134                .ok_or_else(|| {
135                    Error::KeyNotFound("Secret JWK missing 'd' parameter".to_string())
136                })?;
137
138            let private_key = base64::Engine::decode(&base64::engine::general_purpose::STANDARD, d)
139                .map_err(|e| {
140                    Error::Cryptography(format!("Failed to decode private key from JWK: {}", e))
141                })?;
142
143            let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
144            let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
145
146            let key_type = match (kty, crv) {
147                #[cfg(feature = "crypto-ed25519")]
148                (Some("OKP"), Some("Ed25519")) => crate::did::KeyType::Ed25519,
149                #[cfg(feature = "crypto-p256")]
150                (Some("EC"), Some("P-256")) => crate::did::KeyType::P256,
151                #[cfg(feature = "crypto-secp256k1")]
152                (Some("EC"), Some("secp256k1")) => crate::did::KeyType::Secp256k1,
153                _ => {
154                    return Err(Error::KeyNotFound(format!(
155                        "Unsupported key type: kty={:?}, crv={:?}",
156                        kty, crv
157                    )))
158                }
159            };
160
161            Ok((private_key, key_type))
162        }
163    }
164}
165
166/// A default implementation of the KeyManager trait.
167#[derive(Debug, Clone)]
168pub struct DefaultKeyManager {
169    /// The DID key generator
170    pub generator: DIDKeyGenerator,
171    /// The secret storage (legacy)
172    pub secrets: Arc<RwLock<HashMap<String, Secret>>>,
173    /// Signing keys
174    signing_keys: Arc<RwLock<HashMap<String, Arc<dyn SigningKey + Send + Sync>>>>,
175    /// Encryption keys
176    encryption_keys: Arc<RwLock<HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>>>,
177    /// Decryption keys
178    decryption_keys: Arc<RwLock<HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>>>,
179    /// Verification keys
180    verification_keys: Arc<RwLock<HashMap<String, Arc<dyn VerificationKey + Send + Sync>>>>,
181}
182
183impl DefaultKeyManager {
184    /// Create a new key manager
185    pub fn new() -> Self {
186        Self {
187            generator: DIDKeyGenerator::new(),
188            secrets: Arc::new(RwLock::new(HashMap::new())),
189            signing_keys: Arc::new(RwLock::new(HashMap::new())),
190            encryption_keys: Arc::new(RwLock::new(HashMap::new())),
191            decryption_keys: Arc::new(RwLock::new(HashMap::new())),
192            verification_keys: Arc::new(RwLock::new(HashMap::new())),
193        }
194    }
195
196    /// Create a LocalAgentKey from a GeneratedKey
197    pub fn agent_key_from_generated(&self, key: &GeneratedKey) -> Result<LocalAgentKey> {
198        // Create a secret for the key
199        let secret = self.generator.create_secret_from_key(key);
200
201        // Create a LocalAgentKey
202        Ok(LocalAgentKey::new(secret, key.key_type))
203    }
204}
205
206impl Default for DefaultKeyManager {
207    fn default() -> Self {
208        Self::new()
209    }
210}
211
212#[async_trait]
213impl KeyManager for DefaultKeyManager {
214    /// Get access to the secrets storage
215    fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>> {
216        Arc::clone(&self.secrets)
217    }
218
219    /// Get the raw private key bytes and key type for a DID
220    fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, crate::did::KeyType)> {
221        if let Ok(secrets) = self.secrets.read() {
222            if let Some(secret) = secrets.get(did) {
223                return extract_private_key_from_secret(secret);
224            }
225        } else {
226            return Err(Error::FailedToAcquireResolverReadLock);
227        }
228
229        Err(Error::KeyNotFound(format!(
230            "Private key not found for DID: {}",
231            did
232        )))
233    }
234
235    /// Generate a new key with the specified options
236    fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
237        // Generate the key
238        let key = self.generator.generate_did(options)?;
239
240        // Create a LocalAgentKey
241        let agent_key = self.agent_key_from_generated(&key)?;
242
243        // Store the legacy secret
244        if let Ok(mut secrets) = self.secrets.write() {
245            secrets.insert(key.did.clone(), agent_key.clone().secret);
246        } else {
247            return Err(Error::FailedToAcquireResolverWriteLock);
248        }
249
250        // Store the agent key as signing, encryption, and decryption keys
251        if let Ok(mut signing_keys) = self.signing_keys.write() {
252            signing_keys.insert(
253                AgentKey::key_id(&agent_key).to_string(),
254                Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
255            );
256        } else {
257            return Err(Error::FailedToAcquireResolverWriteLock);
258        }
259
260        if let Ok(mut encryption_keys) = self.encryption_keys.write() {
261            encryption_keys.insert(
262                AgentKey::key_id(&agent_key).to_string(),
263                Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
264            );
265        } else {
266            return Err(Error::FailedToAcquireResolverWriteLock);
267        }
268
269        if let Ok(mut decryption_keys) = self.decryption_keys.write() {
270            decryption_keys.insert(
271                AgentKey::key_id(&agent_key).to_string(),
272                Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
273            );
274        } else {
275            return Err(Error::FailedToAcquireResolverWriteLock);
276        }
277
278        // Also store a reference in verification keys
279        if let Ok(mut verification_keys) = self.verification_keys.write() {
280            verification_keys.insert(
281                AgentKey::key_id(&agent_key).to_string(),
282                Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
283            );
284        } else {
285            return Err(Error::FailedToAcquireResolverWriteLock);
286        }
287
288        Ok(key)
289    }
290
291    /// Generate a new web DID with the specified domain and options
292    fn generate_web_did(
293        &self,
294        domain: &str,
295        options: DIDGenerationOptions,
296    ) -> Result<GeneratedKey> {
297        // Generate the key
298        let key = self.generator.generate_web_did(domain, options)?;
299
300        // Create a LocalAgentKey
301        let agent_key = self.agent_key_from_generated(&key)?;
302
303        // Store the legacy secret
304        if let Ok(mut secrets) = self.secrets.write() {
305            secrets.insert(key.did.clone(), agent_key.clone().secret);
306        } else {
307            return Err(Error::FailedToAcquireResolverWriteLock);
308        }
309
310        // Store the agent key as signing, encryption, and decryption keys
311        if let Ok(mut signing_keys) = self.signing_keys.write() {
312            signing_keys.insert(
313                AgentKey::key_id(&agent_key).to_string(),
314                Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
315            );
316        } else {
317            return Err(Error::FailedToAcquireResolverWriteLock);
318        }
319
320        if let Ok(mut encryption_keys) = self.encryption_keys.write() {
321            encryption_keys.insert(
322                AgentKey::key_id(&agent_key).to_string(),
323                Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
324            );
325        } else {
326            return Err(Error::FailedToAcquireResolverWriteLock);
327        }
328
329        if let Ok(mut decryption_keys) = self.decryption_keys.write() {
330            decryption_keys.insert(
331                AgentKey::key_id(&agent_key).to_string(),
332                Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
333            );
334        } else {
335            return Err(Error::FailedToAcquireResolverWriteLock);
336        }
337
338        // Also store a reference in verification keys
339        if let Ok(mut verification_keys) = self.verification_keys.write() {
340            verification_keys.insert(
341                AgentKey::key_id(&agent_key).to_string(),
342                Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
343            );
344        } else {
345            return Err(Error::FailedToAcquireResolverWriteLock);
346        }
347
348        Ok(key)
349    }
350
351    /// Add an existing key to the key manager
352    fn add_key(&self, key: &GeneratedKey) -> Result<()> {
353        // Create a LocalAgentKey
354        let agent_key = self.agent_key_from_generated(key)?;
355
356        // Store the legacy secret
357        if let Ok(mut secrets) = self.secrets.write() {
358            secrets.insert(key.did.clone(), agent_key.clone().secret);
359        } else {
360            return Err(Error::FailedToAcquireResolverWriteLock);
361        }
362
363        // Store the agent key as signing, encryption, and decryption keys
364        if let Ok(mut signing_keys) = self.signing_keys.write() {
365            signing_keys.insert(
366                AgentKey::key_id(&agent_key).to_string(),
367                Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
368            );
369        } else {
370            return Err(Error::FailedToAcquireResolverWriteLock);
371        }
372
373        if let Ok(mut encryption_keys) = self.encryption_keys.write() {
374            encryption_keys.insert(
375                AgentKey::key_id(&agent_key).to_string(),
376                Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
377            );
378        } else {
379            return Err(Error::FailedToAcquireResolverWriteLock);
380        }
381
382        if let Ok(mut decryption_keys) = self.decryption_keys.write() {
383            decryption_keys.insert(
384                AgentKey::key_id(&agent_key).to_string(),
385                Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
386            );
387        } else {
388            return Err(Error::FailedToAcquireResolverWriteLock);
389        }
390
391        // Also store a reference in verification keys
392        if let Ok(mut verification_keys) = self.verification_keys.write() {
393            verification_keys.insert(
394                AgentKey::key_id(&agent_key).to_string(),
395                Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
396            );
397        } else {
398            return Err(Error::FailedToAcquireResolverWriteLock);
399        }
400
401        Ok(())
402    }
403
404    /// Remove a key from the key manager
405    fn remove_key(&self, did: &str) -> Result<()> {
406        // Remove from legacy secrets
407        if let Ok(mut secrets) = self.secrets.write() {
408            secrets.remove(did);
409        } else {
410            return Err(Error::FailedToAcquireResolverWriteLock);
411        }
412
413        // Remove from signing keys
414        if let Ok(mut signing_keys) = self.signing_keys.write() {
415            signing_keys.retain(|k, _| !k.starts_with(did));
416        } else {
417            return Err(Error::FailedToAcquireResolverWriteLock);
418        }
419
420        // Remove from encryption keys
421        if let Ok(mut encryption_keys) = self.encryption_keys.write() {
422            encryption_keys.retain(|k, _| !k.starts_with(did));
423        } else {
424            return Err(Error::FailedToAcquireResolverWriteLock);
425        }
426
427        // Remove from decryption keys
428        if let Ok(mut decryption_keys) = self.decryption_keys.write() {
429            decryption_keys.retain(|k, _| !k.starts_with(did));
430        } else {
431            return Err(Error::FailedToAcquireResolverWriteLock);
432        }
433
434        // Remove from verification keys
435        if let Ok(mut verification_keys) = self.verification_keys.write() {
436            verification_keys.retain(|k, _| !k.starts_with(did));
437        } else {
438            return Err(Error::FailedToAcquireResolverWriteLock);
439        }
440
441        Ok(())
442    }
443
444    /// Check if the key manager has a key for the given DID
445    fn has_key(&self, did: &str) -> Result<bool> {
446        // Check legacy secrets first
447        if let Ok(secrets) = self.secrets.read() {
448            if secrets.contains_key(did) {
449                return Ok(true);
450            }
451        } else {
452            return Err(Error::FailedToAcquireResolverReadLock);
453        }
454
455        // Check if any signing key has this DID
456        if let Ok(signing_keys) = self.signing_keys.read() {
457            if signing_keys.values().any(|k| k.did() == did) {
458                return Ok(true);
459            }
460        } else {
461            return Err(Error::FailedToAcquireResolverReadLock);
462        }
463
464        Ok(false)
465    }
466
467    /// Get a list of all DIDs in the key manager
468    fn list_keys(&self) -> Result<Vec<String>> {
469        // Collect DIDs from both legacy secrets and new keys
470        let mut dids = Vec::new();
471
472        // Add DIDs from legacy secrets
473        if let Ok(secrets) = self.secrets.read() {
474            dids.extend(secrets.keys().cloned());
475        } else {
476            return Err(Error::FailedToAcquireResolverReadLock);
477        }
478
479        // Add DIDs from signing keys
480        if let Ok(signing_keys) = self.signing_keys.read() {
481            for key in signing_keys.values() {
482                if !dids.contains(&key.did().to_string()) {
483                    dids.push(key.did().to_string());
484                }
485            }
486        } else {
487            return Err(Error::FailedToAcquireResolverReadLock);
488        }
489
490        Ok(dids)
491    }
492
493    /// Add a signing key to the key manager
494    async fn add_signing_key(&self, key: Arc<dyn SigningKey + Send + Sync>) -> Result<()> {
495        if let Ok(mut signing_keys) = self.signing_keys.write() {
496            signing_keys.insert(key.key_id().to_string(), key);
497            Ok(())
498        } else {
499            Err(Error::FailedToAcquireResolverWriteLock)
500        }
501    }
502
503    /// Add an encryption key to the key manager
504    async fn add_encryption_key(&self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Result<()> {
505        if let Ok(mut encryption_keys) = self.encryption_keys.write() {
506            encryption_keys.insert(key.key_id().to_string(), key);
507            Ok(())
508        } else {
509            Err(Error::FailedToAcquireResolverWriteLock)
510        }
511    }
512
513    /// Add a decryption key to the key manager
514    async fn add_decryption_key(&self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Result<()> {
515        if let Ok(mut decryption_keys) = self.decryption_keys.write() {
516            decryption_keys.insert(key.key_id().to_string(), key);
517            Ok(())
518        } else {
519            Err(Error::FailedToAcquireResolverWriteLock)
520        }
521    }
522
523    /// Get a signing key by ID
524    async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
525        // Check if we have a signing key with this ID
526        if let Ok(signing_keys) = self.signing_keys.read() {
527            if let Some(key) = signing_keys.get(kid) {
528                return Ok(key.clone());
529            }
530        } else {
531            return Err(Error::FailedToAcquireResolverReadLock);
532        }
533
534        // If not, check legacy secrets
535        if let Ok(secrets) = self.secrets.read() {
536            // Try to find a secret with this DID or kid
537            let did = kid.split('#').next().unwrap_or(kid);
538            if let Some(secret) = secrets.get(did) {
539                // Create a LocalAgentKey
540                let key_type = crate::did::KeyType::Ed25519; // Default to Ed25519
541                let agent_key = LocalAgentKey::new(secret.clone(), key_type);
542
543                // Add to signing keys for next time
544                if let Ok(mut signing_keys) = self.signing_keys.write() {
545                    let arc_key = Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>;
546                    // Insert with both the agent's key ID and the requested kid
547                    let agent_kid = AgentKey::key_id(&agent_key).to_string();
548                    signing_keys.insert(agent_kid.clone(), arc_key.clone());
549                    // Also insert with the requested kid if different
550                    if agent_kid != kid {
551                        signing_keys.insert(kid.to_string(), arc_key.clone());
552                    }
553                    return Ok(arc_key);
554                }
555            }
556        }
557
558        Err(Error::Cryptography(format!(
559            "No signing key found with ID: {}",
560            kid
561        )))
562    }
563
564    /// Get an encryption key by ID
565    async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
566        // Check if we have an encryption key with this ID
567        if let Ok(encryption_keys) = self.encryption_keys.read() {
568            if let Some(key) = encryption_keys.get(kid) {
569                return Ok(key.clone());
570            }
571        } else {
572            return Err(Error::FailedToAcquireResolverReadLock);
573        }
574
575        // If not, check legacy secrets
576        if let Ok(secrets) = self.secrets.read() {
577            // Try to find a secret with this DID or kid
578            let did = kid.split('#').next().unwrap_or(kid);
579            if let Some(secret) = secrets.get(did) {
580                // Create a LocalAgentKey
581                let key_type = crate::did::KeyType::Ed25519; // Default to Ed25519
582                let agent_key = LocalAgentKey::new(secret.clone(), key_type);
583
584                // Add to encryption keys for next time
585                if let Ok(mut encryption_keys) = self.encryption_keys.write() {
586                    let arc_key =
587                        Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>;
588                    // Insert with both the agent's key ID and the requested kid
589                    let agent_kid = AgentKey::key_id(&agent_key).to_string();
590                    encryption_keys.insert(agent_kid.clone(), arc_key.clone());
591                    // Also insert with the requested kid if different
592                    if agent_kid != kid {
593                        encryption_keys.insert(kid.to_string(), arc_key.clone());
594                    }
595                    return Ok(arc_key);
596                }
597            }
598        }
599
600        Err(Error::Cryptography(format!(
601            "No encryption key found with ID: {}",
602            kid
603        )))
604    }
605
606    /// Get a decryption key by ID
607    async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
608        // Check if we have a decryption key with this ID
609        if let Ok(decryption_keys) = self.decryption_keys.read() {
610            if let Some(key) = decryption_keys.get(kid) {
611                return Ok(key.clone());
612            }
613        } else {
614            return Err(Error::FailedToAcquireResolverReadLock);
615        }
616
617        // If not, check legacy secrets
618        if let Ok(secrets) = self.secrets.read() {
619            // Try to find a secret with this DID or kid
620            let did = kid.split('#').next().unwrap_or(kid);
621            if let Some(secret) = secrets.get(did) {
622                // Create a LocalAgentKey
623                let key_type = crate::did::KeyType::Ed25519; // Default to Ed25519
624                let agent_key = LocalAgentKey::new(secret.clone(), key_type);
625
626                // Add to decryption keys for next time
627                if let Ok(mut decryption_keys) = self.decryption_keys.write() {
628                    let arc_key =
629                        Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>;
630                    // Insert with both the agent's key ID and the requested kid
631                    let agent_kid = AgentKey::key_id(&agent_key).to_string();
632                    decryption_keys.insert(agent_kid.clone(), arc_key.clone());
633                    // Also insert with the requested kid if different
634                    if agent_kid != kid {
635                        decryption_keys.insert(kid.to_string(), arc_key.clone());
636                    }
637                    return Ok(arc_key);
638                }
639            }
640        }
641
642        Err(Error::Cryptography(format!(
643            "No decryption key found with ID: {}",
644            kid
645        )))
646    }
647
648    /// Resolve a verification key by ID
649    async fn resolve_verification_key(
650        &self,
651        kid: &str,
652    ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
653        // Check if we have a verification key with this ID
654        if let Ok(verification_keys) = self.verification_keys.read() {
655            if let Some(key) = verification_keys.get(kid) {
656                return Ok(key.clone());
657            }
658        } else {
659            return Err(Error::FailedToAcquireResolverReadLock);
660        }
661
662        // TODO: If not found locally, use DID Resolver to look up the public key
663        // For now, we'll just check our signing keys and create verification keys from them
664
665        // Check if we can resolve from a signing key
666        let signing_key = KeyManager::get_signing_key(self, kid).await;
667        if let Ok(key) = signing_key {
668            // Create a verification key from the signing key
669            let public_jwk = key.public_key_jwk()?;
670            let verification_key = Arc::new(PublicVerificationKey::new(kid.to_string(), public_jwk))
671                as Arc<dyn VerificationKey + Send + Sync>;
672
673            // Add to verification keys for next time
674            if let Ok(mut verification_keys) = self.verification_keys.write() {
675                verification_keys.insert(kid.to_string(), verification_key.clone());
676            }
677
678            return Ok(verification_key);
679        }
680
681        // Resolve did:key DIDs directly from the DID string (public key is embedded)
682        let did = kid.split('#').next().unwrap_or(kid);
683        if did.starts_with("did:key:") {
684            let resolver = crate::did::KeyResolver::new();
685            #[cfg(not(target_arch = "wasm32"))]
686            let did_doc_result = {
687                use crate::did::DIDMethodResolver;
688                resolver.resolve_method(did).await
689            };
690            #[cfg(target_arch = "wasm32")]
691            let did_doc_result = {
692                use crate::did::WasmDIDMethodResolver;
693                resolver.resolve_method(did)
694            };
695
696            if let Ok(Some(did_doc)) = did_doc_result {
697                if let Some(vm) = did_doc.verification_method.iter().find(|vm| vm.id == kid) {
698                    if let Ok(vk) = PublicVerificationKey::from_verification_material(
699                        kid.to_string(),
700                        &vm.verification_material,
701                    ) {
702                        let verification_key =
703                            Arc::new(vk) as Arc<dyn VerificationKey + Send + Sync>;
704
705                        if let Ok(mut verification_keys) = self.verification_keys.write() {
706                            verification_keys.insert(kid.to_string(), verification_key.clone());
707                        }
708
709                        return Ok(verification_key);
710                    }
711                }
712            }
713        }
714
715        Err(Error::Cryptography(format!(
716            "No verification key found with ID: {}",
717            kid
718        )))
719    }
720
721    /// Sign data with a key
722    async fn sign_jws(
723        &self,
724        kid: &str,
725        payload: &[u8],
726        protected_header: Option<crate::message::JwsProtected>,
727    ) -> Result<String> {
728        // Get the signing key
729        let signing_key = KeyManager::get_signing_key(self, kid).await?;
730
731        // Sign the payload
732        let jws = signing_key
733            .create_jws(payload, protected_header)
734            .await
735            .map_err(|e| Error::Cryptography(e.to_string()))?;
736
737        // Serialize the JWS
738        serde_json::to_string(&jws).map_err(|e| Error::Serialization(e.to_string()))
739    }
740
741    /// Verify a JWS
742    async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
743        // Parse the JWS
744        let jws: crate::message::Jws = serde_json::from_str(jws)
745            .map_err(|e| Error::Serialization(format!("Failed to parse JWS: {}", e)))?;
746
747        // Find the signature to verify
748        let signature = if let Some(kid) = expected_kid {
749            jws.signatures
750                .iter()
751                .find(|s| s.get_kid().as_deref() == Some(kid))
752                .ok_or_else(|| {
753                    Error::Cryptography(format!("No signature found with kid: {}", kid))
754                })?
755        } else {
756            jws.signatures
757                .first()
758                .ok_or_else(|| Error::Cryptography("No signatures in JWS".to_string()))?
759        };
760
761        // Get the protected header
762        let protected = signature.get_protected_header().map_err(|e| {
763            Error::Cryptography(format!("Failed to decode protected header: {}", e))
764        })?;
765
766        // Get the verification key using kid from protected header
767        let kid = signature
768            .get_kid()
769            .ok_or_else(|| Error::Cryptography("No kid found in JWS signature".to_string()))?;
770        let verification_key = KeyManager::resolve_verification_key(self, &kid).await?;
771
772        // Decode the signature (accept both base64 and base64url)
773        let signature_bytes = crate::message::base64_decode_flexible(&signature.signature)
774            .map_err(|e| Error::Cryptography(format!("Failed to decode signature: {}", e)))?;
775
776        // Create the signing input (protected.payload)
777        let signing_input = format!("{}.{}", signature.protected, jws.payload);
778
779        // Verify the signature
780        let verified = verification_key
781            .verify_signature(signing_input.as_bytes(), &signature_bytes, &protected)
782            .await
783            .map_err(|e| Error::Cryptography(e.to_string()))?;
784
785        if !verified {
786            return Err(Error::Cryptography(
787                "Signature verification failed".to_string(),
788            ));
789        }
790
791        // Decode the payload (accept both base64 and base64url)
792        let payload_bytes = crate::message::base64_decode_flexible(&jws.payload)
793            .map_err(|e| Error::Cryptography(format!("Failed to decode payload: {}", e)))?;
794
795        Ok(payload_bytes)
796    }
797
798    /// Encrypt data for a recipient
799    async fn encrypt_jwe(
800        &self,
801        sender_kid: &str,
802        recipient_kid: &str,
803        plaintext: &[u8],
804        protected_header: Option<crate::message::JweProtected>,
805    ) -> Result<String> {
806        // Get the encryption key
807        let encryption_key = KeyManager::get_encryption_key(self, sender_kid).await?;
808
809        // Resolve the recipient's verification key
810        let recipient_key = KeyManager::resolve_verification_key(self, recipient_kid).await?;
811
812        // Encrypt the plaintext
813        let jwe = encryption_key
814            .create_jwe(plaintext, &[recipient_key], protected_header)
815            .await
816            .map_err(|e| Error::Cryptography(e.to_string()))?;
817
818        // Serialize the JWE
819        serde_json::to_string(&jwe).map_err(|e| Error::Serialization(e.to_string()))
820    }
821
822    /// Decrypt a JWE
823    async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
824        // Parse the JWE
825        let jwe: crate::message::Jwe = serde_json::from_str(jwe)
826            .map_err(|e| Error::Serialization(format!("Failed to parse JWE: {}", e)))?;
827
828        if let Some(kid) = expected_kid {
829            // Verify recipient exists
830            jwe.recipients
831                .iter()
832                .find(|r| r.header.kid == kid)
833                .ok_or_else(|| {
834                    Error::Cryptography(format!("No recipient found with kid: {}", kid))
835                })?;
836
837            // Get the decryption key and unwrap JWE
838            let decryption_key = KeyManager::get_decryption_key(self, kid).await?;
839            decryption_key
840                .unwrap_jwe(&jwe)
841                .await
842                .map_err(|e| Error::Cryptography(e.to_string()))
843        } else {
844            // Try each recipient
845            for recipient in &jwe.recipients {
846                if let Ok(decryption_key) =
847                    KeyManager::get_decryption_key(self, &recipient.header.kid).await
848                {
849                    if let Ok(plaintext) = decryption_key.unwrap_jwe(&jwe).await {
850                        return Ok(plaintext);
851                    }
852                }
853            }
854
855            Err(Error::Cryptography(
856                "Failed to decrypt JWE for any recipient".to_string(),
857            ))
858        }
859    }
860}
861
862#[async_trait]
863impl KeyManagerPacking for DefaultKeyManager {
864    async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
865        KeyManager::get_signing_key(self, kid)
866            .await
867            .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
868    }
869
870    async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
871        KeyManager::get_encryption_key(self, kid)
872            .await
873            .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
874    }
875
876    async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
877        KeyManager::get_decryption_key(self, kid)
878            .await
879            .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
880    }
881
882    async fn resolve_verification_key(
883        &self,
884        kid: &str,
885    ) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
886        KeyManager::resolve_verification_key(self, kid)
887            .await
888            .map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
889    }
890}
891
892/// A builder for KeyManager
893#[derive(Debug, Clone)]
894pub struct KeyManagerBuilder {
895    /// The DID key generator
896    generator: DIDKeyGenerator,
897    /// Legacy secrets
898    secrets: HashMap<String, Secret>,
899    /// Signing keys
900    signing_keys: HashMap<String, Arc<dyn SigningKey + Send + Sync>>,
901    /// Encryption keys
902    encryption_keys: HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>,
903    /// Decryption keys
904    decryption_keys: HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>,
905    /// Verification keys
906    verification_keys: HashMap<String, Arc<dyn VerificationKey + Send + Sync>>,
907    /// Load from storage
908    load_from_storage: bool,
909    /// Storage path
910    storage_path: Option<std::path::PathBuf>,
911}
912
913impl Default for KeyManagerBuilder {
914    fn default() -> Self {
915        Self::new()
916    }
917}
918
919impl KeyManagerBuilder {
920    /// Create a new KeyManagerBuilder
921    pub fn new() -> Self {
922        Self {
923            generator: DIDKeyGenerator::new(),
924            secrets: HashMap::new(),
925            signing_keys: HashMap::new(),
926            encryption_keys: HashMap::new(),
927            decryption_keys: HashMap::new(),
928            verification_keys: HashMap::new(),
929            load_from_storage: false,
930            storage_path: None,
931        }
932    }
933
934    /// Load keys from default storage location
935    pub fn load_from_default_storage(mut self) -> Self {
936        self.load_from_storage = true;
937        self.storage_path = None;
938        self
939    }
940
941    /// Load keys from a specific storage path
942    pub fn load_from_path(mut self, path: std::path::PathBuf) -> Self {
943        self.load_from_storage = true;
944        self.storage_path = Some(path);
945        self
946    }
947
948    /// Add a legacy secret
949    pub fn add_secret(mut self, did: String, secret: Secret) -> Self {
950        self.secrets.insert(did, secret);
951        self
952    }
953
954    /// Add a signing key
955    pub fn add_signing_key(mut self, key: Arc<dyn SigningKey + Send + Sync>) -> Self {
956        self.signing_keys.insert(key.key_id().to_string(), key);
957        self
958    }
959
960    /// Add an encryption key
961    pub fn add_encryption_key(mut self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Self {
962        self.encryption_keys.insert(key.key_id().to_string(), key);
963        self
964    }
965
966    /// Add a decryption key
967    pub fn add_decryption_key(mut self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Self {
968        self.decryption_keys.insert(key.key_id().to_string(), key);
969        self
970    }
971
972    /// Add a verification key
973    pub fn add_verification_key(mut self, key: Arc<dyn VerificationKey + Send + Sync>) -> Self {
974        self.verification_keys.insert(key.key_id().to_string(), key);
975        self
976    }
977
978    /// Add an auto-generated Ed25519 key
979    pub fn with_auto_generated_ed25519_key(self, kid: &str) -> Result<Self> {
980        // Generate a new Ed25519 key
981        let local_key = LocalAgentKey::generate_ed25519(kid)?;
982
983        // Convert to Arc and add to signing, encryption, decryption, and verification keys
984        let arc_key = Arc::new(local_key.clone());
985        let builder = self
986            .add_signing_key(arc_key.clone() as Arc<dyn SigningKey + Send + Sync>)
987            .add_encryption_key(arc_key.clone() as Arc<dyn EncryptionKey + Send + Sync>)
988            .add_decryption_key(arc_key.clone() as Arc<dyn DecryptionKey + Send + Sync>)
989            .add_verification_key(arc_key as Arc<dyn VerificationKey + Send + Sync>);
990
991        // Also add the secret to legacy secrets
992        let builder = builder.add_secret(local_key.did().to_string(), local_key.secret.clone());
993
994        Ok(builder)
995    }
996
997    /// Build the KeyManager
998    pub fn build(self) -> Result<DefaultKeyManager> {
999        let key_manager = DefaultKeyManager {
1000            generator: self.generator,
1001            secrets: Arc::new(RwLock::new(self.secrets)),
1002            signing_keys: Arc::new(RwLock::new(self.signing_keys)),
1003            encryption_keys: Arc::new(RwLock::new(self.encryption_keys)),
1004            decryption_keys: Arc::new(RwLock::new(self.decryption_keys)),
1005            verification_keys: Arc::new(RwLock::new(self.verification_keys)),
1006        };
1007
1008        // Load keys from storage if requested
1009        if self.load_from_storage {
1010            use crate::storage::KeyStorage;
1011
1012            let storage = if let Some(path) = self.storage_path {
1013                KeyStorage::load_from_path(&path)?
1014            } else {
1015                KeyStorage::load_default()?
1016            };
1017
1018            // Process each stored key
1019            for (did, stored_key) in storage.keys {
1020                // Convert to a legacy secret
1021                let secret = KeyStorage::to_secret(&stored_key);
1022
1023                // Add to secrets
1024                if let Ok(mut secrets) = key_manager.secrets.write() {
1025                    secrets.insert(did.clone(), secret.clone());
1026                } else {
1027                    return Err(Error::FailedToAcquireResolverWriteLock);
1028                }
1029
1030                // Create an agent key
1031                let key_type = stored_key.key_type;
1032                let agent_key = LocalAgentKey::new(secret, key_type);
1033
1034                // Add to signing keys
1035                if let Ok(mut signing_keys) = key_manager.signing_keys.write() {
1036                    signing_keys.insert(
1037                        AgentKey::key_id(&agent_key).to_string(),
1038                        Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
1039                    );
1040                } else {
1041                    return Err(Error::FailedToAcquireResolverWriteLock);
1042                }
1043
1044                // Add to encryption keys
1045                if let Ok(mut encryption_keys) = key_manager.encryption_keys.write() {
1046                    encryption_keys.insert(
1047                        AgentKey::key_id(&agent_key).to_string(),
1048                        Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
1049                    );
1050                } else {
1051                    return Err(Error::FailedToAcquireResolverWriteLock);
1052                }
1053
1054                // Add to decryption keys
1055                if let Ok(mut decryption_keys) = key_manager.decryption_keys.write() {
1056                    decryption_keys.insert(
1057                        AgentKey::key_id(&agent_key).to_string(),
1058                        Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
1059                    );
1060                } else {
1061                    return Err(Error::FailedToAcquireResolverWriteLock);
1062                }
1063
1064                // Add to verification keys
1065                if let Ok(mut verification_keys) = key_manager.verification_keys.write() {
1066                    verification_keys.insert(
1067                        AgentKey::key_id(&agent_key).to_string(),
1068                        Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
1069                    );
1070                } else {
1071                    return Err(Error::FailedToAcquireResolverWriteLock);
1072                }
1073            }
1074        }
1075
1076        Ok(key_manager)
1077    }
1078}
1079
1080/// A trait for accessing secrets from the key manager
1081#[derive(Debug, Clone)]
1082pub struct SecretAccessor {
1083    /// The secret storage
1084    secrets: Arc<RwLock<HashMap<String, Secret>>>,
1085}
1086
1087impl SecretAccessor {
1088    /// Create a new SecretAccessor
1089    pub fn new(key_manager: Arc<dyn KeyManager>) -> Self {
1090        Self {
1091            secrets: key_manager.secrets(),
1092        }
1093    }
1094
1095    /// Create a new SecretAccessor directly from secrets
1096    pub fn new_from_secrets(secrets: Arc<RwLock<HashMap<String, Secret>>>) -> Self {
1097        Self { secrets }
1098    }
1099
1100    /// Get a secret by ID
1101    pub fn get_secret_by_id(&self, secret_id: &str) -> Option<Secret> {
1102        if let Ok(secrets) = self.secrets.read() {
1103            if let Some(secret) = secrets.get(secret_id) {
1104                return Some(secret.clone());
1105            }
1106        }
1107        None
1108    }
1109}
1110
1111#[cfg(test)]
1112mod tests {
1113    use super::*;
1114
1115    #[test]
1116    fn test_key_manager() {
1117        let manager = DefaultKeyManager::new();
1118
1119        // Generate an Ed25519 key
1120        let options = crate::did::DIDGenerationOptions {
1121            key_type: crate::did::KeyType::Ed25519,
1122        };
1123
1124        let key = manager.generate_key(options).unwrap();
1125
1126        // Check that the key is stored
1127        assert!(manager.has_key(&key.did).unwrap());
1128
1129        // List keys
1130        let keys = manager.list_keys().unwrap();
1131        assert_eq!(keys.len(), 1);
1132        assert_eq!(keys[0], key.did);
1133
1134        // Remove the key
1135        manager.remove_key(&key.did).unwrap();
1136        assert!(!manager.has_key(&key.did).unwrap());
1137
1138        // Add the key back
1139        manager.add_key(&key).unwrap();
1140        assert!(manager.has_key(&key.did).unwrap());
1141    }
1142
1143    #[tokio::test]
1144    async fn test_agent_key_operations() {
1145        let manager = DefaultKeyManager::new();
1146
1147        // Generate only Ed25519 key since P-256 and secp256k1 had cryptographic issues
1148        let ed25519_key = manager
1149            .generate_key(DIDGenerationOptions {
1150                key_type: crate::did::KeyType::Ed25519,
1151            })
1152            .unwrap();
1153
1154        // Test signing (but skip verification since we removed crypto)
1155        let test_data = b"Hello, world!";
1156
1157        // Ed25519
1158        let ed25519_kid = format!("{}#keys-1", ed25519_key.did);
1159        let signing_key = KeyManager::get_signing_key(&manager, &ed25519_kid)
1160            .await
1161            .unwrap();
1162
1163        // Verify we can get the key ID (though the exact format may vary)
1164        assert!(signing_key.key_id().contains(ed25519_key.did.as_str()));
1165
1166        // Verify we can at least get the did (though it might come back as only the base DID)
1167        assert!(signing_key.did().contains(&ed25519_key.did));
1168
1169        // Test key JWS creation
1170        let jws = signing_key.create_jws(test_data, None).await.unwrap();
1171        assert!(jws.signatures.len() == 1);
1172        assert!(jws.signatures[0]
1173            .get_kid()
1174            .unwrap()
1175            .contains(ed25519_key.did.as_str()));
1176
1177        // Verify that the kid is in the protected header (not unprotected header)
1178        let protected_header = jws.signatures[0].get_protected_header().unwrap();
1179        assert!(
1180            !protected_header.kid.is_empty(),
1181            "kid should be in protected header"
1182        );
1183        assert_eq!(&protected_header.kid, &jws.signatures[0].get_kid().unwrap());
1184
1185        // No unprotected header exists since we removed it completely
1186    }
1187
1188    #[test]
1189    fn test_web_did_generation() {
1190        let manager = DefaultKeyManager::new();
1191
1192        // Generate a web DID
1193        let domain = "example.com";
1194        let options = DIDGenerationOptions {
1195            key_type: crate::did::KeyType::Ed25519,
1196        };
1197
1198        let key = manager.generate_web_did(domain, options).unwrap();
1199
1200        // Check that the key is stored
1201        assert!(manager.has_key(&key.did).unwrap());
1202
1203        // Verify the DID format
1204        assert_eq!(key.did, format!("did:web:{}", domain));
1205    }
1206
1207    #[tokio::test]
1208    async fn test_jws_operations() {
1209        let manager = DefaultKeyManager::new();
1210
1211        // Generate a key
1212        let options = crate::did::DIDGenerationOptions {
1213            key_type: crate::did::KeyType::Ed25519,
1214        };
1215
1216        let key = manager.generate_key(options).unwrap();
1217        // For did:key, the kid is did:key:z6Mk...#z6Mk...
1218        let key_part = &key.did["did:key:".len()..];
1219        let kid = format!("{}#{}", key.did, key_part);
1220
1221        // Test data
1222        let test_data = b"Hello, world!";
1223
1224        // Sign
1225        let jws = manager.sign_jws(&kid, test_data, None).await.unwrap();
1226
1227        // Verify with expected kid
1228        let payload = manager.verify_jws(&jws, Some(&kid)).await.unwrap();
1229        assert_eq!(payload, test_data);
1230
1231        // Verify without expected kid (uses first signature)
1232        let payload = manager.verify_jws(&jws, None).await.unwrap();
1233        assert_eq!(payload, test_data);
1234    }
1235
1236    #[tokio::test]
1237    #[cfg(feature = "crypto-p256")]
1238    async fn test_jwe_operations() {
1239        let manager = DefaultKeyManager::new();
1240
1241        // Generate two keys (sender and recipient)
1242        let options = crate::did::DIDGenerationOptions {
1243            key_type: crate::did::KeyType::P256,
1244        };
1245
1246        let sender_key = manager.generate_key(options.clone()).unwrap();
1247        let sender_part = &sender_key.did["did:key:".len()..];
1248        let sender_kid = format!("{}#{}", sender_key.did, sender_part);
1249
1250        let recipient_key = manager.generate_key(options).unwrap();
1251        let recipient_part = &recipient_key.did["did:key:".len()..];
1252        let recipient_kid = format!("{}#{}", recipient_key.did, recipient_part);
1253
1254        // Test data
1255        let test_data = b"Hello, world!";
1256
1257        // Encrypt
1258        let jwe = manager
1259            .encrypt_jwe(&sender_kid, &recipient_kid, test_data, None)
1260            .await
1261            .unwrap();
1262
1263        // Decrypt
1264        let plaintext = manager
1265            .decrypt_jwe(&jwe, Some(&recipient_kid))
1266            .await
1267            .unwrap();
1268        assert_eq!(plaintext, test_data);
1269    }
1270}