1use parser::DidKeyParser;
4use xdid_core::{
5 Method,
6 MethodFuture,
7 ResolutionError,
8 did::Did,
9 did_url::url::DidUrl,
10 document::{
11 Document,
12 VerificationMethod,
13 VerificationMethodMap,
14 },
15};
16
17pub mod keys;
18mod parser;
19
20const NAME: &str = "key";
21
22pub struct MethodDidKey;
23
24impl Method for MethodDidKey {
25 fn method_name(&self) -> &'static str {
26 NAME
27 }
28
29 fn resolve(&self, did: Did) -> MethodFuture<Result<Document, ResolutionError>> {
30 Box::pin(async move { resolve_inner(did) })
31 }
32}
33
34fn resolve_inner(did: Did) -> Result<Document, ResolutionError> {
35 if did.method_name.as_str() != NAME {
36 return Err(ResolutionError::InvalidDid);
37 }
38
39 let parser = DidKeyParser::default();
40 let did_key = parser
41 .parse(&did)
42 .map_err(|_| ResolutionError::InvalidDid)?;
43
44 let did_url = DidUrl::new(did.clone(), None, None, Some(did.method_id.as_str().into()))
45 .map_err(|_| ResolutionError::InvalidDid)?;
46
47 Ok(Document {
48 context: None,
49 id: did.clone(),
50 also_known_as: None,
51 controller: None,
52 verification_method: Some(vec![VerificationMethodMap {
53 id: did_url.clone(),
54 typ: "JsonWebKey2020".into(),
55 controller: did,
56 public_key_jwk: Some(did_key.to_jwk()),
57 public_key_multibase: None,
58 }]),
59 authentication: Some(vec![VerificationMethod::Url(did_url.clone())]),
60 assertion_method: Some(vec![VerificationMethod::Url(did_url.clone())]),
61 capability_invocation: Some(vec![VerificationMethod::Url(did_url.clone())]),
62 capability_delegation: Some(vec![VerificationMethod::Url(did_url)]),
63 service: None,
64 key_agreement: None,
65 })
66}