core: unify sign/verify functions

The UI records are modified because of two changes:
- Added a coin name to the Sign/Verify screen (ETH/Lisk).
- Unified to use mono.
pull/880/head
Tomas Susanka 4 years ago
parent b317613d63
commit 744c32991f

@ -1,8 +1,11 @@
from ubinascii import hexlify from ubinascii import hexlify
from trezor import utils from trezor import utils, wire
from trezor.crypto.hashlib import blake256, sha256 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 from apps.wallet.sign_tx.writers import write_varint
if False: if False:
@ -33,3 +36,24 @@ def split_message(message: bytes) -> List[str]:
m = "hex(%s)" % hexlify(message).decode() m = "hex(%s)" % hexlify(message).decode()
words = [m] words = [m]
return words 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)

@ -1,12 +1,10 @@
from trezor.crypto.curve import secp256k1 from trezor.crypto.curve import secp256k1
from trezor.crypto.hashlib import sha3_256 from trezor.crypto.hashlib import sha3_256
from trezor.messages.EthereumMessageSignature import EthereumMessageSignature from trezor.messages.EthereumMessageSignature import EthereumMessageSignature
from trezor.ui.text import Text
from trezor.utils import HashWriter from trezor.utils import HashWriter
from apps.common import paths from apps.common import paths
from apps.common.confirm import require_confirm from apps.common.signverify import require_confirm_sign_message
from apps.common.signverify import split_message
from apps.ethereum import CURVE, address from apps.ethereum import CURVE, address
@ -23,7 +21,7 @@ async def sign_message(ctx, msg, keychain):
await paths.validate_path( await paths.validate_path(
ctx, address.validate_full_path, keychain, msg.address_n, CURVE 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) node = keychain.derive(msg.address_n)
signature = secp256k1.sign( signature = secp256k1.sign(
@ -37,10 +35,3 @@ async def sign_message(ctx, msg, keychain):
sig.address = address.address_from_bytes(node.ethereum_pubkeyhash()) sig.address = address.address_from_bytes(node.ethereum_pubkeyhash())
sig.signature = signature[1:] + bytearray([signature[0]]) sig.signature = signature[1:] + bytearray([signature[0]])
return sig 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)

@ -2,11 +2,8 @@ from trezor import wire
from trezor.crypto.curve import secp256k1 from trezor.crypto.curve import secp256k1
from trezor.crypto.hashlib import sha3_256 from trezor.crypto.hashlib import sha3_256
from trezor.messages.Success import Success from trezor.messages.Success import Success
from trezor.ui.text import Text
from apps.common.confirm import require_confirm from apps.common.signverify import require_confirm_verify_message
from apps.common.layout import split_address
from apps.common.signverify import split_message
from apps.ethereum.address import address_from_bytes, bytes_from_address from apps.ethereum.address import address_from_bytes, bytes_from_address
from apps.ethereum.sign_message import message_digest from apps.ethereum.sign_message import message_digest
@ -30,16 +27,8 @@ async def verify_message(ctx, msg):
address = address_from_bytes(address_bytes) 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") 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)

@ -1,12 +1,10 @@
from trezor.crypto.curve import ed25519 from trezor.crypto.curve import ed25519
from trezor.crypto.hashlib import sha256 from trezor.crypto.hashlib import sha256
from trezor.messages.LiskMessageSignature import LiskMessageSignature from trezor.messages.LiskMessageSignature import LiskMessageSignature
from trezor.ui.text import Text
from trezor.utils import HashWriter from trezor.utils import HashWriter
from apps.common import paths from apps.common import paths
from apps.common.confirm import require_confirm from apps.common.signverify import require_confirm_sign_message
from apps.common.signverify import split_message
from apps.lisk import CURVE from apps.lisk import CURVE
from apps.lisk.helpers import validate_full_path from apps.lisk.helpers import validate_full_path
from apps.wallet.sign_tx.writers import write_varint from apps.wallet.sign_tx.writers import write_varint
@ -24,7 +22,7 @@ def message_digest(message):
async def sign_message(ctx, msg, keychain): async def sign_message(ctx, msg, keychain):
await paths.validate_path(ctx, validate_full_path, keychain, msg.address_n, CURVE) 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) node = keychain.derive(msg.address_n, CURVE)
seckey = node.private_key() seckey = node.private_key()
@ -34,10 +32,3 @@ async def sign_message(ctx, msg, keychain):
signature = ed25519.sign(seckey, message_digest(msg.message)) signature = ed25519.sign(seckey, message_digest(msg.message))
return LiskMessageSignature(public_key=pubkey, signature=signature) 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)

@ -5,7 +5,7 @@ from trezor.messages.Success import Success
from .helpers import get_address_from_public_key from .helpers import get_address_from_public_key
from .sign_message import message_digest 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): async def verify_message(ctx, msg):
@ -15,6 +15,8 @@ async def verify_message(ctx, msg):
raise wire.ProcessError("Invalid signature") raise wire.ProcessError("Invalid signature")
address = get_address_from_public_key(msg.public_key) 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") return Success(message="Message verified")

@ -2,12 +2,10 @@ from trezor import wire
from trezor.crypto.curve import secp256k1 from trezor.crypto.curve import secp256k1
from trezor.messages.InputScriptType import SPENDADDRESS, SPENDP2SHWITNESS, SPENDWITNESS from trezor.messages.InputScriptType import SPENDADDRESS, SPENDP2SHWITNESS, SPENDWITNESS
from trezor.messages.MessageSignature import MessageSignature from trezor.messages.MessageSignature import MessageSignature
from trezor.ui.text import Text
from apps.common import coins from apps.common import coins
from apps.common.confirm import require_confirm
from apps.common.paths import validate_path 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 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 script_type = msg.script_type or 0
coin = coins.by_name(coin_name) 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( await validate_path(
ctx, ctx,
validate_full_path, validate_full_path,
@ -47,10 +45,3 @@ async def sign_message(ctx, msg, keychain):
raise wire.ProcessError("Unsupported script type") raise wire.ProcessError("Unsupported script type")
return MessageSignature(address=address, signature=signature) 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)

@ -2,12 +2,9 @@ from trezor import wire
from trezor.crypto.curve import secp256k1 from trezor.crypto.curve import secp256k1
from trezor.messages.InputScriptType import SPENDADDRESS, SPENDP2SHWITNESS, SPENDWITNESS from trezor.messages.InputScriptType import SPENDADDRESS, SPENDP2SHWITNESS, SPENDWITNESS
from trezor.messages.Success import Success from trezor.messages.Success import Success
from trezor.ui.text import Text
from apps.common import coins from apps.common import coins
from apps.common.confirm import require_confirm from apps.common.signverify import message_digest, require_confirm_verify_message
from apps.common.layout import split_address
from apps.common.signverify import message_digest, split_message
from apps.wallet.sign_tx.addresses import ( from apps.wallet.sign_tx.addresses import (
address_p2wpkh, address_p2wpkh,
address_p2wpkh_in_p2sh, address_p2wpkh_in_p2sh,
@ -58,16 +55,8 @@ async def verify_message(ctx, msg):
if addr != address: if addr != address:
raise wire.ProcessError("Invalid signature") 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") 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)

@ -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[vector7]": "bc91fd1543c2e2e5cd52eb8e7eceeb7bbc9958c6a4d44c3c1638942e4c7cb308",
"test_msg_ethereum_signtx_eip155.py::test_ethereum_signtx_eip155[vector8]": "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_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_ethereum_verifymessage.py-test_verify_invalid": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
"test_msg_getaddress.py-test_bch": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586", "test_msg_getaddress.py-test_bch": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
"test_msg_getaddress.py-test_bch_multisig": "806770e0656c11dc8099eeba0156a359a3733184cd23a8c0e457f550e5ae1262", "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": "69b10cf641834235146af56114260c96618d223b4d38f3e262f8d976685aa396",
"test_msg_lisk_signtx.py-test_lisk_sign_tx_send_with_data": "d27a40c13d8266cb3ea5e4db01d0802f5ec6138124cbe8daaf9cd65b30fcdd5f", "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_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": "1854e1c346d1db91c8e35b8081e3fcfe851340a367d1207c51dac156dddc93ea",
"test_msg_lisk_verifymessage.py-test_verify_long": "26adab7e31f388e5b034a865f9c010d57e67fd855d44839d2f2600d8317bd98e", "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_1": "114d7e07b00f8a9fc60e0888ce3e39f79805c577b99f4d25967fcf7cf6367664",
"test_msg_loaddevice.py-test_load_device_2": "9947760ad56ea110b6f3937883c37701c866dd57b6c342806bd8e8b3aa889887", "test_msg_loaddevice.py-test_load_device_2": "9947760ad56ea110b6f3937883c37701c866dd57b6c342806bd8e8b3aa889887",
"test_msg_loaddevice.py-test_load_device_slip39_advanced": "1c6db0d592b1d22b3c9fce3ddab8a9fd138f11d83e5d4e64431a02bf4ffed605", "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_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": "ef560be97a67e1cf071a7917636400892fc8206253313c224d1c4a7fffc5b411",
"test_msg_tezos_sign_tx.py-test_tezos_smart_contract_transfer_to_contract": "d0be5617db780e6c65c32b46d3e198a1f2db1f60886a1b3d3d502f4d1d0b7ba9", "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_grs": "507bd5412292355b4b0c1cb684eb2305ab4c0016f2ca297b8c1359120fbe2ae1",
"test_msg_verifymessage.py-test_message_long": "4fd2cd0c2300cbc750419b351bdcb46312866e8d5ef1b70d0ad86d63281237ef", "test_msg_verifymessage.py-test_message_long": "0a213804b26546a08b43a421e6867c92c03faefa41e5b5f7b5d56266ff7c7511",
"test_msg_verifymessage.py-test_message_testnet": "31294deeffe9ee61b4162493f15d563eae018faac40e4e41fb4d54afb7652a50", "test_msg_verifymessage.py-test_message_testnet": "7295f8f7ca84c069a0e000766fd685b1b2bafe3f2a60f8b102796d0af79ed67b",
"test_msg_verifymessage.py-test_message_verify": "158f81f405d6ea30ffd17eea8fd757cef4d03ba2b349d8327d5935e8fad9643c", "test_msg_verifymessage.py-test_message_verify": "a357a0874e3ae40c0e385aa5ef365a1d20a34d51feb7ea1691c0d86c6f9bf242",
"test_msg_verifymessage.py-test_message_verify_bcash": "f07bb4c6d1b13579f38c264a3cbe3d820c58a958f36f3d4f9d54b6438c6f0e52", "test_msg_verifymessage.py-test_message_verify_bcash": "e88b6bd86172f87662ed401b9847f7ec4a31ee67e87df584f449da89d0b7e646",
"test_msg_verifymessage.py-test_verify_bitcoind": "33ee230d1685ee9fa58120949385a5472a25b11ebb00231960f53f5cac878479", "test_msg_verifymessage.py-test_verify_bitcoind": "ad8b1680392d4348db9201653a2c0fce2b67aa54e07139d5127ba18bed21e23b",
"test_msg_verifymessage.py-test_verify_utf": "d199af260049c8a4708f55d7e07613655100d49e14e3d78f510fa8c1077b1533", "test_msg_verifymessage.py-test_verify_utf": "6a9fe6de0ceed6aba76a8c24b8ace541713af71e652521d42bd444c95c8dbd66",
"test_msg_verifymessage_segwit.py-test_message_long": "7aeb59ff336b2ac8453ddd539a06dff2ce51eb934d9ce961a1da087e0a44c39a", "test_msg_verifymessage_segwit.py-test_message_long": "3a07c136e206884eab4e33224df5ae00a20f382255045fd26f7da9eca33022c2",
"test_msg_verifymessage_segwit.py-test_message_testnet": "4d8f19b435923996debea19a179fc6ab897469355673de494198a18357b6e937", "test_msg_verifymessage_segwit.py-test_message_testnet": "2df34d0457f537023d513de468b4ccc7fbfcd70e9f980e4e1ec30d3c63157f36",
"test_msg_verifymessage_segwit.py-test_message_verify": "f7ef6838ce8f8d09e50236c57f146d77f2b34e490734d8f632d552fbcf6fef3f", "test_msg_verifymessage_segwit.py-test_message_verify": "9af19581b27db5dfed6250f0a245be98428ac98149b3bbd93409756becee07e5",
"test_msg_verifymessage_segwit.py-test_verify_utf": "539e19cbb17a77c3423caeec0cfcf6e28666d2be17c65b1775bb51ac62894e8a", "test_msg_verifymessage_segwit.py-test_verify_utf": "91d3f97f98780d7edd7526bf91bae0a56cf8003a31ab1baf424cec66be9e5735",
"test_msg_verifymessage_segwit_native.py-test_message_long": "fe05eb6cbaed0ba751c2be87f2fe82e00a8dd5b3b6545b345f7b842c51e93236", "test_msg_verifymessage_segwit_native.py-test_message_long": "22f6d25712f77b7ffe30bca6a7c649a754bd4b04af1c924f720b6c4ccea8d7a3",
"test_msg_verifymessage_segwit_native.py-test_message_testnet": "9bda85a70f5ddf8f8ad78bb6a8d2b7dfe11d18daa4c14013adb2a4c0a4473c54", "test_msg_verifymessage_segwit_native.py-test_message_testnet": "113ad2d6389810b542e5ae5aba5d0de2aa52661e321c3f1d9f45cc91637b3c1d",
"test_msg_verifymessage_segwit_native.py-test_message_verify": "61f9643c031ed87a2c3a1d87d876d63e64850ec362f091f181e2aa2b1d67f6dd", "test_msg_verifymessage_segwit_native.py-test_message_verify": "b206b7a79c40525efa765718376d5f369caf424e11e93dd0eab97861dc1f4f8d",
"test_msg_verifymessage_segwit_native.py-test_verify_utf": "c71743bbc5d1bd587800222065f9f2a77b375e341c50ab4e175fb9678c866d38", "test_msg_verifymessage_segwit_native.py-test_verify_utf": "a8011d120ec7d776ba0a73318357b4be59f461aa927386ab13b3beff7c95c21f",
"test_msg_webauthn.py-test_add_remove": "820eac5b32863356b967dc70b0afbc4b9faa9c39ec40d55923f4fb07bd5f3707", "test_msg_webauthn.py-test_add_remove": "820eac5b32863356b967dc70b0afbc4b9faa9c39ec40d55923f4fb07bd5f3707",
"test_msg_wipedevice.py-test_wipe_device": "f1ce844040c9f7597323d58e987f568c1de69fe6da75d5fc59b7df0e5d05c881", "test_msg_wipedevice.py-test_wipe_device": "f1ce844040c9f7597323d58e987f568c1de69fe6da75d5fc59b7df0e5d05c881",
"test_multisig.py-test_15_of_15": "ff567aca97451b865db6b518014fa3bd2da0fa317493f28baca50a694de23acb", "test_multisig.py-test_15_of_15": "ff567aca97451b865db6b518014fa3bd2da0fa317493f28baca50a694de23acb",

Loading…
Cancel
Save