diff --git a/MobileSdkRs/Sources/MobileSdkRs/mobile_sdk_rs.swift b/MobileSdkRs/Sources/MobileSdkRs/mobile_sdk_rs.swift index 2e4802e9..fb92bbc2 100644 --- a/MobileSdkRs/Sources/MobileSdkRs/mobile_sdk_rs.swift +++ b/MobileSdkRs/Sources/MobileSdkRs/mobile_sdk_rs.swift @@ -6890,6 +6890,10 @@ public enum Oid4vciError { case VpRequestRequired(message: String) + case ProofValidationError(message: String) + + case DecodeError(message: String) + case DidError(message: String) case ContextMapError(message: String) @@ -6937,15 +6941,23 @@ public struct FfiConverterTypeOid4vciError: FfiConverterRustBuffer { message: try FfiConverterString.read(from: &buf) ) - case 8: return .DidError( + case 8: return .ProofValidationError( + message: try FfiConverterString.read(from: &buf) + ) + + case 9: return .DecodeError( + message: try FfiConverterString.read(from: &buf) + ) + + case 10: return .DidError( message: try FfiConverterString.read(from: &buf) ) - case 9: return .ContextMapError( + case 11: return .ContextMapError( message: try FfiConverterString.read(from: &buf) ) - case 10: return .Generic( + case 12: return .Generic( message: try FfiConverterString.read(from: &buf) ) @@ -6974,12 +6986,16 @@ public struct FfiConverterTypeOid4vciError: FfiConverterRustBuffer { writeInt(&buf, Int32(6)) case .VpRequestRequired(_ /* message is ignored*/): writeInt(&buf, Int32(7)) - case .DidError(_ /* message is ignored*/): + case .ProofValidationError(_ /* message is ignored*/): writeInt(&buf, Int32(8)) - case .ContextMapError(_ /* message is ignored*/): + case .DecodeError(_ /* message is ignored*/): writeInt(&buf, Int32(9)) - case .Generic(_ /* message is ignored*/): + case .DidError(_ /* message is ignored*/): writeInt(&buf, Int32(10)) + case .ContextMapError(_ /* message is ignored*/): + writeInt(&buf, Int32(11)) + case .Generic(_ /* message is ignored*/): + writeInt(&buf, Int32(12)) } diff --git a/src/oid4vci/error.rs b/src/oid4vci/error.rs index 90fc8269..a2be3506 100644 --- a/src/oid4vci/error.rs +++ b/src/oid4vci/error.rs @@ -1,5 +1,7 @@ use oid4vci::credential::RequestError; -use ssi::json_ld::FromContextMapError; +use ssi::{ + claims::data_integrity::DecodeError, claims::ProofValidationError, json_ld::FromContextMapError, +}; use crate::did::DidError; @@ -11,31 +13,37 @@ pub enum Oid4vciError { #[error("Serde error")] SerdeJsonError(String), - #[error("HTTP request error: {0}")] + #[error("HTTP request error: {_0}")] RequestError(String), #[error("Unsupported grant type")] UnsupportedGrantType, - #[error("Invalid session: {0}")] + #[error("Invalid session: {_0}")] InvalidSession(String), - #[error("Invalid parameter: {0}")] + #[error("Invalid parameter: {_0}")] InvalidParameter(String), - #[error("Failed to acquire lock for {0}")] + #[error("Failed to acquire lock for {_0}")] LockError(String), #[error("{vp_request}")] VpRequestRequired { vp_request: serde_json::Value }, + #[error("ProofValidationError: {_0}")] + ProofValidationError(#[from] ProofValidationError), + + #[error("DecodeError: {_0}")] + DecodeError(#[from] DecodeError), + #[error("{_0}")] DidError(#[from] DidError), #[error("{_0}")] ContextMapError(#[from] FromContextMapError), - #[error("{0}")] + #[error("{_0}")] Generic(String), } diff --git a/src/oid4vci/mod.rs b/src/oid4vci/mod.rs index 8904a19d..94056975 100644 --- a/src/oid4vci/mod.rs +++ b/src/oid4vci/mod.rs @@ -23,6 +23,7 @@ use ssi::{ VerificationParameters, }, dids::{AnyDidMethod, DIDResolver}, + prelude::{AnyDataIntegrity, AnyJsonCredential}, }; use url::Url; @@ -365,47 +366,33 @@ pub async fn oid4vci_exchange_credential( JwtVcJson(response) => { log::trace!("processing a JwtVcJson"); let rt = tokio::runtime::Runtime::new().unwrap(); + let ret = response.as_bytes().to_vec(); Ok(CredentialResponse { format: CredentialFormat::JwtVcJson, - payload: rt.block_on(async { - response - .verify_jwt(¶ms) - .await - .map_err(|e| e.to_string()) - .map_err(Oid4vciError::from) - .map(|_| response.as_bytes().to_vec()) - })?, + payload: rt + .block_on(async { response.verify_jwt(¶ms).await.map(|_| ret) })?, }) } JwtVcJsonLd(response) => { log::trace!("processing a JwtVcJsonLd"); + let vc = serde_json::to_string(&response)?; + let ret = serde_json::to_vec(&response)?; Ok(CredentialResponse { format: CredentialFormat::JwtVcJsonLd, - payload: any_credential_from_json_str( - &serde_json::to_string(&response).unwrap(), - ) - .unwrap() - .verify(¶ms) - .await - .map_err(|e| e.to_string()) - .map_err(Oid4vciError::from) - .map(|_| serde_json::to_vec(&response).unwrap())?, + payload: any_credential_from_json_str(&vc)? + .verify(¶ms) + .await + .map(|_| ret)?, }) } LdpVc(response) => { log::trace!("processing an LdpVc"); + let vc: AnyDataIntegrity = serde_json::from_value(response)?; + let ret = serde_json::to_vec(&vc)?; Ok(CredentialResponse { format: CredentialFormat::LdpVc, - payload: any_credential_from_json_str( - &serde_json::to_string(&response).unwrap(), - ) - .unwrap() - .verify(¶ms) - .await - .map_err(|e| e.to_string()) - .map_err(Oid4vciError::from) - .map(|_| serde_json::to_vec(&response).unwrap())?, + payload: vc.verify(¶ms).await.map(|_| ret)?, }) } MsoMdoc(_) => todo!(),