Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make PeerDid generic over numalgo #887

Merged
merged 2 commits into from
Jul 3, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading