use crate::agent_key::{AgentKey, DecryptionKey, EncryptionKey, SigningKey, VerificationKey};
use crate::did::{DIDGenerationOptions, DIDKeyGenerator, GeneratedKey, KeyType};
use crate::error::{Error, Result};
use crate::key_manager::{KeyManager, Secret, SecretMaterial};
use crate::local_agent_key::{LocalAgentKey, PublicVerificationKey};
use crate::message::{JweProtected, JwsProtected};
use crate::message_packing::{KeyManagerPacking, MessageError};
use crate::storage::{KeyStorage, StoredKey};
use async_trait::async_trait;
use base64::Engine;
use std::collections::HashMap;
use std::path::PathBuf;
use std::sync::{Arc, RwLock};
#[derive(Debug, Clone)]
pub struct AgentKeyManager {
generator: DIDKeyGenerator,
secrets: Arc<RwLock<HashMap<String, Secret>>>,
signing_keys: Arc<RwLock<HashMap<String, Arc<dyn SigningKey + Send + Sync>>>>,
encryption_keys: Arc<RwLock<HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>>>,
decryption_keys: Arc<RwLock<HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>>>,
verification_keys: Arc<RwLock<HashMap<String, Arc<dyn VerificationKey + Send + Sync>>>>,
generated_keys: Arc<RwLock<HashMap<String, GeneratedKey>>>,
storage_path: Option<PathBuf>,
}
impl AgentKeyManager {
pub fn new() -> Self {
Self {
generator: DIDKeyGenerator::new(),
secrets: Arc::new(RwLock::new(HashMap::new())),
signing_keys: Arc::new(RwLock::new(HashMap::new())),
encryption_keys: Arc::new(RwLock::new(HashMap::new())),
decryption_keys: Arc::new(RwLock::new(HashMap::new())),
verification_keys: Arc::new(RwLock::new(HashMap::new())),
generated_keys: Arc::new(RwLock::new(HashMap::new())),
storage_path: None,
}
}
pub fn get_generated_key(&self, did: &str) -> Result<GeneratedKey> {
if let Ok(generated_keys) = self.generated_keys.read() {
if let Some(key) = generated_keys.get(did) {
return Ok(key.clone());
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
Err(Error::KeyNotFound(format!(
"Generated key not found for DID: {}",
did
)))
}
pub async fn get_signing_key_type(&self, did: &str) -> Result<String> {
if let Ok(signing_keys) = self.signing_keys.read() {
for (kid, key) in signing_keys.iter() {
if kid.starts_with(did) {
if let Ok(jwk) = key.public_key_jwk() {
let kty = jwk.get("kty").and_then(|v| v.as_str());
let crv = jwk.get("crv").and_then(|v| v.as_str());
return Ok(format!("kty: {:?}, crv: {:?}", kty, crv));
}
}
}
}
Err(Error::KeyNotFound(format!(
"No signing key found for DID: {}",
did
)))
}
pub fn agent_key_from_generated(&self, key: &GeneratedKey) -> Result<LocalAgentKey> {
let secret = self.generator.create_secret_from_key(key);
Ok(LocalAgentKey::new(secret, key.key_type))
}
fn store_agent_key(&self, agent_key: &LocalAgentKey, key_id: &str) -> Result<()> {
if let Ok(mut signing_keys) = self.signing_keys.write() {
signing_keys.insert(
key_id.to_string(),
Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut encryption_keys) = self.encryption_keys.write() {
encryption_keys.insert(
key_id.to_string(),
Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut decryption_keys) = self.decryption_keys.write() {
decryption_keys.insert(
key_id.to_string(),
Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut verification_keys) = self.verification_keys.write() {
verification_keys.insert(
key_id.to_string(),
Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
Ok(())
}
pub fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, KeyType)> {
if let Ok(generated_keys) = self.generated_keys.read() {
if let Some(key) = generated_keys.get(did) {
return Ok((key.private_key.clone(), key.key_type));
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
if let Ok(secrets) = self.secrets.read() {
if let Some(secret) = secrets.get(did) {
return crate::key_manager::extract_private_key_from_secret(secret);
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
Err(Error::KeyNotFound(format!(
"Private key not found for DID: {}",
did
)))
}
pub fn save_to_storage(&self) -> Result<()> {
if self.storage_path.is_none() {
return Ok(());
}
let mut key_storage = KeyStorage::new();
if let Ok(secrets) = self.secrets.read() {
for (did, secret) in secrets.iter() {
let key_type = match secret.secret_material {
SecretMaterial::JWK {
ref private_key_jwk,
} => {
let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
match (kty, crv) {
#[cfg(feature = "crypto-ed25519")]
(Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
#[cfg(feature = "crypto-p256")]
(Some("EC"), Some("P-256")) => KeyType::P256,
#[cfg(feature = "crypto-secp256k1")]
(Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
_ => KeyType::Ed25519, }
}
};
let private_key_b64 = match &secret.secret_material {
SecretMaterial::JWK { private_key_jwk } => private_key_jwk
.get("d")
.and_then(|v| v.as_str())
.unwrap_or("")
.to_string(),
};
let public_key_b64 = match &secret.secret_material {
SecretMaterial::JWK { private_key_jwk } => private_key_jwk
.get("x")
.and_then(|v| v.as_str())
.unwrap_or("")
.to_string(),
};
let stored_key = StoredKey {
did: did.clone(),
label: String::new(), key_type,
private_key: private_key_b64,
public_key: public_key_b64,
metadata: HashMap::new(),
};
key_storage.add_key(stored_key);
}
}
if let Some(path) = &self.storage_path {
key_storage.save_to_path(path)?;
} else {
key_storage.save_default()?;
}
Ok(())
}
pub fn load_from_default_storage(mut self) -> Result<Self> {
self.storage_path = None;
self.load_keys_from_storage()
}
pub fn load_from_path(mut self, path: PathBuf) -> Result<Self> {
self.storage_path = Some(path);
self.load_keys_from_storage()
}
fn load_keys_from_storage(&self) -> Result<Self> {
let storage = if let Some(path) = &self.storage_path {
KeyStorage::load_from_path(path)?
} else {
KeyStorage::load_default()?
};
for (did, stored_key) in storage.keys {
let secret = KeyStorage::to_secret(&stored_key);
if let Ok(mut secrets) = self.secrets.write() {
secrets.insert(did.clone(), secret.clone());
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
let key_type = stored_key.key_type;
let agent_key = LocalAgentKey::new(secret, key_type);
let key_id = AgentKey::key_id(&agent_key).to_string();
self.store_agent_key(&agent_key, &key_id)?;
}
Ok(self.clone())
}
fn add_key_internal(&self, key: &GeneratedKey, save_to_storage: bool) -> Result<()> {
let agent_key = self.agent_key_from_generated(key)?;
let key_id = AgentKey::key_id(&agent_key).to_string();
if let Ok(mut secrets) = self.secrets.write() {
secrets.insert(key.did.clone(), agent_key.clone().secret);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
self.store_agent_key(&agent_key, &key_id)?;
if save_to_storage {
self.save_to_storage()?;
}
Ok(())
}
pub fn add_key_without_save(&self, key: &GeneratedKey) -> Result<()> {
self.add_key_internal(key, false)
}
pub fn generate_key_without_save(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
self.generate_key_internal(options, false)
}
fn generate_key_internal(
&self,
options: DIDGenerationOptions,
save_to_storage: bool,
) -> Result<GeneratedKey> {
let key = self.generator.generate_did(options)?;
let agent_key = self.agent_key_from_generated(&key)?;
let key_id = AgentKey::key_id(&agent_key).to_string();
if let Ok(mut secrets) = self.secrets.write() {
secrets.insert(key.did.clone(), agent_key.clone().secret);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut generated_keys) = self.generated_keys.write() {
generated_keys.insert(key.did.clone(), key.clone());
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
self.store_agent_key(&agent_key, &key_id)?;
if save_to_storage {
self.save_to_storage()?;
}
Ok(key)
}
pub fn generate_web_did_without_save(
&self,
domain: &str,
options: DIDGenerationOptions,
) -> Result<GeneratedKey> {
self.generate_web_did_internal(domain, options, false)
}
fn generate_web_did_internal(
&self,
domain: &str,
options: DIDGenerationOptions,
save_to_storage: bool,
) -> Result<GeneratedKey> {
let key = self.generator.generate_web_did(domain, options)?;
let agent_key = self.agent_key_from_generated(&key)?;
let key_id = AgentKey::key_id(&agent_key).to_string();
if let Ok(mut secrets) = self.secrets.write() {
secrets.insert(key.did.clone(), agent_key.clone().secret);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut generated_keys) = self.generated_keys.write() {
generated_keys.insert(key.did.clone(), key.clone());
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
self.store_agent_key(&agent_key, &key_id)?;
if save_to_storage {
self.save_to_storage()?;
}
Ok(key)
}
}
impl Default for AgentKeyManager {
fn default() -> Self {
Self::new()
}
}
#[async_trait]
impl KeyManager for AgentKeyManager {
fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>> {
Arc::clone(&self.secrets)
}
fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, KeyType)> {
AgentKeyManager::get_private_key(self, did)
}
fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
self.generate_key_internal(options, true)
}
fn generate_web_did(
&self,
domain: &str,
options: DIDGenerationOptions,
) -> Result<GeneratedKey> {
self.generate_web_did_internal(domain, options, true)
}
fn add_key(&self, key: &GeneratedKey) -> Result<()> {
self.add_key_internal(key, true)
}
fn remove_key(&self, did: &str) -> Result<()> {
if let Ok(mut secrets) = self.secrets.write() {
secrets.remove(did);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut signing_keys) = self.signing_keys.write() {
signing_keys.retain(|k, _| !k.starts_with(did));
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut encryption_keys) = self.encryption_keys.write() {
encryption_keys.retain(|k, _| !k.starts_with(did));
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut decryption_keys) = self.decryption_keys.write() {
decryption_keys.retain(|k, _| !k.starts_with(did));
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut verification_keys) = self.verification_keys.write() {
verification_keys.retain(|k, _| !k.starts_with(did));
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
self.save_to_storage()?;
Ok(())
}
fn has_key(&self, did: &str) -> Result<bool> {
if let Ok(secrets) = self.secrets.read() {
if secrets.contains_key(did) {
return Ok(true);
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
if let Ok(signing_keys) = self.signing_keys.read() {
if signing_keys.values().any(|k| k.did() == did) {
return Ok(true);
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
Ok(false)
}
fn list_keys(&self) -> Result<Vec<String>> {
let mut dids = Vec::new();
if let Ok(secrets) = self.secrets.read() {
dids.extend(secrets.keys().cloned());
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
if let Ok(signing_keys) = self.signing_keys.read() {
for key in signing_keys.values() {
if !dids.contains(&key.did().to_string()) {
dids.push(key.did().to_string());
}
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
Ok(dids)
}
async fn add_signing_key(&self, key: Arc<dyn SigningKey + Send + Sync>) -> Result<()> {
if let Ok(mut signing_keys) = self.signing_keys.write() {
signing_keys.insert(key.key_id().to_string(), key);
Ok(())
} else {
Err(Error::FailedToAcquireResolverWriteLock)
}
}
async fn add_encryption_key(&self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Result<()> {
if let Ok(mut encryption_keys) = self.encryption_keys.write() {
encryption_keys.insert(key.key_id().to_string(), key);
Ok(())
} else {
Err(Error::FailedToAcquireResolverWriteLock)
}
}
async fn add_decryption_key(&self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Result<()> {
if let Ok(mut decryption_keys) = self.decryption_keys.write() {
decryption_keys.insert(key.key_id().to_string(), key);
Ok(())
} else {
Err(Error::FailedToAcquireResolverWriteLock)
}
}
async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
if let Ok(signing_keys) = self.signing_keys.read() {
if let Some(key) = signing_keys.get(kid) {
return Ok(key.clone());
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
if let Ok(secrets) = self.secrets.read() {
let did = kid.split('#').next().unwrap_or(kid);
if let Some(secret) = secrets.get(did) {
let key_type = match &secret.secret_material {
SecretMaterial::JWK { private_key_jwk } => {
let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
match (kty, crv) {
#[cfg(feature = "crypto-ed25519")]
(Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
#[cfg(feature = "crypto-p256")]
(Some("EC"), Some("P-256")) => KeyType::P256,
#[cfg(feature = "crypto-secp256k1")]
(Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
_ => KeyType::Ed25519, }
}
};
let agent_key = LocalAgentKey::new(secret.clone(), key_type);
if let Ok(mut signing_keys) = self.signing_keys.write() {
let arc_key = Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>;
signing_keys.insert(AgentKey::key_id(&agent_key).to_string(), arc_key.clone());
return Ok(arc_key);
}
}
}
Err(Error::Cryptography(format!(
"No signing key found with ID: {}",
kid
)))
}
async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
if let Ok(encryption_keys) = self.encryption_keys.read() {
if let Some(key) = encryption_keys.get(kid) {
return Ok(key.clone());
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
if let Ok(secrets) = self.secrets.read() {
let did = kid.split('#').next().unwrap_or(kid);
if let Some(secret) = secrets.get(did) {
let key_type = match &secret.secret_material {
SecretMaterial::JWK { private_key_jwk } => {
let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
match (kty, crv) {
#[cfg(feature = "crypto-ed25519")]
(Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
#[cfg(feature = "crypto-p256")]
(Some("EC"), Some("P-256")) => KeyType::P256,
#[cfg(feature = "crypto-secp256k1")]
(Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
_ => KeyType::Ed25519, }
}
};
let agent_key = LocalAgentKey::new(secret.clone(), key_type);
if let Ok(mut encryption_keys) = self.encryption_keys.write() {
let arc_key =
Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>;
encryption_keys
.insert(AgentKey::key_id(&agent_key).to_string(), arc_key.clone());
return Ok(arc_key);
}
}
}
Err(Error::Cryptography(format!(
"No encryption key found with ID: {}",
kid
)))
}
async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
if let Ok(decryption_keys) = self.decryption_keys.read() {
if let Some(key) = decryption_keys.get(kid) {
return Ok(key.clone());
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
if let Ok(secrets) = self.secrets.read() {
let did = kid.split('#').next().unwrap_or(kid);
if let Some(secret) = secrets.get(did) {
let key_type = match &secret.secret_material {
SecretMaterial::JWK { private_key_jwk } => {
let kty = private_key_jwk.get("kty").and_then(|v| v.as_str());
let crv = private_key_jwk.get("crv").and_then(|v| v.as_str());
match (kty, crv) {
#[cfg(feature = "crypto-ed25519")]
(Some("OKP"), Some("Ed25519")) => KeyType::Ed25519,
#[cfg(feature = "crypto-p256")]
(Some("EC"), Some("P-256")) => KeyType::P256,
#[cfg(feature = "crypto-secp256k1")]
(Some("EC"), Some("secp256k1")) => KeyType::Secp256k1,
_ => KeyType::Ed25519, }
}
};
let agent_key = LocalAgentKey::new(secret.clone(), key_type);
if let Ok(mut decryption_keys) = self.decryption_keys.write() {
let arc_key =
Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>;
decryption_keys
.insert(AgentKey::key_id(&agent_key).to_string(), arc_key.clone());
return Ok(arc_key);
}
}
}
Err(Error::Cryptography(format!(
"No decryption key found with ID: {}",
kid
)))
}
async fn resolve_verification_key(
&self,
kid: &str,
) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
if let Ok(verification_keys) = self.verification_keys.read() {
if let Some(key) = verification_keys.get(kid) {
return Ok(key.clone());
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
let signing_key = KeyManager::get_signing_key(self, kid).await;
if let Ok(key) = signing_key {
let public_jwk = key.public_key_jwk()?;
let verification_key = Arc::new(PublicVerificationKey::new(kid.to_string(), public_jwk))
as Arc<dyn VerificationKey + Send + Sync>;
if let Ok(mut verification_keys) = self.verification_keys.write() {
verification_keys.insert(kid.to_string(), verification_key.clone());
}
return Ok(verification_key);
}
let did = kid.split('#').next().unwrap_or(kid);
if did.starts_with("did:key:") {
let resolver = crate::did::KeyResolver::new();
#[cfg(not(target_arch = "wasm32"))]
let did_doc_result = {
use crate::did::DIDMethodResolver;
resolver.resolve_method(did).await
};
#[cfg(target_arch = "wasm32")]
let did_doc_result = {
use crate::did::WasmDIDMethodResolver;
resolver.resolve_method(did)
};
if let Ok(Some(did_doc)) = did_doc_result {
if let Some(vm) = did_doc.verification_method.iter().find(|vm| vm.id == kid) {
if let Ok(vk) = PublicVerificationKey::from_verification_material(
kid.to_string(),
&vm.verification_material,
) {
let verification_key =
Arc::new(vk) as Arc<dyn VerificationKey + Send + Sync>;
if let Ok(mut verification_keys) = self.verification_keys.write() {
verification_keys.insert(kid.to_string(), verification_key.clone());
}
return Ok(verification_key);
}
}
}
}
Err(Error::Cryptography(format!(
"No verification key found with ID: {}",
kid
)))
}
async fn sign_jws(
&self,
kid: &str,
payload: &[u8],
protected_header: Option<JwsProtected>,
) -> Result<String> {
let signing_key = KeyManager::get_signing_key(self, kid).await?;
let jws = signing_key
.create_jws(payload, protected_header)
.await
.map_err(|e| Error::Cryptography(e.to_string()))?;
serde_json::to_string(&jws).map_err(|e| Error::Serialization(e.to_string()))
}
async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
let jws: crate::message::Jws = serde_json::from_str(jws)
.map_err(|e| Error::Serialization(format!("Failed to parse JWS: {}", e)))?;
let signature = if let Some(kid) = expected_kid {
jws.signatures
.iter()
.find(|s| s.get_kid().as_deref() == Some(kid))
.ok_or_else(|| {
Error::Cryptography(format!("No signature found with kid: {}", kid))
})?
} else {
jws.signatures
.first()
.ok_or_else(|| Error::Cryptography("No signatures in JWS".to_string()))?
};
let protected = signature.get_protected_header().map_err(|e| {
Error::Cryptography(format!("Failed to decode protected header: {}", e))
})?;
let kid = signature
.get_kid()
.ok_or_else(|| Error::Cryptography("No kid found in JWS signature".to_string()))?;
let verification_key = KeyManager::resolve_verification_key(self, &kid).await?;
let signature_bytes = base64::engine::general_purpose::STANDARD
.decode(&signature.signature)
.map_err(|e| Error::Cryptography(format!("Failed to decode signature: {}", e)))?;
let signing_input = format!("{}.{}", signature.protected, jws.payload);
let verified = verification_key
.verify_signature(signing_input.as_bytes(), &signature_bytes, &protected)
.await
.map_err(|e| Error::Cryptography(e.to_string()))?;
if !verified {
return Err(Error::Cryptography(
"Signature verification failed".to_string(),
));
}
let payload_bytes = base64::engine::general_purpose::STANDARD
.decode(&jws.payload)
.map_err(|e| Error::Cryptography(format!("Failed to decode payload: {}", e)))?;
Ok(payload_bytes)
}
async fn encrypt_jwe(
&self,
sender_kid: &str,
recipient_kid: &str,
plaintext: &[u8],
protected_header: Option<JweProtected>,
) -> Result<String> {
let encryption_key = KeyManager::get_encryption_key(self, sender_kid).await?;
let recipient_key = KeyManager::resolve_verification_key(self, recipient_kid).await?;
let jwe = encryption_key
.create_jwe(plaintext, &[recipient_key], protected_header)
.await
.map_err(|e| Error::Cryptography(e.to_string()))?;
serde_json::to_string(&jwe).map_err(|e| Error::Serialization(e.to_string()))
}
async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>> {
let jwe: crate::message::Jwe = serde_json::from_str(jwe)
.map_err(|e| Error::Serialization(format!("Failed to parse JWE: {}", e)))?;
if let Some(kid) = expected_kid {
jwe.recipients
.iter()
.find(|r| r.header.kid == kid)
.ok_or_else(|| {
Error::Cryptography(format!("No recipient found with kid: {}", kid))
})?;
let decryption_key = KeyManager::get_decryption_key(self, kid).await?;
decryption_key
.unwrap_jwe(&jwe)
.await
.map_err(|e| Error::Cryptography(e.to_string()))
} else {
for recipient in &jwe.recipients {
if let Ok(decryption_key) =
KeyManager::get_decryption_key(self, &recipient.header.kid).await
{
if let Ok(plaintext) = decryption_key.unwrap_jwe(&jwe).await {
return Ok(plaintext);
}
}
}
Err(Error::Cryptography(
"Failed to decrypt JWE for any recipient".to_string(),
))
}
}
}
#[derive(Debug, Clone)]
pub struct AgentKeyManagerBuilder {
secrets: HashMap<String, Secret>,
signing_keys: HashMap<String, Arc<dyn SigningKey + Send + Sync>>,
encryption_keys: HashMap<String, Arc<dyn EncryptionKey + Send + Sync>>,
decryption_keys: HashMap<String, Arc<dyn DecryptionKey + Send + Sync>>,
verification_keys: HashMap<String, Arc<dyn VerificationKey + Send + Sync>>,
load_from_storage: bool,
storage_path: Option<PathBuf>,
}
impl Default for AgentKeyManagerBuilder {
fn default() -> Self {
Self::new()
}
}
impl AgentKeyManagerBuilder {
pub fn new() -> Self {
Self {
secrets: HashMap::new(),
signing_keys: HashMap::new(),
encryption_keys: HashMap::new(),
decryption_keys: HashMap::new(),
verification_keys: HashMap::new(),
load_from_storage: false,
storage_path: None,
}
}
pub fn load_from_default_storage(mut self) -> Self {
self.load_from_storage = true;
self.storage_path = None;
self
}
pub fn load_from_path(mut self, path: PathBuf) -> Self {
self.load_from_storage = true;
self.storage_path = Some(path);
self
}
pub fn add_secret(mut self, did: String, secret: Secret) -> Self {
self.secrets.insert(did, secret);
self
}
pub fn add_signing_key(mut self, key: Arc<dyn SigningKey + Send + Sync>) -> Self {
self.signing_keys.insert(key.key_id().to_string(), key);
self
}
pub fn add_encryption_key(mut self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Self {
self.encryption_keys.insert(key.key_id().to_string(), key);
self
}
pub fn add_decryption_key(mut self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Self {
self.decryption_keys.insert(key.key_id().to_string(), key);
self
}
pub fn add_verification_key(mut self, key: Arc<dyn VerificationKey + Send + Sync>) -> Self {
self.verification_keys.insert(key.key_id().to_string(), key);
self
}
pub fn build(self) -> Result<AgentKeyManager> {
let mut key_manager = AgentKeyManager {
generator: DIDKeyGenerator::new(),
secrets: Arc::new(RwLock::new(self.secrets)),
signing_keys: Arc::new(RwLock::new(self.signing_keys)),
encryption_keys: Arc::new(RwLock::new(self.encryption_keys)),
decryption_keys: Arc::new(RwLock::new(self.decryption_keys)),
verification_keys: Arc::new(RwLock::new(self.verification_keys)),
generated_keys: Arc::new(RwLock::new(HashMap::new())),
storage_path: self.storage_path.clone(),
};
if self.load_from_storage {
key_manager = if let Some(path) = self.storage_path {
key_manager.load_from_path(path)?
} else {
key_manager.load_from_default_storage()?
};
}
Ok(key_manager)
}
}
#[async_trait]
impl KeyManagerPacking for AgentKeyManager {
async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>> {
KeyManager::get_signing_key(self, kid)
.await
.map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
}
async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>> {
KeyManager::get_encryption_key(self, kid)
.await
.map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
}
async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>> {
KeyManager::get_decryption_key(self, kid)
.await
.map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
}
async fn resolve_verification_key(
&self,
kid: &str,
) -> Result<Arc<dyn VerificationKey + Send + Sync>> {
KeyManager::resolve_verification_key(self, kid)
.await
.map_err(|e| Error::from(MessageError::KeyManager(e.to_string())))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::agent::TapAgent;
use crate::did::{DIDGenerationOptions, KeyType};
use crate::key_manager::KeyManager;
#[test]
fn test_get_private_key_for_generated_key() {
let km = AgentKeyManager::new();
let key = km
.generate_key(DIDGenerationOptions {
key_type: KeyType::Ed25519,
})
.unwrap();
let (private_key, key_type) = km.get_private_key(&key.did).unwrap();
assert_eq!(private_key, key.private_key);
assert_eq!(key_type, KeyType::Ed25519);
}
#[test]
fn test_get_private_key_for_storage_loaded_key() {
let km = AgentKeyManager::new();
let key = km
.generate_key(DIDGenerationOptions {
key_type: KeyType::Ed25519,
})
.unwrap();
let km2 = AgentKeyManager::new();
let secret = km.secrets().read().unwrap().get(&key.did).cloned().unwrap();
km2.secrets()
.write()
.unwrap()
.insert(key.did.clone(), secret);
let (private_key, key_type) = km2.get_private_key(&key.did).unwrap();
assert_eq!(private_key, key.private_key);
assert_eq!(key_type, KeyType::Ed25519);
}
#[cfg(feature = "crypto-p256")]
#[test]
fn test_get_private_key_p256() {
let km = AgentKeyManager::new();
let key = km
.generate_key(DIDGenerationOptions {
key_type: KeyType::P256,
})
.unwrap();
let (private_key, key_type) = km.get_private_key(&key.did).unwrap();
assert_eq!(private_key, key.private_key);
assert_eq!(key_type, KeyType::P256);
}
#[cfg(feature = "crypto-secp256k1")]
#[test]
fn test_get_private_key_secp256k1() {
let km = AgentKeyManager::new();
let key = km
.generate_key(DIDGenerationOptions {
key_type: KeyType::Secp256k1,
})
.unwrap();
let (private_key, key_type) = km.get_private_key(&key.did).unwrap();
assert_eq!(private_key, key.private_key);
assert_eq!(key_type, KeyType::Secp256k1);
}
#[test]
fn test_get_private_key_unknown_did() {
let km = AgentKeyManager::new();
let result = km.get_private_key("did:key:nonexistent");
assert!(result.is_err());
match result.unwrap_err() {
Error::KeyNotFound(_) => {} other => panic!("Expected KeyNotFound, got: {:?}", other),
}
}
#[tokio::test]
async fn test_get_private_key_roundtrip() {
let km = AgentKeyManager::new();
let key = km
.generate_key(DIDGenerationOptions {
key_type: KeyType::Ed25519,
})
.unwrap();
let (private_key, key_type) = km.get_private_key(&key.did).unwrap();
let (_agent, new_did) = TapAgent::from_private_key(&private_key, key_type, false)
.await
.unwrap();
assert_eq!(new_did, key.did);
}
}