Skip to content

Commit cf99c8c

Browse files
committed
fixup! eth: add streaming support for large data for EIP-712 typed data
1 parent fdfbec1 commit cf99c8c

2 files changed

Lines changed: 20 additions & 54 deletions

File tree

src/eth.rs

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -383,7 +383,7 @@ fn encode_value(typ: &MemberType, value: &Value) -> Result<Vec<u8>, String> {
383383
fn get_value(
384384
what: &pb::EthTypedMessageValueResponse,
385385
msg: &Eip712Message,
386-
) -> Result<Vec<u8>, String> {
386+
) -> Result<(Vec<u8>, DataType), String> {
387387
enum Either<'a> {
388388
HashMap(&'a HashMap<String, Value>),
389389
JsonValue(Value),
@@ -446,8 +446,10 @@ fn get_value(
446446
_ => return Err("path element does not point to struct or array".into()),
447447
}
448448
}
449+
let data_type =
450+
DataType::try_from(typ.r#type).map_err(|_| format!("invalid data type: {}", typ.r#type))?;
449451
if let Either::JsonValue(value) = &value {
450-
encode_value(&typ, value)
452+
encode_value(&typ, value).map(|v| (v, data_type))
451453
} else {
452454
Err("path points to struct or array; value expected".to_string())
453455
}
@@ -700,7 +702,13 @@ impl<R: Runtime> PairedBitBox<R> {
700702
))
701703
.await?;
702704
while let pb::eth_response::Response::TypedMsgValue(typed_msg_value) = &response {
703-
let value = get_value(typed_msg_value, &msg).map_err(Error::EthTypedMessage)?;
705+
let (value, data_type) =
706+
get_value(typed_msg_value, &msg).map_err(Error::EthTypedMessage)?;
707+
if data_type == DataType::String && value.len() > STREAMING_THRESHOLD {
708+
return Err(Error::EthTypedMessage(
709+
"string value exceeds maximum size".into(),
710+
));
711+
}
704712
let use_streaming = value.len() > STREAMING_THRESHOLD;
705713
response = self
706714
.query_proto_eth(pb::eth_request::Request::TypedMsgValue(
@@ -1231,7 +1239,7 @@ mod tests {
12311239
.is_err());
12321240

12331241
// domain.name
1234-
let value = get_value(
1242+
let (value, _) = get_value(
12351243
&pb::EthTypedMessageValueResponse {
12361244
root_object: RootObject::Domain as _,
12371245
path: vec![0],
@@ -1242,7 +1250,7 @@ mod tests {
12421250
assert_eq!(value, b"Ether Mail".to_vec());
12431251

12441252
// domain.version
1245-
let value = get_value(
1253+
let (value, _) = get_value(
12461254
&pb::EthTypedMessageValueResponse {
12471255
root_object: RootObject::Domain as _,
12481256
path: vec![1],
@@ -1253,7 +1261,7 @@ mod tests {
12531261
assert_eq!(value, b"1".to_vec());
12541262

12551263
// domain.chainId
1256-
let value = get_value(
1264+
let (value, _) = get_value(
12571265
&pb::EthTypedMessageValueResponse {
12581266
root_object: RootObject::Domain as _,
12591267
path: vec![2],
@@ -1264,7 +1272,7 @@ mod tests {
12641272
assert_eq!(value, b"\x01".to_vec());
12651273

12661274
// domain.verifyingContract
1267-
let value = get_value(
1275+
let (value, _) = get_value(
12681276
&pb::EthTypedMessageValueResponse {
12691277
root_object: RootObject::Domain as _,
12701278
path: vec![3],
@@ -1289,7 +1297,7 @@ mod tests {
12891297
// MESSAGE
12901298

12911299
// message.from.name
1292-
let value = get_value(
1300+
let (value, _) = get_value(
12931301
&pb::EthTypedMessageValueResponse {
12941302
root_object: RootObject::Message as _,
12951303
path: vec![0, 0],
@@ -1300,7 +1308,7 @@ mod tests {
13001308
assert_eq!(value, b"Cow".to_vec());
13011309

13021310
// message.from.wallet
1303-
let value = get_value(
1311+
let (value, _) = get_value(
13041312
&pb::EthTypedMessageValueResponse {
13051313
root_object: RootObject::Message as _,
13061314
path: vec![0, 1],
@@ -1314,7 +1322,7 @@ mod tests {
13141322
);
13151323

13161324
// message.to.wallet
1317-
let value = get_value(
1325+
let (value, _) = get_value(
13181326
&pb::EthTypedMessageValueResponse {
13191327
root_object: RootObject::Message as _,
13201328
path: vec![1, 1],
@@ -1328,7 +1336,7 @@ mod tests {
13281336
);
13291337

13301338
// message.attachments.0.contents
1331-
let value = get_value(
1339+
let (value, _) = get_value(
13321340
&pb::EthTypedMessageValueResponse {
13331341
root_object: RootObject::Message as _,
13341342
path: vec![3, 0, 0],
@@ -1339,7 +1347,7 @@ mod tests {
13391347
assert_eq!(value, b"attachment1".to_vec());
13401348

13411349
// message.attachments.1.contents
1342-
let value = get_value(
1350+
let (value, _) = get_value(
13431351
&pb::EthTypedMessageValueResponse {
13441352
root_object: RootObject::Message as _,
13451353
path: vec![3, 1, 0],

tests/test_eth.rs

Lines changed: 0 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -376,45 +376,3 @@ async fn test_eth_sign_typed_message_streaming_bytes() {
376376
})
377377
.await
378378
}
379-
380-
#[tokio::test]
381-
async fn test_eth_sign_typed_message_streaming_string() {
382-
test_initialized_simulators(async |paired_bitbox| {
383-
if !semver::VersionReq::parse(">=9.26.0")
384-
.unwrap()
385-
.matches(paired_bitbox.version())
386-
{
387-
return;
388-
}
389-
390-
let large_string = "a".repeat(10000);
391-
let msg = format!(
392-
r#"{{
393-
"types": {{
394-
"EIP712Domain": [
395-
{{ "name": "name", "type": "string" }}
396-
],
397-
"Msg": [
398-
{{ "name": "data", "type": "string" }}
399-
]
400-
}},
401-
"primaryType": "Msg",
402-
"domain": {{
403-
"name": "Test"
404-
}},
405-
"message": {{
406-
"data": "{large_string}"
407-
}}
408-
}}"#
409-
);
410-
411-
let signature = paired_bitbox
412-
.eth_sign_typed_message(1, &"m/44'/60'/0'/0/0".try_into().unwrap(), &msg, false)
413-
.await
414-
.unwrap();
415-
assert_eq!(signature.len(), 65);
416-
let sighash = eip712_sighash("Msg", "string", "a".repeat(10000).as_bytes());
417-
verify_eth_signature(&sighash, &signature);
418-
})
419-
.await
420-
}

0 commit comments

Comments
 (0)