1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-02-09 14:12:51 +00:00

fix(legacy): do not query presence of newly-required protobuf fields

This commit is contained in:
matejcik 2021-01-14 14:16:21 +01:00 committed by matejcik
parent 14037d0c31
commit 0964517fe7
10 changed files with 87 additions and 120 deletions

View File

@ -679,7 +679,6 @@ void ethereum_message_sign(const EthereumSignMessage *msg, const HDNode *node,
return; return;
} }
resp->has_address = true;
resp->address[0] = '0'; resp->address[0] = '0';
resp->address[1] = 'x'; resp->address[1] = 'x';
ethereum_address_checksum(pubkeyhash, resp->address + 2, false, 0); ethereum_address_checksum(pubkeyhash, resp->address + 2, false, 0);
@ -695,7 +694,6 @@ void ethereum_message_sign(const EthereumSignMessage *msg, const HDNode *node,
return; return;
} }
resp->has_signature = true;
resp->signature.bytes[64] = 27 + v; resp->signature.bytes[64] = 27 + v;
resp->signature.size = 65; resp->signature.size = 65;
msg_write(MessageType_MessageType_EthereumMessageSignature, resp); msg_write(MessageType_MessageType_EthereumMessageSignature, resp);

View File

@ -47,7 +47,6 @@ void fsm_msgGetPublicKey(const GetPublicKey *msg) {
if (!node) return; if (!node) return;
hdnode_fill_public_key(node); hdnode_fill_public_key(node);
resp->has_node = true;
resp->node.depth = node->depth; resp->node.depth = node->depth;
resp->node.fingerprint = fingerprint; resp->node.fingerprint = fingerprint;
resp->node.child_num = node->child_num; resp->node.child_num = node->child_num;
@ -61,7 +60,6 @@ void fsm_msgGetPublicKey(const GetPublicKey *msg) {
resp->node.public_key.bytes[0] = 0; resp->node.public_key.bytes[0] = 0;
} }
resp->has_xpub = true;
if (coin->xpub_magic && (script_type == InputScriptType_SPENDADDRESS || if (coin->xpub_magic && (script_type == InputScriptType_SPENDADDRESS ||
script_type == InputScriptType_SPENDMULTISIG)) { script_type == InputScriptType_SPENDMULTISIG)) {
hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub, hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub,
@ -252,7 +250,6 @@ void fsm_msgSignMessage(const SignMessage *msg) {
layoutProgressSwipe(_("Signing"), 0); layoutProgressSwipe(_("Signing"), 0);
if (cryptoMessageSign(coin, node, msg->script_type, msg->message.bytes, if (cryptoMessageSign(coin, node, msg->script_type, msg->message.bytes,
msg->message.size, resp->signature.bytes) == 0) { msg->message.size, resp->signature.bytes) == 0) {
resp->has_address = true;
hdnode_fill_public_key(node); hdnode_fill_public_key(node);
if (!compute_address(coin, msg->script_type, node, false, NULL, if (!compute_address(coin, msg->script_type, node, false, NULL,
resp->address)) { resp->address)) {
@ -261,7 +258,6 @@ void fsm_msgSignMessage(const SignMessage *msg) {
layoutHome(); layoutHome();
return; return;
} }
resp->has_signature = true;
resp->signature.size = 65; resp->signature.size = 65;
msg_write(MessageType_MessageType_MessageSignature, resp); msg_write(MessageType_MessageType_MessageSignature, resp);
} else { } else {

View File

@ -20,11 +20,8 @@
bool get_features(Features *resp) { bool get_features(Features *resp) {
resp->has_vendor = true; resp->has_vendor = true;
strlcpy(resp->vendor, "trezor.io", sizeof(resp->vendor)); strlcpy(resp->vendor, "trezor.io", sizeof(resp->vendor));
resp->has_major_version = true;
resp->major_version = VERSION_MAJOR; resp->major_version = VERSION_MAJOR;
resp->has_minor_version = true;
resp->minor_version = VERSION_MINOR; resp->minor_version = VERSION_MINOR;
resp->has_patch_version = true;
resp->patch_version = VERSION_PATCH; resp->patch_version = VERSION_PATCH;
resp->has_device_id = true; resp->has_device_id = true;
strlcpy(resp->device_id, config_uuid_str, sizeof(resp->device_id)); strlcpy(resp->device_id, config_uuid_str, sizeof(resp->device_id));

View File

@ -20,8 +20,6 @@
void fsm_msgCipherKeyValue(const CipherKeyValue *msg) { void fsm_msgCipherKeyValue(const CipherKeyValue *msg) {
CHECK_INITIALIZED CHECK_INITIALIZED
CHECK_PARAM(msg->has_key, _("No key provided"));
CHECK_PARAM(msg->has_value, _("No value provided"));
CHECK_PARAM(msg->value.size % 16 == 0, CHECK_PARAM(msg->value.size % 16 == 0,
_("Value length must be a multiple of 16")); _("Value length must be a multiple of 16"));
@ -67,7 +65,6 @@ void fsm_msgCipherKeyValue(const CipherKeyValue *msg) {
aes_cbc_decrypt(msg->value.bytes, resp->value.bytes, msg->value.size, aes_cbc_decrypt(msg->value.bytes, resp->value.bytes, msg->value.size,
data + 32, &ctx); data + 32, &ctx);
} }
resp->has_value = true;
resp->value.size = msg->value.size; resp->value.size = msg->value.size;
msg_write(MessageType_MessageType_CipheredKeyValue, resp); msg_write(MessageType_MessageType_CipheredKeyValue, resp);
layoutHome(); layoutHome();
@ -89,8 +86,7 @@ void fsm_msgSignIdentity(const SignIdentity *msg) {
CHECK_PIN CHECK_PIN
uint8_t hash[32]; uint8_t hash[32];
if (!msg->has_identity || if (cryptoIdentityFingerprint(&(msg->identity), hash) == 0) {
cryptoIdentityFingerprint(&(msg->identity), hash) == 0) {
fsm_sendFailure(FailureType_Failure_DataError, _("Invalid identity")); fsm_sendFailure(FailureType_Failure_DataError, _("Invalid identity"));
layoutHome(); layoutHome();
return; return;
@ -152,14 +148,12 @@ void fsm_msgSignIdentity(const SignIdentity *msg) {
node, 0x00, resp->address, node, 0x00, resp->address,
sizeof(resp->address)); // hardcoded Bitcoin address type sizeof(resp->address)); // hardcoded Bitcoin address type
} }
resp->has_public_key = true;
resp->public_key.size = 33; resp->public_key.size = 33;
memcpy(resp->public_key.bytes, node->public_key, 33); memcpy(resp->public_key.bytes, node->public_key, 33);
if (node->public_key[0] == 1) { if (node->public_key[0] == 1) {
/* ed25519 public key */ /* ed25519 public key */
resp->public_key.bytes[0] = 0; resp->public_key.bytes[0] = 0;
} }
resp->has_signature = true;
resp->signature.size = 65; resp->signature.size = 65;
msg_write(MessageType_MessageType_SignedIdentity, resp); msg_write(MessageType_MessageType_SignedIdentity, resp);
} else { } else {
@ -184,8 +178,7 @@ void fsm_msgGetECDHSessionKey(const GetECDHSessionKey *msg) {
CHECK_PIN CHECK_PIN
uint8_t hash[32]; uint8_t hash[32];
if (!msg->has_identity || if (cryptoIdentityFingerprint(&(msg->identity), hash) == 0) {
cryptoIdentityFingerprint(&(msg->identity), hash) == 0) {
fsm_sendFailure(FailureType_Failure_DataError, _("Invalid identity")); fsm_sendFailure(FailureType_Failure_DataError, _("Invalid identity"));
layoutHome(); layoutHome();
return; return;
@ -213,7 +206,6 @@ void fsm_msgGetECDHSessionKey(const GetECDHSessionKey *msg) {
int result_size = 0; int result_size = 0;
if (hdnode_get_shared_key(node, msg->peer_public_key.bytes, if (hdnode_get_shared_key(node, msg->peer_public_key.bytes,
resp->session_key.bytes, &result_size) == 0) { resp->session_key.bytes, &result_size) == 0) {
resp->has_session_key = true;
resp->session_key.size = result_size; resp->session_key.size = result_size;
msg_write(MessageType_MessageType_ECDHSessionKey, resp); msg_write(MessageType_MessageType_ECDHSessionKey, resp);
} else { } else {
@ -293,7 +285,6 @@ void fsm_msgCosiSign(const CosiSign *msg) {
init_rfc6979(node->private_key, nonce, &rng); init_rfc6979(node->private_key, nonce, &rng);
generate_rfc6979(nonce, &rng); generate_rfc6979(nonce, &rng);
resp->has_signature = true;
resp->signature.size = 32; resp->signature.size = 32;
ed25519_cosi_sign(msg->data.bytes, msg->data.size, node->private_key, nonce, ed25519_cosi_sign(msg->data.bytes, msg->data.size, node->private_key, nonce,

View File

@ -44,7 +44,6 @@ void fsm_msgEthereumGetPublicKey(const EthereumGetPublicKey *msg) {
} }
} }
resp->has_node = true;
resp->node.depth = node->depth; resp->node.depth = node->depth;
resp->node.fingerprint = fingerprint; resp->node.fingerprint = fingerprint;
resp->node.child_num = node->child_num; resp->node.child_num = node->child_num;
@ -54,7 +53,6 @@ void fsm_msgEthereumGetPublicKey(const EthereumGetPublicKey *msg) {
resp->node.public_key.size = 33; resp->node.public_key.size = 33;
memcpy(resp->node.public_key.bytes, node->public_key, 33); memcpy(resp->node.public_key.bytes, node->public_key, 33);
resp->has_xpub = true;
hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub, hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub,
sizeof(resp->xpub)); sizeof(resp->xpub));

View File

@ -28,7 +28,6 @@ void fsm_msgLiskGetAddress(const LiskGetAddress *msg) {
msg->address_n_count, NULL); msg->address_n_count, NULL);
if (!node) return; if (!node) return;
resp->has_address = true;
hdnode_fill_public_key(node); hdnode_fill_public_key(node);
lisk_get_address_from_public_key(&node->public_key[1], resp->address); lisk_get_address_from_public_key(&node->public_key[1], resp->address);
@ -58,7 +57,6 @@ void fsm_msgLiskGetPublicKey(const LiskGetPublicKey *msg) {
hdnode_fill_public_key(node); hdnode_fill_public_key(node);
resp->has_public_key = true;
resp->public_key.size = 32; resp->public_key.size = 32;
if (msg->has_show_display && msg->show_display) { if (msg->has_show_display && msg->show_display) {

View File

@ -280,11 +280,9 @@ void fsm_msgNEMSignTx(NEMSignTx *msg) {
} }
} }
resp->has_data = true;
resp->data.size = resp->data.size =
nem_transaction_end(&context, node->private_key, resp->signature.bytes); nem_transaction_end(&context, node->private_key, resp->signature.bytes);
resp->has_signature = true;
resp->signature.size = sizeof(ed25519_signature); resp->signature.size = sizeof(ed25519_signature);
msg_write(MessageType_MessageType_NEMSignedTx, resp); msg_write(MessageType_MessageType_NEMSignedTx, resp);
@ -336,7 +334,6 @@ void fsm_msgNEMDecryptMessage(NEMDecryptMessage *msg) {
return; return;
} }
resp->has_payload = true;
resp->payload.size = NEM_DECRYPTED_SIZE(resp->payload.bytes, size); resp->payload.size = NEM_DECRYPTED_SIZE(resp->payload.bytes, size);
layoutNEMTransferPayload(resp->payload.bytes, resp->payload.size, true); layoutNEMTransferPayload(resp->payload.bytes, resp->payload.size, true);

View File

@ -43,7 +43,6 @@ void fsm_msgStellarGetAddress(const StellarGetAddress *msg) {
} }
} }
resp->has_address = true;
stellar_publicAddressAsStr(node->public_key + 1, resp->address, stellar_publicAddressAsStr(node->public_key + 1, resp->address,
sizeof(resp->address)); sizeof(resp->address));

View File

@ -69,9 +69,7 @@ void lisk_sign_message(const HDNode *node, const LiskSignMessage *msg,
memcpy(resp->signature.bytes, signature, sizeof(signature)); memcpy(resp->signature.bytes, signature, sizeof(signature));
memcpy(resp->public_key.bytes, &node->public_key[1], 32); memcpy(resp->public_key.bytes, &node->public_key[1], 32);
resp->has_signature = true;
resp->signature.size = 64; resp->signature.size = 64;
resp->has_public_key = true;
resp->public_key.size = 32; resp->public_key.size = 32;
} }
@ -173,97 +171,94 @@ static void lisk_format_value(uint64_t value, char *formated_value) {
void lisk_sign_tx(const HDNode *node, LiskSignTx *msg, LiskSignedTx *resp) { void lisk_sign_tx(const HDNode *node, LiskSignTx *msg, LiskSignedTx *resp) {
lisk_update_raw_tx(node, msg); lisk_update_raw_tx(node, msg);
if (msg->has_transaction) { SHA256_CTX ctx = {0};
SHA256_CTX ctx = {0}; sha256_Init(&ctx);
sha256_Init(&ctx);
switch (msg->transaction.type) { switch (msg->transaction.type) {
case LiskTransactionType_Transfer: case LiskTransactionType_Transfer:
layoutRequireConfirmTx(msg->transaction.recipient_id, layoutRequireConfirmTx(msg->transaction.recipient_id,
msg->transaction.amount); msg->transaction.amount);
break; break;
case LiskTransactionType_RegisterDelegate: case LiskTransactionType_RegisterDelegate:
layoutRequireConfirmDelegateRegistration(&msg->transaction.asset); layoutRequireConfirmDelegateRegistration(&msg->transaction.asset);
break; break;
case LiskTransactionType_CastVotes: case LiskTransactionType_CastVotes:
layoutRequireConfirmCastVotes(&msg->transaction.asset); layoutRequireConfirmCastVotes(&msg->transaction.asset);
break; break;
case LiskTransactionType_RegisterSecondPassphrase: case LiskTransactionType_RegisterSecondPassphrase:
layoutLiskPublicKey(msg->transaction.asset.signature.public_key.bytes); layoutLiskPublicKey(msg->transaction.asset.signature.public_key.bytes);
break; break;
case LiskTransactionType_RegisterMultisignatureAccount: case LiskTransactionType_RegisterMultisignatureAccount:
layoutRequireConfirmMultisig(&msg->transaction.asset); layoutRequireConfirmMultisig(&msg->transaction.asset);
break; break;
default: default:
fsm_sendFailure(FailureType_Failure_DataError, fsm_sendFailure(FailureType_Failure_DataError,
_("Invalid transaction type")); _("Invalid transaction type"));
layoutHome();
break;
}
if (!protectButton((msg->transaction.type ==
LiskTransactionType_RegisterSecondPassphrase
? ButtonRequestType_ButtonRequest_PublicKey
: ButtonRequestType_ButtonRequest_SignTx),
false)) {
fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing cancelled");
layoutHome(); layoutHome();
return; break;
}
layoutRequireConfirmFee(msg->transaction.fee, msg->transaction.amount);
if (!protectButton(ButtonRequestType_ButtonRequest_ConfirmOutput, false)) {
fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing cancelled");
layoutHome();
return;
}
layoutProgressSwipe(_("Signing transaction"), 0);
sha256_Update(&ctx, (const uint8_t *)&msg->transaction.type, 1);
lisk_hashupdate_uint32(&ctx, msg->transaction.timestamp);
sha256_Update(&ctx, msg->transaction.sender_public_key.bytes, 32);
if (msg->transaction.has_requester_public_key) {
sha256_Update(&ctx, msg->transaction.requester_public_key.bytes,
msg->transaction.requester_public_key.size);
}
uint64_t recipient_id = 0;
if (msg->transaction.has_recipient_id &&
msg->transaction.recipient_id[0] != 0) {
// parse integer from lisk address ("123L" -> 123)
for (size_t i = 0; i < strlen(msg->transaction.recipient_id) - 1; i++) {
if (msg->transaction.recipient_id[i] < '0' ||
msg->transaction.recipient_id[i] > '9') {
fsm_sendFailure(FailureType_Failure_DataError,
_("Invalid recipient_id"));
layoutHome();
return;
}
recipient_id *= 10;
recipient_id += (msg->transaction.recipient_id[i] - '0');
}
}
lisk_hashupdate_uint64_be(&ctx, recipient_id);
lisk_hashupdate_uint64_le(&ctx, msg->transaction.amount);
lisk_hashupdate_asset(&ctx, msg->transaction.type, &msg->transaction.asset);
// if signature exist calculate second signature
if (msg->transaction.has_signature) {
sha256_Update(&ctx, msg->transaction.signature.bytes,
msg->transaction.signature.size);
}
uint8_t hash[32] = {0};
sha256_Final(&ctx, hash);
ed25519_sign(hash, 32, node->private_key, &node->public_key[1],
resp->signature.bytes);
resp->has_signature = true;
resp->signature.size = 64;
} }
if (!protectButton(
(msg->transaction.type == LiskTransactionType_RegisterSecondPassphrase
? ButtonRequestType_ButtonRequest_PublicKey
: ButtonRequestType_ButtonRequest_SignTx),
false)) {
fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing cancelled");
layoutHome();
return;
}
layoutRequireConfirmFee(msg->transaction.fee, msg->transaction.amount);
if (!protectButton(ButtonRequestType_ButtonRequest_ConfirmOutput, false)) {
fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing cancelled");
layoutHome();
return;
}
layoutProgressSwipe(_("Signing transaction"), 0);
sha256_Update(&ctx, (const uint8_t *)&msg->transaction.type, 1);
lisk_hashupdate_uint32(&ctx, msg->transaction.timestamp);
sha256_Update(&ctx, msg->transaction.sender_public_key.bytes, 32);
if (msg->transaction.has_requester_public_key) {
sha256_Update(&ctx, msg->transaction.requester_public_key.bytes,
msg->transaction.requester_public_key.size);
}
uint64_t recipient_id = 0;
if (msg->transaction.has_recipient_id &&
msg->transaction.recipient_id[0] != 0) {
// parse integer from lisk address ("123L" -> 123)
for (size_t i = 0; i < strlen(msg->transaction.recipient_id) - 1; i++) {
if (msg->transaction.recipient_id[i] < '0' ||
msg->transaction.recipient_id[i] > '9') {
fsm_sendFailure(FailureType_Failure_DataError,
_("Invalid recipient_id"));
layoutHome();
return;
}
recipient_id *= 10;
recipient_id += (msg->transaction.recipient_id[i] - '0');
}
}
lisk_hashupdate_uint64_be(&ctx, recipient_id);
lisk_hashupdate_uint64_le(&ctx, msg->transaction.amount);
lisk_hashupdate_asset(&ctx, msg->transaction.type, &msg->transaction.asset);
// if signature exist calculate second signature
if (msg->transaction.has_signature) {
sha256_Update(&ctx, msg->transaction.signature.bytes,
msg->transaction.signature.size);
}
uint8_t hash[32] = {0};
sha256_Final(&ctx, hash);
ed25519_sign(hash, 32, node->private_key, &node->public_key[1],
resp->signature.bytes);
resp->signature.size = 64;
} }
// Layouts // Layouts

View File

@ -1150,7 +1150,6 @@ void stellar_fillSignedTx(StellarSignedTx *resp) {
// signing // signing
memcpy(resp->public_key.bytes, stellar_activeTx.signing_pubkey, 32); memcpy(resp->public_key.bytes, stellar_activeTx.signing_pubkey, 32);
resp->public_key.size = 32; resp->public_key.size = 32;
resp->has_public_key = true;
// Add the signature (note that this does not include the 4-byte hint since it // Add the signature (note that this does not include the 4-byte hint since it
// can be calculated from the public key) // can be calculated from the public key)
@ -1159,7 +1158,6 @@ void stellar_fillSignedTx(StellarSignedTx *resp) {
stellar_getSignatureForActiveTx(signature); stellar_getSignatureForActiveTx(signature);
memcpy(resp->signature.bytes, signature, sizeof(signature)); memcpy(resp->signature.bytes, signature, sizeof(signature));
resp->signature.size = sizeof(signature); resp->signature.size = sizeof(signature);
resp->has_signature = true;
} }
bool stellar_allOperationsConfirmed() { bool stellar_allOperationsConfirmed() {