Skip to content

Commit

Permalink
Expect DER signature (#14)
Browse files Browse the repository at this point in the history
Because both iOS and Android generate DER by default and Android doesn't
have an easy way of doing the translation.
  • Loading branch information
sbihel authored Mar 11, 2024
1 parent 6f64dd9 commit 3972f57
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 12 deletions.
1 change: 0 additions & 1 deletion Package.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
25 changes: 18 additions & 7 deletions WalletSdkRs/Sources/WalletSdkRs/wallet_sdk_rs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1064,6 +1064,9 @@ public enum SignatureError {



case InvalidSignature(
value: String
)
case TooManyDocuments
case Generic(
value: String
Expand All @@ -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)
)

Expand All @@ -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)

}
Expand Down Expand Up @@ -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)
}
)
}
Expand Down Expand Up @@ -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) {
Expand Down
15 changes: 11 additions & 4 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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}")]
Expand All @@ -181,11 +183,16 @@ pub enum SignatureError {
#[uniffi::export]
fn submit_signature(
session_manager: Arc<SessionManager>,
signature: Vec<u8>,
der_signature: Vec<u8>,
) -> Result<Vec<u8>, 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:?}"),
})?;
Expand Down Expand Up @@ -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::*;

Expand Down Expand Up @@ -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();
}
}

0 comments on commit 3972f57

Please sign in to comment.