diff --git a/.travis.yml b/.travis.yml index e9c11d7460..57264da624 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,8 +26,9 @@ python: install: # Optimisation: build requirements as wheels, which get cached by Travis - - pip install "pip>=7.0" wheel - - pip install "setuptools>=38" + - pip install "pip>=9.0" wheel # pip 9.0 understands `python_requires` constraints + - pip install "setuptools>=38" # setuptools >= 38 are capable of using prebuilt wheels + - pip install "virtualenv<16.0.0" # virtualenv 16.0.0 drops support for py33 without properly declaring it - pip install tox-travis - pip install flake8 # protobuf-related dependencies diff --git a/trezorctl b/trezorctl index 52d82050c2..1f9a502d85 100755 --- a/trezorctl +++ b/trezorctl @@ -894,33 +894,6 @@ def lisk_get_public_key(connect, address, show_display): return output -@cli.command(help='Sign message with Lisk address.') -@click.option('-n', '--address', required=True, help="BIP-32 path, e.g. m/44'/134'/0'/0'") -@click.argument('message') -@click.pass_obj -def lisk_sign_message(connect, address, message): - client = connect() - address_n = tools.parse_path(address) - res = client.lisk_sign_message(address_n, message) - output = { - 'message': message, - 'address': res.address, - 'signature': binascii.hexlify(res.signature).decode() - } - return output - - -@cli.command(help='Verify message signed with Lisk address.') -@click.argument('pubkey') -@click.argument('signature') -@click.argument('message') -@click.pass_obj -def lisk_verify_message(connect, pubkey, signature, message): - signature = bytes.fromhex(signature) - pubkey = bytes.fromhex(pubkey) - return connect().lisk_verify_message(pubkey, signature, message) - - @cli.command(help='Sign Lisk transaction.') @click.option('-n', '--address', required=True, help="BIP-32 path to signing key, e.g. m/44'/134'/0'/0'") @click.option('-f', '--file', type=click.File('r'), default='-', help='Transaction in JSON format') @@ -979,51 +952,17 @@ def stellar_get_address(connect, address): return stellar.address_from_public_key(response.public_key) -@cli.command(help='Sign a string with a Stellar key') -@click.option('-n', '--address', required=False, help="BIP32 path. Default primary account is m/44'/148'/0'. Always use hardened paths and the m/44'/148'/ prefix") -@click.argument('message') -@click.pass_obj -def stellar_sign_message(connect, address, message): - client = connect() - address_n = stellar.expand_path_or_default(client, address) - response = client.stellar_sign_message(address_n, message) - return base64.b64encode(response.signature) - - -@cli.command(help='Verify that a signature is valid') -@click.option('--message-is-b64/--no-message-is-b64', default=False, required=False, help="If set, the message argument will be interpreted as a base64-encoded string") -@click.argument('address') -@click.argument('signatureb64') -@click.argument('message') -@click.pass_obj -def stellar_verify_message(connect, address, message_is_b64, signatureb64, message): - if message_is_b64: - message = base64.b64decode(message) - else: - message = message.encode('utf-8') - - pubkey_bytes = stellar.address_to_public_key(address) - - client = connect() - is_verified = client.stellar_verify_message(pubkey_bytes, base64.b64decode(signatureb64), message) - - if is_verified: - return "Success: message verified" - else: - print("ERROR: invalid signature, verification failed") - sys.exit(1) - - @cli.command(help='Sign a base64-encoded transaction envelope') @click.option('-n', '--address', required=False, help="BIP32 path. Default primary account is m/44'/148'/0'. Always use hardened paths and the m/44'/148'/ prefix") -@click.option('-n', '--network-passphrase', required=False, help="Network passphrase (blank for public network). Testnet is: 'Test SDF Network ; September 2015'") +@click.option('-n', '--network-passphrase', default='Public Global Stellar Network ; September 2015', required=False, help="Network passphrase (blank for public network). Testnet is: 'Test SDF Network ; September 2015'") @click.argument('b64envelope') @click.pass_obj def stellar_sign_transaction(connect, b64envelope, address, network_passphrase): client = connect() + address_n = stellar.expand_path_or_default(client, address) - # raw signature bytes - resp = client.stellar_sign_transaction(base64.b64decode(b64envelope), address_n, network_passphrase) + tx, operations = stellar.parse_transaction_bytes(base64.b64decode(b64envelope)) + resp = client.stellar_sign_transaction(tx, operations, address_n, network_passphrase) return base64.b64encode(resp.signature) diff --git a/trezorlib/client.py b/trezorlib/client.py index b0b9780696..e73f2134ec 100644 --- a/trezorlib/client.py +++ b/trezorlib/client.py @@ -554,20 +554,6 @@ class ProtocolMixin(object): n = self._convert_prime(n) return self.call(proto.LiskGetPublicKey(address_n=n, show_display=show_display)) - @expect(proto.LiskMessageSignature) - def lisk_sign_message(self, n, message): - n = self._convert_prime(n) - message = normalize_nfc(message) - return self.call(proto.LiskSignMessage(address_n=n, message=message)) - - def lisk_verify_message(self, pubkey, signature, message): - message = normalize_nfc(message) - try: - resp = self.call(proto.LiskVerifyMessage(signature=signature, public_key=pubkey, message=message)) - except CallException as e: - resp = e - return isinstance(resp, proto.Success) - @expect(proto.LiskSignedTx) def lisk_sign_tx(self, n, transaction): n = self._convert_prime(n) @@ -1093,16 +1079,14 @@ class ProtocolMixin(object): def stellar_get_public_key(self, address_n): return self.call(proto.StellarGetPublicKey(address_n=address_n)) - def stellar_sign_transaction(self, tx_envelope, address_n, network_passphrase=None): + def stellar_sign_transaction(self, tx, operations, address_n, network_passphrase=None): # default networkPassphrase to the public network if network_passphrase is None: network_passphrase = "Public Global Stellar Network ; September 2015" - tx, operations = stellar.parse_transaction_bytes(tx_envelope) - tx.network_passphrase = network_passphrase tx.address_n = address_n - + tx.num_operations = len(operations) # Signing loop works as follows: # # 1. Start with tx (header information for the transaction) and operations (an array of operation protobuf messagess) @@ -1128,15 +1112,6 @@ class ProtocolMixin(object): return resp - @expect(proto.StellarMessageSignature) - def stellar_sign_message(self, address_n, message): - return self.call(proto.StellarSignMessage(address_n=address_n, message=message)) - - def stellar_verify_message(self, pubkey_bytes, signature, message): - resp = self.call(proto.StellarVerifyMessage(public_key=pubkey_bytes, message=message, signature=signature)) - - return isinstance(resp, proto.Success) - class TrezorClient(ProtocolMixin, TextUIMixin, BaseClient): def __init__(self, transport, *args, **kwargs): diff --git a/trezorlib/messages/Initialize.py b/trezorlib/messages/Initialize.py index 38e35ec73d..fa3453fca8 100644 --- a/trezorlib/messages/Initialize.py +++ b/trezorlib/messages/Initialize.py @@ -6,10 +6,13 @@ class Initialize(p.MessageType): MESSAGE_WIRE_TYPE = 0 FIELDS = { 1: ('state', p.BytesType, 0), + 2: ('skip_passphrase', p.BoolType, 0), } def __init__( self, - state: bytes = None + state: bytes = None, + skip_passphrase: bool = None ) -> None: self.state = state + self.skip_passphrase = skip_passphrase diff --git a/trezorlib/messages/LiskMessageSignature.py b/trezorlib/messages/LiskMessageSignature.py deleted file mode 100644 index b161458386..0000000000 --- a/trezorlib/messages/LiskMessageSignature.py +++ /dev/null @@ -1,18 +0,0 @@ -# Automatically generated by pb2py -from .. import protobuf as p - - -class LiskMessageSignature(p.MessageType): - MESSAGE_WIRE_TYPE = 119 - FIELDS = { - 1: ('address', p.UnicodeType, 0), - 2: ('signature', p.BytesType, 0), - } - - def __init__( - self, - address: str = None, - signature: bytes = None - ) -> None: - self.address = address - self.signature = signature diff --git a/trezorlib/messages/LiskSignMessage.py b/trezorlib/messages/LiskSignMessage.py deleted file mode 100644 index 4194c8a6b8..0000000000 --- a/trezorlib/messages/LiskSignMessage.py +++ /dev/null @@ -1,23 +0,0 @@ -# Automatically generated by pb2py -from .. import protobuf as p -if __debug__: - try: - from typing import List - except ImportError: - List = None - - -class LiskSignMessage(p.MessageType): - MESSAGE_WIRE_TYPE = 118 - FIELDS = { - 1: ('address_n', p.UVarintType, p.FLAG_REPEATED), - 2: ('message', p.BytesType, 0), - } - - def __init__( - self, - address_n: List[int] = None, - message: bytes = None - ) -> None: - self.address_n = address_n if address_n is not None else [] - self.message = message diff --git a/trezorlib/messages/LiskVerifyMessage.py b/trezorlib/messages/LiskVerifyMessage.py deleted file mode 100644 index 235ac3b0f9..0000000000 --- a/trezorlib/messages/LiskVerifyMessage.py +++ /dev/null @@ -1,21 +0,0 @@ -# Automatically generated by pb2py -from .. import protobuf as p - - -class LiskVerifyMessage(p.MessageType): - MESSAGE_WIRE_TYPE = 120 - FIELDS = { - 1: ('signature', p.BytesType, 0), - 2: ('public_key', p.BytesType, 0), - 3: ('message', p.BytesType, 0), - } - - def __init__( - self, - signature: bytes = None, - public_key: bytes = None, - message: bytes = None - ) -> None: - self.signature = signature - self.public_key = public_key - self.message = message diff --git a/trezorlib/messages/MessageType.py b/trezorlib/messages/MessageType.py index 2c76d2115d..66b2787581 100644 --- a/trezorlib/messages/MessageType.py +++ b/trezorlib/messages/MessageType.py @@ -88,18 +88,12 @@ LiskGetAddress = 114 LiskAddress = 115 LiskSignTx = 116 LiskSignedTx = 117 -LiskSignMessage = 118 -LiskMessageSignature = 119 -LiskVerifyMessage = 120 LiskGetPublicKey = 121 LiskPublicKey = 122 StellarGetPublicKey = 200 StellarPublicKey = 201 StellarSignTx = 202 StellarTxOpRequest = 203 -StellarSignMessage = 204 -StellarMessageSignature = 205 -StellarVerifyMessage = 206 StellarCreateAccountOp = 210 StellarPaymentOp = 211 StellarPathPaymentOp = 212 diff --git a/trezorlib/messages/StellarMessageSignature.py b/trezorlib/messages/StellarMessageSignature.py deleted file mode 100644 index 631a04109c..0000000000 --- a/trezorlib/messages/StellarMessageSignature.py +++ /dev/null @@ -1,18 +0,0 @@ -# Automatically generated by pb2py -from .. import protobuf as p - - -class StellarMessageSignature(p.MessageType): - MESSAGE_WIRE_TYPE = 205 - FIELDS = { - 1: ('public_key', p.BytesType, 0), - 2: ('signature', p.BytesType, 0), - } - - def __init__( - self, - public_key: bytes = None, - signature: bytes = None - ) -> None: - self.public_key = public_key - self.signature = signature diff --git a/trezorlib/messages/StellarSignMessage.py b/trezorlib/messages/StellarSignMessage.py deleted file mode 100644 index 190a3dd11e..0000000000 --- a/trezorlib/messages/StellarSignMessage.py +++ /dev/null @@ -1,23 +0,0 @@ -# Automatically generated by pb2py -from .. import protobuf as p -if __debug__: - try: - from typing import List - except ImportError: - List = None - - -class StellarSignMessage(p.MessageType): - MESSAGE_WIRE_TYPE = 204 - FIELDS = { - 1: ('address_n', p.UVarintType, p.FLAG_REPEATED), - 2: ('message', p.UnicodeType, 0), - } - - def __init__( - self, - address_n: List[int] = None, - message: str = None - ) -> None: - self.address_n = address_n if address_n is not None else [] - self.message = message diff --git a/trezorlib/messages/StellarVerifyMessage.py b/trezorlib/messages/StellarVerifyMessage.py deleted file mode 100644 index 2189306d96..0000000000 --- a/trezorlib/messages/StellarVerifyMessage.py +++ /dev/null @@ -1,21 +0,0 @@ -# Automatically generated by pb2py -from .. import protobuf as p - - -class StellarVerifyMessage(p.MessageType): - MESSAGE_WIRE_TYPE = 206 - FIELDS = { - 1: ('public_key', p.BytesType, 0), - 2: ('message', p.BytesType, 0), - 3: ('signature', p.BytesType, 0), - } - - def __init__( - self, - public_key: bytes = None, - message: bytes = None, - signature: bytes = None - ) -> None: - self.public_key = public_key - self.message = message - self.signature = signature diff --git a/trezorlib/messages/TransactionType.py b/trezorlib/messages/TransactionType.py index 34f0a263ac..2d9d20b606 100644 --- a/trezorlib/messages/TransactionType.py +++ b/trezorlib/messages/TransactionType.py @@ -22,6 +22,7 @@ class TransactionType(p.MessageType): 8: ('extra_data', p.BytesType, 0), 9: ('extra_data_len', p.UVarintType, 0), 10: ('decred_expiry', p.UVarintType, 0), + 11: ('overwintered', p.BoolType, 0), } def __init__( @@ -35,7 +36,8 @@ class TransactionType(p.MessageType): outputs_cnt: int = None, extra_data: bytes = None, extra_data_len: int = None, - decred_expiry: int = None + decred_expiry: int = None, + overwintered: bool = None ) -> None: self.version = version self.inputs = inputs if inputs is not None else [] @@ -47,3 +49,4 @@ class TransactionType(p.MessageType): self.extra_data = extra_data self.extra_data_len = extra_data_len self.decred_expiry = decred_expiry + self.overwintered = overwintered diff --git a/trezorlib/messages/__init__.py b/trezorlib/messages/__init__.py index 663224076f..b1c1e8a828 100644 --- a/trezorlib/messages/__init__.py +++ b/trezorlib/messages/__init__.py @@ -96,12 +96,9 @@ from .Initialize import Initialize from .LiskAddress import LiskAddress from .LiskGetAddress import LiskGetAddress from .LiskGetPublicKey import LiskGetPublicKey -from .LiskMessageSignature import LiskMessageSignature from .LiskPublicKey import LiskPublicKey -from .LiskSignMessage import LiskSignMessage from .LiskSignTx import LiskSignTx from .LiskSignedTx import LiskSignedTx -from .LiskVerifyMessage import LiskVerifyMessage from .LoadDevice import LoadDevice from .MessageSignature import MessageSignature from .NEMAddress import NEMAddress @@ -136,16 +133,13 @@ from .StellarCreatePassiveOfferOp import StellarCreatePassiveOfferOp from .StellarGetPublicKey import StellarGetPublicKey from .StellarManageDataOp import StellarManageDataOp from .StellarManageOfferOp import StellarManageOfferOp -from .StellarMessageSignature import StellarMessageSignature from .StellarPathPaymentOp import StellarPathPaymentOp from .StellarPaymentOp import StellarPaymentOp from .StellarPublicKey import StellarPublicKey from .StellarSetOptionsOp import StellarSetOptionsOp -from .StellarSignMessage import StellarSignMessage from .StellarSignTx import StellarSignTx from .StellarSignedTx import StellarSignedTx from .StellarTxOpRequest import StellarTxOpRequest -from .StellarVerifyMessage import StellarVerifyMessage from .Success import Success from .TxAck import TxAck from .TxRequest import TxRequest diff --git a/trezorlib/tests/device_tests/conftest.py b/trezorlib/tests/device_tests/conftest.py index 2a0187e696..5f56afe6e8 100644 --- a/trezorlib/tests/device_tests/conftest.py +++ b/trezorlib/tests/device_tests/conftest.py @@ -28,13 +28,32 @@ def pytest_configure(config): log.enable_debug_output() +def pytest_addoption(parser): + parser.addini("run_xfail", "List of markers that will run even if marked as xfail", "args", []) + + def pytest_runtest_setup(item): - ''' + """ Called for each test item (class, individual tests). - Ensures that 'skip_t2' tests are skipped on T2 - and 'skip_t1' tests are skipped on T1. - ''' + + Performs custom processing, mainly useful for trezor CI testing: + * 'skip_t2' tests are skipped on T2 and 'skip_t1' tests are skipped on T1. + * no test should have both skips at the same time + * allows to 'runxfail' tests specified by 'run_xfail' in pytest.ini + """ + if item.get_marker("skip_t1") and item.get_marker("skip_t2"): + pytest.fail("Don't skip tests for both trezors!") + if item.get_marker("skip_t2") and TREZOR_VERSION == 2: pytest.skip("Test excluded on Trezor T") if item.get_marker("skip_t1") and TREZOR_VERSION == 1: pytest.skip("Test excluded on Trezor 1") + + xfail = item.get_marker("xfail") + run_xfail = any(item.get_marker(marker) for marker in item.config.getini("run_xfail")) + if xfail and run_xfail: + # Deep hack: pytest's private _evalxfail helper determines whether the test should xfail or not. + # The helper caches its result even before this hook runs. + # Here we force-set the result to False, meaning "test does NOT xfail, run as normal" + # IOW, this is basically per-item "--runxfail" + item._evalxfail.result = False diff --git a/trezorlib/tests/device_tests/test_msg_ethereum_getaddress.py b/trezorlib/tests/device_tests/test_msg_ethereum_getaddress.py index 19cce76c69..61f2e7b465 100644 --- a/trezorlib/tests/device_tests/test_msg_ethereum_getaddress.py +++ b/trezorlib/tests/device_tests/test_msg_ethereum_getaddress.py @@ -16,10 +16,12 @@ # You should have received a copy of the GNU Lesser General Public License # along with this library. If not, see . from binascii import hexlify +import pytest from .common import TrezorTest +@pytest.mark.ethereum class TestMsgEthereumGetaddress(TrezorTest): def test_ethereum_getaddress(self): diff --git a/trezorlib/tests/device_tests/test_msg_ethereum_signmessage.py b/trezorlib/tests/device_tests/test_msg_ethereum_signmessage.py index 6e55deae29..87bf119472 100644 --- a/trezorlib/tests/device_tests/test_msg_ethereum_signmessage.py +++ b/trezorlib/tests/device_tests/test_msg_ethereum_signmessage.py @@ -20,6 +20,7 @@ import pytest from .common import TrezorTest +@pytest.mark.ethereum @pytest.mark.skip_t2 class TestMsgEthereumSignmessage(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_ethereum_signtx.py b/trezorlib/tests/device_tests/test_msg_ethereum_signtx.py index d6188bc1dc..4744002335 100644 --- a/trezorlib/tests/device_tests/test_msg_ethereum_signtx.py +++ b/trezorlib/tests/device_tests/test_msg_ethereum_signtx.py @@ -16,16 +16,51 @@ # You should have received a copy of the GNU Lesser General Public License # along with this library. If not, see . from binascii import unhexlify, hexlify - import pytest from .common import TrezorTest from trezorlib import messages as proto +@pytest.mark.ethereum class TestMsgEthereumSigntx(TrezorTest): - def test_ethereum_signtx_erc20_token(self): + def test_ethereum_signtx_known_erc20_token(self): + self.setup_mnemonic_nopin_nopassphrase() + + with self.client: + self.client.set_expected_responses([ + proto.ButtonRequest(code=proto.ButtonRequestType.SignTx), + proto.ButtonRequest(code=proto.ButtonRequestType.SignTx), + proto.EthereumTxRequest(data_length=None), + ]) + + data = bytearray() + # method id signalizing `transfer(address _to, uint256 _value)` function + data.extend(unhexlify('a9059cbb')) + # 1st function argument (to - the receiver) + data.extend(unhexlify('000000000000000000000000574bbb36871ba6b78e27f4b4dcfb76ea0091880b')) + # 2nd function argument (value - amount to be transferred) + data.extend(unhexlify('000000000000000000000000000000000000000000000000000000000bebc200')) + # 200 000 000 in dec, divisibility of ADT = 9, trezor1 displays 0.2 ADT, Trezor T 200 000 000 Wei ADT + + sig_v, sig_r, sig_s = self.client.ethereum_sign_tx( + n=[0, 0], + nonce=0, + gas_price=20, + gas_limit=20, + # ADT token address + to=b'\xd0\xd6\xd6\xc5\xfe\x4a\x67\x7d\x34\x3c\xc4\x33\x53\x6b\xb7\x17\xba\xe1\x67\xdd', + chain_id=1, + # value needs to be 0, token value is set in the contract (data) + value=0, + data=data) + + # taken from T1 might not be 100% correct but still better than nothing + assert hexlify(sig_r) == b'75cf48fa173d8ceb68af9e4fb6b78ef69e6ed5e7679ba6f8e3e91d74b2fb0f96' + assert hexlify(sig_s) == b'65de4a8c35263b2cfff3954b12146e8e568aa67a1c2461d6865e74ef75c7e190' + + def test_ethereum_signtx_unknown_erc20_token(self): self.setup_mnemonic_nopin_nopassphrase() with self.client: @@ -42,22 +77,23 @@ class TestMsgEthereumSigntx(TrezorTest): data.extend(unhexlify('000000000000000000000000574bbb36871ba6b78e27f4b4dcfb76ea0091880b')) # 2nd function argument (value - amount to be transferred) data.extend(unhexlify('0000000000000000000000000000000000000000000000000000000000000123')) + # since this token is unknown trezor should display "unknown token value" sig_v, sig_r, sig_s = self.client.ethereum_sign_tx( n=[0, 0], nonce=0, gas_price=20, gas_limit=20, - # ALTS token address - to=b'\x63\x8a\xc1\x49\xea\x8e\xf9\xa1\x28\x6c\x41\xb9\x77\x01\x7a\xa7\x35\x9e\x6c\xfa', + # unknown token address (Grzegorz Brzęczyszczykiewicz Token) + to=b'\xfc\x6b\x5d\x6a\xf8\xa1\x32\x58\xf7\xcb\xd0\xd3\x9e\x11\xb3\x5e\x01\xa3\x2f\x93', chain_id=1, # value needs to be 0, token value is set in the contract (data) value=0, data=data) # taken from T1 might not be 100% correct but still better than nothing - assert hexlify(sig_r) == b'28bf1b621be9a85d2905fa36511dfbd52ec4b67ba4ad6cb2bd08753c72b93b77' - assert hexlify(sig_s) == b'2fa605244f80a56cb438df55eb9835489288ec2c0ac0280ada2ccaccfe2b7e38' + assert hexlify(sig_r) == b'1707471fbf632e42d18144157aaf4cde101cd9aa9782ad8e30583cfc95ddeef6' + assert hexlify(sig_s) == b'3d2e52ba5904a4bf131abde3f79db826199f5d6f4d241d531d7e8a30a3b9cfd9' def test_ethereum_signtx_nodata(self): self.setup_mnemonic_nopin_nopassphrase() diff --git a/trezorlib/tests/device_tests/test_msg_ethereum_verifymessage.py b/trezorlib/tests/device_tests/test_msg_ethereum_verifymessage.py index 94bf62a08e..d7f6e19abf 100644 --- a/trezorlib/tests/device_tests/test_msg_ethereum_verifymessage.py +++ b/trezorlib/tests/device_tests/test_msg_ethereum_verifymessage.py @@ -21,6 +21,7 @@ import pytest from .common import TrezorTest +@pytest.mark.ethereum @pytest.mark.skip_t2 class TestMsgEthereumVerifymessage(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_getaddress.py b/trezorlib/tests/device_tests/test_msg_getaddress.py index a332dcb0c8..8ae556bb61 100644 --- a/trezorlib/tests/device_tests/test_msg_getaddress.py +++ b/trezorlib/tests/device_tests/test_msg_getaddress.py @@ -47,14 +47,12 @@ class TestMsgGetaddress(TrezorTest): self.setup_mnemonic_nopin_nopassphrase() assert self.client.get_address('Testnet', [111, 42]) == 'moN6aN6NP1KWgnPSqzrrRPvx2x1UtZJssa' - @pytest.mark.skip_t2 def test_bch(self): self.setup_mnemonic_allallall() assert self.client.get_address('Bcash', parse_path("44'/145'/0'/0/0")) == 'bitcoincash:qr08q88p9etk89wgv05nwlrkm4l0urz4cyl36hh9sv' assert self.client.get_address('Bcash', parse_path("44'/145'/0'/0/1")) == 'bitcoincash:qr23ajjfd9wd73l87j642puf8cad20lfmqdgwvpat4' assert self.client.get_address('Bcash', parse_path("44'/145'/0'/1/0")) == 'bitcoincash:qzc5q87w069lzg7g3gzx0c8dz83mn7l02scej5aluw' - @pytest.mark.skip_t2 def test_bch_multisig(self): self.setup_mnemonic_allallall() xpubs = [] diff --git a/trezorlib/tests/device_tests/test_msg_lisk_getaddress.py b/trezorlib/tests/device_tests/test_msg_lisk_getaddress.py index 5ad308fe37..d1e6fd4c63 100644 --- a/trezorlib/tests/device_tests/test_msg_lisk_getaddress.py +++ b/trezorlib/tests/device_tests/test_msg_lisk_getaddress.py @@ -21,7 +21,7 @@ import pytest from .common import TrezorTest -@pytest.mark.xfail # drop when trezor-core PR #90 is merged +@pytest.mark.lisk @pytest.mark.skip_t1 class TestMsgLiskGetaddress(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_lisk_getpublickey.py b/trezorlib/tests/device_tests/test_msg_lisk_getpublickey.py index 1683be4efd..f14a8f8e1e 100644 --- a/trezorlib/tests/device_tests/test_msg_lisk_getpublickey.py +++ b/trezorlib/tests/device_tests/test_msg_lisk_getpublickey.py @@ -21,7 +21,7 @@ import pytest from .common import TrezorTest -@pytest.mark.xfail # drop when trezor-core PR #90 is merged +@pytest.mark.lisk @pytest.mark.skip_t1 class TestMsgLiskGetPublicKey(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_lisk_signmessage.py b/trezorlib/tests/device_tests/test_msg_lisk_signmessage.py deleted file mode 100644 index 022898eb9d..0000000000 --- a/trezorlib/tests/device_tests/test_msg_lisk_signmessage.py +++ /dev/null @@ -1,39 +0,0 @@ -# This file is part of the TREZOR project. -# -# Copyright (C) 2016-2017 Pavol Rusnak -# -# This library is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this library. If not, see . - -from binascii import hexlify -import pytest - -from .common import TrezorTest - - -@pytest.mark.xfail # drop when trezor-core PR #90 is merged -@pytest.mark.skip_t1 -class TestMsgLiskSignmessage(TrezorTest): - - def test_sign(self): - self.setup_mnemonic_nopin_nopassphrase() - sig = self.client.lisk_sign_message([2147483692, 2147483782, 2147483648, 2147483648], 'This is an example of a signed message.') - assert sig.address == '7623396847864198749L' - assert hexlify(sig.signature) == b'af1d384cce25354b5af129662caed6f3514c6f1f6a206662d301fd56aa5549aa23c3f82009f213a7a4d9297015c2e5b06584273df7c42d78b4e531fe4d4fc80e' - - def test_sign_long(self): - self.setup_mnemonic_nopin_nopassphrase() - sig = self.client.lisk_sign_message([2147483692, 2147483782, 2147483648], 'VeryLongMessage!' * 64) - assert sig.address == '17563781916205589679L' - print(hexlify(sig.signature)) - assert hexlify(sig.signature) == b'a675152c2af34e85dbd75740681efb7d67bf910561d6c9d1e075be2f99d9bc544d62c52f6619756b0e329a2f2d82756ced53b4261a028fcee0d37d7e641ef404' diff --git a/trezorlib/tests/device_tests/test_msg_lisk_signtx.py b/trezorlib/tests/device_tests/test_msg_lisk_signtx.py index 35f811acf9..015c450b8a 100644 --- a/trezorlib/tests/device_tests/test_msg_lisk_signtx.py +++ b/trezorlib/tests/device_tests/test_msg_lisk_signtx.py @@ -26,7 +26,7 @@ from trezorlib.tools import parse_path PUBLIC_KEY = unhexlify('eb56d7bbb5e8ea9269405f7a8527fe126023d1db2c973cfac6f760b60ae27294') -@pytest.mark.xfail # drop when trezor-core PR #90 is merged +@pytest.mark.lisk @pytest.mark.skip_t1 class TestMsgLiskSignTx(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_lisk_verifymessage.py b/trezorlib/tests/device_tests/test_msg_lisk_verifymessage.py deleted file mode 100644 index 46efbb7777..0000000000 --- a/trezorlib/tests/device_tests/test_msg_lisk_verifymessage.py +++ /dev/null @@ -1,55 +0,0 @@ -# This file is part of the TREZOR project. -# -# Copyright (C) 2016-2017 Pavol Rusnak -# -# This library is free software: you can redistribute it and/or modify -# it under the terms of the GNU Lesser General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Lesser General Public License for more details. -# -# You should have received a copy of the GNU Lesser General Public License -# along with this library. If not, see . - -from binascii import unhexlify -import pytest - -from .common import TrezorTest -from trezorlib import messages as proto - - -@pytest.mark.xfail # drop when trezor-core PR #90 is merged -@pytest.mark.skip_t1 -class TestMsgLiskVerifymessage(TrezorTest): - - def test_verify(self): - self.setup_mnemonic_nopin_nopassphrase() - with self.client: - self.client.set_expected_responses([ - proto.ButtonRequest(code=proto.ButtonRequestType.Other), - proto.ButtonRequest(code=proto.ButtonRequestType.Other), - proto.Success(message='Message verified') - ]) - self.client.lisk_verify_message( - unhexlify('eb56d7bbb5e8ea9269405f7a8527fe126023d1db2c973cfac6f760b60ae27294'), - unhexlify('af1d384cce25354b5af129662caed6f3514c6f1f6a206662d301fd56aa5549aa23c3f82009f213a7a4d9297015c2e5b06584273df7c42d78b4e531fe4d4fc80e'), - 'This is an example of a signed message.' - ) - - def test_verify_long(self): - self.setup_mnemonic_nopin_nopassphrase() - with self.client: - self.client.set_expected_responses([ - proto.ButtonRequest(code=proto.ButtonRequestType.Other), - proto.ButtonRequest(code=proto.ButtonRequestType.Other), - proto.Success(message='Message verified') - ]) - self.client.lisk_verify_message( - unhexlify('eb56d7bbb5e8ea9269405f7a8527fe126023d1db2c973cfac6f760b60ae27294'), - unhexlify('7b4b481f6a07a874bdd1b590cd2b933c8b571c721484d9dc303f81b22d1f3c5f55ffe0704dbfd543ff9ea3e795facda871ddb422522257d33a8fe16ab4169601'), - 'VeryLongMessage!' * 64 - ) diff --git a/trezorlib/tests/device_tests/test_msg_nem_getaddress.py b/trezorlib/tests/device_tests/test_msg_nem_getaddress.py index 1e199a7637..56c9e4c3b6 100644 --- a/trezorlib/tests/device_tests/test_msg_nem_getaddress.py +++ b/trezorlib/tests/device_tests/test_msg_nem_getaddress.py @@ -21,6 +21,7 @@ from .common import TrezorTest from trezorlib.tools import parse_path +@pytest.mark.nem @pytest.mark.xfail # to be removed when nem is merged class TestMsgNEMGetaddress(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_nem_signtx_mosaics.py b/trezorlib/tests/device_tests/test_msg_nem_signtx_mosaics.py index dda87efb5e..0b92351c8a 100644 --- a/trezorlib/tests/device_tests/test_msg_nem_signtx_mosaics.py +++ b/trezorlib/tests/device_tests/test_msg_nem_signtx_mosaics.py @@ -24,6 +24,7 @@ from trezorlib.tools import parse_path # assertion data from T1 +@pytest.mark.nem @pytest.mark.skip_t2 class TestMsgNEMSignTxMosaics(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_nem_signtx_mosaics_t2.py b/trezorlib/tests/device_tests/test_msg_nem_signtx_mosaics_t2.py index 96112b07ab..90652154c3 100644 --- a/trezorlib/tests/device_tests/test_msg_nem_signtx_mosaics_t2.py +++ b/trezorlib/tests/device_tests/test_msg_nem_signtx_mosaics_t2.py @@ -26,6 +26,7 @@ from trezorlib.tools import parse_path # assertion data from T1 +@pytest.mark.nem @pytest.mark.skip_t1 @pytest.mark.xfail # to be removed when nem is merged class TestMsgNEMSignTxMosaics(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_nem_signtx_multisig.py b/trezorlib/tests/device_tests/test_msg_nem_signtx_multisig.py index bbb429dee4..3ffab48ce7 100644 --- a/trezorlib/tests/device_tests/test_msg_nem_signtx_multisig.py +++ b/trezorlib/tests/device_tests/test_msg_nem_signtx_multisig.py @@ -25,6 +25,7 @@ from trezorlib import nem # assertion data from T1 +@pytest.mark.nem @pytest.mark.xfail # to be removed when nem is merged class TestMsgNEMSignTxMultisig(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_nem_signtx_others.py b/trezorlib/tests/device_tests/test_msg_nem_signtx_others.py index e24c3f740b..c438d82b27 100644 --- a/trezorlib/tests/device_tests/test_msg_nem_signtx_others.py +++ b/trezorlib/tests/device_tests/test_msg_nem_signtx_others.py @@ -25,6 +25,7 @@ from trezorlib.tools import parse_path # assertion data from T1 +@pytest.mark.nem @pytest.mark.xfail # to be removed when nem is merged class TestMsgNEMSignTxOther(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_nem_signtx_transfers.py b/trezorlib/tests/device_tests/test_msg_nem_signtx_transfers.py index 83a4b61cc7..d1ac704b85 100644 --- a/trezorlib/tests/device_tests/test_msg_nem_signtx_transfers.py +++ b/trezorlib/tests/device_tests/test_msg_nem_signtx_transfers.py @@ -26,6 +26,7 @@ from trezorlib.tools import parse_path # assertion data from T1 +@pytest.mark.nem @pytest.mark.xfail # to be removed when nem is merged class TestMsgNEMSignTx(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_recoverydevice.py b/trezorlib/tests/device_tests/test_msg_recoverydevice.py index b8bd50b8cd..5244ac8e9b 100644 --- a/trezorlib/tests/device_tests/test_msg_recoverydevice.py +++ b/trezorlib/tests/device_tests/test_msg_recoverydevice.py @@ -15,7 +15,6 @@ # # You should have received a copy of the GNU Lesser General Public License # along with this library. If not, see . - import pytest from .common import TrezorTest @@ -34,6 +33,11 @@ class TestMsgRecoverydevice(TrezorTest): language='english', enforce_wordlist=True)) + # click through confirmation + assert isinstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + assert isinstance(ret, proto.PinMatrixRequest) # Enter PIN for first time @@ -92,6 +96,11 @@ class TestMsgRecoverydevice(TrezorTest): language='english', enforce_wordlist=True)) + # click through confirmation + assert isinstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + fakes = 0 for _ in range(int(12 * 2)): assert isinstance(ret, proto.WordRequest) @@ -136,6 +145,11 @@ class TestMsgRecoverydevice(TrezorTest): language='english', enforce_wordlist=True)) + # click through confirmation + assert isinstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + assert isinstance(ret, proto.WordRequest) for _ in range(int(12 * 2)): (word, pos) = self.client.debug.read_recovery_word() @@ -154,6 +168,11 @@ class TestMsgRecoverydevice(TrezorTest): language='english', enforce_wordlist=True)) + # click through confirmation + assert isinstance(ret, proto.ButtonRequest) + self.client.debug.press_yes() + ret = self.client.call_raw(proto.ButtonAck()) + assert isinstance(ret, proto.PinMatrixRequest) # Enter PIN for first time diff --git a/trezorlib/tests/device_tests/test_msg_signtx.py b/trezorlib/tests/device_tests/test_msg_signtx.py index 52aa8a3d89..e114ecffce 100644 --- a/trezorlib/tests/device_tests/test_msg_signtx.py +++ b/trezorlib/tests/device_tests/test_msg_signtx.py @@ -17,8 +17,10 @@ # along with this library. If not, see . from binascii import hexlify, unhexlify +import pytest from .common import TrezorTest +from .conftest import TREZOR_VERSION from trezorlib import coins from trezorlib import messages as proto @@ -517,12 +519,9 @@ class TestMsgSigntx(TrezorTest): proto.Failure(code=proto.FailureType.NotEnoughFunds) ]) - try: + with pytest.raises(CallException) as exc: self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) - except CallException as e: - assert e.args[0] == proto.FailureType.NotEnoughFunds - else: - assert False # types.FailureType.NotEnoughFunds expected + assert exc.value.args[0] == proto.FailureType.NotEnoughFunds def test_p2sh(self): self.setup_mnemonic_nopin_nopassphrase() @@ -626,13 +625,10 @@ class TestMsgSigntx(TrezorTest): assert hexlify(serialized_tx) == b'01000000021c032e5715d1da8115a2fe4f57699e15742fe113b0d2d1ca3b594649d322bec6010000006b483045022100f773c403b2f85a5c1d6c9c4ad69c43de66930fff4b1bc818eb257af98305546a0220443bde4be439f276a6ce793664b463580e210ec6c9255d68354449ac0443c76501210338d78612e990f2eea0c426b5e48a8db70b9d7ed66282b3b26511e0b1c75515a6ffffffff6ea42cd8d9c8e5441c4c5f85bfe50311078730d2881494f11f4d2257777a4958010000006b48304502210090cff1c1911e771605358a8cddd5ae94c7b60cc96e50275908d9bf9d6367c79f02202bfa72e10260a146abd59d0526e1335bacfbb2b4401780e9e3a7441b0480c8da0121038caebd6f753bbbd2bb1f3346a43cd32140648583673a31d62f2dfb56ad0ab9e3ffffffff02a0860100000000001976a9142f4490d5263906e4887ca2996b9e207af3e7824088aca0860100000000001976a914812c13d97f9159e54e326b481b8f88a73df8507a88ac00000000' # Now run the attack, must trigger the exception - try: + with pytest.raises(CallException) as exc: self.client.sign_tx('Bitcoin', [inp1, inp2], [out1, out2], debug_processor=attack_processor) - except CallException as exc: - assert exc.args[0] == proto.FailureType.ProcessError - assert exc.args[1] == 'Transaction has changed during signing' - else: - assert False # exception expected + assert exc.value.args[0] in (proto.FailureType.ProcessError, proto.FailureType.DataError) + assert exc.value.args[1].endswith('Transaction has changed during signing') def test_attack_change_input_address(self): # This unit test attempts to modify input address after the Trezor checked @@ -704,13 +700,14 @@ class TestMsgSigntx(TrezorTest): proto.Failure(code=proto.FailureType.ProcessError), ]) # Now run the attack, must trigger the exception - try: + with pytest.raises(CallException) as exc: self.client.sign_tx('Testnet', [inp1], [out1, out2], debug_processor=attack_processor) - except CallException as exc: - assert exc.args[0] == proto.FailureType.ProcessError - assert exc.args[1] == 'Transaction has changed during signing' + + assert exc.value.args[0] == proto.FailureType.ProcessError + if TREZOR_VERSION == 1: + assert exc.value.args[1].endswith('Failed to compile input') else: - assert False # exception expected + assert exc.value.args[1].endswith('Transaction has changed during signing') def test_spend_coinbase(self): # 25 TEST generated to m/1 (mfiGQVPcRcaEvQPYDErR34DcCovtxYvUUV) diff --git a/trezorlib/tests/device_tests/test_msg_signtx_bcash.py b/trezorlib/tests/device_tests/test_msg_signtx_bcash.py index 508364923f..e8036d8388 100644 --- a/trezorlib/tests/device_tests/test_msg_signtx_bcash.py +++ b/trezorlib/tests/device_tests/test_msg_signtx_bcash.py @@ -29,7 +29,6 @@ from trezorlib.tools import parse_path TxApiBcash = coins.tx_api['Bcash'] -@pytest.mark.skip_t2 class TestMsgSigntxBch(TrezorTest): def test_send_bch_change(self): @@ -224,16 +223,14 @@ class TestMsgSigntxBch(TrezorTest): proto.ButtonRequest(code=proto.ButtonRequestType.SignTx), proto.TxRequest(request_type=proto.RequestType.TXINPUT, details=proto.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto.RequestType.TXINPUT, details=proto.TxRequestDetailsType(request_index=1)), - proto.Failure(code=proto.FailureType.ProcessError), + proto.Failure(), ]) - try: + with pytest.raises(CallException) as exc: self.client.sign_tx('Bcash', [inp1, inp2], [out1], debug_processor=attack_processor) - except CallException as exc: - assert exc.args[0] == proto.FailureType.ProcessError - assert exc.args[1] == 'Transaction has changed during signing' - else: - assert False # exception expected + + assert exc.value.args[0] in (proto.FailureType.ProcessError, proto.FailureType.DataError) + assert exc.value.args[1].endswith('Transaction has changed during signing') def test_attack_change_input(self): self.setup_mnemonic_allallall() diff --git a/trezorlib/tests/device_tests/test_msg_signtx_decred.py b/trezorlib/tests/device_tests/test_msg_signtx_decred.py index bc3c0c9957..90b66e02be 100644 --- a/trezorlib/tests/device_tests/test_msg_signtx_decred.py +++ b/trezorlib/tests/device_tests/test_msg_signtx_decred.py @@ -35,8 +35,8 @@ TXHASH_3f7c39 = unhexlify("3f7c395521d38387e7617565fe17628723ef6635a08537ad9c46c TXHASH_16da18 = unhexlify("16da185052740d85a630e79c140558215b64e26c500212b90e16b55d13ca06a8") -@pytest.mark.skip_t1 -@pytest.mark.skip_t2 +@pytest.mark.decred +@pytest.mark.xfail(reason="Decred broken for 👻M👻Y👻S👻T👻E👻R👻I👻O👻U👻S reasons... 😱") class TestMsgSigntxDecred(TrezorTest): def test_send_decred(self): diff --git a/trezorlib/tests/device_tests/test_msg_signtx_segwit.py b/trezorlib/tests/device_tests/test_msg_signtx_segwit.py index a3a1b6022e..f45cd01520 100644 --- a/trezorlib/tests/device_tests/test_msg_signtx_segwit.py +++ b/trezorlib/tests/device_tests/test_msg_signtx_segwit.py @@ -16,9 +16,12 @@ # along with this library. If not, see . from binascii import hexlify, unhexlify +import pytest -from .common import TrezorTest from ..support.ckd_public import deserialize +from .conftest import TREZOR_VERSION +from .common import TrezorTest + from trezorlib import coins from trezorlib import messages as proto from trezorlib.client import CallException @@ -236,10 +239,10 @@ class TestMsgSigntxSegwit(TrezorTest): proto.TxRequest(request_type=proto.RequestType.TXINPUT, details=proto.TxRequestDetailsType(request_index=0)), proto.Failure(code=proto.FailureType.ProcessError), ]) - try: + with pytest.raises(CallException) as exc: self.client.sign_tx('Testnet', [inp1], [out1, out2], debug_processor=attack_processor) - except CallException as exc: - assert exc.args[0] == proto.FailureType.ProcessError - assert exc.args[1] == 'Transaction has changed during signing' + assert exc.value.args[0] == proto.FailureType.ProcessError + if TREZOR_VERSION == 1: + assert exc.value.args[1].endswith("Failed to compile input") else: - assert False # exception expected + assert exc.value.args[1].endswith('Transaction has changed during signing') diff --git a/trezorlib/tests/device_tests/test_msg_signtx_zcash.py b/trezorlib/tests/device_tests/test_msg_signtx_zcash.py index aec7a76ad2..7a437f4c4d 100644 --- a/trezorlib/tests/device_tests/test_msg_signtx_zcash.py +++ b/trezorlib/tests/device_tests/test_msg_signtx_zcash.py @@ -30,7 +30,11 @@ TxApiZcash = coins.tx_api["Zcash"] TXHASH_93373e = unhexlify('93373e63cc626c4a7d049ad775d6511bb5eba985f142db660c9b9f955c722f5c') -@pytest.mark.skip(reason="Broken until we have support for Zcash v3 transactions.") +# Zcash reset their testnet, which broke our test because it was not properly cached. +# Then when we tried to revive it, Overwinter happened and now Trezor is incapable of +# processing v3 transactions. So it's difficult to fix the test until we support v3. +@pytest.mark.zcash +@pytest.mark.xfail(reason="Zcash support is botched due to Overwinter") class TestMsgSigntxZcash(TrezorTest): def test_one_one_fee(self): diff --git a/trezorlib/tests/device_tests/test_msg_stellar_get_public_key.py b/trezorlib/tests/device_tests/test_msg_stellar_get_public_key.py index 85c1d83776..cd7cec2791 100644 --- a/trezorlib/tests/device_tests/test_msg_stellar_get_public_key.py +++ b/trezorlib/tests/device_tests/test_msg_stellar_get_public_key.py @@ -19,6 +19,7 @@ from trezorlib import stellar import pytest +@pytest.mark.stellar @pytest.mark.xfail(TREZOR_VERSION == 2, reason="T2 support is not yet finished") class TestMsgStellarGetPublicKey(TrezorTest): diff --git a/trezorlib/tests/device_tests/test_msg_stellar_sign_transaction.py b/trezorlib/tests/device_tests/test_msg_stellar_sign_transaction.py index 4b23229824..dfef8509e2 100644 --- a/trezorlib/tests/device_tests/test_msg_stellar_sign_transaction.py +++ b/trezorlib/tests/device_tests/test_msg_stellar_sign_transaction.py @@ -17,12 +17,15 @@ # https://www.stellar.org/laboratory/#xdr-viewer # -from base64 import b64decode, b64encode +from base64 import b64encode from .common import TrezorTest from .conftest import TREZOR_VERSION +from binascii import hexlify, unhexlify +from trezorlib import messages as proto import pytest +@pytest.mark.stellar @pytest.mark.xfail(TREZOR_VERSION == 2, reason="T2 support is not yet finished") class TestMsgStellarSignTransaction(TrezorTest): @@ -37,15 +40,29 @@ class TestMsgStellarSignTransaction(TrezorTest): def test_sign_tx_bump_sequence_op(self): self.setup_mnemonic_nopin_nopassphrase() - xdr = b64decode("AAAAABXWSL/k028ZbPtXNf/YylTNS4Iz90PyJEnefPMBzbRpAAAAZAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAt//////////wAAAAAAAAAA") + op = proto.StellarBumpSequenceOp() + op.bump_to = 0x7fffffffffffffff + tx = self._create_msg() - response = self.client.stellar_sign_transaction(xdr, self.get_address_n(), self.get_network_passphrase()) + response = self.client.stellar_sign_transaction(tx, [op], self.get_address_n(), self.get_network_passphrase()) assert b64encode(response.signature) == b'UAOL4ZPYIOzEgM66kBrhyNjLR66dNXtuNrmvd3m0/pc8qCSoLmYY4TybS0lHiMtb+LFZESTaxrpErMHz1sZ6DQ==' def test_sign_tx_account_merge_op(self): self.setup_mnemonic_nopin_nopassphrase() - xdr = b64decode("AAAAABXWSL/k028ZbPtXNf/YylTNS4Iz90PyJEnefPMBzbRpAAAAZAAAAAEAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAgAAAAAXVVkJGaxhbhDFS6eIZFR28WJICfsQBAaUXvtXKAwwuAAAAAAAAAAAQHNtGkAAABAgjoPRj4sW5o7NAXzYOqPK0uxfPbeKb4Qw48LJiCH/XUZ6YVCiZogePC0Z5ISUlozMh6YO6HoYtuLPbm7jq+eCA==") + op = proto.StellarAccountMergeOp() + op.destination_account = unhexlify('5d55642466b185b843152e9e219151dbc5892027ec40101a517bed5ca030c2e0') - response = self.client.stellar_sign_transaction(xdr, self.get_address_n(), self.get_network_passphrase()) + tx = self._create_msg() + + response = self.client.stellar_sign_transaction(tx, [op], self.get_address_n(), self.get_network_passphrase()) assert b64encode(response.signature) == b'gjoPRj4sW5o7NAXzYOqPK0uxfPbeKb4Qw48LJiCH/XUZ6YVCiZogePC0Z5ISUlozMh6YO6HoYtuLPbm7jq+eCA==' + + def _create_msg(self) -> proto.StellarSignTx: + tx = proto.StellarSignTx() + tx.protocol_version = 1 + tx.source_account = unhexlify('15d648bfe4d36f196cfb5735ffd8ca54cd4b8233f743f22449de7cf301cdb469') + tx.fee = 100 + tx.sequence_number = 0x100000000 + tx.memo_type = 0 + return tx diff --git a/trezorlib/tests/device_tests/test_multisig.py b/trezorlib/tests/device_tests/test_multisig.py index 24446835ec..34b29e7c3f 100644 --- a/trezorlib/tests/device_tests/test_multisig.py +++ b/trezorlib/tests/device_tests/test_multisig.py @@ -17,6 +17,7 @@ # along with this library. If not, see . from binascii import hexlify, unhexlify +import pytest from .common import TrezorTest from ..support import ckd_public as bip32 @@ -248,10 +249,8 @@ class TestMultisig(TrezorTest): script_type=proto.OutputScriptType.PAYTOADDRESS ) - try: + with pytest.raises(CallException) as exc: self.client.sign_tx('Bitcoin', [inp1, ], [out1, ]) - except CallException as exc: - assert exc.args[0] == proto.FailureType.DataError - assert exc.args[1] == 'Pubkey not found in multisig script' - else: - assert False # exception expected + + assert exc.value.args[0] == proto.FailureType.DataError + assert exc.value.args[1].endswith('Pubkey not found in multisig script') diff --git a/trezorlib/tests/device_tests/test_op_return.py b/trezorlib/tests/device_tests/test_op_return.py index bfcc973e38..b0f7a94369 100644 --- a/trezorlib/tests/device_tests/test_op_return.py +++ b/trezorlib/tests/device_tests/test_op_return.py @@ -16,9 +16,10 @@ # You should have received a copy of the GNU Lesser General Public License # along with this library. If not, see . from binascii import unhexlify, hexlify +import pytest from .common import TrezorTest - +from .conftest import TREZOR_VERSION from trezorlib import messages as proto from trezorlib.client import CallException @@ -106,10 +107,12 @@ class TestOpReturn(TrezorTest): proto.Failure() ]) - try: + with pytest.raises(CallException) as exc: self.client.sign_tx('Bitcoin', [inp1], [out1]) - except CallException as exc: - assert exc.args[0] == proto.FailureType.DataError - assert exc.args[1] == 'OP_RETURN output with non-zero amount' + + if TREZOR_VERSION == 1: + assert exc.value.args[0] == proto.FailureType.ProcessError + assert exc.value.args[1].endswith("Failed to compile output") else: - assert False # exception expected + assert exc.value.args[0] == proto.FailureType.DataError + assert exc.value.args[1].endswith('OP_RETURN output with non-zero amount') diff --git a/trezorlib/tests/device_tests/test_protection_levels.py b/trezorlib/tests/device_tests/test_protection_levels.py index ba944be418..caaaea1f84 100644 --- a/trezorlib/tests/device_tests/test_protection_levels.py +++ b/trezorlib/tests/device_tests/test_protection_levels.py @@ -131,7 +131,10 @@ class TestProtectionLevels(TrezorTest): def test_recovery_device(self): with self.client: self.client.set_mnemonic(self.mnemonic12) - self.client.set_expected_responses([proto.WordRequest()] * 24 + [proto.Success(), proto.Features()]) + self.client.set_expected_responses( + [proto.ButtonRequest()] + + [proto.WordRequest()] * 24 + + [proto.Success(), proto.Features()]) self.client.recovery_device(12, False, False, 'label', 'english') # This must fail, because device is already initialized @@ -152,7 +155,7 @@ class TestProtectionLevels(TrezorTest): def test_verify_message(self): with self.client: self.setup_mnemonic_pin_passphrase() - self.client.set_expected_responses([proto.ButtonRequest(), proto.Success()]) + self.client.set_expected_responses([proto.ButtonRequest(), proto.ButtonRequest(), proto.Success()]) self.client.verify_message( 'Bitcoin', '14LmW5k4ssUrtbAB4255zdqv3b4w1TuX9e', diff --git a/trigger-travis.sh b/trigger-travis.sh index d9cd2388db..51d47063b3 100755 --- a/trigger-travis.sh +++ b/trigger-travis.sh @@ -2,9 +2,6 @@ # adapted from https://github.com/stephanmg/travis-dependent-builds # variables -USER=trezor -REPO=trezor-core -BRANCH=master SOURCE=trezor/python-trezor if [ "$TRAVIS_REPO_SLUG" != "$SOURCE" ]; then @@ -27,31 +24,42 @@ if [[ "$TRAVIS_JOB_NUMBER" != *.1 ]]; then exit 0; fi -MESSAGE=",\"message\": \"Triggered from upstream build of $TRAVIS_REPO_SLUG by commit "`git rev-parse --short HEAD`"\"" +function trigger_build() { + USER="$1" + REPO="$2" + BRANCH="$3" + echo "attempting to trigger build of $USER/$REPO" -# curl POST request content body -BODY="{ - \"request\": { - \"branch\":\"$BRANCH\" - $MESSAGE -}}" + MESSAGE=",\"message\": \"Triggered from upstream build of $TRAVIS_REPO_SLUG by commit "`git rev-parse --short HEAD`"\"" -echo "attempting to trigger build of $USER/$REPO" -# make a POST request with curl (note %2F could be replaced with -# / and additional curl arguments, however this works too!) -curl -s -X POST \ - -H "Content-Type: application/json" \ - -H "Accept: application/json" \ - -H "Travis-API-Version: 3" \ - -H "Authorization: token ${TRAVIS_TOKEN}" \ - -d "$BODY" \ - https://api.travis-ci.org/repo/${USER}%2F${REPO}/requests \ - | tee /tmp/travis-request-output.$$.txt + # curl POST request content body + BODY="{ + \"request\": { + \"branch\":\"$BRANCH\" + $MESSAGE + }}" -if grep -q '"@type": "error"' /tmp/travis-request-output.$$.txt; then - cat /tmp/travis-request-output.$$.txt - exit 1 -elif grep -q 'access denied' /tmp/travis-request-output.$$.txt; then - cat /tmp/travis-request-output.$$.txt - exit 1 -fi + # make a POST request with curl (note %2F could be replaced with + # / and additional curl arguments, however this works too!) + curl -s -X POST \ + -H "Content-Type: application/json" \ + -H "Accept: application/json" \ + -H "Travis-API-Version: 3" \ + -H "Authorization: token ${TRAVIS_TOKEN}" \ + -d "$BODY" \ + https://api.travis-ci.org/repo/${USER}%2F${REPO}/requests \ + | tee /tmp/travis-request-output.$$.txt + echo + + if grep -q '"@type": "error"' /tmp/travis-request-output.$$.txt; then + cat /tmp/travis-request-output.$$.txt + exit 1 + elif grep -q 'access denied' /tmp/travis-request-output.$$.txt; then + cat /tmp/travis-request-output.$$.txt + exit 1 + fi +} + +# trigger both core and mcu +trigger_build trezor trezor-core master +trigger_build trezor trezor-mcu master diff --git a/vendor/trezor-common b/vendor/trezor-common index 44dfb07cfa..8fc001154e 160000 --- a/vendor/trezor-common +++ b/vendor/trezor-common @@ -1 +1 @@ -Subproject commit 44dfb07cfaafffada4b2ce0d15ba1d90d17cf35e +Subproject commit 8fc001154e49c2c1747957c4a9a1ab92dcc86edb