mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-02-16 01:22:02 +00:00
chore(tests): update to kwargs usage and new btc.sign_tx API
This commit is contained in:
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…
Reference in New Issue
Block a user