From 2cf359c57aef986203271b3cc538e1c936b1ff67 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 24 Dec 2025 14:15:29 +0700 Subject: [PATCH 01/14] Removing legacy signing logic from powHSM firmware --- firmware/src/powhsm/src/auth.h | 3 +- firmware/src/powhsm/src/auth_receipt.c | 20 +-- firmware/src/powhsm/src/auth_tx.c | 162 ++++--------------------- firmware/src/powhsm/src/auth_tx.h | 17 +-- 4 files changed, 38 insertions(+), 164 deletions(-) diff --git a/firmware/src/powhsm/src/auth.h b/firmware/src/powhsm/src/auth.h index 201c9202..17c1fd2f 100644 --- a/firmware/src/powhsm/src/auth.h +++ b/firmware/src/powhsm/src/auth.h @@ -76,8 +76,7 @@ typedef enum { ERR_AUTH_RECEIPT_HASH_MISMATCH = 0x6A94, ERR_AUTH_NODE_CHAINING_MISMATCH = 0x6A95, ERR_AUTH_RECEIPT_ROOT_MISMATCH = 0x6A96, - ERR_AUTH_INVALID_SIGHASH_COMPUTATION_MODE = 0x6A97, - ERR_AUTH_INVALID_EXTRADATA_SIZE = 0x6A98, + ERR_AUTH_INVALID_EXTRADATA_SIZE = 0x6A97, } err_code_sign_t; #define AUTH_MAX_EXCHANGE_SIZE RLP_BUFFER_SIZE diff --git a/firmware/src/powhsm/src/auth_receipt.c b/firmware/src/powhsm/src/auth_receipt.c index 4c655590..5dc367eb 100644 --- a/firmware/src/powhsm/src/auth_receipt.c +++ b/firmware/src/powhsm/src/auth_receipt.c @@ -58,7 +58,7 @@ // - a specific address (hardcoded, predefined) - the bridge address // - exactly three topics, topic_0, topic_1 and topic_2, of which: // - topic_0 (aka the event signature) must match a specific -// value (harcoded, predefined) +// value (hardcoded, predefined) // - topic_2 must match the current BTC tx hash // RSK receipt constants @@ -200,8 +200,9 @@ static void str_end() { auth.receipt.aux_offset == sizeof(EVENT_EMITTER) && !memcmp(auth.receipt.aux, (void*)PIC(EVENT_EMITTER), - sizeof(EVENT_EMITTER))) + sizeof(EVENT_EMITTER))) { SET_FLAG(auth.receipt.flags, IS_VALID_EMITTER); + } break; case TOPIC_LEVEL: if (auth.receipt.index[LOG_LEVEL - 1] == TOPICS_INDEX) { @@ -210,15 +211,16 @@ static void str_end() { auth.receipt.aux_offset == sizeof(EVENT_SIGNATURE) && !memcmp(auth.receipt.aux, (void*)PIC(EVENT_SIGNATURE), - sizeof(EVENT_SIGNATURE))) + sizeof(EVENT_SIGNATURE))) { SET_FLAG(auth.receipt.flags, IS_VALID_SIGNATURE); - else if (auth.receipt.index[TOPIC_LEVEL - 1] == - TOPIC_TXHASH_INDEX && - auth.receipt.aux_offset == sizeof(auth.tx_hash) && - !memcmp(auth.receipt.aux, - auth.tx_hash, - sizeof(auth.tx_hash))) + } else if (auth.receipt.index[TOPIC_LEVEL - 1] == + TOPIC_TXHASH_INDEX && + auth.receipt.aux_offset == sizeof(auth.tx_hash) && + !memcmp(auth.receipt.aux, + auth.tx_hash, + sizeof(auth.tx_hash))) { SET_FLAG(auth.receipt.flags, IS_VALID_TXHASH); + } } break; } diff --git a/firmware/src/powhsm/src/auth_tx.c b/firmware/src/powhsm/src/auth_tx.c index 1b81cc4a..5a162505 100644 --- a/firmware/src/powhsm/src/auth_tx.c +++ b/firmware/src/powhsm/src/auth_tx.c @@ -33,104 +33,11 @@ #include "hal/log.h" -// IMPORTANT: This callback only executes for the scriptSig at the desired input -// (the one that is requested to sign) -// In all the other cases the parser is not even initialized or called, -// so it is not possible for this callback to execute. -static void btcscript_cb(const btcscript_cb_event_t event) { - uint8_t redeemscript_length_size; - uint8_t redeemscript_length[MAX_SVARINT_ENCODING_SIZE]; - - if (event == BTCSCRIPT_EV_OPCODE && auth.tx.script_ctx.operand_size > 0 && - auth.tx.script_ctx.operand_size == auth.tx.script_ctx.bytes_remaining) { - // This is a push of exactly the remaining script bytes => this is the - // last push of the script => this is the redeemScript - auth.tx.redeemscript_found = 1; - // Hash the script size using the size of the operand (redeemScript) - redeemscript_length_size = - svarint_encode(auth.tx.script_ctx.operand_size, - redeemscript_length, - sizeof(redeemscript_length)); - hash_sha256_update(&auth.tx.sig_hash_ctx, - redeemscript_length, - redeemscript_length_size); - } else if (event == BTCSCRIPT_EV_OPERAND && auth.tx.redeemscript_found) { - hash_sha256_update(&auth.tx.sig_hash_ctx, - &auth.tx.script_ctx.operand_byte, - sizeof(auth.tx.script_ctx.operand_byte)); - } -} - static void btctx_cb(const btctx_cb_event_t event) { // Update txhash hash_sha256_update( &auth.tx.tx_hash_ctx, auth.tx.ctx.raw, auth.tx.ctx.raw_size); - // The bridge currently only generates pegout transactions with - // versions 1 or 2. Validate that. - if (event == BTCTX_EV_VERSION && auth.tx.ctx.parsed.version != 1 && - auth.tx.ctx.parsed.version != 2) { - LOG("[E] Unsupported TX Version: %u\n", auth.tx.ctx.parsed.version); - THROW(ERR_AUTH_INVALID_TX_VERSION); - } - - // Validate that the input index to sign is valid - if (event == BTCTX_EV_VIN_COUNT && - auth.input_index_to_sign >= auth.tx.ctx.parsed.varint.value) { - LOG("[E] Input index to sign > number of inputs.\n"); - THROW(ERR_AUTH_INVALID_TX_INPUT_INDEX); - } - - // Update sighash - if (event == BTCTX_EV_VIN_SLENGTH) { - if (auth.tx.ctx.inout_current == auth.input_index_to_sign) { - // Parse this scriptSig - auth.tx.redeemscript_found = 0; - btcscript_init(&auth.tx.script_ctx, - &btcscript_cb, - auth.tx.ctx.parsed.varint.value); - } else { - // All other scriptSigs get replaced by an empty scriptSig - // when calculating the sigHash - hash_sha256_update(&auth.tx.sig_hash_ctx, (uint8_t[]){0x00}, 1); - } - } else if (event == BTCTX_EV_VIN_SCRIPT_DATA && - auth.tx.ctx.inout_current == auth.input_index_to_sign) { - if (btcscript_consume(auth.tx.ctx.raw, auth.tx.ctx.raw_size) != - auth.tx.ctx.raw_size) { - LOG("[E] Expected to consume %u bytes from the script but didn't", - auth.tx.ctx.raw_size); - THROW(ERR_AUTH_TX_HASH_MISMATCH); - } - - if (btcscript_result() < 0) { - LOG("[E] Error %u parsing the scriptSig", btcscript_result()); - THROW(ERR_AUTH_TX_HASH_MISMATCH); - } - - if (auth.tx.ctx.script_remaining == 0) { - if (btcscript_result() != BTCSCRIPT_ST_DONE) { - LOG("[E] No more scriptSig bytes to parse but " - "the script parser isn't finished"); - THROW(ERR_AUTH_TX_HASH_MISMATCH); - } - if (!auth.tx.redeemscript_found) { - LOG("[E] Finished parsing the scriptSig " - "but the redeemScript was not found"); - THROW(ERR_AUTH_TX_HASH_MISMATCH); - } - } - } else if (event != BTCTX_EV_VIN_SCRIPT_DATA) { - hash_sha256_update( - &auth.tx.sig_hash_ctx, auth.tx.ctx.raw, auth.tx.ctx.raw_size); - } -} - -static void btctx_cb_segwit(const btctx_cb_event_t event) { - // Update txhash - hash_sha256_update( - &auth.tx.tx_hash_ctx, auth.tx.ctx.raw, auth.tx.ctx.raw_size); - if (event == BTCTX_EV_VERSION) { hash_sha256_update( &auth.tx.sig_hash_ctx, auth.tx.ctx.raw, auth.tx.ctx.raw_size); @@ -237,15 +144,14 @@ static void btctx_cb_segwit(const btctx_cb_event_t event) { unsigned int auth_sign_handle_btctx(volatile unsigned int rx) { uint8_t apdu_offset = 0; -#define TX_METADATA_SIZE \ - (BTCTX_LENGTH_SIZE + SIGHASH_COMP_MODE_SIZE + EXTRADATA_SIZE) +#define TX_METADATA_SIZE (BTCTX_LENGTH_SIZE + EXTRADATA_SIZE) if (auth.state != STATE_AUTH_BTCTX) { LOG("[E] Expected to be in the BTC tx state\n"); THROW(ERR_AUTH_INVALID_STATE); } - if (!auth.tx.segwit_processing_extradata) { + if (!auth.tx.processing_extradata) { // Read little endian TX length // (part of the legacy protocol, includes this length) if (auth.tx.remaining_bytes == 0) { @@ -265,28 +171,17 @@ unsigned int auth_sign_handle_btctx(volatile unsigned int rx) { hash_sha256_init(&auth.tx.tx_hash_ctx); hash_sha256_init(&auth.tx.sig_hash_ctx); apdu_offset = BTCTX_LENGTH_SIZE; - // Following three bytes indicate the sighash computation - // mode (1 byte) and extradata size (2 bytes LE, for segwit) - auth.tx.sighash_computation_mode = APDU_DATA_PTR[apdu_offset++]; - auth.tx.segwit_processing_extradata = false; - auth.tx.segwit_extradata_size = 0; - auth.tx.segwit_extradata_size += APDU_DATA_PTR[apdu_offset++]; - auth.tx.segwit_extradata_size += APDU_DATA_PTR[apdu_offset++] << 8; + // Following two bytes indicate extradata size + // (2 bytes LE) + auth.tx.processing_extradata = false; + auth.tx.extradata_size = 0; + auth.tx.extradata_size += APDU_DATA_PTR[apdu_offset++]; + auth.tx.extradata_size += APDU_DATA_PTR[apdu_offset++] << 8; // Validate computation mode and init tx parsing context - switch (auth.tx.sighash_computation_mode) { - case SIGHASH_COMPUTE_MODE_LEGACY: - btctx_init(&auth.tx.ctx, &btctx_cb); - break; - case SIGHASH_COMPUTE_MODE_SEGWIT: - btctx_init(&auth.tx.ctx, &btctx_cb_segwit); - if (!auth.tx.segwit_extradata_size) { - LOG("[E] Invalid extradata size for segwit"); - THROW(ERR_AUTH_INVALID_EXTRADATA_SIZE); - } - break; - default: - LOG("[E] Invalid sighash computation mode\n"); - THROW(ERR_AUTH_INVALID_SIGHASH_COMPUTATION_MODE); + btctx_init(&auth.tx.ctx, &btctx_cb); + if (!auth.tx.extradata_size) { + LOG("[E] Invalid extradata size"); + THROW(ERR_AUTH_INVALID_EXTRADATA_SIZE); } } @@ -318,15 +213,9 @@ unsigned int auth_sign_handle_btctx(volatile unsigned int rx) { auth.tx_hash[31 - j] = aux; } - // Segwit? - if (auth.tx.sighash_computation_mode == - SIGHASH_COMPUTE_MODE_SEGWIT) { - auth.tx.segwit_processing_extradata = true; - auth.tx.remaining_bytes = - (uint32_t)auth.tx.segwit_extradata_size; - } else { - auth.tx.finalise = true; - } + // Move onto extradata processing + auth.tx.processing_extradata = true; + auth.tx.remaining_bytes = (uint32_t)auth.tx.extradata_size; } } else { // Hash extradata @@ -339,18 +228,15 @@ unsigned int auth_sign_handle_btctx(volatile unsigned int rx) { } if (auth.tx.finalise) { - if (auth.tx.sighash_computation_mode == SIGHASH_COMPUTE_MODE_SEGWIT) { - // Remaining tx items to hash for segwit - hash_sha256_update(&auth.tx.sig_hash_ctx, - auth.tx.ip_seqno, - sizeof(auth.tx.ip_seqno)); - hash_sha256_update(&auth.tx.sig_hash_ctx, - auth.tx.outputs_hash, - sizeof(auth.tx.outputs_hash)); - hash_sha256_update(&auth.tx.sig_hash_ctx, - auth.tx.lock_time, - sizeof(auth.tx.lock_time)); - } + // Hash inputs seqnos, outputs and lock time + hash_sha256_update( + &auth.tx.sig_hash_ctx, auth.tx.ip_seqno, sizeof(auth.tx.ip_seqno)); + hash_sha256_update(&auth.tx.sig_hash_ctx, + auth.tx.outputs_hash, + sizeof(auth.tx.outputs_hash)); + hash_sha256_update(&auth.tx.sig_hash_ctx, + auth.tx.lock_time, + sizeof(auth.tx.lock_time)); // Add SIGHASH_ALL hash type at the end hash_sha256_update(&auth.tx.sig_hash_ctx, diff --git a/firmware/src/powhsm/src/auth_tx.h b/firmware/src/powhsm/src/auth_tx.h index dfd690a5..0cc81a36 100644 --- a/firmware/src/powhsm/src/auth_tx.h +++ b/firmware/src/powhsm/src/auth_tx.h @@ -30,34 +30,21 @@ #include "hal/hash.h" #include "btctx.h" -#include "btcscript.h" #define BTCTX_LENGTH_SIZE 4 -#define SIGHASH_COMP_MODE_SIZE 1 #define EXTRADATA_SIZE 2 #define SIGHASH_ALL_SIZE 4 #define SIGHASH_ALL_BYTES \ { 0x01, 0x00, 0x00, 0x00 } -enum { - SIGHASH_COMPUTE_MODE_LEGACY, - SIGHASH_COMPUTE_MODE_SEGWIT, -}; - typedef struct { uint32_t remaining_bytes; bool finalise; btctx_ctx_t ctx; - btcscript_ctx_t script_ctx; hash_sha256_ctx_t tx_hash_ctx; hash_sha256_ctx_t sig_hash_ctx; - - uint8_t sighash_computation_mode; - - // Specifically for segwit - // sighash computation mode - bool segwit_processing_extradata; - uint16_t segwit_extradata_size; + bool processing_extradata; + uint16_t extradata_size; union { hash_sha256_ctx_t prevouts_hash_ctx; hash_sha256_ctx_t outputs_hash_ctx; From 0a2d0e17102c88a764b7d28b9107b2d1594541b4 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 24 Dec 2025 14:16:43 +0700 Subject: [PATCH 02/14] Removing legacy signing logic from middleware - Incidentally removing no longer used bitcoin utility functions --- middleware/comm/bitcoin.py | 50 ++------------------------------- middleware/comm/protocol.py | 28 ++++-------------- middleware/ledger/hsm2dongle.py | 48 ++++++++----------------------- middleware/ledger/protocol.py | 19 ++----------- 4 files changed, 22 insertions(+), 123 deletions(-) diff --git a/middleware/comm/bitcoin.py b/middleware/comm/bitcoin.py index 62ebd0bb..37a783b2 100644 --- a/middleware/comm/bitcoin.py +++ b/middleware/comm/bitcoin.py @@ -23,54 +23,6 @@ import bitcoin.core -def get_unsigned_tx(raw_tx_hex, hex=True): - unsigned_bytes = _unsign_tx(raw_tx_hex).serialize() - - if hex: - return unsigned_bytes.hex() - - return unsigned_bytes - - -def get_tx_hash(raw_tx_hex): - return _deserialize_tx(raw_tx_hex).GetHash()[::-1].hex() - - -def get_tx_hash_for_unsigned_tx(raw_tx_hex): - return _unsign_tx(raw_tx_hex).GetHash()[::-1].hex() - - -def get_tx_version(raw_tx_hex): - tx = _deserialize_tx(raw_tx_hex) - return tx.nVersion - - -def _unsign_tx(raw_tx_hex): - # Given a p2sh-only inputs transaction (all of them corresponding - # to multisig outputs), this method clears any - # existent signatures in all the inputs and then computes - # the hash of the resulting transaction - - tx = _deserialize_tx(raw_tx_hex) - - tx.vin = list(map(_clear_all_but_last_op_from_scriptsig, tx.vin)) - - return tx - - -def _clear_all_but_last_op_from_scriptsig(txin): - # Given a transaction input, this returns a copy - # with its scriptSig replaced by a script with all - # its operations as ZERO, excepting - # the last operation, which is left untouched. - - new_txin = bitcoin.core.CMutableTxIn.from_txin(txin) - ops = list(new_txin.scriptSig) - new_ops = ([0] * (len(ops) - 1)) + [ops[-1]] - new_txin.scriptSig = bitcoin.core.CScript(new_ops) - return new_txin - - def get_signature_hash_for_p2sh_input(raw_tx_hex, input_index): # Given a raw BTC transaction and an input index, # this method computes the sighash corresponding to the given @@ -98,6 +50,8 @@ def get_signature_hash_for_p2sh_input(raw_tx_hex, input_index): try: redeem_script = bitcoin.core.CScript(last_chunk_operand) + if not redeem_script.is_valid(): + raise ValueError() except Exception: raise ValueError("Invalid redeem script: %s" % last_chunk_operand.hex()) diff --git a/middleware/comm/protocol.py b/middleware/comm/protocol.py index 47caff36..57edd81c 100644 --- a/middleware/comm/protocol.py +++ b/middleware/comm/protocol.py @@ -318,13 +318,10 @@ def _validate_message(self, request, what): # Also, it must: # - Contain exactly a "hash" element of type string (1) that must be a 32-byte hex # (what is "any" or "hash") - # - Contain exactly a "tx" element of type string that must be a hex string; - # an "input" element of type int; a "sighashComputationMode" element - # of type string that contains exactly either "legacy" (2a) or "segwit" (2b); - # and, if the latter contains "segwit", then additionally: - # o A "witnessScript" element of type string that must be a hex string - # o An "outpointValue" element of type int that must be greater than 0 and - # at most 0xffffffffffffffff + # - Contain exactly a "tx" element of type string (2) that must be a hex string; + # an "input" element of type int; a "witnessScript" element of type string + # that must be a hex string; an "outpointValue" element of type int that must be + # greater than 0 and at most 0xffffffffffffffff # (what is "any" or "tx") # Validate message presence and components @@ -342,25 +339,12 @@ def _validate_message(self, request, what): ): return self.ERROR_CODE_OK - # (2a) + # (2)? if ( what in ["any", "tx"] - and len(message) == 3 + and len(message) == 4 and has_nonempty_hex_field(message, "tx") and has_field_of_type(message, "input", int) - and has_field_of_type(message, "sighashComputationMode", str) - and message["sighashComputationMode"] == "legacy" - ): - return self.ERROR_CODE_OK - - # (2b) - if ( - what in ["any", "tx"] - and len(message) == 5 - and has_nonempty_hex_field(message, "tx") - and has_field_of_type(message, "input", int) - and has_field_of_type(message, "sighashComputationMode", str) - and message["sighashComputationMode"] == "segwit" and has_nonempty_hex_field(message, "witnessScript") and has_field_of_type(message, "outpointValue", int) and message["outpointValue"] > 0 diff --git a/middleware/ledger/hsm2dongle.py b/middleware/ledger/hsm2dongle.py index a548170b..659f15f7 100644 --- a/middleware/ledger/hsm2dongle.py +++ b/middleware/ledger/hsm2dongle.py @@ -21,7 +21,7 @@ # SOFTWARE. import struct -from enum import IntEnum, Enum, auto +from enum import IntEnum, auto from ledgerblue.comm import getDongle from ledgerblue.commException import CommException import hid @@ -191,7 +191,6 @@ class _SignError(IntEnum): RECEIPT_HASH_MISMATCH = auto() NODE_CHAINING_MISMATCH = auto() RECEIPT_ROOT_MISMATCH = auto() - INVALID_SIGHASH_COMPUTATION_MODE = auto() INVALID_EXTRADATA_SIZE = auto() @@ -321,18 +320,6 @@ class _Onboarding(IntEnum): TIMEOUT = 10 -# Sighash computation modes -class SighashComputationMode(Enum): - def __new__(cls, *args, **kwds): - obj = object.__new__(cls) - obj._value_ = args[0] - obj.netvalue = args[1] - return obj - - LEGACY = "legacy", 0 - SEGWIT = "segwit", 1 - - class HSM2DongleBaseError(RuntimeError): @property def message(self): @@ -613,19 +600,18 @@ def get_public_key(self, key_id): publicKey = self._send_command(self.CMD.GET_PUBLIC_KEY, key_id.to_binary()) return publicKey.hex() - # Ask the device to sign a specific input of a given unsigned bitcoin transaction - # using the given RSK transaction receipt as an authorization for the signature. + # Ask the device to sign a specific input of a given bitcoin transaction using the + # given RSK transaction receipt as an authorization for the signature. # key_id: BIP32Path # rsk_tx_receipt: hex string # btc_tx: hex string # receipt_merkle_proof: list # input_index: int - # sighash_computation_mode: a SighashComputationMode instance # witness_script: hex string # outpoint_value: int def sign_authorized( self, key_id, rsk_tx_receipt, receipt_merkle_proof, btc_tx, input_index, - sighash_computation_mode, witness_script, outpoint_value + witness_script, outpoint_value ): # *** Signing protocol *** # The order in which things are required and then sent is: @@ -674,33 +660,23 @@ def sign_authorized( # Step 2. Send BTC transaction and extra data # Prefix the BTC transaction with the total length of the payload encoded as a # 4 bytes little endian unsigned integer. The total length should include - # those 4 bytes plus 2 bytes for the length of the extradata and 1 byte for - # the sighash computation mode + # those 4 bytes plus 2 bytes for the length of the extradata try: PAYLOADLENGTH_LENGTH = 4 - SIGHASH_COMPUTATION_MODE_LENGTH = 1 EXTRADATALENGTH_LENGTH = 2 OUTPOINT_VALUE_LENGTH = 8 btc_tx_bytes = bytes.fromhex(btc_tx) - scm_bytes = sighash_computation_mode.netvalue.to_bytes( - SIGHASH_COMPUTATION_MODE_LENGTH, + ov_bytes = outpoint_value.to_bytes( + OUTPOINT_VALUE_LENGTH, byteorder='little', signed=False ) - ed_bytes = b"" - - if sighash_computation_mode == SighashComputationMode.SEGWIT: - ov_bytes = outpoint_value.to_bytes( - OUTPOINT_VALUE_LENGTH, - byteorder='little', signed=False - ) - - ws_bytes = bytes.fromhex(witness_script) - ws_length_bytes = bytes.fromhex(encode_varint(len(ws_bytes))) + ws_bytes = bytes.fromhex(witness_script) + ws_length_bytes = bytes.fromhex(encode_varint(len(ws_bytes))) - ed_bytes = ws_length_bytes + ws_bytes + ov_bytes + ed_bytes = ws_length_bytes + ws_bytes + ov_bytes edl_bytes = len(ed_bytes).to_bytes( EXTRADATALENGTH_LENGTH, @@ -709,7 +685,6 @@ def sign_authorized( payload_length = \ PAYLOADLENGTH_LENGTH + \ - SIGHASH_COMPUTATION_MODE_LENGTH + \ EXTRADATALENGTH_LENGTH + \ len(btc_tx_bytes) @@ -717,7 +692,7 @@ def sign_authorized( PAYLOADLENGTH_LENGTH, byteorder="little", signed=False ) - data = payload_length_bytes + scm_bytes + edl_bytes + btc_tx_bytes + ed_bytes + data = payload_length_bytes + edl_bytes + btc_tx_bytes + ed_bytes response = self._send_data_in_chunks( command=self.CMD.SIGN, @@ -741,7 +716,6 @@ def sign_authorized( self.ERR.SIGN.DATA_SIZE, self.ERR.SIGN.TX_HASH_MISMATCH, self.ERR.SIGN.TX_VERSION, - self.ERR.SIGN.INVALID_SIGHASH_COMPUTATION_MODE, self.ERR.SIGN.INVALID_EXTRADATA_SIZE, ]: return (False, self.RESPONSE.SIGN.ERROR_BTC_TX) diff --git a/middleware/ledger/protocol.py b/middleware/ledger/protocol.py index 80600f53..87f605a0 100644 --- a/middleware/ledger/protocol.py +++ b/middleware/ledger/protocol.py @@ -31,9 +31,7 @@ HSM2DongleTimeoutError, HSM2DongleCommError, HSM2FirmwareVersion, - SighashComputationMode, ) -from comm.bitcoin import get_unsigned_tx, get_tx_hash class HSM2ProtocolLedger(HSM2Protocol): @@ -298,27 +296,16 @@ def _sign(self, request): # Shorthand msg = request["message"] - # Make sure the transaction - # is fully unsigned before sending. - try: - unsigned_btc_tx = get_unsigned_tx(msg["tx"]) - self.logger.debug("Unsigned BTC tx: %s", get_tx_hash(unsigned_btc_tx)) - except Exception as e: - self.logger.error("Error unsigning BTC tx: %s", str(e)) - return (self.ERROR_CODE_INVALID_MESSAGE,) - try: self.ensure_connection() sign_result = self.hsm2dongle.sign_authorized( key_id=request["keyId"], rsk_tx_receipt=request["auth"]["receipt"], receipt_merkle_proof=request["auth"]["receipt_merkle_proof"], - btc_tx=unsigned_btc_tx, + btc_tx=msg["tx"], input_index=msg["input"], - sighash_computation_mode=SighashComputationMode( - msg["sighashComputationMode"]), - witness_script=msg.get("witnessScript"), - outpoint_value=msg.get("outpointValue") + witness_script=msg["witnessScript"], + outpoint_value=msg["outpointValue"] ) except HSM2DongleTimeoutError: self.logger.error("Dongle timeout signing") From 4e2adec7cdc671691bf1cfb9c7072d0b6b01826e Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 24 Dec 2025 14:26:21 +0700 Subject: [PATCH 03/14] Updated firmware test suite after legacy signing logic removal - Updated sign_auth logic to test for specific no-match in sighash generation wrt legacy sighashes - Kept back some legacy signing logic test cases just for the sake of making sure legacy sighash signing is no longer possible --- firmware/test/cases/case.py | 7 ++- firmware/test/cases/sign_auth.py | 46 ++++++++++--------- firmware/test/resources/202-sign-iris.json | 2 + .../test/resources/213-sign-segwit-t1i0.json | 1 - .../test/resources/214-sign-segwit-t1i1.json | 1 - .../test/resources/215-sign-segwit-t2i0.json | 3 +- .../test/resources/216-sign-segwit-t2i1.json | 1 - firmware/test/resources/302-sign.json | 2 + .../410-sign-fail-invalid-version.json | 12 ----- ...11-0-sign-fail-zero-byte-input-script.json | 14 ++++++ ...n-fail-zero-byte-input-script-legacy.json} | 4 +- ...-fail-malformed-redeem-script-legacy.json} | 4 +- .../413-0-sign-fail-malformed-output.json | 14 ++++++ ...-1-sign-fail-malformed-output-legacy.json} | 4 +- .../414-0-sign-fail-receipt-nomatch.json | 14 ++++++ ...4-1-sign-fail-receipt-nomatch-legacy.json} | 4 +- ...sign-fail-receipt-no-match-single-log.json | 14 ++++++ ...l-receipt-no-match-single-log-legacy.json} | 4 +- ...-fail-receipt-top-level-size-mismatch.json | 6 ++- ...17-sign-fail-receipt-malformed-nologs.json | 6 ++- ...18-sign-fail-proof-only-receipts-root.json | 6 ++- .../419-sign-fail-proof-first-non-leaf.json | 6 ++- .../420-sign-fail-proof-leaf-nomatch.json | 6 ++- ...21-sign-fail-proof-wrong-version-node.json | 6 ++- .../422-sign-fail-proof-does-not-connect.json | 10 ++-- .../423-sign-auth-fail-invalid-path.json | 16 ++++--- .../425-sign-auth-fail-invalid-length.json | 16 ++++--- ...l-disallow-receipt-multiple-top-level.json | 6 ++- ...-segwit-basic.json => 602-sign-basic.json} | 1 - ...son => 603-0-sign-long-witnessscript.json} | 1 - ... 603-1-sign-long-redeemscript-legacy.json} | 4 +- .../604-0-sign-match-long-proof.json | 18 ++++++++ ...> 604-1-sign-match-long-proof-legacy.json} | 4 +- ...on => 605-0-sign-tx-with-many-inputs.json} | 1 - ...05-1-sign-tx-with-many-inputs-legacy.json} | 4 +- .../606-0-sign-match-not-last-log.json | 16 +++++++ ...606-1-sign-match-not-last-log-legacy.json} | 4 +- .../610-0-sign-sample-mainnet-tx-i0.json | 18 ++++++++ .../610-1-sign-sample-mainnet-tx-i1.json | 18 ++++++++ ... 610-2-sign-sample-mainnet-tx-legacy.json} | 4 +- ...-1-sign-sample-testnet-tx-erp-legacy.json} | 4 +- ...1-sign-3input-5output-testnet-legacy.json} | 4 +- ...n.json => 620-get-after-success-sign.json} | 0 .../700-device-fake-receipt-root-fails.json | 2 + ...er-than-apdu-command-fails-tcpsigner.json} | 0 .../912-no-onboard-sign-auth-fails.json | 12 +++-- 46 files changed, 260 insertions(+), 90 deletions(-) delete mode 100644 firmware/test/resources/410-sign-fail-invalid-version.json create mode 100644 firmware/test/resources/411-0-sign-fail-zero-byte-input-script.json rename firmware/test/resources/{411-sign-fail-zero-byte-tx.json => 411-1-sign-fail-zero-byte-input-script-legacy.json} (95%) rename firmware/test/resources/{412-sign-fail-malformed-redeem-script.json => 412-sign-fail-malformed-redeem-script-legacy.json} (96%) create mode 100644 firmware/test/resources/413-0-sign-fail-malformed-output.json rename firmware/test/resources/{413-sign-fail-malformed-output.json => 413-1-sign-fail-malformed-output-legacy.json} (94%) create mode 100644 firmware/test/resources/414-0-sign-fail-receipt-nomatch.json rename firmware/test/resources/{414-sign-fail-receipt-nomatch.json => 414-1-sign-fail-receipt-nomatch-legacy.json} (94%) create mode 100644 firmware/test/resources/415-0-sign-fail-receipt-no-match-single-log.json rename firmware/test/resources/{415-sign-fail-receipt-no-match-single-log.json => 415-1-sign-fail-receipt-no-match-single-log-legacy.json} (96%) rename firmware/test/resources/{620-sign-segwit-basic.json => 602-sign-basic.json} (98%) rename firmware/test/resources/{622-sign-segwit-long-witnessscript.json => 603-0-sign-long-witnessscript.json} (99%) rename firmware/test/resources/{602-sign-long-redeemscript.json => 603-1-sign-long-redeemscript-legacy.json} (96%) create mode 100644 firmware/test/resources/604-0-sign-match-long-proof.json rename firmware/test/resources/{615-sign-match-long-proof.json => 604-1-sign-match-long-proof-legacy.json} (94%) rename firmware/test/resources/{621-sign-segwit-with-many-inputs.json => 605-0-sign-tx-with-many-inputs.json} (99%) rename firmware/test/resources/{610-sign-tx-with-many-inputs.json => 605-1-sign-tx-with-many-inputs-legacy.json} (99%) create mode 100644 firmware/test/resources/606-0-sign-match-not-last-log.json rename firmware/test/resources/{614-sign-match-not-last-log.json => 606-1-sign-match-not-last-log-legacy.json} (94%) create mode 100644 firmware/test/resources/610-0-sign-sample-mainnet-tx-i0.json create mode 100644 firmware/test/resources/610-1-sign-sample-mainnet-tx-i1.json rename firmware/test/resources/{612-sign-sample-mainnet-tx.json => 610-2-sign-sample-mainnet-tx-legacy.json} (96%) rename firmware/test/resources/{613-sign-sample-testnet-tx-erp.json => 611-1-sign-sample-testnet-tx-erp-legacy.json} (95%) rename firmware/test/resources/{616-sign-3input-5output-testnet.json => 612-1-sign-3input-5output-testnet-legacy.json} (97%) rename firmware/test/resources/{617-get-after-success-sign.json => 620-get-after-success-sign.json} (100%) rename firmware/test/resources/{900-larger-than-apdu-command-fails-tcpsigner.json => 900-2-larger-than-apdu-command-fails-tcpsigner.json} (100%) diff --git a/firmware/test/cases/case.py b/firmware/test/cases/case.py index b75c9317..b7080303 100644 --- a/firmware/test/cases/case.py +++ b/firmware/test/cases/case.py @@ -54,8 +54,11 @@ def op_name(cls): @classmethod def from_json_file(cls, path): - with open(path, "r") as f: - return cls.create(json.load(f)) + try: + with open(path, "r") as f: + return cls.create(json.load(f)) + except Exception as e: + raise RuntimeError(f"While loading test case from {path}: {e}") @classmethod def create(cls, spec): diff --git a/firmware/test/cases/sign_auth.py b/firmware/test/cases/sign_auth.py index 2bc68d2e..f5b3c063 100644 --- a/firmware/test/cases/sign_auth.py +++ b/firmware/test/cases/sign_auth.py @@ -25,8 +25,8 @@ from .sign_helpers import assert_signature from comm.bip32 import BIP32Path from comm.bitcoin import \ - get_signature_hash_for_p2sh_input, get_signature_hash_for_p2sh_p2wsh_input -from ledger.hsm2dongle import SighashComputationMode + get_signature_hash_for_p2sh_input, \ + get_signature_hash_for_p2sh_p2wsh_input from misc.tcpsigner_admin import TcpSignerAdmin @@ -47,15 +47,8 @@ def __init__(self, spec): self.receipt = spec["receipt"] self.receipt_mp = spec["receiptMp"] self.fake_ancestor_receipts_root = spec.get("fake_ancestor_receipts_root", None) - self.sighash_computation_mode = SighashComputationMode( - spec.get("txType", "legacy") - ) - self.witness_script = None - self.outpoint_value = None - - if self.sighash_computation_mode == SighashComputationMode.SEGWIT: - self.witness_script = spec["witnessScript"] - self.outpoint_value = spec["outpointValue"] + self.witness_script = spec["witnessScript"] + self.outpoint_value = spec["outpointValue"] super().__init__(spec) @@ -97,7 +90,6 @@ def run(self, dongle, debug, run_args): receipt_merkle_proof=self.receipt_mp, btc_tx=self.btc_tx, input_index=self.btc_tx_input, - sighash_computation_mode=self.sighash_computation_mode, witness_script=self.witness_script, outpoint_value=self.outpoint_value ) @@ -123,17 +115,29 @@ def run(self, dongle, debug, run_args): "signing but got a successful signature") # Validate the signature - if self.sighash_computation_mode == SighashComputationMode.SEGWIT: - sighash = get_signature_hash_for_p2sh_p2wsh_input( - self.btc_tx, self.btc_tx_input, self.witness_script, - self.outpoint_value - ) - else: - sighash = get_signature_hash_for_p2sh_input( - self.btc_tx, self.btc_tx_input - ) + sighash = get_signature_hash_for_p2sh_p2wsh_input( + self.btc_tx, self.btc_tx_input, self.witness_script, + self.outpoint_value + ) assert_signature(pubkey, sighash, signature[1]) + # Make sure the signed sighash does NOT match the legacy P2SH sighash + # for the same input (this should always hold true by design, but it + # doesn't hurt to double check) + try: + legacy_sighash = get_signature_hash_for_p2sh_input( + self.btc_tx, self.btc_tx_input) + + if sighash == legacy_sighash: + raise TestCaseError( + f"Expected segwit sighash for input {self.btc_tx_input} " + f"({sighash}) to differ from legacy sighash for the same " + "input, but they match") + except Exception: + # This is expected in the case the sighash cannot be computed due to + # e.g. the redeem script being an invalid bitcoin script + pass + # Did we fake the ancestor receipts root? Reset it # (TCPSigner feature only, it will fail with a physical dongle) if self.fake_ancestor_receipts_root: diff --git a/firmware/test/resources/202-sign-iris.json b/firmware/test/resources/202-sign-iris.json index 4b2eb320..974ea119 100644 --- a/firmware/test/resources/202-sign-iris.json +++ b/firmware/test/resources/202-sign-iris.json @@ -4,6 +4,8 @@ "expected": true, "btcTx": "0200000002fe6eb00ec7d203273c0ab79dac3cf49292f86f11e56f7b988e1ed25ed1bc340b00000000fd0001000000004cfa20163db71aed39845d4ba481160c0c8d5329386e96ed0bc2f4b9d44cea41c3012775645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368aeffffffff13f050792d5a5397a10571730991f3d2cdfc9f6b3dc8f547d0b05b35f72afaf401000000de000000004cd8645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368aeffffffff0250e24a00000000001976a9140a4f09cbd39d5d8072b24385e1a9eb1c84ae544688acc035310b0000000017a914ba053351893c7495e0c75d5abacb3ed886cf1ff88700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0954487990dc49755fb4aa12dca75792620a21b7d281551754cfdc13fc00666caa00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "7006008aea5320de5af1ebf4c349c1de93039031a4b372b17e67eb21417cbfbc27a4aa000203", diff --git a/firmware/test/resources/213-sign-segwit-t1i0.json b/firmware/test/resources/213-sign-segwit-t1i0.json index 6135531e..bfb996a0 100644 --- a/firmware/test/resources/213-sign-segwit-t1i0.json +++ b/firmware/test/resources/213-sign-segwit-t1i0.json @@ -2,7 +2,6 @@ "name": "Sign segwit tx input 0", "operation": "signAuthorized", "expected": true, - "txType": "segwit", "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", "btcTxInput": 0, "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", diff --git a/firmware/test/resources/214-sign-segwit-t1i1.json b/firmware/test/resources/214-sign-segwit-t1i1.json index b52a834f..e4e7b0c9 100644 --- a/firmware/test/resources/214-sign-segwit-t1i1.json +++ b/firmware/test/resources/214-sign-segwit-t1i1.json @@ -2,7 +2,6 @@ "name": "Sign segwit tx input 1", "operation": "signAuthorized", "expected": true, - "txType": "segwit", "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", "btcTxInput": 1, "witnessScript": "532103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b54ae", diff --git a/firmware/test/resources/215-sign-segwit-t2i0.json b/firmware/test/resources/215-sign-segwit-t2i0.json index 8d358d4e..9c665bb4 100644 --- a/firmware/test/resources/215-sign-segwit-t2i0.json +++ b/firmware/test/resources/215-sign-segwit-t2i0.json @@ -2,9 +2,10 @@ "name": "Sign mixed tx input 0 (legacy)", "operation": "signAuthorized", "expected": true, - "txType": "legacy", "btcTx": "0200000002fe6eb00ec7d203273c0ab79dac3cf49292f86f11e56f7b988e1ed25ed1bc340b00000000fd0001000000004cfa20163db71aed39845d4ba481160c0c8d5329386e96ed0bc2f4b9d44cea41c3012775645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368aeffffffff13f050792d5a5397a10571730991f3d2cdfc9f6b3dc8f547d0b05b35f72afaf401000000220020ef720c94392b642ff1418a4f216c677ef5a16ffaedf3a5809fedcffd15b99179ffffffff0250e24a00000000001976a9140a4f09cbd39d5d8072b24385e1a9eb1c84ae544688acc035310b0000000017a914ba053351893c7495e0c75d5abacb3ed886cf1ff88700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "70060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203", diff --git a/firmware/test/resources/216-sign-segwit-t2i1.json b/firmware/test/resources/216-sign-segwit-t2i1.json index c5dde90d..5c09e134 100644 --- a/firmware/test/resources/216-sign-segwit-t2i1.json +++ b/firmware/test/resources/216-sign-segwit-t2i1.json @@ -2,7 +2,6 @@ "name": "Sign mixed tx input 1 (segwit)", "operation": "signAuthorized", "expected": true, - "txType": "segwit", "btcTx": "0200000002fe6eb00ec7d203273c0ab79dac3cf49292f86f11e56f7b988e1ed25ed1bc340b00000000fd0001000000004cfa20163db71aed39845d4ba481160c0c8d5329386e96ed0bc2f4b9d44cea41c3012775645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368aeffffffff13f050792d5a5397a10571730991f3d2cdfc9f6b3dc8f547d0b05b35f72afaf401000000220020ef720c94392b642ff1418a4f216c677ef5a16ffaedf3a5809fedcffd15b99179ffffffff0250e24a00000000001976a9140a4f09cbd39d5d8072b24385e1a9eb1c84ae544688acc035310b0000000017a914ba053351893c7495e0c75d5abacb3ed886cf1ff88700000000", "btcTxInput": 1, "witnessScript": "512103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b52ae", diff --git a/firmware/test/resources/302-sign.json b/firmware/test/resources/302-sign.json index 2abaed3f..f8a45519 100644 --- a/firmware/test/resources/302-sign.json +++ b/firmware/test/resources/302-sign.json @@ -4,6 +4,8 @@ "expected": true, "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "7006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203", diff --git a/firmware/test/resources/410-sign-fail-invalid-version.json b/firmware/test/resources/410-sign-fail-invalid-version.json deleted file mode 100644 index c04467c7..00000000 --- a/firmware/test/resources/410-sign-fail-invalid-version.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "Sign fails due to invalid BTC tx version", - "operation": "signAuthorized", - "expected": "0x6a8e", - "btcTx": "01010000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", - "btcTxInput": 0, - "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", - "receiptMp": [ - "7006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203", - "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b000388267006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203fdd705" - ] -} diff --git a/firmware/test/resources/411-0-sign-fail-zero-byte-input-script.json b/firmware/test/resources/411-0-sign-fail-zero-byte-input-script.json new file mode 100644 index 00000000..f72c9522 --- /dev/null +++ b/firmware/test/resources/411-0-sign-fail-zero-byte-input-script.json @@ -0,0 +1,14 @@ +{ + "name": "Sign fails due to zero byte input script", + "operation": "signAuthorized", + "expected": "0x6a8d", + "btcTx": "02000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000fd00000020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "btcTxInput": 1, + "witnessScript": "532103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b54ae", + "outpointValue": 333444, + "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "receiptMp": [ + "70060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203", + "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b0003882670060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203fdd705" + ] +} diff --git a/firmware/test/resources/411-sign-fail-zero-byte-tx.json b/firmware/test/resources/411-1-sign-fail-zero-byte-input-script-legacy.json similarity index 95% rename from firmware/test/resources/411-sign-fail-zero-byte-tx.json rename to firmware/test/resources/411-1-sign-fail-zero-byte-input-script-legacy.json index 048fdbce..cafb3aee 100644 --- a/firmware/test/resources/411-sign-fail-zero-byte-tx.json +++ b/firmware/test/resources/411-1-sign-fail-zero-byte-input-script-legacy.json @@ -1,9 +1,11 @@ { - "name": "Sign fails due to zero byte tx", + "name": "Sign fails due to zero byte input script (legacy TX)", "operation": "signAuthorized", "expected": "0x6a8d", "btcTx": "0200000002fe6eb00ec7d203273c0ab79dac3cf49292f86f11e56f7b988e1ed25ed1bc340b00000000fd00004e0000004cfa20163db71aed39845d4ba481160c0c8d5329386e96ed0bc2f4b9d44cea41c3012775645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368aeffffffff13f050792d5a5397a10571730991f3d2cdfc9f6b3dc8f547d0b05b35f72afaf401000000de000000004cd8645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368aeffffffff0250e24a00000000001976a9140a4f09cbd39d5d8072b24385e1a9eb1c84ae544688acc035310b0000000017a914ba053351893c7495e0c75d5abacb3ed886cf1ff88700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0954487990dc49755fb4aa12dca75792620a21b7d281551754cfdc13fc00666caa00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "7006008aea5320de5af1ebf4c349c1de93039031a4b372b17e67eb21417cbfbc27a4aa000203", diff --git a/firmware/test/resources/412-sign-fail-malformed-redeem-script.json b/firmware/test/resources/412-sign-fail-malformed-redeem-script-legacy.json similarity index 96% rename from firmware/test/resources/412-sign-fail-malformed-redeem-script.json rename to firmware/test/resources/412-sign-fail-malformed-redeem-script-legacy.json index 90bba338..2b9602cb 100644 --- a/firmware/test/resources/412-sign-fail-malformed-redeem-script.json +++ b/firmware/test/resources/412-sign-fail-malformed-redeem-script-legacy.json @@ -1,9 +1,11 @@ { - "name": "Sign with a malformed redeemScript", + "name": "Sign with a malformed redeemScript (legacy TX)", "operation": "signAuthorized", "expected": "0x6a8d", "btcTx": "0100000001ea0972997fabb54841aea288b81fe5c337b997bca3874cc8c2ba00b743c5d7c164000000fc13020000000000000000000000000000004d010258210271df73590582950f35db74b143d5b33d236b85c4879b843b72501ec6a2848938210235f05d65271026dee084dfa85b4e1d9003d7222e41b77ff7a9d96dde1c1df4b621021af9a946169d37fe597a8f18ae24bab5f1d67389b4969e3b2968d83a89ddb77221035a1991fea6c84847cfcd744c2b2ceda52068ee6121ab45d401d589946586399821038dab9d13aab76fb67dae25ff3444e5fa034e92abd734813193c808fef1f3c4402103a4729c1b5985797db6d6684b1d6ed20799bd2907583522a60849cad2aafa38132102d6b7d281af02859e6ba4f7e17284ea5e9ff6f8ab499ecbbc15a716497491d9be21034e85baa81c962d5649beff5c8df9f615369e7e7a107ce3e4a13b8ffbb2fbf906210271e5df883f5ba4e741c97bbcaca3d6c76c5a290db4b04554a99bbba5834ead6b2102f9994a4066656e8d31da1bdf68da7443d0160805c378ec068d03ced7b94d15142102d7582f433664a6b3ed5ad4ce8c62fb9771c1b73306faa2ea8183ff4a325193ce2102a036e410405eb60f6637e0f23507ef8414083ac4c3b1f295268b4ee96dd19411210203e012375a9cd95c9e35e1e084b567941b5961e9cc1679cde20ed2fa53af2ab521020001c24db69a74345f8b16b318b19c87da14b3e5cb7583be9a902aead6084b3321025c587d630165a13a6fe9460ea572e42f0bacf5f66270e7440c100775821d38a65faeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a07a5ea0c3546fbb52e05150499293b6fbbcb8db40907563f1f790fd3f68d52758a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "700600d09dcee2546ef042bd54065a161cf3b31901d5bf2eef25bc9abbc7f65337417f000203", diff --git a/firmware/test/resources/413-0-sign-fail-malformed-output.json b/firmware/test/resources/413-0-sign-fail-malformed-output.json new file mode 100644 index 00000000..e2268fc9 --- /dev/null +++ b/firmware/test/resources/413-0-sign-fail-malformed-output.json @@ -0,0 +1,14 @@ +{ + "name": "Sign with a malformed BTC tx output", + "operation": "signAuthorized", + "expected": "0x6a87", + "btcTx": "02000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001776a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00000000", + "btcTxInput": 0, + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, + "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "receiptMp": [ + "70060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203", + "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b0003882670060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203fdd705" + ] +} diff --git a/firmware/test/resources/413-sign-fail-malformed-output.json b/firmware/test/resources/413-1-sign-fail-malformed-output-legacy.json similarity index 94% rename from firmware/test/resources/413-sign-fail-malformed-output.json rename to firmware/test/resources/413-1-sign-fail-malformed-output-legacy.json index 65713cb0..22018307 100644 --- a/firmware/test/resources/413-sign-fail-malformed-output.json +++ b/firmware/test/resources/413-1-sign-fail-malformed-output-legacy.json @@ -1,9 +1,11 @@ { - "name": "Sign with a malformed BTC tx output", + "name": "Sign with a malformed BTC tx output (legacy TX)", "operation": "signAuthorized", "expected": "0x6a87", "btcTx": "02000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff01b011e111000000001776a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a07a5ea0c3546fbb52e05150499293b6fbbcb8db40907563f1f790fd3f68d52758a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "700600d09dcee2546ef042bd54065a161cf3b31901d5bf2eef25bc9abbc7f65337417f000203", diff --git a/firmware/test/resources/414-0-sign-fail-receipt-nomatch.json b/firmware/test/resources/414-0-sign-fail-receipt-nomatch.json new file mode 100644 index 00000000..50d0cfda --- /dev/null +++ b/firmware/test/resources/414-0-sign-fail-receipt-nomatch.json @@ -0,0 +1,14 @@ +{ + "name": "Sign fails due to unmatched receipt", + "operation": "signAuthorized", + "expected": "0x6a87", + "btcTx": "02000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "btcTxInput": 0, + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, + "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "receiptMp": [ + "70060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203", + "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b0003882670060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203fdd705" + ] +} diff --git a/firmware/test/resources/414-sign-fail-receipt-nomatch.json b/firmware/test/resources/414-1-sign-fail-receipt-nomatch-legacy.json similarity index 94% rename from firmware/test/resources/414-sign-fail-receipt-nomatch.json rename to firmware/test/resources/414-1-sign-fail-receipt-nomatch-legacy.json index a1fee231..948fc99b 100644 --- a/firmware/test/resources/414-sign-fail-receipt-nomatch.json +++ b/firmware/test/resources/414-1-sign-fail-receipt-nomatch-legacy.json @@ -1,9 +1,11 @@ { - "name": "Sign fails due to unmatched receipt", + "name": "Sign fails due to unmatched receipt (legacy TX)", "operation": "signAuthorized", "expected": "0x6a87", "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0954487990dc49755fb4aa12dca75792620a21b7d281551754cfdc13fc00666caa00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "7006008aea5320de5af1ebf4c349c1de93039031a4b372b17e67eb21417cbfbc27a4aa000203", diff --git a/firmware/test/resources/415-0-sign-fail-receipt-no-match-single-log.json b/firmware/test/resources/415-0-sign-fail-receipt-no-match-single-log.json new file mode 100644 index 00000000..6663c88e --- /dev/null +++ b/firmware/test/resources/415-0-sign-fail-receipt-no-match-single-log.json @@ -0,0 +1,14 @@ +{ + "name": "Sign fails due to receipt with multiple logs but no full match", + "operation": "signAuthorized", + "expected": "0x6a87", + "btcTx": "02000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "btcTxInput": 0, + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, + "receipt": "f902e10180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f901d7f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc791a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a02a148ba0ded909b41595357f877f872fdd73f104bd907b93e520363db99fe620a00000000000000000000000000000000000000000000000000000000011e1a300f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a02a148ba0ded909b41595357f877f872fdd73f104bd907b93e520363db99fe6aaa00000000000000000000000000000000000000000000000000000000011e1a300f89b940000000000000000000000000000000001000007f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a02a148ba0ded909b41595357f877f872fdd73f104bd907b93e520363db99fe620a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "receiptMp": [ + "700600ad1c99bfe5f27d213df21572d5137e291292f8b7b9142294e86fe8a1f7e035ce000203", + "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b00038826700600ad1c99bfe5f27d213df21572d5137e291292f8b7b9142294e86fe8a1f7e035ce000203fdd705" + ] +} diff --git a/firmware/test/resources/415-sign-fail-receipt-no-match-single-log.json b/firmware/test/resources/415-1-sign-fail-receipt-no-match-single-log-legacy.json similarity index 96% rename from firmware/test/resources/415-sign-fail-receipt-no-match-single-log.json rename to firmware/test/resources/415-1-sign-fail-receipt-no-match-single-log-legacy.json index 5d76aecb..6a2424b0 100644 --- a/firmware/test/resources/415-sign-fail-receipt-no-match-single-log.json +++ b/firmware/test/resources/415-1-sign-fail-receipt-no-match-single-log-legacy.json @@ -1,9 +1,11 @@ { - "name": "Sign fails due to receipt with multiple logs but no full match", + "name": "Sign fails due to receipt with multiple logs but no full match (legacy TX)", "operation": "signAuthorized", "expected": "0x6a87", "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902e10180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f901d7f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc791a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a300f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b15a00000000000000000000000000000000000000000000000000000000011e1a300f89b940000000000000000000000000000000001000007f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "700600ad1c99bfe5f27d213df21572d5137e291292f8b7b9142294e86fe8a1f7e035ce000203", diff --git a/firmware/test/resources/416-sign-fail-receipt-top-level-size-mismatch.json b/firmware/test/resources/416-sign-fail-receipt-top-level-size-mismatch.json index a4af9bfc..27a838da 100644 --- a/firmware/test/resources/416-sign-fail-receipt-top-level-size-mismatch.json +++ b/firmware/test/resources/416-sign-fail-receipt-top-level-size-mismatch.json @@ -2,8 +2,10 @@ "name": "Sign with a receipt that has a wrong number of top level elements", "operation": "signAuthorized", "expected": "0x6a8b", - "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", - "btcTxInput": 0, + "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "btcTxInput": 0, + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, "receipt": "f84ea6aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa6bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "receiptMp": [] } diff --git a/firmware/test/resources/417-sign-fail-receipt-malformed-nologs.json b/firmware/test/resources/417-sign-fail-receipt-malformed-nologs.json index 3b164c39..8b725215 100644 --- a/firmware/test/resources/417-sign-fail-receipt-malformed-nologs.json +++ b/firmware/test/resources/417-sign-fail-receipt-malformed-nologs.json @@ -2,8 +2,10 @@ "name": "Sign with a receipt that has no logs (malformed)", "operation": "signAuthorized", "expected": "0x6a87", - "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", - "btcTxInput": 0, + "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "btcTxInput": 0, + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, "receipt": "f84e8a111111111111111111118a222222222222222222228a333333333333333333338a444444444444444444448a555555555555555555559666666666666666666666666666666666666666666666", "receiptMp": [] } diff --git a/firmware/test/resources/418-sign-fail-proof-only-receipts-root.json b/firmware/test/resources/418-sign-fail-proof-only-receipts-root.json index 29a74a2e..6cafe967 100644 --- a/firmware/test/resources/418-sign-fail-proof-only-receipts-root.json +++ b/firmware/test/resources/418-sign-fail-proof-only-receipts-root.json @@ -2,9 +2,11 @@ "name": "Sign fails due to proof with only the receipts root", "operation": "signAuthorized", "expected": "0x6a94", - "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", + "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", "btcTxInput": 0, - "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, + "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "432670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b000388267006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203fdd705" ] diff --git a/firmware/test/resources/419-sign-fail-proof-first-non-leaf.json b/firmware/test/resources/419-sign-fail-proof-first-non-leaf.json index 8ccb57fd..e1ee7490 100644 --- a/firmware/test/resources/419-sign-fail-proof-first-non-leaf.json +++ b/firmware/test/resources/419-sign-fail-proof-first-non-leaf.json @@ -2,9 +2,11 @@ "name": "Sign fails due to proof's first node not a leaf", "operation": "signAuthorized", "expected": "0x6a94", - "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", + "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", "btcTxInput": 0, - "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, + "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b000388267006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203fdd705" ] diff --git a/firmware/test/resources/420-sign-fail-proof-leaf-nomatch.json b/firmware/test/resources/420-sign-fail-proof-leaf-nomatch.json index a0c194cc..f040f787 100644 --- a/firmware/test/resources/420-sign-fail-proof-leaf-nomatch.json +++ b/firmware/test/resources/420-sign-fail-proof-leaf-nomatch.json @@ -2,9 +2,11 @@ "name": "Sign fails due to proof's leaf value hash not matching the receipt hash", "operation": "signAuthorized", "expected": "0x6a94", - "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", + "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", "btcTxInput": 0, - "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, + "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "7006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a2000203", "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b000388267006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a2000203fdd705" diff --git a/firmware/test/resources/421-sign-fail-proof-wrong-version-node.json b/firmware/test/resources/421-sign-fail-proof-wrong-version-node.json index f9aa3867..62e69ccb 100644 --- a/firmware/test/resources/421-sign-fail-proof-wrong-version-node.json +++ b/firmware/test/resources/421-sign-fail-proof-wrong-version-node.json @@ -2,9 +2,11 @@ "name": "Sign fails due to proof's node version incorrect", "operation": "signAuthorized", "expected": "0x6a92", - "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", + "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", "btcTxInput": 0, - "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, + "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "b006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203", "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b000388267006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203fdd705" diff --git a/firmware/test/resources/422-sign-fail-proof-does-not-connect.json b/firmware/test/resources/422-sign-fail-proof-does-not-connect.json index d8c7edcd..e391996b 100644 --- a/firmware/test/resources/422-sign-fail-proof-does-not-connect.json +++ b/firmware/test/resources/422-sign-fail-proof-does-not-connect.json @@ -2,12 +2,14 @@ "name": "Sign fails due to long proof disconnected", "operation": "signAuthorized", "expected": "0x6a95", - "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", + "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", "btcTxInput": 0, - "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, + "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ - "7006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203", - "4a267006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203aa", + "70060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203", + "4a2670060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203aa", "4435fbe74b04b49d685bc1e2bf73c9fc5b99bc70b94d981b3111b2c600060dfd36fd1234", "48ff00d518eb562ac62c2f556fed61a3595f3af0d902c51bd14dc91e8e1bb846fcfe12345678", "4c051f23e611d1cf391cdd2b5a51f3df78815d1d303bef096f7158018b128a0de1d7fdcca3245c3ccda6fb81c6eed41fb6d018abcdf388ff5840d5368eb86aeaf1ff123456789abcdef0"] diff --git a/firmware/test/resources/423-sign-auth-fail-invalid-path.json b/firmware/test/resources/423-sign-auth-fail-invalid-path.json index 719ba14e..7ec78f24 100644 --- a/firmware/test/resources/423-sign-auth-fail-invalid-path.json +++ b/firmware/test/resources/423-sign-auth-fail-invalid-path.json @@ -7,11 +7,13 @@ "m/44'/3'/2'/55/55" ], "expected": "0x6a8f", - "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", - "btcTxInput": 0, - "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", - "receiptMp": [ - "7006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203", - "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b000388267006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203fdd705" - ] + "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "btcTxInput": 0, + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, + "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "receiptMp": [ + "70060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203", + "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b0003882670060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203fdd705" + ] } diff --git a/firmware/test/resources/425-sign-auth-fail-invalid-length.json b/firmware/test/resources/425-sign-auth-fail-invalid-length.json index ad8b8f56..d0d9c620 100644 --- a/firmware/test/resources/425-sign-auth-fail-invalid-length.json +++ b/firmware/test/resources/425-sign-auth-fail-invalid-length.json @@ -7,11 +7,13 @@ "m/44'/55/55", "m/44'" ], - "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", - "btcTxInput": 0, - "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", - "receiptMp": [ - "7006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203", - "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b000388267006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203fdd705" - ] + "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "btcTxInput": 0, + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, + "receipt": "f902030180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd087a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "receiptMp": [ + "70060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203", + "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b0003882670060075fd226597da0032cb4799dee62be2ea10deca39b629b2ccbaf98ea18bb54fa7000203fdd705" + ] } diff --git a/firmware/test/resources/428-sign-auth-fail-disallow-receipt-multiple-top-level.json b/firmware/test/resources/428-sign-auth-fail-disallow-receipt-multiple-top-level.json index 00aa2993..b9afa71d 100644 --- a/firmware/test/resources/428-sign-auth-fail-disallow-receipt-multiple-top-level.json +++ b/firmware/test/resources/428-sign-auth-fail-disallow-receipt-multiple-top-level.json @@ -2,8 +2,10 @@ "name": "Sign authorized with disallowed receipt with multiple top-level lists", "operation": "signAuthorized", "expected": "0x6a8b", - "btcTx": "0200000001c36068f22ad1285b0e8c75547e634a7df21d7bf3e23788b8942e3ad14bd7ab8a01000000fdc80100000000000000004dbd0157210231a395e332dde8688800a0025cccc5771ea1aa874a633b8ab6e5c89d300c7c3621026b472f7d59d201ff1f540f111b6eb329e071c30a9d23e3d2bcd128fe73dc254c21027319afb15481dbeb3c426bcc37f9a30e7f51ceff586936d85548d9395bcc2344210294c817150f78607566e961b3c71df53a22022a80acbb982f83c0c8baac040adc2103250c11be0561b1d7ae168b1f59e39cbc1fd1ba3cf4d2140c1a365b2723a2bf9321033ada6ef3b1d93a1978b595c7a9e2aa613860b26d4f5a7abb88576aa42b3432ad210357f7ed4c118e581f49cd3b4d9dd1edb4295f4def49d6dcf2faaaaac87a1a0a42210372cd46831f3b6afd4c044d160b7667e8ebf659d6cb51a825a3104df6ee0638c62103ae72827d25030818c4947a800187b1fbcc33ae751e248ae60094cc989fb880f62103b3a7aa25702000c5c1faa300600e8e2bd89cde2be7fb1ec898a39c50d9de90d12103b53899c390573471ba30e5054f78376c5f797fda26dde7a760789f02908cbad22103e05bf6002b62651378b1954820539c36ca405cbb778c225395dd9ebff67802992103ecd8af1e93c57a1b8c7f917bd9980af798adeb0205e9687865673353eb041e8d5daeffffffff02bb57eb0b000000001976a9147e8784d8b1e299d8f55c9977fbfa9c1821eb472188ace274a04c0000000017a914596cff92a275960df9cb2ab9df0ff69faa2b1d8a8700000000", - "btcTxInput": 0, + "btcTx": "01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "btcTxInput": 0, + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 111222, "receipt": "c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080c6808080808080", "receiptMp": [] } diff --git a/firmware/test/resources/620-sign-segwit-basic.json b/firmware/test/resources/602-sign-basic.json similarity index 98% rename from firmware/test/resources/620-sign-segwit-basic.json rename to firmware/test/resources/602-sign-basic.json index 4fb3d628..3333d849 100644 --- a/firmware/test/resources/620-sign-segwit-basic.json +++ b/firmware/test/resources/602-sign-basic.json @@ -4,7 +4,6 @@ "runOn": "tcpsigner", "expected": true, "fake_ancestor_receipts_root": "eabbc877b16f4f484beadb403a9a65e04a9c8c8a5cea57315f729ceedbc0d6a7", - "txType": "segwit", "btcTx": "010000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e01000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", "btcTxInput": 0, "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", diff --git a/firmware/test/resources/622-sign-segwit-long-witnessscript.json b/firmware/test/resources/603-0-sign-long-witnessscript.json similarity index 99% rename from firmware/test/resources/622-sign-segwit-long-witnessscript.json rename to firmware/test/resources/603-0-sign-long-witnessscript.json index bbae348c..f99ab161 100644 --- a/firmware/test/resources/622-sign-segwit-long-witnessscript.json +++ b/firmware/test/resources/603-0-sign-long-witnessscript.json @@ -4,7 +4,6 @@ "runOn": "tcpsigner", "expected": true, "fake_ancestor_receipts_root": "8d87508bb18f696e2e41fef9abe7d25555899ff69e8310c706aaaa35ff7443bd", - "txType": "segwit", "btcTx": "0100000001cb41716a0cfca06cb09590d747182916314b048e19f3c7700eab1df8b25c5dce030000002200209d522c8d95b65b357ccf98b1b69da3b385329146a002e8a2e12a85ca5e1d9915ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", "btcTxInput": 0, "witnessScript": "58210271df73590582950f35db74b143d5b33d236b85c4879b843b72501ec6a2848938210235f05d65271026dee084dfa85b4e1d9003d7222e41b77ff7a9d96dde1c1df4b621021af9a946169d37fe597a8f18ae24bab5f1d67389b4969e3b2968d83a89ddb77221035a1991fea6c84847cfcd744c2b2ceda52068ee6121ab45d401d589946586399821038dab9d13aab76fb67dae25ff3444e5fa034e92abd734813193c808fef1f3c4402103a4729c1b5985797db6d6684b1d6ed20799bd2907583522a60849cad2aafa38132102d6b7d281af02859e6ba4f7e17284ea5e9ff6f8ab499ecbbc15a716497491d9be21034e85baa81c962d5649beff5c8df9f615369e7e7a107ce3e4a13b8ffbb2fbf906210271e5df883f5ba4e741c97bbcaca3d6c76c5a290db4b04554a99bbba5834ead6b2102f9994a4066656e8d31da1bdf68da7443d0160805c378ec068d03ced7b94d15142102d7582f433664a6b3ed5ad4ce8c62fb9771c1b73306faa2ea8183ff4a325193ce2102a036e410405eb60f6637e0f23507ef8414083ac4c3b1f295268b4ee96dd19411210203e012375a9cd95c9e35e1e084b567941b5961e9cc1679cde20ed2fa53af2ab521020001c24db69a74345f8b16b318b19c87da14b3e5cb7583be9a902aead6084b3321025c587d630165a13a6fe9460ea572e42f0bacf5f66270e7440c100775821d38a65fae", diff --git a/firmware/test/resources/602-sign-long-redeemscript.json b/firmware/test/resources/603-1-sign-long-redeemscript-legacy.json similarity index 96% rename from firmware/test/resources/602-sign-long-redeemscript.json rename to firmware/test/resources/603-1-sign-long-redeemscript-legacy.json index d1f382d4..37327b61 100644 --- a/firmware/test/resources/602-sign-long-redeemscript.json +++ b/firmware/test/resources/603-1-sign-long-redeemscript-legacy.json @@ -1,11 +1,13 @@ { - "name": "Sign with a long redeemScript", + "name": "Sign with a long redeemScript (legacy TX)", "operation": "signAuthorized", "runOn": "tcpsigner", "expected": true, "fake_ancestor_receipts_root": "b669533aad43aca9bb1f12a29d3cf8852fa7279747c503eb6632c98faf46871c", "btcTx": "0100000001ea0972997fabb54841aea288b81fe5c337b997bca3874cc8c2ba00b743c5d7c164000000fd13020000000000000000000000000000004d010258210271df73590582950f35db74b143d5b33d236b85c4879b843b72501ec6a2848938210235f05d65271026dee084dfa85b4e1d9003d7222e41b77ff7a9d96dde1c1df4b621021af9a946169d37fe597a8f18ae24bab5f1d67389b4969e3b2968d83a89ddb77221035a1991fea6c84847cfcd744c2b2ceda52068ee6121ab45d401d589946586399821038dab9d13aab76fb67dae25ff3444e5fa034e92abd734813193c808fef1f3c4402103a4729c1b5985797db6d6684b1d6ed20799bd2907583522a60849cad2aafa38132102d6b7d281af02859e6ba4f7e17284ea5e9ff6f8ab499ecbbc15a716497491d9be21034e85baa81c962d5649beff5c8df9f615369e7e7a107ce3e4a13b8ffbb2fbf906210271e5df883f5ba4e741c97bbcaca3d6c76c5a290db4b04554a99bbba5834ead6b2102f9994a4066656e8d31da1bdf68da7443d0160805c378ec068d03ced7b94d15142102d7582f433664a6b3ed5ad4ce8c62fb9771c1b73306faa2ea8183ff4a325193ce2102a036e410405eb60f6637e0f23507ef8414083ac4c3b1f295268b4ee96dd19411210203e012375a9cd95c9e35e1e084b567941b5961e9cc1679cde20ed2fa53af2ab521020001c24db69a74345f8b16b318b19c87da14b3e5cb7583be9a902aead6084b3321025c587d630165a13a6fe9460ea572e42f0bacf5f66270e7440c100775821d38a65faeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a07a5ea0c3546fbb52e05150499293b6fbbcb8db40907563f1f790fd3f68d52758a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "700600d09dcee2546ef042bd54065a161cf3b31901d5bf2eef25bc9abbc7f65337417f000203", diff --git a/firmware/test/resources/604-0-sign-match-long-proof.json b/firmware/test/resources/604-0-sign-match-long-proof.json new file mode 100644 index 00000000..4d610b73 --- /dev/null +++ b/firmware/test/resources/604-0-sign-match-long-proof.json @@ -0,0 +1,18 @@ +{ + "name": "Sign with a long partial receipt merkle proof", + "operation": "signAuthorized", + "runOn": "tcpsigner", + "expected": true, + "fake_ancestor_receipts_root": "c1b5e0f022d32e1469b6555d2187d6b185c0777ff005f760d85a9c31c62023de", + "btcTx": "020000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e01000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "btcTxInput": 0, + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 987654321, + "receipt": "f902b90180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f901aff884945f38e81f7f0950122c55ec46243f6b7c8ffdddfaf8669e2a0d04c52beb8050e73a886b086714ee58d1f3b7e75656f4ba752e8e305c8cfee5dda260fcbfcace1a2399924b8cf5f7a03e164dd7581d242f50e778d1e48e3180e9efa0fd2b995cc9dc1b882b97063e4bc34db2729109046ec3f815fc36fcbae8c703090586c13b6b072388f897940000000000000000000000000000000001000006f84da07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc7908a8d3a8b1417630236c3dda068f9b590f2ad38258e28c1a479193a9c4fec7bdbbd076059f6c8daaf4ab4ef9db297349a8a3f6fc209b41f43c10a0ad365da0078491a55ec6adfe0c096f48f4d7ad26079b8b117a137399a8c100f2e8463c9fff85e9422f578b9fd7de26fb76875baa55fa5ecddcbd888f8409d21441988c9b3b3245e384652601f73f131f3ee507f655c4b104c12fcfc96a0bcd80b6b9faee1aa5934aa206f567a0d964b315f5b8aeecd2f092f3dba0aa41c8633e12f20772cef94241e4f66b700bd09fd80ef28faabe04b6e95a451d291ffd016e8436d7390fa929bb870d7a3f3f3866ad9051207a28001", + "receiptMp": [ + "7006005476b31d983c19f2eec1e204d08e57824adea1292ea538ba51a87a83619b8d1b000203", + "4a267006005476b31d983c19f2eec1e204d08e57824adea1292ea538ba51a87a83619b8d1b000203aa", + "4475f9bfec2db051c422dac6f0708cfe098b783e7f515a042186ffa4a7d09445cdfd1234", + "4887b1648d1aa8247dcdf7a7d30c023efde7e55a8216f3c546c17c4f40fc6deaadfe12345678", + "4c051f23e611d1cf391cdd2b5a51f3df78815d1d303bef096f7158018b128a0de1b6104fdac0c504d39236246efa534f19ceb715744104d004baec49800fa3b6fbff1234567800000000"] +} diff --git a/firmware/test/resources/615-sign-match-long-proof.json b/firmware/test/resources/604-1-sign-match-long-proof-legacy.json similarity index 94% rename from firmware/test/resources/615-sign-match-long-proof.json rename to firmware/test/resources/604-1-sign-match-long-proof-legacy.json index 4f2a1e13..b1adb17a 100644 --- a/firmware/test/resources/615-sign-match-long-proof.json +++ b/firmware/test/resources/604-1-sign-match-long-proof-legacy.json @@ -1,11 +1,13 @@ { - "name": "Sign with a long partial receipt merkle proof", + "name": "Sign with a long partial receipt merkle proof (legacy TX)", "operation": "signAuthorized", "runOn": "tcpsigner", "expected": true, "fake_ancestor_receipts_root": "5609cc9ca4e1379222c35bc54b9be88d69d53c9fe1c4e422815db890339951ff", "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "7006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203", diff --git a/firmware/test/resources/621-sign-segwit-with-many-inputs.json b/firmware/test/resources/605-0-sign-tx-with-many-inputs.json similarity index 99% rename from firmware/test/resources/621-sign-segwit-with-many-inputs.json rename to firmware/test/resources/605-0-sign-tx-with-many-inputs.json index f03ea364..2fe28c3c 100644 --- a/firmware/test/resources/621-sign-segwit-with-many-inputs.json +++ b/firmware/test/resources/605-0-sign-tx-with-many-inputs.json @@ -4,7 +4,6 @@ "runOn": "tcpsigner", "expected": true, "fake_ancestor_receipts_root": "b550311160cd59f4d912fa7246a21332dda29ba54ff782a76d19fe26ed2ab533", - "txType": "segwit", "btcTx": "01000000fc208393eed3f5e4952ee809fb8976dea39994d35f8af16a683df073b7e37acb91300000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffdb5a526cf8e20fb00cfe88ed01041bd49992a6426005fe8a53629f8b154b0fb0a00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3bec19bab0ad389adb52d339350858f6d3ea81d566dfa324d228d2abb4b08abf7d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff96b616b29a71b829d04e0781410304f70b4f931d776eb5db157d3816d7b76a6db60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9bdcd1bd9e53354bcefaaf576a5c9999120300a704e08d6c0b33bb2190fad933610000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff838a64df688e1baf0bcf479f6cde3dd2a577f9f736ad7f0dc96dc016c0274690080000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff866c236c1c98e8a7d63571cd038a90d4f15da63b04113263793ec62fd066aa961f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc466796d245040ac945d7af542caf15a400c2d5b98523aa8fd2ff771524e39d6530000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff001ff1969be15958052e6220409b7a029c89eaa82647b76e29f36c2a7bf158ecaa0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3c46742a75f2f5d9b9a2543126e642f5cdbad20b92e53a6d43fa66f07723f552440000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff20c1613672f0ef9c036094a4992a4d322313756cb50a995470f532c3fbc5f06dd00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff650a2885dce9423544c4357da26fe18bcc88ce0fdcfc01c8a21a2ea5ba218277fd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff60f7d77c55d6f79e0e6949804c76a39487345d6b3ef276e88b9e670925ae8238160000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbbe42315ea341105c82525f00ac05855f925698007e4dbb754b5bcb36322b245250000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff38af7d4a9a3690ef73262b8e22fc500e65ff1251980aea9cdea03d62f540843a650000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd5f1439ce8454383576e9b69b9cf336b74eb188f4402c035e02cc4cd01353d29960000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff22314b7a254e524341eb316d46f3e5873068944bc06d284d8a8898713591847adf0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff896dfcb27e791349f9e06db7da8d8bc1b1680d8833b1e28499de7270bac2566e1e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffdb372b56cd12c68480ee5e59820b3332694b0cac3f3c2b7182b9ffaab9b2327320000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff740c8461bf9b6363582a189b91fa5c3f8138ddaa5a339103bd011591d033bbfb800000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff35db4c8ba2d9bb613a293b4ee3cc08e8500025db4a0fa2f17659317827e987ac6b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9dc5116c995bb6fe84272f8bbadce7a6bf6b693172b992206390a00c7a75e49c1a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffddbf801ed39cecdc9c6cf996800af267b41808892aa977d53b193d64bfb2256f060000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff456f97e065b1753f391ee02c83230a1057245dac74772456f2b56b3418ceb705580000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff13a8f80f436b2aaf316b3ee4f58244427ead812185a94ce6c13d5569004a5985a50000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb5c8f337cee7db201a08ac70699d3719c2ec8e2078f7eed9249ea54ff45ad3540c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff99cd6885a17c488c35d678a1f92a5bcc8fbf9585f2c867c44a14a677b6012d78980000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffec59b4bde6c6e2c595c8134adc0c40511352d26287bf2c1cbd3eb9f2a1b901bffb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8b200973ad2e0e972a717bce05afb64cd86a22f32615b1ab38d1326ac11c7baf030000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe171a0d2bc948086a6320c3238c13520f8e5d855ec679a413a0078b9fb1bc1cbdf0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4df6ec68787280d39f7f39359b9c9612f3d1fe90de3cb9c694227682b328c6ec610000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1d0586fa7fd353a85daf4603bb860ca6ad4c64e7ac9824164a4790507930d3ca7b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbfc42cc9bc57409d7d4bef67780f356099c39a1593927a31cf14c59fafdac03c960000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe2011fe5121c24404ad283e8b8f1a3c67b79e023d27f82dbece3e5afdfeb23984e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff196e09ec1779825794584bdf7c199bd20d300808c3120727ffa9a51bc427f021fb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff6ba1a69b1505784e1c427811cb2b0a35947cfcddd7d1fdc766789e2e78e6d1a3660000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7ce8b8ef8bbedce1a5316427f55802a7adae296b88c23474e589366ef634c7ce770000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7f1a54fa0f655a29f3bf25bde2a9cca21c22430fc15c1b29d81913c4118face3cb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1db0fcf2e89271b01a76ed5ff3cd40fe8107eb7cee9587d055d02976e6411c793e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4d41dc4a74e6077cf458e88e558197f13428c05a0e1daa0c1cedb4155b8cd56d580000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd22dc3dd384c29c78bfaf29b1569b06e0d40e457e4e7df9ad6ed6b5958a32208280000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff5ca7b28fa1960c50a235a6c607fa3c1410da9d257c1aba0c6822012989ea4fb2720000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1ed49ca83c361450e315ae838118647c7b9e84a60d21f4eb45dc33a4b305d2a04a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffda9de78bbc5e2fada30737d3b2205a434c0f76cbd9c67d233dfa5f843d4cbf1b7f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff3c0f8dbd1fc94169494a82aeb9cecb79233fa731aa2c08e420f560138176a397d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1057bad591f1d4a70d0405cac990a410413d0ea21db42290a4f7230103edefe8c60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2a73adac6022bc9d4a71359c2a8d1cd451dd83d87bb6f77c7145be2e4aef1f641d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8b8ff7cded51f82b63a1e5197eaecdaf82a206367d6c210a8c90d46515bca3f4130000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffeb4eb038bd905fa80aa73298f0e49fddc10091ae9389620bbcc6ce2b812d8c891e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff29a703b214c8344a872525f7891017490b6bc9458ec28edfef99c9b1a50279e9fd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff17fac595af95dc63c7462f6237db65afbd6604463e9be05aed9bb9f44b26f34ba0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff736f6a72fff2dbf5884d51865603602075573838fea94ea59e0cd76e3560659dbc0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2c5c164ad75c9fb44e5f9a97dec2a572a0870b4cb663c6f46858386057e03dfb4e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff653eeeca3885c3e817ff24b3f6ad2362a6250ad7dd65195d90e16c55df0e3086440000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffed3a0db1bd0246b7c9c8dd364ed69c090af7376c18c18773c0ea271c8903e19e460000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff479c3c9dd2881a9faa0fcb3a68b8712cc4cbe9aa83eda397747c24aff40c6ee99a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff3d4b6e3ddfa7fbe6cb13ede7ef64a2c5e3b625dea41d5fab6d5c44471c87bff8c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb2a1982f068a6d23f29aee03232089039700406e66f288ef56371a6a39538b98230000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbd97f7b700e6c4f217f2cd0a48fb02b05e9a42357a0fb81b415adea0051ab3ae8d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7dc21621497ea6dd9945ecaa736e0cb63168976b927049512f59bab60b2c7ce5270000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff121c0b5b496ea58e76d0d046b39e35c91b64038fad04634dd3020b1cf795bcd0350000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff057ec13725eff2b2acb6bf365dae44793a8492c465e1500c68ccd16fd8fb90e3510000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4bd56b93479cf637025d2320ab0d66081ccfde7e539550d2ae13211b5b62d6d12e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff0ae0170d070b4ea71d7fa03d6bd46729080a1fd3e8796d94aa40f5815b67ba58710000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffbdeb7a9f470dd5a6357be1f379c1de00dce811e73cd7640410bc13acafcad6ac80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa1dfaa00fb5aa769d37d940de7c385ad896fbb7a5b0af4cc79497dbf94b229be400000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff01f51183c1a3e60dece5a0634252c64c70bf896df3ff847c802aff175fd13d1abe0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7a84b406f84e3109d250237d7b304e26240ca9d6743b437f4e2fd50caeded2c7f30000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbcd044d34a17aaf896e79771d15a1757e94249c40ef6a4bf2c1b27fdeaecc098550000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff12c15ad37d90ae705fe5eca57fe71b99f1ee08045505418067152b0abae9d5ae340000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff5fb3e4109340eaba35353f53547930785c182e9aaf12cfbeb3f0b84d03bc9828dd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff27dad98494ace9d31d66b43becdeb0c396163219a7c50ef19d7eeba684fcf2733e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbf07ca17e2ba3aa2ec9141d1445d6ccb97ed0c4b3c324c8b28875f03c1511cbe210000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff5aea78368739a0a99f857e5bd5c67c9d15fdbcab20c969efc88ba16fbb59ecb0470000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff06eb17c61530b9e3de4229da3d1cc547764fa1ac8cf8daebcafb464c32a75c061d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa2140ce19132cf7568ed66a5a5d350beba936d8ef721ab5cacd9da48b99fd589040000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8d8ae25e2a9d51a963590c6a150370dcfd21c6192d01263c9cbc2a26bbbef50f3c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7da660dfd104f937379df3f91b3247dd6a1e7350c9b4e97ae31860fb4b2e50124e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffdc949413250fc8d658faab45657294ea5e17e6847068d5507f079439886f4377050000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffddff8fd77acf3e36c9a17e77438c2f5dd24cdd979d00d0cd6f24b81b52d429c8550000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff093eea44d3c6ec664086b486554f5d9522ec793a6e23de8023e43cdc8e5437e1a10000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff399cb648d0f1694b739c85e4a07d1669e99a13b895ad36771197c8820c5e85df8b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff7f58cfe7ccd2e7c1ee7c2949e420676946c98b0131fbc70701a1d833084de6ccd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc2c42c7c0cf0c0e4bc36e3bd82d462c199300980c53d41985ed51323a1fcf86c2a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff34fda05b7bafb0552d3c799afbc8aa1b7df48fece6ada860239551ea13dd8e6a5f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa0e7b50a187982a5e9cba03d66dbc11da899133a7886d5340fd3beedd9020c777a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3131971adc42849302cf6b5be0389b6d6d6455801dc14d0fe8435ce87ba0cd2c0f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff62be83b2e045735ec20553c098461810e6b377bdf985f4e96a79358f0add9000130000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8f8049bea641d8c7c5aba8d89f92068c1cd8ee0b2239191e958e1ff2164bce73db0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffddb7c635dbb40c34f604f59f560b329eaadeed0f6d5d34cbf6721d8c68a5cc0eea0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3aede035a47c0f3923907bf4e4d8ecc5fbb9287451b25c42fe6f1adf134f37b2610000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1b0480c8356857bf411b4c35efad3590f836f884671fac09fc34791e8f37b2f85f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc6a4ae2abcac03e78a6d3f3fe4d07c6e75e2e344064434c161085a7388be4caa270000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbc01556be797cee3e8e6a853e982a0394310731c7956a97dd3ea5f71692bc3caee0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9ac04670b00019b03de7cf83c8de383331e700138fa9d455c46317f2c7fd307d170000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc94a3ca138dc2c7c9b5ea6c668ab6267b406e4646090428cc583c6347bfeb63ef80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbffc8f36f7033f3b8f1f6961d29c3ccbff789b4f6906c3f899f97ab39e2cc379a80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff15b58d5689af77e10425f2233b8c7862533340115cd12dc5ca8be3819f049862950000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff40695075ec0801bab187809ae2e4f4f05fef896ef4812dc6fa4884a15c58a5aa270000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb8a4fac59edcff10f95f85d8cb3bd08cbc5e6b3a32d89404c57be162d12fdcf83e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffabfda27b2402c3cdd9ced27c1ad817f7b9d66e5fe4bda3a730076cd1b390b62fcd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffdba1b98014583c1910127ca0b2bebc866c182e7cbd625e057fec48993ae3a15f50000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe6c07631157d0a59de4f709f851cdf011ffc791e97458b979c47e803b17c8ac6120000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa33560970083ead4a1b4811637d0214821d273f76689063e70e5cdad445619f02a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa6cb6b5fa8e7e16a17a939a589ba56509968b0a4a0a524edca1ff5f87135a485ce0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff10c18592edfa0527921870c43d6c370184c8d736bf8f257a3a26af640ff0c70f00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7c95becdfe24c0056b283539c9512d9b59ab4abef612719af64257fcd6f59ff19d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe05fb119dadb6b81b8767f90b29c5cbc1c9b37df7eb8635fe594f76a9df1b7bc7b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4aa7ce52246e6ca1b666a04e2f169bb9ce7c4fee96f0791e1a8e41019079aa90640000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff21e8dac66a09014c42dc6c266529600ed2ab2dccecaa690c54adfa970a3751c1ba0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa0831ab9fa3d2280dd94e560baec4e9907516120c7369f56ecfbb61c0c4a9d471f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff5e875a75162a6f06c2218d0abb277d23960b405990d27bff155bb1027595556a230000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9dfc50f70c5c8d258e56570dc733db059352c95623d05ec5f77b6abaaf5b1187340000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffad8b8d49010eadd905bcbf59d230631b8765a14cd446207515483a36ecdf69d8510000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff937375a0ade6fe025dc44b396cc677dc95a99c338c0a5a7d2e10cbf3bfaa6bf0400000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2cc3f50dcc03f09710caebf7b40a9eca8ead0244e985a935149d5d3bf92313a55e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff0d1bfda37d4880a1a7ace585032e15baa213695ea80c4e0da1bce4cd3d3708ef880000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff766fe1d4c5d50e67483550a292f5613dbbd87873f1b348a41a4591a13f006174e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe41089062699c802bc7d1f1ee7a7edece087712b2c4d96195df1bd1c1b96e22f600000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe95821ec6aba3bb2bc2bbb05fbdcf5938c45151474378e284c0da71a4f42598eb40000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc8de2b8165f3d6452e554f210c3feee78752f6458a7cc8e686c50409b09ba0868d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff658979574f78b48840529d0c2f724fdc5d468874d3f2d7b42efb06d51be79ac8580000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff87386d3df36046fce4fbb1761623957ae37bcc9a3c12e5783827114e0e15d9ae750000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1b93848666086943a90ed8c967a00d02a79518e217937446492d875cc4ead94a570000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff066539257aa490471a6c92cb88d76e3a2ce44da361c3a02ea394b4427f72d187bb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff35fecb7b00b46107feaee3c7431ea0f4d9a3bfae636a002b24f0c7981b9867b2b90000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa609c79b9cbbd4a229dd68c3a360d496641d0919cd16844523e2779eb16a002daf0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff11ddd213375e285b5e0ec3f122c222a5f6044ec48b91f1b5129c83b10abbbc33230000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff73a4e7b67d767ce5fbb7ffff25b7aa8483cc30d3dfd891c3df468ea42ec5a397ca0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd72d23504dd108821a7c6c5f87be28d93dab7fdc6f73736d4543fb6e3af6d2b5ab0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1e7bae5194b0ad5eff39e3102c8e27087f6a28aa21f3b5f54c851123a94ad080500000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa6c895b0a5814030aed7c533dd64186b13706e35edfb4b753e564b6e25c901d84e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff732a838db68e72ea526a3341d74156a36434a062c736be243da3d5321f05365de80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff7044be9391252383eba2d3686b152860c841bc794e32f2d09ae1008f73c411abb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff86343b3ea233c734e288cacd24fb16e284f41c4a2840005edb0f7616453f90bdcd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa1673b717368f55044cbf7aa905c9e94bee6189d90fccfeaabe344ee8e8cea35d60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff64c6711bc20592a7d4d11a3834c2eada42e9c4130021a9a605741fd78187543c890000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff04440deb058de4cf02aaedea0df9fb51111afecd302b51c79fe5ece595c1efbac80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff4888a894b93e63c3f322a4b1cf767e2168f745cfa688a120e0e9ab5b8815718b60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffcf5afa912658236776d2c0c0a5ab5c1bd36b6e45ec7fbb6790d015393c507af74c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa9251b1e5918f1dc5e41a113f44740045d056ecb38840bcad2b696a3aab5400d200000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff46c0ff4f35db23c80747afa0d0347170f95c82a5f58992fca5201db8f6b39c0b060000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff56e8d4d6b0903a742ab7e629570388c2cc57b49ec8bcef9891dbea2ee583393ef80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffb602c59d9e49411395df5a1036baaccbbc6a9c99ebeb94d1cd3c3fcbaab0f2be30000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff011df19242e8394e8e0f59e722dd6e5001e9d7d6a7bcb0afa5a4a45839c1a5092f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa2c3fcb925ac5b1a6f3969db050d37fca5bd1f14cac21711efc8b0349628993e900000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff55296d17f30d6b0f5bb8ded480fba5bc3cec9b0d7aab7d58a924d297bba47cbf6a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc1372c52f283db9be8bfc7e0c4a676b60acf7aaf108de882c37452ea9889f47a6d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2667fdb89d372cae0b1a732b999dadf4360eefebebeaf5eec18bb6aad91bbc3d8e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3eafc1cc4c6a1f472a0ffd2eb14bb39e839f7822c83f9f60eca70367ab4126d6410000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff0b60c29a454b56d100bca2f067401786a14ff1b61115477a1356e1732814c364980000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc943b46f31be09eae4ec7379eae7c2cef2b0e431dbb32fcca7d70d4044894952b50000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff25a3307443653a547c7e9c5c917bc8c10135e083c5e90b887550922a94fadae0ba0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa075b8b1a76eb6ac9f790f012cd7a1b3eb10bee63fd9a45eac8bed012231c4d0e60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff666c31c166baf98d1004aac77b6e7738b24a9cce6fd8a9fb25835e172c3c2bb9ec0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff330bdc880a3907b41e2604ea4d0edc098912fe160ff79a5a5e4ef6f7e84bbef4110000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa143a820c2a986105fe0056b11ac272f738248fd452bc979ab1e05ac7cbcdb26800000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff09133953681a83e6f3a1d7add885b2ecd4f6fe07aa81077e0397a62cf580f6d3e70000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7d631e6eb195c1c9ddaa905d047a0700c95e2943f6756c23b5597e28dd7a172ecd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff89ee6813e36ea1f17985c7bf474a0f1a26179f1c1eb2df9e6ad44a8e22dc6388140000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff769e39ae93cd03f91da1e9cb59be9bf388394093900d7eec5a32d59859d0401f880000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff70cec86733e88836b3f8cacb80b77ebc42dfd20c3186146ebd10ab5ecf19c978580000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1ebd4a8fa281fc7a7f9f1101f40fa2466c186845640ec7da27184908d43ed6ca660000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff450e1e903149f8af45c366c8a5a8920de1b9bc28c6f4362d3d959a60e5bd5331d20000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4c5551d18e239587f9c4a0ffa515277c26550beea8a3ad21b1b3c4bd68f93be64c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff98fd89a096ee7d8febae4754f8eaaabc94d506f1a16e28d3d257a15125364638fb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff705616163ab8db57d2d8fc321c12021facb1a0b9b8293780e1e2854d116f4c6b920000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1f50ee861556453ed783244d4baed5d53186124aef77f48f6442199039662ddb890000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd7ec31327e91053b58397ffdd19687466a0f860261a7de2dd4150ade69fb16462b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3fc4af9492022016d044e77bf12caac4248e1dca7b5c3a1d0a326d6e79617013bd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7a15115f4eb2c7ca210b49d84a6491ec05ee9522fd49efdeea6b291a4d227d2cb90000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8568a729013377a77f394f63e360f7b68c7ae05fe3ecb0b251b0c18a50a42add830000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff77a0ac19aa26fca7e41dc9503d693d4272f7a99da1f18cc42e4610fa30c02073b20000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb9d2a85be9b5719db843aeee052c0c4a42bbda7029cb9c14be9f048a0f8cd657ce0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9a45c65122d733d7414d6da55660b573965022b8c805fb2de18e089dee64c541690000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe3150e7c9285ebab6f2fb38a6b4230bb4a29a166f27e4799820c2ba80a37502a600000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2668542ddbd3eb274f0942dd08355037c4e86cc63f59d31fb8bc691acf31b91f5e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7243209b521af3c507936a23a790f14a607b04cf4139743506c087cce1b48cceed0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff0b6e7adc897c76239cfa3fde80ebc16af3beb7115708654e3d68b758aa51385d810000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe2b7b21c7c14b76fcbf2b89bab64f57bb82a1cbcb73e2cbfde7fdf1991c66ea9c40000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe76bd641d6bbcda5e29a9880476b82dd1f5ab032712faea0e68bc471a930ffa1b40000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff34a9b23e5d925c69b71c8389bb96ddb7f6475de49138371a22c28808588c7f9b70000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff0ed81d34e4fc687428608e594d00aa4494d59d355e3a0e5d681030ab5e0c750f900000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa9ecca8db8de629150aa73a7c12185540944acc0fc8074c7814780cd5cabace6450000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa1562da4f71ad7e41f1292193cf0c0b243f064bbc42ae0986ea42cebd0d5a36bd90000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb9002847e3cd484a5d834a9d664ab88a2a6532088393d3a2a65c33387d8b985d390000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3431c0425294130ef249fb3bbc596b566b28d45276b8120d0d2893de3477f7bb110000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3fb87db0e818689642abeefb072c4e13c87cd6fda97fbc83600ccec766a624d7e00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff80109b5dea29ca9e215ebaa99929363c09da6f9fbc7277c34dcb27d0c933b8fa8a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8064c913a942915da588d99c2092d879701e0794438bd3b9e36e93566ac1d710fb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc58fcb1c1ddd6dd38a824585bf092a78fb00ab3d5c7198108973c2a78c9a29ab3e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffa24f6316ff87defa5149e203cb545ba79371f04c2a153c2518061b378a72f53400000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff999131d946bcfaacf1b0a24d669a25cb671628795bb4d4db664f3bf7222a76d0090000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffcb41716a0cfca06cb09590d747182916314b048e19f3c7700eab1df8b25c5dce03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54ffffffff4d781feff1859672d0f80feac9e895d993caf874f9bf2d62362486c6342bcf84a70000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb1d25a7fe98f2f4c9d81f9a35beaf00b43bead9cda052024a91e422f2ed792055f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff06da95d2b9b2224dcfc4f587c8f2fe696e5e1b1247074ca9bcf20fbdd159a2b5ee0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffeabb91e256e87701fea35640b71802e926ed2ae617145d4a611acb77d19027b0560000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc7c14e744714e5b754c7b672fb65129b5b7c1ed6fc12c2d4d1204a4cfb3e6555b30000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffba88cf31bfe8ee6cf07925cf39c6af02bc423e98a534ed70d7254e44727023903e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc105ef3019d2571b41e4f6ccaeb7dc254e9226367bd9076fe403d1c07b05e59db20000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe50ffec58b9c04949ef5910f1f6a248c136aeb48b69c6f92e58c84d4bf391779ac0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc4f4ecd79da3b21e14f651a8062969d6f3f69ea50245dee2a03318fb5058c6c4960000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff52d43b8f47e68d820ee8b68d3d332432c73be1aab9b3394d393592af8e545fa87e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc72b0fd30a1785da55fe010ec282cec03597a366afb5b2aa67adbb0afb92a83a630000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff7b13b76f78d9567de203227f1fe09ba3e471c86584393d0eeca1ebd066e3a6f3b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffea0712a840628959e9576aecf15c498524bbb56e8f5ec496e505fc317e2a933f220000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9a2491a8aa83c4752b468dc9ca3bcc475b8586c18549f12a706a9cb1780bac74960000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3e25171ac386191d41066e5d8760f839af0a89883106e9894bbfd4b984fbcde81f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff6736d107bde130e24f84c157f5d8967e4080538aa0277ffdc6f1043870bd6c38bd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd7acd128d7c1756753c2a1eeebdf97b5e47ff40a5f83c17df4f801abb42d2308b10000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd84b5b41ca9d3ba5fe7fafaf7efca767b64c36de5714aa11f38f5f220c36c347380000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3548d078005be576bb9b5f8d2fbcdd6fa0c27286a6e522c5d91bd502b4ff3a99d00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd3e15289c42ad461d1791ba1a50fdd5b844c5cd6e7b6f1c6f0c9fe7a372bcec8180000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff917cbe4c538efb0f2348cbe0282edd9b1a67b0feef5944a095971ecbd6eab72fa60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4eaaa576284a09c388574ce550eebfd93c4c6d251cb27ee11c51e55515ebad15f90000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2e3e3b81183132b5643f2a9d483a19741eb58d997b96e7046b6597323725a6db350000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff235d54a505af5e77a3c75893c5e57f928ef3968af59df3fa7d70e0ecc62be0a7050000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4e99d4e158d1d52939c2a0ba3986c8edd46e4571c4c7da41eb63f7243e10f022520000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb973d2616685d733b183cd4ed765b543719305177a5347078414d4cb4feb3466af0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1c6f0f2438d67821dbb5585557be11412ea37e0e6ec895b8de729f8cb459e7218e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff68b4a9f79b204506acd50d9c79bf3c504b6eb51a47f00b2a3b59690d93ff2bc1770000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4acccc270a088eb03bd2c2ebd6b9d37570a896da273dbf1aa7b3d4ba2397563e9f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff124f52ee6b8a5c434b62ffeff07f42207017d66e1ebfc041ef195b7e33657e16a70000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9abca12e1fdca561e4b2632d933c68f0a5d672bad44be66d203a0b826ee35a600f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff834c0cbaf07167439a51be3615f6eede4eb106d5c9d6e920c10368287aa0ddd45e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1bbdc148b5d18ba6fd32bedd6ffa23aa63e67cecd8d31970396d91f9e50cf48c5e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9969cc1ff45869d37ef23ca0c9bbc3785c3fbedbf1804c330487eafd9380de0da40000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffdb01b777bcb2812383c5f2f59eb95c315a6e3759ee5dfc62554e981727f8d3a8140000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbf22d9e4eaf0dbeef0df490c937535bf09d39be26d34007ee35a7000e1137be16f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffca77d7274bd39338de909a99746b716376a599bfb8e894dcab8cc019b83ea4e96e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff6d43cdb90f143f81e0121c3386465d89ccd0d9c6e4f69997f84e3cbbad59ab39b20000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff34851160b061363ea69a2c408a9c249f5297999aea9f74475be06a5542bbc936030000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa9a08f1cbc433fcc1651ffe3c3fc02048dffeb8e454198fb40d5aae89ebe713e360000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff9fde960a912cae0955275cc0e6bd7acc14fc7778111f5846c5b20a61173e8160c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3dd9c6e61ea7d8b720669d521fa93c3eac92f9ca152000b066e2e599257ba135a00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffade6bbdddd7e73edb548b25b85dd2014d743115c132789656385fd11ac71b20180000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff58d2337c847d7c14a83ab53b6267f13a88838b482f8c372401b26f5c63e808b85c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff51d759c2f8a914f888ae67b9eba783ef2fcd5848a48a094ece8d3081fe1310fd590000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8b80b65479565e15862c5d73be3af4f4b0541f4672ad1f14aaea665d38c4d8d85a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffce8a6b9d9bb7fbb3abd518eab3b1790cd46949e45d7b1fd56e9405f0ffd120e12d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffe75a609dae169296b8fd7dd844d2f8bc5b24db0c2ed21ef9057b8af2b422d3bb30000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff6db7b6f7c68468c2680a986b385ac4efa0049914cf018d6878560b2a02caa940c60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffa5de771814369a1025d7cae422d08273b4e86bdcc97f7c9eec22d9b6577e9b9080000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe66a96c77d47f4e9190110f968c3e292b9621973a28afedbd7c417f58de0242f3d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff83487c0ebe945a8914f080d45e226c98a9c07a0f3315d1cc0580be053c8cdd45750000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe39be6805d17388b820fe2d2b29c004c3199b06e75c7acc680af4df0af16b764e50000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc7bfd02e083bbc913286c99806a4605999abade373bb165f9708b71409e902ebb60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff27864946b0965ee2b98fff35b6929c8ca96ed0237ed8410c861d743f5c459c1ab10000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff98935aea579000241d855c51fd2e2e1ce402e035de14e6c94096b70b4db575d7160000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff45b436e28e5e7f2190b1b4f0d3533b2a0cf9d3ed6198a634f8c832ffa4a92185450000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc4faec9d54317455d805e0e25d60d9c7568b241384b1fd451eeb3ed278c18360d70000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", "btcTxInput": 193, "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", diff --git a/firmware/test/resources/610-sign-tx-with-many-inputs.json b/firmware/test/resources/605-1-sign-tx-with-many-inputs-legacy.json similarity index 99% rename from firmware/test/resources/610-sign-tx-with-many-inputs.json rename to firmware/test/resources/605-1-sign-tx-with-many-inputs-legacy.json index 9d7b318c..b77bfa79 100644 --- a/firmware/test/resources/610-sign-tx-with-many-inputs.json +++ b/firmware/test/resources/605-1-sign-tx-with-many-inputs-legacy.json @@ -1,11 +1,13 @@ { - "name": "Sign with a BTC tx with many inputs", + "name": "Sign with a BTC tx with many inputs (legacy TX)", "operation": "signAuthorized", "runOn": "tcpsigner", "expected": true, "fake_ancestor_receipts_root": "ab9080a57266f6bf12656ca540ca59192bfe8e619e3394be1b98027d9923c787", "btcTx": "01000000fc208393eed3f5e4952ee809fb8976dea39994d35f8af16a683df073b7e37acb91300000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffdb5a526cf8e20fb00cfe88ed01041bd49992a6426005fe8a53629f8b154b0fb0a00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3bec19bab0ad389adb52d339350858f6d3ea81d566dfa324d228d2abb4b08abf7d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff96b616b29a71b829d04e0781410304f70b4f931d776eb5db157d3816d7b76a6db60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9bdcd1bd9e53354bcefaaf576a5c9999120300a704e08d6c0b33bb2190fad933610000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff838a64df688e1baf0bcf479f6cde3dd2a577f9f736ad7f0dc96dc016c0274690080000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff866c236c1c98e8a7d63571cd038a90d4f15da63b04113263793ec62fd066aa961f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc466796d245040ac945d7af542caf15a400c2d5b98523aa8fd2ff771524e39d6530000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff001ff1969be15958052e6220409b7a029c89eaa82647b76e29f36c2a7bf158ecaa0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3c46742a75f2f5d9b9a2543126e642f5cdbad20b92e53a6d43fa66f07723f552440000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff20c1613672f0ef9c036094a4992a4d322313756cb50a995470f532c3fbc5f06dd00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff650a2885dce9423544c4357da26fe18bcc88ce0fdcfc01c8a21a2ea5ba218277fd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff60f7d77c55d6f79e0e6949804c76a39487345d6b3ef276e88b9e670925ae8238160000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbbe42315ea341105c82525f00ac05855f925698007e4dbb754b5bcb36322b245250000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff38af7d4a9a3690ef73262b8e22fc500e65ff1251980aea9cdea03d62f540843a650000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd5f1439ce8454383576e9b69b9cf336b74eb188f4402c035e02cc4cd01353d29960000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff22314b7a254e524341eb316d46f3e5873068944bc06d284d8a8898713591847adf0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff896dfcb27e791349f9e06db7da8d8bc1b1680d8833b1e28499de7270bac2566e1e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffdb372b56cd12c68480ee5e59820b3332694b0cac3f3c2b7182b9ffaab9b2327320000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff740c8461bf9b6363582a189b91fa5c3f8138ddaa5a339103bd011591d033bbfb800000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff35db4c8ba2d9bb613a293b4ee3cc08e8500025db4a0fa2f17659317827e987ac6b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9dc5116c995bb6fe84272f8bbadce7a6bf6b693172b992206390a00c7a75e49c1a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffddbf801ed39cecdc9c6cf996800af267b41808892aa977d53b193d64bfb2256f060000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff456f97e065b1753f391ee02c83230a1057245dac74772456f2b56b3418ceb705580000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff13a8f80f436b2aaf316b3ee4f58244427ead812185a94ce6c13d5569004a5985a50000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb5c8f337cee7db201a08ac70699d3719c2ec8e2078f7eed9249ea54ff45ad3540c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff99cd6885a17c488c35d678a1f92a5bcc8fbf9585f2c867c44a14a677b6012d78980000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffec59b4bde6c6e2c595c8134adc0c40511352d26287bf2c1cbd3eb9f2a1b901bffb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8b200973ad2e0e972a717bce05afb64cd86a22f32615b1ab38d1326ac11c7baf030000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe171a0d2bc948086a6320c3238c13520f8e5d855ec679a413a0078b9fb1bc1cbdf0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4df6ec68787280d39f7f39359b9c9612f3d1fe90de3cb9c694227682b328c6ec610000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1d0586fa7fd353a85daf4603bb860ca6ad4c64e7ac9824164a4790507930d3ca7b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbfc42cc9bc57409d7d4bef67780f356099c39a1593927a31cf14c59fafdac03c960000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe2011fe5121c24404ad283e8b8f1a3c67b79e023d27f82dbece3e5afdfeb23984e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff196e09ec1779825794584bdf7c199bd20d300808c3120727ffa9a51bc427f021fb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff6ba1a69b1505784e1c427811cb2b0a35947cfcddd7d1fdc766789e2e78e6d1a3660000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7ce8b8ef8bbedce1a5316427f55802a7adae296b88c23474e589366ef634c7ce770000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7f1a54fa0f655a29f3bf25bde2a9cca21c22430fc15c1b29d81913c4118face3cb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1db0fcf2e89271b01a76ed5ff3cd40fe8107eb7cee9587d055d02976e6411c793e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4d41dc4a74e6077cf458e88e558197f13428c05a0e1daa0c1cedb4155b8cd56d580000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd22dc3dd384c29c78bfaf29b1569b06e0d40e457e4e7df9ad6ed6b5958a32208280000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff5ca7b28fa1960c50a235a6c607fa3c1410da9d257c1aba0c6822012989ea4fb2720000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1ed49ca83c361450e315ae838118647c7b9e84a60d21f4eb45dc33a4b305d2a04a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffda9de78bbc5e2fada30737d3b2205a434c0f76cbd9c67d233dfa5f843d4cbf1b7f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff3c0f8dbd1fc94169494a82aeb9cecb79233fa731aa2c08e420f560138176a397d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1057bad591f1d4a70d0405cac990a410413d0ea21db42290a4f7230103edefe8c60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2a73adac6022bc9d4a71359c2a8d1cd451dd83d87bb6f77c7145be2e4aef1f641d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8b8ff7cded51f82b63a1e5197eaecdaf82a206367d6c210a8c90d46515bca3f4130000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffeb4eb038bd905fa80aa73298f0e49fddc10091ae9389620bbcc6ce2b812d8c891e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff29a703b214c8344a872525f7891017490b6bc9458ec28edfef99c9b1a50279e9fd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff17fac595af95dc63c7462f6237db65afbd6604463e9be05aed9bb9f44b26f34ba0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff736f6a72fff2dbf5884d51865603602075573838fea94ea59e0cd76e3560659dbc0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2c5c164ad75c9fb44e5f9a97dec2a572a0870b4cb663c6f46858386057e03dfb4e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff653eeeca3885c3e817ff24b3f6ad2362a6250ad7dd65195d90e16c55df0e3086440000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffed3a0db1bd0246b7c9c8dd364ed69c090af7376c18c18773c0ea271c8903e19e460000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff479c3c9dd2881a9faa0fcb3a68b8712cc4cbe9aa83eda397747c24aff40c6ee99a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff3d4b6e3ddfa7fbe6cb13ede7ef64a2c5e3b625dea41d5fab6d5c44471c87bff8c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb2a1982f068a6d23f29aee03232089039700406e66f288ef56371a6a39538b98230000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbd97f7b700e6c4f217f2cd0a48fb02b05e9a42357a0fb81b415adea0051ab3ae8d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7dc21621497ea6dd9945ecaa736e0cb63168976b927049512f59bab60b2c7ce5270000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff121c0b5b496ea58e76d0d046b39e35c91b64038fad04634dd3020b1cf795bcd0350000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff057ec13725eff2b2acb6bf365dae44793a8492c465e1500c68ccd16fd8fb90e3510000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4bd56b93479cf637025d2320ab0d66081ccfde7e539550d2ae13211b5b62d6d12e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff0ae0170d070b4ea71d7fa03d6bd46729080a1fd3e8796d94aa40f5815b67ba58710000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffbdeb7a9f470dd5a6357be1f379c1de00dce811e73cd7640410bc13acafcad6ac80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa1dfaa00fb5aa769d37d940de7c385ad896fbb7a5b0af4cc79497dbf94b229be400000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff01f51183c1a3e60dece5a0634252c64c70bf896df3ff847c802aff175fd13d1abe0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7a84b406f84e3109d250237d7b304e26240ca9d6743b437f4e2fd50caeded2c7f30000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbcd044d34a17aaf896e79771d15a1757e94249c40ef6a4bf2c1b27fdeaecc098550000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff12c15ad37d90ae705fe5eca57fe71b99f1ee08045505418067152b0abae9d5ae340000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff5fb3e4109340eaba35353f53547930785c182e9aaf12cfbeb3f0b84d03bc9828dd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff27dad98494ace9d31d66b43becdeb0c396163219a7c50ef19d7eeba684fcf2733e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbf07ca17e2ba3aa2ec9141d1445d6ccb97ed0c4b3c324c8b28875f03c1511cbe210000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff5aea78368739a0a99f857e5bd5c67c9d15fdbcab20c969efc88ba16fbb59ecb0470000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff06eb17c61530b9e3de4229da3d1cc547764fa1ac8cf8daebcafb464c32a75c061d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa2140ce19132cf7568ed66a5a5d350beba936d8ef721ab5cacd9da48b99fd589040000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8d8ae25e2a9d51a963590c6a150370dcfd21c6192d01263c9cbc2a26bbbef50f3c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7da660dfd104f937379df3f91b3247dd6a1e7350c9b4e97ae31860fb4b2e50124e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffdc949413250fc8d658faab45657294ea5e17e6847068d5507f079439886f4377050000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffddff8fd77acf3e36c9a17e77438c2f5dd24cdd979d00d0cd6f24b81b52d429c8550000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff093eea44d3c6ec664086b486554f5d9522ec793a6e23de8023e43cdc8e5437e1a10000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff399cb648d0f1694b739c85e4a07d1669e99a13b895ad36771197c8820c5e85df8b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff7f58cfe7ccd2e7c1ee7c2949e420676946c98b0131fbc70701a1d833084de6ccd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc2c42c7c0cf0c0e4bc36e3bd82d462c199300980c53d41985ed51323a1fcf86c2a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff34fda05b7bafb0552d3c799afbc8aa1b7df48fece6ada860239551ea13dd8e6a5f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa0e7b50a187982a5e9cba03d66dbc11da899133a7886d5340fd3beedd9020c777a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3131971adc42849302cf6b5be0389b6d6d6455801dc14d0fe8435ce87ba0cd2c0f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff62be83b2e045735ec20553c098461810e6b377bdf985f4e96a79358f0add9000130000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8f8049bea641d8c7c5aba8d89f92068c1cd8ee0b2239191e958e1ff2164bce73db0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffddb7c635dbb40c34f604f59f560b329eaadeed0f6d5d34cbf6721d8c68a5cc0eea0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3aede035a47c0f3923907bf4e4d8ecc5fbb9287451b25c42fe6f1adf134f37b2610000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1b0480c8356857bf411b4c35efad3590f836f884671fac09fc34791e8f37b2f85f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc6a4ae2abcac03e78a6d3f3fe4d07c6e75e2e344064434c161085a7388be4caa270000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbc01556be797cee3e8e6a853e982a0394310731c7956a97dd3ea5f71692bc3caee0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9ac04670b00019b03de7cf83c8de383331e700138fa9d455c46317f2c7fd307d170000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc94a3ca138dc2c7c9b5ea6c668ab6267b406e4646090428cc583c6347bfeb63ef80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbffc8f36f7033f3b8f1f6961d29c3ccbff789b4f6906c3f899f97ab39e2cc379a80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff15b58d5689af77e10425f2233b8c7862533340115cd12dc5ca8be3819f049862950000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff40695075ec0801bab187809ae2e4f4f05fef896ef4812dc6fa4884a15c58a5aa270000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb8a4fac59edcff10f95f85d8cb3bd08cbc5e6b3a32d89404c57be162d12fdcf83e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffabfda27b2402c3cdd9ced27c1ad817f7b9d66e5fe4bda3a730076cd1b390b62fcd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffdba1b98014583c1910127ca0b2bebc866c182e7cbd625e057fec48993ae3a15f50000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe6c07631157d0a59de4f709f851cdf011ffc791e97458b979c47e803b17c8ac6120000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa33560970083ead4a1b4811637d0214821d273f76689063e70e5cdad445619f02a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa6cb6b5fa8e7e16a17a939a589ba56509968b0a4a0a524edca1ff5f87135a485ce0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff10c18592edfa0527921870c43d6c370184c8d736bf8f257a3a26af640ff0c70f00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7c95becdfe24c0056b283539c9512d9b59ab4abef612719af64257fcd6f59ff19d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe05fb119dadb6b81b8767f90b29c5cbc1c9b37df7eb8635fe594f76a9df1b7bc7b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4aa7ce52246e6ca1b666a04e2f169bb9ce7c4fee96f0791e1a8e41019079aa90640000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff21e8dac66a09014c42dc6c266529600ed2ab2dccecaa690c54adfa970a3751c1ba0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa0831ab9fa3d2280dd94e560baec4e9907516120c7369f56ecfbb61c0c4a9d471f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff5e875a75162a6f06c2218d0abb277d23960b405990d27bff155bb1027595556a230000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9dfc50f70c5c8d258e56570dc733db059352c95623d05ec5f77b6abaaf5b1187340000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffad8b8d49010eadd905bcbf59d230631b8765a14cd446207515483a36ecdf69d8510000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff937375a0ade6fe025dc44b396cc677dc95a99c338c0a5a7d2e10cbf3bfaa6bf0400000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2cc3f50dcc03f09710caebf7b40a9eca8ead0244e985a935149d5d3bf92313a55e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff0d1bfda37d4880a1a7ace585032e15baa213695ea80c4e0da1bce4cd3d3708ef880000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff766fe1d4c5d50e67483550a292f5613dbbd87873f1b348a41a4591a13f006174e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe41089062699c802bc7d1f1ee7a7edece087712b2c4d96195df1bd1c1b96e22f600000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe95821ec6aba3bb2bc2bbb05fbdcf5938c45151474378e284c0da71a4f42598eb40000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc8de2b8165f3d6452e554f210c3feee78752f6458a7cc8e686c50409b09ba0868d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff658979574f78b48840529d0c2f724fdc5d468874d3f2d7b42efb06d51be79ac8580000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff87386d3df36046fce4fbb1761623957ae37bcc9a3c12e5783827114e0e15d9ae750000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1b93848666086943a90ed8c967a00d02a79518e217937446492d875cc4ead94a570000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff066539257aa490471a6c92cb88d76e3a2ce44da361c3a02ea394b4427f72d187bb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff35fecb7b00b46107feaee3c7431ea0f4d9a3bfae636a002b24f0c7981b9867b2b90000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa609c79b9cbbd4a229dd68c3a360d496641d0919cd16844523e2779eb16a002daf0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff11ddd213375e285b5e0ec3f122c222a5f6044ec48b91f1b5129c83b10abbbc33230000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff73a4e7b67d767ce5fbb7ffff25b7aa8483cc30d3dfd891c3df468ea42ec5a397ca0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd72d23504dd108821a7c6c5f87be28d93dab7fdc6f73736d4543fb6e3af6d2b5ab0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1e7bae5194b0ad5eff39e3102c8e27087f6a28aa21f3b5f54c851123a94ad080500000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa6c895b0a5814030aed7c533dd64186b13706e35edfb4b753e564b6e25c901d84e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff732a838db68e72ea526a3341d74156a36434a062c736be243da3d5321f05365de80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff7044be9391252383eba2d3686b152860c841bc794e32f2d09ae1008f73c411abb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff86343b3ea233c734e288cacd24fb16e284f41c4a2840005edb0f7616453f90bdcd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa1673b717368f55044cbf7aa905c9e94bee6189d90fccfeaabe344ee8e8cea35d60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff64c6711bc20592a7d4d11a3834c2eada42e9c4130021a9a605741fd78187543c890000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff04440deb058de4cf02aaedea0df9fb51111afecd302b51c79fe5ece595c1efbac80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff4888a894b93e63c3f322a4b1cf767e2168f745cfa688a120e0e9ab5b8815718b60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffcf5afa912658236776d2c0c0a5ab5c1bd36b6e45ec7fbb6790d015393c507af74c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa9251b1e5918f1dc5e41a113f44740045d056ecb38840bcad2b696a3aab5400d200000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff46c0ff4f35db23c80747afa0d0347170f95c82a5f58992fca5201db8f6b39c0b060000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff56e8d4d6b0903a742ab7e629570388c2cc57b49ec8bcef9891dbea2ee583393ef80000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffb602c59d9e49411395df5a1036baaccbbc6a9c99ebeb94d1cd3c3fcbaab0f2be30000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff011df19242e8394e8e0f59e722dd6e5001e9d7d6a7bcb0afa5a4a45839c1a5092f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa2c3fcb925ac5b1a6f3969db050d37fca5bd1f14cac21711efc8b0349628993e900000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff55296d17f30d6b0f5bb8ded480fba5bc3cec9b0d7aab7d58a924d297bba47cbf6a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc1372c52f283db9be8bfc7e0c4a676b60acf7aaf108de882c37452ea9889f47a6d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2667fdb89d372cae0b1a732b999dadf4360eefebebeaf5eec18bb6aad91bbc3d8e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3eafc1cc4c6a1f472a0ffd2eb14bb39e839f7822c83f9f60eca70367ab4126d6410000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff0b60c29a454b56d100bca2f067401786a14ff1b61115477a1356e1732814c364980000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc943b46f31be09eae4ec7379eae7c2cef2b0e431dbb32fcca7d70d4044894952b50000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff25a3307443653a547c7e9c5c917bc8c10135e083c5e90b887550922a94fadae0ba0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa075b8b1a76eb6ac9f790f012cd7a1b3eb10bee63fd9a45eac8bed012231c4d0e60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff666c31c166baf98d1004aac77b6e7738b24a9cce6fd8a9fb25835e172c3c2bb9ec0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff330bdc880a3907b41e2604ea4d0edc098912fe160ff79a5a5e4ef6f7e84bbef4110000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa143a820c2a986105fe0056b11ac272f738248fd452bc979ab1e05ac7cbcdb26800000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff09133953681a83e6f3a1d7add885b2ecd4f6fe07aa81077e0397a62cf580f6d3e70000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7d631e6eb195c1c9ddaa905d047a0700c95e2943f6756c23b5597e28dd7a172ecd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff89ee6813e36ea1f17985c7bf474a0f1a26179f1c1eb2df9e6ad44a8e22dc6388140000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff769e39ae93cd03f91da1e9cb59be9bf388394093900d7eec5a32d59859d0401f880000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff70cec86733e88836b3f8cacb80b77ebc42dfd20c3186146ebd10ab5ecf19c978580000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1ebd4a8fa281fc7a7f9f1101f40fa2466c186845640ec7da27184908d43ed6ca660000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff450e1e903149f8af45c366c8a5a8920de1b9bc28c6f4362d3d959a60e5bd5331d20000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4c5551d18e239587f9c4a0ffa515277c26550beea8a3ad21b1b3c4bd68f93be64c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff98fd89a096ee7d8febae4754f8eaaabc94d506f1a16e28d3d257a15125364638fb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff705616163ab8db57d2d8fc321c12021facb1a0b9b8293780e1e2854d116f4c6b920000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1f50ee861556453ed783244d4baed5d53186124aef77f48f6442199039662ddb890000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd7ec31327e91053b58397ffdd19687466a0f860261a7de2dd4150ade69fb16462b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3fc4af9492022016d044e77bf12caac4248e1dca7b5c3a1d0a326d6e79617013bd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7a15115f4eb2c7ca210b49d84a6491ec05ee9522fd49efdeea6b291a4d227d2cb90000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8568a729013377a77f394f63e360f7b68c7ae05fe3ecb0b251b0c18a50a42add830000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff77a0ac19aa26fca7e41dc9503d693d4272f7a99da1f18cc42e4610fa30c02073b20000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb9d2a85be9b5719db843aeee052c0c4a42bbda7029cb9c14be9f048a0f8cd657ce0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9a45c65122d733d7414d6da55660b573965022b8c805fb2de18e089dee64c541690000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe3150e7c9285ebab6f2fb38a6b4230bb4a29a166f27e4799820c2ba80a37502a600000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2668542ddbd3eb274f0942dd08355037c4e86cc63f59d31fb8bc691acf31b91f5e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7243209b521af3c507936a23a790f14a607b04cf4139743506c087cce1b48cceed0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff0b6e7adc897c76239cfa3fde80ebc16af3beb7115708654e3d68b758aa51385d810000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe2b7b21c7c14b76fcbf2b89bab64f57bb82a1cbcb73e2cbfde7fdf1991c66ea9c40000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe76bd641d6bbcda5e29a9880476b82dd1f5ab032712faea0e68bc471a930ffa1b40000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff34a9b23e5d925c69b71c8389bb96ddb7f6475de49138371a22c28808588c7f9b70000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff0ed81d34e4fc687428608e594d00aa4494d59d355e3a0e5d681030ab5e0c750f900000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa9ecca8db8de629150aa73a7c12185540944acc0fc8074c7814780cd5cabace6450000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa1562da4f71ad7e41f1292193cf0c0b243f064bbc42ae0986ea42cebd0d5a36bd90000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb9002847e3cd484a5d834a9d664ab88a2a6532088393d3a2a65c33387d8b985d390000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3431c0425294130ef249fb3bbc596b566b28d45276b8120d0d2893de3477f7bb110000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3fb87db0e818689642abeefb072c4e13c87cd6fda97fbc83600ccec766a624d7e00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff80109b5dea29ca9e215ebaa99929363c09da6f9fbc7277c34dcb27d0c933b8fa8a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8064c913a942915da588d99c2092d879701e0794438bd3b9e36e93566ac1d710fb0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc58fcb1c1ddd6dd38a824585bf092a78fb00ab3d5c7198108973c2a78c9a29ab3e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffa24f6316ff87defa5149e203cb545ba79371f04c2a153c2518061b378a72f53400000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff999131d946bcfaacf1b0a24d669a25cb671628795bb4d4db664f3bf7222a76d0090000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff7c131083a77ac9085f98ff77ae758d25e00eecf1b7fed38fcc45eebd0e0a09d1a60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4d781feff1859672d0f80feac9e895d993caf874f9bf2d62362486c6342bcf84a70000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb1d25a7fe98f2f4c9d81f9a35beaf00b43bead9cda052024a91e422f2ed792055f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff06da95d2b9b2224dcfc4f587c8f2fe696e5e1b1247074ca9bcf20fbdd159a2b5ee0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffeabb91e256e87701fea35640b71802e926ed2ae617145d4a611acb77d19027b0560000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc7c14e744714e5b754c7b672fb65129b5b7c1ed6fc12c2d4d1204a4cfb3e6555b30000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffba88cf31bfe8ee6cf07925cf39c6af02bc423e98a534ed70d7254e44727023903e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc105ef3019d2571b41e4f6ccaeb7dc254e9226367bd9076fe403d1c07b05e59db20000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe50ffec58b9c04949ef5910f1f6a248c136aeb48b69c6f92e58c84d4bf391779ac0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc4f4ecd79da3b21e14f651a8062969d6f3f69ea50245dee2a03318fb5058c6c4960000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff52d43b8f47e68d820ee8b68d3d332432c73be1aab9b3394d393592af8e545fa87e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc72b0fd30a1785da55fe010ec282cec03597a366afb5b2aa67adbb0afb92a83a630000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff7b13b76f78d9567de203227f1fe09ba3e471c86584393d0eeca1ebd066e3a6f3b0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffea0712a840628959e9576aecf15c498524bbb56e8f5ec496e505fc317e2a933f220000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9a2491a8aa83c4752b468dc9ca3bcc475b8586c18549f12a706a9cb1780bac74960000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3e25171ac386191d41066e5d8760f839af0a89883106e9894bbfd4b984fbcde81f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff6736d107bde130e24f84c157f5d8967e4080538aa0277ffdc6f1043870bd6c38bd0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd7acd128d7c1756753c2a1eeebdf97b5e47ff40a5f83c17df4f801abb42d2308b10000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd84b5b41ca9d3ba5fe7fafaf7efca767b64c36de5714aa11f38f5f220c36c347380000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3548d078005be576bb9b5f8d2fbcdd6fa0c27286a6e522c5d91bd502b4ff3a99d00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffd3e15289c42ad461d1791ba1a50fdd5b844c5cd6e7b6f1c6f0c9fe7a372bcec8180000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff917cbe4c538efb0f2348cbe0282edd9b1a67b0feef5944a095971ecbd6eab72fa60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4eaaa576284a09c388574ce550eebfd93c4c6d251cb27ee11c51e55515ebad15f90000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff2e3e3b81183132b5643f2a9d483a19741eb58d997b96e7046b6597323725a6db350000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff235d54a505af5e77a3c75893c5e57f928ef3968af59df3fa7d70e0ecc62be0a7050000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4e99d4e158d1d52939c2a0ba3986c8edd46e4571c4c7da41eb63f7243e10f022520000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffb973d2616685d733b183cd4ed765b543719305177a5347078414d4cb4feb3466af0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1c6f0f2438d67821dbb5585557be11412ea37e0e6ec895b8de729f8cb459e7218e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff68b4a9f79b204506acd50d9c79bf3c504b6eb51a47f00b2a3b59690d93ff2bc1770000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff4acccc270a088eb03bd2c2ebd6b9d37570a896da273dbf1aa7b3d4ba2397563e9f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff124f52ee6b8a5c434b62ffeff07f42207017d66e1ebfc041ef195b7e33657e16a70000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9abca12e1fdca561e4b2632d933c68f0a5d672bad44be66d203a0b826ee35a600f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff834c0cbaf07167439a51be3615f6eede4eb106d5c9d6e920c10368287aa0ddd45e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff1bbdc148b5d18ba6fd32bedd6ffa23aa63e67cecd8d31970396d91f9e50cf48c5e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff9969cc1ff45869d37ef23ca0c9bbc3785c3fbedbf1804c330487eafd9380de0da40000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffdb01b777bcb2812383c5f2f59eb95c315a6e3759ee5dfc62554e981727f8d3a8140000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffbf22d9e4eaf0dbeef0df490c937535bf09d39be26d34007ee35a7000e1137be16f0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffca77d7274bd39338de909a99746b716376a599bfb8e894dcab8cc019b83ea4e96e0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff6d43cdb90f143f81e0121c3386465d89ccd0d9c6e4f69997f84e3cbbad59ab39b20000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff34851160b061363ea69a2c408a9c249f5297999aea9f74475be06a5542bbc936030000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffa9a08f1cbc433fcc1651ffe3c3fc02048dffeb8e454198fb40d5aae89ebe713e360000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffff9fde960a912cae0955275cc0e6bd7acc14fc7778111f5846c5b20a61173e8160c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff3dd9c6e61ea7d8b720669d521fa93c3eac92f9ca152000b066e2e599257ba135a00000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffade6bbdddd7e73edb548b25b85dd2014d743115c132789656385fd11ac71b20180000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff58d2337c847d7c14a83ab53b6267f13a88838b482f8c372401b26f5c63e808b85c0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff51d759c2f8a914f888ae67b9eba783ef2fcd5848a48a094ece8d3081fe1310fd590000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff8b80b65479565e15862c5d73be3af4f4b0541f4672ad1f14aaea665d38c4d8d85a0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffce8a6b9d9bb7fbb3abd518eab3b1790cd46949e45d7b1fd56e9405f0ffd120e12d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffe75a609dae169296b8fd7dd844d2f8bc5b24db0c2ed21ef9057b8af2b422d3bb30000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff6db7b6f7c68468c2680a986b385ac4efa0049914cf018d6878560b2a02caa940c60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aefffffffffa5de771814369a1025d7cae422d08273b4e86bdcc97f7c9eec22d9b6577e9b9080000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe66a96c77d47f4e9190110f968c3e292b9621973a28afedbd7c417f58de0242f3d0000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff83487c0ebe945a8914f080d45e226c98a9c07a0f3315d1cc0580be053c8cdd45750000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffe39be6805d17388b820fe2d2b29c004c3199b06e75c7acc680af4df0af16b764e50000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc7bfd02e083bbc913286c99806a4605999abade373bb165f9708b71409e902ebb60000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff27864946b0965ee2b98fff35b6929c8ca96ed0237ed8410c861d743f5c459c1ab10000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff98935aea579000241d855c51fd2e2e1ce402e035de14e6c94096b70b4db575d7160000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff45b436e28e5e7f2190b1b4f0d3533b2a0cf9d3ed6198a634f8c832ffa4a92185450000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffffc4faec9d54317455d805e0e25d60d9c7568b241384b1fd451eeb3ed278c18360d70000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", "btcTxInput": 99, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a06e89da110fbfc4ecfa7aa3d966cdc244ba34d926ea92abbf36537af42841280ca00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "700600a666a917c9289ff5b5164517a262c44d9802239b9aac84e8de503a8f0bf79a99000203", diff --git a/firmware/test/resources/606-0-sign-match-not-last-log.json b/firmware/test/resources/606-0-sign-match-not-last-log.json new file mode 100644 index 00000000..f555d8b0 --- /dev/null +++ b/firmware/test/resources/606-0-sign-match-not-last-log.json @@ -0,0 +1,16 @@ +{ + "name": "Sign when the matching log is not the last one", + "operation": "signAuthorized", + "runOn": "tcpsigner", + "expected": true, + "fake_ancestor_receipts_root": "a93d7d63e4aca5078674490f6a1f1554fc5a6576bfce77368cad5eab989ebd9d", + "btcTx": "020000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e01000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "btcTxInput": 0, + "witnessScript": "56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae", + "outpointValue": 876543210, + "receipt": "f9029e0180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f90194f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a068f9b590f2ad38258e28c1a479193a9c4fec7bdbbd076059f6c8daaf4ab4ef9da00000000000000000000000000000000000000000000000000000000011e1a300f89b94aaaa000000000000000000000000000001000006f863a0bbbb29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dddda0cccc1941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1aa008001", + "receiptMp": [ + "700600d4c2471fabec1b8598a0f16ceeec5bf08c7f55fe391082271a783fdbeb8e0f9e000203", + "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b00038826700600d4c2471fabec1b8598a0f16ceeec5bf08c7f55fe391082271a783fdbeb8e0f9e000203fdd705" + ] +} diff --git a/firmware/test/resources/614-sign-match-not-last-log.json b/firmware/test/resources/606-1-sign-match-not-last-log-legacy.json similarity index 94% rename from firmware/test/resources/614-sign-match-not-last-log.json rename to firmware/test/resources/606-1-sign-match-not-last-log-legacy.json index f967cc65..c55cd069 100644 --- a/firmware/test/resources/614-sign-match-not-last-log.json +++ b/firmware/test/resources/606-1-sign-match-not-last-log-legacy.json @@ -1,11 +1,13 @@ { - "name": "Sign when the matching log is not the last one", + "name": "Sign when the matching log is not the last one (legacy TX)", "operation": "signAuthorized", "runOn": "tcpsigner", "expected": true, "fake_ancestor_receipts_root": "dbab9d8e87550d4a3ccb496b25326403b1d339e487e342bf43469c622d693ca1", "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f9029e0180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f90194f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a300f89b94aaaa000000000000000000000000000001000006f863a0bbbb29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dddda0cccc1941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1aa008001", "receiptMp": [ "70060024d30ccbd0544a8c4818a07262041b032821271be3728c45b84ee6b1a297231d000203", diff --git a/firmware/test/resources/610-0-sign-sample-mainnet-tx-i0.json b/firmware/test/resources/610-0-sign-sample-mainnet-tx-i0.json new file mode 100644 index 00000000..f5bec980 --- /dev/null +++ b/firmware/test/resources/610-0-sign-sample-mainnet-tx-i0.json @@ -0,0 +1,18 @@ +{ + "name": "Sign with a sample mainnet BTC tx input 0 (6734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336d)", + "operation": "signAuthorized", + "runOn": "tcpsigner", + "expected": true, + "fake_ancestor_receipts_root": "c71ae772a07033fd00fd14fdbb800b25b163ac5de345ee5dc13674960924a5de", + "btcTx": "02000000022b83f595914eeea1a2639406e0511551da33cc81000465e3231494f88de43e6701000000232200200fca68baeb0517ceaf99d1d61947d142c29fbba23b6c173d18b034992df2e1c2ffffffffae85ea8dd5282d56f2ddfbb5273a26b294b1c011987fdcedc317b4e0ea901ca901000000232200200fca68baeb0517ceaf99d1d61947d142c29fbba23b6c173d18b034992df2e1c2ffffffff02b80b600b000000001976a9140c903ab1a49ef647d224ac1e12add69e527d949d88acb812a69c3100000017a914cb24588cf67c2126c63fa55bedd02dff319626c68700000000", + "btcTxInput": 0, + "witnessScript": "6455210274c7a2c584eb9dbc3d78fede48d1258b974cd537d82fce4d18f0e85604774e652102daa3cd74c9d06bc7928e1214f0de4ee5744c694975d70e160f562c5e1c4f587d2102f0844d9c1df50f5597118659badf40ea6956903f405f6a604402c8014d926fd42103250c11be0561b1d7ae168b1f59e39cbc1fd1ba3cf4d2140c1a365b2723a2bf93210328f0386fe2b2840a424d3a5073be89a4cb643c434752b8c865e867611d0041832103b8faf3ebcf3fe89085fe8c6046dd9cece45bb56e466103f96b4fca2f21072ded2103e59ed1ba1240ac6ff0cb9234afc0e44d6e7653219982d4f1eb55844395e934962103e8f68168606392c5e17f2f9bf1fd3fa55c295cad3990e72e7e3e4470ed644c8f2103f45016871f91a1d81984280b9abd1aad6987e1a73a51e0ae8c920b7b238d62cb59ae670350cd00b275532102370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec80210257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d42103c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f92103cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b354ae68", + "outpointValue": 97981458, + "receipt": "f9038101830241e5b9010000000000000000000000000000000808000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000080000000000000000000000000000000000000000000004000800000000000200000000000000000000000000000000800000000000000000000000200000000000000000000000000000000010000000000000000000000080000000000000000000000000400000000000000000000000002000000004000000000000000000800000000000000000000000001000000000000000000000000000000000000000000000000800000100000000000000080000000010000000000f90271f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea00000000000000000000000008a1f3ab76ba96f60aaa12f884f801222b422b80ff89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a00bb3331e864b90c81b0136c739ad2793b8ee10d0954c7d88f823ecbb59f43616a06734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336da0000000000000000000000000000000000000000000000000000000000b601fe8f8bb940000000000000000000000000000000001000006f842a09ee5d520fd5e6eaea3fd2e3ae4e35e9a9c0fb05c9d8f84b507f287da84b5117ca06734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336db8600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000efe1214d705ff8e1e2fa231000000000000000000000000000000000000000000f8bb940000000000000000000000000000000001000006f842a0483d0191cc4e784b04a41f6c4801a0766b43b1fdd0b9e3e6bfdca74e5b05c2eba06734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336db860000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000201e98bd636c37e5e0f8d689c214d11590c9043f00b788febe374a1ddcd53e2c9d83010dd001", + "receiptMp": [ + "60de0e5cdc9eaa8d9c1fd746ecbcbae62af3d0ce9c4d0d41ac8c62a872b8c002c5000384", + "4f2460de0e5cdc9eaa8d9c1fd746ecbcbae62af3d0ce9c4d0d41ac8c62a872b8c002c50003842460f29859724e61545de18b3d72a24c57f1700a85924df3754e272ab4b584701678000323fdef06", + "5e0400267000801cbfe00cd1e7167090a51585475fb51a14b2dda6630d8ccc0125bf8289eeef0600011002c9e50d69e2ed69f259e682e6fc6151f57e8b26c636697858cec72d605efb9cfd7308", + "4d17ad6ea04454732082461098e1c4b925cc5f566fbf4885764396376262ba6a4426700600510edde2b7c2450972e812bbbfa33fc12c38580f0f990aa73a1ca221c4da4adf00010ffdf509" + ] +} diff --git a/firmware/test/resources/610-1-sign-sample-mainnet-tx-i1.json b/firmware/test/resources/610-1-sign-sample-mainnet-tx-i1.json new file mode 100644 index 00000000..3a2ca9d7 --- /dev/null +++ b/firmware/test/resources/610-1-sign-sample-mainnet-tx-i1.json @@ -0,0 +1,18 @@ +{ + "name": "Sign with a sample mainnet BTC tx input 1 (6734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336d)", + "operation": "signAuthorized", + "runOn": "tcpsigner", + "expected": true, + "fake_ancestor_receipts_root": "c71ae772a07033fd00fd14fdbb800b25b163ac5de345ee5dc13674960924a5de", + "btcTx": "02000000022b83f595914eeea1a2639406e0511551da33cc81000465e3231494f88de43e6701000000232200200fca68baeb0517ceaf99d1d61947d142c29fbba23b6c173d18b034992df2e1c2ffffffffae85ea8dd5282d56f2ddfbb5273a26b294b1c011987fdcedc317b4e0ea901ca901000000232200200fca68baeb0517ceaf99d1d61947d142c29fbba23b6c173d18b034992df2e1c2ffffffff02b80b600b000000001976a9140c903ab1a49ef647d224ac1e12add69e527d949d88acb812a69c3100000017a914cb24588cf67c2126c63fa55bedd02dff319626c68700000000", + "btcTxInput": 1, + "witnessScript": "6455210274c7a2c584eb9dbc3d78fede48d1258b974cd537d82fce4d18f0e85604774e652102daa3cd74c9d06bc7928e1214f0de4ee5744c694975d70e160f562c5e1c4f587d2102f0844d9c1df50f5597118659badf40ea6956903f405f6a604402c8014d926fd42103250c11be0561b1d7ae168b1f59e39cbc1fd1ba3cf4d2140c1a365b2723a2bf93210328f0386fe2b2840a424d3a5073be89a4cb643c434752b8c865e867611d0041832103b8faf3ebcf3fe89085fe8c6046dd9cece45bb56e466103f96b4fca2f21072ded2103e59ed1ba1240ac6ff0cb9234afc0e44d6e7653219982d4f1eb55844395e934962103e8f68168606392c5e17f2f9bf1fd3fa55c295cad3990e72e7e3e4470ed644c8f2103f45016871f91a1d81984280b9abd1aad6987e1a73a51e0ae8c920b7b238d62cb59ae670350cd00b275532102370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec80210257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d42103c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f92103cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b354ae68", + "outpointValue": 213174394510, + "receipt": "f9038101830241e5b9010000000000000000000000000000000808000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000080000000000000000000000000000000000000000000004000800000000000200000000000000000000000000000000800000000000000000000000200000000000000000000000000000000010000000000000000000000080000000000000000000000000400000000000000000000000002000000004000000000000000000800000000000000000000000001000000000000000000000000000000000000000000000000800000100000000000000080000000010000000000f90271f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea00000000000000000000000008a1f3ab76ba96f60aaa12f884f801222b422b80ff89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a00bb3331e864b90c81b0136c739ad2793b8ee10d0954c7d88f823ecbb59f43616a06734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336da0000000000000000000000000000000000000000000000000000000000b601fe8f8bb940000000000000000000000000000000001000006f842a09ee5d520fd5e6eaea3fd2e3ae4e35e9a9c0fb05c9d8f84b507f287da84b5117ca06734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336db8600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000efe1214d705ff8e1e2fa231000000000000000000000000000000000000000000f8bb940000000000000000000000000000000001000006f842a0483d0191cc4e784b04a41f6c4801a0766b43b1fdd0b9e3e6bfdca74e5b05c2eba06734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336db860000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000201e98bd636c37e5e0f8d689c214d11590c9043f00b788febe374a1ddcd53e2c9d83010dd001", + "receiptMp": [ + "60de0e5cdc9eaa8d9c1fd746ecbcbae62af3d0ce9c4d0d41ac8c62a872b8c002c5000384", + "4f2460de0e5cdc9eaa8d9c1fd746ecbcbae62af3d0ce9c4d0d41ac8c62a872b8c002c50003842460f29859724e61545de18b3d72a24c57f1700a85924df3754e272ab4b584701678000323fdef06", + "5e0400267000801cbfe00cd1e7167090a51585475fb51a14b2dda6630d8ccc0125bf8289eeef0600011002c9e50d69e2ed69f259e682e6fc6151f57e8b26c636697858cec72d605efb9cfd7308", + "4d17ad6ea04454732082461098e1c4b925cc5f566fbf4885764396376262ba6a4426700600510edde2b7c2450972e812bbbfa33fc12c38580f0f990aa73a1ca221c4da4adf00010ffdf509" + ] +} diff --git a/firmware/test/resources/612-sign-sample-mainnet-tx.json b/firmware/test/resources/610-2-sign-sample-mainnet-tx-legacy.json similarity index 96% rename from firmware/test/resources/612-sign-sample-mainnet-tx.json rename to firmware/test/resources/610-2-sign-sample-mainnet-tx-legacy.json index 2edf6fd7..ef35a97f 100644 --- a/firmware/test/resources/612-sign-sample-mainnet-tx.json +++ b/firmware/test/resources/610-2-sign-sample-mainnet-tx-legacy.json @@ -1,11 +1,13 @@ { - "name": "Sign with a sample mainnet BTC tx (49b52b570d7b3fb5428fb90da0b03fa48712569353291b86c8627515300c6eb7)", + "name": "Sign with a sample mainnet BTC tx (49b52b570d7b3fb5428fb90da0b03fa48712569353291b86c8627515300c6eb7) (legacy TX)", "operation": "signAuthorized", "runOn": "tcpsigner", "expected": true, "fake_ancestor_receipts_root": "b0c9d5840ff55a2c06c3969e4d5ac05f39c2fb2f8867b1b934af4896b5bc0348", "btcTx": "0200000001c36068f22ad1285b0e8c75547e634a7df21d7bf3e23788b8942e3ad14bd7ab8a01000000fdc80100000000000000004dbd0157210231a395e332dde8688800a0025cccc5771ea1aa874a633b8ab6e5c89d300c7c3621026b472f7d59d201ff1f540f111b6eb329e071c30a9d23e3d2bcd128fe73dc254c21027319afb15481dbeb3c426bcc37f9a30e7f51ceff586936d85548d9395bcc2344210294c817150f78607566e961b3c71df53a22022a80acbb982f83c0c8baac040adc2103250c11be0561b1d7ae168b1f59e39cbc1fd1ba3cf4d2140c1a365b2723a2bf9321033ada6ef3b1d93a1978b595c7a9e2aa613860b26d4f5a7abb88576aa42b3432ad210357f7ed4c118e581f49cd3b4d9dd1edb4295f4def49d6dcf2faaaaac87a1a0a42210372cd46831f3b6afd4c044d160b7667e8ebf659d6cb51a825a3104df6ee0638c62103ae72827d25030818c4947a800187b1fbcc33ae751e248ae60094cc989fb880f62103b3a7aa25702000c5c1faa300600e8e2bd89cde2be7fb1ec898a39c50d9de90d12103b53899c390573471ba30e5054f78376c5f797fda26dde7a760789f02908cbad22103e05bf6002b62651378b1954820539c36ca405cbb778c225395dd9ebff67802992103ecd8af1e93c57a1b8c7f917bd9980af798adeb0205e9687865673353eb041e8d5daeffffffff02bb57eb0b000000001976a9147e8784d8b1e299d8f55c9977fbfa9c1821eb472188ace274a04c0000000017a914596cff92a275960df9cb2ab9df0ff69faa2b1d8a8700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0fc99d4242e88a0a5c3224c2edfd0a5134d9d9994c289359f9611673b6d60fe04a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "70060012ad32877a15a35716ddfa2d1fc51942b3f6edf747a58c39a2aebd185b9618f1000203", diff --git a/firmware/test/resources/613-sign-sample-testnet-tx-erp.json b/firmware/test/resources/611-1-sign-sample-testnet-tx-erp-legacy.json similarity index 95% rename from firmware/test/resources/613-sign-sample-testnet-tx-erp.json rename to firmware/test/resources/611-1-sign-sample-testnet-tx-erp-legacy.json index 3784f8b7..4a8109a3 100644 --- a/firmware/test/resources/613-sign-sample-testnet-tx-erp.json +++ b/firmware/test/resources/611-1-sign-sample-testnet-tx-erp-legacy.json @@ -1,11 +1,13 @@ { - "name": "Sign with a sample ERP testnet BTC tx (ef48d91ca32d694c36826c74a21191e6528f11f6beaa10bc8dc0c51de38f930c)", + "name": "Sign with a sample ERP testnet BTC tx (ef48d91ca32d694c36826c74a21191e6528f11f6beaa10bc8dc0c51de38f930c) (legacy TX)", "operation": "signAuthorized", "runOn": "tcpsigner", "expected": true, "fake_ancestor_receipts_root": "fa0cfbb9525f7b3a5a78fec0b5c4acb7c50eb13583affbb7c80290cffa09101b", "btcTx": "020000000101724031bd8b47b66d05158a1aa8f737aee95bfdbad0592270198f38cd68c2ff01000000de000000004cd8645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368ae3c00000001e0930400000000001976a9140a4f09cbd39d5d8072b24385e1a9eb1c84ae544688ac00000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0263ccc8721ae6da8b9a08401286b973b53bf0bbbe74fd5c8e3a930f6888571d9a00000000000000000000000000000000000000000000000000000000011e1a3008001", "receiptMp": [ "700600d2ccc12c09a1940a456e89c05a471f4e49d3517aacbf03006107e5e584e0d8b3000203", diff --git a/firmware/test/resources/616-sign-3input-5output-testnet.json b/firmware/test/resources/612-1-sign-3input-5output-testnet-legacy.json similarity index 97% rename from firmware/test/resources/616-sign-3input-5output-testnet.json rename to firmware/test/resources/612-1-sign-3input-5output-testnet-legacy.json index f840f9d2..a8161d86 100644 --- a/firmware/test/resources/616-sign-3input-5output-testnet.json +++ b/firmware/test/resources/612-1-sign-3input-5output-testnet-legacy.json @@ -1,11 +1,13 @@ { - "name": "Sign a 3-input, 5-output testnet transaction", + "name": "Sign a 3-input, 5-output testnet transaction (legacy TX)", "operation": "signAuthorized", "runOn": "tcpsigner", "expected": true, "fake_ancestor_receipts_root": "736a36d733f0faff88dbd36332e773a82e8e5ce9829a34b4d5750c91d641fc74", "btcTx": "020000000396f1ed3e9075af583e8e1e2b50bd5e37c761f677418db75a295901380864d95e01000000fd270100000000004d1f016453210225e892391625854128c5c4ea4340de0c2a70570f33db53426fc9c746597a03f421025a2f522aea776fab5241ad72f7f05918e8606676461cb6ce38265a52d4ca9ed62102afc230c2d355b1a577682b07bc2646041b5d0177af0f98395a46018da699b6da21032822626c45fc1c4e3a3def5b4983636d6291a7a6677f66874c337e78bc3b77842103fb8e1d5d0392d35ca8c3656acb6193dbf392b3e89b9b7b86693f5c80f7ce858155ae670350cd00b27552210216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3210275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f1421034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f53ae68ffffffff375b0696785b04a56b6a9f3f84a0fc3715837f7a2ab427f220ef2932b64a93ae01000000fd270100000000004d1f016453210225e892391625854128c5c4ea4340de0c2a70570f33db53426fc9c746597a03f421025a2f522aea776fab5241ad72f7f05918e8606676461cb6ce38265a52d4ca9ed62102afc230c2d355b1a577682b07bc2646041b5d0177af0f98395a46018da699b6da21032822626c45fc1c4e3a3def5b4983636d6291a7a6677f66874c337e78bc3b77842103fb8e1d5d0392d35ca8c3656acb6193dbf392b3e89b9b7b86693f5c80f7ce858155ae670350cd00b27552210216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3210275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f1421034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f53ae68ffffffff8797d86f4653e0c778e54f527d4d9bd2b1b57715d0a0ae4dd7918ab7b468a2b002000000fd270100000000004d1f016453210225e892391625854128c5c4ea4340de0c2a70570f33db53426fc9c746597a03f421025a2f522aea776fab5241ad72f7f05918e8606676461cb6ce38265a52d4ca9ed62102afc230c2d355b1a577682b07bc2646041b5d0177af0f98395a46018da699b6da21032822626c45fc1c4e3a3def5b4983636d6291a7a6677f66874c337e78bc3b77842103fb8e1d5d0392d35ca8c3656acb6193dbf392b3e89b9b7b86693f5c80f7ce858155ae670350cd00b27552210216c23b2ea8e4f11c3f9e22711addb1d16a93964796913830856b568cc3ea21d3210275562901dd8faae20de0a4166362a4f82188db77dbed4ca887422ea1ec185f1421034db69f2112f4fb1bb6141bf6e2bd6631f0484d0bd95b16767902c9fe219d4a6f53ae68ffffffff05bbed0600000000001976a9148394379a5ab5974f2bd6368ce479e28fca91631e88acbbed0600000000001976a91409197f6153cb3a91bb51eec373360a1cb3b7c0e088acbbed0600000000001976a91409197f6153cb3a91bb51eec373360a1cb3b7c0e088acbbed0600000000001976a91409197f6153cb3a91bb51eec373360a1cb3b7c0e088ac061e5f000000000017a9145e6cf80958803e9b3c81cd90422152520d2a505c8700000000", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "f9032501830254c4b901000000000000002000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000008000000000000000000000000000000000000000000000400080000000000020000000000040000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000008000000000000000000000000040000000000000000000000000a000000004000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000100000000000000000000000010000000000f90215f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000092c94ae16eefc9202bb8bcaf1f6b0c8702fb56eef89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a08f5d32a9921e1d5f67a033b18135322d7eafa6a4cd471712d20ed89075971c7ba06a2c2fd9250bfc1a5b568a251a1561dbe948ef2fc7709a0f7c711edf6fd19125a000000000000000000000000000000000000000000000000000000000001e8480f9011b940000000000000000000000000000000001000006f842a0483d0191cc4e784b04a41f6c4801a0766b43b1fdd0b9e3e6bfdca74e5b05c2eba06a2c2fd9250bfc1a5b568a251a1561dbe948ef2fc7709a0f7c711edf6fd19125b8c0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000808c583df808142a02b3dcaf0295d5e67ed9f169e486ae727325388f81a8f3f9f751b9c673d7c35349da0cdfb5ec4f581cae82341f6ef195fc095f52d45f987d3c845bcbfba5640d5e6f7b4744805a25e378488a4be05e6d15ed7d0030afd2a9f0b92e5cc1064269c5979b586d78bd0fedf7dac6d7bdbf2d83c740528512b7453883010ea001", "receiptMp": [ "6080985a995eddd3cd09639f7fbd7d72695071b0ee73c7f48e277ffdece72b9bf5000328", diff --git a/firmware/test/resources/617-get-after-success-sign.json b/firmware/test/resources/620-get-after-success-sign.json similarity index 100% rename from firmware/test/resources/617-get-after-success-sign.json rename to firmware/test/resources/620-get-after-success-sign.json diff --git a/firmware/test/resources/700-device-fake-receipt-root-fails.json b/firmware/test/resources/700-device-fake-receipt-root-fails.json index 9468c439..8c913c64 100644 --- a/firmware/test/resources/700-device-fake-receipt-root-fails.json +++ b/firmware/test/resources/700-device-fake-receipt-root-fails.json @@ -6,6 +6,8 @@ "fake_ancestor_receipts_root": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "btcTx": "", "btcTxInput": 0, + "witnessScript": "", + "outpointValue": 0, "receipt": "", "receiptMp": [] } diff --git a/firmware/test/resources/900-larger-than-apdu-command-fails-tcpsigner.json b/firmware/test/resources/900-2-larger-than-apdu-command-fails-tcpsigner.json similarity index 100% rename from firmware/test/resources/900-larger-than-apdu-command-fails-tcpsigner.json rename to firmware/test/resources/900-2-larger-than-apdu-command-fails-tcpsigner.json diff --git a/firmware/test/resources/912-no-onboard-sign-auth-fails.json b/firmware/test/resources/912-no-onboard-sign-auth-fails.json index d873f34d..f2974246 100644 --- a/firmware/test/resources/912-no-onboard-sign-auth-fails.json +++ b/firmware/test/resources/912-no-onboard-sign-auth-fails.json @@ -2,12 +2,16 @@ "name": "Non-onboarded sign authorized fails", "operation": "signAuthorized", "expected": "0x6bee", - "btcTx": "01000000010c25db7dc67a51c2aa406514373c83a87b25cb313f530fbfa5210007fa65e1f0000000006e0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02b011e111000000001976a91447a5bfd415108c37e918e8b114b83f8d5ae9834988ac00bbeea00000000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000", + "btcTx": "02000000022b83f595914eeea1a2639406e0511551da33cc81000465e3231494f88de43e6701000000232200200fca68baeb0517ceaf99d1d61947d142c29fbba23b6c173d18b034992df2e1c2ffffffffae85ea8dd5282d56f2ddfbb5273a26b294b1c011987fdcedc317b4e0ea901ca901000000232200200fca68baeb0517ceaf99d1d61947d142c29fbba23b6c173d18b034992df2e1c2ffffffff02b80b600b000000001976a9140c903ab1a49ef647d224ac1e12add69e527d949d88acb812a69c3100000017a914cb24588cf67c2126c63fa55bedd02dff319626c68700000000", "btcTxInput": 0, - "receipt": "f902000180b9010000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000004000000000000000200000000000000000800000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0f8281941928796ae6927a8f22abcbe38e7f80edaef66333ffe2f383e29d64b16a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "witnessScript": "6455210274c7a2c584eb9dbc3d78fede48d1258b974cd537d82fce4d18f0e85604774e652102daa3cd74c9d06bc7928e1214f0de4ee5744c694975d70e160f562c5e1c4f587d2102f0844d9c1df50f5597118659badf40ea6956903f405f6a604402c8014d926fd42103250c11be0561b1d7ae168b1f59e39cbc1fd1ba3cf4d2140c1a365b2723a2bf93210328f0386fe2b2840a424d3a5073be89a4cb643c434752b8c865e867611d0041832103b8faf3ebcf3fe89085fe8c6046dd9cece45bb56e466103f96b4fca2f21072ded2103e59ed1ba1240ac6ff0cb9234afc0e44d6e7653219982d4f1eb55844395e934962103e8f68168606392c5e17f2f9bf1fd3fa55c295cad3990e72e7e3e4470ed644c8f2103f45016871f91a1d81984280b9abd1aad6987e1a73a51e0ae8c920b7b238d62cb59ae670350cd00b275532102370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec80210257c293086c4d4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d42103c2660a46aa73078ee6016dee953488566426cf55fc8011edd0085634d75395f92103cd3e383ec6e12719a6c69515e5559bcbe037d0aa24c187e1e26ce932e22ad7b354ae68", + "outpointValue": 97981458, + "receipt": "f9038101830241e5b9010000000000000000000000000000000808000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000080000000000000000000000000000000000000000000004000800000000000200000000000000000000000000000000800000000000000000000000200000000000000000000000000000000010000000000000000000000080000000000000000000000000400000000000000000000000002000000004000000000000000000800000000000000000000000001000000000000000000000000000000000000000000000000800000100000000000000080000000010000000000f90271f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b43e515ea00000000000000000000000008a1f3ab76ba96f60aaa12f884f801222b422b80ff89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc790a00bb3331e864b90c81b0136c739ad2793b8ee10d0954c7d88f823ecbb59f43616a06734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336da0000000000000000000000000000000000000000000000000000000000b601fe8f8bb940000000000000000000000000000000001000006f842a09ee5d520fd5e6eaea3fd2e3ae4e35e9a9c0fb05c9d8f84b507f287da84b5117ca06734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336db8600000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000efe1214d705ff8e1e2fa231000000000000000000000000000000000000000000f8bb940000000000000000000000000000000001000006f842a0483d0191cc4e784b04a41f6c4801a0766b43b1fdd0b9e3e6bfdca74e5b05c2eba06734e647fc6b240430ab18784199eaa261ddbf89b61bc2cda3b6cd5a0875336db860000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000201e98bd636c37e5e0f8d689c214d11590c9043f00b788febe374a1ddcd53e2c9d83010dd001", "receiptMp": [ - "7006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203", - "4f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd479dcd598cfa151b000388267006002c05a0d7d85908466fdd3e6896af6c88a588701d4aa19769600875a7aa9a64a0000203fdd705" + "60de0e5cdc9eaa8d9c1fd746ecbcbae62af3d0ce9c4d0d41ac8c62a872b8c002c5000384", + "4f2460de0e5cdc9eaa8d9c1fd746ecbcbae62af3d0ce9c4d0d41ac8c62a872b8c002c50003842460f29859724e61545de18b3d72a24c57f1700a85924df3754e272ab4b584701678000323fdef06", + "5e0400267000801cbfe00cd1e7167090a51585475fb51a14b2dda6630d8ccc0125bf8289eeef0600011002c9e50d69e2ed69f259e682e6fc6151f57e8b26c636697858cec72d605efb9cfd7308", + "4d17ad6ea04454732082461098e1c4b925cc5f566fbf4885764396376262ba6a4426700600510edde2b7c2450972e812bbbfa33fc12c38580f0f990aa73a1ca221c4da4adf00010ffdf509" ], "runOn": "tcpsigner" } From 2da5a58b8165347eb2fc61a5afe22b9224aaf9c5 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 24 Dec 2025 14:29:00 +0700 Subject: [PATCH 04/14] Updated middleware unit tests after legacy signing logic removal --- middleware/tests/comm/test_bitcoin.py | 218 ++++----- middleware/tests/comm/test_protocol.py | 237 ++-------- ...segwit.py => test_hsm2dongle_sign_auth.py} | 31 +- .../test_hsm2dongle_sign_auth_legacy.py | 277 ------------ middleware/tests/ledger/test_hsm2dongle.py | 3 +- middleware/tests/ledger/test_protocol.py | 423 +----------------- 6 files changed, 141 insertions(+), 1048 deletions(-) rename middleware/tests/ledger/hsm2dongle_cmds/{test_hsm2dongle_sign_auth_segwit.py => test_hsm2dongle_sign_auth.py} (85%) delete mode 100644 middleware/tests/ledger/hsm2dongle_cmds/test_hsm2dongle_sign_auth_legacy.py diff --git a/middleware/tests/comm/test_bitcoin.py b/middleware/tests/comm/test_bitcoin.py index 31d99fc3..a894a964 100644 --- a/middleware/tests/comm/test_bitcoin.py +++ b/middleware/tests/comm/test_bitcoin.py @@ -22,20 +22,61 @@ from unittest import TestCase from comm.bitcoin import ( - get_tx_hash_for_unsigned_tx, get_signature_hash_for_p2sh_input, + get_signature_hash_for_p2sh_p2wsh_input, get_block_hash_as_int, get_merkle_root, - get_unsigned_tx, - get_tx_hash, - get_tx_version, ) import logging logging.disable(logging.CRITICAL) -SAMPLE_1_UNSIGNED = """ +# Taken from https://en.bitcoin.it/wiki/BIP_0143#P2SH-P2WSH +SAMPLE_1 = """ +010000000136641869ca081e70f394c6948e8af409e18b619df2ed74aa106c1ca29787b96e010000 +0000ffffffff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688 +acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000 +""".replace("\n", "").replace("\r", "") + +SAMPLE_1_SIGHASH_I0 = "185c0be5263dce5b4bb50a047973c1b6272bfbd0103a89444597dc40b248ee7c" + +SAMPLE_1_WITNESS_SCRIPT = """ +56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae +""".replace("\n", "").replace("\r", "") +SAMPLE_1_I0_OUTVAL = 987654321 + +SAMPLE_2 = """ +02000000018fd94eaa9b2c5baf1356826d549741ea53d7063e830e9907cf86cdd4fe46c278010000 +00232200200fca68baeb0517ceaf99d1d61947d142c29fbba23b6c173d18b034992df2e1c2ffffff +ff07fc240900000000001976a914ac3df06ee0d2596ed38f23722335f4c01ecdc40288ac9c028547 +000000001976a91473179e1c334c7b9c393f3a31d6e9c1896bf480cd88ac5c3d2c00000000001976 +a91487b7bfba7a7703864dec1a1aeb0536d4c09120d488ac256c0800000000001976a91435ad11a2 +ac31cfbc01426351c8ba4c333f90296088ac1c302900000000001976a91487b7bfba7a7703864dec +1a1aeb0536d4c09120d488ac347f8f05000000001976a914f4ef22351609132290bf20f8bca034c6 +ee101f5888acaedb7dc63100000017a914cb24588cf67c2126c63fa55bedd02dff319626c6870000 +0000 +""".replace("\n", "").replace("\r", "") + +SAMPLE_2_SIGHASH_I0 = "a93253994b04069f720b116fc1ba161839a67b00cccc9af52e2fa76569e27da2" + +SAMPLE_2_WITNESS_SCRIPT = """ +6455210274c7a2c584eb9dbc3d78fede48d1258b974cd537d82fce4d18f0e85604774e652102daa3 +cd74c9d06bc7928e1214f0de4ee5744c694975d70e160f562c5e1c4f587d2102f0844d9c1df50f55 +97118659badf40ea6956903f405f6a604402c8014d926fd42103250c11be0561b1d7ae168b1f59e3 +9cbc1fd1ba3cf4d2140c1a365b2723a2bf93210328f0386fe2b2840a424d3a5073be89a4cb643c43 +4752b8c865e867611d0041832103b8faf3ebcf3fe89085fe8c6046dd9cece45bb56e466103f96b4f +ca2f21072ded2103e59ed1ba1240ac6ff0cb9234afc0e44d6e7653219982d4f1eb55844395e93496 +2103e8f68168606392c5e17f2f9bf1fd3fa55c295cad3990e72e7e3e4470ed644c8f2103f4501687 +1f91a1d81984280b9abd1aad6987e1a73a51e0ae8c920b7b238d62cb59ae670350cd00b275532102 +370a9838e4d15708ad14a104ee5606b36caaaaf739d833e67770ce9fd9b3ec80210257c293086c4d +4fe8943deda5f890a37d11bebd140e220faa76258a41d077b4d42103c2660a46aa73078ee6016dee +953488566426cf55fc8011edd0085634d75395f92103cd3e383ec6e12719a6c69515e5559bcbe037 +d0aa24c187e1e26ce932e22ad7b354ae68 +""".replace("\n", "").replace("\r", "") +SAMPLE_2_I0_OUTVAL = 215083478191 + +SAMPLE_3 = """ 010000000187ace6cb83436c876dd2233dfadf537068ecb1b9a0000d3590c9072d46d2bf4c000000006e0 000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362 634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a65423 @@ -44,25 +85,9 @@ f0b6ef81b2bde55140e8700000000 """.replace("\n", "").replace("\r", "") -SAMPLE_1_PARTIALLY_SIGNED = """ -010000000187ace6cb83436c876dd2233dfadf537068ecb1b9a0000d3590c9072d46d2bf4c00000000b60 -048304502210084ddb5c7c6b57405c4068fa6634c8dd736d53ebf1ea878ad962026eecb86b57502206988 -e345a0af65ca5a72418580896028cdd1834404fe97774234725e494a18f101004c69522102cd53fc53a07 -f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a -8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b1 -32b8ca630f245df04db53aeffffffff02b030eb0b000000001976a914f6b794549667efd57f083e018c1a -4726c73ccb4388ac00301a1e0100000017a914896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000 -000 -""".replace("\n", "").replace("\r", "") - -SAMPLE_1_PARTIALLY_SIGNED_HASH = ( - "e9ceb9260f258f13a029ad212f08719d8656b564cf4108b86199d83969de7c2e") -SAMPLE_1_UNSIGNED_HASH = ( - "f7e2b314eb12bd13481c5325ae3839fdbe5c508dbc7e24a44aac5e9992d07718") -SAMPLE_1_SIGHASH_INPUT0 = ( - "db4ca3f81a68996e7c51e7e138524a53ab9770410f628199dc6ab5a5bac73e5c") +SAMPLE_3_SIGHASH_I0 = "db4ca3f81a68996e7c51e7e138524a53ab9770410f628199dc6ab5a5bac73e5c" -SAMPLE_2_UNSIGNED = """ +SAMPLE_4 = """ 01000000025cc070156cd1487db3c0c0d22affe09f208950bbe1bd6d2bc4a7c65749cee0c1000000006e000000 4c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae 9cb373a5d536e66a8c4f67468bbcfb063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0 @@ -74,130 +99,51 @@ b5510f7f0b6ef81b2bde55140e8700000000 """.replace("\n", "").replace("\r", "") -SAMPLE_2_PARTIALLY_SIGNED = """ -01000000025cc070156cd1487db3c0c0d22affe09f208950bbe1bd6d2bc4a7c65749cee0c100000000b5004730 -4402203743f5bc4632b46fa261de4bdeaa1b3d617bd9dcaaf9fb3f9272c95c7f7b8b11022055464b2dae639037 -b42b3bc559bcf7580a7aa3e421c1511a6419ae7338029cc601004c69522102cd53fc53a07f211641a677d250f6 -de99caf620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809ba -b643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffff -ffffbe6be3ddaf27e9609c9b319db9c97eae36e88dcda760ff4e0b77ccd086c7f4c600000000b5004730440220 -046b94168f1181a81ac8b4d7543b6392743d81a5b0c494db95be12ce2d9ba91002201dc5ad6c9f7b6171678a78 -a910fbd59150d8f86ef39f3244a82761cbf87670c801004c69522102cd53fc53a07f211641a677d250f6de99ca -f620e8e77071e811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb063809bab64307 -2d78a1242103c5946b3fbae03a654237da863c9ed534e0878657175b132b8ca630f245df04db53aeffffffff02 -1044d871020000001976a914f6b794549667efd57f083e018c1a4726c73ccb4388ac008d380c0100000017a914 -896ed9f3446d51b5510f7f0b6ef81b2bde55140e8700000000 -""".replace("\n", "").replace("\r", "") - -SAMPLE_2_PARTIALLY_SIGNED_HASH = ( - "39ae0553e91565866acc81a61da52cd87702ed2b4632f52bba19e3d9ba7e46ce") -SAMPLE_2_UNSIGNED_HASH = ( - "f8318d6c071efd988411cd63ee7d3fbf736d5ed38ba0679fa0be7acddb1bddda") -SAMPLE_2_SIGHASH_INPUT0 = ( - "ef95325f9c819476a54097abe466374f8293f26637af3686833d73dc29be2093") -SAMPLE_2_SIGHASH_INPUT1 = ( - "20d8b8e413868c08e987ae11c7280b95293c05f0e191ef847a6060593b759814") +SAMPLE_4_SIGHASH_I0 = "ef95325f9c819476a54097abe466374f8293f26637af3686833d73dc29be2093" +SAMPLE_4_SIGHASH_I1 = "20d8b8e413868c08e987ae11c7280b95293c05f0e191ef847a6060593b759814" -SAMPLE_3_UNSIGNED = """ -0100000001ec7281cfc9e59db5c1e69fc294846572bd3d78091bd0c6fdc21c2209c500556a000000004b000000 -475221031da807c71c2f303b7f409dd2605b297ac494a563be3b9ca5f52d95a43d183cc521036bb9eab797eadc -8b697f0e82a01d01cabbfaaca37e5bafc06fdc6fdd38af894a52aeffffffff01b01c661b0c0000001976a914f7 -ee4511563688dce9b5d74e07cc9932b8e01f2288ac00000000 -""".replace("\n", "").replace("\r", "") - -SAMPLE_3_UNSIGNED_HASH = ( - "ea73e8a9a6b98da8ba3f47d28f94af6818c8e906937a95f302263920b4cda792") -SAMPLE_3_SIGHASH_INPUT0 = ( - "5aeb5a6bbecda560b297da643559ce3c1b727076fb2ba1118c94d5906617aa19") - -SAMPLE_TX_V2 = """ -02000000010ac6236167ee3c88aee00f0f3b89f92b43a84797a71b6b62ffd354f11ef8c2f000000000de000000 -004cd8645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa494 -3fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d -09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff9 -16f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008 -eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368aeffffffff0294 -8e4b00000000001976a9140a4f09cbd39d5d8072b24385e1a9eb1c84ae544688acf83d6e0b0000000017a914ba -053351893c7495e0c75d5abacb3ed886cf1ff88700000000 +SAMPLE_5 = """ +01000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f030000 +00220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0dcb54ffffffff +fd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200f +bed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffffff0200e9a435 +000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976 +a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000 """.replace("\n", "").replace("\r", "") class TestBitcoin(TestCase): - def test_signed_unsigned_different_sample1(self): - self.assertNotEqual(SAMPLE_1_UNSIGNED, SAMPLE_1_PARTIALLY_SIGNED) - - def test_get_tx_hash_for_unsigned_sample1(self): - self.assertEqual(SAMPLE_1_UNSIGNED_HASH, - get_tx_hash_for_unsigned_tx(SAMPLE_1_UNSIGNED)) - - def test_get_tx_hash_sample1(self): - self.assertEqual(SAMPLE_1_UNSIGNED_HASH, get_tx_hash(SAMPLE_1_UNSIGNED)) - - def test_get_tx_hash_sample1_signed(self): - self.assertEqual(SAMPLE_1_PARTIALLY_SIGNED_HASH, - get_tx_hash(SAMPLE_1_PARTIALLY_SIGNED)) - - def test_get_tx_for_unsigned_hash_partially_signed_sample1(self): - self.assertEqual(SAMPLE_1_UNSIGNED_HASH, - get_tx_hash_for_unsigned_tx(SAMPLE_1_PARTIALLY_SIGNED)) - - def test_get_sighash_unsigned_sample1(self): + def test_get_sig_hash_sample_1_i0(self): self.assertEqual( - SAMPLE_1_SIGHASH_INPUT0, - get_signature_hash_for_p2sh_input(SAMPLE_1_UNSIGNED, 0), - ) + SAMPLE_1_SIGHASH_I0, + get_signature_hash_for_p2sh_p2wsh_input( + SAMPLE_1, 0, SAMPLE_1_WITNESS_SCRIPT, SAMPLE_1_I0_OUTVAL)) - def test_get_sighash_partially_signed_sample1(self): + def test_get_sig_hash_sample_2_i0(self): self.assertEqual( - SAMPLE_1_SIGHASH_INPUT0, - get_signature_hash_for_p2sh_input(SAMPLE_1_PARTIALLY_SIGNED, 0), - ) - - def test_get_unsigned_sample1(self): - self.assertEqual(SAMPLE_1_UNSIGNED, get_unsigned_tx(SAMPLE_1_PARTIALLY_SIGNED)) - - def test_get_unsigned_sample2(self): - self.assertEqual(SAMPLE_2_UNSIGNED, get_unsigned_tx(SAMPLE_2_PARTIALLY_SIGNED)) - - def test_signed_unsigned_different_sample2(self): - self.assertNotEqual(SAMPLE_2_UNSIGNED, SAMPLE_2_PARTIALLY_SIGNED) - - def test_get_tx_hash_sample2(self): - self.assertEqual(SAMPLE_2_UNSIGNED_HASH, get_tx_hash(SAMPLE_2_UNSIGNED)) - - def test_get_tx_hash_sample2_signed(self): - self.assertEqual(SAMPLE_2_PARTIALLY_SIGNED_HASH, - get_tx_hash(SAMPLE_2_PARTIALLY_SIGNED)) + SAMPLE_2_SIGHASH_I0, + get_signature_hash_for_p2sh_p2wsh_input( + SAMPLE_2, 0, SAMPLE_2_WITNESS_SCRIPT, SAMPLE_2_I0_OUTVAL)) - def test_get_tx_hash_for_unsigned_sample2(self): - self.assertEqual(SAMPLE_2_UNSIGNED_HASH, - get_tx_hash_for_unsigned_tx(SAMPLE_2_UNSIGNED)) - - def test_get_tx_hash_for_unsigned_partially_signed_sample2(self): - self.assertEqual(SAMPLE_2_UNSIGNED_HASH, - get_tx_hash_for_unsigned_tx(SAMPLE_2_PARTIALLY_SIGNED)) - - def test_get_sighash_unsigned_sample2_input0(self): + def test_get_sig_hash_sample_3_i0(self): self.assertEqual( - SAMPLE_2_SIGHASH_INPUT0, - get_signature_hash_for_p2sh_input(SAMPLE_2_UNSIGNED, 0), - ) + SAMPLE_3_SIGHASH_I0, + get_signature_hash_for_p2sh_input(SAMPLE_3, 0)) - def test_get_sighash_unsigned_sample2_input1(self): + def test_get_sig_hash_sample_4_i0(self): self.assertEqual( - SAMPLE_2_SIGHASH_INPUT1, - get_signature_hash_for_p2sh_input(SAMPLE_2_UNSIGNED, 1), - ) - - def test_get_tx_hash_not_signed_sample3(self): - self.assertEqual(SAMPLE_3_UNSIGNED_HASH, - get_tx_hash_for_unsigned_tx(SAMPLE_3_UNSIGNED)) + SAMPLE_4_SIGHASH_I0, + get_signature_hash_for_p2sh_input(SAMPLE_4, 0)) - def test_get_sighash_unsigned_sample3_input0(self): + def test_get_sig_hash_sample_4_i1(self): self.assertEqual( - SAMPLE_3_SIGHASH_INPUT0, - get_signature_hash_for_p2sh_input(SAMPLE_3_UNSIGNED, 0), - ) + SAMPLE_4_SIGHASH_I1, + get_signature_hash_for_p2sh_input(SAMPLE_4, 1)) + + def test_get_sig_hash_sample_5_i0(self): + with self.assertRaises(ValueError) as err: + get_signature_hash_for_p2sh_input(SAMPLE_5, 0) + self.assertIn("Invalid redeem script", str(err.exception)) # Taken from https://www.blockchain.com/btc/block/624147 # Raw taken from first 80 bytes of https://blockchain.info/block/624147?format=hex @@ -260,9 +206,3 @@ def test_get_merkle_root_sample2(self): def test_get_merkle_root_malformed(self): with self.assertRaises(ValueError): get_merkle_root("aabbcc") - - def test_get_tx_version_a(self): - self.assertEqual(1, get_tx_version(SAMPLE_1_UNSIGNED)) - - def test_get_tx_version_b(self): - self.assertEqual(2, get_tx_version(SAMPLE_TX_V2)) diff --git a/middleware/tests/comm/test_protocol.py b/middleware/tests/comm/test_protocol.py index 79dbf2ba..3f88c469 100644 --- a/middleware/tests/comm/test_protocol.py +++ b/middleware/tests/comm/test_protocol.py @@ -94,6 +94,22 @@ def test_version_3_not_supported(self): {"errorcode": -903}, ) + def test_version_4_not_supported(self): + self.assertEqual( + self.protocol.handle_request({ + "command": "whatever", + "version": 4 + }), + {"errorcode": -904}, + ) + self.assertEqual( + self.protocol.handle_request({ + "command": "whatever", + "version": 5 + }), + {"errorcode": -903}, + ) + def test_invalid_command(self): self.assertEqual( self.protocol.handle_request({ @@ -392,73 +408,7 @@ def test_sign_message_presence_type(self): {"errorcode": -102}, ) - def test_sign_legacy_message_value(self): - self.assertEqual( - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "aabbcc", - "receipt_merkle_proof": ["aa"] - }, - "message": { - "any": "thing" - }, - }), - {"errorcode": -102}, - ) - - self.assertEqual( - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "aabbcc", - "receipt_merkle_proof": ["aa"] - }, - "message": { - "sighashComputationMode": "legacy" - }, - }), - {"errorcode": -102}, - ) - - self.assertEqual( - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "aabbcc", - "receipt_merkle_proof": ["aa"] - }, - "message": { - "sighashComputationMode": "legacy", - "tx": "001122" - }, - }), - {"errorcode": -102}, - ) - - self.assertEqual( - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "aabbcc", - "receipt_merkle_proof": ["aa"] - }, - "message": { - "sighashComputationMode": "legacy", - "input": 123 - }, - }), - {"errorcode": -102}, - ) - + def test_sign_message_value(self): self.assertEqual( self.protocol.handle_request({ "version": 5, @@ -468,10 +418,7 @@ def test_sign_legacy_message_value(self): "receipt": "aabbcc", "receipt_merkle_proof": ["aa"] }, - "message": { - "tx": "001122", - "input": 123 - }, + "message": {} }), {"errorcode": -102}, ) @@ -486,96 +433,6 @@ def test_sign_legacy_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "legacy", - "tx": "001122", - "input": "not-an-input" - }, - }), - {"errorcode": -102}, - ) - - self.assertEqual( - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "aabbcc", - "receipt_merkle_proof": ["aa"] - }, - "message": { - "sighashComputationMode": "legacy", - "tx": "", - "input": 123 - }, - }), - {"errorcode": -102}, - ) - - self.assertEqual( - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "aabbcc", - "receipt_merkle_proof": ["aa"] - }, - "message": { - "sighashComputationMode": "legacy", - "tx": "not-a-hex", - "input": 123 - }, - }), - {"errorcode": -102}, - ) - - self.assertEqual( - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "aabbcc", - "receipt_merkle_proof": ["aa"] - }, - "message": { - "sighashComputationMode": "somethingelse", - "tx": "001122", - "input": 123 - }, - }), - {"errorcode": -102}, - ) - - def test_sign_segwit_message_value(self): - self.assertEqual( - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "aabbcc", - "receipt_merkle_proof": ["aa"] - }, - "message": { - "sighashComputationMode": "segwit" - }, - }), - {"errorcode": -102}, - ) - - self.assertEqual( - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "aabbcc", - "receipt_merkle_proof": ["aa"] - }, - "message": { - "sighashComputationMode": "segwit", "tx": "001122", "witnessScript": "33445566", "outpointValue": 123000 @@ -594,7 +451,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "input": 123, "witnessScript": "33445566", "outpointValue": 123000 @@ -613,7 +469,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "tx": "001122", "input": 123, "outpointValue": 123000 @@ -632,7 +487,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "tx": "001122", "input": 123, "witnessScript": "33445566", @@ -653,8 +507,6 @@ def test_sign_segwit_message_value(self): "message": { "tx": "001122", "input": 123, - "witnessScript": "33445566", - "outpointValue": 123000 }, }), {"errorcode": -102}, @@ -670,7 +522,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "tx": "001122", "input": "not-an-input", "witnessScript": "33445566", @@ -690,7 +541,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "tx": "", "input": 123, "witnessScript": "33445566", @@ -710,7 +560,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "tx": "not-a-hex", "input": 123, "witnessScript": "33445566", @@ -730,7 +579,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "tx": "001122", "input": 123, "witnessScript": "not-a-hex", @@ -750,7 +598,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "tx": "001122", "input": 123, "witnessScript": "33445566", @@ -770,7 +617,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "tx": "001122", "input": 123, "witnessScript": "33445566", @@ -790,7 +636,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "tx": "001122", "input": 123, "witnessScript": "33445566", @@ -810,7 +655,6 @@ def test_sign_segwit_message_value(self): "receipt_merkle_proof": ["aa"] }, "message": { - "sighashComputationMode": "segwit", "tx": "001122", "input": 123, "witnessScript": "33445566", @@ -821,7 +665,6 @@ def test_sign_segwit_message_value(self): ) def test_sign_hash_message_value(self): - self.assertEqual( self.protocol.handle_request({ "version": 5, @@ -889,43 +732,38 @@ def test_sign_hash_message_value(self): def test_sign_notimplemented(self): with self.assertRaises(NotImplementedError): self.protocol.handle_request({ - "command": "sign", "version": 5, + "command": "sign", "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "ddeeff", - "receipt_merkle_proof": ["aa"] - }, "message": { - "sighashComputationMode": "legacy", - "tx": "001122", - "input": 123 + "hash": "bb"*32 }, }) with self.assertRaises(NotImplementedError): self.protocol.handle_request({ - "command": "sign", "version": 5, + "command": "sign", "keyId": "m/0/0/0/0/0", - "auth": { - "receipt": "ddeeff", - "receipt_merkle_proof": ["aa"] - }, "message": { - "hash": "bb"*32 + "tx": "001122", + "input": 123, + "witnessScript": "3344556677", + "outpointValue": 123000, }, }) with self.assertRaises(NotImplementedError): self.protocol.handle_request({ - "version": 5, "command": "sign", + "version": 5, "keyId": "m/0/0/0/0/0", "message": { - "sighashComputationMode": "legacy", - "tx": "001122", - "input": 123 + "hash": "bb"*32 + }, + "auth": { + "receipt": "ddeeff", + "receipt_merkle_proof": ["aa"] }, }) @@ -935,21 +773,14 @@ def test_sign_notimplemented(self): "command": "sign", "keyId": "m/0/0/0/0/0", "message": { - "sighashComputationMode": "segwit", "tx": "001122", "input": 123, "witnessScript": "3344556677", "outpointValue": 123000, }, - }) - - with self.assertRaises(NotImplementedError): - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/0/0/0/0/0", - "message": { - "hash": "bb"*32 + "auth": { + "receipt": "ddeeff", + "receipt_merkle_proof": ["aa"] }, }) diff --git a/middleware/tests/ledger/hsm2dongle_cmds/test_hsm2dongle_sign_auth_segwit.py b/middleware/tests/ledger/hsm2dongle_cmds/test_hsm2dongle_sign_auth.py similarity index 85% rename from middleware/tests/ledger/hsm2dongle_cmds/test_hsm2dongle_sign_auth_segwit.py rename to middleware/tests/ledger/hsm2dongle_cmds/test_hsm2dongle_sign_auth.py index 254eca61..2f06e80d 100644 --- a/middleware/tests/ledger/hsm2dongle_cmds/test_hsm2dongle_sign_auth_segwit.py +++ b/middleware/tests/ledger/hsm2dongle_cmds/test_hsm2dongle_sign_auth.py @@ -23,10 +23,7 @@ from unittest.mock import Mock, patch, call from parameterized import parameterized from tests.ledger.test_hsm2dongle import TestHSM2DongleBase, HSM2DongleTestMode -from ledger.hsm2dongle import ( - HSM2DongleError, - SighashComputationMode, -) +from ledger.hsm2dongle import HSM2DongleError from ledgerblue.commException import CommException import logging @@ -34,15 +31,15 @@ logging.disable(logging.CRITICAL) -class TestHSM2DongleSignAuthorizedSegwit(TestHSM2DongleBase): +class TestHSM2DongleSignAuthorized(TestHSM2DongleBase): def setUp(self): super().setUp() - self.SEGWIT_SPEC = { + self.SPEC = { "exchanges": [ "q-path >02 01 11223344 D2040000", - "a-tx0 <02 02 0C", - "q-tx0 >02 02 0F000000 01 0E00 AABBCCDDEE", + "a-tx0 <02 02 0B", + "q-tx0 >02 02 0E000000 0E00 AABBCCDDEE", "a-tx1 <02 02 03", "q-tx1 >02 02 FF7788", "a-tx2 <02 02 05", @@ -61,7 +58,6 @@ def setUp(self): "q-mp2 >02 08 77 05 aabbccddee", "a-sig <02 81 AABBCCDD", ], - "mode": SighashComputationMode.SEGWIT, "tx": "aabbccddeeff7788", "input": 1234, "ws": "22446688aa", @@ -73,7 +69,7 @@ def setUp(self): @patch("ledger.hsm2dongle.HSM2DongleSignature") def test_ok(self, HSM2DongleSignatureMock): key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec({**self.SEGWIT_SPEC, "keyid": key_id}) + spec = self.process_sign_auth_spec({**self.SPEC, "keyid": key_id}) HSM2DongleSignatureMock.return_value = "the-signature" self.assertEqual( @@ -89,8 +85,8 @@ def test_ok(self, HSM2DongleSignatureMock): def test_long_witness_script_length(self): exchanges = [ "q-path >02 01 11223344 D2040000", - "a-tx0 <02 02 0C", - "q-tx0 >02 02 0F000000 01 0D01 AABBCCDDEE", + "a-tx0 <02 02 0B", + "q-tx0 >02 02 0E000000 0D01 AABBCCDDEE", "a-tx1 <02 02 03", "q-tx1 >02 02 FF7788", "a-tx2 <02 02 08", @@ -99,7 +95,7 @@ def test_long_witness_script_length(self): ] key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) spec = self.process_sign_auth_spec({ - **self.SEGWIT_SPEC, "exchanges": exchanges, + **self.SPEC, "exchanges": exchanges, "keyid": key_id, "ws": self.buf(258).hex() }, stop="a-tx3", replace=CommException("forced-stop", 0xFFFF) ) @@ -112,8 +108,7 @@ def test_long_witness_script_length(self): ("input", "a-tx1", 0x6A88, -2), ("tx_hash_mismatch", "a-tx3", 0x6A8D, -2), ("tx_version", "a-tx2", 0x6A8E, -2), - ("invalid_sighash_computation_mode", "a-tx3", 0x6A97, -2), - ("invalid_extradata_size", "a-tx1", 0x6A98, -2), + ("invalid_extradata_size", "a-tx1", 0x6A97, -2), ("unknown", "a-tx2", 0x6AFF, -10), ("unexpected", "a-tx3", [0, 0, 0xFF], -10), ]) @@ -125,7 +120,7 @@ def test_btctx_invalid(self, _, stop, device_error, expected_response): key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) spec = self.process_sign_auth_spec( - {**self.SEGWIT_SPEC, "keyid": key_id}, + {**self.SPEC, "keyid": key_id}, stop=stop, replace=last_response ) @@ -139,7 +134,7 @@ def test_btctx_invalid(self, _, stop, device_error, expected_response): def test_btctx_unexpected_error_exc(self): key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) spec = self.process_sign_auth_spec( - {**self.SEGWIT_SPEC, "keyid": key_id}, + {**self.SPEC, "keyid": key_id}, stop="a-tx2", replace=CommException("", 0xFF) ) @@ -149,6 +144,6 @@ def test_btctx_unexpected_error_exc(self): self.assert_exchange(spec["requests"]) -class TestHSM2DongleSGXSignAuthorizedSegwit(TestHSM2DongleSignAuthorizedSegwit): +class TestHSM2DongleSGXSignAuthorized(TestHSM2DongleSignAuthorized): def get_test_mode(self): return HSM2DongleTestMode.SGX diff --git a/middleware/tests/ledger/hsm2dongle_cmds/test_hsm2dongle_sign_auth_legacy.py b/middleware/tests/ledger/hsm2dongle_cmds/test_hsm2dongle_sign_auth_legacy.py deleted file mode 100644 index 834ad156..00000000 --- a/middleware/tests/ledger/hsm2dongle_cmds/test_hsm2dongle_sign_auth_legacy.py +++ /dev/null @@ -1,277 +0,0 @@ -# The MIT License (MIT) -# -# Copyright (c) 2021 RSK Labs Ltd -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of -# this software and associated documentation files (the "Software"), to deal in -# the Software without restriction, including without limitation the rights to -# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -# of the Software, and to permit persons to whom the Software is furnished to do -# so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -from unittest.mock import Mock, patch, call -from parameterized import parameterized -from tests.ledger.test_hsm2dongle import TestHSM2DongleBase, HSM2DongleTestMode -from ledger.hsm2dongle import ( - HSM2DongleError, - SighashComputationMode, -) -from ledgerblue.commException import CommException - -import logging - -logging.disable(logging.CRITICAL) - - -class TestHSM2DongleSignAuthorizedLegacy(TestHSM2DongleBase): - def setUp(self): - super().setUp() - - self.LEGACY_SPEC = { - "exchanges": [ - "q-path >02 01 11223344 D2040000", - "a-tx0 <02 02 0C", - "q-tx0 >02 02 0F000000 00 0000 AABBCCDDEE", - "a-tx1 <02 02 03", - "q-tx1 >02 02 FF7788", - "a-rc0 <02 04 04", - "q-rc0 >02 04 00112233", - "a-rc1 <02 04 06", - "q-rc1 >02 04 445566778899", - "a-mp0 <02 08 04", - "q-mp0 >02 08 03 03 3344", - "a-mp1 <02 08 03", - "q-mp1 >02 08 55 02 66", - "a-mp2 <02 08 07", - "q-mp2 >02 08 77 05 aabbccddee", - "a-sig <02 81 AABBCCDD", - ], - "mode": SighashComputationMode.LEGACY, - "tx": "aabbccddeeff7788", - "input": 1234, - "ws": None, - "ov": None, - "receipt": "00112233445566778899", - "mp": ["334455", "6677", "aabbccddee"], - } - - @patch("ledger.hsm2dongle.HSM2DongleSignature") - def test_ok(self, HSM2DongleSignatureMock): - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec({**self.LEGACY_SPEC, "keyid": key_id}) - HSM2DongleSignatureMock.return_value = "the-signature" - - self.assertEqual( - (True, "the-signature"), - self.do_sign_auth(spec) - ) - self.assert_exchange(spec["requests"]) - self.assertEqual( - [call(bytes.fromhex("aabbccdd"))], - HSM2DongleSignatureMock.call_args_list, - ) - - @parameterized.expand([ - ("data_size", 0x6A87, -4), - ("state", 0x6A89, -4), - ("node_version", 0x6A92, -4), - ("shared_prefix_too_big", 0x6A93, -4), - ("receipt_hash_mismatch", 0x6A94, -4), - ("node_chaining_mismatch", 0x6A95, -4), - ("receipt_root_mismatch", 0x6A96, -4), - ("unknown", 0x6AFF, -10), - ("unexpected", [0, 0, 0xFF], -10), - ]) - def test_mp_invalid(self, _, device_error, expected_response): - if type(device_error) == int: - last_response = CommException("msg", device_error) - else: - last_response = bytes(device_error) - - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec( - {**self.LEGACY_SPEC, "keyid": key_id}, - stop="a-mp2", - replace=last_response - ) - - self.assertEqual( - (False, expected_response), - self.do_sign_auth(spec) - ) - self.assert_exchange(spec["requests"]) - - @parameterized.expand([ - ("too_many_nodes", ["aa"]*256), - ("node_too_big", ["aa"]*100 + ["bb"*256]), - ]) - def test_mp_too_big(self, _, receipt_merkle_proof): - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec( - {**self.LEGACY_SPEC, "keyid": key_id, "mp": receipt_merkle_proof}, - stop="q-mp0" - ) - - self.assertEqual( - (False, -4), - self.do_sign_auth(spec) - ) - self.assert_exchange(spec["requests"]) - - def test_mp_unexpected_exc(self): - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec( - {**self.LEGACY_SPEC, "keyid": key_id}, - stop="a-mp2", - replace=CommException("msg", 0xFFFF), - ) - - with self.assertRaises(HSM2DongleError): - self.do_sign_auth(spec) - - self.assert_exchange(spec["requests"]) - - def test_mp_invalid_format(self): - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec( - {**self.LEGACY_SPEC, "keyid": key_id, "mp": ["334455", "6677", "not-a-hex"]}, - stop="q-mp0", - replace=None, - ) - - self.assertEqual( - (False, -4), - self.do_sign_auth(spec) - ) - - self.assert_exchange(spec["requests"]) - - @parameterized.expand([ - ("data_size", 0x6A87, -3), - ("state", 0x6A89, -3), - ("rlp", 0x6A8A, -3), - ("rlp_int", 0x6A8B, -3), - ("rlp_depth", 0x6A8C, -3), - ("unknown", 0x6AFF, -10), - ("unexpected", [0, 0, 0xFF], -10), - ]) - def test_receipt_invalid(self, _, device_error, expected_response): - if type(device_error) == int: - last_response = CommException("msg", device_error) - else: - last_response = bytes(device_error) - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec( - {**self.LEGACY_SPEC, "keyid": key_id}, - stop="a-rc1", - replace=last_response - ) - - self.assertEqual( - (False, expected_response), - self.do_sign_auth(spec) - ) - self.assert_exchange(spec["requests"]) - - def test_receipt_unexpected_error_exc(self): - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec( - {**self.LEGACY_SPEC, "keyid": key_id}, - stop="a-rc1", - replace=CommException("", 0xFFFF) - ) - - with self.assertRaises(HSM2DongleError): - self.do_sign_auth(spec) - self.assert_exchange(spec["requests"]) - - @parameterized.expand([ - ("input", 0x6A88, -2), - ("tx_hash_mismatch", 0x6A8D, -2), - ("tx_version", 0x6A8E, -2), - ("invalid_sighash_computation_mode", 0x6A97, -2), - ("unknown", 0x6AFF, -10), - ("unexpected", [0, 0, 0xFF], -10), - ]) - def test_btctx_invalid(self, _, device_error, expected_response): - if type(device_error) == int: - last_response = CommException("msg", device_error) - else: - last_response = bytes(device_error) - - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec( - {**self.LEGACY_SPEC, "keyid": key_id}, - stop="a-tx1", - replace=last_response - ) - - self.assertEqual( - (False, expected_response), - self.do_sign_auth(spec) - ) - self.assert_exchange(spec["requests"]) - - def test_btctx_unexpected_error_exc(self): - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec( - {**self.LEGACY_SPEC, "keyid": key_id}, - stop="a-rc0", - replace=CommException("", 0xFF) - ) - - with self.assertRaises(HSM2DongleError): - self.do_sign_auth(spec) - self.assert_exchange(spec["requests"]) - - @parameterized.expand([ - ("data_size", 0x6A87, -1), - ("data_size_auth", 0x6A90, -1), - ("data_size_noauth", 0x6A91, -1), - ("unknown", 0x6AFF, -10), - ("unexpected", [0, 0, 0xFF], -10), - ]) - def test_path_invalid(self, _, device_error, expected_response): - if type(device_error) == int: - last_response = CommException("msg", device_error) - else: - last_response = bytes(device_error) - - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec( - {**self.LEGACY_SPEC, "keyid": key_id}, - stop="a-tx0", - replace=last_response - ) - - self.assertEqual( - (False, expected_response), - self.do_sign_auth(spec) - ) - - def test_path_unexpected_error_exc(self): - key_id = Mock(**{"to_binary.return_value": bytes.fromhex("11223344")}) - spec = self.process_sign_auth_spec( - {**self.LEGACY_SPEC, "keyid": key_id}, - stop="a-tx0", - replace=CommException("", 0xFFFF) - ) - - with self.assertRaises(HSM2DongleError): - self.do_sign_auth(spec) - - -class TestHSM2DongleSGXSignAuthorizedLegacy(TestHSM2DongleSignAuthorizedLegacy): - def get_test_mode(self): - return HSM2DongleTestMode.SGX diff --git a/middleware/tests/ledger/test_hsm2dongle.py b/middleware/tests/ledger/test_hsm2dongle.py index 13c096f2..1d40047e 100644 --- a/middleware/tests/ledger/test_hsm2dongle.py +++ b/middleware/tests/ledger/test_hsm2dongle.py @@ -202,7 +202,6 @@ def do_sign_auth(self, spec): receipt_merkle_proof=spec["mp"], btc_tx=spec["tx"], input_index=spec["input"], - sighash_computation_mode=spec["mode"], witness_script=spec["ws"], outpoint_value=spec["ov"], ) @@ -225,7 +224,7 @@ def test_dongle_error_codes(self): self.assertEqual(0x6A8F, self.hsm2dongle.ERR.SIGN.INVALID_PATH) self.assertEqual( 0x6A97, - self.hsm2dongle.ERR.SIGN.INVALID_SIGHASH_COMPUTATION_MODE.value + self.hsm2dongle.ERR.SIGN.INVALID_EXTRADATA_SIZE.value ) def test_connects_ok(self): diff --git a/middleware/tests/ledger/test_protocol.py b/middleware/tests/ledger/test_protocol.py index eb22e166..59a56644 100644 --- a/middleware/tests/ledger/test_protocol.py +++ b/middleware/tests/ledger/test_protocol.py @@ -32,7 +32,6 @@ HSM2DongleTimeoutError, HSM2DongleCommError, HSM2FirmwareParameters, - SighashComputationMode, ) from ledger.version import HSM2FirmwareVersion @@ -155,23 +154,10 @@ def test_get_pubkey_unexpected_error(self, BIP32PathMock): self.assertEqual([call("the-key-id")], self.dongle.get_public_key.call_args_list) self.assertFalse(self.dongle.disconnect.called) - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") @patch("comm.protocol.BIP32Path") - def test_sign_authorized_legacy_ok(self, BIP32PathMock, get_unsigned_tx_mock, _): - BIP32PathMock.return_value = "the-key-id" - signature = Mock(r="this-is-r", s="this-is-s") - self.dongle.sign_authorized.return_value = (True, signature) - get_unsigned_tx_mock.return_value = "the-unsigned-tx" - + def test_sign_authorized_legacy_fails(self, BIP32PathMock): self.assertEqual( - { - "errorcode": 0, - "signature": { - "r": "this-is-r", - "s": "this-is-s" - } - }, + {"errorcode": -102}, self.protocol.handle_request({ "version": 5, "command": "sign", @@ -181,38 +167,20 @@ def test_sign_authorized_legacy_ok(self, BIP32PathMock, get_unsigned_tx_mock, _) "receipt_merkle_proof": ["cc", "dd"] }, "message": { - "sighashComputationMode": "legacy", "tx": "eeff", "input": 12 }, }), ) - self.assertEqual( - [ - call( - key_id="the-key-id", - rsk_tx_receipt="aa", - receipt_merkle_proof=["cc", "dd"], - btc_tx="the-unsigned-tx", - input_index=12, - sighash_computation_mode=SighashComputationMode.LEGACY, - witness_script=None, - outpoint_value=None, - ) - ], - self.dongle.sign_authorized.call_args_list, - ) + self.assertFalse(self.dongle.sign_authorized.called) self.assertFalse(self.dongle.disconnect.called) - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") @patch("comm.protocol.BIP32Path") - def test_sign_authorized_segwit_ok(self, BIP32PathMock, get_unsigned_tx_mock, _): + def test_sign_authorized_ok(self, BIP32PathMock): BIP32PathMock.return_value = "the-key-id" signature = Mock(r="this-is-r", s="this-is-s") self.dongle.sign_authorized.return_value = (True, signature) - get_unsigned_tx_mock.return_value = "the-unsigned-tx" self.assertEqual( { @@ -231,7 +199,6 @@ def test_sign_authorized_segwit_ok(self, BIP32PathMock, get_unsigned_tx_mock, _) "receipt_merkle_proof": ["cc", "dd"] }, "message": { - "sighashComputationMode": "segwit", "tx": "eeff", "input": 12, "witnessScript": "aabbccddeeff", @@ -246,9 +213,8 @@ def test_sign_authorized_segwit_ok(self, BIP32PathMock, get_unsigned_tx_mock, _) key_id="the-key-id", rsk_tx_receipt="aa", receipt_merkle_proof=["cc", "dd"], - btc_tx="the-unsigned-tx", + btc_tx="eeff", input_index=12, - sighash_computation_mode=SighashComputationMode.SEGWIT, witness_script="aabbccddeeff", outpoint_value=123000456, ) @@ -265,21 +231,16 @@ def test_sign_authorized_segwit_ok(self, BIP32PathMock, get_unsigned_tx_mock, _) ("unexpected", -10, -905), ("unknown", -100, -906), ]) - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") @patch("comm.protocol.BIP32Path") - def test_sign_authorized_legacy_error( + def test_sign_authorized_error( self, _, dongle_error_code, protocol_error_code, - BIP32PathMock, - get_unsigned_tx_mock, - __, + BIP32PathMock ): BIP32PathMock.return_value = "the-key-id" self.dongle.sign_authorized.return_value = (False, dongle_error_code) - get_unsigned_tx_mock.return_value = "the-unsigned-tx" self.assertEqual( {"errorcode": protocol_error_code}, @@ -292,66 +253,6 @@ def test_sign_authorized_legacy_error( "receipt_merkle_proof": ["cc", "dd"] }, "message": { - "sighashComputationMode": "legacy", - "tx": "eeff", - "input": 12 - }, - }), - ) - - self.assertEqual( - [ - call( - key_id="the-key-id", - rsk_tx_receipt="aa", - receipt_merkle_proof=["cc", "dd"], - btc_tx="the-unsigned-tx", - input_index=12, - sighash_computation_mode=SighashComputationMode.LEGACY, - witness_script=None, - outpoint_value=None, - ) - ], - self.dongle.sign_authorized.call_args_list, - ) - self.assertFalse(self.dongle.disconnect.called) - - @parameterized.expand([ - ("path", -1, -103), - ("btc_tx", -2, -102), - ("receipt", -3, -101), - ("merkle_proof", -4, -101), - ("unexpected", -10, -905), - ("unknown", -100, -906), - ]) - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") - @patch("comm.protocol.BIP32Path") - def test_sign_authorized_segwit_error( - self, - _, - dongle_error_code, - protocol_error_code, - BIP32PathMock, - get_unsigned_tx_mock, - __, - ): - BIP32PathMock.return_value = "the-key-id" - self.dongle.sign_authorized.return_value = (False, dongle_error_code) - get_unsigned_tx_mock.return_value = "the-unsigned-tx" - - self.assertEqual( - {"errorcode": protocol_error_code}, - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/44'/1'/2'/3/4", - "auth": { - "receipt": "aa", - "receipt_merkle_proof": ["cc", "dd"] - }, - "message": { - "sighashComputationMode": "segwit", "tx": "eeff", "input": 12, "witnessScript": "aabbccddeeff", @@ -366,9 +267,8 @@ def test_sign_authorized_segwit_error( key_id="the-key-id", rsk_tx_receipt="aa", receipt_merkle_proof=["cc", "dd"], - btc_tx="the-unsigned-tx", + btc_tx="eeff", input_index=12, - sighash_computation_mode=SighashComputationMode.SEGWIT, witness_script="aabbccddeeff", outpoint_value=123000456, ) @@ -377,56 +277,10 @@ def test_sign_authorized_segwit_error( ) self.assertFalse(self.dongle.disconnect.called) - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") - @patch("comm.protocol.BIP32Path") - def test_sign_authorized_legacy_timeout(self, BIP32PathMock, get_unsigned_tx_mock, _): - BIP32PathMock.return_value = "the-key-id" - self.dongle.sign_authorized.side_effect = HSM2DongleTimeoutError() - get_unsigned_tx_mock.return_value = "the-unsigned-tx" - - self.assertEqual( - {"errorcode": -905}, - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/44'/1'/2'/3/4", - "auth": { - "receipt": "aa", - "receipt_merkle_proof": ["cc", "dd"] - }, - "message": { - "sighashComputationMode": "legacy", - "tx": "eeff", - "input": 12 - }, - }), - ) - - self.assertEqual( - [ - call( - key_id="the-key-id", - rsk_tx_receipt="aa", - receipt_merkle_proof=["cc", "dd"], - btc_tx="the-unsigned-tx", - input_index=12, - sighash_computation_mode=SighashComputationMode.LEGACY, - witness_script=None, - outpoint_value=None, - ) - ], - self.dongle.sign_authorized.call_args_list, - ) - self.assertFalse(self.dongle.disconnect.called) - - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") @patch("comm.protocol.BIP32Path") - def test_sign_authorized_segwit_timeout(self, BIP32PathMock, get_unsigned_tx_mock, _): + def test_sign_authorized_timeout(self, BIP32PathMock): BIP32PathMock.return_value = "the-key-id" self.dongle.sign_authorized.side_effect = HSM2DongleTimeoutError() - get_unsigned_tx_mock.return_value = "the-unsigned-tx" self.assertEqual( {"errorcode": -905}, @@ -439,7 +293,6 @@ def test_sign_authorized_segwit_timeout(self, BIP32PathMock, get_unsigned_tx_moc "receipt_merkle_proof": ["cc", "dd"] }, "message": { - "sighashComputationMode": "segwit", "tx": "eeff", "input": 12, "witnessScript": "aabbccddeeff", @@ -454,9 +307,8 @@ def test_sign_authorized_segwit_timeout(self, BIP32PathMock, get_unsigned_tx_moc key_id="the-key-id", rsk_tx_receipt="aa", receipt_merkle_proof=["cc", "dd"], - btc_tx="the-unsigned-tx", + btc_tx="eeff", input_index=12, - sighash_computation_mode=SighashComputationMode.SEGWIT, witness_script="aabbccddeeff", outpoint_value=123000456, ) @@ -465,14 +317,10 @@ def test_sign_authorized_segwit_timeout(self, BIP32PathMock, get_unsigned_tx_moc ) self.assertFalse(self.dongle.disconnect.called) - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") @patch("comm.protocol.BIP32Path") - def test_sign_authorized_legacy_commerror_reconnection(self, BIP32PathMock, - get_unsigned_tx_mock, _): + def test_sign_authorized_commerror_reconnection(self, BIP32PathMock): BIP32PathMock.return_value = "the-key-id" self.dongle.sign_authorized.side_effect = HSM2DongleCommError() - get_unsigned_tx_mock.return_value = "the-unsigned-tx" self.assertEqual( {"errorcode": -905}, @@ -485,82 +333,6 @@ def test_sign_authorized_legacy_commerror_reconnection(self, BIP32PathMock, "receipt_merkle_proof": ["cc", "dd"] }, "message": { - "sighashComputationMode": "legacy", - "tx": "eeff", - "input": 12 - }, - }), - ) - - self.assertEqual( - [ - call( - key_id="the-key-id", - rsk_tx_receipt="aa", - receipt_merkle_proof=["cc", "dd"], - btc_tx="the-unsigned-tx", - input_index=12, - sighash_computation_mode=SighashComputationMode.LEGACY, - witness_script=None, - outpoint_value=None, - ) - ], - self.dongle.sign_authorized.call_args_list, - ) - self.assertFalse(self.dongle.disconnect.called) - - # Reconnection logic - self.dongle.sign_authorized.side_effect = None - signature = Mock(r="this-is-r", s="this-is-s") - self.dongle.sign_authorized.return_value = (True, signature) - - self.assertEqual( - { - "errorcode": 0, - "signature": { - "r": "this-is-r", - "s": "this-is-s" - } - }, - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/44'/1'/2'/3/4", - "auth": { - "receipt": "aa", - "receipt_merkle_proof": ["cc", "dd"] - }, - "message": { - "sighashComputationMode": "legacy", - "tx": "eeff", - "input": 12 - }, - }), - ) - - self._assert_reconnected() - - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") - @patch("comm.protocol.BIP32Path") - def test_sign_authorized_segwit_commerror_reconnection(self, BIP32PathMock, - get_unsigned_tx_mock, _): - BIP32PathMock.return_value = "the-key-id" - self.dongle.sign_authorized.side_effect = HSM2DongleCommError() - get_unsigned_tx_mock.return_value = "the-unsigned-tx" - - self.assertEqual( - {"errorcode": -905}, - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/44'/1'/2'/3/4", - "auth": { - "receipt": "aa", - "receipt_merkle_proof": ["cc", "dd"] - }, - "message": { - "sighashComputationMode": "segwit", "tx": "eeff", "input": 12, "witnessScript": "aabbccddeeff", @@ -575,9 +347,8 @@ def test_sign_authorized_segwit_commerror_reconnection(self, BIP32PathMock, key_id="the-key-id", rsk_tx_receipt="aa", receipt_merkle_proof=["cc", "dd"], - btc_tx="the-unsigned-tx", + btc_tx="eeff", input_index=12, - sighash_computation_mode=SighashComputationMode.SEGWIT, witness_script="aabbccddeeff", outpoint_value=123000456, ) @@ -608,7 +379,6 @@ def test_sign_authorized_segwit_commerror_reconnection(self, BIP32PathMock, "receipt_merkle_proof": ["cc", "dd"] }, "message": { - "sighashComputationMode": "segwit", "tx": "eeff", "input": 12, "witnessScript": "001122", @@ -619,14 +389,10 @@ def test_sign_authorized_segwit_commerror_reconnection(self, BIP32PathMock, self._assert_reconnected() - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") @patch("comm.protocol.BIP32Path") - def test_sign_authorized_legacy_exception(self, BIP32PathMock, - get_unsigned_tx_mock, _): + def test_sign_authorized_exception(self, BIP32PathMock): BIP32PathMock.return_value = "the-key-id" self.dongle.sign_authorized.side_effect = HSM2DongleError() - get_unsigned_tx_mock.return_value = "the-unsigned-tx" with self.assertRaises(HSM2ProtocolError): self.protocol.handle_request({ @@ -638,49 +404,6 @@ def test_sign_authorized_legacy_exception(self, BIP32PathMock, "receipt_merkle_proof": ["cc", "dd"] }, "message": { - "sighashComputationMode": "legacy", - "tx": "eeff", - "input": 12 - }, - }) - - self.assertEqual( - [ - call( - key_id="the-key-id", - rsk_tx_receipt="aa", - receipt_merkle_proof=["cc", "dd"], - btc_tx="the-unsigned-tx", - input_index=12, - sighash_computation_mode=SighashComputationMode.LEGACY, - witness_script=None, - outpoint_value=None, - ) - ], - self.dongle.sign_authorized.call_args_list, - ) - self.assertFalse(self.dongle.disconnect.called) - - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") - @patch("comm.protocol.BIP32Path") - def test_sign_authorized_segwit_exception(self, BIP32PathMock, - get_unsigned_tx_mock, _): - BIP32PathMock.return_value = "the-key-id" - self.dongle.sign_authorized.side_effect = HSM2DongleError() - get_unsigned_tx_mock.return_value = "the-unsigned-tx" - - with self.assertRaises(HSM2ProtocolError): - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/44'/1'/2'/3/4", - "auth": { - "receipt": "aa", - "receipt_merkle_proof": ["cc", "dd"] - }, - "message": { - "sighashComputationMode": "segwit", "tx": "eeff", "input": 12, "witnessScript": "aabbccddeeff", @@ -694,9 +417,8 @@ def test_sign_authorized_segwit_exception(self, BIP32PathMock, key_id="the-key-id", rsk_tx_receipt="aa", receipt_merkle_proof=["cc", "dd"], - btc_tx="the-unsigned-tx", + btc_tx="eeff", input_index=12, - sighash_computation_mode=SighashComputationMode.SEGWIT, witness_script="aabbccddeeff", outpoint_value=123000456, ) @@ -705,123 +427,6 @@ def test_sign_authorized_segwit_exception(self, BIP32PathMock, ) self.assertFalse(self.dongle.disconnect.called) - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") - @patch("comm.protocol.BIP32Path") - def test_sign_authorized_legacy_error_unsigning(self, BIP32PathMock, - get_unsigned_tx_mock, _): - BIP32PathMock.return_value = "the-key-id" - get_unsigned_tx_mock.side_effect = RuntimeError() - - self.assertEqual( - {"errorcode": -102}, - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/44'/1'/2'/3/4", - "auth": { - "receipt": "aa", - "receipt_merkle_proof": ["cc", "dd"] - }, - "message": { - "sighashComputationMode": "legacy", - "tx": "eeff", - "input": 12 - }, - }), - ) - - self.assertFalse(self.dongle.sign_authorized.called) - self.assertFalse(self.dongle.disconnect.called) - - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") - @patch("comm.protocol.BIP32Path") - def test_sign_authorized_segwit_error_unsigning(self, BIP32PathMock, - get_unsigned_tx_mock, _): - BIP32PathMock.return_value = "the-key-id" - get_unsigned_tx_mock.side_effect = RuntimeError() - - self.assertEqual( - {"errorcode": -102}, - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/44'/1'/2'/3/4", - "auth": { - "receipt": "aa", - "receipt_merkle_proof": ["cc", "dd"] - }, - "message": { - "sighashComputationMode": "segwit", - "tx": "eeff", - "input": 12, - "witnessScript": "aabbccddeeff", - "outpointValue": 123000456 - }, - }), - ) - - self.assertFalse(self.dongle.sign_authorized.called) - self.assertFalse(self.dongle.disconnect.called) - - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") - @patch("comm.protocol.BIP32Path") - def test_sign_authorized_message_invalid(self, BIP32PathMock, get_unsigned_tx_mock, - _): - BIP32PathMock.return_value = "the-key-id" - - self.assertEqual( - {"errorcode": -102}, - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/44'/1'/2'/3/4", - "auth": { - "receipt": "aa", - "receipt_merkle_proof": ["cc", "dd"] - }, - "message": { - "sighashComputationMode": "legacy", - "tx": "invalid", - "input": 12 - }, - }), - ) - - self.assertFalse(self.dongle.sign_authorized.called) - self.assertFalse(get_unsigned_tx_mock.called) - self.assertFalse(self.dongle.disconnect.called) - - @patch("ledger.protocol.get_tx_hash") - @patch("ledger.protocol.get_unsigned_tx") - @patch("comm.protocol.BIP32Path") - def test_sign_authorized_auth_invalid(self, BIP32PathMock, get_unsigned_tx_mock, _): - BIP32PathMock.return_value = "the-key-id" - - self.assertEqual( - {"errorcode": -101}, - self.protocol.handle_request({ - "version": 5, - "command": "sign", - "keyId": "m/44'/1'/2'/3/4", - "auth": { - "receipt": "not-a-hex", - "receipt_merkle_proof": ["cc", "dd"], - }, - "message": { - "sighashComputationMode": "legacy", - "tx": "eeff", - "input": 12 - }, - }), - ) - - self.assertFalse(self.dongle.sign_authorized.called) - self.assertFalse(get_unsigned_tx_mock.called) - self.assertFalse(self.dongle.disconnect.called) - @patch("comm.protocol.BIP32Path") def test_sign_unauthorized_ok(self, BIP32PathMock): BIP32PathMock.return_value = "the-key-id" From 769bc38e425ba4d6c44375c62c80af0aefa7cd67 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 24 Dec 2025 14:30:02 +0700 Subject: [PATCH 05/14] Updated protocol documentation - Removed legacy signing from from authorized signing spec - Reworded segwit signing form as the sole authorized signing form --- docs/protocol.md | 52 ++++++++++-------------------------------------- 1 file changed, 11 insertions(+), 41 deletions(-) diff --git a/docs/protocol.md b/docs/protocol.md index f3544967..a2607dd8 100644 --- a/docs/protocol.md +++ b/docs/protocol.md @@ -38,47 +38,17 @@ For this operation, depending on the `keyId` parameter, there's two possible for ##### Authorized format This format is only valid for the BTC and tBTC key ids (see corresponding section for -details). In addition, there are two different sub-formats that can be used for authorized -signing: legacy and segwit. These are shown in the following subsections. - -###### Legacy BTC transactions - -This sub-format is to be used when signing legacy (i.e., non-segwit) Bitcoin transaction -inputs. - -``` -{ - "command": "sign", - "keyId": "xxxxx", // (*) - "message": { - "sighashComputationMode": "legacy", - "tx": "hhhh", // (**) - "input": i // (***) - }, - "auth": { - "receipt": "hhhh", - "receipt_merkle_proof": [ - "hhhh", "hhhh", ..., "hhhh" - ] - }, - "version": 5 -} -``` - -###### Segwit BTC transactions - -This sub-format is to be used when signing segwit Bitcoin transaction inputs. +details). ``` { "command": "sign", - "keyId": "xxxxx", // (*) + "keyId": "xxxxx", // (i) "message": { - "sighashComputationMode": "segwit", - "tx": "hhhh", // (**) - "input": i, // (***) - "witnessScript": "hhhh", // (x) - "outpointValue": i // (xx) + "tx": "hhhh", // (ii) + "input": i, // (iii) + "witnessScript": "hhhh", // (iv) + "outpointValue": i // (v) }, "auth": { "receipt": "hhhh", @@ -91,15 +61,15 @@ This sub-format is to be used when signing segwit Bitcoin transaction inputs. ``` ``` -// (*) the given string must be the +// (i) the given string must be the // BIP44 path of the key to use for signing. // See valid BIP44 paths below (BTC and tBTC for this format). -// (**) the fully serialized BTC transaction +// (ii) the fully serialized BTC transaction // that needs to be signed. -// (***) the input index of the BTC transaction +// (iii) the input index of the BTC transaction // that needs to be signed. -// (x) the witness script for the input that needs to be signed. -// (xx) the outpoint value (i.e., amount of the UTXO) for the input +// (iv) the witness script for the input that needs to be signed. +// (v) the outpoint value (i.e., amount of the UTXO) for the input // that needs to be signed. // // For the signing process to be successful, the computed receipts trie root From b436cecdb460e1eac0e309c7520dcf5ccd43c124 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Sat, 21 Feb 2026 08:32:45 +1300 Subject: [PATCH 06/14] Testing integration tests updates --- .github/workflows/run-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index bbac1324..2a9e7855 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -81,7 +81,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0 with: repository: rootstock/hsm-integration-test - ref: 5.4.0.plus + ref: enhancement/add-segwit-tests path: hsm-integration-test ssh-key: ${{ secrets.HSM_INTEGRATION_TEST_SSH_KEY }} @@ -123,7 +123,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0 with: repository: rootstock/hsm-integration-test - ref: 5.4.0.plus + ref: enhancement/add-segwit-tests path: hsm-integration-test ssh-key: ${{ secrets.HSM_INTEGRATION_TEST_SSH_KEY }} From 4399b2909af62aa1d54867cb0067c68899dece22 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 18 Mar 2026 08:35:59 +1300 Subject: [PATCH 07/14] Updated integration tests branch to use v2 for testing --- .github/workflows/run-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 2a9e7855..5284e2f5 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -81,7 +81,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0 with: repository: rootstock/hsm-integration-test - ref: enhancement/add-segwit-tests + ref: enhancement/segwit-signing-v2 path: hsm-integration-test ssh-key: ${{ secrets.HSM_INTEGRATION_TEST_SSH_KEY }} @@ -123,7 +123,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0 with: repository: rootstock/hsm-integration-test - ref: enhancement/add-segwit-tests + ref: enhancement/segwit-signing-v2 path: hsm-integration-test ssh-key: ${{ secrets.HSM_INTEGRATION_TEST_SSH_KEY }} From 69f042034a2279ed2b8c670578d6c1ddf6abb219 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 18 Mar 2026 10:21:33 +1300 Subject: [PATCH 08/14] Added missing validations --- firmware/src/powhsm/src/auth_tx.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/firmware/src/powhsm/src/auth_tx.c b/firmware/src/powhsm/src/auth_tx.c index 5a162505..b08e1ac0 100644 --- a/firmware/src/powhsm/src/auth_tx.c +++ b/firmware/src/powhsm/src/auth_tx.c @@ -39,11 +39,22 @@ static void btctx_cb(const btctx_cb_event_t event) { &auth.tx.tx_hash_ctx, auth.tx.ctx.raw, auth.tx.ctx.raw_size); if (event == BTCTX_EV_VERSION) { + if (auth.tx.ctx.parsed.version != 1 && + auth.tx.ctx.parsed.version != 2) { + LOG("[E] Unsupported TX Version: %u\n", auth.tx.ctx.parsed.version); + THROW(ERR_AUTH_INVALID_TX_VERSION); + } + hash_sha256_update( &auth.tx.sig_hash_ctx, auth.tx.ctx.raw, auth.tx.ctx.raw_size); } if (event == BTCTX_EV_VIN_COUNT) { + if (auth.input_index_to_sign >= auth.tx.ctx.parsed.varint.value) { + LOG("[E] Input index to sign > number of inputs.\n"); + THROW(ERR_AUTH_INVALID_TX_INPUT_INDEX); + } + hash_sha256_init(&auth.tx.prevouts_hash_ctx); hash_sha256_init(&auth.tx.sequence_hash_ctx); auth.tx.aux_offset = 0; @@ -164,8 +175,7 @@ unsigned int auth_sign_handle_btctx(volatile unsigned int rx) { THROW(ERR_AUTH_INVALID_DATA_SIZE); } // BTC tx length includes the length of the length - // and the length of the sighash computation mode and - // extradata length + // and the extradata length auth.tx.remaining_bytes -= TX_METADATA_SIZE; // Init both hash operations hash_sha256_init(&auth.tx.tx_hash_ctx); From 75c70b04ed5919db73ee9c5b803c7dfe64b6453a Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 18 Mar 2026 10:22:05 +1300 Subject: [PATCH 09/14] Fixed failing firmware test cases --- ...29-sign-auth-fail-trie-chunk-too-long.json | 25 ++++++++----------- ...0-sign-auth-fail-trie-chunk-too-short.json | 25 ++++++++----------- ...th-fail-trie-disallow-zero-node-count.json | 25 ++++++++----------- 3 files changed, 33 insertions(+), 42 deletions(-) diff --git a/firmware/test/resources/429-sign-auth-fail-trie-chunk-too-long.json b/firmware/test/resources/429-sign-auth-fail-trie-chunk-too-long.json index 3221f83c..c706d903 100644 --- a/firmware/test/resources/429-sign-auth-fail-trie-chunk-too-long.json +++ b/firmware/test/resources/429-sign-auth-fail-trie-chunk-too-long.json @@ -3,22 +3,19 @@ "operation": "rawCommand", "command": [ "800201052c0000800000008000000080000000000000000000000000", - "800202850200000000000200000002fe6eb00ec7d203273c0ab79dac3cf49292f86f11e56f7b988e1ed25ed1bc340b00000000fd0001000000004cfa20163db71aed39845d4ba481160c0c8d5329386e96ed0b", - "800202c2f4b9d44cea41c3012775645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2", - "800202a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4d472289741bff2666d0e1c2102ed49", - "8002028022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368aeffffffff13f050792d5a5397a1", - "8002020571730991f3d2cdfc9f6b3dc8f547d0b05b35f72afaf401000000de000000004cd8645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731", - "800202cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1e", - "800202fcab0187eff916f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a", - "8002023492f414152d9b5368aeffffffff0250e24a00000000001976a9140a4f09cbd39d5d8072b24385e1a9eb1c84ae544688acc035310b0000000017a914ba053351893c7495e0c75d5abacb3ed886cf1ff8", - "8002028700000000", - "800204f902000180b90100000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000", + "800202ea000000d80001000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0d", + "800202cb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffff", + "800202ff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "800202cf56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57", + "800202761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9", + "800202602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae76b2010000000000", + "800204f902030180b90100000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000", "8002040000000000000000000000000000000000000000400000000000000020000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000", "8002040000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100", - "800204000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b4", - "8002043e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc1", - "8002045304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0954487990dc49755fb4aa12dca75792620a21b7d281551754cfdc13fc00666ca", - "800204a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "800204000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b885145", + "80020457bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b94000000000000", + "8002040000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd08", + "8002047a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", "80020802267006008aea5320de5af1ebf4c349c1de93039031a4b372b17e67eb21417cbfbc27a4aa000203524f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd489dcd598cfa151b00038826", "8002087006008aea5320de5af1ebf4c349c1de93039031a4b372b17e67eb21417cbfbc27a4aa000203fdd705" ], diff --git a/firmware/test/resources/430-sign-auth-fail-trie-chunk-too-short.json b/firmware/test/resources/430-sign-auth-fail-trie-chunk-too-short.json index 4f154400..2b77278e 100644 --- a/firmware/test/resources/430-sign-auth-fail-trie-chunk-too-short.json +++ b/firmware/test/resources/430-sign-auth-fail-trie-chunk-too-short.json @@ -3,22 +3,19 @@ "operation": "rawCommand", "command": [ "800201052c0000800000008000000080000000000000000000000000", - "800202850200000000000200000002fe6eb00ec7d203273c0ab79dac3cf49292f86f11e56f7b988e1ed25ed1bc340b00000000fd0001000000004cfa20163db71aed39845d4ba481160c0c8d5329386e96ed0b", - "800202c2f4b9d44cea41c3012775645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2", - "800202a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4d472289741bff2666d0e1c2102ed49", - "8002028022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368aeffffffff13f050792d5a5397a1", - "8002020571730991f3d2cdfc9f6b3dc8f547d0b05b35f72afaf401000000de000000004cd8645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731", - "800202cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1e", - "800202fcab0187eff916f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a", - "8002023492f414152d9b5368aeffffffff0250e24a00000000001976a9140a4f09cbd39d5d8072b24385e1a9eb1c84ae544688acc035310b0000000017a914ba053351893c7495e0c75d5abacb3ed886cf1ff8", - "8002028700000000", - "800204f902000180b90100000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000", + "800202ea000000d80001000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0d", + "800202cb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffff", + "800202ff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "800202cf56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57", + "800202761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9", + "800202602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae76b2010000000000", + "800204f902030180b90100000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000", "8002040000000000000000000000000000000000000000400000000000000020000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000", "8002040000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100", - "800204000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b4", - "8002043e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc1", - "8002045304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0954487990dc49755fb4aa12dca75792620a21b7d281551754cfdc13fc00666ca", - "800204a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "800204000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b885145", + "80020457bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b94000000000000", + "8002040000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd08", + "8002047a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", "800208" ], "expected": "0x6a87" diff --git a/firmware/test/resources/431-sign-auth-fail-trie-disallow-zero-node-count.json b/firmware/test/resources/431-sign-auth-fail-trie-disallow-zero-node-count.json index b1468352..f2840983 100644 --- a/firmware/test/resources/431-sign-auth-fail-trie-disallow-zero-node-count.json +++ b/firmware/test/resources/431-sign-auth-fail-trie-disallow-zero-node-count.json @@ -3,22 +3,19 @@ "operation": "rawCommand", "command": [ "800201052c0000800000008000000080000000000000000000000000", - "800202850200000000000200000002fe6eb00ec7d203273c0ab79dac3cf49292f86f11e56f7b988e1ed25ed1bc340b00000000fd0001000000004cfa20163db71aed39845d4ba481160c0c8d5329386e96ed0b", - "800202c2f4b9d44cea41c3012775645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c125385600fbc1b89c2", - "800202a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4d472289741bff2666d0e1c2102ed49", - "8002028022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a3492f414152d9b5368aeffffffff13f050792d5a5397a1", - "8002020571730991f3d2cdfc9f6b3dc8f547d0b05b35f72afaf401000000de000000004cd8645221024c759affafc5589872d218ca30377e6d97211c039c375672c169ba76ce7fad6a21031f4aa4943fa2b731", - "800202cd99c551d6992021555877b3b32c125385600fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2dfe5baf483053670132b275522102132685d71b0109fecef0160f1e", - "800202fcab0187eff916f4d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4de9a", - "8002023492f414152d9b5368aeffffffff0250e24a00000000001976a9140a4f09cbd39d5d8072b24385e1a9eb1c84ae544688acc035310b0000000017a914ba053351893c7495e0c75d5abacb3ed886cf1ff8", - "8002028700000000", - "800204f902000180b90100000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000", + "800202ea000000d80001000000024c62cd14e351b13b960e76502307cf26fc1dcf8681e4b0d9d1bb6ca69156d90f03000000220020a16b5755f7f6f96dbd65f5f0d6ab9418b89af4b1f14a1bb8a09062c35f0d", + "800202cb54fffffffffd55c4e8a3a616fedc40187a6214775006fdda1155544b6fd3486374ace05ce4050000002200200fbed83438cf3f837ab484b29426bb643fd36b1c800fb37076a3e9d50fbf3845ffffff", + "800202ff0200e9a435000000001976a914389ffce9cd9ae88dcc0631e88a821ffdbe9bfe2688acc0832f05000000001976a9147480a33f950689af511e6e84c138dbbd3c3ee41588ac00000000", + "800202cf56210307b8ae49ac90a048e9b53357a2354b3334e9c8bee813ecb98e99a7e07e8c3ba32103b28f0c28bfab54554ae8c658ac5c3e0ce6e79ad336331f78c428dd43eea8449b21034b8113d703413d57", + "800202761b8b9781957b8c0ac1dfe69f492580ca4195f50376ba4a21033400f6afecb833092a9a21cfdf1ed1376e58c5d1f47de74683123987e967a8f42103a6d48b1131e94ba04d9737d61acdaa1322008af9", + "800202602b3b14862c07a1789aac162102d8b661b0b3302ee2f162b09e07a55ad5dfbe673a9f01d9f0c19617681024306b56ae76b2010000000000", + "800204f902030180b90100000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000", "8002040000000000000000000000000000000000000000400000000000000020000000000000000080000000000000000000000000000000000400000000000000000000000000000000000000000000000000", "8002040000000000080000000000000000000000000400000000000000000000000002000000000020000000000000000000000000000000000000000000000000000000000000000000100000000000000100", - "800204000000000080100000000000000000000000010000000000f8f7f858940000000000000000000000000000000001000006e1a01069152f4f916cbf155ee32a695d92258481944edb5b6fd649718fc1b4", - "8002043e515ea000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f89b940000000000000000000000000000000001000006f863a07a7c29481528ac8c2b2e93aee658fddd4dc1", - "8002045304fa723a5c2b88514557bcc790a0d12c37848294c3fb1cea441f6a1061f9304828fb22c324c27716c291ce37dec9a0954487990dc49755fb4aa12dca75792620a21b7d281551754cfdc13fc00666ca", - "800204a00000000000000000000000000000000000000000000000000000000011e1a3008001", + "800204000000000080100000000000000000000000010000000000f8faf87b940000000000000000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b885145", + "80020457bcc79080a0da7798413171679dfd1a891745bcf860a4527c78531918c83eca9dd51451f9bda000000000000000000000000085845342b0d5260d516d6da5280a7df9a96d1925f87b94000000000000", + "8002040000000000000000000001000006f843a07a7c29481528ac8c2b2e93aee658fddd4dc15304fa723a5c2b88514557bcc79080a040d8c164003187087002850e7e79d9a47d59b2a00b29a776d24a82bd08", + "8002047a16c6a00000000000000000000000000000000000000000000000000000000011e1a3008001", "80020800267006008aea5320de5af1ebf4c349c1de93039031a4b372b17e67eb21417cbfbc27a4aa00020300524f2670060290077e20feb9ffb4ed5abdcb42dc4e034fe2496cca6b38fd489dcd598cfa151b00", "8002080388267006008aea5320de5af1ebf4c349c1de93039031a4b372b17e67eb21417cbfbc27a4aa000203fdd705" ], From a6e7328de2538a1f4a721ab7c17871f611b13658 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 18 Mar 2026 10:22:21 +1300 Subject: [PATCH 10/14] Additional protocol documentation --- docs/protocol.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/protocol.md b/docs/protocol.md index a2607dd8..70fdf5f5 100644 --- a/docs/protocol.md +++ b/docs/protocol.md @@ -68,9 +68,9 @@ details). // that needs to be signed. // (iii) the input index of the BTC transaction // that needs to be signed. -// (iv) the witness script for the input that needs to be signed. +// (iv) the non-empty witness script for the input that needs to be signed. // (v) the outpoint value (i.e., amount of the UTXO) for the input -// that needs to be signed. +// that needs to be signed; must be > 0 and <= 0xffffffffffffffff // // For the signing process to be successful, the computed receipts trie root // must match the device's current 'ancestor_receipts_root'. From c89654b9ad0c07d2eef7097bb9166bdb9910ac61 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 18 Mar 2026 10:25:09 +1300 Subject: [PATCH 11/14] Updated integration tests branch to use v6+ --- .github/workflows/run-tests.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml index 5284e2f5..6a80285b 100644 --- a/.github/workflows/run-tests.yml +++ b/.github/workflows/run-tests.yml @@ -81,7 +81,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0 with: repository: rootstock/hsm-integration-test - ref: enhancement/segwit-signing-v2 + ref: 6.0.0.plus path: hsm-integration-test ssh-key: ${{ secrets.HSM_INTEGRATION_TEST_SSH_KEY }} @@ -123,7 +123,7 @@ jobs: uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 #v5.0.0 with: repository: rootstock/hsm-integration-test - ref: enhancement/segwit-signing-v2 + ref: 6.0.0.plus path: hsm-integration-test ssh-key: ${{ secrets.HSM_INTEGRATION_TEST_SSH_KEY }} From 046f10e87b0cef790b6327dc452b237d81e18128 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Wed, 18 Mar 2026 18:40:20 +1300 Subject: [PATCH 12/14] Fixed wrong sha256 update array size --- firmware/src/powhsm/src/auth_tx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/src/powhsm/src/auth_tx.c b/firmware/src/powhsm/src/auth_tx.c index b08e1ac0..065f579a 100644 --- a/firmware/src/powhsm/src/auth_tx.c +++ b/firmware/src/powhsm/src/auth_tx.c @@ -251,7 +251,7 @@ unsigned int auth_sign_handle_btctx(volatile unsigned int rx) { // Add SIGHASH_ALL hash type at the end hash_sha256_update(&auth.tx.sig_hash_ctx, (uint8_t[])SIGHASH_ALL_BYTES, - sizeof(SIGHASH_ALL_SIZE)); + SIGHASH_ALL_SIZE); hash_sha256_final(&auth.tx.sig_hash_ctx, auth.sig_hash); hash_sha256_init(&auth.tx.sig_hash_ctx); From 7fe6870901dcbcee25a65568a7fd8bcec5fef826 Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Thu, 19 Mar 2026 10:52:35 +1300 Subject: [PATCH 13/14] Updated comment as per PR comments --- firmware/src/powhsm/src/auth_tx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware/src/powhsm/src/auth_tx.c b/firmware/src/powhsm/src/auth_tx.c index 065f579a..6b806ef0 100644 --- a/firmware/src/powhsm/src/auth_tx.c +++ b/firmware/src/powhsm/src/auth_tx.c @@ -187,12 +187,12 @@ unsigned int auth_sign_handle_btctx(volatile unsigned int rx) { auth.tx.extradata_size = 0; auth.tx.extradata_size += APDU_DATA_PTR[apdu_offset++]; auth.tx.extradata_size += APDU_DATA_PTR[apdu_offset++] << 8; - // Validate computation mode and init tx parsing context - btctx_init(&auth.tx.ctx, &btctx_cb); + // Validate extradata size and init tx parsing context if (!auth.tx.extradata_size) { LOG("[E] Invalid extradata size"); THROW(ERR_AUTH_INVALID_EXTRADATA_SIZE); } + btctx_init(&auth.tx.ctx, &btctx_cb); } auth.tx.remaining_bytes -= btctx_consume( From 482708b5daf635556a14199028a343a8a7fa51db Mon Sep 17 00:00:00 2001 From: Ariel Mendelzon Date: Thu, 19 Mar 2026 10:56:33 +1300 Subject: [PATCH 14/14] Removed now unused btcscript module --- firmware/src/powhsm/src/btcscript.c | 136 -------- firmware/src/powhsm/src/btcscript.h | 135 -------- firmware/src/powhsm/src/mem.h | 1 - firmware/src/powhsm/test/btcscript/Makefile | 38 --- .../powhsm/test/btcscript/test_btcscript.c | 304 ------------------ firmware/src/powhsm/test/run-all.sh | 2 +- 6 files changed, 1 insertion(+), 615 deletions(-) delete mode 100644 firmware/src/powhsm/src/btcscript.c delete mode 100644 firmware/src/powhsm/src/btcscript.h delete mode 100644 firmware/src/powhsm/test/btcscript/Makefile delete mode 100644 firmware/src/powhsm/test/btcscript/test_btcscript.c diff --git a/firmware/src/powhsm/src/btcscript.c b/firmware/src/powhsm/src/btcscript.c deleted file mode 100644 index 17d725b9..00000000 --- a/firmware/src/powhsm/src/btcscript.c +++ /dev/null @@ -1,136 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 RSK Labs Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#include -#include - -#include "btcscript.h" - -#include "svarint.h" - -// Context pointer -static btcscript_ctx_t *ctx; - -/* - * Initialize the parser. - * - * @arg[in] ctx the context to be used for this session - * @arg[in] cb the callback to be used for this session - * @arg[in] script_size the total script size in bytes - */ -void btcscript_init(btcscript_ctx_t *_ctx, - btcscript_cb_t _cb, - uint32_t script_size) { - ctx = _ctx; - memset(ctx, 0, sizeof(btcscript_ctx_t)); - ctx->state = BTCSCRIPT_ST_OPCODE; - ctx->callback = _cb; - ctx->bytes_remaining = script_size; -} - -/* - * Tell whether parsing is finished, and - * whether it triggered an error (and which one) - * This should be checked after every call to btcscript_consume - */ -int8_t btcscript_result() { - if (ctx->state < 0 || ctx->state == BTCSCRIPT_ST_DONE) - return ctx->state; - return BTCSCRIPT_ERR_NONE; -} - -/* - * Consume a chunk of bytes. - * - * @arg[in] buf: buffer holding bytes to be consumed - * @arg[in] len: number of bytes to consume in buffer - * - * @return the number of bytes actually read and processed - */ -uint8_t btcscript_consume(uint8_t *buf, const uint8_t len) { - for (uint8_t i = 0; i < len; i++) { - ctx->bytes_remaining--; - switch (ctx->state) { - case BTCSCRIPT_ST_OPCODE: - ctx->opcode = buf[i]; - // Push only - taken from - // https://github.com/bitcoin/bitcoin/blob/v0.20.2/src/script/script.cpp#L242 - if (ctx->opcode > BTCSCRIPT_OP_16) { - ctx->state = BTCSCRIPT_ERR_INVALID; - return i + 1; - } - - // Taken from - // https://github.com/bitcoin/bitcoin/blob/v0.20.2/src/script/script.cpp#L278 - if (ctx->opcode > BTCSCRIPT_OP_0 && - ctx->opcode < BTCSCRIPT_OP_PUSHDATA1) { - ctx->operand_size = ctx->opcode; - ctx->callback(BTCSCRIPT_EV_OPCODE); - ctx->state = BTCSCRIPT_ST_OPERAND; - } else if (ctx->opcode == BTCSCRIPT_OP_0 || - ctx->opcode >= BTCSCRIPT_OP_1NEGATE) { - ctx->operand_size = 0; - ctx->callback(BTCSCRIPT_EV_OPCODE); - } else { // OP_PUSHDATA{1,2,4} - ctx->operand_size = 0; - ctx->size_offset = 0; - ctx->state = BTCSCRIPT_ST_OPERAND_SIZE; - } - break; - case BTCSCRIPT_ST_OPERAND_SIZE: - ctx->operand_size += buf[i] << (8 * ctx->size_offset++); - if ((ctx->opcode == BTCSCRIPT_OP_PUSHDATA1 && - ctx->size_offset == 1) || - (ctx->opcode == BTCSCRIPT_OP_PUSHDATA2 && - ctx->size_offset == 2) || - (ctx->opcode == BTCSCRIPT_OP_PUSHDATA4 && - ctx->size_offset == 4)) { - ctx->callback(BTCSCRIPT_EV_OPCODE); - ctx->state = BTCSCRIPT_ST_OPERAND; - } - break; - case BTCSCRIPT_ST_OPERAND: - ctx->operand_byte = buf[i]; - ctx->callback(BTCSCRIPT_EV_OPERAND); - if (!--ctx->operand_size) { - ctx->callback(BTCSCRIPT_EV_OPERAND_END); - ctx->state = BTCSCRIPT_ST_OPCODE; - } - break; - default: - return 0; - } - - if (!ctx->bytes_remaining) { - if (ctx->state == BTCSCRIPT_ST_OPCODE) { - ctx->state = BTCSCRIPT_ST_DONE; - } else { - ctx->state = BTCSCRIPT_ERR_INVALID; - } - return i + 1; - } - } - - return len; -} diff --git a/firmware/src/powhsm/src/btcscript.h b/firmware/src/powhsm/src/btcscript.h deleted file mode 100644 index ce54a1ba..00000000 --- a/firmware/src/powhsm/src/btcscript.h +++ /dev/null @@ -1,135 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 RSK Labs Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -// Streaming BTC script parser. -// Limited to P2SH-compatible scriptSigs atm. -// (i.e., only supporting PUSH operations, everything else is deemed invalid) -// -// Usage: -// Call btcscript_init to initialize the parser with the context and callback -// to use for the parsing session, and the total length of the script -// that's to be parsed. -// -// Then feed chunks of the BTC script with btcscript_consume. This function -// will process them and call your callback accordingly, returning the number -// of bytes actually processed and read. -// Immediately after calling this function, check error conditions and -// parsing state with btcscript_result. - -#ifndef __BTCSCRIPT_H -#define __BTCSCRIPT_H - -#include -#include - -// Supported opcodes (taken from -// https://github.com/bitcoin/bitcoin/blob/v0.20.2/src/script/script.h#L54) -#define BTCSCRIPT_OP_0 0x00 -#define BTCSCRIPT_OP_FALSE BTCSCRIPT_OP_0 -#define BTCSCRIPT_OP_PUSHDATA1 0x4c -#define BTCSCRIPT_OP_PUSHDATA2 0x4d -#define BTCSCRIPT_OP_PUSHDATA4 0x4e -#define BTCSCRIPT_OP_1NEGATE 0x4f -#define BTCSCRIPT_OP_RESERVED 0x50 -#define BTCSCRIPT_OP_1 0x51 -#define BTCSCRIPT_OP_TRUE BTCSCRIPT_OP_1 -#define BTCSCRIPT_OP_2 0x52 -#define BTCSCRIPT_OP_3 0x53 -#define BTCSCRIPT_OP_4 0x54 -#define BTCSCRIPT_OP_5 0x55 -#define BTCSCRIPT_OP_6 0x56 -#define BTCSCRIPT_OP_7 0x57 -#define BTCSCRIPT_OP_8 0x58 -#define BTCSCRIPT_OP_9 0x59 -#define BTCSCRIPT_OP_10 0x5a -#define BTCSCRIPT_OP_11 0x5b -#define BTCSCRIPT_OP_12 0x5c -#define BTCSCRIPT_OP_13 0x5d -#define BTCSCRIPT_OP_14 0x5e -#define BTCSCRIPT_OP_15 0x5f -#define BTCSCRIPT_OP_16 0x60 - -// Callback events -#define BTCSCRIPT_EV_OPCODE (0) -#define BTCSCRIPT_EV_OPERAND (1) -#define BTCSCRIPT_EV_OPERAND_END (2) -typedef uint8_t btcscript_cb_event_t; - -// Callback synonym -typedef void (*btcscript_cb_t)(const btcscript_cb_event_t event); - -// Context state and errors -#define BTCSCRIPT_ST_OPCODE (0) -#define BTCSCRIPT_ST_OPERAND_SIZE (1) -#define BTCSCRIPT_ST_OPERAND (2) -#define BTCSCRIPT_ST_DONE (3) - -#define BTCSCRIPT_ERR_NONE (0) -#define BTCSCRIPT_ERR_INVALID (-1) - -typedef int8_t btcscript_state_t; - -// Context -typedef struct { - btcscript_state_t state; - btcscript_cb_t callback; - - uint32_t bytes_remaining; - - uint8_t opcode; - union { - uint8_t size_offset; - uint8_t operand_byte; - }; - uint32_t operand_size; -} btcscript_ctx_t; - -/* - * Initialize the parser. - * - * @arg[in] ctx the context to be used for this session - * @arg[in] cb the callback to be used for this session - */ -void btcscript_init(btcscript_ctx_t* ctx, - btcscript_cb_t cb, - uint32_t script_size); - -/* - * Tell whether parsing is finished, and - * whether it triggered an error (and which one) - * This should be checked after every call to btcscript_consume - */ -int8_t btcscript_result(); - -/* - * Consume a chunk of bytes. - * - * @arg[in] buf: buffer holding bytes to be consumed - * @arg[in] len: number of bytes to consume in buffer - * - * @return the number of bytes actually read and processed - */ -uint8_t btcscript_consume(uint8_t* buf, const uint8_t len); - -#endif // __BTCSCRIPT_H diff --git a/firmware/src/powhsm/src/mem.h b/firmware/src/powhsm/src/mem.h index 58a42f68..276cc73e 100644 --- a/firmware/src/powhsm/src/mem.h +++ b/firmware/src/powhsm/src/mem.h @@ -32,7 +32,6 @@ #include "bc_block.h" #include "bc_state.h" #include "btctx.h" -#include "btcscript.h" #include "auth.h" #include "attestation.h" #include "heartbeat.h" diff --git a/firmware/src/powhsm/test/btcscript/Makefile b/firmware/src/powhsm/test/btcscript/Makefile deleted file mode 100644 index f1ee3833..00000000 --- a/firmware/src/powhsm/test/btcscript/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# The MIT License (MIT) -# -# Copyright (c) 2021 RSK Labs Ltd -# -# Permission is hereby granted, free of charge, to any person obtaining a copy of -# this software and associated documentation files (the "Software"), to deal in -# the Software without restriction, including without limitation the rights to -# use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies -# of the Software, and to permit persons to whom the Software is furnished to do -# so, subject to the following conditions: -# -# The above copyright notice and this permission notice shall be included in all -# copies or substantial portions of the Software. -# -# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -# SOFTWARE. - -include ../common/common.mk - -PROG = test.out -OBJS = test_fwk.o btcscript.o hex_reader.o test_btcscript.o - -all: $(PROG) - -$(PROG): $(OBJS) - $(CC) $(COVFLAGS) -o $@ $^ - -.PHONY: clean test -clean: - rm -f $(PROG) *.o $(COVFILES) - -test: all - ./$(PROG) diff --git a/firmware/src/powhsm/test/btcscript/test_btcscript.c b/firmware/src/powhsm/test/btcscript/test_btcscript.c deleted file mode 100644 index b8f60168..00000000 --- a/firmware/src/powhsm/test/btcscript/test_btcscript.c +++ /dev/null @@ -1,304 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 RSK Labs Ltd - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS - * IN THE SOFTWARE. - */ - -#include -#include -#include -#include -#include - -#include "btcscript.h" -#include "hex_reader.h" - -btcscript_ctx_t context; - -void test_init() { - printf("Testing context initialization...\n"); - - btcscript_init(&context, (btcscript_cb_t)1234, 5678); - - assert(context.state == BTCSCRIPT_ST_OPCODE); - assert(context.opcode == 0); - assert(context.size_offset == 0); - assert(context.operand_size == 0); - assert((size_t)context.callback == 1234); - assert(context.bytes_remaining == 5678); - assert(!btcscript_result()); -} - -void consume_in_chunks(uint8_t* buffer, size_t size, uint8_t chunk_size) { - for (size_t i = 0; i < size; i += chunk_size) { - uint8_t this_chunk = i + chunk_size >= size ? size - i : chunk_size; - uint8_t consumed = btcscript_consume(buffer + i, this_chunk); - if (btcscript_result() >= 0) - assert(consumed == this_chunk); - } -} - -uint8_t test_opcode_no_operand_expected_opcode; -int test_opcode_no_operand_ok; -void test_opcode_no_operand_callback(btcscript_cb_event_t event) { - if (event == BTCSCRIPT_EV_OPCODE && - context.opcode == test_opcode_no_operand_expected_opcode) { - test_opcode_no_operand_ok++; - } -} - -void test_opcode_no_operand(const char* script_hex, uint8_t expected_opcode) { - printf("Testing no operand opcode for script '%s'...\n", script_hex); - - size_t script_size = (size_t)(strlen(script_hex) / 2); - uint8_t* script = malloc(script_size); - assert(read_hex(script_hex, script_size * 2, script) == script_size); - - test_opcode_no_operand_expected_opcode = expected_opcode; - test_opcode_no_operand_ok = 0; - btcscript_init(&context, &test_opcode_no_operand_callback, script_size); - btcscript_consume(script, script_size); - assert(btcscript_result() == BTCSCRIPT_ST_DONE); - assert(test_opcode_no_operand_ok == 1); - - free(script); -} - -uint8_t test_opcode_n_operand_expected_opcode; -uint32_t test_opcode_n_operand_expected_operand_size; -uint8_t* test_opcode_n_operand_expected_operand; -int test_opcode_n_operand_ok; -uint8_t* test_opcode_n_operand_operand; -uint32_t operand_offset; -void test_opcode_n_operand_callback(btcscript_cb_event_t event) { - switch (event) { - case BTCSCRIPT_EV_OPCODE: - if (context.opcode == test_opcode_n_operand_expected_opcode) { - assert(context.operand_size == - test_opcode_n_operand_expected_operand_size); - test_opcode_n_operand_operand = malloc(context.operand_size); - operand_offset = 0; - test_opcode_n_operand_ok++; - } - break; - case BTCSCRIPT_EV_OPERAND: - if (context.opcode == test_opcode_n_operand_expected_opcode) { - assert(test_opcode_n_operand_ok == 1); - test_opcode_n_operand_operand[operand_offset++] = - context.operand_byte; - } - break; - case BTCSCRIPT_EV_OPERAND_END: - if (context.opcode == test_opcode_n_operand_expected_opcode) { - assert(operand_offset == - test_opcode_n_operand_expected_operand_size); - assert(test_opcode_n_operand_ok == 1); - assert(!memcmp(test_opcode_n_operand_expected_operand, - test_opcode_n_operand_operand, - test_opcode_n_operand_expected_operand_size)); - free(test_opcode_n_operand_operand); - test_opcode_n_operand_ok++; - } - break; - } -} - -void test_opcode_n_operand(const char* script_hex, - uint8_t expected_opcode, - const char* expected_operand_hex) { - printf("Testing opcode and operand for script '%s'...\n", script_hex); - - size_t script_size = (size_t)(strlen(script_hex) / 2); - uint8_t* script = malloc(script_size); - assert(read_hex(script_hex, script_size * 2, script) == script_size); - - size_t operand_size = (size_t)(strlen(expected_operand_hex) / 2); - uint8_t* expected_operand = malloc(operand_size); - assert(read_hex(expected_operand_hex, operand_size * 2, expected_operand) == - operand_size); - - // Test sending different chunk sizes - for (uint8_t chunk = 1; chunk <= 101 && chunk <= script_size; chunk += 10) { - printf("- with chunk size %u\n", chunk); - - test_opcode_n_operand_expected_opcode = expected_opcode; - test_opcode_n_operand_expected_operand_size = operand_size; - test_opcode_n_operand_expected_operand = expected_operand; - test_opcode_n_operand_ok = 0; - btcscript_init(&context, &test_opcode_n_operand_callback, script_size); - consume_in_chunks(script, script_size, chunk); - assert(btcscript_result() == BTCSCRIPT_ST_DONE); - assert(test_opcode_n_operand_ok == 2); - } - - free(script); -} - -void test_empty_callback(btcscript_cb_event_t event) { -} - -void test_result(const char* script_hex, - int8_t expected_result, - const char* description) { - printf("Testing script '%s' should be deemed %s...\n", - script_hex, - description); - - size_t script_size = (size_t)(strlen(script_hex) / 2); - uint8_t* script = malloc(script_size); - assert(read_hex(script_hex, script_size * 2, script) == script_size); - - // Test sending different chunk sizes - for (uint8_t chunk = 1; chunk <= 101 && chunk <= script_size; chunk += 10) { - printf("- with chunk size %u\n", chunk); - - btcscript_init(&context, &test_empty_callback, script_size); - consume_in_chunks(script, script_size, chunk); - assert(btcscript_result() == expected_result); - } - - free(script); -} - -void test_valid(const char* script_hex) { - test_result(script_hex, BTCSCRIPT_ST_DONE, "valid"); -} - -void test_invalid(const char* script_hex) { - test_result(script_hex, BTCSCRIPT_ERR_INVALID, "invalid"); -} - -int main() { - test_init(); - - test_opcode_no_operand("00", BTCSCRIPT_OP_0); - test_opcode_no_operand("4f", BTCSCRIPT_OP_1NEGATE); - test_opcode_no_operand("50", BTCSCRIPT_OP_RESERVED); - test_opcode_no_operand("51", BTCSCRIPT_OP_1); - test_opcode_no_operand("52", BTCSCRIPT_OP_2); - test_opcode_no_operand("53", BTCSCRIPT_OP_3); - test_opcode_no_operand("54", BTCSCRIPT_OP_4); - test_opcode_no_operand("55", BTCSCRIPT_OP_5); - test_opcode_no_operand("56", BTCSCRIPT_OP_6); - test_opcode_no_operand("57", BTCSCRIPT_OP_7); - test_opcode_no_operand("58", BTCSCRIPT_OP_8); - test_opcode_no_operand("59", BTCSCRIPT_OP_9); - test_opcode_no_operand("5a", BTCSCRIPT_OP_10); - test_opcode_no_operand("5b", BTCSCRIPT_OP_11); - test_opcode_no_operand("5c", BTCSCRIPT_OP_12); - test_opcode_no_operand("5d", BTCSCRIPT_OP_13); - test_opcode_no_operand("5e", BTCSCRIPT_OP_14); - test_opcode_no_operand("5f", BTCSCRIPT_OP_15); - test_opcode_no_operand("60", BTCSCRIPT_OP_16); - - test_opcode_n_operand("01aa", 0x01, "aa"); - test_opcode_n_operand("02aabb", 0x02, "aabb"); - test_opcode_n_operand( - "0a0102030405060708090a", 0x0a, "0102030405060708090a"); - test_opcode_n_operand("4b11111111111111111111222222222222222222223333333333" - "3333333333444444444444444444445555555555555555555566" - "666666666666666666777777777777777777778888888888", - 0x4b, - "1111111111111111111122222222222222222222333333333333" - "3333333344444444444444444444555555555555555555556666" - "6666666666666666777777777777777777778888888888"); - test_opcode_n_operand("4c051122334455", 0x4c, "1122334455"); - test_opcode_n_operand( - "4d020156d2f3a9cda97ac22b0d23f5d082b9269c2880f513b42dee69e7ab1580d15b06" - "ca006205eed0a890c9e526dba3fd7628be994785d8a3f0cec83136c7114c94eba0ae00" - "934773c669880b106ae298953a27d19f581a25589b301e49a64791e36895673636b95a" - "5fd05e87b45ddee9754e4338e22776d08f869bc2b26e63f73b4745a1b89f0f22a826b6" - "27a0d6248713b357833fdf6cd76ca4e2ee8442169cd5e7289546e7511f8bce3dffd5af" - "c66516bc9348cb491fec435899c740783aa8567a75935967beb194b8baea97df841a68" - "192ba41e96ccc309c11aaa4e03c545cbfa74d5de6f146bbdcdcc84e61e30e7cdde3388" - "eb156affe18870052a19f92580f329ed", - 0x4d, - "56d2f3a9cda97ac22b0d23f5d082b9269c2880f513b42dee69e7ab1580d15b06ca0062" - "05eed0a890c9e526dba3fd7628be994785d8a3f0cec83136c7114c94eba0ae00934773" - "c669880b106ae298953a27d19f581a25589b301e49a64791e36895673636b95a5fd05e" - "87b45ddee9754e4338e22776d08f869bc2b26e63f73b4745a1b89f0f22a826b627a0d6" - "248713b357833fdf6cd76ca4e2ee8442169cd5e7289546e7511f8bce3dffd5afc66516" - "bc9348cb491fec435899c740783aa8567a75935967beb194b8baea97df841a68192ba4" - "1e96ccc309c11aaa4e03c545cbfa74d5de6f146bbdcdcc84e61e30e7cdde3388eb156a" - "ffe18870052a19f92580f329ed"); - test_opcode_n_operand( - "4eaa00000063e081551583516962082588bb01b85b3674a2f78c23783a686b27ce302d" - "f87876ce1f6762bdd6b1be1a292dc09d4bd09b515909812c6dc1dfb49f2f0c3f84a953" - "80a29e85f744d0aaf28408844a848a866c15c97dcdb5109842acbb0b1fbd4b8a53b986" - "39d8a8d9cd413e6e746741c862a5a72055e3bbaa52c7cc97f0441b81bd75049c01daa7" - "952ce18194192850ff3f07e01af94266824459dc7bcc7451692ec12ccc6b4ac138cb7" - "a", - 0x4e, - "63e081551583516962082588bb01b85b3674a2f78c23783a686b27ce302df87876ce1f" - "6762bdd6b1be1a292dc09d4bd09b515909812c6dc1dfb49f2f0c3f84a95380a29e85f7" - "44d0aaf28408844a848a866c15c97dcdb5109842acbb0b1fbd4b8a53b98639d8a8d9cd" - "413e6e746741c862a5a72055e3bbaa52c7cc97f0441b81bd75049c01daa7952ce18194" - "192850ff3f07e01af94266824459dc7bcc7451692ec12ccc6b4ac138cb7a"); - - test_valid("01aa02bbbb03cccccc4c04dddddddd"); - test_valid( - "0a0102030405060708090a4d020156d2f3a9cda97ac22b0d23f5d082b9269c2880f513" - "b42dee69e7ab1580d15b06ca006205eed0a890c9e526dba3fd7628be994785d8a3f0ce" - "c83136c7114c94eba0ae00934773c669880b106ae298953a27d19f581a25589b301e49" - "a64791e36895673636b95a5fd05e87b45ddee9754e4338e22776d08f869bc2b26e63f7" - "3b4745a1b89f0f22a826b627a0d6248713b357833fdf6cd76ca4e2ee8442169cd5e728" - "9546e7511f8bce3dffd5afc66516bc9348cb491fec435899c740783aa8567a75935967" - "beb194b8baea97df841a68192ba41e96ccc309c11aaa4e03c545cbfa74d5de6f146bbd" - "cdcc84e61e30e7cdde3388eb156affe18870052a19f92580f329ed"); - test_valid( - "000000004cd8645221024c759affafc5589872d218ca30377e6d97211c039c375672c1" - "69ba76ce7fad6a21031f4aa4943fa2b731cd99c551d6992021555877b3b32c12538560" - "0fbc1b89c2a92103767a0994daa8babee7215b2371916d09fc1158de3c23feeefaae2d" - "fe5baf483053670132b275522102132685d71b0109fecef0160f1efcab0187eff916f4" - "d472289741bff2666d0e1c2102ed498022f9d618a96f272b1990a640d9f24fb97d2648" - "f8716f9ee22dc008eba721036f66639295ca8e4294c24d63e3fbc11247f6ba6a27b6b4" - "de9a3492f414152d9b5368ae"); - test_valid("0000004c69522102cd53fc53a07f211641a677d250f6de99caf620e8e77071e" - "811a28b3bcddf0be1210362634ab57dae9cb373a5d536e66a8c4f67468bbcfb" - "063809bab643072d78a1242103c5946b3fbae03a654237da863c9ed534e0878" - "657175b132b8ca630f245df04db53ae"); - test_valid( - "00000000000000004dbd0157210231a395e332dde8688800a0025cccc5771ea1aa874a" - "633b8ab6e5c89d300c7c3621026b472f7d59d201ff1f540f111b6eb329e071c30a9d23" - "e3d2bcd128fe73dc254c21027319afb15481dbeb3c426bcc37f9a30e7f51ceff586936" - "d85548d9395bcc2344210294c817150f78607566e961b3c71df53a22022a80acbb982f" - "83c0c8baac040adc2103250c11be0561b1d7ae168b1f59e39cbc1fd1ba3cf4d2140c1a" - "365b2723a2bf9321033ada6ef3b1d93a1978b595c7a9e2aa613860b26d4f5a7abb8857" - "6aa42b3432ad210357f7ed4c118e581f49cd3b4d9dd1edb4295f4def49d6dcf2faaaaa" - "c87a1a0a42210372cd46831f3b6afd4c044d160b7667e8ebf659d6cb51a825a3104df6" - "ee0638c62103ae72827d25030818c4947a800187b1fbcc33ae751e248ae60094cc989f" - "b880f62103b3a7aa25702000c5c1faa300600e8e2bd89cde2be7fb1ec898a39c50d9de" - "90d12103b53899c390573471ba30e5054f78376c5f797fda26dde7a760789f02908cba" - "d22103e05bf6002b62651378b1954820539c36ca405cbb778c225395dd9ebff6780299" - "2103ecd8af1e93c57a1b8c7f917bd9980af798adeb0205e9687865673353eb041e8d5d" - "ae"); - - test_invalid("61"); - test_invalid("01aa02bbcc03ddeeff041122334461"); - test_invalid("4eaa00000063e081551583516962082588bb01b85b3674a2f78c23783a686" - "b27ce302df87876ce1f6762bdd6b1be1a292dc09d4bd09b515909812c6dc1" - "dfb49f2f0c3f84a95380a29e85f744d0aaf28408844a848a866c15c97dcdb" - "5109842acbb0b1fbd4b8a53b98639d8a8d9cd413e6e746741c862a5a72055" - "e3bbaa52c7cc97f0441b81bd75049c01daa7952ce18194192850ff3f07e01" - "af94266824459dc7bcc7451692ec12ccc6b4ac138cb7aaa"); - - return 0; -} diff --git a/firmware/src/powhsm/test/run-all.sh b/firmware/src/powhsm/test/run-all.sh index c1e10bf3..1b6d563c 100755 --- a/firmware/src/powhsm/test/run-all.sh +++ b/firmware/src/powhsm/test/run-all.sh @@ -2,7 +2,7 @@ if [[ $1 == "exec" ]]; then BASEDIR=$(realpath $(dirname $0)) - TESTDIRS="attestation btcscript btctx difficulty heartbeat hsm path_auth srlp svarint trie" + TESTDIRS="attestation btctx difficulty heartbeat hsm path_auth srlp svarint trie" for d in $TESTDIRS; do echo "******************************" echo "Testing $d..."