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

pull/1279/head
matejcik 4 years ago committed by matejcik
parent b41021a5fb
commit 08d896f2f9

@ -15,6 +15,7 @@
# If not, see <https://www.gnu.org/licenses/lgpl-3.0.html>.
import logging
import textwrap
from collections import namedtuple
from copy import deepcopy
@ -245,6 +246,96 @@ class DebugUI:
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):
# This class implements automatic responses
# and other functionality for unit tests
@ -417,13 +508,15 @@ class TrezorClientDebugLink(TrezorClient):
raise RuntimeError("Must be called inside 'with' statement")
# 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
]
)
# only apply those items that are (True, message)
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
@ -469,23 +562,7 @@ class TrezorClientDebugLink(TrezorClient):
for i in range(start_at, stop_at):
exp = self.expected_responses[i]
prefix = " " if i != self.current_response else ">>> "
set_fields = {
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))
output.append(textwrap.indent(exp.format(), prefix))
if stop_at < len(self.expected_responses):
omitted = len(self.expected_responses) - stop_at
output.append(" (...{} following responses omitted)".format(omitted))
@ -493,7 +570,7 @@ class TrezorClientDebugLink(TrezorClient):
output.append("")
if msg is not None:
output.append("Actually received:")
output.append(protobuf.format_message(msg))
output.append(textwrap.indent(protobuf.format_message(msg), " "))
else:
output.append("This message was never received.")
raise AssertionError("\n".join(output))
@ -511,15 +588,9 @@ class TrezorClientDebugLink(TrezorClient):
expected = self.expected_responses[self.current_response]
if msg.__class__ != expected.__class__:
if not expected.match(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
def mnemonic_callback(self, _):

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

@ -30,9 +30,9 @@ pytestmark = pytest.mark.setup_client(pin=PIN4)
def pin_request(client):
return (
messages.PinMatrixRequest()
messages.PinMatrixRequest
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(
[
pin_request(client),
messages.ButtonRequest(),
messages.Success(),
messages.Features(),
messages.ButtonRequest,
messages.Success,
messages.Features,
]
)
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
with client:
# No PIN protection is required.
client.set_expected_responses([messages.Address()])
client.set_expected_responses([messages.Address])
get_test_address(client)
time.sleep(10.1) # sleep more than auto-lock delay
with client:
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)

@ -22,7 +22,7 @@ class TestBasic:
f0 = client.features
# client erases session_id from its features
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
def test_ping(self, client):

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

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

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

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

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

@ -41,7 +41,7 @@ def entropy(data):
def test_entropy(client, entropy_length):
with client:
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)
assert len(ent) == entropy_length

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

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

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

@ -48,9 +48,14 @@ def test_timestamp_included(client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
details = messages.SignTx(version=1, timestamp=0x5DC5448A)
_, 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
@ -74,16 +79,26 @@ def test_timestamp_missing(client):
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
details = messages.SignTx(version=1, timestamp=None)
with pytest.raises(TrezorFailure, match="Timestamp must be set."):
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."):
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,
script_type=messages.OutputScriptType.PAYTOADDRESS,
)
details = messages.SignTx(version=1, timestamp=0x5DC5448A)
prevtx = TX_CACHE[TXHASH_41b29a]
prevtx.timestamp = 0
@ -113,7 +127,8 @@ def test_timestamp_missing_prevtx(client):
"Peercoin",
[inp1],
[out1],
details=details,
version=1,
timestamp=0x5DC5448A,
prev_txes={TXHASH_41b29a: prevtx},
)
@ -124,6 +139,7 @@ def test_timestamp_missing_prevtx(client):
"Peercoin",
[inp1],
[out1],
details=details,
version=1,
timestamp=0x5DC5448A,
prev_txes={TXHASH_41b29a: prevtx},
)

@ -1,3 +1,4 @@
import re
from hashlib import sha256
from io import BytesIO
@ -61,7 +62,13 @@ def hash_tx(data: bytes) -> bytes:
def _check_error_message(value: bytes, model: str, message: str):
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
# T1 has several possible errors
@ -90,7 +97,7 @@ def test_invalid_prev_hash(client, prev_hash):
)
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)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@ -64,9 +64,9 @@ def test_passphrase_works(emulator):
"""Check that passphrase handling in trezorlib works correctly in all versions."""
if emulator.client.features.model == "T" and emulator.client.version < (2, 3, 0):
expected_responses = [
messages.PassphraseRequest(),
messages.Deprecated_PassphraseStateRequest(),
messages.Address(),
messages.PassphraseRequest,
messages.Deprecated_PassphraseStateRequest,
messages.Address,
]
elif (
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)
):
expected_responses = [
messages.PassphraseRequest(),
messages.Address(),
messages.PassphraseRequest,
messages.Address,
]
else:
expected_responses = [
messages.PassphraseRequest(),
messages.ButtonRequest(),
messages.ButtonRequest(),
messages.Address(),
messages.PassphraseRequest,
messages.ButtonRequest,
messages.ButtonRequest,
messages.Address,
]
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):
expected_responses = [
messages.PassphraseRequest(),
messages.Deprecated_PassphraseStateRequest(),
messages.Address(),
messages.Features(),
messages.Address(),
messages.PassphraseRequest,
messages.Deprecated_PassphraseStateRequest,
messages.Address,
messages.Features,
messages.Address,
]
elif (
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)
):
expected_responses = [
messages.PassphraseRequest(),
messages.Address(),
messages.Features(),
messages.Address(),
messages.PassphraseRequest,
messages.Address,
messages.Features,
messages.Address,
]
else:
expected_responses = [
messages.PassphraseRequest(),
messages.ButtonRequest(),
messages.ButtonRequest(),
messages.Address(),
messages.Features(),
messages.Address(),
messages.PassphraseRequest,
messages.ButtonRequest,
messages.ButtonRequest,
messages.Address,
messages.Features,
messages.Address,
]
with emulator.client:

Loading…
Cancel
Save