1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-02-21 03:52:04 +00:00

chore(tests): update to kwargs usage and new btc.sign_tx API

This commit is contained in:
matejcik 2020-09-15 13:06:41 +02:00 committed by matejcik
parent b41021a5fb
commit 08d896f2f9
42 changed files with 361 additions and 263 deletions

View File

@ -15,6 +15,7 @@
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>. # If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
import logging import logging
import textwrap
from collections import namedtuple from collections import namedtuple
from copy import deepcopy from copy import deepcopy
@ -245,6 +246,96 @@ class DebugUI:
return self.passphrase return self.passphrase
class MessageFilter:
def __init__(self, message_type, **fields):
self.message_type = message_type
self.fields = {}
self.update_fields(**fields)
def update_fields(self, **fields):
for name, value in fields.items():
try:
self.fields[name] = self.from_message_or_type(value)
except TypeError:
self.fields[name] = value
return self
@classmethod
def from_message_or_type(cls, message_or_type):
if isinstance(message_or_type, cls):
return message_or_type
if isinstance(message_or_type, protobuf.MessageType):
return cls.from_message(message_or_type)
if isinstance(message_or_type, type) and issubclass(
message_or_type, protobuf.MessageType
):
return cls(message_or_type)
raise TypeError("Invalid kind of expected response")
@classmethod
def from_message(cls, message):
fields = {}
for field in message.keys():
value = getattr(message, field)
if value in (None, []):
continue
fields[field] = value
return cls(type(message), **fields)
def match(self, message):
if type(message) != self.message_type:
return False
for field, expected_value in self.fields.items():
actual_value = getattr(message, field, None)
if isinstance(expected_value, MessageFilter):
if not expected_value.match(actual_value):
return False
elif expected_value != actual_value:
return False
return True
def format(self, maxwidth=80):
fields = []
for fname, ftype, _ in self.message_type.get_fields().values():
if fname not in self.fields:
continue
value = self.fields[fname]
if isinstance(ftype, protobuf.EnumType) and isinstance(value, int):
field_str = ftype.to_str(value)
elif isinstance(value, MessageFilter):
field_str = value.format(maxwidth - 4)
elif isinstance(value, protobuf.MessageType):
field_str = protobuf.format_message(value)
else:
field_str = repr(value)
field_str = textwrap.indent(field_str, " ").lstrip()
fields.append((fname, field_str))
pairs = ["{}={}".format(k, v) for k, v in fields]
oneline_str = ", ".join(pairs)
if len(oneline_str) < maxwidth:
return "{}({})".format(self.message_type.__name__, oneline_str)
else:
item = []
item.append("{}(".format(self.message_type.__name__))
for pair in pairs:
item.append(" {}".format(pair))
item.append(")")
return "\n".join(item)
class MessageFilterGenerator:
def __getattr__(self, key):
message_type = getattr(messages, key)
return MessageFilter(message_type).update_fields
message_filters = MessageFilterGenerator()
class TrezorClientDebugLink(TrezorClient): class TrezorClientDebugLink(TrezorClient):
# This class implements automatic responses # This class implements automatic responses
# and other functionality for unit tests # and other functionality for unit tests
@ -417,13 +508,15 @@ class TrezorClientDebugLink(TrezorClient):
raise RuntimeError("Must be called inside 'with' statement") raise RuntimeError("Must be called inside 'with' statement")
# make sure all items are (bool, message) tuples # make sure all items are (bool, message) tuples
expected_with_validity = [ expected_with_validity = (
e if isinstance(e, tuple) else (True, e) for e in expected e if isinstance(e, tuple) else (True, e) for e in expected
] )
# only apply those items that are (True, message) # only apply those items that are (True, message)
self.expected_responses = [ self.expected_responses = [
expected for valid, expected in expected_with_validity if valid MessageFilter.from_message_or_type(expected)
for valid, expected in expected_with_validity
if valid
] ]
self.current_response = 0 self.current_response = 0
@ -469,23 +562,7 @@ class TrezorClientDebugLink(TrezorClient):
for i in range(start_at, stop_at): for i in range(start_at, stop_at):
exp = self.expected_responses[i] exp = self.expected_responses[i]
prefix = " " if i != self.current_response else ">>> " prefix = " " if i != self.current_response else ">>> "
set_fields = { output.append(textwrap.indent(exp.format(), prefix))
key: value
for key, value in exp.__dict__.items()
if value is not None and value != []
}
oneline_str = ", ".join("{}={!r}".format(*i) for i in set_fields.items())
if len(oneline_str) < 60:
output.append(
"{}{}({})".format(prefix, exp.__class__.__name__, oneline_str)
)
else:
item = []
item.append("{}{}(".format(prefix, exp.__class__.__name__))
for key, value in set_fields.items():
item.append("{} {}={!r}".format(prefix, key, value))
item.append("{})".format(prefix))
output.append("\n".join(item))
if stop_at < len(self.expected_responses): if stop_at < len(self.expected_responses):
omitted = len(self.expected_responses) - stop_at omitted = len(self.expected_responses) - stop_at
output.append(" (...{} following responses omitted)".format(omitted)) output.append(" (...{} following responses omitted)".format(omitted))
@ -493,7 +570,7 @@ class TrezorClientDebugLink(TrezorClient):
output.append("") output.append("")
if msg is not None: if msg is not None:
output.append("Actually received:") output.append("Actually received:")
output.append(protobuf.format_message(msg)) output.append(textwrap.indent(protobuf.format_message(msg), " "))
else: else:
output.append("This message was never received.") output.append("This message was never received.")
raise AssertionError("\n".join(output)) raise AssertionError("\n".join(output))
@ -511,15 +588,9 @@ class TrezorClientDebugLink(TrezorClient):
expected = self.expected_responses[self.current_response] expected = self.expected_responses[self.current_response]
if msg.__class__ != expected.__class__: if not expected.match(msg):
self._raise_unexpected_response(msg) self._raise_unexpected_response(msg)
for field, value in expected.__dict__.items():
if value is None or value == []:
continue
if getattr(msg, field) != value:
self._raise_unexpected_response(msg)
self.current_response += 1 self.current_response += 1
def mnemonic_callback(self, _): def mnemonic_callback(self, _):

View File

@ -88,12 +88,6 @@ def get_subnode(node, i):
I64 = hmac.HMAC(key=node.chain_code, msg=data, digestmod=hashlib.sha512).digest() I64 = hmac.HMAC(key=node.chain_code, msg=data, digestmod=hashlib.sha512).digest()
I_left_as_exponent = string_to_number(I64[:32]) I_left_as_exponent = string_to_number(I64[:32])
node_out = messages.HDNodeType()
node_out.depth = node.depth + 1
node_out.child_num = i
node_out.chain_code = I64[32:]
node_out.fingerprint = fingerprint(node.public_key)
# BIP32 magic converts old public key to new public point # BIP32 magic converts old public key to new public point
x, y = sec_to_public_pair(node.public_key) x, y = sec_to_public_pair(node.public_key)
point = I_left_as_exponent * SECP256k1.generator + Point( point = I_left_as_exponent * SECP256k1.generator + Point(
@ -103,10 +97,14 @@ def get_subnode(node, i):
if point == INFINITY: if point == INFINITY:
raise ValueError("Point cannot be INFINITY") raise ValueError("Point cannot be INFINITY")
# Convert public point to compressed public key return messages.HDNodeType(
node_out.public_key = point_to_pubkey(point) depth=node.depth + 1,
child_num=i,
return node_out chain_code=I64[32:],
fingerprint=fingerprint(node.public_key),
# Convert public point to compressed public key
public_key=point_to_pubkey(point),
)
def serialize(node, version=0x0488B21E): def serialize(node, version=0x0488B21E):
@ -130,11 +128,13 @@ def deserialize(xpub):
if tools.btc_hash(data[:-4])[:4] != data[-4:]: if tools.btc_hash(data[:-4])[:4] != data[-4:]:
raise ValueError("Checksum failed") raise ValueError("Checksum failed")
node = messages.HDNodeType() node = messages.HDNodeType(
node.depth = struct.unpack(">B", data[4:5])[0] depth=struct.unpack(">B", data[4:5])[0],
node.fingerprint = struct.unpack(">I", data[5:9])[0] fingerprint=struct.unpack(">I", data[5:9])[0],
node.child_num = struct.unpack(">I", data[9:13])[0] child_num=struct.unpack(">I", data[9:13])[0],
node.chain_code = data[13:45] chain_code=data[13:45],
public_key=None,
)
key = data[45:-4] key = data[45:-4]
if key[0] == 0: if key[0] == 0:

View File

@ -30,9 +30,9 @@ pytestmark = pytest.mark.setup_client(pin=PIN4)
def pin_request(client): def pin_request(client):
return ( return (
messages.PinMatrixRequest() messages.PinMatrixRequest
if client.features.model == "1" if client.features.model == "1"
else messages.ButtonRequest() else messages.ButtonRequest
) )
@ -42,9 +42,9 @@ def set_autolock_delay(client, delay):
client.set_expected_responses( client.set_expected_responses(
[ [
pin_request(client), pin_request(client),
messages.ButtonRequest(), messages.ButtonRequest,
messages.Success(), messages.Success,
messages.Features(), messages.Features,
] ]
) )
device.apply_settings(client, auto_lock_delay_ms=delay) device.apply_settings(client, auto_lock_delay_ms=delay)
@ -56,13 +56,13 @@ def test_apply_auto_lock_delay(client):
time.sleep(0.1) # sleep less than auto-lock delay time.sleep(0.1) # sleep less than auto-lock delay
with client: with client:
# No PIN protection is required. # No PIN protection is required.
client.set_expected_responses([messages.Address()]) client.set_expected_responses([messages.Address])
get_test_address(client) get_test_address(client)
time.sleep(10.1) # sleep more than auto-lock delay time.sleep(10.1) # sleep more than auto-lock delay
with client: with client:
client.use_pin_sequence([PIN4]) client.use_pin_sequence([PIN4])
client.set_expected_responses([pin_request(client), messages.Address()]) client.set_expected_responses([pin_request(client), messages.Address])
get_test_address(client) get_test_address(client)

View File

@ -22,7 +22,7 @@ class TestBasic:
f0 = client.features f0 = client.features
# client erases session_id from its features # client erases session_id from its features
f0.session_id = client.session_id f0.session_id = client.session_id
f1 = client.call(messages.Initialize(client.session_id)) f1 = client.call(messages.Initialize(session_id=f0.session_id))
assert f0 == f1 assert f0 == f1
def test_ping(self, client): def test_ping(self, client):

View File

@ -167,7 +167,7 @@ class TestMsgApplysettings:
with pytest.raises( with pytest.raises(
exceptions.TrezorFailure, match="Forbidden key path" exceptions.TrezorFailure, match="Forbidden key path"
), client: ), client:
client.set_expected_responses([messages.Failure()]) client.set_expected_responses([messages.Failure])
get_bad_address() get_bad_address()
with client: with client:
@ -179,9 +179,7 @@ class TestMsgApplysettings:
assert client.features.safety_checks == messages.SafetyCheckLevel.PromptAlways assert client.features.safety_checks == messages.SafetyCheckLevel.PromptAlways
with client: with client:
client.set_expected_responses( client.set_expected_responses([messages.ButtonRequest, messages.Address])
[messages.ButtonRequest(), messages.Address()]
)
get_bad_address() get_bad_address()
with client: with client:
@ -195,7 +193,7 @@ class TestMsgApplysettings:
with pytest.raises( with pytest.raises(
exceptions.TrezorFailure, match="Forbidden key path" exceptions.TrezorFailure, match="Forbidden key path"
), client: ), client:
client.set_expected_responses([messages.Failure()]) client.set_expected_responses([messages.Failure])
get_bad_address() get_bad_address()
with client: with client:
@ -209,7 +207,5 @@ class TestMsgApplysettings:
) )
with client: with client:
client.set_expected_responses( client.set_expected_responses([messages.ButtonRequest, messages.Address])
[messages.ButtonRequest(), messages.Address()]
)
get_bad_address() get_bad_address()

View File

@ -61,7 +61,7 @@ def test_sign_tx(client):
with client: with client:
client.set_expected_responses( client.set_expected_responses(
[messages.PreauthorizedRequest(), messages.OwnershipProof()] [messages.PreauthorizedRequest, messages.OwnershipProof]
) )
btc.get_ownership_proof( btc.get_ownership_proof(
client, client,
@ -75,7 +75,7 @@ def test_sign_tx(client):
with client: with client:
client.set_expected_responses( client.set_expected_responses(
[messages.PreauthorizedRequest(), messages.OwnershipProof()] [messages.PreauthorizedRequest, messages.OwnershipProof]
) )
btc.get_ownership_proof( btc.get_ownership_proof(
client, client,

View File

@ -19,6 +19,8 @@ import pytest
from trezorlib import device, messages from trezorlib import device, messages
from trezorlib.exceptions import TrezorFailure from trezorlib.exceptions import TrezorFailure
from ..common import get_test_address
PIN4 = "1234" PIN4 = "1234"
PIN6 = "789456" PIN6 = "789456"
@ -30,15 +32,15 @@ def _check_pin(client, pin):
client.lock() client.lock()
with client: with client:
client.use_pin_sequence([pin]) client.use_pin_sequence([pin])
client.set_expected_responses([messages.PinMatrixRequest(), messages.Address()]) client.set_expected_responses([messages.PinMatrixRequest, messages.Address])
client.call(messages.GetAddress()) get_test_address(client)
def _check_no_pin(client): def _check_no_pin(client):
client.lock() client.lock()
with client: with client:
client.set_expected_responses([messages.Address()]) client.set_expected_responses([messages.Address])
client.call(messages.GetAddress()) get_test_address(client)
def test_set_pin(client): def test_set_pin(client):
@ -53,10 +55,10 @@ def test_set_pin(client):
client.set_expected_responses( client.set_expected_responses(
[ [
messages.ButtonRequest(code=messages.ButtonRequestType.ProtectCall), messages.ButtonRequest(code=messages.ButtonRequestType.ProtectCall),
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.Success(), messages.Success,
messages.Features(), messages.Features,
] ]
) )
device.change_pin(client) device.change_pin(client)
@ -79,11 +81,11 @@ def test_change_pin(client):
client.set_expected_responses( client.set_expected_responses(
[ [
messages.ButtonRequest(code=messages.ButtonRequestType.ProtectCall), messages.ButtonRequest(code=messages.ButtonRequestType.ProtectCall),
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.Success(), messages.Success,
messages.Features(), messages.Features,
] ]
) )
device.change_pin(client) device.change_pin(client)
@ -106,9 +108,9 @@ def test_remove_pin(client):
client.set_expected_responses( client.set_expected_responses(
[ [
messages.ButtonRequest(code=messages.ButtonRequestType.ProtectCall), messages.ButtonRequest(code=messages.ButtonRequestType.ProtectCall),
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.Success(), messages.Success,
messages.Features(), messages.Features,
] ]
) )
device.change_pin(client, remove=True) device.change_pin(client, remove=True)
@ -130,9 +132,9 @@ def test_set_mismatch(client):
client.set_expected_responses( client.set_expected_responses(
[ [
messages.ButtonRequest(code=messages.ButtonRequestType.ProtectCall), messages.ButtonRequest(code=messages.ButtonRequestType.ProtectCall),
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.Failure(), messages.Failure,
] ]
) )
device.change_pin(client) device.change_pin(client)
@ -153,10 +155,10 @@ def test_change_mismatch(client):
client.set_expected_responses( client.set_expected_responses(
[ [
messages.ButtonRequest(code=messages.ButtonRequestType.ProtectCall), messages.ButtonRequest(code=messages.ButtonRequestType.ProtectCall),
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.PinMatrixRequest(), messages.PinMatrixRequest,
messages.Failure(), messages.Failure,
] ]
) )
device.change_pin(client) device.change_pin(client)

View File

@ -33,7 +33,7 @@ def _check_pin(client, pin):
with client: with client:
client.use_pin_sequence([pin]) client.use_pin_sequence([pin])
client.set_expected_responses([messages.ButtonRequest(), messages.Address()]) client.set_expected_responses([messages.ButtonRequest, messages.Address])
btc.get_address(client, "Testnet", PASSPHRASE_TEST_PATH) btc.get_address(client, "Testnet", PASSPHRASE_TEST_PATH)
@ -42,7 +42,7 @@ def _check_no_pin(client):
assert client.features.pin_protection is False assert client.features.pin_protection is False
with client: with client:
client.set_expected_responses([messages.Address()]) client.set_expected_responses([messages.Address])
btc.get_address(client, "Testnet", PASSPHRASE_TEST_PATH) btc.get_address(client, "Testnet", PASSPHRASE_TEST_PATH)
@ -56,7 +56,7 @@ def test_set_pin(client):
with client: with client:
client.use_pin_sequence([PIN6, PIN6]) client.use_pin_sequence([PIN6, PIN6])
client.set_expected_responses( client.set_expected_responses(
[messages.ButtonRequest()] * 4 + [messages.Success(), messages.Features()] [messages.ButtonRequest] * 4 + [messages.Success, messages.Features]
) )
device.change_pin(client) device.change_pin(client)
@ -76,7 +76,7 @@ def test_change_pin(client):
with client: with client:
client.use_pin_sequence([PIN4, PIN6, PIN6]) client.use_pin_sequence([PIN4, PIN6, PIN6])
client.set_expected_responses( client.set_expected_responses(
[messages.ButtonRequest()] * 5 + [messages.Success(), messages.Features()] [messages.ButtonRequest] * 5 + [messages.Success, messages.Features]
) )
device.change_pin(client) device.change_pin(client)
@ -98,7 +98,7 @@ def test_remove_pin(client):
with client: with client:
client.use_pin_sequence([PIN4]) client.use_pin_sequence([PIN4])
client.set_expected_responses( client.set_expected_responses(
[messages.ButtonRequest()] * 3 + [messages.Success(), messages.Features()] [messages.ButtonRequest] * 3 + [messages.Success, messages.Features]
) )
device.change_pin(client, remove=True) device.change_pin(client, remove=True)
@ -128,9 +128,7 @@ def test_set_failed(client):
client.cancel() client.cancel()
with client, pytest.raises(Cancelled): with client, pytest.raises(Cancelled):
client.set_expected_responses( client.set_expected_responses([messages.ButtonRequest] * 4 + [messages.Failure])
[messages.ButtonRequest()] * 4 + [messages.Failure()]
)
client.set_input_flow(input_flow) client.set_input_flow(input_flow)
device.change_pin(client) device.change_pin(client)
@ -164,9 +162,7 @@ def test_change_failed(client):
client.cancel() client.cancel()
with client, pytest.raises(Cancelled): with client, pytest.raises(Cancelled):
client.set_expected_responses( client.set_expected_responses([messages.ButtonRequest] * 5 + [messages.Failure])
[messages.ButtonRequest()] * 5 + [messages.Failure()]
)
client.set_input_flow(input_flow) client.set_input_flow(input_flow)
device.change_pin(client) device.change_pin(client)

View File

@ -233,7 +233,7 @@ def test_unknown_path(client):
messages.ButtonRequest( messages.ButtonRequest(
code=messages.ButtonRequestType.UnknownDerivationPath code=messages.ButtonRequestType.UnknownDerivationPath
), ),
messages.Address(), messages.Address,
] ]
) )
# account number is too high # account number is too high

View File

@ -41,7 +41,7 @@ def entropy(data):
def test_entropy(client, entropy_length): def test_entropy(client, entropy_length):
with client: with client:
client.set_expected_responses( client.set_expected_responses(
[m.ButtonRequest(code=m.ButtonRequestType.ProtectCall), m.Entropy()] [m.ButtonRequest(code=m.ButtonRequestType.ProtectCall), m.Entropy]
) )
ent = misc.get_entropy(client, entropy_length) ent = misc.get_entropy(client, entropy_length)
assert len(ent) == entropy_length assert len(ent) == entropy_length

View File

@ -1225,14 +1225,13 @@ class TestMsgSigntx:
script_type=messages.OutputScriptType.PAYTOADDRESS, script_type=messages.OutputScriptType.PAYTOADDRESS,
) )
details = messages.SignTx() kwargs = {field: value}
setattr(details, field, value)
name = field.replace("_", " ") name = field.replace("_", " ")
with pytest.raises( with pytest.raises(
TrezorFailure, match=r"(?i){} not enabled on this coin".format(name) TrezorFailure, match=r"(?i){} not enabled on this coin".format(name)
): ):
btc.sign_tx( btc.sign_tx(
client, "Bitcoin", [inp0], [out1], details, prev_txes=TX_CACHE_MAINNET client, "Bitcoin", [inp0], [out1], prev_txes=TX_CACHE_MAINNET, **kwargs
) )
@pytest.mark.parametrize( @pytest.mark.parametrize(
@ -1385,12 +1384,11 @@ class TestMsgSigntx:
] ]
) )
details = messages.SignTx(lock_time=lock_time)
btc.sign_tx( btc.sign_tx(
client, client,
"Bitcoin", "Bitcoin",
[inp1], [inp1],
[out1], [out1],
details=details, lock_time=lock_time,
prev_txes=TX_CACHE_MAINNET, prev_txes=TX_CACHE_MAINNET,
) )

View File

@ -102,13 +102,12 @@ class TestMsgSigntxGRS:
amount=123456789 - 11000 - 12300000, amount=123456789 - 11000 - 12300000,
script_type=proto.OutputScriptType.PAYTOADDRESS, script_type=proto.OutputScriptType.PAYTOADDRESS,
) )
details = proto.SignTx(lock_time=650756)
_, serialized_tx = btc.sign_tx( _, serialized_tx = btc.sign_tx(
client, client,
"Groestlcoin Testnet", "Groestlcoin Testnet",
[inp1], [inp1],
[out1, out2], [out1, out2],
details=details, lock_time=650756,
prev_txes=TX_API_TESTNET, prev_txes=TX_API_TESTNET,
) )
assert ( assert (
@ -136,13 +135,12 @@ class TestMsgSigntxGRS:
script_type=proto.OutputScriptType.PAYTOP2SHWITNESS, script_type=proto.OutputScriptType.PAYTOP2SHWITNESS,
amount=123456789 - 11000 - 12300000, amount=123456789 - 11000 - 12300000,
) )
details = proto.SignTx(lock_time=650756)
_, serialized_tx = btc.sign_tx( _, serialized_tx = btc.sign_tx(
client, client,
"Groestlcoin Testnet", "Groestlcoin Testnet",
[inp1], [inp1],
[out1, out2], [out1, out2],
details=details, lock_time=650756,
prev_txes=TX_API_TESTNET, prev_txes=TX_API_TESTNET,
) )
assert ( assert (
@ -169,13 +167,12 @@ class TestMsgSigntxGRS:
script_type=proto.OutputScriptType.PAYTOADDRESS, script_type=proto.OutputScriptType.PAYTOADDRESS,
amount=12300000 - 11000 - 5000000, amount=12300000 - 11000 - 5000000,
) )
details = proto.SignTx(lock_time=650713)
_, serialized_tx = btc.sign_tx( _, serialized_tx = btc.sign_tx(
client, client,
"Groestlcoin Testnet", "Groestlcoin Testnet",
[inp1], [inp1],
[out1, out2], [out1, out2],
details=details, lock_time=650713,
prev_txes=TX_API_TESTNET, prev_txes=TX_API_TESTNET,
) )
assert ( assert (
@ -202,13 +199,12 @@ class TestMsgSigntxGRS:
script_type=proto.OutputScriptType.PAYTOWITNESS, script_type=proto.OutputScriptType.PAYTOWITNESS,
amount=12300000 - 11000 - 5000000, amount=12300000 - 11000 - 5000000,
) )
details = proto.SignTx(lock_time=650713)
_, serialized_tx = btc.sign_tx( _, serialized_tx = btc.sign_tx(
client, client,
"Groestlcoin Testnet", "Groestlcoin Testnet",
[inp1], [inp1],
[out1, out2], [out1, out2],
details=details, lock_time=650713,
prev_txes=TX_API_TESTNET, prev_txes=TX_API_TESTNET,
) )
assert ( assert (

View File

@ -79,14 +79,16 @@ class TestMsgSigntxKomodo:
] ]
) )
details = proto.SignTx( _, serialized_tx = btc.sign_tx(
client,
"Komodo",
[inp1],
[out1],
version=4, version=4,
version_group_id=0x892F2085, version_group_id=0x892F2085,
branch_id=0x76B809BB, branch_id=0x76B809BB,
lock_time=0x5D2A30B8, lock_time=0x5D2A30B8,
) prev_txes=TX_API,
_, serialized_tx = btc.sign_tx(
client, "Komodo", [inp1], [out1], details=details, prev_txes=TX_API
) )
# Accepted by network: tx 7b28bd91119e9776f0d4ebd80e570165818a829bbf4477cd1afe5149dbcd34b1 # Accepted by network: tx 7b28bd91119e9776f0d4ebd80e570165818a829bbf4477cd1afe5149dbcd34b1
@ -142,19 +144,16 @@ class TestMsgSigntxKomodo:
] ]
) )
details = proto.SignTx(
version=4,
version_group_id=0x892F2085,
branch_id=0x76B809BB,
lock_time=0x5D2AF1F2,
)
_, serialized_tx = btc.sign_tx( _, serialized_tx = btc.sign_tx(
client, client,
"Komodo", "Komodo",
[inp1], [inp1],
[out1, out2], [out1, out2],
details=details,
prev_txes=TX_API, prev_txes=TX_API,
version=4,
version_group_id=0x892F2085,
branch_id=0x76B809BB,
lock_time=0x5D2AF1F2,
) )
# Accepted by network: tx c775678ceb18277729b427c7acf2f8ce63ac02fc2366f47ce08a3f443ff0e059 # Accepted by network: tx c775678ceb18277729b427c7acf2f8ce63ac02fc2366f47ce08a3f443ff0e059

View File

@ -48,9 +48,14 @@ def test_timestamp_included(client):
script_type=messages.OutputScriptType.PAYTOADDRESS, script_type=messages.OutputScriptType.PAYTOADDRESS,
) )
details = messages.SignTx(version=1, timestamp=0x5DC5448A)
_, timestamp_tx = btc.sign_tx( _, timestamp_tx = btc.sign_tx(
client, "Peercoin", [inp1], [out1], details=details, prev_txes=TX_CACHE, client,
"Peercoin",
[inp1],
[out1],
version=1,
timestamp=0x5DC5448A,
prev_txes=TX_CACHE,
) )
# Accepted by network https://explorer.peercoin.net/api/getrawtransaction?txid=f7e3624c143b6a170cc44f9337d0fa8ea8564a211de9c077c6889d8c78f80909&decrypt=1 # Accepted by network https://explorer.peercoin.net/api/getrawtransaction?txid=f7e3624c143b6a170cc44f9337d0fa8ea8564a211de9c077c6889d8c78f80909&decrypt=1
@ -74,16 +79,26 @@ def test_timestamp_missing(client):
script_type=messages.OutputScriptType.PAYTOADDRESS, script_type=messages.OutputScriptType.PAYTOADDRESS,
) )
details = messages.SignTx(version=1, timestamp=None)
with pytest.raises(TrezorFailure, match="Timestamp must be set."): with pytest.raises(TrezorFailure, match="Timestamp must be set."):
btc.sign_tx( btc.sign_tx(
client, "Peercoin", [inp1], [out1], details=details, prev_txes=TX_CACHE, client,
"Peercoin",
[inp1],
[out1],
version=1,
timestamp=None,
prev_txes=TX_CACHE,
) )
details = messages.SignTx(version=1, timestamp=0)
with pytest.raises(TrezorFailure, match="Timestamp must be set."): with pytest.raises(TrezorFailure, match="Timestamp must be set."):
btc.sign_tx( btc.sign_tx(
client, "Peercoin", [inp1], [out1], details=details, prev_txes=TX_CACHE, client,
"Peercoin",
[inp1],
[out1],
version=1,
timestamp=0,
prev_txes=TX_CACHE,
) )
@ -102,7 +117,6 @@ def test_timestamp_missing_prevtx(client):
amount=100000 - 10000, amount=100000 - 10000,
script_type=messages.OutputScriptType.PAYTOADDRESS, script_type=messages.OutputScriptType.PAYTOADDRESS,
) )
details = messages.SignTx(version=1, timestamp=0x5DC5448A)
prevtx = TX_CACHE[TXHASH_41b29a] prevtx = TX_CACHE[TXHASH_41b29a]
prevtx.timestamp = 0 prevtx.timestamp = 0
@ -113,7 +127,8 @@ def test_timestamp_missing_prevtx(client):
"Peercoin", "Peercoin",
[inp1], [inp1],
[out1], [out1],
details=details, version=1,
timestamp=0x5DC5448A,
prev_txes={TXHASH_41b29a: prevtx}, prev_txes={TXHASH_41b29a: prevtx},
) )
@ -124,6 +139,7 @@ def test_timestamp_missing_prevtx(client):
"Peercoin", "Peercoin",
[inp1], [inp1],
[out1], [out1],
details=details, version=1,
timestamp=0x5DC5448A,
prev_txes={TXHASH_41b29a: prevtx}, prev_txes={TXHASH_41b29a: prevtx},
) )

View File

@ -1,3 +1,4 @@
import re
from hashlib import sha256 from hashlib import sha256
from io import BytesIO from io import BytesIO
@ -61,7 +62,13 @@ def hash_tx(data: bytes) -> bytes:
def _check_error_message(value: bytes, model: str, message: str): def _check_error_message(value: bytes, model: str, message: str):
if model != "1": if model != "1":
assert message == "Provided prev_hash is invalid." if value is None:
assert re.match(
r"^Failed to decode message: Required field '\w+' was not received$",
message,
)
else:
assert message == "Provided prev_hash is invalid."
return return
# T1 has several possible errors # T1 has several possible errors
@ -90,7 +97,7 @@ def test_invalid_prev_hash(client, prev_hash):
) )
with pytest.raises(TrezorFailure) as e: with pytest.raises(TrezorFailure) as e:
btc.sign_tx(client, "Testnet", [inp1], [out1]) btc.sign_tx(client, "Testnet", [inp1], [out1], prev_txes={})
_check_error_message(prev_hash, client.features.model, e.value.message) _check_error_message(prev_hash, client.features.model, e.value.message)

View File

@ -75,19 +75,17 @@ class TestMsgSigntxZcash:
script_type=proto.OutputScriptType.PAYTOADDRESS, script_type=proto.OutputScriptType.PAYTOADDRESS,
) )
with client: with client, pytest.raises(TrezorFailure, match="DataError"):
details = proto.SignTx( btc.sign_tx(
version=3, version_group_id=0x03C48270, branch_id=0x5BA81B19, client,
"Zcash Testnet",
[inp1],
[out1],
version=3,
version_group_id=0x03C48270,
branch_id=0x5BA81B19,
prev_txes=TX_API,
) )
with pytest.raises(TrezorFailure, match="DataError"):
_, serialized_tx = btc.sign_tx(
client,
"Zcash Testnet",
[inp1],
[out1],
details=details,
prev_txes=TX_API,
)
def test_one_one_fee_sapling(self, client): def test_one_one_fee_sapling(self, client):
# prevout: e3820602226974b1dd87b7113cc8aea8c63e5ae29293991e7bfa80c126930368:0 # prevout: e3820602226974b1dd87b7113cc8aea8c63e5ae29293991e7bfa80c126930368:0
@ -127,15 +125,14 @@ class TestMsgSigntxZcash:
] ]
) )
details = proto.SignTx(
version=4, version_group_id=0x892F2085, branch_id=0x76B809BB,
)
_, serialized_tx = btc.sign_tx( _, serialized_tx = btc.sign_tx(
client, client,
"Zcash Testnet", "Zcash Testnet",
[inp1], [inp1],
[out1], [out1],
details=details, version=4,
version_group_id=0x892F2085,
branch_id=0x76B809BB,
prev_txes=TX_API, prev_txes=TX_API,
) )
@ -160,15 +157,9 @@ class TestMsgSigntxZcash:
script_type=proto.OutputScriptType.PAYTOADDRESS, script_type=proto.OutputScriptType.PAYTOADDRESS,
) )
details = proto.SignTx(version=4)
with pytest.raises(TrezorFailure, match="Version group ID must be set."): with pytest.raises(TrezorFailure, match="Version group ID must be set."):
btc.sign_tx( btc.sign_tx(
client, client, "Zcash Testnet", [inp1], [out1], version=4, prev_txes=TX_API,
"Zcash Testnet",
[inp1],
[out1],
details=details,
prev_txes=TX_API,
) )
def test_spend_old_versions(self, client): def test_spend_old_versions(self, client):
@ -210,17 +201,15 @@ class TestMsgSigntxZcash:
script_type=proto.OutputScriptType.PAYTOADDRESS, script_type=proto.OutputScriptType.PAYTOADDRESS,
) )
details = proto.SignTx(
version=4, version_group_id=0x892F2085, branch_id=0x76B809BB,
)
with client: with client:
_, serialized_tx = btc.sign_tx( _, serialized_tx = btc.sign_tx(
client, client,
"Zcash Testnet", "Zcash Testnet",
inputs, inputs,
[output], [output],
details=details, version=4,
version_group_id=0x892F2085,
branch_id=0x76B809BB,
prev_txes=TX_API, prev_txes=TX_API,
) )
@ -285,15 +274,14 @@ class TestMsgSigntxZcash:
] ]
) )
details = proto.SignTx(
version=4, version_group_id=0x892F2085, branch_id=0x76B809BB,
)
_, serialized_tx = btc.sign_tx( _, serialized_tx = btc.sign_tx(
client, client,
"Zcash Testnet", "Zcash Testnet",
[inp1, inp2], [inp1, inp2],
[out1], [out1],
details=details, version=4,
version_group_id=0x892F2085,
branch_id=0x76B809BB,
prev_txes=TX_API, prev_txes=TX_API,
) )

View File

@ -150,7 +150,7 @@ def test_sign_tx_payment_op_native_explicit_asset(client):
op = messages.StellarPaymentOp() op = messages.StellarPaymentOp()
op.amount = 500111000 op.amount = 500111000
op.destination_account = "GBOVKZBEM2YYLOCDCUXJ4IMRKHN4LCJAE7WEAEA2KF562XFAGDBOB64V" op.destination_account = "GBOVKZBEM2YYLOCDCUXJ4IMRKHN4LCJAE7WEAEA2KF562XFAGDBOB64V"
op.asset = messages.StellarAssetType(0) op.asset = messages.StellarAssetType(type=0)
tx = _create_msg() tx = _create_msg()
@ -171,7 +171,9 @@ def test_sign_tx_payment_op_custom_asset1(client):
op.destination_account = "GBOVKZBEM2YYLOCDCUXJ4IMRKHN4LCJAE7WEAEA2KF562XFAGDBOB64V" op.destination_account = "GBOVKZBEM2YYLOCDCUXJ4IMRKHN4LCJAE7WEAEA2KF562XFAGDBOB64V"
op.asset = messages.StellarAssetType( op.asset = messages.StellarAssetType(
1, "X", "GAUYJFQCYIHFQNS7CI6BFWD2DSSFKDIQZUQ3BLQODDKE4PSW7VVBKENC" type=1,
code="X",
issuer="GAUYJFQCYIHFQNS7CI6BFWD2DSSFKDIQZUQ3BLQODDKE4PSW7VVBKENC",
) )
tx = _create_msg() tx = _create_msg()
@ -192,7 +194,9 @@ def test_sign_tx_payment_op_custom_asset12(client):
op.destination_account = "GBOVKZBEM2YYLOCDCUXJ4IMRKHN4LCJAE7WEAEA2KF562XFAGDBOB64V" op.destination_account = "GBOVKZBEM2YYLOCDCUXJ4IMRKHN4LCJAE7WEAEA2KF562XFAGDBOB64V"
op.asset = messages.StellarAssetType( op.asset = messages.StellarAssetType(
2, "ABCDEFGHIJKL", "GAUYJFQCYIHFQNS7CI6BFWD2DSSFKDIQZUQ3BLQODDKE4PSW7VVBKENC" type=2,
code="ABCDEFGHIJKL",
issuer="GAUYJFQCYIHFQNS7CI6BFWD2DSSFKDIQZUQ3BLQODDKE4PSW7VVBKENC",
) )
tx = _create_msg() tx = _create_msg()

View File

@ -18,7 +18,7 @@ import time
import pytest import pytest
from trezorlib import btc, messages as proto from trezorlib import btc, messages
from trezorlib.exceptions import PinException from trezorlib.exceptions import PinException
# FIXME TODO Add passphrase tests # FIXME TODO Add passphrase tests
@ -33,14 +33,14 @@ class TestProtectCall:
def test_no_protection(self, client): def test_no_protection(self, client):
with client: with client:
client.set_expected_responses([proto.Address()]) client.set_expected_responses([messages.Address])
self._some_protected_call(client) self._some_protected_call(client)
@pytest.mark.setup_client(pin="1234") @pytest.mark.setup_client(pin="1234")
def test_pin(self, client): def test_pin(self, client):
with client: with client:
client.use_pin_sequence(["1234"]) client.use_pin_sequence(["1234"])
client.set_expected_responses([proto.PinMatrixRequest(), proto.Address()]) client.set_expected_responses([messages.PinMatrixRequest, messages.Address])
self._some_protected_call(client) self._some_protected_call(client)
@pytest.mark.setup_client(pin="1234") @pytest.mark.setup_client(pin="1234")

View File

@ -16,14 +16,14 @@
import pytest import pytest
from trezorlib import btc, device, messages as proto, misc from trezorlib import btc, device, messages, misc
from trezorlib.exceptions import TrezorFailure from trezorlib.exceptions import TrezorFailure
from ..common import MNEMONIC12 from ..common import MNEMONIC12
from ..tx_cache import TxCache from ..tx_cache import TxCache
from .signtx import request_finished, request_input, request_meta, request_output from .signtx import request_finished, request_input, request_meta, request_output
B = proto.ButtonRequestType B = messages.ButtonRequestType
TXHASH_d5f65e = bytes.fromhex( TXHASH_d5f65e = bytes.fromhex(
"d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882" "d5f65ee80147b4bcc70b75e4bbf2d7382021b871bd8867ef8fa525ef50864882"
@ -37,7 +37,7 @@ class TestProtectionLevels:
@pytest.mark.setup_client(pin=PIN4, passphrase=True) @pytest.mark.setup_client(pin=PIN4, passphrase=True)
def test_initialize(self, client): def test_initialize(self, client):
with client: with client:
client.set_expected_responses([proto.Features()]) client.set_expected_responses([messages.Features])
client.init_device() client.init_device()
@pytest.mark.setup_client(pin=PIN4, passphrase=True) @pytest.mark.setup_client(pin=PIN4, passphrase=True)
@ -46,10 +46,10 @@ class TestProtectionLevels:
client.use_pin_sequence([PIN4]) client.use_pin_sequence([PIN4])
client.set_expected_responses( client.set_expected_responses(
[ [
proto.PinMatrixRequest(), messages.PinMatrixRequest,
proto.ButtonRequest(), messages.ButtonRequest,
proto.Success(), messages.Success,
proto.Features(), messages.Features,
] ]
) # TrezorClient reinitializes device ) # TrezorClient reinitializes device
device.apply_settings(client, label="nazdar") device.apply_settings(client, label="nazdar")
@ -60,25 +60,25 @@ class TestProtectionLevels:
client.use_pin_sequence([PIN4, PIN4, PIN4]) client.use_pin_sequence([PIN4, PIN4, PIN4])
client.set_expected_responses( client.set_expected_responses(
[ [
proto.ButtonRequest(), messages.ButtonRequest,
proto.PinMatrixRequest(), messages.PinMatrixRequest,
proto.PinMatrixRequest(), messages.PinMatrixRequest,
proto.PinMatrixRequest(), messages.PinMatrixRequest,
proto.Success(), messages.Success,
proto.Features(), messages.Features,
] ]
) )
device.change_pin(client) device.change_pin(client)
def test_ping(self, client): def test_ping(self, client):
with client: with client:
client.set_expected_responses([proto.ButtonRequest(), proto.Success()]) client.set_expected_responses([messages.ButtonRequest, messages.Success])
client.ping("msg", True) client.ping("msg", True)
@pytest.mark.setup_client(pin=PIN4, passphrase=True) @pytest.mark.setup_client(pin=PIN4, passphrase=True)
def test_get_entropy(self, client): def test_get_entropy(self, client):
with client: with client:
client.set_expected_responses([proto.ButtonRequest(), proto.Entropy()]) client.set_expected_responses([messages.ButtonRequest, messages.Entropy])
misc.get_entropy(client, 10) misc.get_entropy(client, 10)
@pytest.mark.setup_client(pin=PIN4, passphrase=True) @pytest.mark.setup_client(pin=PIN4, passphrase=True)
@ -86,7 +86,11 @@ class TestProtectionLevels:
with client: with client:
client.use_pin_sequence([PIN4]) client.use_pin_sequence([PIN4])
client.set_expected_responses( client.set_expected_responses(
[proto.PinMatrixRequest(), proto.PassphraseRequest(), proto.PublicKey()] [
messages.PinMatrixRequest,
messages.PassphraseRequest,
messages.PublicKey,
]
) )
btc.get_public_node(client, []) btc.get_public_node(client, [])
@ -95,7 +99,11 @@ class TestProtectionLevels:
with client: with client:
client.use_pin_sequence([PIN4]) client.use_pin_sequence([PIN4])
client.set_expected_responses( client.set_expected_responses(
[proto.PinMatrixRequest(), proto.PassphraseRequest(), proto.Address()] [
messages.PinMatrixRequest,
messages.PassphraseRequest,
messages.Address,
]
) )
btc.get_address(client, "Bitcoin", []) btc.get_address(client, "Bitcoin", [])
@ -103,7 +111,7 @@ class TestProtectionLevels:
def test_wipe_device(self, client): def test_wipe_device(self, client):
with client: with client:
client.set_expected_responses( client.set_expected_responses(
[proto.ButtonRequest(), proto.Success(), proto.Features()] [messages.ButtonRequest, messages.Success, messages.Features]
) )
device.wipe(client) device.wipe(client)
@ -111,10 +119,10 @@ class TestProtectionLevels:
def test_reset_device(self, client): def test_reset_device(self, client):
with client: with client:
client.set_expected_responses( client.set_expected_responses(
[proto.ButtonRequest()] [messages.ButtonRequest]
+ [proto.EntropyRequest()] + [messages.EntropyRequest]
+ [proto.ButtonRequest()] * 24 + [messages.ButtonRequest] * 24
+ [proto.Success(), proto.Features()] + [messages.Success, messages.Features]
) )
device.reset(client, False, 128, True, False, "label", "en-US") device.reset(client, False, 128, True, False, "label", "en-US")
@ -122,7 +130,7 @@ class TestProtectionLevels:
# This must fail, because device is already initialized # This must fail, because device is already initialized
# Using direct call because `device.reset` has its own check # Using direct call because `device.reset` has its own check
client.call( client.call(
proto.ResetDevice( messages.ResetDevice(
display_random=False, display_random=False,
strength=128, strength=128,
passphrase_protection=True, passphrase_protection=True,
@ -137,9 +145,9 @@ class TestProtectionLevels:
client.use_mnemonic(MNEMONIC12) client.use_mnemonic(MNEMONIC12)
with client: with client:
client.set_expected_responses( client.set_expected_responses(
[proto.ButtonRequest()] [messages.ButtonRequest]
+ [proto.WordRequest()] * 24 + [messages.WordRequest] * 24
+ [proto.Success(), proto.Features()] + [messages.Success, messages.Features]
) )
device.recover( device.recover(
@ -150,7 +158,7 @@ class TestProtectionLevels:
# This must fail, because device is already initialized # This must fail, because device is already initialized
# Using direct call because `device.reset` has its own check # Using direct call because `device.reset` has its own check
client.call( client.call(
proto.RecoveryDevice( messages.RecoveryDevice(
word_count=12, word_count=12,
passphrase_protection=False, passphrase_protection=False,
pin_protection=False, pin_protection=False,
@ -165,10 +173,10 @@ class TestProtectionLevels:
client.use_pin_sequence([PIN4]) client.use_pin_sequence([PIN4])
client.set_expected_responses( client.set_expected_responses(
[ [
proto.ButtonRequest(), messages.ButtonRequest,
proto.PinMatrixRequest(), messages.PinMatrixRequest,
proto.PassphraseRequest(), messages.PassphraseRequest,
proto.MessageSignature(), messages.MessageSignature,
] ]
) )
btc.sign_message(client, "Bitcoin", [], "testing message") btc.sign_message(client, "Bitcoin", [], "testing message")
@ -177,7 +185,7 @@ class TestProtectionLevels:
def test_verify_message(self, client): def test_verify_message(self, client):
with client: with client:
client.set_expected_responses( client.set_expected_responses(
[proto.ButtonRequest(), proto.ButtonRequest(), proto.Success()] [messages.ButtonRequest, messages.ButtonRequest, messages.Success]
) )
btc.verify_message( btc.verify_message(
client, client,
@ -191,17 +199,17 @@ class TestProtectionLevels:
@pytest.mark.setup_client(pin=PIN4, passphrase=True) @pytest.mark.setup_client(pin=PIN4, passphrase=True)
def test_signtx(self, client): def test_signtx(self, client):
inp1 = proto.TxInputType( inp1 = messages.TxInputType(
address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e address_n=[0], # 14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e
prev_hash=TXHASH_d5f65e, prev_hash=TXHASH_d5f65e,
prev_index=0, prev_index=0,
amount=390000, amount=390000,
) )
out1 = proto.TxOutputType( out1 = messages.TxOutputType(
address="1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1", address="1MJ2tj2ThBE62zXbBYA5ZaN3fdve5CPAz1",
amount=390000 - 10000, amount=390000 - 10000,
script_type=proto.OutputScriptType.PAYTOADDRESS, script_type=messages.OutputScriptType.PAYTOADDRESS,
) )
with client: with client:
@ -209,12 +217,12 @@ class TestProtectionLevels:
client.use_pin_sequence([PIN4]) client.use_pin_sequence([PIN4])
client.set_expected_responses( client.set_expected_responses(
[ [
proto.PinMatrixRequest(), messages.PinMatrixRequest,
proto.PassphraseRequest(), messages.PassphraseRequest,
request_input(0), request_input(0),
request_output(0), request_output(0),
proto.ButtonRequest(code=B.ConfirmOutput), messages.ButtonRequest(code=B.ConfirmOutput),
proto.ButtonRequest(code=B.SignTx), messages.ButtonRequest(code=B.SignTx),
request_input(0), request_input(0),
request_meta(TXHASH_d5f65e), request_meta(TXHASH_d5f65e),
request_input(0, TXHASH_d5f65e), request_input(0, TXHASH_d5f65e),
@ -240,21 +248,23 @@ class TestProtectionLevels:
with client: with client:
client.use_pin_sequence([PIN4]) client.use_pin_sequence([PIN4])
client.set_expected_responses([proto.PinMatrixRequest(), proto.Address()]) client.set_expected_responses([messages.PinMatrixRequest, messages.Address])
btc.get_address(client, "Testnet", [0]) btc.get_address(client, "Testnet", [0])
client.init_device() client.init_device()
assert client.features.unlocked is True assert client.features.unlocked is True
with client: with client:
client.set_expected_responses([proto.Address()]) client.set_expected_responses([messages.Address])
btc.get_address(client, "Testnet", [0]) btc.get_address(client, "Testnet", [0])
@pytest.mark.setup_client(passphrase=True) @pytest.mark.setup_client(passphrase=True)
def test_passphrase_cached(self, client): def test_passphrase_cached(self, client):
with client: with client:
client.set_expected_responses([proto.PassphraseRequest(), proto.Address()]) client.set_expected_responses(
[messages.PassphraseRequest, messages.Address]
)
btc.get_address(client, "Testnet", [0]) btc.get_address(client, "Testnet", [0])
with client: with client:
client.set_expected_responses([proto.Address()]) client.set_expected_responses([messages.Address])
btc.get_address(client, "Testnet", [0]) btc.get_address(client, "Testnet", [0])

View File

@ -34,11 +34,11 @@ PIN4 = "1234"
def test_clear_session(client): def test_clear_session(client):
is_trezor1 = client.features.model == "1" is_trezor1 = client.features.model == "1"
init_responses = [ init_responses = [
messages.PinMatrixRequest() if is_trezor1 else messages.ButtonRequest(), messages.PinMatrixRequest if is_trezor1 else messages.ButtonRequest,
messages.PassphraseRequest(), messages.PassphraseRequest,
] ]
cached_responses = [messages.PublicKey()] cached_responses = [messages.PublicKey]
with client: with client:
client.use_pin_sequence([PIN4]) client.use_pin_sequence([PIN4])
@ -72,7 +72,7 @@ def test_end_session(client):
# get_address will succeed # get_address will succeed
with client: with client:
client.set_expected_responses([messages.Address()]) client.set_expected_responses([messages.Address])
get_test_address(client) get_test_address(client)
client.end_session() client.end_session()
@ -85,12 +85,12 @@ def test_end_session(client):
client.init_device() client.init_device()
assert client.session_id is not None assert client.session_id is not None
with client: with client:
client.set_expected_responses([messages.Address()]) client.set_expected_responses([messages.Address])
get_test_address(client) get_test_address(client)
with client: with client:
# end_session should succeed on empty session too # end_session should succeed on empty session too
client.set_expected_responses([messages.Success()] * 2) client.set_expected_responses([messages.Success] * 2)
client.end_session() client.end_session()
client.end_session() client.end_session()
@ -99,14 +99,14 @@ def test_end_session(client):
def test_cannot_resume_ended_session(client): def test_cannot_resume_ended_session(client):
session_id = client.session_id session_id = client.session_id
with client: with client:
client.set_expected_responses([messages.Features()]) client.set_expected_responses([messages.Features])
client.init_device(session_id=session_id) client.init_device(session_id=session_id)
assert session_id == client.session_id assert session_id == client.session_id
client.end_session() client.end_session()
with client: with client:
client.set_expected_responses([messages.Features()]) client.set_expected_responses([messages.Features])
client.init_device(session_id=session_id) client.init_device(session_id=session_id)
assert session_id != client.session_id assert session_id != client.session_id
@ -138,10 +138,10 @@ def test_session_recycling(client):
with client: with client:
client.set_expected_responses( client.set_expected_responses(
[ [
messages.PassphraseRequest(), messages.PassphraseRequest,
messages.ButtonRequest(), messages.ButtonRequest,
messages.ButtonRequest(), messages.ButtonRequest,
messages.Address(), messages.Address,
] ]
) )
client.use_passphrase("TREZOR") client.use_passphrase("TREZOR")
@ -155,7 +155,7 @@ def test_session_recycling(client):
# it should still be possible to resume the original session # it should still be possible to resume the original session
with client: with client:
# passphrase should still be cached # passphrase should still be cached
client.set_expected_responses([messages.Features(), messages.Address()]) client.set_expected_responses([messages.Features, messages.Address])
client.use_passphrase("TREZOR") client.use_passphrase("TREZOR")
client.init_device(session_id=session_id_orig) client.init_device(session_id=session_id_orig)
assert address == get_test_address(client) assert address == get_test_address(client)

View File

@ -365,7 +365,7 @@ def test_passphrase_length(client):
response = client.call_raw(XPUB_REQUEST) response = client.call_raw(XPUB_REQUEST)
assert isinstance(response, messages.PassphraseRequest) assert isinstance(response, messages.PassphraseRequest)
try: try:
response = client.call(messages.PassphraseAck(passphrase)) response = client.call(messages.PassphraseAck(passphrase=passphrase))
assert expected_result is True, "Call should have failed" assert expected_result is True, "Call should have failed"
assert isinstance(response, messages.PublicKey) assert isinstance(response, messages.PublicKey)
except exceptions.TrezorFailure as e: except exceptions.TrezorFailure as e:

View File

@ -17,5 +17,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 2 "version": 2
} }

View File

@ -17,5 +17,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -415,5 +415,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -17,5 +17,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -17,5 +17,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -17,5 +17,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -17,5 +17,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -17,5 +17,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -23,5 +23,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -17,5 +17,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -19,5 +19,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -6,6 +6,7 @@
} }
], ],
"branch_id": 1991772603, "branch_id": 1991772603,
"extra_data": "0000000000000000000000",
"inputs": [ "inputs": [
{ {
"prev_hash": "340d478f0c5750057d5f5028db8c10993578849e63f5cf8500e33ddefcd5334f", "prev_hash": "340d478f0c5750057d5f5028db8c10993578849e63f5cf8500e33ddefcd5334f",
@ -14,7 +15,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"extra_data": "0000000000000000000000",
"lock_time": 0, "lock_time": 0,
"version": 4, "version": 4,
"version_group_id": 2301567109 "version_group_id": 2301567109

View File

@ -6,6 +6,7 @@
} }
], ],
"branch_id": 1991772603, "branch_id": 1991772603,
"extra_data": "0000000000000000000000",
"inputs": [ "inputs": [
{ {
"prev_hash": "2807c5b126ec8e2b078cab0f12e4c8b4ce1d7724905f8ebef8dca26b0c8e0f1d", "prev_hash": "2807c5b126ec8e2b078cab0f12e4c8b4ce1d7724905f8ebef8dca26b0c8e0f1d",
@ -14,7 +15,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"extra_data": "0000000000000000000000",
"lock_time": 1563046072, "lock_time": 1563046072,
"version": 4, "version": 4,
"version_group_id": 2301567109 "version_group_id": 2301567109

View File

@ -5,5 +5,6 @@
"script_pubkey": "4d7920686f76657263726166742069732066756c6c206f662065656c732e" "script_pubkey": "4d7920686f76657263726166742069732066756c6c206f662065656c732e"
} }
], ],
"lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -5,6 +5,7 @@
"script_pubkey": "76a914e41d2725ac1a94bede7a3fc22bc947868d256b0388ac" "script_pubkey": "76a914e41d2725ac1a94bede7a3fc22bc947868d256b0388ac"
} }
], ],
"extra_data": "0180f0fa0200000000000000000000000066e62d5418432ebcbeaeeaeeb15e94722f2ce3173cb8b43ee5a0f2bb46f18b2f3605fc432aee5015c2c60572243cb2bf8e77b8ce8813d08f48edaf8791df1353f6ed6c64dcf85d4cd0d4414f8531fc863b9948a6fb9a369a6e7c40906bca6fdb6b1f4f9bdebbd822e4370096643bd7861150d60b8dc12312a10dd6fb44cbb5764c51344af3e86d62325aa74145aac20bfd953ea1cc17bfefb1b8e4d530d9b15885191ecd9fc987d7238695ef7d0d38d2b64ed24186775aa3dfe543719b0b7e14bfc671ed1164f3bbd9a4e267bde1755b4225ca4633e0eedc61c4e2248a30ed80b24918cb5ec731a6f1bfbe23425028dfb1f850457f11489759eb58de1a06b451fd2582297374f22ae9b1461fc43ba79ac8e627406089abc1f4438d4bd603abce02124acd18e700ea56a4f3f58d00b58382a1927f2fd01ee5cd17207b3b0bfe00420304dc301df522a86848e675de19c66d4bc9759a653d1247a702366bbfc4ba81870b019d7378d397e6641f16c59c1d4b5da05721adea8563cfc79b3d23976548d37364fa88491593486e7877eb12ccf059b7aed248da9466c18d38dd1609163be9390215c7b3f51f82a126ecb8e6d358b413d836a7850f76044bacb04723081749e78b032249746dfb23dd24ed0d8a21185891483271b60de85ef1bf30b22c7c73ca737a0310405169f78ac0781a15b746cf47c97ce741949d31abaf41f3c6500bcb0dfe0f022b133298b4b11f2be2c12e6f0f622259c46eca07dd57df13c9720da8d5253094020c9a6fc4140831e99c57acc7b52cda69170dd58ceb60841c7e826503d0580c227bf438fd2925094b9545d60d048c2b65e7d8895fb2dda28a38a6460b2b8344186e177cc3f8d00277795728caeed3331a11ac4bdceddd77afeabb4d2e6570b7e3a3d7dfd4c645921f4bf2316054dbfe919d25cecda56ee049667a1edb8b4e24fe067de6f90a9a232a0ec2921c445fca7d208e656e3ab439b42dc81c278bd068bebb97ec2732635d88af856198a9ae9aa0e4ac26b0b8110c1c2ed67152ef40694cc565a83e39962a56ada4a355371632cc10b8aa8c2cfb076a6ea704db19bec85ddfec66454f70bd79b395108f8cd0db287d8f60fdb0d901debc5a5d9fffedc7780e22553f7c450fc148ccddb24b889d75a53e705c7604ae8167641a6e0f1e2a62706cf3b97f8c31b58f85cd20dd956bd8249085f5fa17c9f48361146ae92bf5814dc17e3b55a860be4812390fb6c6188e46f52cfdcf8e7124bd13a7a893b3cd938606c62e83e06ee41cc88c1c402dd8680f37bd328aa84771aa1f9507ab8be11409c7b9af1eb7ff56fd3c271f7590cf7369f57c899c190d22bdaed445e0149a53f8c2cf36d4c038b76a57841d583d100701a8eae12339d997d43b2e2f1ee3bfedcb63818f93461eaf60265f2e511075452ac2c93503b455cbbf0f7ade7eb5fe762f58af97e15b90c79793ee7d6b6dc13a84a5ae21066d4f658aa011247eccf4da44a720dcf6a07c48f67c36259189d93fe63e75cf01a5da0ae856c1c92e1aa9ede062e173c204ae9a7de52c2a2f177da8be275b6b06aad158c12e9c561fbd00dfe576637423edfa1ce0089ef924431f97867c94650cd1760dc64b0e03783c24ad786fa1182d883a77f33d615fe515d8ec7960ebb6dc135b65964a8dae67d9f358eef343dbb2d010f143828234fd351bd8cc4f4d5a06be3c0469428d3d17dd99d565a450057ad6782765e0b4116b54c2de545dc7737849ef0d6a1fc07401b7346ce8c3c46e8d34e17221ba9244da866d9dc5a1e89d9ef1a536a925990c40e0d7bff27a7f2c673cd157ce95178107f3db887d5aaef29aed158a7267bc636fe0fd0c1767c5f70b7ac87a7593fbf6201dd0fa2037e35b5d2ea57ebbba1c72148a6b307b72ab0f449e492d0b36ba6a349163b7e2f7570e71bc068de097d3fff3f30eb0014ad4357fcc8eb99a9a144ecf53d85cc1edc100f22429c70679afd4d08e4d0f4b9008a3c7f360d99851308633fa36bffe608c01e008756611d193bd6a07b47453e4cc7b7c499741ae9703c433c87216976c52f4b656090d2b3988ba6ec625c2047e1e1e19a7a0b7e0dbb17af290b23d8d74f55149353425eb6be85e492272669842673bb5e7b91a68c8eaaba9ca8bf84769b82d127f0a555b328e6b2001488d0d9e812656320610f5210e31349ce056d0294e6afda9532aaa1620e55cbf7e2a292ce53a47ea0f35fee219e666f78628d0efd238a8f128e5f0e668f6fcbc5b214c69c0adfa072f3fba8f9d1150473e539e12dceb72615b04e99ff2d68e5491228edbe893f6218a1b0634ac1b5368dddb64d7979a2e07c62422add5c92731d261c83f584333525c2f7294b5d1ad5e68d952e0748228feb9695a6d20acdb26b7ad44c1860a519ce040dc2e154ef0d03c09a55da09094746cd2b8ad04e625090155bb838e1b6941919b38054e75e4dfc9042efed1353d7eaafa0f566ea092d6d2c0075cf5009763ab1e38f6239d54f85b4fcd25726b9aa98f4f1a05b672a7012ed603d0e14bbe8bf2456c630c8e7709799911eb736a48517dabcb3709a2986616c156e8f87244c523dd44314cacb70a74c743a447214c66e2bf862c0ea5270ec9f9e564f6632045ab74a9905fe93a292abe7500",
"inputs": [ "inputs": [
{ {
"prev_hash": "2036b9e0be36ba6290b4c4620977bf5651bb0fe2a98a8c91209e63871fbc36df", "prev_hash": "2036b9e0be36ba6290b4c4620977bf5651bb0fe2a98a8c91209e63871fbc36df",
@ -13,6 +14,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"extra_data": "0180f0fa0200000000000000000000000066e62d5418432ebcbeaeeaeeb15e94722f2ce3173cb8b43ee5a0f2bb46f18b2f3605fc432aee5015c2c60572243cb2bf8e77b8ce8813d08f48edaf8791df1353f6ed6c64dcf85d4cd0d4414f8531fc863b9948a6fb9a369a6e7c40906bca6fdb6b1f4f9bdebbd822e4370096643bd7861150d60b8dc12312a10dd6fb44cbb5764c51344af3e86d62325aa74145aac20bfd953ea1cc17bfefb1b8e4d530d9b15885191ecd9fc987d7238695ef7d0d38d2b64ed24186775aa3dfe543719b0b7e14bfc671ed1164f3bbd9a4e267bde1755b4225ca4633e0eedc61c4e2248a30ed80b24918cb5ec731a6f1bfbe23425028dfb1f850457f11489759eb58de1a06b451fd2582297374f22ae9b1461fc43ba79ac8e627406089abc1f4438d4bd603abce02124acd18e700ea56a4f3f58d00b58382a1927f2fd01ee5cd17207b3b0bfe00420304dc301df522a86848e675de19c66d4bc9759a653d1247a702366bbfc4ba81870b019d7378d397e6641f16c59c1d4b5da05721adea8563cfc79b3d23976548d37364fa88491593486e7877eb12ccf059b7aed248da9466c18d38dd1609163be9390215c7b3f51f82a126ecb8e6d358b413d836a7850f76044bacb04723081749e78b032249746dfb23dd24ed0d8a21185891483271b60de85ef1bf30b22c7c73ca737a0310405169f78ac0781a15b746cf47c97ce741949d31abaf41f3c6500bcb0dfe0f022b133298b4b11f2be2c12e6f0f622259c46eca07dd57df13c9720da8d5253094020c9a6fc4140831e99c57acc7b52cda69170dd58ceb60841c7e826503d0580c227bf438fd2925094b9545d60d048c2b65e7d8895fb2dda28a38a6460b2b8344186e177cc3f8d00277795728caeed3331a11ac4bdceddd77afeabb4d2e6570b7e3a3d7dfd4c645921f4bf2316054dbfe919d25cecda56ee049667a1edb8b4e24fe067de6f90a9a232a0ec2921c445fca7d208e656e3ab439b42dc81c278bd068bebb97ec2732635d88af856198a9ae9aa0e4ac26b0b8110c1c2ed67152ef40694cc565a83e39962a56ada4a355371632cc10b8aa8c2cfb076a6ea704db19bec85ddfec66454f70bd79b395108f8cd0db287d8f60fdb0d901debc5a5d9fffedc7780e22553f7c450fc148ccddb24b889d75a53e705c7604ae8167641a6e0f1e2a62706cf3b97f8c31b58f85cd20dd956bd8249085f5fa17c9f48361146ae92bf5814dc17e3b55a860be4812390fb6c6188e46f52cfdcf8e7124bd13a7a893b3cd938606c62e83e06ee41cc88c1c402dd8680f37bd328aa84771aa1f9507ab8be11409c7b9af1eb7ff56fd3c271f7590cf7369f57c899c190d22bdaed445e0149a53f8c2cf36d4c038b76a57841d583d100701a8eae12339d997d43b2e2f1ee3bfedcb63818f93461eaf60265f2e511075452ac2c93503b455cbbf0f7ade7eb5fe762f58af97e15b90c79793ee7d6b6dc13a84a5ae21066d4f658aa011247eccf4da44a720dcf6a07c48f67c36259189d93fe63e75cf01a5da0ae856c1c92e1aa9ede062e173c204ae9a7de52c2a2f177da8be275b6b06aad158c12e9c561fbd00dfe576637423edfa1ce0089ef924431f97867c94650cd1760dc64b0e03783c24ad786fa1182d883a77f33d615fe515d8ec7960ebb6dc135b65964a8dae67d9f358eef343dbb2d010f143828234fd351bd8cc4f4d5a06be3c0469428d3d17dd99d565a450057ad6782765e0b4116b54c2de545dc7737849ef0d6a1fc07401b7346ce8c3c46e8d34e17221ba9244da866d9dc5a1e89d9ef1a536a925990c40e0d7bff27a7f2c673cd157ce95178107f3db887d5aaef29aed158a7267bc636fe0fd0c1767c5f70b7ac87a7593fbf6201dd0fa2037e35b5d2ea57ebbba1c72148a6b307b72ab0f449e492d0b36ba6a349163b7e2f7570e71bc068de097d3fff3f30eb0014ad4357fcc8eb99a9a144ecf53d85cc1edc100f22429c70679afd4d08e4d0f4b9008a3c7f360d99851308633fa36bffe608c01e008756611d193bd6a07b47453e4cc7b7c499741ae9703c433c87216976c52f4b656090d2b3988ba6ec625c2047e1e1e19a7a0b7e0dbb17af290b23d8d74f55149353425eb6be85e492272669842673bb5e7b91a68c8eaaba9ca8bf84769b82d127f0a555b328e6b2001488d0d9e812656320610f5210e31349ce056d0294e6afda9532aaa1620e55cbf7e2a292ce53a47ea0f35fee219e666f78628d0efd238a8f128e5f0e668f6fcbc5b214c69c0adfa072f3fba8f9d1150473e539e12dceb72615b04e99ff2d68e5491228edbe893f6218a1b0634ac1b5368dddb64d7979a2e07c62422add5c92731d261c83f584333525c2f7294b5d1ad5e68d952e0748228feb9695a6d20acdb26b7ad44c1860a519ce040dc2e154ef0d03c09a55da09094746cd2b8ad04e625090155bb838e1b6941919b38054e75e4dfc9042efed1353d7eaafa0f566ea092d6d2c0075cf5009763ab1e38f6239d54f85b4fcd25726b9aa98f4f1a05b672a7012ed603d0e14bbe8bf2456c630c8e7709799911eb736a48517dabcb3709a2986616c156e8f87244c523dd44314cacb70a74c743a447214c66e2bf862c0ea5270ec9f9e564f6632045ab74a9905fe93a292abe7500", "lock_time": 0,
"version": 2 "version": 2
} }

View File

@ -9,6 +9,8 @@
"script_pubkey": "76a91490ede9de4bed6e39008375eace793949de9a533288ac" "script_pubkey": "76a91490ede9de4bed6e39008375eace793949de9a533288ac"
} }
], ],
"expiry": 10000000,
"extra_data": "0000000000000000000000",
"inputs": [ "inputs": [
{ {
"prev_hash": "7a25323386b6bb5cc0e99779ffc323014c3672e16c09fdadcf5e680a207788f3", "prev_hash": "7a25323386b6bb5cc0e99779ffc323014c3672e16c09fdadcf5e680a207788f3",
@ -17,8 +19,7 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"expiry": 10000000, "lock_time": 0,
"extra_data": "0000000000000000000000",
"version": 4, "version": 4,
"version_group_id": 2301567109 "version_group_id": 2301567109
} }

View File

@ -9,6 +9,8 @@
"script_pubkey": "76a914a579388225827d9f2fe9014add644487808c695d88ac" "script_pubkey": "76a914a579388225827d9f2fe9014add644487808c695d88ac"
} }
], ],
"expiry": 234352,
"extra_data": "00",
"inputs": [ "inputs": [
{ {
"prev_hash": "01d175a5421206439525542f83d168577e92d59e8283e8862e236a1461d5938a", "prev_hash": "01d175a5421206439525542f83d168577e92d59e8283e8862e236a1461d5938a",
@ -17,8 +19,6 @@
"sequence": 4294967294 "sequence": 4294967294
} }
], ],
"expiry": 234352,
"extra_data": "00",
"lock_time": 234321, "lock_time": 234321,
"version": 3, "version": 3,
"version_group_id": 63210096 "version_group_id": 63210096

View File

@ -9,6 +9,8 @@
"script_pubkey": "76a91474374446b18916decd3292384ea73006ebd268ba88ac" "script_pubkey": "76a91474374446b18916decd3292384ea73006ebd268ba88ac"
} }
], ],
"expiry": 261318,
"extra_data": "00",
"inputs": [ "inputs": [
{ {
"prev_hash": "4e8e8c5a5524cb8b20d05aefd5b1fd004d6c8c584e3e314876f13edb5ba0eead", "prev_hash": "4e8e8c5a5524cb8b20d05aefd5b1fd004d6c8c584e3e314876f13edb5ba0eead",
@ -23,8 +25,6 @@
"sequence": 4294967294 "sequence": 4294967294
} }
], ],
"expiry": 261318,
"extra_data": "00",
"lock_time": 261287, "lock_time": 261287,
"version": 3, "version": 3,
"version_group_id": 63210096 "version_group_id": 63210096

View File

@ -9,6 +9,8 @@
"script_pubkey": "76a914837451e69716a2dac13b6f98ace4d9405f64374488ac" "script_pubkey": "76a914837451e69716a2dac13b6f98ace4d9405f64374488ac"
} }
], ],
"expiry": 208963,
"extra_data": "00",
"inputs": [ "inputs": [
{ {
"prev_hash": "b980eeb137f0078603e187839ee03f1643154abbb96ac0d65bdcf09842688cc5", "prev_hash": "b980eeb137f0078603e187839ee03f1643154abbb96ac0d65bdcf09842688cc5",
@ -17,8 +19,6 @@
"sequence": 4294967294 "sequence": 4294967294
} }
], ],
"expiry": 208963,
"extra_data": "00",
"lock_time": 208932, "lock_time": 208932,
"version": 3, "version": 3,
"version_group_id": 63210096 "version_group_id": 63210096

View File

@ -9,6 +9,7 @@
"script_pubkey": "76a914ed48aa1326c67f80bdd751acd54033efc41d4a6e88ac" "script_pubkey": "76a914ed48aa1326c67f80bdd751acd54033efc41d4a6e88ac"
} }
], ],
"extra_data": "",
"inputs": [ "inputs": [
{ {
"prev_hash": "57dc0b2b6d4fe89a3d652b11a3311ea01e0055599d7835a3c225c1d9a321097c", "prev_hash": "57dc0b2b6d4fe89a3d652b11a3311ea01e0055599d7835a3c225c1d9a321097c",
@ -17,6 +18,6 @@
"sequence": 4294967295 "sequence": 4294967295
} }
], ],
"extra_data": "", "lock_time": 0,
"version": 1 "version": 1
} }

View File

@ -64,9 +64,9 @@ def test_passphrase_works(emulator):
"""Check that passphrase handling in trezorlib works correctly in all versions.""" """Check that passphrase handling in trezorlib works correctly in all versions."""
if emulator.client.features.model == "T" and emulator.client.version < (2, 3, 0): if emulator.client.features.model == "T" and emulator.client.version < (2, 3, 0):
expected_responses = [ expected_responses = [
messages.PassphraseRequest(), messages.PassphraseRequest,
messages.Deprecated_PassphraseStateRequest(), messages.Deprecated_PassphraseStateRequest,
messages.Address(), messages.Address,
] ]
elif ( elif (
emulator.client.features.model == "T" and emulator.client.version < (2, 3, 3) emulator.client.features.model == "T" and emulator.client.version < (2, 3, 3)
@ -74,15 +74,15 @@ def test_passphrase_works(emulator):
emulator.client.features.model == "1" and emulator.client.version < (1, 9, 3) emulator.client.features.model == "1" and emulator.client.version < (1, 9, 3)
): ):
expected_responses = [ expected_responses = [
messages.PassphraseRequest(), messages.PassphraseRequest,
messages.Address(), messages.Address,
] ]
else: else:
expected_responses = [ expected_responses = [
messages.PassphraseRequest(), messages.PassphraseRequest,
messages.ButtonRequest(), messages.ButtonRequest,
messages.ButtonRequest(), messages.ButtonRequest,
messages.Address(), messages.Address,
] ]
with emulator.client: with emulator.client:
@ -101,11 +101,11 @@ def test_init_device(emulator):
""" """
if emulator.client.features.model == "T" and emulator.client.version < (2, 3, 0): if emulator.client.features.model == "T" and emulator.client.version < (2, 3, 0):
expected_responses = [ expected_responses = [
messages.PassphraseRequest(), messages.PassphraseRequest,
messages.Deprecated_PassphraseStateRequest(), messages.Deprecated_PassphraseStateRequest,
messages.Address(), messages.Address,
messages.Features(), messages.Features,
messages.Address(), messages.Address,
] ]
elif ( elif (
emulator.client.features.model == "T" and emulator.client.version < (2, 3, 3) emulator.client.features.model == "T" and emulator.client.version < (2, 3, 3)
@ -113,19 +113,19 @@ def test_init_device(emulator):
emulator.client.features.model == "1" and emulator.client.version < (1, 9, 3) emulator.client.features.model == "1" and emulator.client.version < (1, 9, 3)
): ):
expected_responses = [ expected_responses = [
messages.PassphraseRequest(), messages.PassphraseRequest,
messages.Address(), messages.Address,
messages.Features(), messages.Features,
messages.Address(), messages.Address,
] ]
else: else:
expected_responses = [ expected_responses = [
messages.PassphraseRequest(), messages.PassphraseRequest,
messages.ButtonRequest(), messages.ButtonRequest,
messages.ButtonRequest(), messages.ButtonRequest,
messages.Address(), messages.Address,
messages.Features(), messages.Features,
messages.Address(), messages.Address,
] ]
with emulator.client: with emulator.client: