diff --git a/legacy/firmware/ethereum_definitions.c b/legacy/firmware/ethereum_definitions.c index 7bdc155869..4ffc3de388 100644 --- a/legacy/firmware/ethereum_definitions.c +++ b/legacy/firmware/ethereum_definitions.c @@ -242,7 +242,8 @@ bool _get_EthereumNetworkInfo( // chain_id mismatch - error and reset definition fsm_sendFailure(FailureType_Failure_DataError, _("Invalid network definition - chain IDs not equal.")); - _set_EthereumNetworkInfo_to_builtin(ref_chain_id, network); + _set_EthereumNetworkInfo_to_builtin(CHAIN_ID_UNKNOWN, network); + return false; } else { // chain_id does match the reference one (if provided) so prepend one // space character to symbol, terminate it (encoded definitions does not @@ -251,15 +252,14 @@ bool _get_EthereumNetworkInfo( sizeof(network->shortcut) - 2); network->shortcut[0] = ' '; network->shortcut[sizeof(network->shortcut) - 1] = 0; - return true; } } else { // decoding failed - reset network definition - _set_EthereumNetworkInfo_to_builtin(ref_chain_id, network); + _set_EthereumNetworkInfo_to_builtin(CHAIN_ID_UNKNOWN, network); } } - return network->chain_id == CHAIN_ID_UNKNOWN ? false : true; + return true; } void _get_EthereumTokenInfo( @@ -322,7 +322,13 @@ const EthereumDefinitions *get_EthereumDefinitions( const uint64_t ref_chain_id, const char *ref_address) { static EthereumDefinitions defs; - if (_get_EthereumNetworkInfo(encoded_network, ref_chain_id, &defs.network)) { + if (!_get_EthereumNetworkInfo(encoded_network, ref_chain_id, &defs.network)) { + // error while decoding - chain IDs mismatch + return NULL; + } + + if (strncmp(defs.network.shortcut, UNKNOWN_NETWORK_SHORTCUT, + sizeof(defs.network.shortcut)) != 0) { // we have found network definition, we can try to load token definition _get_EthereumTokenInfo(encoded_token, ref_chain_id, ref_address, &defs.token); diff --git a/legacy/firmware/fsm_msg_ethereum.h b/legacy/firmware/fsm_msg_ethereum.h index 5df5b5ae5f..8914a6f400 100644 --- a/legacy/firmware/fsm_msg_ethereum.h +++ b/legacy/firmware/fsm_msg_ethereum.h @@ -47,6 +47,10 @@ void fsm_msgEthereumGetPublicKey(const EthereumGetPublicKey *msg) { const EthereumDefinitions *defs = get_EthereumDefinitions(encoded_network, NULL, CHAIN_ID_UNKNOWN, NULL); + if (!defs) { + layoutHome(); + return; + } // we use Bitcoin-like format for ETH const CoinInfo *coin = fsm_getCoin(true, "Bitcoin"); @@ -119,8 +123,8 @@ void fsm_msgEthereumSignTx(const EthereumSignTx *msg) { get_EthereumDefinitions(encoded_network, encoded_token, msg->chain_id, msg->has_to ? msg->to : NULL); - if (!fsm_ethereumCheckPath(msg->address_n_count, msg->address_n, false, - defs)) { + if (!defs || !fsm_ethereumCheckPath(msg->address_n_count, msg->address_n, + false, defs)) { layoutHome(); return; } @@ -155,8 +159,8 @@ void fsm_msgEthereumSignTxEIP1559(const EthereumSignTxEIP1559 *msg) { get_EthereumDefinitions(encoded_network, encoded_token, msg->chain_id, msg->has_to ? msg->to : NULL); - if (!fsm_ethereumCheckPath(msg->address_n_count, msg->address_n, false, - defs)) { + if (!defs || !fsm_ethereumCheckPath(msg->address_n_count, msg->address_n, + false, defs)) { layoutHome(); return; } @@ -190,8 +194,8 @@ void fsm_msgEthereumGetAddress(const EthereumGetAddress *msg) { const EthereumDefinitions *defs = get_EthereumDefinitions(encoded_network, NULL, CHAIN_ID_UNKNOWN, NULL); - if (!fsm_ethereumCheckPath(msg->address_n_count, msg->address_n, false, - defs)) { + if (!defs || !fsm_ethereumCheckPath(msg->address_n_count, msg->address_n, + false, defs)) { layoutHome(); return; } @@ -263,8 +267,8 @@ void fsm_msgEthereumSignMessage(const EthereumSignMessage *msg) { const EthereumDefinitions *defs = get_EthereumDefinitions(encoded_network, NULL, CHAIN_ID_UNKNOWN, NULL); - if (!fsm_ethereumCheckPath(msg->address_n_count, msg->address_n, false, - defs)) { + if (!defs || !fsm_ethereumCheckPath(msg->address_n_count, msg->address_n, + false, defs)) { layoutHome(); return; } @@ -359,8 +363,8 @@ void fsm_msgEthereumSignTypedHash(const EthereumSignTypedHash *msg) { const EthereumDefinitions *defs = get_EthereumDefinitions(encoded_network, NULL, CHAIN_ID_UNKNOWN, NULL); - if (!fsm_ethereumCheckPath(msg->address_n_count, msg->address_n, false, - defs)) { + if (!defs || !fsm_ethereumCheckPath(msg->address_n_count, msg->address_n, + false, defs)) { layoutHome(); return; }