use affinidi_data_integrity::{
DataIntegrityError, DataIntegrityProof, DidKeyResolver, ResolvedKey, SignOptions,
VerificationMethodResolver, VerifyOptions,
};
use affinidi_secrets_resolver::secrets::Secret;
use async_trait::async_trait;
use serde_json::json;
use std::collections::HashMap;
use std::sync::Mutex;
#[derive(Default)]
pub struct MapResolver {
entries: Mutex<HashMap<String, ResolvedKey>>,
}
impl MapResolver {
pub fn new() -> Self {
Self::default()
}
pub fn insert(&self, vm: String, key: ResolvedKey) {
self.entries.lock().unwrap().insert(vm, key);
}
}
#[async_trait]
impl VerificationMethodResolver for MapResolver {
async fn resolve_vm(&self, vm: &str) -> Result<ResolvedKey, DataIntegrityError> {
if let Some(hit) = self.entries.lock().unwrap().get(vm) {
return Ok(hit.clone());
}
DidKeyResolver.resolve_vm(vm).await
}
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut secret = Secret::generate_ed25519(None, Some(&[9u8; 32]));
let pk_mb = secret.get_public_keymultibase()?;
let vm = "did:web:example.com#key-0".to_string();
secret.id = vm.clone();
let resolver = MapResolver::new();
resolver.insert(
vm.clone(),
ResolvedKey::new(
affinidi_secrets_resolver::secrets::KeyType::Ed25519,
secret.get_public_bytes().to_vec(),
),
);
let doc = json!({"hello": "custom-resolver"});
let proof = DataIntegrityProof::sign(&doc, &secret, SignOptions::new()).await?;
proof.verify(&doc, &resolver, VerifyOptions::new()).await?;
println!("Verified via custom MapResolver (registered did:web entry).");
let did_key_secret =
build_did_key_signer(Secret::generate_ed25519(None, Some(&[42u8; 32])), &pk_mb)?;
let doc2 = json!({"hello": "did-key-fallback"});
let proof2 = DataIntegrityProof::sign(&doc2, &did_key_secret, SignOptions::new()).await?;
proof2
.verify(&doc2, &resolver, VerifyOptions::new())
.await?;
println!("Verified a did:key proof via the same resolver (fallback to DidKeyResolver).");
Ok(())
}
fn build_did_key_signer(mut s: Secret, _hint: &str) -> Result<Secret, Box<dyn std::error::Error>> {
let pk_mb = s.get_public_keymultibase()?;
s.id = format!("did:key:{pk_mb}#{pk_mb}");
Ok(s)
}