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