chore(tests): make all the device tests work with UI2

pull/2643/head
grdddj 2 years ago committed by Martin Milata
parent 5187be91fe
commit f48890afb3

@ -1081,8 +1081,8 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// def confirm_action(
/// *,
/// title: str,
/// action: str | None = None,
/// description: str | None = None,
/// action: str | None,
/// description: str | None,
/// verb: str | None = None,
/// verb_cancel: str | None = None,
/// hold: bool = False,

@ -60,8 +60,8 @@ INFO: object
def confirm_action(
*,
title: str,
action: str | None = None,
description: str | None = None,
action: str | None,
description: str | None,
verb: str | None = None,
verb_cancel: str | None = None,
hold: bool = False,

@ -447,6 +447,8 @@ def test_sign_tx_spend(client: Client):
request_output(0),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.SignTx),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_output(0),

@ -72,13 +72,16 @@ def test_send_bch_change(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_bc37c2),
request_input(0, TXHASH_bc37c2),
@ -123,13 +126,16 @@ def test_send_bch_nochange(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_502e85),
request_input(0, TXHASH_502e85),
@ -180,13 +186,16 @@ def test_send_bch_oldaddr(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_502e85),
request_input(0, TXHASH_502e85),
@ -249,6 +258,7 @@ def test_attack_change_input(client: Client):
return msg
with client:
tt = client.features.model == "T"
client.set_filter(messages.TxAck, attack_processor)
client.set_expected_responses(
[
@ -256,7 +266,9 @@ def test_attack_change_input(client: Client):
request_output(0),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_bd32ff),
request_input(0, FAKE_TXHASH_bd32ff),
@ -323,12 +335,15 @@ def test_send_bch_multisig_wrongchange(client: Client):
amount=23_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_062fbd),
request_input(0, FAKE_TXHASH_062fbd),
@ -390,13 +405,16 @@ def test_send_bch_multisig_change(client: Client):
amount=24_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_203416),
request_input(0, FAKE_TXHASH_203416),
@ -433,8 +451,10 @@ def test_send_bch_multisig_change(client: Client):
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_203416),
request_input(0, FAKE_TXHASH_203416),
@ -489,12 +509,14 @@ def test_send_bch_external_presigned(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_meta(TXHASH_502e85),

@ -71,13 +71,16 @@ def test_send_bitcoin_gold_change(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_6f0398),
request_input(0, FAKE_TXHASH_6f0398),
@ -123,13 +126,16 @@ def test_send_bitcoin_gold_nochange(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_6f0398),
request_input(0, FAKE_TXHASH_6f0398),
@ -191,6 +197,7 @@ def test_attack_change_input(client: Client):
return msg
with client:
tt = client.features.model == "T"
client.set_filter(messages.TxAck, attack_processor)
client.set_expected_responses(
[
@ -198,7 +205,9 @@ def test_attack_change_input(client: Client):
request_output(0),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_6f0398),
request_input(0, FAKE_TXHASH_6f0398),
@ -251,13 +260,16 @@ def test_send_btg_multisig_change(client: Client):
amount=1_252_382_934 - 24_000 - 1_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_a63dbe),
request_input(0, FAKE_TXHASH_a63dbe),
@ -294,8 +306,10 @@ def test_send_btg_multisig_change(client: Client):
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_a63dbe),
request_input(0, FAKE_TXHASH_a63dbe),
@ -342,14 +356,18 @@ def test_send_p2sh(client: Client):
amount=1_252_382_934 - 11_000 - 12_300_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_db7239),
request_input(0, FAKE_TXHASH_db7239),
@ -393,13 +411,16 @@ def test_send_p2sh_witness_change(client: Client):
amount=1_252_382_934 - 11_000 - 12_300_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_db7239),
request_input(0, FAKE_TXHASH_db7239),
@ -452,12 +473,15 @@ def test_send_multisig_1(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_7f1f6b),
request_input(0, FAKE_TXHASH_7f1f6b),
@ -479,7 +503,9 @@ def test_send_multisig_1(client: Client):
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_7f1f6b),
request_input(0, FAKE_TXHASH_7f1f6b),
@ -573,6 +599,7 @@ def test_send_btg_external_presigned(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_meta(FAKE_TXHASH_6f0398),

@ -57,12 +57,15 @@ def test_send_dash(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(inp1.prev_hash),
request_input(0, inp1.prev_hash),
@ -103,13 +106,16 @@ def test_send_dash_dip2_input(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(inp1.prev_hash),
request_input(0, inp1.prev_hash),

@ -72,13 +72,16 @@ def test_send_decred(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.FeeOverThreshold),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_4d8acd),
request_input(0, FAKE_TXHASH_4d8acd),
@ -133,9 +136,11 @@ def test_purchase_ticket_decred(client: Client):
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
request_output(1),
request_output(2),
messages.ButtonRequest(code=B.SignTx),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_meta(FAKE_TXHASH_4d8acd),
request_input(0, FAKE_TXHASH_4d8acd),
@ -191,13 +196,16 @@ def test_spend_from_stake_generation_and_revocation_decred(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_f8e2f2),
request_input(0, FAKE_TXHASH_f8e2f2),
@ -271,6 +279,7 @@ def test_send_decred_change(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
@ -278,8 +287,10 @@ def test_send_decred_change(client: Client):
request_input(2),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_4d8acd),
request_input(0, FAKE_TXHASH_4d8acd),
@ -376,6 +387,7 @@ def test_decred_multisig_change(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
@ -383,7 +395,9 @@ def test_decred_multisig_change(client: Client):
request_output(0),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_9ac7d2),
request_input(0, FAKE_TXHASH_9ac7d2),

@ -45,7 +45,9 @@ VECTORS = ( # path, script_type, address
@pytest.mark.parametrize("path, script_type, address", VECTORS)
def test_show(client: Client, path, script_type, address):
def test_show(
client: Client, path: str, script_type: messages.InputScriptType, address: str
):
def input_flow():
yield
client.debug.press_no()
@ -184,7 +186,12 @@ VECTORS_MULTISIG = ( # script_type, bip48_type, address, xpubs, ignore_xpub_mag
"script_type, bip48_type, address, xpubs, ignore_xpub_magic", VECTORS_MULTISIG
)
def test_show_multisig_xpubs(
client, script_type, bip48_type, address, xpubs, ignore_xpub_magic
client: Client,
script_type: messages.InputScriptType,
bip48_type: int,
address: str,
xpubs: list[str],
ignore_xpub_magic: bool,
):
nodes = [
btc.get_public_node(
@ -205,43 +212,29 @@ def test_show_multisig_xpubs(
def input_flow():
yield # show address
lines = client.debug.wait_layout().lines # TODO: do not need to *wait* now?
assert lines[0] == "Multisig 2 of 3"
assert "".join(lines[1:]) == address
layout = client.debug.wait_layout() # TODO: do not need to *wait* now?
assert layout.get_title() == "MULTISIG 2 OF 3"
assert layout.get_content() == address
client.debug.press_no()
yield # show QR code
assert client.debug.wait_layout().text.startswith("Qr")
client.debug.press_no()
yield # show XPUB#1
lines1 = client.debug.wait_layout().lines
assert lines1[0] == "XPUB #1 " + ("(yours)" if i == 0 else "(cosigner)")
client.debug.swipe_up()
assert "Painter" in client.debug.wait_layout().text
lines2 = client.debug.wait_layout().lines
assert lines2[0] == "XPUB #1 " + ("(yours)" if i == 0 else "(cosigner)")
assert "".join(lines1[1:] + lines2[1:]) == xpubs[0]
# Three xpub pages with the same testing logic
for xpub_num in range(3):
expected_title = f"XPUB #{xpub_num + 1} " + (
"(yours)" if i == xpub_num else "(cosigner)"
)
client.debug.press_no()
yield # show XPUB#2
lines1 = client.debug.wait_layout().lines
assert lines1[0] == "XPUB #2 " + ("(yours)" if i == 1 else "(cosigner)")
client.debug.swipe_up()
lines2 = client.debug.wait_layout().lines
assert lines2[0] == "XPUB #2 " + ("(yours)" if i == 1 else "(cosigner)")
assert "".join(lines1[1:] + lines2[1:]) == xpubs[1]
client.debug.press_no()
yield # show XPUB#3
lines1 = client.debug.wait_layout().lines
assert lines1[0] == "XPUB #3 " + ("(yours)" if i == 2 else "(cosigner)")
client.debug.swipe_up()
client.debug.press_no()
yield # show XPUB#{xpub_num}
layout1 = client.debug.wait_layout()
assert layout1.get_title() == expected_title
client.debug.swipe_up()
lines2 = client.debug.wait_layout().lines
assert lines2[0] == "XPUB #3 " + ("(yours)" if i == 2 else "(cosigner)")
assert "".join(lines1[1:] + lines2[1:]) == xpubs[2]
layout2 = client.debug.wait_layout()
assert layout2.get_title() == expected_title
assert layout1.get_content() + layout2.get_content() == xpubs[xpub_num]
client.debug.press_yes()

@ -61,13 +61,16 @@ def test_one_one_fee_sapling(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_2807c),
request_input(0, TXHASH_2807c),
@ -124,15 +127,19 @@ def test_one_one_rewards_claim(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_7b28bd),
request_input(0, TXHASH_7b28bd),

@ -82,11 +82,14 @@ def test_2_of_3(client: Client):
)
# Expected responses are the same for both two signings
tt = client.features.model == "T"
expected_responses = [
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_6b07c1),
request_input(0, TXHASH_6b07c1),

@ -138,7 +138,13 @@ INP3 = messages.TxInputType(
)
def _responses(INP1, INP2, change=0):
def _responses(
client: Client,
INP1: messages.TxInputType,
INP2: messages.TxInputType,
change: int = 0,
):
tt = client.features.model == "T"
resp = [
request_input(0),
request_input(1),
@ -146,11 +152,16 @@ def _responses(INP1, INP2, change=0):
]
if change != 1:
resp.append(messages.ButtonRequest(code=B.ConfirmOutput))
if tt:
resp.append(messages.ButtonRequest(code=B.ConfirmOutput))
resp.append(request_output(1))
if change != 2:
resp.append(messages.ButtonRequest(code=B.ConfirmOutput))
if tt:
resp.append(messages.ButtonRequest(code=B.ConfirmOutput))
resp += [
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(INP1.prev_hash),
request_input(0, INP1.prev_hash),
@ -191,7 +202,7 @@ def test_external_external(client: Client):
)
with client:
client.set_expected_responses(_responses(INP1, INP2))
client.set_expected_responses(_responses(client, INP1, INP2))
_, serialized_tx = btc.sign_tx(
client,
"Bitcoin",
@ -222,7 +233,7 @@ def test_external_internal(client: Client):
)
with client:
client.set_expected_responses(_responses(INP1, INP2, change=2))
client.set_expected_responses(_responses(client, INP1, INP2, change=2))
_, serialized_tx = btc.sign_tx(
client,
"Bitcoin",
@ -253,7 +264,7 @@ def test_internal_external(client: Client):
)
with client:
client.set_expected_responses(_responses(INP1, INP2, change=1))
client.set_expected_responses(_responses(client, INP1, INP2, change=1))
_, serialized_tx = btc.sign_tx(
client,
"Bitcoin",
@ -284,7 +295,7 @@ def test_multisig_external_external(client: Client):
)
with client:
client.set_expected_responses(_responses(INP1, INP2))
client.set_expected_responses(_responses(client, INP1, INP2))
_, serialized_tx = btc.sign_tx(
client,
"Bitcoin",
@ -323,7 +334,7 @@ def test_multisig_change_match_first(client: Client):
)
with client:
client.set_expected_responses(_responses(INP1, INP2, change=1))
client.set_expected_responses(_responses(client, INP1, INP2, change=1))
_, serialized_tx = btc.sign_tx(
client,
"Bitcoin",
@ -362,7 +373,7 @@ def test_multisig_change_match_second(client: Client):
)
with client:
client.set_expected_responses(_responses(INP1, INP2, change=2))
client.set_expected_responses(_responses(client, INP1, INP2, change=2))
_, serialized_tx = btc.sign_tx(
client,
"Bitcoin",
@ -401,7 +412,7 @@ def test_multisig_mismatch_change(client: Client):
)
with client:
client.set_expected_responses(_responses(INP1, INP2))
client.set_expected_responses(_responses(client, INP1, INP2))
_, serialized_tx = btc.sign_tx(
client,
"Bitcoin",
@ -440,7 +451,7 @@ def test_multisig_mismatch_inputs(client: Client):
)
with client:
client.set_expected_responses(_responses(INP1, INP3))
client.set_expected_responses(_responses(client, INP1, INP3))
_, serialized_tx = btc.sign_tx(
client,
"Bitcoin",

@ -63,14 +63,17 @@ def test_opreturn(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_4075a1),
request_input(0, TXHASH_4075a1),

@ -18,7 +18,12 @@
import pytest
from trezorlib import btc, messages
from trezorlib.debuglink import TrezorClientDebugLink as Client, message_filters
from trezorlib.debuglink import (
LayoutContent,
TrezorClientDebugLink as Client,
message_filters,
multipage_content,
)
from trezorlib.tools import parse_path
S = messages.InputScriptType
@ -282,39 +287,30 @@ MESSAGE_LENGTHS = (
@pytest.mark.skip_t1
@pytest.mark.parametrize("message", MESSAGE_LENGTHS)
def test_signmessage_pagination(client: Client, message):
def test_signmessage_pagination(client: Client, message: str):
message_read = ""
def input_flow():
# collect screen contents into `message_read`.
# Join lines that are separated by a single "-" string, space-separate lines otherwise.
# Using a helper debuglink function to assemble the final text.
nonlocal message_read
layouts: list[LayoutContent] = []
# confirm address
br = yield
layout = client.debug.wait_layout()
client.debug.wait_layout()
client.debug.press_yes()
# start assuming there was a word break; this avoids prepending space at start
word_break = True
br = yield
for i in range(br.pages):
layout = client.debug.wait_layout()
for line in layout.lines[1:]:
if line == "-":
# next line will be attached without space
word_break = True
elif word_break:
# attach without space, reset word_break
message_read += line
word_break = False
else:
# attach with space
message_read += " " + line
layouts.append(layout)
if i < br.pages - 1:
client.debug.swipe_up()
message_read = multipage_content(layouts)
client.debug.press_yes()
with client:
@ -326,7 +322,10 @@ def test_signmessage_pagination(client: Client, message):
n=parse_path("m/44h/0h/0h/0/0"),
message=message,
)
assert "Confirm message: " + message.replace("\n", " ") == message_read
# We cannot differentiate between a newline and space in the message read from Trezor.
expected_message = "Confirm message: " + message.replace("\n", " ").rstrip()
assert expected_message == message_read
@pytest.mark.skip_t1

@ -104,12 +104,15 @@ def test_one_one_fee(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_0dac36),
request_input(0, TXHASH_0dac36),
@ -156,13 +159,16 @@ def test_testnet_one_two_fee(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_e5040e),
request_input(0, TXHASH_e5040e),
@ -205,13 +211,16 @@ def test_testnet_fee_high_warning(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.FeeOverThreshold),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_25fee5),
request_input(0, TXHASH_25fee5),
@ -256,13 +265,16 @@ def test_one_two_fee(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_50f6f1),
request_input(0, TXHASH_50f6f1),
@ -316,15 +328,19 @@ def test_one_three_fee(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(2),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_bb5169),
request_input(0, TXHASH_bb5169),
@ -384,6 +400,7 @@ def test_two_two(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
@ -391,7 +408,9 @@ def test_two_two(client: Client):
request_output(0),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_ac4ca0),
request_input(0, TXHASH_ac4ca0),
@ -527,16 +546,19 @@ def test_lots_of_change(client: Client):
request_change_outputs = [request_output(i + 1) for i in range(cnt)]
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
]
+ request_change_outputs
+ [
messages.ButtonRequest(code=B.SignTx),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_892d06),
request_input(0, TXHASH_892d06),
@ -577,13 +599,16 @@ def test_fee_high_warning(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.FeeOverThreshold),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_1f326f),
request_input(0, TXHASH_1f326f),
@ -636,7 +661,13 @@ def test_fee_high_hardfail(client: Client):
def input_flow():
nonlocal finished
for expected in (B.ConfirmOutput, B.FeeOverThreshold, B.SignTx):
for expected in (
B.ConfirmOutput,
B.ConfirmOutput,
B.FeeOverThreshold,
B.SignTx,
B.SignTx,
):
br = yield
assert br.code == expected
client.debug.press_yes()
@ -673,11 +704,13 @@ def test_not_enough_funds(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.Failure(code=messages.FailureType.NotEnoughFunds),
]
)
@ -702,12 +735,15 @@ def test_p2sh(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_58d56a),
request_input(0, TXHASH_58d56a),
@ -788,6 +824,7 @@ def test_attack_change_outputs(client: Client):
# Test if the transaction can be signed normally
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
@ -795,7 +832,9 @@ def test_attack_change_outputs(client: Client):
request_output(0),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_ac4ca0),
request_input(0, TXHASH_ac4ca0),
@ -954,14 +993,17 @@ def test_attack_change_input_address(client: Client):
# Now run the attack, must trigger the exception
with client:
tt = client.features.model == "T"
client.set_filter(messages.TxAck, attack_processor)
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_d2dcda),
request_input(0, TXHASH_d2dcda),
@ -1004,12 +1046,15 @@ def test_spend_coinbase(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(FAKE_TXHASH_005f6f),
request_input(0, FAKE_TXHASH_005f6f),
@ -1061,14 +1106,17 @@ def test_two_changes(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
request_output(2),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_e5040e),
request_input(0, TXHASH_e5040e),
@ -1119,13 +1167,16 @@ def test_change_on_main_chain_allowed(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_e5040e),
request_input(0, TXHASH_e5040e),
@ -1380,13 +1431,16 @@ def test_lock_time(client: Client, lock_time, sequence):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_0dac36),
request_input(0, TXHASH_0dac36),
@ -1431,6 +1485,9 @@ def test_lock_time_blockheight(client: Client):
yield # confirm output
client.debug.wait_layout()
client.debug.press_yes()
yield # confirm output
client.debug.wait_layout()
client.debug.press_yes()
yield # confirm locktime
layout = client.debug.wait_layout()
@ -1440,6 +1497,8 @@ def test_lock_time_blockheight(client: Client):
yield # confirm transaction
client.debug.press_yes()
yield # confirm transaction
client.debug.press_yes()
with client:
client.set_input_flow(input_flow)
@ -1480,6 +1539,9 @@ def test_lock_time_datetime(client: Client, lock_time_str):
yield # confirm output
client.debug.wait_layout()
client.debug.press_yes()
yield # confirm output
client.debug.wait_layout()
client.debug.press_yes()
yield # confirm locktime
layout = client.debug.wait_layout()
@ -1489,6 +1551,8 @@ def test_lock_time_datetime(client: Client, lock_time_str):
yield # confirm transaction
client.debug.press_yes()
yield # confirm transaction
client.debug.press_yes()
lock_time_naive = datetime.strptime(lock_time_str, "%Y-%m-%d %H:%M:%S")
lock_time_utc = lock_time_naive.replace(tzinfo=timezone.utc)

@ -222,10 +222,13 @@ def test_p2wpkh_in_p2sh_presigned(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
request_output(2),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_meta(TXHASH_20912f),
@ -270,10 +273,13 @@ def test_p2wpkh_in_p2sh_presigned(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
request_output(2),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_meta(TXHASH_20912f),
@ -399,6 +405,7 @@ def test_p2wsh_external_presigned(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_meta(TXHASH_ec16dc),
@ -443,6 +450,7 @@ def test_p2wsh_external_presigned(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_meta(TXHASH_ec16dc),
@ -507,6 +515,7 @@ def test_p2tr_external_presigned(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
request_input(1),
@ -538,6 +547,7 @@ def test_p2tr_external_presigned(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
request_input(1),
@ -607,8 +617,10 @@ def test_p2wpkh_with_proof(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_meta(TXHASH_e5b7e2),
@ -697,6 +709,7 @@ def test_p2tr_with_proof(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_input(1),

@ -200,14 +200,22 @@ def test_payment_request_details(client: Client):
layout = client.debug.wait_layout()
assert outputs[0].address[:16] in layout.text
client.debug.press_yes()
yield # confirm first output
client.debug.wait_layout()
client.debug.press_yes()
yield # confirm second output
layout = client.debug.wait_layout()
assert outputs[1].address[:16] in layout.text
client.debug.press_yes()
yield # confirm second output
client.debug.wait_layout()
client.debug.press_yes()
yield # confirm transaction
client.debug.press_yes()
yield # confirm transaction
client.debug.press_yes()
with client:
client.set_input_flow(input_flow)

@ -65,14 +65,18 @@ def test_send_p2sh(client: Client):
amount=123_456_789 - 11_000 - 12_300_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_20912f),
request_input(0, TXHASH_20912f),
@ -116,13 +120,16 @@ def test_send_p2sh_change(client: Client):
amount=123_456_789 - 11_000 - 12_300_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_20912f),
request_input(0, TXHASH_20912f),
@ -170,12 +177,15 @@ def test_testnet_segwit_big_amount(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(prev_hash),
request_input(0, prev_hash),
@ -226,11 +236,14 @@ def test_send_multisig_1(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
tt = client.features.model == "T"
expected_responses = [
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_338e2d),
request_input(0, TXHASH_338e2d),
@ -292,15 +305,19 @@ def test_attack_change_input_address(client: Client):
# Test if the transaction can be signed normally.
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
# The user is required to confirm transfer to another account.
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_20912f),
request_input(0, TXHASH_20912f),
@ -369,13 +386,16 @@ def test_attack_mixed_inputs(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
tt = client.features.model == "T"
expected_responses = [
request_input(0),
request_input(1),
request_output(0),
messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput),
(tt, messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput)),
messages.ButtonRequest(code=messages.ButtonRequestType.FeeOverThreshold),
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
(tt, messages.ButtonRequest(code=messages.ButtonRequestType.SignTx)),
request_input(0),
request_meta(TXHASH_e5040e),
request_input(0, TXHASH_e5040e),

@ -81,14 +81,18 @@ def test_send_p2sh(client: Client):
amount=123_456_789 - 11_000 - 12_300_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_20912f),
request_input(0, TXHASH_20912f),
@ -134,13 +138,16 @@ def test_send_p2sh_change(client: Client):
amount=123_456_789 - 11_000 - 12_300_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_20912f),
request_input(0, TXHASH_20912f),
@ -186,14 +193,18 @@ def test_send_native(client: Client):
amount=100_000 - 40_000 - 10_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_b36780),
request_input(0, TXHASH_b36780),
@ -271,13 +282,16 @@ def test_send_native_change(client: Client):
amount=100_000 - 40_000 - 10_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_fcb3f5),
request_input(0, TXHASH_fcb3f5),
@ -337,17 +351,22 @@ def test_send_both(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(2),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_65047a),
request_input(0, TXHASH_65047a),
@ -417,11 +436,14 @@ def test_send_multisig_1(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
tt = client.features.model == "T"
expected_responses = [
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_b9abfa),
request_input(0, TXHASH_b9abfa),
@ -493,11 +515,14 @@ def test_send_multisig_2(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
tt = client.features.model == "T"
expected_responses = [
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_b9abfa),
request_input(0, TXHASH_b9abfa),
@ -576,10 +601,12 @@ def test_send_multisig_3_change(client: Client):
script_type=messages.OutputScriptType.PAYTOP2SHWITNESS,
)
tt = client.features.model == "T"
expected_responses = [
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_b9abfa),
request_input(0, TXHASH_b9abfa),
@ -659,10 +686,12 @@ def test_send_multisig_4_change(client: Client):
script_type=messages.OutputScriptType.PAYTOWITNESS,
)
tt = client.features.model == "T"
expected_responses = [
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_b9abfa),
request_input(0, TXHASH_b9abfa),
@ -757,16 +786,20 @@ def test_multisig_mismatch_inputs_single(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
# Ensure that the multisig output is not identified as a change output.
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_1c022d),
request_input(0, TXHASH_1c022d),

@ -78,12 +78,15 @@ def test_send_p2tr(client: Client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_output(0),
request_input(0),
@ -131,14 +134,17 @@ def test_send_two_with_change(client: Client):
amount=6_800 + 13_000 - 200 - 15_000,
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_input(1),
request_output(0),
@ -219,6 +225,7 @@ def test_send_mixed(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
# process inputs
@ -229,15 +236,20 @@ def test_send_mixed(client: Client):
# approve outputs
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(2),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(3),
messages.ButtonRequest(code=B.ConfirmOutput),
request_output(4),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
# verify inputs
request_input(0),
request_meta(TXHASH_8c3ea7),
@ -346,6 +358,7 @@ def test_attack_script_type(client: Client):
return msg
with client:
tt = client.features.model == "T"
client.set_filter(messages.TxAck, attack_processor)
client.set_expected_responses(
[
@ -353,7 +366,9 @@ def test_attack_script_type(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_input(1),
request_output(0),
@ -381,7 +396,7 @@ def test_attack_script_type(client: Client):
"tb1pllllllllllllllllllllllllllllllllllllllllllllallllscqgl4zhn",
),
)
def test_send_invalid_address(client: Client, address):
def test_send_invalid_address(client: Client, address: str):
inp1 = messages.TxInputType(
# tb1pn2d0yjeedavnkd8z8lhm566p0f2utm3lgvxrsdehnl94y34txmts5s7t4c
address_n=parse_path("m/86h/1h/0h/1/0"),

@ -106,12 +106,15 @@ def test_one_one_fee_sapling(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_e38206),
request_input(0, TXHASH_e38206),
@ -264,6 +267,7 @@ def test_external_presigned(client: Client):
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.ConfirmOutput),
messages.ButtonRequest(code=B.SignTx),
request_input(0),
request_meta(TXHASH_e38206),

@ -126,11 +126,15 @@ def test_data_streaming(client: Client):
checked in vectorized function above.
"""
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
(tt, messages.ButtonRequest(code=messages.ButtonRequestType.Other)),
(tt, messages.ButtonRequest(code=messages.ButtonRequestType.SignTx)),
(tt, messages.ButtonRequest(code=messages.ButtonRequestType.SignTx)),
message_filters.EthereumTxRequest(
data_length=1_024,
signature_r=None,
@ -325,7 +329,9 @@ def test_sanity_checks_eip1559(client: Client):
)
def input_flow_skip(client: Client, cancel=False):
def input_flow_skip(client: Client, cancel: bool = False):
pytest.skip("Skip not supported")
yield # confirm sending
client.debug.press_yes()
@ -338,14 +344,13 @@ def input_flow_skip(client: Client, cancel=False):
client.debug.press_yes()
def input_flow_scroll_down(client: Client, cancel=False):
def input_flow_scroll_down(client: Client, cancel: bool = False):
yield # confirm sending
client.debug.wait_layout()
client.debug.press_yes()
yield # confirm data
yield
client.debug.wait_layout()
client.debug.click(SHOW_ALL)
client.debug.press_yes()
br = yield # paginated data
for i in range(br.pages):
@ -354,16 +359,20 @@ def input_flow_scroll_down(client: Client, cancel=False):
client.debug.swipe_up()
client.debug.press_yes()
yield # confirm data
yield # confirm fee
if cancel:
client.debug.press_no()
else:
client.debug.press_yes()
yield # maximum fee
client.debug.press_yes()
yield # hold to confirm
client.debug.press_yes()
def input_flow_go_back(client: Client, cancel=False):
def input_flow_go_back(client: Client, cancel: bool = False):
pytest.skip("Go back not supported")
br = yield # confirm sending
client.debug.wait_layout()
client.debug.press_yes()

@ -31,6 +31,7 @@ pytestmark = [
# assertion data from T1
def test_nem_signtx_simple(client: Client):
tt = client.features.model == "T"
with client:
client.set_expected_responses(
[
@ -38,6 +39,12 @@ def test_nem_signtx_simple(client: Client):
messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput),
# Unencrypted message
messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput),
(
tt,
messages.ButtonRequest(
code=messages.ButtonRequestType.ConfirmOutput
),
),
# Confirm recipient
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
messages.NEMSignedTx,
@ -75,12 +82,19 @@ def test_nem_signtx_simple(client: Client):
@pytest.mark.setup_client(mnemonic=MNEMONIC12)
def test_nem_signtx_encrypted_payload(client: Client):
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
# Confirm transfer and network fee
messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput),
# Ask for encryption
messages.ButtonRequest(code=messages.ButtonRequestType.ConfirmOutput),
(
tt,
messages.ButtonRequest(
code=messages.ButtonRequestType.ConfirmOutput
),
),
# Confirm recipient
messages.ButtonRequest(code=messages.ButtonRequestType.SignTx),
messages.NEMSignedTx,

@ -47,20 +47,19 @@ def do_recover_legacy(client: Client, mnemonic, **kwargs):
def do_recover_core(client: Client, mnemonic, **kwargs):
layout = client.debug.wait_layout
def input_flow():
yield
layout = client.debug.wait_layout()
assert "check the recovery seed" in layout.text.replace("\n", " ")
assert "check the recovery seed" in layout().get_content()
client.debug.click(buttons.OK)
yield
layout = client.debug.wait_layout()
assert "Select number of words" in layout.text
assert "Select number of words" in layout().get_content()
client.debug.click(buttons.OK)
yield
layout = client.debug.wait_layout()
assert layout.text == "WordSelector"
assert "SelectWordCount" in layout().text
# click the number
word_option_offset = 6
word_options = (12, 18, 20, 24, 33)
@ -68,8 +67,7 @@ def do_recover_core(client: Client, mnemonic, **kwargs):
client.debug.click(buttons.grid34(index % 3, index // 3))
yield
layout = client.debug.wait_layout()
assert "Enter recovery seed" in layout.text
assert "Enter recovery seed" in layout().get_content()
client.debug.click(buttons.OK)
yield
@ -116,49 +114,43 @@ def test_invalid_seed_t1(client: Client):
@pytest.mark.skip_t1
def test_invalid_seed_core(client: Client):
layout = client.debug.wait_layout
def input_flow():
yield
layout = client.debug.wait_layout()
assert "check the recovery seed" in layout.text.replace("\n", " ")
assert "check the recovery seed" in layout().get_content()
client.debug.click(buttons.OK)
yield
layout = client.debug.wait_layout()
assert "Select number of words" in layout.text
assert "Select number of words" in layout().get_content()
client.debug.click(buttons.OK)
yield
layout = client.debug.wait_layout()
assert layout.text == "WordSelector"
assert "SelectWordCount" in layout().text
# select 12 words
client.debug.click(buttons.grid34(0, 2))
yield
layout = client.debug.wait_layout()
assert "Enter recovery seed" in layout.text
assert "Enter recovery seed" in layout().get_content()
client.debug.click(buttons.OK)
yield
for _ in range(12):
layout = client.debug.wait_layout()
assert layout.text == "Bip39Keyboard"
assert layout().text == "< MnemonicKeyboard >"
client.debug.input("stick")
br = yield
layout = client.debug.wait_layout()
assert br.code == messages.ButtonRequestType.Warning
assert "invalid recovery seed" in layout.text
assert "invalid recovery seed" in layout().get_content()
client.debug.click(buttons.OK)
yield
# retry screen
layout = client.debug.wait_layout()
assert "Select number of words" in layout.text
assert "Select number of words" in layout().get_content()
client.debug.click(buttons.CANCEL)
yield
layout = client.debug.wait_layout()
assert "abort" in layout.text
assert "ABORT SEED CHECK" == layout().get_title()
client.debug.click(buttons.OK)
with client:

@ -31,36 +31,36 @@ def test_tt_pin_passphrase(client: Client):
def input_flow():
yield
assert "Do you really want to recover a wallet?" in layout().text
assert "Do you really want to recover a wallet?" in layout().get_content()
client.debug.press_yes()
yield
assert layout().text == "PinDialog"
assert layout().text == "< PinKeyboard >"
client.debug.input("654")
yield
assert layout().text == "PinDialog"
assert layout().text == "< PinKeyboard >"
client.debug.input("654")
yield
assert "Select number of words" in layout().text
assert "Select number of words" in layout().get_content()
client.debug.press_yes()
yield
assert "WordSelector" in layout().text
assert "SelectWordCount" in layout().text
client.debug.input(str(len(mnemonic)))
yield
assert "Enter recovery seed" in layout().text
assert "Enter recovery seed" in layout().get_content()
client.debug.press_yes()
yield
for word in mnemonic:
assert layout().text == "Bip39Keyboard"
assert layout().text == "< MnemonicKeyboard >"
client.debug.input(word)
yield
assert "You have successfully recovered your wallet." in layout().text
assert "You have successfully recovered your wallet." in layout().get_content()
client.debug.press_yes()
with client:
@ -85,28 +85,28 @@ def test_tt_nopin_nopassphrase(client: Client):
def input_flow():
yield
assert "Do you really want to recover a wallet?" in layout().text
assert "Do you really want to recover a wallet?" in layout().get_content()
client.debug.press_yes()
yield
assert "Select number of words" in layout().text
assert "Select number of words" in layout().get_content()
client.debug.press_yes()
yield
assert "WordSelector" in layout().text
assert "SelectWordCount" in layout().text
client.debug.input(str(len(mnemonic)))
yield
assert "Enter recovery seed" in layout().text
assert "Enter recovery seed" in layout().get_content()
client.debug.press_yes()
yield
for word in mnemonic:
assert layout().text == "Bip39Keyboard"
assert layout().text == "< MnemonicKeyboard >"
client.debug.input(word)
yield
assert "You have successfully recovered your wallet." in layout().text
assert "You have successfully recovered your wallet." in layout().get_content()
client.debug.press_yes()
with client:

@ -354,6 +354,7 @@ def test_signtx(client: Client):
_assert_protection(client)
with client:
tt = client.features.model == "T"
client.use_pin_sequence([PIN4])
client.set_expected_responses(
[
@ -362,7 +363,9 @@ def test_signtx(client: Client):
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_meta(TXHASH_50f6f1),
request_input(0, TXHASH_50f6f1),

@ -49,21 +49,23 @@ def test_sd_no_format(client: Client):
@pytest.mark.sd_card
@pytest.mark.setup_client(pin="1234")
def test_sd_protect_unlock(client: Client):
layout = client.debug.wait_layout
def input_flow_enable_sd_protect():
yield # Enter PIN to unlock device
assert "PinDialog" == client.debug.wait_layout().text
assert "< PinKeyboard >" == layout().text
client.debug.input("1234")
yield # do you really want to enable SD protection
assert "SD card protection" in client.debug.wait_layout().text
assert "SD card protection" in layout().get_content()
client.debug.press_yes()
yield # enter current PIN
assert "PinDialog" == client.debug.wait_layout().text
assert "< PinKeyboard >" == layout().text
client.debug.input("1234")
yield # you have successfully enabled SD protection
assert "Success" in client.debug.wait_layout().text
assert "You have successfully enabled SD protection." in layout().get_content()
client.debug.press_yes()
with client:
@ -73,23 +75,23 @@ def test_sd_protect_unlock(client: Client):
def input_flow_change_pin():
yield # do you really want to change PIN?
assert "Change PIN" in client.debug.wait_layout().text
assert "CHANGE PIN" == layout().get_title()
client.debug.press_yes()
yield # enter current PIN
assert "PinDialog" == client.debug.wait_layout().text
assert "< PinKeyboard >" == layout().text
client.debug.input("1234")
yield # enter new PIN
assert "PinDialog" == client.debug.wait_layout().text
assert "< PinKeyboard >" == layout().text
client.debug.input("1234")
yield # enter new PIN again
assert "PinDialog" == client.debug.wait_layout().text
assert "< PinKeyboard >" == layout().text
client.debug.input("1234")
yield # Pin change successful
assert "Success" in client.debug.wait_layout().text
assert "You have successfully changed your PIN." in layout().get_content()
client.debug.press_yes()
with client:
@ -101,15 +103,15 @@ def test_sd_protect_unlock(client: Client):
def input_flow_change_pin_format():
yield # do you really want to change PIN?
assert "Change PIN" in client.debug.wait_layout().text
assert "CHANGE PIN" == layout().get_title()
client.debug.press_yes()
yield # enter current PIN
assert "PinDialog" == client.debug.wait_layout().text
assert "< PinKeyboard >" == layout().text
client.debug.input("1234")
yield # SD card problem
assert "Wrong SD card" in client.debug.wait_layout().text
assert "Wrong SD card" in layout().get_content()
client.debug.press_no() # close
with client, pytest.raises(TrezorFailure) as e:

@ -95,12 +95,15 @@ def test_spend_v4_input(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_output(0),
request_finished(),
@ -142,12 +145,15 @@ def test_send_to_multisig(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_output(0),
request_finished(),
@ -188,12 +194,15 @@ def test_spend_v5_input(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_output(0),
request_finished(),
@ -240,13 +249,16 @@ def test_one_two(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_output(0),
request_output(1),
@ -297,13 +309,16 @@ def test_unified_address(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
request_output(1),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_output(0),
request_output(1),
@ -360,12 +375,14 @@ def test_external_presigned(client: Client):
)
with client:
tt = client.features.model == "T"
client.set_expected_responses(
[
request_input(0),
request_input(1),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
request_input(1),
request_input(0),
@ -471,11 +488,14 @@ def test_spend_multisig(client: Client):
)
# Expected responses are the same for both two signings
tt = client.features.model == "T"
expected_responses = [
request_input(0),
request_output(0),
messages.ButtonRequest(code=B.ConfirmOutput),
(tt, messages.ButtonRequest(code=B.ConfirmOutput)),
messages.ButtonRequest(code=B.SignTx),
(tt, messages.ButtonRequest(code=B.SignTx)),
request_input(0),
request_output(0),
request_finished(),

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save