diff --git a/core/src/apps/common/signverify.py b/core/src/apps/common/signverify.py index d175d9edc..da208473c 100644 --- a/core/src/apps/common/signverify.py +++ b/core/src/apps/common/signverify.py @@ -1,8 +1,11 @@ from ubinascii import hexlify -from trezor import utils +from trezor import utils, wire from trezor.crypto.hashlib import blake256, sha256 +from trezor.ui.text import Text +from apps.common.confirm import require_confirm +from apps.common.layout import split_address from apps.wallet.sign_tx.writers import write_varint if False: @@ -33,3 +36,24 @@ def split_message(message: bytes) -> List[str]: m = "hex(%s)" % hexlify(message).decode() words = [m] return words + + +async def require_confirm_sign_message( + ctx: wire.Context, header: str, message: bytes +) -> None: + message = split_message(message) + text = Text(header, new_lines=False) + text.normal(*message) + await require_confirm(ctx, text) + + +async def require_confirm_verify_message( + ctx: wire.Context, address: str, header: str, message: bytes +) -> None: + text = Text("Confirm address", new_lines=False) + text.mono(*split_address(address)) + await require_confirm(ctx, text) + + text = Text(header, new_lines=False) + text.mono(*split_message(message)) + await require_confirm(ctx, text) diff --git a/core/src/apps/ethereum/sign_message.py b/core/src/apps/ethereum/sign_message.py index e029f6951..47c978f42 100644 --- a/core/src/apps/ethereum/sign_message.py +++ b/core/src/apps/ethereum/sign_message.py @@ -1,12 +1,10 @@ from trezor.crypto.curve import secp256k1 from trezor.crypto.hashlib import sha3_256 from trezor.messages.EthereumMessageSignature import EthereumMessageSignature -from trezor.ui.text import Text from trezor.utils import HashWriter from apps.common import paths -from apps.common.confirm import require_confirm -from apps.common.signverify import split_message +from apps.common.signverify import require_confirm_sign_message from apps.ethereum import CURVE, address @@ -23,7 +21,7 @@ async def sign_message(ctx, msg, keychain): await paths.validate_path( ctx, address.validate_full_path, keychain, msg.address_n, CURVE ) - await require_confirm_sign_message(ctx, msg.message) + await require_confirm_sign_message(ctx, "Sign ETH message", msg.message) node = keychain.derive(msg.address_n) signature = secp256k1.sign( @@ -37,10 +35,3 @@ async def sign_message(ctx, msg, keychain): sig.address = address.address_from_bytes(node.ethereum_pubkeyhash()) sig.signature = signature[1:] + bytearray([signature[0]]) return sig - - -async def require_confirm_sign_message(ctx, message): - message = split_message(message) - text = Text("Sign ETH message", new_lines=False) - text.normal(*message) - await require_confirm(ctx, text) diff --git a/core/src/apps/ethereum/verify_message.py b/core/src/apps/ethereum/verify_message.py index b3a636434..ac503848b 100644 --- a/core/src/apps/ethereum/verify_message.py +++ b/core/src/apps/ethereum/verify_message.py @@ -2,11 +2,8 @@ from trezor import wire from trezor.crypto.curve import secp256k1 from trezor.crypto.hashlib import sha3_256 from trezor.messages.Success import Success -from trezor.ui.text import Text -from apps.common.confirm import require_confirm -from apps.common.layout import split_address -from apps.common.signverify import split_message +from apps.common.signverify import require_confirm_verify_message from apps.ethereum.address import address_from_bytes, bytes_from_address from apps.ethereum.sign_message import message_digest @@ -30,16 +27,8 @@ async def verify_message(ctx, msg): address = address_from_bytes(address_bytes) - await require_confirm_verify_message(ctx, address, msg.message) + await require_confirm_verify_message( + ctx, address, "Verify ETH message", msg.message + ) return Success(message="Message verified") - - -async def require_confirm_verify_message(ctx, address, message): - text = Text("Confirm address", new_lines=False) - text.mono(*split_address(address)) - await require_confirm(ctx, text) - - text = Text("Verify message", new_lines=False) - text.mono(*split_message(message)) - await require_confirm(ctx, text) diff --git a/core/src/apps/lisk/sign_message.py b/core/src/apps/lisk/sign_message.py index cbd1f4e07..0293a1329 100644 --- a/core/src/apps/lisk/sign_message.py +++ b/core/src/apps/lisk/sign_message.py @@ -1,12 +1,10 @@ from trezor.crypto.curve import ed25519 from trezor.crypto.hashlib import sha256 from trezor.messages.LiskMessageSignature import LiskMessageSignature -from trezor.ui.text import Text from trezor.utils import HashWriter from apps.common import paths -from apps.common.confirm import require_confirm -from apps.common.signverify import split_message +from apps.common.signverify import require_confirm_sign_message from apps.lisk import CURVE from apps.lisk.helpers import validate_full_path from apps.wallet.sign_tx.writers import write_varint @@ -24,7 +22,7 @@ def message_digest(message): async def sign_message(ctx, msg, keychain): await paths.validate_path(ctx, validate_full_path, keychain, msg.address_n, CURVE) - await require_confirm_sign_message(ctx, msg.message) + await require_confirm_sign_message(ctx, "Sign Lisk message", msg.message) node = keychain.derive(msg.address_n, CURVE) seckey = node.private_key() @@ -34,10 +32,3 @@ async def sign_message(ctx, msg, keychain): signature = ed25519.sign(seckey, message_digest(msg.message)) return LiskMessageSignature(public_key=pubkey, signature=signature) - - -async def require_confirm_sign_message(ctx, message): - message = split_message(message) - text = Text("Sign Lisk message", new_lines=False) - text.normal(*message) - await require_confirm(ctx, text) diff --git a/core/src/apps/lisk/verify_message.py b/core/src/apps/lisk/verify_message.py index c02ca7549..0070b4622 100644 --- a/core/src/apps/lisk/verify_message.py +++ b/core/src/apps/lisk/verify_message.py @@ -5,7 +5,7 @@ from trezor.messages.Success import Success from .helpers import get_address_from_public_key from .sign_message import message_digest -from apps.wallet.verify_message import require_confirm_verify_message +from apps.common.signverify import require_confirm_verify_message async def verify_message(ctx, msg): @@ -15,6 +15,8 @@ async def verify_message(ctx, msg): raise wire.ProcessError("Invalid signature") address = get_address_from_public_key(msg.public_key) - await require_confirm_verify_message(ctx, address, msg.message) + await require_confirm_verify_message( + ctx, address, "Verify Lisk message", msg.message + ) return Success(message="Message verified") diff --git a/core/src/apps/wallet/sign_message.py b/core/src/apps/wallet/sign_message.py index 376d16396..fb4c508b6 100644 --- a/core/src/apps/wallet/sign_message.py +++ b/core/src/apps/wallet/sign_message.py @@ -2,12 +2,10 @@ from trezor import wire from trezor.crypto.curve import secp256k1 from trezor.messages.InputScriptType import SPENDADDRESS, SPENDP2SHWITNESS, SPENDWITNESS from trezor.messages.MessageSignature import MessageSignature -from trezor.ui.text import Text from apps.common import coins -from apps.common.confirm import require_confirm from apps.common.paths import validate_path -from apps.common.signverify import message_digest, split_message +from apps.common.signverify import message_digest, require_confirm_sign_message from apps.wallet.sign_tx.addresses import get_address, validate_full_path @@ -18,7 +16,7 @@ async def sign_message(ctx, msg, keychain): script_type = msg.script_type or 0 coin = coins.by_name(coin_name) - await require_confirm_sign_message(ctx, message) + await require_confirm_sign_message(ctx, "Sign message", message) await validate_path( ctx, validate_full_path, @@ -47,10 +45,3 @@ async def sign_message(ctx, msg, keychain): raise wire.ProcessError("Unsupported script type") return MessageSignature(address=address, signature=signature) - - -async def require_confirm_sign_message(ctx, message): - message = split_message(message) - text = Text("Sign message", new_lines=False) - text.normal(*message) - await require_confirm(ctx, text) diff --git a/core/src/apps/wallet/verify_message.py b/core/src/apps/wallet/verify_message.py index b06fb3308..03bd7f949 100644 --- a/core/src/apps/wallet/verify_message.py +++ b/core/src/apps/wallet/verify_message.py @@ -2,12 +2,9 @@ from trezor import wire from trezor.crypto.curve import secp256k1 from trezor.messages.InputScriptType import SPENDADDRESS, SPENDP2SHWITNESS, SPENDWITNESS from trezor.messages.Success import Success -from trezor.ui.text import Text from apps.common import coins -from apps.common.confirm import require_confirm -from apps.common.layout import split_address -from apps.common.signverify import message_digest, split_message +from apps.common.signverify import message_digest, require_confirm_verify_message from apps.wallet.sign_tx.addresses import ( address_p2wpkh, address_p2wpkh_in_p2sh, @@ -58,16 +55,8 @@ async def verify_message(ctx, msg): if addr != address: raise wire.ProcessError("Invalid signature") - await require_confirm_verify_message(ctx, address_short(coin, address), message) + await require_confirm_verify_message( + ctx, address_short(coin, address), "Verify message", message + ) return Success(message="Message verified") - - -async def require_confirm_verify_message(ctx, address, message): - text = Text("Confirm address") - text.mono(*split_address(address)) - await require_confirm(ctx, text) - - text = Text("Verify message", new_lines=False) - text.normal(*split_message(message)) - await require_confirm(ctx, text) diff --git a/tests/ui_tests/fixtures.json b/tests/ui_tests/fixtures.json index 432b492fa..38741e806 100644 --- a/tests/ui_tests/fixtures.json +++ b/tests/ui_tests/fixtures.json @@ -101,7 +101,7 @@ "test_msg_ethereum_signtx_eip155.py::test_ethereum_signtx_eip155[vector7]": "bc91fd1543c2e2e5cd52eb8e7eceeb7bbc9958c6a4d44c3c1638942e4c7cb308", "test_msg_ethereum_signtx_eip155.py::test_ethereum_signtx_eip155[vector8]": "bc91fd1543c2e2e5cd52eb8e7eceeb7bbc9958c6a4d44c3c1638942e4c7cb308", "test_msg_ethereum_signtx_eip155.py::test_ethereum_signtx_eip155[vector9]": "bc91fd1543c2e2e5cd52eb8e7eceeb7bbc9958c6a4d44c3c1638942e4c7cb308", -"test_msg_ethereum_verifymessage.py-test_verify": "19e068da53c30fff93ca2ff62296ef8a758faa0f9e5067b2d69d28cc6bc9d504", +"test_msg_ethereum_verifymessage.py-test_verify": "6e22a4241a76e2ddf0027d93f0fc3b2133758b46c81e91cebd24947674e8aeba", "test_msg_ethereum_verifymessage.py-test_verify_invalid": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586", "test_msg_getaddress.py-test_bch": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586", "test_msg_getaddress.py-test_bch_multisig": "806770e0656c11dc8099eeba0156a359a3733184cd23a8c0e457f550e5ae1262", @@ -163,8 +163,8 @@ "test_msg_lisk_signtx.py-test_lisk_sign_tx_send": "69b10cf641834235146af56114260c96618d223b4d38f3e262f8d976685aa396", "test_msg_lisk_signtx.py-test_lisk_sign_tx_send_with_data": "d27a40c13d8266cb3ea5e4db01d0802f5ec6138124cbe8daaf9cd65b30fcdd5f", "test_msg_lisk_signtx.py-test_lisk_sign_tx_send_wrong_path": "61631e80e1a04ac74fe87c90c742a2a433613637c941d200870a9e8f8fffa0a2", -"test_msg_lisk_verifymessage.py-test_verify": "5e9cf05f6ccf10f697cae9f780042db934892e1d7c68fb2f19a40319a687ea50", -"test_msg_lisk_verifymessage.py-test_verify_long": "26adab7e31f388e5b034a865f9c010d57e67fd855d44839d2f2600d8317bd98e", +"test_msg_lisk_verifymessage.py-test_verify": "1854e1c346d1db91c8e35b8081e3fcfe851340a367d1207c51dac156dddc93ea", +"test_msg_lisk_verifymessage.py-test_verify_long": "32da2aa586d14093de6b414fbb58227b3e1665fefdb0184ea3aa5d036ac415b1", "test_msg_loaddevice.py-test_load_device_1": "114d7e07b00f8a9fc60e0888ce3e39f79805c577b99f4d25967fcf7cf6367664", "test_msg_loaddevice.py-test_load_device_2": "9947760ad56ea110b6f3937883c37701c866dd57b6c342806bd8e8b3aa889887", "test_msg_loaddevice.py-test_load_device_slip39_advanced": "1c6db0d592b1d22b3c9fce3ddab8a9fd138f11d83e5d4e64431a02bf4ffed605", @@ -346,21 +346,21 @@ "test_msg_tezos_sign_tx.py-test_tezos_smart_contract_delegation": "23a855ba8893b2d58c07ef3013995310e5e97eb963acc535edc058cb092154e5", "test_msg_tezos_sign_tx.py-test_tezos_smart_contract_transfer": "ef560be97a67e1cf071a7917636400892fc8206253313c224d1c4a7fffc5b411", "test_msg_tezos_sign_tx.py-test_tezos_smart_contract_transfer_to_contract": "d0be5617db780e6c65c32b46d3e198a1f2db1f60886a1b3d3d502f4d1d0b7ba9", -"test_msg_verifymessage.py-test_message_grs": "e179e2c6ddc1c8340d4be6c5d12a02c7b184862d9b7d105afe17381382540766", -"test_msg_verifymessage.py-test_message_long": "4fd2cd0c2300cbc750419b351bdcb46312866e8d5ef1b70d0ad86d63281237ef", -"test_msg_verifymessage.py-test_message_testnet": "31294deeffe9ee61b4162493f15d563eae018faac40e4e41fb4d54afb7652a50", -"test_msg_verifymessage.py-test_message_verify": "158f81f405d6ea30ffd17eea8fd757cef4d03ba2b349d8327d5935e8fad9643c", -"test_msg_verifymessage.py-test_message_verify_bcash": "f07bb4c6d1b13579f38c264a3cbe3d820c58a958f36f3d4f9d54b6438c6f0e52", -"test_msg_verifymessage.py-test_verify_bitcoind": "33ee230d1685ee9fa58120949385a5472a25b11ebb00231960f53f5cac878479", -"test_msg_verifymessage.py-test_verify_utf": "d199af260049c8a4708f55d7e07613655100d49e14e3d78f510fa8c1077b1533", -"test_msg_verifymessage_segwit.py-test_message_long": "7aeb59ff336b2ac8453ddd539a06dff2ce51eb934d9ce961a1da087e0a44c39a", -"test_msg_verifymessage_segwit.py-test_message_testnet": "4d8f19b435923996debea19a179fc6ab897469355673de494198a18357b6e937", -"test_msg_verifymessage_segwit.py-test_message_verify": "f7ef6838ce8f8d09e50236c57f146d77f2b34e490734d8f632d552fbcf6fef3f", -"test_msg_verifymessage_segwit.py-test_verify_utf": "539e19cbb17a77c3423caeec0cfcf6e28666d2be17c65b1775bb51ac62894e8a", -"test_msg_verifymessage_segwit_native.py-test_message_long": "fe05eb6cbaed0ba751c2be87f2fe82e00a8dd5b3b6545b345f7b842c51e93236", -"test_msg_verifymessage_segwit_native.py-test_message_testnet": "9bda85a70f5ddf8f8ad78bb6a8d2b7dfe11d18daa4c14013adb2a4c0a4473c54", -"test_msg_verifymessage_segwit_native.py-test_message_verify": "61f9643c031ed87a2c3a1d87d876d63e64850ec362f091f181e2aa2b1d67f6dd", -"test_msg_verifymessage_segwit_native.py-test_verify_utf": "c71743bbc5d1bd587800222065f9f2a77b375e341c50ab4e175fb9678c866d38", +"test_msg_verifymessage.py-test_message_grs": "507bd5412292355b4b0c1cb684eb2305ab4c0016f2ca297b8c1359120fbe2ae1", +"test_msg_verifymessage.py-test_message_long": "0a213804b26546a08b43a421e6867c92c03faefa41e5b5f7b5d56266ff7c7511", +"test_msg_verifymessage.py-test_message_testnet": "7295f8f7ca84c069a0e000766fd685b1b2bafe3f2a60f8b102796d0af79ed67b", +"test_msg_verifymessage.py-test_message_verify": "a357a0874e3ae40c0e385aa5ef365a1d20a34d51feb7ea1691c0d86c6f9bf242", +"test_msg_verifymessage.py-test_message_verify_bcash": "e88b6bd86172f87662ed401b9847f7ec4a31ee67e87df584f449da89d0b7e646", +"test_msg_verifymessage.py-test_verify_bitcoind": "ad8b1680392d4348db9201653a2c0fce2b67aa54e07139d5127ba18bed21e23b", +"test_msg_verifymessage.py-test_verify_utf": "6a9fe6de0ceed6aba76a8c24b8ace541713af71e652521d42bd444c95c8dbd66", +"test_msg_verifymessage_segwit.py-test_message_long": "3a07c136e206884eab4e33224df5ae00a20f382255045fd26f7da9eca33022c2", +"test_msg_verifymessage_segwit.py-test_message_testnet": "2df34d0457f537023d513de468b4ccc7fbfcd70e9f980e4e1ec30d3c63157f36", +"test_msg_verifymessage_segwit.py-test_message_verify": "9af19581b27db5dfed6250f0a245be98428ac98149b3bbd93409756becee07e5", +"test_msg_verifymessage_segwit.py-test_verify_utf": "91d3f97f98780d7edd7526bf91bae0a56cf8003a31ab1baf424cec66be9e5735", +"test_msg_verifymessage_segwit_native.py-test_message_long": "22f6d25712f77b7ffe30bca6a7c649a754bd4b04af1c924f720b6c4ccea8d7a3", +"test_msg_verifymessage_segwit_native.py-test_message_testnet": "113ad2d6389810b542e5ae5aba5d0de2aa52661e321c3f1d9f45cc91637b3c1d", +"test_msg_verifymessage_segwit_native.py-test_message_verify": "b206b7a79c40525efa765718376d5f369caf424e11e93dd0eab97861dc1f4f8d", +"test_msg_verifymessage_segwit_native.py-test_verify_utf": "a8011d120ec7d776ba0a73318357b4be59f461aa927386ab13b3beff7c95c21f", "test_msg_webauthn.py-test_add_remove": "820eac5b32863356b967dc70b0afbc4b9faa9c39ec40d55923f4fb07bd5f3707", "test_msg_wipedevice.py-test_wipe_device": "f1ce844040c9f7597323d58e987f568c1de69fe6da75d5fc59b7df0e5d05c881", "test_multisig.py-test_15_of_15": "ff567aca97451b865db6b518014fa3bd2da0fa317493f28baca50a694de23acb",