mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-25 15:58:08 +00:00
e073e619c9
isort set to skip the first necessary "from common import *" line. A better solution would be to get rid of the need of this import in the future. [no changelog]
136 lines
4.5 KiB
Python
136 lines
4.5 KiB
Python
from common import * # isort:skip
|
|
|
|
from trezor.crypto import bip39
|
|
from trezor.enums import InputScriptType, OutputScriptType
|
|
from trezor.messages import PrevOutput, SignTx, TxInput, TxOutput
|
|
|
|
from apps.bitcoin.common import SigHashType
|
|
from apps.bitcoin.scripts import output_derive_script
|
|
from apps.bitcoin.sign_tx.sig_hasher import BitcoinSigHasher
|
|
from apps.bitcoin.writers import get_tx_hash
|
|
from apps.common import coins
|
|
from apps.common.keychain import Keychain
|
|
from apps.common.paths import AlwaysMatchingSchema
|
|
|
|
|
|
class TestSegwitBip143NativeP2WPKH(unittest.TestCase):
|
|
# pylint: disable=C0301
|
|
|
|
tx = SignTx(
|
|
coin_name="Bitcoin",
|
|
version=1,
|
|
lock_time=0x00000011,
|
|
inputs_count=2,
|
|
outputs_count=2,
|
|
)
|
|
inp1 = TxInput(
|
|
address_n=[0],
|
|
# Trezor expects hash in reversed format
|
|
prev_hash=unhexlify(
|
|
"9f96ade4b41d5433f4eda31e1738ec2b36f6e7d1420d94a6af99801a88f7f7ff"
|
|
),
|
|
prev_index=0,
|
|
amount=625000000, # 6.25 btc
|
|
script_type=InputScriptType.SPENDWITNESS,
|
|
multisig=None,
|
|
sequence=0xFFFFFFEE,
|
|
)
|
|
inp2 = TxInput(
|
|
address_n=[1],
|
|
# Trezor expects hash in reversed format
|
|
prev_hash=unhexlify(
|
|
"8ac60eb9575db5b2d987e29f301b5b819ea83a5c6579d282d189cc04b8e151ef"
|
|
),
|
|
prev_index=1,
|
|
multisig=None,
|
|
amount=600000000, # 6 btc
|
|
script_type=InputScriptType.SPENDWITNESS,
|
|
sequence=0xFFFFFFFF,
|
|
)
|
|
out1 = TxOutput(
|
|
address="1Cu32FVupVCgHkMMRJdYJugxwo2Aprgk7H", # derived
|
|
amount=0x0000000006B22C20,
|
|
script_type=OutputScriptType.PAYTOADDRESS,
|
|
multisig=None,
|
|
address_n=[],
|
|
)
|
|
out2 = TxOutput(
|
|
address="16TZ8J6Q5iZKBWizWzFAYnrsaox5Z5aBRV", # derived
|
|
amount=0x000000000D519390,
|
|
script_type=OutputScriptType.PAYTOADDRESS,
|
|
multisig=None,
|
|
address_n=[],
|
|
)
|
|
|
|
def test_prevouts(self):
|
|
coin = coins.by_name(self.tx.coin_name)
|
|
sig_hasher = BitcoinSigHasher()
|
|
sig_hasher.add_input(self.inp1, b"")
|
|
sig_hasher.add_input(self.inp2, b"")
|
|
prevouts_hash = get_tx_hash(sig_hasher.h_prevouts, double=coin.sign_hash_double)
|
|
self.assertEqual(
|
|
hexlify(prevouts_hash),
|
|
b"96b827c8483d4e9b96712b6713a7b68d6e8003a781feba36c31143470b4efd37",
|
|
)
|
|
|
|
def test_sequence(self):
|
|
coin = coins.by_name(self.tx.coin_name)
|
|
sig_hasher = BitcoinSigHasher()
|
|
sig_hasher.add_input(self.inp1, b"")
|
|
sig_hasher.add_input(self.inp2, b"")
|
|
sequence_hash = get_tx_hash(
|
|
sig_hasher.h_sequences, double=coin.sign_hash_double
|
|
)
|
|
self.assertEqual(
|
|
hexlify(sequence_hash),
|
|
b"52b0a642eea2fb7ae638c36f6252b6750293dbe574a806984b8e4d8548339a3b",
|
|
)
|
|
|
|
def test_outputs(self):
|
|
coin = coins.by_name(self.tx.coin_name)
|
|
sig_hasher = BitcoinSigHasher()
|
|
|
|
for txo in [self.out1, self.out2]:
|
|
script_pubkey = output_derive_script(txo.address, coin)
|
|
txo_bin = PrevOutput(amount=txo.amount, script_pubkey=script_pubkey)
|
|
sig_hasher.add_output(txo_bin, script_pubkey)
|
|
|
|
outputs_hash = get_tx_hash(sig_hasher.h_outputs, double=coin.sign_hash_double)
|
|
self.assertEqual(
|
|
hexlify(outputs_hash),
|
|
b"863ef3e1a92afbfdb97f31ad0fc7683ee943e9abcf2501590ff8f6551f47e5e5",
|
|
)
|
|
|
|
def test_preimage_testdata(self):
|
|
|
|
seed = bip39.seed(
|
|
"alcohol woman abuse must during monitor noble actual mixed trade anger aisle",
|
|
"",
|
|
)
|
|
coin = coins.by_name(self.tx.coin_name)
|
|
sig_hasher = BitcoinSigHasher()
|
|
sig_hasher.add_input(self.inp1, b"")
|
|
sig_hasher.add_input(self.inp2, b"")
|
|
|
|
for txo in [self.out1, self.out2]:
|
|
script_pubkey = output_derive_script(txo.address, coin)
|
|
txo_bin = PrevOutput(amount=txo.amount, script_pubkey=script_pubkey)
|
|
sig_hasher.add_output(txo_bin, script_pubkey)
|
|
|
|
keychain = Keychain(seed, coin.curve_name, [AlwaysMatchingSchema])
|
|
node = keychain.derive(self.inp2.address_n)
|
|
|
|
# test data public key hash
|
|
# only for input 2 - input 1 is not segwit
|
|
result = sig_hasher.hash143(
|
|
self.inp2, [node.public_key()], 1, self.tx, coin, SigHashType.SIGHASH_ALL
|
|
)
|
|
self.assertEqual(
|
|
hexlify(result),
|
|
b"2fa3f1351618b2532228d7182d3221d95c21fd3d496e7e22e9ded873cf022a8b",
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|