From 5e6e56ac4d580d5fdb96249ea1478e621c384d77 Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Sat, 6 Nov 2021 11:07:36 +0100 Subject: [PATCH] feat(legacy): Show address confirmation in SignMessage. --- legacy/firmware/.changelog.d/1586.added.1 | 1 + legacy/firmware/ethereum.c | 10 ----- legacy/firmware/fsm_msg_coin.h | 50 +++++++++++++---------- legacy/firmware/fsm_msg_ethereum.h | 29 ++++++++++--- 4 files changed, 53 insertions(+), 37 deletions(-) create mode 100644 legacy/firmware/.changelog.d/1586.added.1 diff --git a/legacy/firmware/.changelog.d/1586.added.1 b/legacy/firmware/.changelog.d/1586.added.1 new file mode 100644 index 000000000..04f09d2ff --- /dev/null +++ b/legacy/firmware/.changelog.d/1586.added.1 @@ -0,0 +1 @@ +Show address confirmation in SignMessage. diff --git a/legacy/firmware/ethereum.c b/legacy/firmware/ethereum.c index e13d6ffe7..a11cbc0e5 100644 --- a/legacy/firmware/ethereum.c +++ b/legacy/firmware/ethereum.c @@ -905,16 +905,6 @@ static void ethereum_message_hash(const uint8_t *message, size_t message_len, void ethereum_message_sign(const EthereumSignMessage *msg, const HDNode *node, EthereumMessageSignature *resp) { - uint8_t pubkeyhash[20] = {0}; - if (!hdnode_get_ethereum_pubkeyhash(node, pubkeyhash)) { - return; - } - - resp->address[0] = '0'; - resp->address[1] = 'x'; - ethereum_address_checksum(pubkeyhash, resp->address + 2, false, 0); - // ethereum_address_checksum adds trailing zero - uint8_t hash[32] = {0}; ethereum_message_hash(msg->message.bytes, msg->message.size, hash); diff --git a/legacy/firmware/fsm_msg_coin.h b/legacy/firmware/fsm_msg_coin.h index 247a680bb..711d22e36 100644 --- a/legacy/firmware/fsm_msg_coin.h +++ b/legacy/firmware/fsm_msg_coin.h @@ -256,13 +256,6 @@ void fsm_msgSignMessage(const SignMessage *msg) { CHECK_INITIALIZED - layoutSignMessage(msg->message.bytes, msg->message.size); - if (!protectButton(ButtonRequestType_ButtonRequest_ProtectCall, false)) { - fsm_sendFailure(FailureType_Failure_ActionCancelled, NULL); - layoutHome(); - return; - } - CHECK_PIN const CoinInfo *coin = fsm_getCoin(msg->has_coin_name, msg->coin_name); @@ -271,24 +264,39 @@ void fsm_msgSignMessage(const SignMessage *msg) { msg->address_n_count, NULL); if (!node) return; + if (hdnode_fill_public_key(node) != 0) { + fsm_sendFailure(FailureType_Failure_ProcessError, + _("Failed to derive public key")); + layoutHome(); + return; + } + + if (!compute_address(coin, msg->script_type, node, false, NULL, + resp->address)) { + fsm_sendFailure(FailureType_Failure_ProcessError, + _("Error computing address")); + layoutHome(); + return; + } + + layoutVerifyAddress(coin, resp->address); + if (!protectButton(ButtonRequestType_ButtonRequest_Other, false)) { + fsm_sendFailure(FailureType_Failure_ActionCancelled, NULL); + layoutHome(); + return; + } + + layoutSignMessage(msg->message.bytes, msg->message.size); + if (!protectButton(ButtonRequestType_ButtonRequest_ProtectCall, false)) { + fsm_sendFailure(FailureType_Failure_ActionCancelled, NULL); + layoutHome(); + return; + } + layoutProgressSwipe(_("Signing"), 0); if (cryptoMessageSign(coin, node, msg->script_type, msg->no_script_type, msg->message.bytes, msg->message.size, resp->signature.bytes) == 0) { - if (hdnode_fill_public_key(node) != 0) { - fsm_sendFailure(FailureType_Failure_ProcessError, - _("Failed to derive public key")); - layoutHome(); - return; - } - - if (!compute_address(coin, msg->script_type, node, false, NULL, - resp->address)) { - fsm_sendFailure(FailureType_Failure_ProcessError, - _("Error computing address")); - layoutHome(); - return; - } resp->signature.size = 65; msg_write(MessageType_MessageType_MessageSignature, resp); } else { diff --git a/legacy/firmware/fsm_msg_ethereum.h b/legacy/firmware/fsm_msg_ethereum.h index fb5032177..e2f30eaba 100644 --- a/legacy/firmware/fsm_msg_ethereum.h +++ b/legacy/firmware/fsm_msg_ethereum.h @@ -150,6 +150,29 @@ void fsm_msgEthereumSignMessage(const EthereumSignMessage *msg) { CHECK_INITIALIZED + CHECK_PIN + + const HDNode *node = fsm_getDerivedNode(SECP256K1_NAME, msg->address_n, + msg->address_n_count, NULL); + if (!node) return; + + uint8_t pubkeyhash[20] = {0}; + if (!hdnode_get_ethereum_pubkeyhash(node, pubkeyhash)) { + return; + } + + resp->address[0] = '0'; + resp->address[1] = 'x'; + ethereum_address_checksum(pubkeyhash, resp->address + 2, false, 0); + // ethereum_address_checksum adds trailing zero + + layoutVerifyAddress(NULL, resp->address); + if (!protectButton(ButtonRequestType_ButtonRequest_Other, false)) { + fsm_sendFailure(FailureType_Failure_ActionCancelled, NULL); + layoutHome(); + return; + } + layoutSignMessage(msg->message.bytes, msg->message.size); if (!protectButton(ButtonRequestType_ButtonRequest_ProtectCall, false)) { fsm_sendFailure(FailureType_Failure_ActionCancelled, NULL); @@ -157,12 +180,6 @@ void fsm_msgEthereumSignMessage(const EthereumSignMessage *msg) { return; } - CHECK_PIN - - const HDNode *node = fsm_getDerivedNode(SECP256K1_NAME, msg->address_n, - msg->address_n_count, NULL); - if (!node) return; - ethereum_message_sign(msg, node, resp); layoutHome(); }