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,
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}