-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathtest_multi_transfer_sign_cmd.py
More file actions
85 lines (68 loc) · 13.4 KB
/
Copy pathtest_multi_transfer_sign_cmd.py
File metadata and controls
85 lines (68 loc) · 13.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
import pytest
from ragger.backend.interface import BackendInterface
from ragger.error import ExceptionRAPDU
from ragger.firmware import Firmware
from ragger.navigator import Navigator, NavInsID
from ragger.navigator.navigation_scenario import NavigateWithScenario
from application_client.boilerplate_transaction import Transaction
from application_client.boilerplate_command_sender import BoilerplateCommandSender, Errors
from application_client.boilerplate_response_unpacker import unpack_get_public_key_response, unpack_sign_tx_response
from utils import check_signature_validity
import hashlib
from utils import hex_to_bytes
# In this tests we check the behavior of the device when asked to sign a transaction
import logging
# Configure logger
logger = logging.getLogger("test_logger")
logger.setLevel(logging.DEBUG)
# In this test we send to the device a transaction to sign and validate it on screen
# The transaction is short and will be sent in one chunk
# We will ensure that the displayed information is correct by using screenshots comparison
def test_multi_transfer_sign_tx_short_tx(backend, scenario_navigator):
# Use the app interface instead of raw interface
client = BoilerplateCommandSender(backend)
# The path used for this entire test
path: str = "m/44'/1024'/0'/0/0"
# First we need to get the public key of the device in order to build the transaction
rapdu = client.get_public_key(path=path)
logger.debug("rapu.data.hex:%s",rapdu.data.hex())
_, public_key, _, _ = unpack_get_public_key_response(rapdu.data)
logger.debug("pubkey:%s",public_key.hex())
# Create the transaction that will be sent to the device for signing
transaction = Transaction(
#30 batch transaction
rawtx = "00d1b8d4ed29c409000000000000204e000000000000ae6393b337e4a8d856ec00d75af134fdcd6bfe29fd080700c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814a5c9cb3069319f2a011cd38e76eda7861e2981286a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814540938a0cb7cd223b9f2f703478e5181c02ac34d6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814ef22dfc283eaac261dc1bbddc4e01202b15cb5af6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814afa9e7680127ed51c32589df7db969449f01d1756a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814c047c6650b90a70659465e146d1a733c637404ef6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814d48cb31b88145809a27e51795fabf161f3150b006a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8145fe97c36aeef10929e13781d7116eedb3d80cee06a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814a1974d98f04a45d91aa1d55d0dde1b2a6d4c8c686a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814f5efea53513097d1ec45d566f78023888bd6fb636a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81466a6b0273fe5108411a7db69549202851c1fa2b36a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8144b0bbab7ffc6d3f2969584641393c7d92bdab05c6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8149bc6b8aa34da164af2a90e02ce78a0c3663dbb316a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81444a38c25f9c6a439aec183ca99361bfb4609546b6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814f125740ba55e8dccae6d9315563f02ee8753134a6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814f96c7205df38bb5c9c921a55e108d861ed3660846a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814e652629db77fab9dfe2b06d368d6a511505a84556a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814f62ce52d56365fb8ef66d0add5368a16cb4df5486a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81405176291c3609a7c21c449dd17726b9736a7e2306a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81436b6ce6324ca2e819d0132f774373148a8a49c536a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8143b883740230c7f316d3ed9bbd0dba8b95d75496c6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814caa240472a3d192d93d298a671f0edfeb9ff09846a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814cba08137842c0c842965ea30c1253f3dcc53abf46a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814143547cdac6886b9618db3d6eb5d27438b4fa6de6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814963aa650573f20959e32d97e2e8e21e9c3f227266a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814b145aa02932958743c3202b3d75185ec941af2db6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814b47cb4f3c46069d9858c12621ada0c6105f0e0136a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8145fa05cb9211dd435fb83a3391f04097b811ab0836a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814dc685b02f60cbbdc2c17c1fabf225d3a0d8c105f6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8149aadb9899a67adf6a864164240b8d7d1fb7372cc6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81432b3b7c2e8cc2bc56ba6c8c757416387921b14cb6a7cc80210276a7cc86c011ec10a7472616e7366657256321400000000000000000000000000000000000000010068164f6e746f6c6f67792e4e61746976652e496e766f6b6500"
#50 batch transaction
#rawtx = "00d10bc61308c409000000000000204e000000000000ae6393b337e4a8d856ec00d75af134fdcd6bfe29fd900b00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814099e916647213b745fcd854dba837e7348bc3d336a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81442022cdfbd744c86bb3e9d16559a17b6474e37b96a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8149bb1841522878efa4a07d2010825d8cd98a652cf6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814173abc6952b4fc8595a5c322f34b068c0da448686a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814d2153772c0ddbe32b364cb15d360bfd2c01ec0e56a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8146f33888ac344c048c0537f1ee54b5f1e85f413436a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814c035362e3eeaaf65b966d79737ce443c0941ab526a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814c5bc93cb253a5bc588d97acefcc4a6ddf8afd5306a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814d6a9ea60131520b5a8166dae16b7e9cf29b9bce46a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8149993e35f1ec2092e0027bdb53e563b7185ac7d226a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8141a3b21912db9a202623f75c256c5e2247a67edc96a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814ed35b04c8de23e315aff4959433da8d07d6e44b06a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814746209e1dd54db0890fa93cbeb0281e14d82b4206a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81427d358a9f314acc16e70904f6997fbe2e2217ddf6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8148c5af0706be932523f1b6670da56473ea5b11d656a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8149b35c9b8746f8e4cc6ead533da8d5c0bfc0610c46a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814379e4a4ca656c3651632946bb245e8b92193ed856a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8143987fbbece79666397c44ccfc3246b9d35b22bb76a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814c6e30a80825bd0ebaef4b3f2678e566b1174bfe96a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81472d66d722ca4fc221d8e5053f0555b800f08db516a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814b36a9cd1c300c91b08937a01d41eb4d44c4c71dd6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814abb6951d95cdeab83bafbc7b43f33ad2090ff2fa6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814d88f22927143320c08e2aeea4d469bee91614bca6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814b2e1f52255d81f2d50e1c240f5453a0d35ef496b6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814cca2c6eb26d80dd481089a07a604970153ff386d6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81445c260ebbd62181ccb7155b6b453610b1136d2556a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814313792dbbcdbd36822cbc5696d503ecf0a2e372e6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8142b25310f7e3b843312ee4301e880e64681e9b6576a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814858e12e90f66f274e312abac0308afb7e10cc1a06a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814081a1a2b1afdda8e55059f2ba262d8fd66f585846a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8142a72b8f147b020cf2e77a4feda22473d50f1a3916a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8149c6409cdd9599fd88addaddcf8d2c5c753e72bd36a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814e525c5bd71f17772468262d529871ea0741810736a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814725ac9c94aecab576dde6fc8bcf4aab16e45291a6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814b2c20fdb0de8fa3bd73e5ca33c9000f7463ca6326a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8143bb39c29fa221817794cba0377ca22ede966130c6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81457d9d1ad9c8c5e029900615f3e47d7305ef79fb56a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc81473a328a772969151476bbdb2a8d93b3fa165cdd86a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814bbad53def9e5c1671cd77e51741b4b5348b8b0f96a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814f6371d633f01acfa43d52918fef9839579bb0b986a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814aebed07c602dec5432ce34614f2a88c2eca8b62b6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8149e15b4e605c577f22e1d84a669607935de08daed6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814a974682ac46e79d42bbb40904d7622b08f87b97a6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8142691545070b92a2c2200c9a9fb5e7892787bfacd6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814f470edb3dfb61df5997482963e98775843b6b4826a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814683426c713a2c10eb86e74515e8f13d8dd4032516a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814b006219438f277c0f7920ad074ca0c2b2a0459e16a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814430a8a662d1a2ba13e1faebe5df8c10f2f15ea1e6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814acd58bfd1a5cc700d27abdb0d330a7c8c58059136a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814098e2e922b5532de8e9ae8417d3e57553fbfee646a7cc80210276a7cc86c0132c10a7472616e7366657256321400000000000000000000000000000000000000010068164f6e746f6c6f67792e4e61746976652e496e766f6b6500"
).serialize()
# Send the sign device instruction.
# As it requires on-screen validation, the function is asynchronous.
# It will yield the result when the navigation is done
logger.debug("tx:%s",transaction.hex())
with client.sign_tx(path=path, transaction=transaction):
# Validate the on-screen request by performing the navigation appropriate for this device
scenario_navigator.review_approve()
# The device as yielded the result, parse it and ensure that the signature is correct
response = client.get_async_response().data
_, der_sig, _ = unpack_sign_tx_response(response)
first_hash = hashlib.sha256(transaction).digest()
second_hash = hashlib.sha256(first_hash).digest()
logger.debug("pubkey:%s,der_sig:%s,transaction:%s,first_hash:%s",public_key.hex(),der_sig.hex(),transaction.hex(),first_hash.hex())
assert check_signature_validity(public_key, der_sig, second_hash)
# Transaction signature refused test
# The test will ask for a transaction signature that will be refused on screen
def test_multi_transfer_sign_tx_short_tx_refused(backend, scenario_navigator):
# Use the app interface instead of raw interface
client = BoilerplateCommandSender(backend)
path: str = "m/44'/1024'/0'/0/0"
rapdu = client.get_public_key(path=path)
_, pub_key, _, _ = unpack_get_public_key_response(rapdu.data)
transaction = Transaction(
rawtx = "00d1744716e1c409000000000000204e000000000000ae6393b337e4a8d856ec00d75af134fdcd6bfe29af00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc8149b50e5a049679c32e4660266f8814001bde3e6fc6a7cc80210276a7cc86c00c66b14ae6393b337e4a8d856ec00d75af134fdcd6bfe296a7cc814e7f1d24e2d3bb7fa3051c732507ee74753756ff36a7cc80210276a7cc86c52c10a7472616e7366657256321400000000000000000000000000000000000000010068164f6e746f6c6f67792e4e61746976652e496e766f6b6500"
).serialize()
with pytest.raises(ExceptionRAPDU) as e:
with client.sign_tx(path=path, transaction=transaction):
scenario_navigator.review_reject()
# Assert that we have received a refusal
assert e.value.status == Errors.SW_DENY
assert len(e.value.data) == 0