Skip to content

Commit 4ac7391

Browse files
authored
fix(legacy): fix ada swap issue and add common path check for chains (#549)
* fix(legacy): fix ada issue * fix(legacy): add common path check for chains * feat(legacy): add dnx support * fix(legacy): remove `EthereumSignMessageEIP712` support * fix(legacy): fix xpub display format when get multisig address * fix(legacy): add double confirm for safety_check settings * fix(legacy): fix evm dispay with raw data * chore(legacy): remove the export tracking key feature of dnx * fix(protob): fix lint issue * chore(legacy): bump version to 3.8.0
1 parent bd4fa4b commit 4ac7391

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

58 files changed

+1692
-379
lines changed

common/protob/check.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
prefix = "NEM"
2222
elif prefix == "Webauthn":
2323
prefix = "WebAuthn"
24+
elif prefix == "Dynex":
25+
prefix = "Dnx"
2426
for line in f:
2527
line = line.strip().split(" ")
2628
if line[0] not in ("enum", "message"):

common/protob/messages-dynex.proto

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
syntax = "proto2";
2+
package hw.trezor.messages.dynex;
3+
4+
// Sugar for easier handling in Java
5+
option java_package = "com.satoshilabs.trezor.lib.protobuf";
6+
option java_outer_classname = "TrezorMessageDynex";
7+
8+
/**
9+
* Request: Address at the specified index
10+
* @start
11+
* @next DnxAddress
12+
*/
13+
message DnxGetAddress {
14+
repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node
15+
optional bool show_display = 2; // optionally show on display before sending the result
16+
}
17+
18+
/**
19+
* Response: Address for the given index
20+
* @end
21+
*/
22+
message DnxAddress {
23+
optional string address = 1; // Dnx address as hex-encoded string
24+
}
25+
26+
/**
27+
* Request: Sign a transaction
28+
* @start
29+
* @next DnxInputRequest
30+
*/
31+
message DnxSignTx {
32+
repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node
33+
required uint32 inputs_count = 2; // number of transaction inputs
34+
required string to_address = 3; // address to send to
35+
required uint64 amount = 4; // amount to send in nanoDnx
36+
required uint64 fee = 5; // fee to pay in nanoDnx
37+
optional bytes payment_id = 6; // payment ID to use for the transaction
38+
}
39+
40+
/**
41+
* Request: Ask client for corresponding input details
42+
* @start
43+
* @next DnxInputAck
44+
*/
45+
message DnxInputRequest {
46+
optional uint32 request_index = 1;
47+
optional DnxTxKey tx_key = 2;
48+
optional DnxComputedKeyImage computed_key_image = 3;
49+
message DnxTxKey {
50+
optional bytes ephemeral_tx_sec_key = 1;
51+
optional bytes ephemeral_tx_pub_key = 2;
52+
}
53+
message DnxComputedKeyImage {
54+
optional bytes key_image = 1;
55+
}
56+
}
57+
58+
/**
59+
* Response: Input details
60+
* @next DnxInputRequest
61+
* @end
62+
*
63+
**/
64+
message DnxInputAck {
65+
required uint32 prev_index = 1;
66+
required uint32 global_index = 2;
67+
required bytes tx_pubkey = 3;
68+
required bytes prev_out_pubkey = 4;
69+
required uint64 amount = 5;
70+
}
71+
72+
/**
73+
* Request: requset for signature and output key
74+
* @start
75+
* @next DnxSignedTx
76+
*/
77+
message DnxRTSigsRequest {
78+
79+
}
80+
81+
82+
/**
83+
* Response: Signature and output key
84+
* @end
85+
*
86+
**/
87+
message DnxSignedTx {
88+
repeated bytes signatures = 1;
89+
repeated bytes output_keys = 2;
90+
}

common/protob/messages-ethereum-onekey.proto

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -175,17 +175,3 @@ message EthereumTypedDataSignatureOneKey {
175175
required bytes signature = 1; // signature of the typed data
176176
required string address = 2; // address used to sign the typed data
177177
}
178-
179-
180-
/**
181-
* Request: Ask device to sign message EIP712
182-
* @start
183-
* @next EthereumMessageSignature
184-
* @next Failure
185-
*/
186-
message EthereumSignMessageEIP712 {
187-
repeated uint32 address_n = 1; // BIP-32 path to derive the key from master node
188-
optional bytes domain_hash = 2; // domainSeparator hash
189-
optional bytes message_hash = 3; // message hash
190-
}
191-

common/protob/messages.proto

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -420,7 +420,7 @@ enum MessageType {
420420
MessageType_BixinBackupDeviceAck = 915 [(wire_out) = true];
421421

422422
MessageType_BixinPinInputOnDevice = 10000 [(wire_in) = true, (wire_tiny) = true, (wire_no_fsm) = true];
423-
MessageType_EthereumSignMessageEIP712 = 10200 [(wire_in) = true];
423+
MessageType_Deprecated_EthereumSignMessageEIP712 = 10200 [deprecated = true];
424424
MessageType_GetPublicKeyMultiple = 10210 [(wire_in) = true];
425425
MessageType_PublicKeyMultiple = 10211 [(wire_out) = true];
426426

@@ -521,7 +521,14 @@ enum MessageType {
521521
MessageType_NervosTxRequest = 11705 [(wire_out) = true];
522522
MessageType_NervosTxAck = 11706 [(wire_in) = true];
523523

524-
524+
// dnx
525+
MessageType_DnxGetAddress = 11800 [(wire_in) = true];
526+
MessageType_DnxAddress = 11801 [(wire_out) = true];
527+
MessageType_DnxSignTx = 11802 [(wire_in) = true];
528+
MessageType_DnxInputRequest = 11803 [(wire_out) = true];
529+
MessageType_DnxInputAck = 11804 [(wire_in) = true];
530+
MessageType_DnxRTSigsRequest = 11805 [(wire_in) = true];
531+
MessageType_DnxSignedTx = 11806 [(wire_out) = true];
525532
//onekey
526533
MessageType_DeviceEraseSector= 10026 [deprecated = true];
527534

core/src/trezor/enums/MessageType.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,6 @@
280280
BixinBackupDevice = 914
281281
BixinBackupDeviceAck = 915
282282
BixinPinInputOnDevice = 10000
283-
EthereumSignMessageEIP712 = 10200
284283
GetPublicKeyMultiple = 10210
285284
PublicKeyMultiple = 10211
286285
ConfluxGetAddress = 10112
@@ -355,3 +354,10 @@
355354
NervosSignedTx = 11704
356355
NervosTxRequest = 11705
357356
NervosTxAck = 11706
357+
DnxGetAddress = 11800
358+
DnxAddress = 11801
359+
DnxSignTx = 11802
360+
DnxInputRequest = 11803
361+
DnxInputAck = 11804
362+
DnxRTSigsRequest = 11805
363+
DnxSignedTx = 11806

core/src/trezor/enums/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ class MessageType(IntEnum):
298298
BixinBackupDevice = 914
299299
BixinBackupDeviceAck = 915
300300
BixinPinInputOnDevice = 10000
301-
EthereumSignMessageEIP712 = 10200
301+
Deprecated_EthereumSignMessageEIP712 = 10200
302302
GetPublicKeyMultiple = 10210
303303
PublicKeyMultiple = 10211
304304
ConfluxGetAddress = 10112
@@ -373,6 +373,13 @@ class MessageType(IntEnum):
373373
NervosSignedTx = 11704
374374
NervosTxRequest = 11705
375375
NervosTxAck = 11706
376+
DnxGetAddress = 11800
377+
DnxAddress = 11801
378+
DnxSignTx = 11802
379+
DnxInputRequest = 11803
380+
DnxInputAck = 11804
381+
DnxRTSigsRequest = 11805
382+
DnxSignedTx = 11806
376383
DeviceEraseSector = 10026
377384

378385
class FailureType(IntEnum):

core/src/trezor/messages.py

Lines changed: 146 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3470,6 +3470,152 @@ def __init__(
34703470
def is_type_of(cls, msg: Any) -> TypeGuard["DebugLinkWatchLayout"]:
34713471
return isinstance(msg, cls)
34723472

3473+
class DnxGetAddress(protobuf.MessageType):
3474+
address_n: "list[int]"
3475+
show_display: "bool | None"
3476+
3477+
def __init__(
3478+
self,
3479+
*,
3480+
address_n: "list[int] | None" = None,
3481+
show_display: "bool | None" = None,
3482+
) -> None:
3483+
pass
3484+
3485+
@classmethod
3486+
def is_type_of(cls, msg: Any) -> TypeGuard["DnxGetAddress"]:
3487+
return isinstance(msg, cls)
3488+
3489+
class DnxAddress(protobuf.MessageType):
3490+
address: "str | None"
3491+
3492+
def __init__(
3493+
self,
3494+
*,
3495+
address: "str | None" = None,
3496+
) -> None:
3497+
pass
3498+
3499+
@classmethod
3500+
def is_type_of(cls, msg: Any) -> TypeGuard["DnxAddress"]:
3501+
return isinstance(msg, cls)
3502+
3503+
class DnxSignTx(protobuf.MessageType):
3504+
address_n: "list[int]"
3505+
inputs_count: "int"
3506+
to_address: "str"
3507+
amount: "int"
3508+
fee: "int"
3509+
payment_id: "bytes | None"
3510+
3511+
def __init__(
3512+
self,
3513+
*,
3514+
inputs_count: "int",
3515+
to_address: "str",
3516+
amount: "int",
3517+
fee: "int",
3518+
address_n: "list[int] | None" = None,
3519+
payment_id: "bytes | None" = None,
3520+
) -> None:
3521+
pass
3522+
3523+
@classmethod
3524+
def is_type_of(cls, msg: Any) -> TypeGuard["DnxSignTx"]:
3525+
return isinstance(msg, cls)
3526+
3527+
class DnxInputRequest(protobuf.MessageType):
3528+
request_index: "int | None"
3529+
tx_key: "DnxTxKey | None"
3530+
computed_key_image: "DnxComputedKeyImage | None"
3531+
3532+
def __init__(
3533+
self,
3534+
*,
3535+
request_index: "int | None" = None,
3536+
tx_key: "DnxTxKey | None" = None,
3537+
computed_key_image: "DnxComputedKeyImage | None" = None,
3538+
) -> None:
3539+
pass
3540+
3541+
@classmethod
3542+
def is_type_of(cls, msg: Any) -> TypeGuard["DnxInputRequest"]:
3543+
return isinstance(msg, cls)
3544+
3545+
class DnxInputAck(protobuf.MessageType):
3546+
prev_index: "int"
3547+
global_index: "int"
3548+
tx_pubkey: "bytes"
3549+
prev_out_pubkey: "bytes"
3550+
amount: "int"
3551+
3552+
def __init__(
3553+
self,
3554+
*,
3555+
prev_index: "int",
3556+
global_index: "int",
3557+
tx_pubkey: "bytes",
3558+
prev_out_pubkey: "bytes",
3559+
amount: "int",
3560+
) -> None:
3561+
pass
3562+
3563+
@classmethod
3564+
def is_type_of(cls, msg: Any) -> TypeGuard["DnxInputAck"]:
3565+
return isinstance(msg, cls)
3566+
3567+
class DnxRTSigsRequest(protobuf.MessageType):
3568+
3569+
@classmethod
3570+
def is_type_of(cls, msg: Any) -> TypeGuard["DnxRTSigsRequest"]:
3571+
return isinstance(msg, cls)
3572+
3573+
class DnxSignedTx(protobuf.MessageType):
3574+
signatures: "list[bytes]"
3575+
output_keys: "list[bytes]"
3576+
3577+
def __init__(
3578+
self,
3579+
*,
3580+
signatures: "list[bytes] | None" = None,
3581+
output_keys: "list[bytes] | None" = None,
3582+
) -> None:
3583+
pass
3584+
3585+
@classmethod
3586+
def is_type_of(cls, msg: Any) -> TypeGuard["DnxSignedTx"]:
3587+
return isinstance(msg, cls)
3588+
3589+
class DnxTxKey(protobuf.MessageType):
3590+
ephemeral_tx_sec_key: "bytes | None"
3591+
ephemeral_tx_pub_key: "bytes | None"
3592+
3593+
def __init__(
3594+
self,
3595+
*,
3596+
ephemeral_tx_sec_key: "bytes | None" = None,
3597+
ephemeral_tx_pub_key: "bytes | None" = None,
3598+
) -> None:
3599+
pass
3600+
3601+
@classmethod
3602+
def is_type_of(cls, msg: Any) -> TypeGuard["DnxTxKey"]:
3603+
return isinstance(msg, cls)
3604+
3605+
class DnxComputedKeyImage(protobuf.MessageType):
3606+
key_image: "bytes | None"
3607+
3608+
def __init__(
3609+
self,
3610+
*,
3611+
key_image: "bytes | None" = None,
3612+
) -> None:
3613+
pass
3614+
3615+
@classmethod
3616+
def is_type_of(cls, msg: Any) -> TypeGuard["DnxComputedKeyImage"]:
3617+
return isinstance(msg, cls)
3618+
34733619
class EosGetPublicKey(protobuf.MessageType):
34743620
address_n: "list[int]"
34753621
show_display: "bool | None"
@@ -4536,24 +4682,6 @@ def __init__(
45364682
def is_type_of(cls, msg: Any) -> TypeGuard["EthereumTypedDataSignatureOneKey"]:
45374683
return isinstance(msg, cls)
45384684

4539-
class EthereumSignMessageEIP712(protobuf.MessageType):
4540-
address_n: "list[int]"
4541-
domain_hash: "bytes | None"
4542-
message_hash: "bytes | None"
4543-
4544-
def __init__(
4545-
self,
4546-
*,
4547-
address_n: "list[int] | None" = None,
4548-
domain_hash: "bytes | None" = None,
4549-
message_hash: "bytes | None" = None,
4550-
) -> None:
4551-
pass
4552-
4553-
@classmethod
4554-
def is_type_of(cls, msg: Any) -> TypeGuard["EthereumSignMessageEIP712"]:
4555-
return isinstance(msg, cls)
4556-
45574685
class EthereumAccessListOneKey(protobuf.MessageType):
45584686
address: "str"
45594687
storage_keys: "list[bytes]"

legacy/buttons.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,3 +94,33 @@ bool isLongPress(uint8_t key);
9494
#endif
9595

9696
#endif
97+
98+
#define HANDLE_KEY(bubble_key) \
99+
uint8_t key = KEY_NULL; \
100+
key = bubble_key ? bubble_key : protectWaitKey(0, 0); \
101+
switch (key) { \
102+
case KEY_UP: \
103+
case KEY_DOWN: \
104+
goto refresh_menu; \
105+
case KEY_CONFIRM: \
106+
if (max_index == index) { \
107+
result = true; \
108+
break; \
109+
} \
110+
if (index < max_index) { \
111+
index++; \
112+
} \
113+
goto refresh_menu; \
114+
case KEY_CANCEL: \
115+
if (0 == index || max_index == index) { \
116+
result = false; \
117+
break; \
118+
} \
119+
if (index > 0) { \
120+
index--; \
121+
} \
122+
goto refresh_menu; \
123+
default: \
124+
break; \
125+
} \
126+
return result;

0 commit comments

Comments
 (0)