use crate::agent_key::{AgentKey, DecryptionKey, EncryptionKey, SigningKey, VerificationKey};
use crate::did::{DIDGenerationOptions, DIDKeyGenerator, GeneratedKey};
use crate::error::{Error, Result};
use crate::local_agent_key::{LocalAgentKey, PublicVerificationKey};
use crate::message_packing::{KeyManagerPacking, MessageError};
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
use std::sync::{Arc, RwLock};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "camelCase")]
pub enum SecretType {
JsonWebKey2020,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(untagged)]
pub enum SecretMaterial {
JWK {
private_key_jwk: Value,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Secret {
pub id: String,
pub type_: SecretType,
pub secret_material: SecretMaterial,
}
#[async_trait]
pub trait KeyManager: Send + Sync + std::fmt::Debug + 'static {
fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>>;
fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey>;
fn generate_web_did(&self, domain: &str, options: DIDGenerationOptions)
-> Result<GeneratedKey>;
fn add_key(&self, key: &GeneratedKey) -> Result<()>;
fn remove_key(&self, did: &str) -> Result<()>;
fn has_key(&self, did: &str) -> Result<bool>;
fn list_keys(&self) -> Result<Vec<String>>;
fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, crate::did::KeyType)>;
async fn add_signing_key(&self, key: Arc<dyn SigningKey + Send + Sync>) -> Result<()>;
async fn add_encryption_key(&self, key: Arc<dyn EncryptionKey + Send + Sync>) -> Result<()>;
async fn add_decryption_key(&self, key: Arc<dyn DecryptionKey + Send + Sync>) -> Result<()>;
async fn get_signing_key(&self, kid: &str) -> Result<Arc<dyn SigningKey + Send + Sync>>;
async fn get_encryption_key(&self, kid: &str) -> Result<Arc<dyn EncryptionKey + Send + Sync>>;
async fn get_decryption_key(&self, kid: &str) -> Result<Arc<dyn DecryptionKey + Send + Sync>>;
async fn resolve_verification_key(
&self,
kid: &str,
) -> Result<Arc<dyn VerificationKey + Send + Sync>>;
async fn sign_jws(
&self,
kid: &str,
payload: &[u8],
protected_header: Option<crate::message::JwsProtected>,
) -> Result<String>;
async fn verify_jws(&self, jws: &str, expected_kid: Option<&str>) -> Result<Vec<u8>>;
async fn encrypt_jwe(
&self,
sender_kid: &str,
recipient_kid: &str,
plaintext: &[u8],
protected_header: Option<crate::message::JweProtected>,
) -> Result<String>;
async fn decrypt_jwe(&self, jwe: &str, expected_kid: Option<&str>) -> Result<Vec<u8>>;
}
pub fn extract_private_key_from_secret(secret: &Secret) -> Result<(Vec<u8>, crate::did::KeyType)> {
match &secret.secret_material {
SecretMaterial::JWK { private_key_jwk } => {
let d = private_key_jwk
.get("d")
.and_then(|v| v.as_str())
.ok_or_else(|| {
Error::KeyNotFound("Secret JWK missing 'd' parameter".to_string())
})?;
let private_key = base64::Engine::decode(&base64::engine::general_purpose::STANDARD, d)
.map_err(|e| {
Error::Cryptography(format!("Failed to decode private key from JWK: {}", e))
})?;
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());
let key_type = match (kty, crv) {
#[cfg(feature = "crypto-ed25519")]
(Some("OKP"), Some("Ed25519")) => crate::did::KeyType::Ed25519,
#[cfg(feature = "crypto-p256")]
(Some("EC"), Some("P-256")) => crate::did::KeyType::P256,
#[cfg(feature = "crypto-secp256k1")]
(Some("EC"), Some("secp256k1")) => crate::did::KeyType::Secp256k1,
_ => {
return Err(Error::KeyNotFound(format!(
"Unsupported key type: kty={:?}, crv={:?}",
kty, crv
)))
}
};
Ok((private_key, key_type))
}
}
}
#[derive(Debug, Clone)]
pub struct DefaultKeyManager {
pub generator: DIDKeyGenerator,
pub 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>>>>,
}
impl DefaultKeyManager {
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())),
}
}
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))
}
}
impl Default for DefaultKeyManager {
fn default() -> Self {
Self::new()
}
}
#[async_trait]
impl KeyManager for DefaultKeyManager {
fn secrets(&self) -> Arc<RwLock<HashMap<String, Secret>>> {
Arc::clone(&self.secrets)
}
fn get_private_key(&self, did: &str) -> Result<(Vec<u8>, crate::did::KeyType)> {
if let Ok(secrets) = self.secrets.read() {
if let Some(secret) = secrets.get(did) {
return extract_private_key_from_secret(secret);
}
} else {
return Err(Error::FailedToAcquireResolverReadLock);
}
Err(Error::KeyNotFound(format!(
"Private key not found for DID: {}",
did
)))
}
fn generate_key(&self, options: DIDGenerationOptions) -> Result<GeneratedKey> {
let key = self.generator.generate_did(options)?;
let agent_key = self.agent_key_from_generated(&key)?;
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 signing_keys) = self.signing_keys.write() {
signing_keys.insert(
AgentKey::key_id(&agent_key).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(
AgentKey::key_id(&agent_key).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(
AgentKey::key_id(&agent_key).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(
AgentKey::key_id(&agent_key).to_string(),
Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
Ok(key)
}
fn generate_web_did(
&self,
domain: &str,
options: DIDGenerationOptions,
) -> Result<GeneratedKey> {
let key = self.generator.generate_web_did(domain, options)?;
let agent_key = self.agent_key_from_generated(&key)?;
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 signing_keys) = self.signing_keys.write() {
signing_keys.insert(
AgentKey::key_id(&agent_key).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(
AgentKey::key_id(&agent_key).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(
AgentKey::key_id(&agent_key).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(
AgentKey::key_id(&agent_key).to_string(),
Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
Ok(key)
}
fn add_key(&self, key: &GeneratedKey) -> Result<()> {
let agent_key = self.agent_key_from_generated(key)?;
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 signing_keys) = self.signing_keys.write() {
signing_keys.insert(
AgentKey::key_id(&agent_key).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(
AgentKey::key_id(&agent_key).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(
AgentKey::key_id(&agent_key).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(
AgentKey::key_id(&agent_key).to_string(),
Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
Ok(())
}
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);
}
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 = crate::did::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>;
let agent_kid = AgentKey::key_id(&agent_key).to_string();
signing_keys.insert(agent_kid.clone(), arc_key.clone());
if agent_kid != kid {
signing_keys.insert(kid.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 = crate::did::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>;
let agent_kid = AgentKey::key_id(&agent_key).to_string();
encryption_keys.insert(agent_kid.clone(), arc_key.clone());
if agent_kid != kid {
encryption_keys.insert(kid.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 = crate::did::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>;
let agent_kid = AgentKey::key_id(&agent_key).to_string();
decryption_keys.insert(agent_kid.clone(), arc_key.clone());
if agent_kid != kid {
decryption_keys.insert(kid.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<crate::message::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 = crate::message::base64_decode_flexible(&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 = crate::message::base64_decode_flexible(&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<crate::message::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(),
))
}
}
}
#[async_trait]
impl KeyManagerPacking for DefaultKeyManager {
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())))
}
}
#[derive(Debug, Clone)]
pub struct KeyManagerBuilder {
generator: DIDKeyGenerator,
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<std::path::PathBuf>,
}
impl Default for KeyManagerBuilder {
fn default() -> Self {
Self::new()
}
}
impl KeyManagerBuilder {
pub fn new() -> Self {
Self {
generator: DIDKeyGenerator::new(),
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: std::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 with_auto_generated_ed25519_key(self, kid: &str) -> Result<Self> {
let local_key = LocalAgentKey::generate_ed25519(kid)?;
let arc_key = Arc::new(local_key.clone());
let builder = self
.add_signing_key(arc_key.clone() as Arc<dyn SigningKey + Send + Sync>)
.add_encryption_key(arc_key.clone() as Arc<dyn EncryptionKey + Send + Sync>)
.add_decryption_key(arc_key.clone() as Arc<dyn DecryptionKey + Send + Sync>)
.add_verification_key(arc_key as Arc<dyn VerificationKey + Send + Sync>);
let builder = builder.add_secret(local_key.did().to_string(), local_key.secret.clone());
Ok(builder)
}
pub fn build(self) -> Result<DefaultKeyManager> {
let key_manager = DefaultKeyManager {
generator: self.generator,
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)),
};
if self.load_from_storage {
use crate::storage::KeyStorage;
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) = key_manager.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);
if let Ok(mut signing_keys) = key_manager.signing_keys.write() {
signing_keys.insert(
AgentKey::key_id(&agent_key).to_string(),
Arc::new(agent_key.clone()) as Arc<dyn SigningKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut encryption_keys) = key_manager.encryption_keys.write() {
encryption_keys.insert(
AgentKey::key_id(&agent_key).to_string(),
Arc::new(agent_key.clone()) as Arc<dyn EncryptionKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut decryption_keys) = key_manager.decryption_keys.write() {
decryption_keys.insert(
AgentKey::key_id(&agent_key).to_string(),
Arc::new(agent_key.clone()) as Arc<dyn DecryptionKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
if let Ok(mut verification_keys) = key_manager.verification_keys.write() {
verification_keys.insert(
AgentKey::key_id(&agent_key).to_string(),
Arc::new(agent_key.clone()) as Arc<dyn VerificationKey + Send + Sync>,
);
} else {
return Err(Error::FailedToAcquireResolverWriteLock);
}
}
}
Ok(key_manager)
}
}
#[derive(Debug, Clone)]
pub struct SecretAccessor {
secrets: Arc<RwLock<HashMap<String, Secret>>>,
}
impl SecretAccessor {
pub fn new(key_manager: Arc<dyn KeyManager>) -> Self {
Self {
secrets: key_manager.secrets(),
}
}
pub fn new_from_secrets(secrets: Arc<RwLock<HashMap<String, Secret>>>) -> Self {
Self { secrets }
}
pub fn get_secret_by_id(&self, secret_id: &str) -> Option<Secret> {
if let Ok(secrets) = self.secrets.read() {
if let Some(secret) = secrets.get(secret_id) {
return Some(secret.clone());
}
}
None
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_key_manager() {
let manager = DefaultKeyManager::new();
let options = crate::did::DIDGenerationOptions {
key_type: crate::did::KeyType::Ed25519,
};
let key = manager.generate_key(options).unwrap();
assert!(manager.has_key(&key.did).unwrap());
let keys = manager.list_keys().unwrap();
assert_eq!(keys.len(), 1);
assert_eq!(keys[0], key.did);
manager.remove_key(&key.did).unwrap();
assert!(!manager.has_key(&key.did).unwrap());
manager.add_key(&key).unwrap();
assert!(manager.has_key(&key.did).unwrap());
}
#[tokio::test]
async fn test_agent_key_operations() {
let manager = DefaultKeyManager::new();
let ed25519_key = manager
.generate_key(DIDGenerationOptions {
key_type: crate::did::KeyType::Ed25519,
})
.unwrap();
let test_data = b"Hello, world!";
let ed25519_kid = format!("{}#keys-1", ed25519_key.did);
let signing_key = KeyManager::get_signing_key(&manager, &ed25519_kid)
.await
.unwrap();
assert!(signing_key.key_id().contains(ed25519_key.did.as_str()));
assert!(signing_key.did().contains(&ed25519_key.did));
let jws = signing_key.create_jws(test_data, None).await.unwrap();
assert!(jws.signatures.len() == 1);
assert!(jws.signatures[0]
.get_kid()
.unwrap()
.contains(ed25519_key.did.as_str()));
let protected_header = jws.signatures[0].get_protected_header().unwrap();
assert!(
!protected_header.kid.is_empty(),
"kid should be in protected header"
);
assert_eq!(&protected_header.kid, &jws.signatures[0].get_kid().unwrap());
}
#[test]
fn test_web_did_generation() {
let manager = DefaultKeyManager::new();
let domain = "example.com";
let options = DIDGenerationOptions {
key_type: crate::did::KeyType::Ed25519,
};
let key = manager.generate_web_did(domain, options).unwrap();
assert!(manager.has_key(&key.did).unwrap());
assert_eq!(key.did, format!("did:web:{}", domain));
}
#[tokio::test]
async fn test_jws_operations() {
let manager = DefaultKeyManager::new();
let options = crate::did::DIDGenerationOptions {
key_type: crate::did::KeyType::Ed25519,
};
let key = manager.generate_key(options).unwrap();
let key_part = &key.did["did:key:".len()..];
let kid = format!("{}#{}", key.did, key_part);
let test_data = b"Hello, world!";
let jws = manager.sign_jws(&kid, test_data, None).await.unwrap();
let payload = manager.verify_jws(&jws, Some(&kid)).await.unwrap();
assert_eq!(payload, test_data);
let payload = manager.verify_jws(&jws, None).await.unwrap();
assert_eq!(payload, test_data);
}
#[tokio::test]
#[cfg(feature = "crypto-p256")]
async fn test_jwe_operations() {
let manager = DefaultKeyManager::new();
let options = crate::did::DIDGenerationOptions {
key_type: crate::did::KeyType::P256,
};
let sender_key = manager.generate_key(options.clone()).unwrap();
let sender_part = &sender_key.did["did:key:".len()..];
let sender_kid = format!("{}#{}", sender_key.did, sender_part);
let recipient_key = manager.generate_key(options).unwrap();
let recipient_part = &recipient_key.did["did:key:".len()..];
let recipient_kid = format!("{}#{}", recipient_key.did, recipient_part);
let test_data = b"Hello, world!";
let jwe = manager
.encrypt_jwe(&sender_kid, &recipient_kid, test_data, None)
.await
.unwrap();
let plaintext = manager
.decrypt_jwe(&jwe, Some(&recipient_kid))
.await
.unwrap();
assert_eq!(plaintext, test_data);
}
}