diff --git a/core/src/apps/bitcoin/sign_tx/bitcoin.py b/core/src/apps/bitcoin/sign_tx/bitcoin.py index 776864f40..5880df256 100644 --- a/core/src/apps/bitcoin/sign_tx/bitcoin.py +++ b/core/src/apps/bitcoin/sign_tx/bitcoin.py @@ -97,6 +97,11 @@ class Bitcoin: # stable device tests. self.orig_txs = [] # type: List[OriginalTxInfo] + # h_inputs is a digest of the inputs streamed for approval in Step 1, which + # is used to ensure that the inputs streamed for verification in Step 3 are + # the same as those in Step 1. + self.h_inputs = None # type: Optional[bytes] + progress.init(tx.inputs_count, tx.outputs_count) def create_hash_writer(self) -> HashWriter: @@ -124,7 +129,7 @@ class Bitcoin: if txi.orig_hash: await self.process_original_input(txi) - self.tx_info.h_inputs = self.tx_info.h_tx_check.get_digest() + self.h_inputs = self.tx_info.get_tx_check_digest() # Finalize original inputs. for orig in self.orig_txs: @@ -170,7 +175,7 @@ class Bitcoin: await self.verify_external_input(i, txi, script_pubkey) # check that the inputs were the same as those streamed for approval - if h_check.get_digest() != self.tx_info.h_inputs: + if h_check.get_digest() != self.h_inputs: raise wire.ProcessError("Transaction has changed during signing") # verify the signature of one SIGHASH_ALL input in each original transaction @@ -554,7 +559,7 @@ class Bitcoin: writers.write_uint32(h_sign, self.get_sighash_type(txi_sign)) # check that the inputs were the same as those streamed for approval - if tx_info.h_tx_check.get_digest() != h_check.get_digest(): + if tx_info.get_tx_check_digest() != h_check.get_digest(): raise wire.ProcessError("Transaction has changed during signing") tx_digest = writers.get_tx_hash(h_sign, double=self.coin.sign_hash_double) diff --git a/core/src/apps/bitcoin/sign_tx/tx_info.py b/core/src/apps/bitcoin/sign_tx/tx_info.py index 3d5d41098..bf483a6c9 100644 --- a/core/src/apps/bitcoin/sign_tx/tx_info.py +++ b/core/src/apps/bitcoin/sign_tx/tx_info.py @@ -122,6 +122,9 @@ class TxInfoBase: def lock_time_disabled(self) -> bool: return self.min_sequence == _SEQUENCE_FINAL + def get_tx_check_digest(self) -> bytes: + return self.h_tx_check.get_digest() + # Used to keep track of the transaction currently being signed. class TxInfo(TxInfoBase): @@ -129,11 +132,6 @@ class TxInfo(TxInfoBase): super().__init__(signer) self.tx = tx - # h_inputs is a digest of the inputs streamed for approval in Step 1, which - # is used to ensure that the inputs streamed for verification in Step 3 are - # the same as those in Step 1. - self.h_inputs = None # type: Optional[bytes] - # Used to keep track of any original transactions which are being replaced by the current transaction. class OriginalTxInfo(TxInfoBase):