diff --git a/Package.swift b/Package.swift index 9c87c8d..9925ca1 100644 --- a/Package.swift +++ b/Package.swift @@ -18,7 +18,6 @@ let package = Package( ], dependencies: [ ], targets: [ - // .binaryTarget(name: "RustFramework", url: "https://github.com/spruceid/wallet-sdk-rs/releases/download/0.0.24/RustFramework.xcframework.zip", checksum: "f8ca19a431e05bfc4275e47b0074895dc85ac7228e54c7fce8679e037e63be31"), .binaryTarget(name: "RustFramework", url: "https://github.com/spruceid/wallet-sdk-rs/releases/download/0.0.24/RustFramework.xcframework.zip", checksum: "f8ca19a431e05bfc4275e47b0074895dc85ac7228e54c7fce8679e037e63be31"), .target( name: "SpruceIDWalletSdkRs", diff --git a/WalletSdkRs/Sources/WalletSdkRs/wallet_sdk_rs.swift b/WalletSdkRs/Sources/WalletSdkRs/wallet_sdk_rs.swift index aa92b20..1e87e95 100644 --- a/WalletSdkRs/Sources/WalletSdkRs/wallet_sdk_rs.swift +++ b/WalletSdkRs/Sources/WalletSdkRs/wallet_sdk_rs.swift @@ -1064,6 +1064,9 @@ public enum SignatureError { + case InvalidSignature( + value: String + ) case TooManyDocuments case Generic( value: String @@ -1085,8 +1088,11 @@ public struct FfiConverterTypeSignatureError: FfiConverterRustBuffer { - case 1: return .TooManyDocuments - case 2: return .Generic( + case 1: return .InvalidSignature( + value: try FfiConverterString.read(from: &buf) + ) + case 2: return .TooManyDocuments + case 3: return .Generic( value: try FfiConverterString.read(from: &buf) ) @@ -1101,12 +1107,17 @@ public struct FfiConverterTypeSignatureError: FfiConverterRustBuffer { - case .TooManyDocuments: + case let .InvalidSignature(value): writeInt(&buf, Int32(1)) + FfiConverterString.write(value, into: &buf) + + + case .TooManyDocuments: + writeInt(&buf, Int32(2)) case let .Generic(value): - writeInt(&buf, Int32(2)) + writeInt(&buf, Int32(3)) FfiConverterString.write(value, into: &buf) } @@ -1383,12 +1394,12 @@ public func submitResponse(sessionManager: SessionManager, permittedItems: [Stri } ) } -public func submitSignature(sessionManager: SessionManager, signature: Data) throws -> Data { +public func submitSignature(sessionManager: SessionManager, derSignature: Data) throws -> Data { return try FfiConverterData.lift( try rustCallWithError(FfiConverterTypeSignatureError.lift) { uniffi_wallet_sdk_rs_fn_func_submit_signature( FfiConverterTypeSessionManager.lower(sessionManager), - FfiConverterData.lower(signature),$0) + FfiConverterData.lower(derSignature),$0) } ) } @@ -1430,7 +1441,7 @@ private var initializationResult: InitializationResult { if (uniffi_wallet_sdk_rs_checksum_func_submit_response() != 34256) { return InitializationResult.apiChecksumMismatch } - if (uniffi_wallet_sdk_rs_checksum_func_submit_signature() != 46170) { + if (uniffi_wallet_sdk_rs_checksum_func_submit_signature() != 46429) { return InitializationResult.apiChecksumMismatch } if (uniffi_wallet_sdk_rs_checksum_func_terminate_session() != 5668) { diff --git a/src/lib.rs b/src/lib.rs index 915ccba..eb657ee 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -172,6 +172,8 @@ fn submit_response( #[derive(thiserror::Error, uniffi::Error, Debug)] pub enum SignatureError { + #[error("Invalid DER signature: {value}")] + InvalidSignature { value: String }, #[error("there were more documents to sign, but we only expected to sign 1!")] TooManyDocuments, #[error("{value}")] @@ -181,11 +183,16 @@ pub enum SignatureError { #[uniffi::export] fn submit_signature( session_manager: Arc, - signature: Vec, + der_signature: Vec, ) -> Result, SignatureError> { + let signature = p256::ecdsa::Signature::from_der(&der_signature).map_err(|e| { + SignatureError::InvalidSignature { + value: e.to_string(), + } + })?; let mut session_manager = session_manager.inner.lock().unwrap(); session_manager - .submit_next_signature(signature) + .submit_next_signature(signature.to_bytes().to_vec()) .map_err(|e| SignatureError::Generic { value: format!("Could not submit next signature: {e:?}"), })?; @@ -286,7 +293,7 @@ mod tests { definitions::device_request::{self, DataElements}, presentation::reader, }; - use p256::ecdsa::signature::Signer; + use p256::ecdsa::signature::{SignatureEncoding, Signer}; use super::*; @@ -349,7 +356,7 @@ mod tests { submit_response(request_data.session_manager.clone(), permitted_items).unwrap(); let signature: p256::ecdsa::Signature = key.sign(&signing_payload); let response = - submit_signature(request_data.session_manager, signature.to_bytes().to_vec()).unwrap(); + submit_signature(request_data.session_manager, signature.to_der().to_vec()).unwrap(); reader_session_manager.handle_response(&response).unwrap(); } }