Skip to content

Commit

Permalink
Make PeerDid generic over numalgo (#887)
Browse files Browse the repository at this point in the history
Make PeerDid generic over numalgo (#887)

Signed-off-by: Miroslav Kovar <[email protected]>
  • Loading branch information
mirgee authored Jul 3, 2023
1 parent 21dfe9b commit c49c1ab
Show file tree
Hide file tree
Showing 24 changed files with 639 additions and 268 deletions.
4 changes: 2 additions & 2 deletions did_peer/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use std::convert::Infallible;
use did_doc::schema::verification_method::VerificationMethodType;
use thiserror::Error;

use crate::peer_did::Numalgo;
use crate::peer_did::numalgos::NumalgoKind;

#[derive(Debug, Error)]
pub enum DidPeerError {
Expand All @@ -20,7 +20,7 @@ pub enum DidPeerError {
#[error("Sovrin DID document builder error: {0}")]
DidDocumentSovBuilderError(#[from] did_doc_sov::error::DidDocumentSovError),
#[error("Unsupported numalgo: {0}")]
UnsupportedNumalgo(Numalgo),
UnsupportedNumalgo(NumalgoKind),
#[error("Invalid numalgo character: {0}")]
InvalidNumalgoCharacter(char),
#[error("Unsupported purpose character: {0}")]
Expand Down
12 changes: 6 additions & 6 deletions did_peer/src/key/verification_method.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use super::{Key, KeyType};
pub fn get_verification_methods_by_key(
key: &Key,
did: &Did,
public_key_encoding: &PublicKeyEncoding,
public_key_encoding: PublicKeyEncoding,
) -> Result<Vec<VerificationMethod>, DidPeerError> {
let id = to_did_url_reference(key)?;
let vm_type = match key.key_type() {
Expand Down Expand Up @@ -59,7 +59,7 @@ fn build_verification_methods_from_type_and_key(
key: &Key,
id: DidUrl,
did: Did,
public_key_encoding: &PublicKeyEncoding,
public_key_encoding: PublicKeyEncoding,
) -> Vec<VerificationMethod> {
vec![add_public_key_to_builder(
VerificationMethod::builder(id, did, vm_type),
Expand All @@ -72,7 +72,7 @@ fn build_verification_methods_from_bls_multikey(
g1_key: &Key,
g2_key: &Key,
did: Did,
public_key_encoding: &PublicKeyEncoding,
public_key_encoding: PublicKeyEncoding,
) -> Vec<VerificationMethod> {
let id1 = to_did_url_reference(g1_key).unwrap();
let id2 = to_did_url_reference(g2_key).unwrap();
Expand All @@ -97,7 +97,7 @@ fn build_verification_methods_from_bls_multikey(
fn add_public_key_to_builder(
builder: IncompleteVerificationMethodBuilder,
key: &Key,
public_key_encoding: &PublicKeyEncoding,
public_key_encoding: PublicKeyEncoding,
) -> VerificationMethod {
match public_key_encoding {
PublicKeyEncoding::Base58 => builder.add_public_key_base58(key.base58()).build(),
Expand Down Expand Up @@ -157,7 +157,7 @@ mod tests {

// Multibase encoded keys are multicodec-prefixed by their encoding type ...
fn test_get_verification_methods_by_key_multibase(key: &Key) {
let vms = get_verification_methods_by_key(key, &did(), &PublicKeyEncoding::Multibase).unwrap();
let vms = get_verification_methods_by_key(key, &did(), PublicKeyEncoding::Multibase).unwrap();
assert_eq!(vms.len(), 1);
assert_eq!(
vms[0].public_key().key_decoded().unwrap(),
Expand All @@ -168,7 +168,7 @@ mod tests {

// ... and base58 encoded keys are not
fn test_get_verification_methods_by_key_base58(key: &Key) {
let vms = get_verification_methods_by_key(key, &did(), &PublicKeyEncoding::Base58).unwrap();
let vms = get_verification_methods_by_key(key, &did(), PublicKeyEncoding::Base58).unwrap();
assert_eq!(vms.len(), 1);
assert_ne!(
vms[0].public_key().key_decoded().unwrap(),
Expand Down
9 changes: 6 additions & 3 deletions did_peer/src/numalgos/numalgo2/generate/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,18 @@ mod helpers;
use did_doc::schema::did_doc::DidDocument;
use did_doc_sov::extra_fields::ExtraFieldsSov;

use crate::{error::DidPeerError, peer_did::PeerDid};
use crate::{
error::DidPeerError,
peer_did::{numalgos::numalgo2::Numalgo2, peer_did::PeerDid},
};

use self::helpers::{append_encoded_key_segments, append_encoded_service_segment};

pub fn generate_numalgo2(did_document: DidDocument<ExtraFieldsSov>) -> Result<PeerDid, DidPeerError> {
pub fn generate_numalgo2(did_document: DidDocument<ExtraFieldsSov>) -> Result<PeerDid<Numalgo2>, DidPeerError> {
let mut did = String::from("did:peer:2");

did = append_encoded_key_segments(did, &did_document)?;
did = append_encoded_service_segment(did, &did_document)?;

PeerDid::parse(did)
PeerDid::<Numalgo2>::parse(did)
}
16 changes: 8 additions & 8 deletions did_peer/src/numalgos/numalgo2/resolve/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ use crate::{
pub fn process_elements(
mut did_doc_builder: DidDocumentBuilder<ExtraFieldsSov>,
did: &Did,
public_key_encoding: &PublicKeyEncoding,
public_key_encoding: PublicKeyEncoding,
) -> Result<DidDocumentBuilder<ExtraFieldsSov>, DidPeerError> {
let mut service_index: usize = 0;

Expand All @@ -30,7 +30,7 @@ fn process_element(
mut did_doc_builder: DidDocumentBuilder<ExtraFieldsSov>,
service_index: &mut usize,
did: &Did,
public_key_encoding: &PublicKeyEncoding,
public_key_encoding: PublicKeyEncoding,
) -> Result<DidDocumentBuilder<ExtraFieldsSov>, DidPeerError> {
let purpose: ElementPurpose = element
.chars()
Expand Down Expand Up @@ -80,7 +80,7 @@ fn process_key_element(
element: &str,
mut did_doc_builder: DidDocumentBuilder<ExtraFieldsSov>,
did: &Did,
public_key_encoding: &PublicKeyEncoding,
public_key_encoding: PublicKeyEncoding,
purpose: ElementPurpose,
) -> Result<DidDocumentBuilder<ExtraFieldsSov>, DidPeerError> {
let key = Key::from_fingerprint(&element)?;
Expand Down Expand Up @@ -164,7 +164,7 @@ mod tests {
let built_ddo = process_elements(
DidDocumentBuilder::<ExtraFieldsSov>::new(did.clone()),
&did,
&PublicKeyEncoding::Base58,
PublicKeyEncoding::Base58,
)
.unwrap()
.build();
Expand All @@ -182,7 +182,7 @@ mod tests {
let processed_did_doc_builder = process_elements(
DidDocumentBuilder::<ExtraFieldsSov>::new(did.clone()),
&did,
&PublicKeyEncoding::Multibase,
PublicKeyEncoding::Multibase,
)
.unwrap();
let built_ddo = processed_did_doc_builder.build();
Expand All @@ -204,7 +204,7 @@ mod tests {
match process_elements(
DidDocumentBuilder::<ExtraFieldsSov>::new(did.clone()),
&did,
&PublicKeyEncoding::Multibase,
PublicKeyEncoding::Multibase,
) {
Ok(_) => panic!("Expected Err, got Ok"),
Err(e) => {
Expand Down Expand Up @@ -288,7 +288,7 @@ mod tests {
purposeless_key_element,
ddo_builder,
&did,
&public_key_encoding,
public_key_encoding,
ElementPurpose::Verification,
)
.unwrap()
Expand All @@ -307,7 +307,7 @@ mod tests {
"z6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V",
DidDocumentBuilder::<ExtraFieldsSov>::new(did.clone()),
&did,
&PublicKeyEncoding::Multibase,
PublicKeyEncoding::Multibase,
ElementPurpose::Service
)
.is_err());
Expand Down
2 changes: 1 addition & 1 deletion did_peer/src/numalgos/numalgo2/resolve/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ use self::helpers::process_elements;

pub fn resolve_numalgo2(
did: &Did,
public_key_encoding: &PublicKeyEncoding,
public_key_encoding: PublicKeyEncoding,
) -> Result<DidDocument<ExtraFieldsSov>, DidPeerError> {
let mut did_doc_builder: DidDocumentBuilder<ExtraFieldsSov> = DidDocument::builder(did.to_owned());

Expand Down
17 changes: 11 additions & 6 deletions did_peer/src/numalgos/numalgo3/generate.rs
Original file line number Diff line number Diff line change
@@ -1,28 +1,33 @@
use did_parser::Did;
use sha256::digest;

use crate::{error::DidPeerError, peer_did::PeerDid};
use crate::{
error::DidPeerError,
peer_did::{numalgos::numalgo3::Numalgo3, peer_did::PeerDid},
};

pub fn generate_numalgo3(did: &Did) -> Result<PeerDid, DidPeerError> {
pub fn generate_numalgo3(did: &Did) -> Result<PeerDid<Numalgo3>, DidPeerError> {
let numalgoless_id = did.id().chars().skip(2).collect::<String>();
let numalgoless_id_hashed = digest(numalgoless_id);
PeerDid::parse(format!("did:peer:3.{}", numalgoless_id_hashed))
PeerDid::<Numalgo3>::parse(format!("did:peer:3.{}", numalgoless_id_hashed))
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn test_shorten() {
fn test_generate_numalgo3() {
let peer_did_2 = Did::parse("did:peer:2\
.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc\
.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V\
.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg\
.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0".to_string()).unwrap();
assert_eq!(
PeerDid::parse("did:peer:3.0e857e93798921e83cfc2ef8bee9cafc25f15f4c9c7bee5ed9a9c62b56a62cca".to_string())
.unwrap(),
PeerDid::<Numalgo3>::parse(
"did:peer:3.0e857e93798921e83cfc2ef8bee9cafc25f15f4c9c7bee5ed9a9c62b56a62cca".to_string()
)
.unwrap(),
generate_numalgo3(&peer_did_2).unwrap()
);
}
Expand Down
16 changes: 16 additions & 0 deletions did_peer/src/peer_did/generate.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
use crate::{error::DidPeerError, numalgos::numalgo2, numalgos::numalgo3};
use did_doc::schema::did_doc::DidDocument;
use did_doc_sov::extra_fields::ExtraFieldsSov;

use super::{
numalgos::{numalgo2::Numalgo2, numalgo3::Numalgo3},
peer_did::PeerDid,
};

pub fn generate_numalgo2(did_document: DidDocument<ExtraFieldsSov>) -> Result<PeerDid<Numalgo2>, DidPeerError> {
numalgo2::generate_numalgo2(did_document)
}

pub fn generate_numalgo3(did_document: DidDocument<ExtraFieldsSov>) -> Result<PeerDid<Numalgo3>, DidPeerError> {
numalgo3::generate_numalgo3(generate_numalgo2(did_document)?.did())
}
12 changes: 6 additions & 6 deletions did_peer/src/peer_did/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
mod numalgo;
mod peer_did;
mod regex;
mod transform;
pub mod generate;
pub mod numalgos;
pub mod peer_did;

pub use numalgo::Numalgo;
pub use peer_did::PeerDid;
mod parse;
mod regex;
mod validate;
36 changes: 0 additions & 36 deletions did_peer/src/peer_did/numalgo.rs

This file was deleted.

50 changes: 50 additions & 0 deletions did_peer/src/peer_did/numalgos/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
pub mod numalgo0;
pub mod numalgo1;
pub mod numalgo2;
pub mod numalgo3;

pub(super) mod traits;

use std::fmt::Display;

use numalgo0::Numalgo0;
use numalgo1::Numalgo1;
use numalgo2::Numalgo2;
use numalgo3::Numalgo3;

use crate::error::DidPeerError;

use self::traits::Numalgo;

#[derive(Clone, Copy, Debug, PartialEq)]
pub enum NumalgoKind {
InceptionKeyWithoutDoc(Numalgo0),
GenesisDoc(Numalgo1),
MultipleInceptionKeys(Numalgo2),
DidShortening(Numalgo3),
}

impl Display for NumalgoKind {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
NumalgoKind::InceptionKeyWithoutDoc(_) => Numalgo0::NUMALGO_CHAR.fmt(f),
NumalgoKind::GenesisDoc(_) => Numalgo1::NUMALGO_CHAR.fmt(f),
NumalgoKind::MultipleInceptionKeys(_) => Numalgo2::NUMALGO_CHAR.fmt(f),
NumalgoKind::DidShortening(_) => Numalgo3::NUMALGO_CHAR.fmt(f),
}
}
}

impl TryFrom<char> for NumalgoKind {
type Error = DidPeerError;

fn try_from(value: char) -> Result<Self, Self::Error> {
match value {
Numalgo0::NUMALGO_CHAR => Ok(NumalgoKind::InceptionKeyWithoutDoc(Numalgo0)),
Numalgo1::NUMALGO_CHAR => Ok(NumalgoKind::GenesisDoc(Numalgo1)),
Numalgo2::NUMALGO_CHAR => Ok(NumalgoKind::MultipleInceptionKeys(Numalgo2)),
Numalgo3::NUMALGO_CHAR => Ok(NumalgoKind::DidShortening(Numalgo3)),
c @ _ => Err(DidPeerError::InvalidNumalgoCharacter(c)),
}
}
}
8 changes: 8 additions & 0 deletions did_peer/src/peer_did/numalgos/numalgo0.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
use super::traits::Numalgo;

#[derive(Clone, Copy, Default, Debug, PartialEq)]
pub struct Numalgo0;

impl Numalgo for Numalgo0 {
const NUMALGO_CHAR: char = '0';
}
8 changes: 8 additions & 0 deletions did_peer/src/peer_did/numalgos/numalgo1.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
use super::traits::Numalgo;

#[derive(Clone, Copy, Default, Debug, PartialEq)]
pub struct Numalgo1;

impl Numalgo for Numalgo1 {
const NUMALGO_CHAR: char = '1';
}
38 changes: 38 additions & 0 deletions did_peer/src/peer_did/numalgos/numalgo2.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
use did_doc::schema::did_doc::DidDocument;
use did_doc_sov::extra_fields::ExtraFieldsSov;
use did_parser::Did;

use crate::{
error::DidPeerError,
numalgos::{numalgo2::resolve_numalgo2, numalgo3::generate_numalgo3},
peer_did::peer_did::PeerDid,
peer_did_resolver::options::PublicKeyEncoding,
};

use super::{
numalgo3::Numalgo3,
traits::{Numalgo, ResolvableNumalgo, ToNumalgo3},
};

#[derive(Clone, Copy, Default, Debug, PartialEq)]
pub struct Numalgo2;

impl Numalgo for Numalgo2 {
const NUMALGO_CHAR: char = '2';
}

impl ResolvableNumalgo for Numalgo2 {
fn resolve(
&self,
did: &Did,
public_key_encoding: PublicKeyEncoding,
) -> Result<DidDocument<ExtraFieldsSov>, DidPeerError> {
resolve_numalgo2(did, public_key_encoding)
}
}

impl ToNumalgo3 for Numalgo2 {
fn to_numalgo3(did: &Did) -> Result<PeerDid<Numalgo3>, DidPeerError> {
generate_numalgo3(did)
}
}
Loading

0 comments on commit c49c1ab

Please sign in to comment.