From 98ad54b7ee307767c6a8b5683f3c27d74bbcf869 Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Sat, 13 Nov 2021 12:42:54 +0100 Subject: [PATCH] chore(legacy): Disable Taproot where it's not supported. --- legacy/firmware/crypto.c | 40 +++++++++++++++++++--------------- legacy/firmware/fsm_msg_coin.h | 7 ++++-- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/legacy/firmware/crypto.c b/legacy/firmware/crypto.c index e1ffc439f..9b93041c6 100644 --- a/legacy/firmware/crypto.c +++ b/legacy/firmware/crypto.c @@ -149,29 +149,35 @@ int cryptoMessageSign(const CoinInfo *coin, HDNode *node, InputScriptType script_type, bool no_script_type, const uint8_t *message, size_t message_len, uint8_t *signature) { + uint8_t script_type_info = 0; + switch (script_type) { + case InputScriptType_SPENDADDRESS: + // p2pkh + script_type_info = 0; + break; + case InputScriptType_SPENDP2SHWITNESS: + // segwit-in-p2sh + script_type_info = 4; + break; + case InputScriptType_SPENDWITNESS: + // segwit + script_type_info = 8; + break; + default: + // unsupported script type + return 1; + } + + if (no_script_type) { + script_type_info = 0; + } + uint8_t hash[HASHER_DIGEST_LENGTH] = {0}; cryptoMessageHash(coin, message, message_len, hash); uint8_t pby = 0; int result = hdnode_sign_digest(node, hash, signature + 1, &pby, NULL); if (result == 0) { - uint8_t script_type_info = 0; - if (!no_script_type) { - switch (script_type) { - case InputScriptType_SPENDP2SHWITNESS: - // segwit-in-p2sh - script_type_info = 4; - break; - case InputScriptType_SPENDWITNESS: - // segwit - script_type_info = 8; - break; - default: - // p2pkh - script_type_info = 0; - break; - } - } signature[0] = 31 + pby + script_type_info; } return result; diff --git a/legacy/firmware/fsm_msg_coin.h b/legacy/firmware/fsm_msg_coin.h index 2eb375083..d5d3f21f8 100644 --- a/legacy/firmware/fsm_msg_coin.h +++ b/legacy/firmware/fsm_msg_coin.h @@ -67,8 +67,7 @@ void fsm_msgGetPublicKey(const GetPublicKey *msg) { } if (coin->xpub_magic && (script_type == InputScriptType_SPENDADDRESS || - script_type == InputScriptType_SPENDMULTISIG || - script_type == InputScriptType_SPENDTAPROOT)) { + script_type == InputScriptType_SPENDMULTISIG)) { hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub, sizeof(resp->xpub)); } else if (coin->has_segwit && @@ -89,6 +88,10 @@ void fsm_msgGetPublicKey(const GetPublicKey *msg) { msg->ignore_xpub_magic && coin->xpub_magic) { hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub, sizeof(resp->xpub)); + } else if (coin->has_taproot && script_type == InputScriptType_SPENDTAPROOT && + coin->xpub_magic) { + hdnode_serialize_public(node, fingerprint, coin->xpub_magic, resp->xpub, + sizeof(resp->xpub)); } else { fsm_sendFailure(FailureType_Failure_DataError, _("Invalid combination of coin and script_type"));