Skip to content

Commit

Permalink
Merge pull request #69 from KeystoneHQ/support-prefix-for-sign-data
Browse files Browse the repository at this point in the history
Handle prefix 0x for sign data
  • Loading branch information
LiYanLance authored Aug 29, 2023
2 parents 00549c3 + 18e0519 commit 053b215
Show file tree
Hide file tree
Showing 13 changed files with 94 additions and 12 deletions.
4 changes: 2 additions & 2 deletions URRegistryFFI.podspec
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Pod::Spec.new do |spec|
spec.name = "URRegistryFFI"
spec.version = "0.2.2"
spec.version = "0.2.3"
spec.summary = "An BC-UR registry implementation with rust-lang"
spec.homepage = "https://github.com/KeystoneHQ/keystone-sdk-rust"
spec.license = { :type => 'Copyright', :text => 'Copyright 2023 Keystone' }
Expand All @@ -9,6 +9,6 @@ Pod::Spec.new do |spec|
spec.swift_version = "5.6"
spec.platform = :ios, '13.0'
spec.static_framework = true
spec.source = { :http => "https://github.com/KeystoneHQ/keystone-sdk-rust/releases/download/sdk-0.1.3/URRegistryFFI.xcframework.zip", :type => "zip" }
spec.source = { :http => "https://github.com/KeystoneHQ/keystone-sdk-rust/releases/download/sdk-0.1.4/URRegistryFFI.xcframework.zip", :type => "zip" }
spec.ios.vendored_frameworks = 'URRegistryFFI.xcframework'
end
3 changes: 2 additions & 1 deletion libs/ur-registry-ffi/src/aptos/aptos_sign_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use ur_registry::traits::To;
use uuid::Uuid;

use crate::export;
use crate::util_internal::string_helper::remove_prefix_0x;

#[derive(Deserialize)]
struct Account {
Expand Down Expand Up @@ -72,7 +73,7 @@ export! {
Ok(v) => v,
Err(_) => return json!({"error": "sign type is invalid"}).to_string(),
};
let sign_date_bytes = match hex::decode(sign_data) {
let sign_date_bytes = match hex::decode(remove_prefix_0x(sign_data)) {
Ok(v) => v,
Err(_) => return json!({"error": "sign data is invalid"}).to_string(),
};
Expand Down
3 changes: 2 additions & 1 deletion libs/ur-registry-ffi/src/arweave/arweave_sign_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ use ur_registry::traits::To;
use uuid::Uuid;

use crate::export;
use crate::util_internal::string_helper::remove_prefix_0x;

export! {
@Java_com_keystone_sdk_KeystoneNativeSDK_generateArweaveSignRequest
Expand All @@ -31,7 +32,7 @@ export! {
Err(_) => return json!({"error": "length of master fingerprint must be exactly 8"}).to_string(),
};

let sign_date_bytes = match hex::decode(sign_data) {
let sign_date_bytes = match hex::decode(remove_prefix_0x(sign_data)) {
Ok(v) => v,
Err(_) => return json!({"error": "sign_data is invalid"}).to_string(),
};
Expand Down
3 changes: 2 additions & 1 deletion libs/ur-registry-ffi/src/bitcoin/crypto_psbt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use ur_registry::traits::From;
use ur_registry::traits::To;

use crate::export;
use crate::util_internal::string_helper::remove_prefix_0x;

export! {
@Java_com_keystone_sdk_KeystoneNativeSDK_parseCryptoPSBT
Expand All @@ -17,7 +18,7 @@ export! {
}

let parse = || -> Result<String, Error> {
let cbor = hex::decode(cbor_hex.to_string())?;
let cbor = hex::decode(remove_prefix_0x(cbor_hex).to_string())?;
let psbt = CryptoPSBT::from_cbor(cbor).map_err(|_| format_err!(""))?;
let psbt_hex = hex::encode(psbt.get_psbt());
Ok(psbt_hex)
Expand Down
3 changes: 2 additions & 1 deletion libs/ur-registry-ffi/src/cardano/cardano_sign_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ use ur_registry::cardano::cardano_sign_request::CardanoSignRequest;
use serde::Deserialize;

use crate::export;
use crate::util_internal::string_helper::remove_prefix_0x;

#[derive(Deserialize)]
struct Utxo {
Expand Down Expand Up @@ -125,7 +126,7 @@ export! {
Ok(v) => v,
Err(_) => return json!({"error": "uuid is invalid"}).to_string(),
}.as_bytes().to_vec();
let sign_data_bytes = match hex::decode(sign_data) {
let sign_data_bytes = match hex::decode(remove_prefix_0x(sign_data)) {
Ok(v) => v,
Err(_) => return json!({"error": "sign data is invalid"}).to_string(),
};
Expand Down
3 changes: 2 additions & 1 deletion libs/ur-registry-ffi/src/cosmos/cosmos_sign_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use ur_registry::traits::To;
use uuid::Uuid;

use crate::export;
use crate::util_internal::string_helper::remove_prefix_0x;

#[derive(Deserialize)]
struct Account {
Expand Down Expand Up @@ -63,7 +64,7 @@ export! {
Ok(v) => v,
Err(_) => return json!({"error": "data type is invalid"}).to_string(),
};
let sign_date_bytes = match hex::decode(sign_data) {
let sign_date_bytes = match hex::decode(remove_prefix_0x(sign_data)) {
Ok(v) => v,
Err(_) => return json!({"error": "sign data is invalid"}).to_string(),
};
Expand Down
25 changes: 24 additions & 1 deletion libs/ur-registry-ffi/src/ethereum/eth_sign_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use ur_registry::traits::To;
use uuid::Uuid;

use crate::export;
use crate::util_internal::string_helper::remove_prefix_0x;

export! {
@Java_com_keystone_sdk_KeystoneNativeSDK_generateETHSignRequest
Expand Down Expand Up @@ -39,7 +40,8 @@ export! {
Ok(v) => v,
Err(_) => return json!({"error": "uuid is invalid"}).to_string(),
}.as_bytes().to_vec();
let sign_date_bytes = match hex::decode(sign_data) {

let sign_date_bytes = match hex::decode(remove_prefix_0x(sign_data)) {
Ok(v) => v,
Err(_) => return json!({"error": "sign_data is invalid"}).to_string(),
};
Expand Down Expand Up @@ -96,6 +98,27 @@ mod tests {
);
}

#[test]
fn test_generate_eth_sign_request_given_sign_data_with_prefix() {
let request_id = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";
let sign_data = "0xf849808609184e72a00082271094000000000000000000000000000000000000000080a47f7465737432000000000000000000000000000000000000000000000000000000600057808080";
let path = "m/44'/1'/1'/0/1";
let xfp = "12345678";
let chain_id: i32 = 1;
let address = "";
let origin = "metamask";
let data_type = 1;

let expect_result = "{\"cbor\":\"a601d825509b1deb4d3b7d4bad9bdd2b0d7b3dcb6d02584bf849808609184e72a00082271094000000000000000000000000000000000000000080a47f74657374320000000000000000000000000000000000000000000000000000006000578080800301040105d90130a2018a182cf501f501f500f401f4021a1234567807686d6574616d61736b\",\"type\":\"eth-sign-request\"}";

assert_eq!(
expect_result,
generate_eth_sign_request(
request_id, sign_data, data_type, chain_id, path, xfp, address, origin
)
);
}

#[test]
fn test_generate_eth_sign_request_path_error() {
let request_id = "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d";
Expand Down
3 changes: 2 additions & 1 deletion libs/ur-registry-ffi/src/evm/evm_sign_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use ur_registry::cosmos::evm_sign_request::{EvmSignRequest, SignDataType};
use ur_registry::registry_types::EVM_SIGN_REQUEST;

use crate::export;
use crate::util_internal::string_helper::remove_prefix_0x;

#[derive(Deserialize)]
struct Account {
Expand All @@ -29,7 +30,7 @@ export! {
Ok(v) => v,
Err(_) => return json!({"error": "uuid is invalid"}).to_string(),
}.as_bytes().to_vec();
let sign_data_bytes = match hex::decode(sign_data) {
let sign_data_bytes = match hex::decode(remove_prefix_0x(sign_data)) {
Ok(v) => v,
Err(_) => return json!({"error": "sign data is invalid"}).to_string(),
};
Expand Down
3 changes: 2 additions & 1 deletion libs/ur-registry-ffi/src/solana/sol_sign_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use ur_registry::traits::To;
use uuid::Uuid;

use crate::export;
use crate::util_internal::string_helper::remove_prefix_0x;

export! {
@Java_com_keystone_sdk_KeystoneNativeSDK_generateSolSignRequest
Expand Down Expand Up @@ -38,7 +39,7 @@ export! {
Ok(v) => v,
Err(_) => return json!({"error": "uuid is invalid"}).to_string(),
}.as_bytes().to_vec();
let sign_date_bytes = match hex::decode(sign_data) {
let sign_date_bytes = match hex::decode(remove_prefix_0x(sign_data)) {
Ok(v) => v,
Err(_) => return json!({"error": "sign data is invalid"}).to_string(),
};
Expand Down
3 changes: 2 additions & 1 deletion libs/ur-registry-ffi/src/sui/sui_sign_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use ur_registry::sui::sui_sign_request::SuiSignRequest;
use uuid::Uuid;

use crate::export;
use crate::util_internal::string_helper::remove_prefix_0x;

#[derive(Deserialize)]
struct Account {
Expand Down Expand Up @@ -67,7 +68,7 @@ export! {
return json!({"error": "accounts is invalid"}).to_string();
}

let intent_message_bytes = match hex::decode(intent_message) {
let intent_message_bytes = match hex::decode(remove_prefix_0x(intent_message)) {
Ok(v) => v,
Err(_) => return json!({"error": "intent message is invalid"}).to_string(),
};
Expand Down
3 changes: 2 additions & 1 deletion libs/ur-registry-ffi/src/tron/tron_sign_request.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ use ur_registry::traits::To;
use uuid::Uuid;

use crate::export;
use crate::util_internal::string_helper::remove_prefix_0x;

use super::tron_transfer::raw_to_tx;

Expand Down Expand Up @@ -39,7 +40,7 @@ export! {
Ok(v) => v,
Err(_) => return json!({"error": "uuid is invalid"}).to_string(),
};
let sign_data_bytes = match hex::decode(sign_data) {
let sign_data_bytes = match hex::decode(remove_prefix_0x(sign_data)) {
Ok(v) => v,
Err(_) => return json!({"error": "sign data is invalid"}).to_string(),
};
Expand Down
1 change: 1 addition & 0 deletions libs/ur-registry-ffi/src/util_internal/mod.rs
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
pub mod chain;
pub mod account_helper;
pub mod string_helper;
49 changes: 49 additions & 0 deletions libs/ur-registry-ffi/src/util_internal/string_helper.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
pub fn remove_prefix<'a>(s: &'a str, prefix: &str) -> &'a str {
match s.strip_prefix(prefix) {
Some(s) => s,
None => s
}
}


pub fn remove_prefix_0x(s: &str) -> &str {
remove_prefix(s, "0x")
}


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

#[test]
fn test_remove_prefix() {
let given_str = "k-target_data";
let expect_str = "target_data";

assert_eq!(expect_str, remove_prefix(given_str, "k-"));
}

#[test]
fn test_remove_prefix_without_given_prefix() {
let given_str = "target_data";
let expect_str = "target_data";

assert_eq!(expect_str, remove_prefix(given_str, "k-"));
}

#[test]
fn test_remove_prefix_0x() {
let given_str = "0x01234567";
let expect_str = "01234567";

assert_eq!(expect_str, remove_prefix_0x(given_str));
}

#[test]
fn test_remove_prefix_0x_without_0x() {
let given_str = "01234567";
let expect_str = "01234567";

assert_eq!(expect_str, remove_prefix_0x(given_str));
}
}

0 comments on commit 053b215

Please sign in to comment.