Skip to main content

xdid_method_key/
lib.rs

1//! [xdid](https://github.com/unavi-xyz/xdid) implementation of [did:key](https://w3c-ccg.github.io/did-method-key/).
2
3use 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}