key_resolver/
lib.rs

1use common::{KeyPair, VerificationKey};
2use did::DidDocument;
3use fi_common::error::Error;
4
5pub mod common;
6pub mod did;
7pub mod ed25519_verification_key2018;
8pub mod ed25519_verification_key2020;
9mod util;
10pub mod x25519_key_agreement_key2019;
11pub mod x25519_key_agreement_key2020;
12
13pub fn resolve_did(
14    did: &str,
15    suit_id: &str,
16) -> Result<(Option<DidDocument>, Option<KeyPair>), Error> {
17    let splitted_did: Vec<&str> = did.split('#').collect();
18    let did_authority = splitted_did[0];
19
20    let fingerprint = &did_authority["did:key:".len()..];
21    let verification_key_pair: Box<dyn VerificationKey> = match suit_id {
22        ed25519_verification_key2018::SUITE_ID => {
23            match ed25519_verification_key2018::Ed25519VerificationKey2018::from_fingerprint(
24                fingerprint,
25            ) {
26                Ok(val) => Box::new(val),
27                Err(error) => {
28                    return Err(error);
29                }
30            }
31        }
32        ed25519_verification_key2020::SUITE_ID => {
33            match ed25519_verification_key2020::Ed25519VerificationKey2020::from_fingerprint(
34                fingerprint,
35            ) {
36                Ok(val) => Box::new(val),
37                Err(error) => {
38                    return Err(error);
39                }
40            }
41        }
42        _ => {
43            return Err(Error::new(
44                format!(
45                    "Cannot derive key verification key from suite id {}",
46                    suit_id
47                )
48                .as_str(),
49            ))
50        }
51    };
52
53    let did_doc = match DidDocument::key_pair_to_did_doc(&verification_key_pair, fingerprint) {
54        Ok(val) => val,
55        Err(error) => return Err(error),
56    };
57
58    if splitted_did.len() > 1 {
59        let key_id_fragment = splitted_did[1];
60        let key = match did_doc.get_key(key_id_fragment) {
61            Ok(val) => val,
62            Err(error) => return Err(error),
63        };
64
65        return Ok((None, Some(key)));
66    }
67
68    return Ok((Some(did_doc), None));
69}