What changed, and why it matters
This commit blocks a specific kind of Bitcoin/Liquid transaction signing on the Blockstream Jade hardware wallet. It prevents 'swap' transactions from using 'taproot' inputs because the device's signature-calculation code does not yet safely handle that combination. Without the fix, a user might have been able to build a transaction that the wallet would sign incorrectly or in a way that could be exploited, potentially leading to loss or theft of funds in a swap.
Treat this as a security hardening patch and include it in the next firmware release. Review whether other unsupported signature-type/transaction-type combinations exist. If a CVE is desired, request one from a CNA, but the commit alone does not confirm an exploitable vulnerability.
Security signals we found
Unsupported cryptographic signing path disabled
Taproot/SegWit v1 signature hash incompatibility with swap transactions
Potential for incorrect or forgeable signatures if the combination were allowed
Hardware wallet boundary enforcement
Evidence from the diff
In main/process/sign_psbt.c, sign_psbt() now rejects any PSBT input where the signature type is WALLY_SIGTYPE_SW_V1 (SegWit v1 / taproot) and the transaction type is TXTYPE_SWAP. The added guard returns CBOR_RPC_BAD_PARAMETERS with the message ‘Swap transactions cannot contain taproot inputs’. The commit comment states that ‘The Liquid segwit v1 signature hash does not currently support swaps’. This is a defensive patch that closes an unsupported signing path rather than fixing a visible crash or bug.
Changed components
main/process/sign_psbt.csign_psbt()Taproot input handling in swap transactionsLiquid segwit v1 signature hash computationInspect captured patch +6 / −0
diff --git a/main/process/sign_psbt.c b/main/process/sign_psbt.c
index efda455..f083d1d 100644
--- a/main/process/sign_psbt.c
+++ b/main/process/sign_psbt.c
@@ -759,6 +759,12 @@ int sign_psbt(jade_process_t* process, CborValue* params, const network_t networ
JADE_WALLY_VERIFY(wally_psbt_get_input_signature_type(psbt, index, &sig_type));
JADE_ASSERT(sig_type);
sig_types[index] = (uint8_t)sig_type; // Sufficient
+ if (sig_type == WALLY_SIGTYPE_SW_V1 && txtype == TXTYPE_SWAP) {
+ // The Liquid segwit v1 signature hash does not currently support swaps
+ *errmsg = "Swap transactions cannot contain taproot inputs";
+ retval = CBOR_RPC_BAD_PARAMETERS;
+ goto cleanup;
+ }
const size_t num_keys = key_iter_get_num_keys(&iter);
if (num_keys > 1) {
Why this scored 72/100
Community notes
Notes can correct, qualify, or add evidence to the AI analysis. Every note shown here has been validated by a human moderator.
The AI analysis stands alone for now. Submit a note if you can add evidence or important context.