eth: drop needless RefCell in sign typed msg unit tests
What changed, and why it matters
This commit only cleans up internal unit tests for Ethereum typed-message signing. It removes an unnecessary Rust borrow-checking wrapper (RefCell) from test code, with no change to the actual firmware behavior that users interact with. There is no security fix or vulnerability here.
No action required. Treat as routine code hygiene / test refactoring.
Security signals we found
No strong security signals were identified.
Evidence from the diff
The diff modifies src/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rs, exclusively within #[cfg(test)] mod tests blocks. It replaces Rc
Changed components
src/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rs test module onlyInspect captured patch +24 / −43
diff --git a/src/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rs b/src/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rs
index 9a370f0..d15e93c 100644
--- a/src/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rs
+++ b/src/rust/bitbox02-rust/src/hww/api/ethereum/sign_typed_msg.rs
@@ -758,7 +758,7 @@ mod tests {
member_type: MemberType,
message_obj: Object<'static>,
) -> TestingHal<'static> {
- let typed_msg = alloc::rc::Rc::new(core::cell::RefCell::new(TypedMessage::new(
+ let typed_msg = alloc::rc::Rc::new(TypedMessage::new(
vec![
StructType {
name: "EIP712Domain".into(),
@@ -772,15 +772,13 @@ mod tests {
"Msg",
Object::Struct(vec![Object::String("test")]),
Object::Struct(vec![message_obj]),
- )));
+ ));
{
let typed_msg = typed_msg.clone();
*crate::hww::MOCK_NEXT_REQUEST.0.borrow_mut() = Some(Box::new(move |response| {
- let typed_msg = typed_msg.borrow();
Ok(typed_msg.handle_host_response(&response).unwrap())
}));
}
- let typed_msg = typed_msg.borrow();
let mut mock_hal = TestingHal::new();
block_on(eip712_sighash(
&mut mock_hal,
@@ -1275,7 +1273,7 @@ mod tests {
/// Test computation of the domain separator, which is `hashStruct(domain)`.
#[test]
fn test_domain_separator() {
- let typed_msg = alloc::rc::Rc::new(core::cell::RefCell::new(TypedMessage::new(
+ let typed_msg = alloc::rc::Rc::new(TypedMessage::new(
make_types(),
"Mail",
Object::Struct(vec![
@@ -1285,15 +1283,13 @@ mod tests {
Object::String("0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"),
]),
Object::Struct(vec![]),
- )));
+ ));
{
let typed_msg = typed_msg.clone();
*crate::hww::MOCK_NEXT_REQUEST.0.borrow_mut() = Some(Box::new(move |response| {
- let typed_msg = typed_msg.borrow();
Ok(typed_msg.handle_host_response(&response).unwrap())
}));
}
- let typed_msg = typed_msg.borrow();
let mut mock_hal = TestingHal::new();
let domain_separator = block_on(hash_struct(
&mut mock_hal,
@@ -1589,7 +1585,7 @@ mod tests {
let bytes32 = b"\xd0\xf0\x29\x88\xfd\x88\x15\x65\xe9\x27\xc7\x47\x3c\x28\x73\x22\xdb\x16\x69\x01\xba\xc0\x3b\xef\x55\xd7\xa5\x2a\x5c\x75\x0a\xb4";
let bigint256_positive = b"\x7f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff";
let bigint256_negative = b"\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";
- let typed_msg = alloc::rc::Rc::new(core::cell::RefCell::new(TypedMessage::new(
+ let typed_msg = alloc::rc::Rc::new(TypedMessage::new(
vec![
StructType {
name: "EIP712Domain".into(),
@@ -1810,16 +1806,14 @@ mod tests {
]),
]),
]),
- )));
+ ));
{
let typed_msg = typed_msg.clone();
*crate::hww::MOCK_NEXT_REQUEST.0.borrow_mut() = Some(Box::new(move |response| {
- let typed_msg = typed_msg.borrow();
Ok(typed_msg.handle_host_response(&response).unwrap())
}));
}
- let typed_msg = typed_msg.borrow();
let mut mock_hal = TestingHal::new();
let sighash = block_on(eip712_sighash(
&mut mock_hal,
@@ -1876,7 +1870,7 @@ mod tests {
/// ```
#[test]
fn test_no_message() {
- let typed_msg = alloc::rc::Rc::new(core::cell::RefCell::new(TypedMessage::new(
+ let typed_msg = alloc::rc::Rc::new(TypedMessage::new(
vec![StructType {
name: "EIP712Domain".into(),
members: vec![
@@ -1898,16 +1892,14 @@ mod tests {
Object::String("0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC"),
]),
Object::Struct(vec![]),
- )));
+ ));
{
let typed_msg = typed_msg.clone();
*crate::hww::MOCK_NEXT_REQUEST.0.borrow_mut() = Some(Box::new(move |response| {
- let typed_msg = typed_msg.borrow();
Ok(typed_msg.handle_host_response(&response).unwrap())
}));
}
- let typed_msg = typed_msg.borrow();
let sighash = block_on(eip712_sighash(
&mut TestingHal::new(),
&typed_msg.types,
@@ -2019,18 +2011,16 @@ mod tests {
}
_ => panic!("unhandled field_type in test data: {}", tc.field_type),
};
- let typed_msg = alloc::rc::Rc::new(core::cell::RefCell::new(TypedMessage::new(
+ let typed_msg = alloc::rc::Rc::new(TypedMessage::new(
types.clone(),
primary_type,
build_domain_object(&tc.domain, &types),
Object::Struct(vec![inline_value]),
- )));
+ ));
let typed_msg_clone = typed_msg.clone();
*crate::hww::MOCK_NEXT_REQUEST.0.borrow_mut() = Some(Box::new(move |response| {
- let typed_msg = typed_msg_clone.borrow();
- Ok(typed_msg.handle_host_response(&response).unwrap())
+ Ok(typed_msg_clone.handle_host_response(&response).unwrap())
}));
- let typed_msg = typed_msg.borrow();
let inline_sighash = block_on(eip712_sighash(
&mut TestingHal::new(),
&typed_msg.types,
@@ -2047,18 +2037,16 @@ mod tests {
// Streaming sighash + display verification (bytes only).
if tc.field_type == "bytes" {
let data: Vec<u8> = decode_hex(&tc.message_data);
- let typed_msg = alloc::rc::Rc::new(core::cell::RefCell::new(TypedMessage::new(
+ let typed_msg = alloc::rc::Rc::new(TypedMessage::new(
types.clone(),
primary_type,
build_domain_object(&tc.domain, &types),
Object::Struct(vec![Object::StreamingBytes(data.clone())]),
- )));
+ ));
let typed_msg_clone = typed_msg.clone();
*crate::hww::MOCK_NEXT_REQUEST.0.borrow_mut() = Some(Box::new(move |response| {
- let typed_msg = typed_msg_clone.borrow();
- Ok(typed_msg.handle_host_response(&response).unwrap())
+ Ok(typed_msg_clone.handle_host_response(&response).unwrap())
}));
- let typed_msg = typed_msg.borrow();
let mut mock_hal = TestingHal::new();
let streaming_sighash = block_on(eip712_sighash(
&mut mock_hal,
@@ -2087,18 +2075,16 @@ mod tests {
);
} else if tc.field_type == "string" {
let data_static: &'static str = Box::leak(tc.message_data.clone().into_boxed_str());
- let typed_msg = alloc::rc::Rc::new(core::cell::RefCell::new(TypedMessage::new(
+ let typed_msg = alloc::rc::Rc::new(TypedMessage::new(
types.clone(),
primary_type,
build_domain_object(&tc.domain, &types),
Object::Struct(vec![Object::String(data_static)]),
- )));
+ ));
let typed_msg_clone = typed_msg.clone();
*crate::hww::MOCK_NEXT_REQUEST.0.borrow_mut() = Some(Box::new(move |response| {
- let typed_msg = typed_msg_clone.borrow();
- Ok(typed_msg.handle_host_response(&response).unwrap())
+ Ok(typed_msg_clone.handle_host_response(&response).unwrap())
}));
- let typed_msg = typed_msg.borrow();
let mut mock_hal = TestingHal::new();
let sighash = block_on(eip712_sighash(
&mut mock_hal,
@@ -2133,16 +2119,15 @@ mod tests {
mock_unlocked();
let data: Vec<u8> = decode_hex(&tc.message_data);
let expected_sig = decode_hex(expected_sig_hex);
- let typed_msg = alloc::rc::Rc::new(core::cell::RefCell::new(TypedMessage::new(
+ let typed_msg = alloc::rc::Rc::new(TypedMessage::new(
types.clone(),
primary_type,
build_domain_object(&tc.domain, &types),
Object::Struct(vec![Object::StreamingBytes(data.clone())]),
- )));
+ ));
let typed_msg_clone = typed_msg.clone();
*crate::hww::MOCK_NEXT_REQUEST.0.borrow_mut() = Some(Box::new(move |response| {
- let typed_msg = typed_msg_clone.borrow();
- Ok(typed_msg.handle_host_response(&response).unwrap())
+ Ok(typed_msg_clone.handle_host_response(&response).unwrap())
}));
let mut mock_hal = TestingHal::new();
assert_eq!(
@@ -2191,7 +2176,7 @@ mod tests {
/// Streaming is rejected for non-streamable types (e.g. uint).
#[test]
fn test_streaming_rejected_for_uint() {
- let typed_msg = alloc::rc::Rc::new(core::cell::RefCell::new(TypedMessage::new(
+ let typed_msg = alloc::rc::Rc::new(TypedMessage::new(
vec![
StructType {
name: "EIP712Domain".into(),
@@ -2205,15 +2190,13 @@ mod tests {
"Msg",
Object::Struct(vec![Object::String("test")]),
Object::Struct(vec![Object::StreamingBytes(vec![0x01; 100])]),
- )));
+ ));
{
let typed_msg = typed_msg.clone();
*crate::hww::MOCK_NEXT_REQUEST.0.borrow_mut() = Some(Box::new(move |response| {
- let typed_msg = typed_msg.borrow();
Ok(typed_msg.handle_host_response(&response).unwrap())
}));
}
- let typed_msg = typed_msg.borrow();
let mut mock_hal = TestingHal::new();
let result = block_on(eip712_sighash(
&mut mock_hal,
@@ -2226,7 +2209,7 @@ mod tests {
/// Streaming is rejected for fixed-size bytes (e.g. bytes32).
#[test]
fn test_streaming_rejected_for_fixed_bytes() {
- let typed_msg = alloc::rc::Rc::new(core::cell::RefCell::new(TypedMessage::new(
+ let typed_msg = alloc::rc::Rc::new(TypedMessage::new(
vec![
StructType {
name: "EIP712Domain".into(),
@@ -2240,15 +2223,13 @@ mod tests {
"Msg",
Object::Struct(vec![Object::String("test")]),
Object::Struct(vec![Object::StreamingBytes(vec![0x01; 32])]),
- )));
+ ));
{
let typed_msg = typed_msg.clone();
*crate::hww::MOCK_NEXT_REQUEST.0.borrow_mut() = Some(Box::new(move |response| {
- let typed_msg = typed_msg.borrow();
Ok(typed_msg.handle_host_response(&response).unwrap())
}));
}
- let typed_msg = typed_msg.borrow();
let mut mock_hal = TestingHal::new();
let result = block_on(eip712_sighash(
&mut mock_hal,
Why this scored 15/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.