From dbd9cb6cf98c49031e1738299f3f20eb8745dfd0 Mon Sep 17 00:00:00 2001 From: vineet <10172895+vineetpant@users.noreply.github.com> Date: Wed, 25 Oct 2023 13:16:25 +0200 Subject: [PATCH] pass signer_address in verify presentation as optional param --- Cargo.lock | 2 +- Cargo.toml | 2 +- VERSIONS.md | 1 + src/helpers/presentation.rs | 71 ++++++++++++++++++++++++------------- src/wasm_lib.rs | 38 +++++++++++--------- 5 files changed, 72 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index da537cb..710efa6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4912,7 +4912,7 @@ dependencies = [ [[package]] name = "vade-evan-bbs" version = "0.4.0" -source = "git+https://github.com/evannetwork/vade-evan-bbs.git?branch=experimental/develop-next#7ec152939fd3d106b171a8ad58c26f35c8a5c776" +source = "git+https://github.com/evannetwork/vade-evan-bbs.git?branch=feature/make-signer-address-optional#7de1fbabbd0d55e11381dddf029dced062b517c9" dependencies = [ "async-trait", "base64 0.13.1", diff --git a/Cargo.toml b/Cargo.toml index e0fda31..70b4108 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -147,7 +147,7 @@ optional = true [dependencies.vade-evan-bbs] git = "https://github.com/evannetwork/vade-evan-bbs.git" -branch = "experimental/develop-next" +branch = "feature/make-signer-address-optional" optional = true default-features = false diff --git a/VERSIONS.md b/VERSIONS.md index 853fcfe..34910b3 100644 --- a/VERSIONS.md +++ b/VERSIONS.md @@ -13,6 +13,7 @@ - `issuer_proving_key` - add `helper_convert_credential_to_nquads` helper function - add optional param `credential_values` to `helper_create_credential_offer` helper function +- update `helper_verify_presentation` for optional `signer_address` ### Fixes diff --git a/src/helpers/presentation.rs b/src/helpers/presentation.rs index e59e96f..43aceab 100644 --- a/src/helpers/presentation.rs +++ b/src/helpers/presentation.rs @@ -291,33 +291,42 @@ impl<'a> Presentation<'a> { .map_err(|err| PresentationError::InternalError(err.to_string()))?; } + let mut signer_address = None; // extract signing address - let mut presentation_value: Value = serde_json::from_str(presentation_str).map_err( - PresentationError::to_deserialization_error("presentation", &presentation_str), - )?; - - let presentation_value_with_proof = - presentation_value.as_object_mut().ok_or_else(|| { - PresentationError::InternalError("Error in parsing presentation proof".to_string()) - })?; + if presentation.proof.is_some() { + let mut presentation_value: Value = serde_json::from_str(presentation_str).map_err( + PresentationError::to_deserialization_error("presentation", &presentation_str), + )?; - let presentation_value_without_proof = presentation_value_with_proof - .remove("proof") - .ok_or_else(|| { - PresentationError::InternalError("Error in parsing presentation proof".to_string()) - })?; + let presentation_value_with_proof = + presentation_value.as_object_mut().ok_or_else(|| { + PresentationError::InternalError( + "Error in parsing presentation proof".to_string(), + ) + })?; - let (signer_address, _) = recover_address_and_data( - presentation_value_without_proof["jws"] - .as_str() + let presentation_value_without_proof = presentation_value_with_proof + .remove("proof") .ok_or_else(|| { PresentationError::InternalError( "Error in parsing presentation proof".to_string(), ) - })?, - ) - .map_err(|err| PresentationError::InternalError(err.to_string()))?; - let signer_address = format!("0x{}", signer_address); + })?; + + let (address, _) = recover_address_and_data( + presentation_value_without_proof["jws"] + .as_str() + .ok_or_else(|| { + PresentationError::InternalError( + "Error in parsing presentation proof".to_string(), + ) + })?, + ) + .map_err(|err| PresentationError::InternalError(err.to_string()))?; + + signer_address = Some(format!("0x{}", address)); + } + let proof_request = VerifyProofPayload { presentation: presentation.clone(), proof_request, @@ -913,7 +922,8 @@ mod tests_proof_request { } #[tokio::test] - async fn helper_can_create_presentation_and_reveal_all_if_none_required_revealed() -> Result<()> { + async fn helper_can_create_presentation_and_reveal_all_if_none_required_revealed() -> Result<()> + { let mut vade_evan = VadeEvan::new(crate::VadeEvanConfig { target: DEFAULT_TARGET, signer: DEFAULT_SIGNER, @@ -944,12 +954,19 @@ mod tests_proof_request { .await; assert!(presentation_result.is_ok()); let presentation: ProofPresentation = serde_json::from_str(&presentation_result?)?; - assert_eq!(presentation.verifiable_credential[0].credential_subject.data.len(), 5); + assert_eq!( + presentation.verifiable_credential[0] + .credential_subject + .data + .len(), + 5 + ); Ok(()) } #[tokio::test] - async fn helper_can_create_presentation_and_reveal_only_required_attributes_in_credential_subject() -> Result<()> { + async fn helper_can_create_presentation_and_reveal_only_required_attributes_in_credential_subject( + ) -> Result<()> { let mut vade_evan = VadeEvan::new(crate::VadeEvanConfig { target: DEFAULT_TARGET, signer: DEFAULT_SIGNER, @@ -981,7 +998,13 @@ mod tests_proof_request { assert!(presentation_result.is_ok()); let presentation: ProofPresentation = serde_json::from_str(&presentation_result?)?; - assert_eq!(presentation.verifiable_credential[0].credential_subject.data.len(), 1); + assert_eq!( + presentation.verifiable_credential[0] + .credential_subject + .data + .len(), + 1 + ); Ok(()) } diff --git a/src/wasm_lib.rs b/src/wasm_lib.rs index 46bfd54..f84dfe0 100644 --- a/src/wasm_lib.rs +++ b/src/wasm_lib.rs @@ -196,7 +196,6 @@ struct HelperConvertCredentialToNquads { pub credential_str: String, } - #[wasm_bindgen] pub fn set_panic_hook() { console_error_panic_hook::set_once(); @@ -814,9 +813,7 @@ pub async fn execute_vade( "helper_convert_credential_to_nquads" => { let payload_result = parse::(&payload); match payload_result { - Ok(payload) => { - helper_convert_credential_to_nquads(payload.credential_str).await - } + Ok(payload) => helper_convert_credential_to_nquads(payload.credential_str).await, Err(error) => Err(get_parsing_error_message(&error, &payload)), } } @@ -824,8 +821,10 @@ pub async fn execute_vade( "helper_create_proof_proposal" => { let payload_result = parse::(&payload); match payload_result { - Ok(payload) => - helper_create_proof_proposal(payload.schema_did, payload.revealed_attributes).await, + Ok(payload) => { + helper_create_proof_proposal(payload.schema_did, payload.revealed_attributes) + .await + } Err(error) => Err(get_parsing_error_message(&error, &payload)), } } @@ -833,16 +832,23 @@ pub async fn execute_vade( "helper_create_proof_request" => { let payload_result = parse::(&payload); match payload_result { - Ok(parsed_value) => - match parsed_value { - HelperCreateProofRequestPayload::FromScratch(from_scratch) => - helper_create_proof_request(from_scratch.schema_did, from_scratch.revealed_attributes).await, - HelperCreateProofRequestPayload::FromProposal(proposal) => - match serde_json::to_string(&proposal) { - Ok(stringified) => helper_create_proof_request_from_proposal(&stringified).await, - Err(error) => Err(get_parsing_error_message(&error, &payload)), - }, - }, + Ok(parsed_value) => match parsed_value { + HelperCreateProofRequestPayload::FromScratch(from_scratch) => { + helper_create_proof_request( + from_scratch.schema_did, + from_scratch.revealed_attributes, + ) + .await + } + HelperCreateProofRequestPayload::FromProposal(proposal) => { + match serde_json::to_string(&proposal) { + Ok(stringified) => { + helper_create_proof_request_from_proposal(&stringified).await + } + Err(error) => Err(get_parsing_error_message(&error, &payload)), + } + } + }, Err(error) => Err(get_parsing_error_message(&error, &payload)), } }