def test_thorchain_sign_tx(self): self.requires_firmware("7.0.2") self.setup_mnemonic_nopin_nopassphrase() signature = self.client.thorchain_sign_tx( address_n=parse_path(DEFAULT_BIP32_PATH), account_number=92, chain_id="thorchain", fee=3000, gas=200000, msgs=[make_send( "tthor1ls33ayg26kmltw7jjy55p32ghjna09zp6z69y8", "tthor1jvt443rvhq5h8yrna55yjysvhtju0el7ldnwwy", 10000 )], # full memo memo="SWAP:ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7:0x41e5560054824ea6b0732e656e3ad64e20e94e45:420", sequence=3, testnet = True ) self.assertEqual(hexlify(signature.signature), "a1b9082c6817d4c80b82a2d955f2be26a39b8a5e6909c5fcc52114a5c5e5476e68df191c2be5c88e35ef3090c3bafbd44083e32fbf4d26a809218aeec42ec8a9") self.assertEqual(hexlify(signature.public_key), "031519713b8b42bdc367112d33132cf14cedf928ac5771d444ba459b9497117ba3") signature = self.client.thorchain_sign_tx( address_n=parse_path(DEFAULT_BIP32_PATH), account_number=92, chain_id="thorchain", fee=3000, gas=200000, msgs=[make_send( "tthor1ls33ayg26kmltw7jjy55p32ghjna09zp6z69y8", "tthor1jvt443rvhq5h8yrna55yjysvhtju0el7ldnwwy", 10000 )], # no limit, 's' for swap token memo="s:ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7:0x41e5560054824ea6b0732e656e3ad64e20e94e45:", sequence=3, testnet = True ) self.assertEqual(hexlify(signature.signature), "77f24a90428d104fcb0b2bd5ffe1f05e800c032e01a0f1de883616ba8e26c3781044bc8ce1497d24b1b0997061ed664d378c62e04bac54b4ffe5699177c7387f") self.assertEqual(hexlify(signature.public_key), "031519713b8b42bdc367112d33132cf14cedf928ac5771d444ba459b9497117ba3") signature = self.client.thorchain_sign_tx( address_n=parse_path(DEFAULT_BIP32_PATH), account_number=92, chain_id="thorchain", fee=3000, gas=200000, msgs=[make_send( "tthor1ls33ayg26kmltw7jjy55p32ghjna09zp6z69y8", "tthor1jvt443rvhq5h8yrna55yjysvhtju0el7ldnwwy", 10000 )], # swap to self, "=" for swap token memo="=:ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7::420", sequence=3, testnet = True ) self.assertEqual(hexlify(signature.signature), "67ca2ad82a276645bea14fa9ae7d3f947fefe15906f93a605387d21db37c51f46f2961b62efcb7762d9008b1dbb723b2156294f35031cdd16e8e6931f68e4844") self.assertEqual(hexlify(signature.public_key), "031519713b8b42bdc367112d33132cf14cedf928ac5771d444ba459b9497117ba3") signature = self.client.thorchain_sign_tx( address_n=parse_path(DEFAULT_BIP32_PATH), account_number=92, chain_id="thorchain", fee=3000, gas=200000, msgs=[make_send( "tthor1ls33ayg26kmltw7jjy55p32ghjna09zp6z69y8", "tthor1jvt443rvhq5h8yrna55yjysvhtju0el7ldnwwy", 10000 )], # swap to self, no limit memo="SWAP:BTC.BTC", sequence=3, testnet = True ) self.assertEqual(hexlify(signature.signature), "6e6908262ae5f268e104a567f64b4be18297cc68577962925a1dcbcc2333f7ba5a5446f623a774359d68335804e88448bf432c95dc9777b26effecb339a790a9") self.assertEqual(hexlify(signature.public_key), "031519713b8b42bdc367112d33132cf14cedf928ac5771d444ba459b9497117ba3") signature = self.client.thorchain_sign_tx( address_n=parse_path(DEFAULT_BIP32_PATH), account_number=92, chain_id="thorchain", fee=3000, gas=200000, msgs=[make_send( "tthor1ls33ayg26kmltw7jjy55p32ghjna09zp6z69y8", "tthor1jvt443rvhq5h8yrna55yjysvhtju0el7ldnwwy", 10000 )], # full memo memo="ADD:ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7:0x41e5560054824ea6b0732e656e3ad64e20e94e45", sequence=3, testnet = True ) self.assertEqual(hexlify(signature.signature), "186e81a054517ce4f5134fa5ed6acc6398bd15d5c58361babadd9087fafd7a9122c7978ecc6710f76bebd46df72523f3409c33af387473f61ef167575f11a68b") self.assertEqual(hexlify(signature.public_key), "031519713b8b42bdc367112d33132cf14cedf928ac5771d444ba459b9497117ba3") signature = self.client.thorchain_sign_tx( address_n=parse_path(DEFAULT_BIP32_PATH), account_number=92, chain_id="thorchain", fee=3000, gas=200000, msgs=[make_send( "tthor1ls33ayg26kmltw7jjy55p32ghjna09zp6z69y8", "tthor1jvt443rvhq5h8yrna55yjysvhtju0el7ldnwwy", 10000 )], #'a' for add liquidity memo="a:ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7:0x41e5560054824ea6b0732e656e3ad64e20e94e45", #memo="a:ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7", sequence=3, testnet = True ) self.assertEqual(hexlify(signature.signature), "a98354ed6ee626603cd4416d314d1b875c5ab6a6af83fe1be05a6ac56d620e8f2322d500bba6a7f6e0e2fae810016ebc00be5a580766f171cd5f4a5b2e67263f") self.assertEqual(hexlify(signature.public_key), "031519713b8b42bdc367112d33132cf14cedf928ac5771d444ba459b9497117ba3") signature = self.client.thorchain_sign_tx( address_n=parse_path(DEFAULT_BIP32_PATH), account_number=92, chain_id="thorchain", fee=3000, gas=200000, msgs=[make_send( "tthor1ls33ayg26kmltw7jjy55p32ghjna09zp6z69y8", "tthor1jvt443rvhq5h8yrna55yjysvhtju0el7ldnwwy", 10000 )], #"+" for add liquidity memo="+:ETH.USDT-0xdac17f958d2ee523a2206206994597c13d831ec7:0x41e5560054824ea6b0732e656e3ad64e20e94e45", sequence=3, testnet = True ) self.assertEqual(hexlify(signature.signature), "0409d104aaafe400e86b6172811bf1b44b6cc0065c13df10083a86d02b13b8ce7d40a4935bc022c76dae4793223c0c7d8446c83acdbd8d0188d35d2b7b8e22fc") self.assertEqual(hexlify(signature.public_key), "031519713b8b42bdc367112d33132cf14cedf928ac5771d444ba459b9497117ba3") return
def test_attack_change_input_address(self): # This unit test attempts to modify input address after the Trezor checked # that it matches the change output self.setup_mnemonic_allallall() self.client.set_tx_api(TxApiTestnet) inp1 = proto_types.TxInputType( address_n=parse_path("49'/1'/0'/1/0"), # 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX amount=123456789, prev_hash=unhexlify('20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337'), prev_index=0, script_type=proto_types.SPENDP2SHWITNESS, ) out1 = proto_types.TxOutputType( address='mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC', amount=12300000, script_type=proto_types.PAYTOADDRESS, ) out2 = proto_types.TxOutputType( address_n=parse_path("49'/1'/12345'/1/0"), script_type=proto_types.PAYTOP2SHWITNESS, amount=123456789 - 11000 - 12300000, ) global run_attack run_attack = True def attack_processor(req, msg): global run_attack if req.details.tx_hash is not None: return msg if req.request_type != proto.TXINPUT: return msg if req.details.request_index != 0: return msg if not run_attack: return msg msg.inputs[0].address_n[2] = 12345 + 0x80000000 run_attack = False return msg # Test if the transaction can be signed normally with self.client: self.client.set_expected_responses([ proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmTransferToAccount), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) (signatures, serialized_tx) = self.client.sign_tx('Testnet', [inp1], [out1, out2]) self.assertEqual(hexlify(serialized_tx), b'0100000000010137c361fb8f2d9056ba8c98c5611930fcb48cacfdd0fe2e0449d83eea982f91200000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff02e0aebb00000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac3df39f060000000017a914dae9e09a7fc3bbe5a716fffec1bbb340b82a4fb9870248304502210099b5c4f8fd4402c9c0136fee5f711137d64fc9f14587e01bfa7798f5428f845d0220253e21c98f5b1b64efae69bc2ea9799c5620a43450baa6762a0c3cf4fdc886e5012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7900000000') Vuln20007TrapPrevent(self.client) # Now run the attack, must trigger the exception with self.client: self.client.set_expected_responses([ proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.TxRequest(request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), #proto.TxRequest(request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), #proto.Failure(code=proto_types.Failure_Other), ]) self.assertRaises(CallException, self.client.sign_tx, 'Testnet', [inp1], [out1, out2], debug_processor=attack_processor)
def test_send_multisig_1(self): self.setup_mnemonic_allallall() self.client.set_tx_api(TxApiTestnet) nodes = map( lambda index: self.client.get_public_node( parse_path("999'/1'/%d'" % index)), range(1, 4)) multisig = proto_types.MultisigRedeemScriptType( pubkeys=list( map( lambda n: proto_types.HDNodePathType( node=bip32.deserialize(n.xpub), address_n=[2, 0]), nodes)), signatures=[b'', b'', b''], m=2, ) inp1 = proto_types.TxInputType( address_n=parse_path("999'/1'/1'/2/0"), prev_hash=unhexlify( '9c31922be756c06d02167656465c8dc83bb553bf386a3f478ae65b5c021002be' ), prev_index=1, script_type=proto_types.SPENDP2SHWITNESS, multisig=multisig, amount=1610436) out1 = proto_types.TxOutputType( address='mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC', amount=1605000, script_type=proto_types.PAYTOADDRESS) with self.client: self.client.set_expected_responses([ proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest( code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) (signatures1, _) = self.client.sign_tx('Testnet', [inp1], [out1]) # store signature inp1.multisig.signatures[0] = signatures1[0] # sign with third key inp1.address_n[2] = 0x80000003 self.client.set_expected_responses([ proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest( code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) (signatures2, serialized_tx) = self.client.sign_tx('Testnet', [inp1], [out1]) self.assertEquals( hexlify(serialized_tx), b'01000000000101be0210025c5be68a473f6a38bf53b53bc88d5c46567616026dc056e72b92319c01000000232200201e8dda334f11171190b3da72e526d441491464769679a319a2f011da5ad312a1ffffffff01887d1800000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac040047304402205b44c20cf2681690edaaf7cd2e30d4704124dd8b7eb1fb7f459d3906c3c374a602205ca359b6544ce2c101c979899c782f7d141c3b0454ea69202b1fb4c09d3b715701473044022052fafa64022554ae436dbf781e550bf0d326fef31eea1438350b3ff1940a180102202851bd19203b7fe8582a9ef52e82aa9f61cd52d4bcedfe6dcc0cf782468e6a8e01695221038e81669c085a5846e68e03875113ddb339ecbb7cb11376d4163bca5dc2e2a0c1210348c5c3be9f0e6cf1954ded1c0475beccc4d26aaa9d0cce2dd902538ff1018a112103931140ebe0fbbb7df0be04ed032a54e9589e30339ba7bbb8b0b71b15df1294da53ae00000000' )
def test_send_p2sh(self): self.setup_mnemonic_allallall() self.client.set_tx_api(TxApiTestnet) inp1 = proto_types.TxInputType( address_n=parse_path("49'/1'/0'/1/0"), # 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX amount=123456789, prev_hash=unhexlify( '20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337' ), prev_index=0, script_type=proto_types.SPENDP2SHWITNESS, ) out1 = proto_types.TxOutputType( address='mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC', amount=12300000, script_type=proto_types.PAYTOADDRESS, ) out2 = proto_types.TxOutputType( address='2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX', script_type=proto_types.PAYTOADDRESS, amount=123456789 - 11000 - 12300000, ) with self.client: self.client.set_expected_responses([ proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest( code=proto_types.ButtonRequest_ConfirmOutput), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.ButtonRequest( code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) (signatures, serialized_tx) = self.client.sign_tx('Testnet', [inp1], [out1, out2]) self.assertEquals( hexlify(serialized_tx), b'0100000000010137c361fb8f2d9056ba8c98c5611930fcb48cacfdd0fe2e0449d83eea982f91200000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff02e0aebb00000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac3df39f060000000017a91458b53ea7f832e8f096e896b8713a8c6df0e892ca8702483045022100ccd253bfdf8a5593cd7b6701370c531199f0f05a418cd547dfc7da3f21515f0f02203fa08a0753688871c220648f9edadbdb98af42e5d8269364a326572cf703895b012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7900000000' )
def test_send_dash_dip2_input(self): self.setup_mnemonic_allallall() self.client.set_tx_api(tx_api.TxApiDash) inp1 = proto_types.TxInputType( address_n=parse_path("44'/5'/0'/0/0"), # dash:XdTw4G5AWW4cogGd7ayybyBNDbuB45UpgH amount=4095000260, prev_hash=binascii.unhexlify( "15575a1c874bd60a819884e116c42e6791c8283ce1fc3b79f0d18531a61bbb8a" ), prev_index=1, script_type=proto_types.SPENDADDRESS, ) out1 = proto_types.TxOutputType( address_n=parse_path("44'/5'/0'/1/0"), amount=4000000000, script_type=proto_types.PAYTOADDRESS, ) out2 = proto_types.TxOutputType( address="XrEFMNkxeipYHgEQKiJuqch8XzwrtfH5fm", amount=95000000, script_type=proto_types.PAYTOADDRESS, ) with self.client: self.client.set_expected_responses( [ proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0), ), proto.TxRequest( request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=inp1.prev_hash), ), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType( request_index=0, tx_hash=inp1.prev_hash ), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType( request_index=0, tx_hash=inp1.prev_hash ), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType( request_index=1, tx_hash=inp1.prev_hash ), ), proto.TxRequest( request_type=proto_types.TXEXTRADATA, details=proto_types.TxRequestDetailsType( extra_data_len=39, extra_data_offset=0, tx_hash=inp1.prev_hash, ), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1), ), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1), ), proto.TxRequest(request_type=proto_types.TXFINISHED), ] ) _, serialized_tx = self.client.sign_tx( "Dash", [inp1], [out1, out2] ) self.assertEqual( binascii.hexlify(serialized_tx), "01000000018abb1ba63185d1f0793bfce13c28c891672ec416e18498810ad64b871c5a5715010000006b483045022100f0442b6d9c7533cd6f74afa993b280ed9475276d69df4dac631bc3b5591ba71b022051daf125372c1c477681bbd804a6445d8ff6840901854fb0b485b1c6c7866c44012102936f80cac2ba719ddb238646eb6b78a170a55a52a9b9f08c43523a4a6bd5c896ffffffff0200286bee000000001976a914fd61dd017dad1f505c0511142cc9ac51ef3a5beb88acc095a905000000001976a914aa7a6a1f43dfc34d17e562ce1845b804b73fc31e88ac00000000" )
def test_send_dash(self): self.setup_mnemonic_allallall() self.client.set_tx_api(tx_api.TxApiDash) inp1 = proto_types.TxInputType( address_n=parse_path("44'/5'/0'/0/0"), # dash:XdTw4G5AWW4cogGd7ayybyBNDbuB45UpgH amount=1000000000, prev_hash=binascii.unhexlify( "5579eaa64b2a0233e7d8d037f5a5afc957cedf48f1c4067e9e33ca6df22ab04f" ), prev_index=1, script_type=proto_types.SPENDADDRESS, ) out1 = proto_types.TxOutputType( address="XpTc36DPAeWmaueNBA9JqCg2GC8XDLKSYe", amount=999999000, script_type=proto_types.PAYTOADDRESS, ) with self.client: self.client.set_expected_responses( [ proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0), ), proto.TxRequest( request_type=proto_types.TXMETA, details=proto_types.TxRequestDetailsType(tx_hash=inp1.prev_hash), ), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType( request_index=0, tx_hash=inp1.prev_hash ), ), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType( request_index=1, tx_hash=inp1.prev_hash ), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType( request_index=0, tx_hash=inp1.prev_hash ), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType( request_index=1, tx_hash=inp1.prev_hash ), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0), ), proto.ButtonRequest(code=proto_types.ButtonRequest_ConfirmOutput), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0), ), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0), ), proto.TxRequest(request_type=proto_types.TXFINISHED), ] ) _, serialized_tx = self.client.sign_tx( "Dash", [inp1], [out1] ) self.assertEqual( binascii.hexlify(serialized_tx), "01000000014fb02af26dca339e7e06c4f148dfce57c9afa5f537d0d8e733022a4ba6ea7955010000006a4730440220387be4d1e4b5e355614091416373e99e1a3532b8cc9a8629368060aff2681bdb02200a0c4a5e9eb2ce6adb6c2e01ec8f954463dcc04f531ed8a89a2b40019d5aeb0b012102936f80cac2ba719ddb238646eb6b78a170a55a52a9b9f08c43523a4a6bd5c896ffffffff0118c69a3b000000001976a9149710d6545407e78c326aa8c8ae386ec7f883b0af88ac00000000" )
def test_exchange_dst(self): self.requires_firmware("6.3.0") self.setup_mnemonic_nopin_nopassphrase() signed_exchange_out = proto_exchange.SignedExchangeResponse( responseV2=proto_exchange.ExchangeResponseV2( withdrawal_amount=unhexlify('03cfd863'), withdrawal_address=proto_exchange.ExchangeAddress( coin_type='atom', address='cosmos15cenya0tr7nm3tz2wn3h3zwkht2rxrq7q7h3dj'), deposit_amount=unhexlify( '00000000000000000000000000000000000000000000000000000002540be400' ), deposit_address=proto_exchange.ExchangeAddress( coin_type='cvc', address='0x1d8ce9022f6284c3a5c317f8f34620107214e545'), return_address=proto_exchange.ExchangeAddress( coin_type='cvc', address='0x3f2329C9ADFbcCd9A84f52c906E936A42dA18CB8'), expiration=1480964590181, quoted_rate=unhexlify('04f89e60b8'), api_key=unhexlify( '6ad5831b778484bb849da45180ac35047848e5cac0fa666454f4ff78b8c7399fea6a8ce2c7ee6287bcd78db6610ca3f538d6b3e90ca80c8e6368b6021445950b' ), miner_fee=unhexlify('0186a0'), #100000 order_id=unhexlify('b026bddb3e74470bbab9146c4db58019'), ), signature=b'FAKE_SIG') exchange_type_out = proto_types.ExchangeType( signed_exchange_response=signed_exchange_out, withdrawal_coin_name='Cosmos', withdrawal_address_n=parse_path("m/44'/118'/0'/0/0"), return_address_n=parse_path("m/44'/60'/0'/0/0")) sig_v, sig_r, sig_s, hash, signature_der = self.client.ethereum_sign_tx( n=[2147483692, 2147483708, 2147483648, 0, 0], nonce=1, gas_price=20, gas_limit=20, value=0, to=unhexlify('41e5560054824ea6b0732e656e3ad64e20e94e45'), address_type=3, exchange_type=exchange_type_out, chain_id=1, data=unhexlify( 'a9059cbb000000000000000000000000' + '1d8ce9022f6284c3a5c317f8f34620107214e545' + '00000000000000000000000000000000000000000000000000000002540be400' )) self.assertEqual(sig_v, 37) self.assertEqual( hexlify(sig_r), '1238fd332545415f09a01470350a5a20abc784dbf875cf58f7460560e66c597f') self.assertEqual( hexlify(sig_s), '10efa4dd6fdb381c317db8f815252c2ac0d2a883bd364901dee3dec5b7d3660a') self.assertEqual( hexlify(hash), '3878462365df8bd2253c72dfe6e5cb744c64915e23fd5556f7077e43950a1afd') self.assertEqual( hexlify(signature_der), '304402201238fd332545415f09a01470350a5a20abc784dbf875cf58f7460560e66c597f022010efa4dd6fdb381c317db8f815252c2ac0d2a883bd364901dee3dec5b7d3660a' )
def test_sign(self): self.requires_firmware("6.4.0") self.setup_mnemonic_allallall() msg = messages.RippleSignTx( address_n=parse_path("m/44'/144'/0'/0/0"), payment=messages.RipplePayment( amount=100000000, destination="rBKz5MC2iXdoS3XgnNSYmF69K1Yo4NS3Ws" ), flags=0x80000000, fee=100000, sequence=25 ) resp = self.client.call(msg) self.assertEqual( binascii.hexlify(resp.serialized_tx), "12000022800000002400000019614000000005f5e1006840000000000186a0732102131facd1eab748d6cddc492f54b04e8c35658894f4add2232ebc5afe7521dbe474473045022100e243ef623675eeeb95965c35c3e06d63a9fc68bb37e17dc87af9c0af83ec057e02206ca8aa5eaab8396397aef6d38d25710441faf7c79d292ee1d627df15ad9346c081148fb40e1ffa5d557ce9851a535af94965e0dd098883147148ebebf7304ccdf1676fefcf9734cf1e780826" ) self.assertEqual( binascii.hexlify(resp.signature), "3045022100e243ef623675eeeb95965c35c3e06d63a9fc68bb37e17dc87af9c0af83ec057e02206ca8aa5eaab8396397aef6d38d25710441faf7c79d292ee1d627df15ad9346c0" ) # ---- msg = messages.RippleSignTx( address_n=parse_path("m/44'/144'/0'/0/2"), payment=messages.RipplePayment( amount=1, destination="rNaqKtKrMSwpwZSzRckPf7S96DkimjkF4H" ), fee=10, sequence=1 ) resp = self.client.call(msg) self.assertEqual( binascii.hexlify(resp.signature), "3044022069900e6e578997fad5189981b74b16badc7ba8b9f1052694033fa2779113ddc002206c8006ada310edf099fb22c0c12073550c8fc73247b236a974c5f1144831dd5f" ) self.assertEqual( binascii.hexlify(resp.serialized_tx), "1200002280000000240000000161400000000000000168400000000000000a732103dbed1e77cb91a005e2ec71afbccce5444c9be58276665a3859040f692de8fed274463044022069900e6e578997fad5189981b74b16badc7ba8b9f1052694033fa2779113ddc002206c8006ada310edf099fb22c0c12073550c8fc73247b236a974c5f1144831dd5f8114bdf86f3ae715ba346b7772ea0e133f48828b766483148fb40e1ffa5d557ce9851a535af94965e0dd0988" ) # ---- msg = messages.RippleSignTx( address_n=parse_path("m/44'/144'/0'/0/2"), payment=messages.RipplePayment( amount=100000009, destination="rNaqKtKrMSwpwZSzRckPf7S96DkimjkF4H", destination_tag=123456 ), fee=100, sequence=100, last_ledger_sequence=333111 ) resp = self.client.call(msg) self.assertEqual( binascii.hexlify(resp.signature), "30450221008770743a472bb2d1c746a53ef131cc17cc118d538ec910ca928d221db4494cf702201e4ef242d6c3bff110c3cc3897a471fed0f5ac10987ea57da63f98dfa01e94df" ) self.assertEqual( binascii.hexlify(resp.serialized_tx), "120000228000000024000000642e0001e240201b00051537614000000005f5e109684000000000000064732103dbed1e77cb91a005e2ec71afbccce5444c9be58276665a3859040f692de8fed2744730450221008770743a472bb2d1c746a53ef131cc17cc118d538ec910ca928d221db4494cf702201e4ef242d6c3bff110c3cc3897a471fed0f5ac10987ea57da63f98dfa01e94df8114bdf86f3ae715ba346b7772ea0e133f48828b766483148fb40e1ffa5d557ce9851a535af94965e0dd0988" )
# # You should have received a copy of the GNU Lesser General Public License # along with this library. If not, see <http://www.gnu.org/licenses/>. # # The script has been modified for KeepKey Device. import unittest import common import binascii import keepkeylib.ckd_public as bip32 import keepkeylib.types_pb2 as proto_types import keepkeylib.messages_eos_pb2 as eos_proto from keepkeylib.tools import parse_path import keepkeylib.eos as eos EOS_ACCOUNT_0_PATH = parse_path("m/44'/194'/0'/0/0") EOS_ACCOUNT_0_PUBKEY = '4u6Sfnzj4Sh2pEQnkXyZQJqH3PkKjGByDCbsqqmyq6PttM9KyB' EOS_ACCOUNT_1_PATH = parse_path("m/44'/194'/1'/0/0") EOS_ACCOUNT_1_PUBKEY = '7UuNeTf13nfcG85rDB7AHGugZi4C4wJ4ft12QRotqNfxdV2NvP' ACCOUNT_NONE_PATH = [] ACCOUNT_NONE_PUBKEY = '8hhFGcdMry96GpvyxnAGFsnyaNHzXu3Hw61Fy1CnmJUQDQBhqk' class TestMsgEosGetPublicKey(common.KeepKeyTest): def test(self): self.setup_mnemonic_nopin_nopassphrase() vec = [ (EOS_ACCOUNT_0_PATH, False, True, 'EOS' + EOS_ACCOUNT_0_PUBKEY), (EOS_ACCOUNT_1_PATH, False, True, 'EOS' + EOS_ACCOUNT_1_PUBKEY), (ACCOUNT_NONE_PATH, False, True, 'EOS' + ACCOUNT_NONE_PUBKEY), (EOS_ACCOUNT_0_PATH, False, False,
# You should have received a copy of the GNU Lesser General Public License # along with this library. If not, see <http://www.gnu.org/licenses/>. # # The script has been modified for KeepKey Device. import unittest import common from binascii import hexlify, unhexlify from keepkeylib.client import CallException from keepkeylib.tools import parse_path from keepkeylib import messages_pb2 as proto from keepkeylib import messages_nano_pb2 as proto_nano from keepkeylib import types_pb2 as proto_types from keepkeylib import nano NANO_ACCOUNT_0_PATH = parse_path("m/44'/165'/0'") NANO_ACCOUNT_0_ADDRESS = 'xrb_1bhbsc9yuh15anq3owu1izw1nk7bhhqefrkhfo954fyt8dk1q911buk1kk4c' NANO_ACCOUNT_1_PATH = parse_path("m/44'/165'/1'") NANO_ACCOUNT_1_ADDRESS = 'xrb_3p9ws1t6nx7r5xunf7khtbzqwa9ncjte9fmiy59eiyjkkfds6z5zgpom1cxs' NANO_ACCOUNT_1_PUBLICKEY = 'd8fcc8344a74b81f7746964fd27f7e20f45474c3b670f0cec87a329357927c7f' OTHER_ACCOUNT_3_PATH = parse_path("m/44'/100'/3'") OTHER_ACCOUNT_3_ADDRESS = 'xrb_1x9k73o5icut7pr8khu9xcgtbaau6z6fh5fxxb5m9s3fpzuoe6aio9xjz4et' OTHER_ACCOUNT_3_PUBLICKEY = '74f2286a382b7a2db0693f67ea9da4a11b27c8d78dbdea4733e42db7f7561110' REP_OFFICIAL_1 = 'xrb_3arg3asgtigae3xckabaaewkx3bzsh7nwz7jkmjos79ihyaxwphhm6qgjps4' REP_NANODE = 'xrb_1nanode8ngaakzbck8smq6ru9bethqwyehomf79sae1k7xd47dkidjqzffeg' RECIPIENT_DONATIONS = 'xrb_3wm37qz19zhei7nzscjcopbrbnnachs4p1gnwo5oroi3qonw6inwgoeuufdp' RECIPIENT_DONATIONS_PUBLICKEY = 'f2612dfe03fdec8169fcaa2aad9384d28853f22b01d4e5475c5601bd69c2429c' class TestMsgNanoSignTx(common.KeepKeyTest): def test_encode_balance(self):
def test_send_mixedmode_change(self): self.setup_mnemonic_allallall() self.client.set_tx_api(TxApiTestnet) inp1 = proto_types.TxInputType( address_n=parse_path("49'/1'/0'/1/0"), # 2N1LGaGg836mqSQqiuUBLfcyGBhyZbremDX amount=123456789, prev_hash=unhexlify( '20912f98ea3ed849042efed0fdac8cb4fc301961c5988cba56902d8ffb61c337' ), prev_index=0, script_type=proto_types.SPENDP2SHWITNESS, ) out1 = proto_types.TxOutputType( address='mhRx1CeVfaayqRwq5zgRQmD7W5aWBfD5mC', amount=12300000, script_type=proto_types.PAYTOADDRESS, ) out2 = proto_types.TxOutputType( address_n=parse_path("49'/1'/0'/1/0"), script_type=proto_types.PAYTOADDRESS, amount=123456789 - 11000 - 12300000, ) with self.client: self.client.set_expected_responses([ proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.ButtonRequest( code=proto_types.ButtonRequest_ConfirmOutput), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.ButtonRequest( code=proto_types.ButtonRequest_ConfirmTransferToAccount), proto.ButtonRequest(code=proto_types.ButtonRequest_SignTx), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest( request_type=proto_types.TXOUTPUT, details=proto_types.TxRequestDetailsType(request_index=1)), proto.TxRequest( request_type=proto_types.TXINPUT, details=proto_types.TxRequestDetailsType(request_index=0)), proto.TxRequest(request_type=proto_types.TXFINISHED), ]) (signatures, serialized_tx) = self.client.sign_tx('Testnet', [inp1], [out1, out2]) self.assertEquals( hexlify(serialized_tx), b'0100000000010137c361fb8f2d9056ba8c98c5611930fcb48cacfdd0fe2e0449d83eea982f91200000000017160014d16b8c0680c61fc6ed2e407455715055e41052f5ffffffff02e0aebb00000000001976a91414fdede0ddc3be652a0ce1afbc1b509a55b6b94888ac3df39f06000000001976a914d16b8c0680c61fc6ed2e407455715055e41052f588ac024730440220256d513a7c3a265a673d68028f6d6ba816db58e9337c90ad320b39074ce8ea0202203beca720ee6ea268a29576adcaab2bc41b6622bc79f722e74e081a238564169f012103e7bfe10708f715e8538c92d46ca50db6f657bbc455b7494e6a0303ccdb868b7900000000' )