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}