Skip to content

Commit

Permalink
Support numalgo3 (#886)
Browse files Browse the repository at this point in the history
Signed-off-by: Miroslav Kovar <[email protected]>
  • Loading branch information
mirgee authored Jun 27, 2023
1 parent 52a1e43 commit c1180a7
Show file tree
Hide file tree
Showing 11 changed files with 125 additions and 14 deletions.
11 changes: 11 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions did_peer/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ bs58 = "0.5.0"
multibase = "0.9.1"
unsigned-varint = "0.7.1"
once_cell = "1.18.0"
sha256 = "1.1.4"

[dev-dependencies]
tokio = { version = "1.27.0", default-features = false, features = ["macros", "rt"] }
1 change: 1 addition & 0 deletions did_peer/src/numalgos/mod.rs
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
pub mod numalgo2;
pub mod numalgo3;
29 changes: 29 additions & 0 deletions did_peer/src/numalgos/numalgo3/generate.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
use did_parser::Did;
use sha256::digest;

use crate::{error::DidPeerError, peer_did::PeerDid};

pub fn generate_numalgo3(did: &Did) -> Result<PeerDid, 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))
}

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

#[test]
fn test_shorten() {
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(),
generate_numalgo3(&peer_did_2).unwrap()
);
}
}
3 changes: 3 additions & 0 deletions did_peer/src/numalgos/numalgo3/mod.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
mod generate;

pub use generate::generate_numalgo3;
27 changes: 22 additions & 5 deletions did_peer/src/peer_did/peer_did.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
use std::fmt::Display;

use crate::{error::DidPeerError, numalgos::numalgo2::generate_numalgo2};
use crate::{error::DidPeerError, numalgos::numalgo2::generate_numalgo2, numalgos::numalgo3::generate_numalgo3};
use did_doc::schema::did_doc::DidDocument;
use did_doc_sov::extra_fields::ExtraFieldsSov;
use did_parser::Did;
Expand Down Expand Up @@ -50,6 +50,17 @@ impl PeerDid {
generate_numalgo2(did_document)
}

pub fn generate_numalgo3(did_document: DidDocument<ExtraFieldsSov>) -> Result<PeerDid, DidPeerError> {
generate_numalgo3(Self::generate_numalgo2(did_document)?.did())
}

pub fn to_numalgo3(&self) -> Result<PeerDid, DidPeerError> {
match self.numalgo() {
Numalgo::MultipleInceptionKeys => generate_numalgo3(self.did()),
n @ _ => Err(DidPeerError::UnsupportedNumalgo(n.clone())),
}
}

fn validate(did: &Did) -> Result<(), DidPeerError> {
if !PEER_DID_REGEX.is_match(did.did()) {
Err(DidPeerError::DidValidationError(format!("Invalid did: {}", did.did())))
Expand Down Expand Up @@ -107,7 +118,7 @@ mod tests {
mod parse {
use super::*;

macro_rules! generate_parse_test {
macro_rules! generate_negative_parse_test {
($test_name:ident, $input:expr, $error_pattern:pat) => {
#[test]
fn $test_name() {
Expand All @@ -117,7 +128,7 @@ mod tests {
};
}

generate_parse_test!(
generate_negative_parse_test!(
test_peer_did_parse_unsupported_transform_code,
"did:peer:2\
.Ea6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc\
Expand All @@ -126,7 +137,7 @@ mod tests {
DidPeerError::DidValidationError(_)
);

generate_parse_test!(
generate_negative_parse_test!(
test_peer_did_parse_malformed_base58_encoding_signing,
"did:peer:2\
.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc\
Expand All @@ -135,13 +146,19 @@ mod tests {
DidPeerError::DidValidationError(_)
);

generate_parse_test!(
generate_negative_parse_test!(
test_peer_did_parse_malformed_base58_encoding_encryption,
"did:peer:2\
.Ez6LSbysY2xFMRpG0hb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc\
.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V\
.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXX0=",
DidPeerError::DidParserError(_)
);

#[test]
fn test_peer_did_numalgo2() {
let did = "did:peer:3.8a33de52d9e9e9cfd5c5fd8a7e5da5d3c73208bfc5e5fd5a4eb4af3f3b3f3a3a";
assert!(PeerDid::parse(did.to_string()).is_ok());
}
}
}
3 changes: 3 additions & 0 deletions did_peer/tests/fixtures/basic.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ pub static PEER_DID_NUMALGO_2_BASIC: &str = "did:peer:2\
.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg\
.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0";

pub static PEER_DID_NUMALGO_3_BASIC: &str =
"did:peer:3.0e857e93798921e83cfc2ef8bee9cafc25f15f4c9c7bee5ed9a9c62b56a62cca";

pub static DID_DOC_BASIC: &str = r##"
{
"id": "did:peer:2.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCIsInIiOlsiZGlkOmV4YW1wbGU6c29tZW1lZGlhdG9yI3NvbWVrZXkiXSwiYSI6WyJkaWRjb21tL3YyIiwiZGlkY29tbS9haXAyO2Vudj1yZmM1ODciXX0",
Expand Down
3 changes: 3 additions & 0 deletions did_peer/tests/fixtures/multiple_services.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ pub static PEER_DID_NUMALGO_2_MULTIPLE_SERVICES: &str = "did:peer:2\
.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V\
.SW3sidCI6ImRtIiwicyI6Imh0dHBzOi8vZXhhbXBsZS5jb20vZW5kcG9pbnQiLCJyIjpbImRpZDpleGFtcGxlOnNvbWVtZWRpYXRvciNzb21la2V5Il19LHsidCI6ImV4YW1wbGUiLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludDIiLCJyIjpbImRpZDpleGFtcGxlOnNvbWVtZWRpYXRvciNzb21la2V5MiJdLCJhIjpbImRpZGNvbW0vdjIiLCJkaWRjb21tL2FpcDI7ZW52PXJmYzU4NyJdfV0";

pub static PEER_DID_NUMALGO_3_MULTIPLE_SERVICES: &str =
"did:peer:3.345007dfdd2caa52be111e303342350e07233ee5f255f916f413ddafb098395a";

pub static DID_DOC_MULTIPLE_SERVICES: &str = r##"
{
"id": "did:peer:2.Ez6LSpSrLxbAhg2SHwKk7kwpsH7DM7QjFS5iK6qP87eViohud.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.SW3sidCI6ImRtIiwicyI6Imh0dHBzOi8vZXhhbXBsZS5jb20vZW5kcG9pbnQiLCJyIjpbImRpZDpleGFtcGxlOnNvbWVtZWRpYXRvciNzb21la2V5Il19LHsidCI6ImV4YW1wbGUiLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludDIiLCJyIjpbImRpZDpleGFtcGxlOnNvbWVtZWRpYXRvciNzb21la2V5MiJdLCJhIjpbImRpZGNvbW0vdjIiLCJkaWRjb21tL2FpcDI7ZW52PXJmYzU4NyJdfV0",
Expand Down
3 changes: 3 additions & 0 deletions did_peer/tests/fixtures/no_routing_keys.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ pub static PEER_DID_NUMALGO_2_NO_ROUTING_KEYS: &str = "did:peer:2\
.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg\
.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCJ9";

pub static PEER_DID_NUMALGO_3_NO_ROUTING_KEYS: &str =
"did:peer:3.3bf7ef596b0452c475418259e4b9e1aac91da30d61fa2ee6403e7e5670f7ab6c";

pub static DID_DOC_NO_ROUTING_KEYS: &str = r##"
{
"id": "did:peer:2.Ez6LSbysY2xFMRpGMhb7tFTLMpeuPRaqaWM1yECx2AtzE3KCc.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V.Vz6MkgoLTnTypo3tDRwCkZXSccTPHRLhF4ZnjhueYAFpEX6vg.SeyJ0IjoiZG0iLCJzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9lbmRwb2ludCJ9",
Expand Down
3 changes: 3 additions & 0 deletions did_peer/tests/fixtures/no_services.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ pub static PEER_DID_NUMALGO_2_NO_SERVICES: &str = "did:peer:2\
.Ez6LSpSrLxbAhg2SHwKk7kwpsH7DM7QjFS5iK6qP87eViohud\
.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V";

pub static PEER_DID_NUMALGO_3_NO_SERVICES: &str =
"did:peer:3.f26593d514fd0c62ea812b1be625294d9bd6d1195041b812c8912e3072425f10";

pub static DID_DOC_NO_SERVICES: &str = r##"
{
"id": "did:peer:2.Ez6LSpSrLxbAhg2SHwKk7kwpsH7DM7QjFS5iK6qP87eViohud.Vz6MkqRYqQiSgvZQdnBytw86Qbs2ZWUkGv22od935YF4s8M7V",
Expand Down
55 changes: 46 additions & 9 deletions did_peer/tests/generate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,17 @@ use did_doc_sov::extra_fields::ExtraFieldsSov;
use did_peer::peer_did::PeerDid;

use crate::fixtures::{
basic::{DID_DOC_BASIC, PEER_DID_NUMALGO_2_BASIC},
multiple_services::{DID_DOC_MULTIPLE_SERVICES, PEER_DID_NUMALGO_2_MULTIPLE_SERVICES},
no_routing_keys::{DID_DOC_NO_ROUTING_KEYS, PEER_DID_NUMALGO_2_NO_ROUTING_KEYS},
no_services::{DID_DOC_NO_SERVICES, PEER_DID_NUMALGO_2_NO_SERVICES},
basic::{DID_DOC_BASIC, PEER_DID_NUMALGO_2_BASIC, PEER_DID_NUMALGO_3_BASIC},
multiple_services::{
DID_DOC_MULTIPLE_SERVICES, PEER_DID_NUMALGO_2_MULTIPLE_SERVICES, PEER_DID_NUMALGO_3_MULTIPLE_SERVICES,
},
no_routing_keys::{
DID_DOC_NO_ROUTING_KEYS, PEER_DID_NUMALGO_2_NO_ROUTING_KEYS, PEER_DID_NUMALGO_3_NO_ROUTING_KEYS,
},
no_services::{DID_DOC_NO_SERVICES, PEER_DID_NUMALGO_2_NO_SERVICES, PEER_DID_NUMALGO_3_NO_SERVICES},
};

macro_rules! generate_test {
macro_rules! generate_test_numalgo2 {
($test_name:ident, $did_doc:expr, $peer_did:expr) => {
#[test]
fn $test_name() {
Expand All @@ -24,22 +28,55 @@ macro_rules! generate_test {
};
}

generate_test!(test_generate_numalgo2_basic, DID_DOC_BASIC, PEER_DID_NUMALGO_2_BASIC);
macro_rules! generate_test_numalgo3 {
($test_name:ident, $did_doc:expr, $peer_did:expr) => {
#[test]
fn $test_name() {
let did_document = serde_json::from_str::<DidDocument<ExtraFieldsSov>>($did_doc).unwrap();
assert_eq!(
PeerDid::parse($peer_did.to_string()).unwrap(),
PeerDid::generate_numalgo3(did_document).unwrap()
);
}
};
}

generate_test_numalgo2!(test_generate_numalgo2_basic, DID_DOC_BASIC, PEER_DID_NUMALGO_2_BASIC);

generate_test!(
generate_test_numalgo2!(
test_generate_numalgo2_multiple_services,
DID_DOC_MULTIPLE_SERVICES,
PEER_DID_NUMALGO_2_MULTIPLE_SERVICES
);

generate_test!(
generate_test_numalgo2!(
test_generate_numalgo2_no_services,
DID_DOC_NO_SERVICES,
PEER_DID_NUMALGO_2_NO_SERVICES
);

generate_test!(
generate_test_numalgo2!(
test_generate_numalgo2_no_routing_keys,
DID_DOC_NO_ROUTING_KEYS,
PEER_DID_NUMALGO_2_NO_ROUTING_KEYS
);

generate_test_numalgo3!(test_generate_numalgo3_basic, DID_DOC_BASIC, PEER_DID_NUMALGO_3_BASIC);

generate_test_numalgo3!(
test_generate_numalgo3_multiple_services,
DID_DOC_MULTIPLE_SERVICES,
PEER_DID_NUMALGO_3_MULTIPLE_SERVICES
);

generate_test_numalgo3!(
test_generate_numalgo3_no_services,
DID_DOC_NO_SERVICES,
PEER_DID_NUMALGO_3_NO_SERVICES
);

generate_test_numalgo3!(
test_generate_numalgo3_no_routing_keys,
DID_DOC_NO_ROUTING_KEYS,
PEER_DID_NUMALGO_3_NO_ROUTING_KEYS
);

0 comments on commit c1180a7

Please sign in to comment.