Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -242,4 +242,46 @@ class TestBiz {
val expected = "0x1d92e4b600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000004b0f1812e5df2a09796481ff14017e6005508003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b3000000000000000000000000bc472b43bc237f733c78a581078f58a6a89c46ec00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041db18e3a0150ddef964810e480b25592942a22d0b583f7d5cbb33ef6fb4baa66e753af78e967ee374070e16cf963a6cd7a3adb713e50d553aefbc361c48366a101b00000000000000000000000000000000000000000000000000000000000000"
assertEquals(expected, Numeric.toHexString(encoded))
}

// Off-chain message signing for Biz isValidSignature()
@Test
fun testBizOffchainMsgSigning() {
val chainIdByteArray = "0x7A69".toHexByteArray() // 31337
val wallet = "0x328809Bc894f92807417D2dAD6b7C998c1aFdac6"

val codeAddress = "0xc7183455a4C133Ae270771860664b6B7ec320bB1"
val codeName = "Biz"
val codeVersion = "v2.0.0"
// keccak256("Biz(bytes32 msgHash)")
val typeHash = "0x31322a37c2a66b24e1088197e5b24fcc050625c13d4b84c3eaa6a8be5270321d"
val domainSeparatorHash = "0xd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472"

// keccak256(abi.encode(keccak256("test message")))
val innerHash = "0x4a57b5e386189fd992a83269e996782dbfb8ad539903019abcff0a5b3c012671"

val encodedHash = WCBiz.getEncodedHash(
chainIdByteArray,
codeAddress,
codeName,
codeVersion,
typeHash,
domainSeparatorHash,
wallet,
innerHash
)
assertEquals(
"0xf1b5b1122b48d985c9dccaae7978a607b77bd7e0a851ff9e750acacfd2919c3f",
Numeric.toHexString(encodedHash)
)

val privateKey = "0x9c0257114eb9399a2985f8e75dad7600c5d89fe3824ffa99ec1c3eb8bf3b0501"
val signedHash = WCBiz.getSignedHash(
"0xf1b5b1122b48d985c9dccaae7978a607b77bd7e0a851ff9e750acacfd2919c3f",
privateKey
)
assertEquals(
"0x08c85dc326ddb9f23265fdc4c71f6d763439a29080353e6a2461e6b0f25cfecb2405e9e2d7fb7bd81ac42d2fbf53253c5e03fa73d8a755727c474f11fa37db401c",
Numeric.toHexString(signedHash)
)
}
}
68 changes: 68 additions & 0 deletions rust/tw_evm/tests/biz_ffi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ use tw_evm::address::Address;
use tw_evm::ffi::biz::{
tw_biz_get_encoded_hash, tw_biz_get_signed_hash, tw_biz_sign_execute_with_signature_call,
};
use tw_hash::sha3::keccak256;
use tw_memory::test_utils::tw_data_helper::TWDataHelper;
use tw_memory::test_utils::tw_string_helper::TWStringHelper;
use tw_number::U256;
Expand Down Expand Up @@ -114,3 +115,70 @@ fn test_execute_with_signature_ffi() {
let expected = "0x1d92e4b600000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000004b0f1812e5df2a09796481ff14017e6005508003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000044095ea7b3000000000000000000000000bc472b43bc237f733c78a581078f58a6a89c46ec00000000000000000000000000000000000000000000000000000000000003e8000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000041db18e3a0150ddef964810e480b25592942a22d0b583f7d5cbb33ef6fb4baa66e753af78e967ee374070e16cf963a6cd7a3adb713e50d553aefbc361c48366a101b00000000000000000000000000000000000000000000000000000000000000";
assert_eq!(encoded.to_vec().unwrap().to_hex_prefixed(), expected);
}

/// Tests off-chain message signing for Biz `isValidSignature()` (EIP-1271).
#[test]
fn test_biz_offchain_msg_signing() {
let biz_msg_type_hash = keccak256(b"Biz(bytes32 msgHash)");
assert_eq!(
hex::encode(&biz_msg_type_hash, true),
"0x31322a37c2a66b24e1088197e5b24fcc050625c13d4b84c3eaa6a8be5270321d"
);

let chain_id = U256::from(31337u64).to_big_endian();
let chain_id = TWDataHelper::create(chain_id.to_vec());
let code_address = TWStringHelper::create("0xc7183455a4C133Ae270771860664b6B7ec320bB1");
let code_name = TWStringHelper::create("Biz");
let code_version = TWStringHelper::create("v2.0.0");
let type_hash = TWStringHelper::create(
"0x31322a37c2a66b24e1088197e5b24fcc050625c13d4b84c3eaa6a8be5270321d",
);
let domain_separator_hash = TWStringHelper::create(
"0xd87cd6ef79d4e2b95e15ce8abf732db51ec771f1ca2edccf22a46c729ac56472",
);
let sender = TWStringHelper::create("0x328809Bc894f92807417D2dAD6b7C998c1aFdac6");

let raw_hash = keccak256(b"test message");
assert_eq!(
hex::encode(&raw_hash, true),
"0xea83cdcdd06bf61e414054115a551e23133711d0507dcbc07a4bab7dc4581935"
);

let inner_hash = keccak256(&raw_hash);
assert_eq!(
hex::encode(&inner_hash, true),
"0x4a57b5e386189fd992a83269e996782dbfb8ad539903019abcff0a5b3c012671"
);

let inner_hash_str = TWStringHelper::create(&hex::encode(&inner_hash, true));
let encoded_hash = TWDataHelper::wrap(unsafe {
tw_biz_get_encoded_hash(
chain_id.ptr(),
code_address.ptr(),
code_name.ptr(),
code_version.ptr(),
type_hash.ptr(),
domain_separator_hash.ptr(),
sender.ptr(),
inner_hash_str.ptr(),
)
});
assert_eq!(
hex::encode(encoded_hash.to_vec().unwrap(), true),
"0xf1b5b1122b48d985c9dccaae7978a607b77bd7e0a851ff9e750acacfd2919c3f"
);

let private_key = TWStringHelper::create(
"0x9c0257114eb9399a2985f8e75dad7600c5d89fe3824ffa99ec1c3eb8bf3b0501",
);
let encoded_hash_str = TWStringHelper::create(
"0xf1b5b1122b48d985c9dccaae7978a607b77bd7e0a851ff9e750acacfd2919c3f",
);
let signed_hash = TWDataHelper::wrap(unsafe {
tw_biz_get_signed_hash(encoded_hash_str.ptr(), private_key.ptr())
});
assert_eq!(
hex::encode(signed_hash.to_vec().unwrap(), true),
"0x08c85dc326ddb9f23265fdc4c71f6d763439a29080353e6a2461e6b0f25cfecb2405e9e2d7fb7bd81ac42d2fbf53253c5e03fa73d8a755727c474f11fa37db401c"
);
}
Loading