mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-22 23:48:12 +00:00
implement ethereum signing check
This commit is contained in:
parent
4e0a69b6ea
commit
efd443abe8
@ -280,6 +280,31 @@ static void layoutEthereumConfirmTx(const uint8_t *to, const uint8_t *value, uin
|
|||||||
* - data (0 ..)
|
* - data (0 ..)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
static bool ethereum_signing_check(EthereumSignTx *msg)
|
||||||
|
{
|
||||||
|
// determine if address == 0
|
||||||
|
bool address_zero = msg->has_to;
|
||||||
|
if (address_zero) {
|
||||||
|
for (size_t i = 0; i < msg->to.size; i++) {
|
||||||
|
if (msg->to.bytes[i] > 0) {
|
||||||
|
address_zero = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// sending value to address 0
|
||||||
|
if (address_zero && msg->has_value && msg->value.size) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// sending transaction to address 0 without a data field
|
||||||
|
if (address_zero && (!msg->has_data_length || msg->data_length == 0)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void ethereum_signing_init(EthereumSignTx *msg, const HDNode *node)
|
void ethereum_signing_init(EthereumSignTx *msg, const HDNode *node)
|
||||||
{
|
{
|
||||||
signing = true;
|
signing = true;
|
||||||
@ -308,6 +333,13 @@ void ethereum_signing_init(EthereumSignTx *msg, const HDNode *node)
|
|||||||
data_total = 0;
|
data_total = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// safety checks
|
||||||
|
if (!ethereum_signing_check(msg)) {
|
||||||
|
fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing aborted (safety check failed)");
|
||||||
|
ethereum_signing_abort();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
layoutEthereumConfirmTx(msg->has_to ? msg->to.bytes : NULL, msg->has_value ? msg->value.bytes : NULL, msg->has_value ? msg->value.size : 0);
|
layoutEthereumConfirmTx(msg->has_to ? msg->to.bytes : NULL, msg->has_value ? msg->value.bytes : NULL, msg->has_value ? msg->value.size : 0);
|
||||||
if (!protectButton(ButtonRequestType_ButtonRequest_SignTx, false)) {
|
if (!protectButton(ButtonRequestType_ButtonRequest_SignTx, false)) {
|
||||||
fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing cancelled by user");
|
fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing cancelled by user");
|
||||||
|
Loading…
Reference in New Issue
Block a user