Merge pull request #880 from trezor/tsusanka/sign-verify-ui

Unify sign/verify message dialogs and fix text overflow
pull/886/head
Tomas Susanka 4 years ago committed by GitHub
commit 5ee6e56f56
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -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)

@ -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)

@ -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)

@ -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)

@ -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")

@ -134,9 +134,9 @@ async def _require_confirm_payload(ctx, payload: bytearray, encrypt=False):
if encrypt:
text = Text("Confirm payload", ui.ICON_SEND, ui.GREEN)
text.bold("Encrypted:")
text.normal(*payload.split(" "))
text.normal(payload)
else:
text = Text("Confirm payload", ui.ICON_SEND, ui.RED)
text.bold("Unencrypted:")
text.normal(*payload.split(" "))
text.normal(payload)
await require_confirm(ctx, text, ButtonRequestType.ConfirmOutput)

@ -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)

@ -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)

@ -32,7 +32,7 @@ def render_text(
) -> None:
# initial rendering state
INITIAL_OFFSET_X = offset_x
offset_y_max = offset_y * max_lines
offset_y_max = TEXT_HEADER_HEIGHT + (TEXT_LINE_HEIGHT * max_lines)
FONTS = (ui.NORMAL, ui.BOLD, ui.MONO, ui.MONO_BOLD)
@ -47,7 +47,7 @@ def render_text(
if isinstance(word, int):
if word is BR or word is BR_HALF:
# line break or half-line break
if offset_y >= offset_y_max:
if offset_y > offset_y_max:
ui.display.text(offset_x, offset_y, "...", ui.BOLD, ui.GREY, bg)
return
offset_x = INITIAL_OFFSET_X

@ -18,7 +18,7 @@
"test_msg_binance_get_address.py::test_binance_get_address[m-44'-714'-0'-0-0-bnb1hgm0p7khfk85zpz5v0j8": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
"test_msg_binance_get_address.py::test_binance_get_address[m-44'-714'-0'-0-1-bnb1egswqkszzfc2uq78zjsl": "c53ae271ae6158320c85dfc5ef43693def6f9606a3e733db0abb78dca392b7bb",
"test_msg_binance_get_public_key.py::test_binance_get_public_key": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
"test_msg_binance_sign_tx.py::test_binance_sign_message[message0-expected_response0]": "07e93c712f63190a9bdb01f30c10750afd264fd2f491d9f7b89c431b9550edc8",
"test_msg_binance_sign_tx.py::test_binance_sign_message[message0-expected_response0]": "d41ee5e01a50f0f96fd7881db1750fab31cfe62c25b4eabbc092cc3daa039c7f",
"test_msg_binance_sign_tx.py::test_binance_sign_message[message1-expected_response1]": "7b8bbe5ba7d7b07c95065608fb1cf9aeafcb3f9671835a6e5e5a6997ff4ff99b",
"test_msg_binance_sign_tx.py::test_binance_sign_message[message2-expected_response2]": "813ad1b802dee1ace4dfa378edd840dbcea57c1a1b8eed67134def024c40a6e9",
"test_msg_cardano_get_address.py::test_cardano_get_address[m-44'-1815'-0'-0-0-Ae2tdPwUPEZLCq3sFv4wVYx": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
@ -75,7 +75,7 @@
"test_msg_eos_signtx.py-test_eos_signtx_vote_proxy": "4a831fc808e4b32fe9c8a5bed11cbbeb8b623391e9c603e61fbf352152f63fd9",
"test_msg_ethereum_getaddress.py-test_ethereum_getaddress": "c2e87f78afb53c0f861ebf02bb45af22ab0d336b10ea72d5ad246d1f59162211",
"test_msg_ethereum_getpublickey.py-test_ethereum_getpublickey": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
"test_msg_ethereum_signmessage.py-test_sign": "da471bd9779da7a17c4c4fb67ca9acedfe2a36510e3e9abc30c96cca4de24c0c",
"test_msg_ethereum_signmessage.py-test_sign": "c630df2f7260fd705d6522401024626968eec074eed08702626937c007d050ab",
"test_msg_ethereum_signtx.py-test_ethereum_sanity_checks": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
"test_msg_ethereum_signtx.py-test_ethereum_signtx_data": "9454b0c1ee99d865668e6ff04c32d9e14002d0f2b29d0f45e81996f711cb8068",
"test_msg_ethereum_signtx.py-test_ethereum_signtx_known_erc20_token": "2a4a3a192cb992b482d4ccb1e23e957fa1c8d04c7144a4d4329701a9f4290d2e",
@ -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": "5d1c3f207e498c1b6e874156f2dcb6dd51f8efc27fc5f8474c35abc7c32e4cfb",
"test_msg_ethereum_verifymessage.py-test_verify_invalid": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
"test_msg_getaddress.py-test_bch": "5a80508a71a9ef64f94762b07636f90e464832f0f4a3102af8fa1a8c69e94586",
"test_msg_getaddress.py-test_bch_multisig": "806770e0656c11dc8099eeba0156a359a3733184cd23a8c0e457f550e5ae1262",
@ -155,16 +155,16 @@
"test_msg_lisk_getaddress.py-test_lisk_getaddress": "0063ceb48d21aecd1ddabdb083c8afd2042cdf577e4751fa3f57b2b80f619084",
"test_msg_lisk_getpublickey.py-test_lisk_get_public_key": "e4cb8c7430c240e27a2211391ab5eba848be4f50136cf9f693142c2677a939d7",
"test_msg_lisk_signmessage.py-test_sign": "c47a6ec147137c75903cff19da6607eaef5a1fc03ace1f840d2952744342b568",
"test_msg_lisk_signmessage.py-test_sign_long": "410f482dfeb3b90f52d715ca109d0ee5cd3100deae5e71701e2203777613eb0e",
"test_msg_lisk_signmessage.py-test_sign_long": "d9824857ac7d7a530631e0847eb1d71a44a8d78ea186460a03ca74ddfcf094eb",
"test_msg_lisk_signtx.py-test_lisk_sign_tx_cast_votes": "1211b642511c054119d79933894f942a1d714f9cef642cf7a3f60d675f93eab7",
"test_msg_lisk_signtx.py-test_lisk_sign_tx_delegate_registration": "4e68f914978c6c130c5f7e98bc63d46e98899b4194483f13db1fac22b2a5fadb",
"test_msg_lisk_signtx.py-test_lisk_sign_tx_multisignature": "2d2d5747973e15bf478f3c1b879fbb7f30281b3d3a7ad9ff2b3b262de80fa33e",
"test_msg_lisk_signtx.py-test_lisk_sign_tx_second_signature": "f7312ad6214786884a5649c029a589faeaf3efa72e62dd870da4c1e28c0e5143",
"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_signtx.py-test_lisk_sign_tx_send_wrong_path": "08ad66a3dc5e67d9bfd592efbeea170927188f5e6d79e1faf4a9d26a96661d6a",
"test_msg_lisk_verifymessage.py-test_verify": "1854e1c346d1db91c8e35b8081e3fcfe851340a367d1207c51dac156dddc93ea",
"test_msg_lisk_verifymessage.py-test_verify_long": "1798e15f373dc321e43094b13d07d6bbb8ad532c31f425351433f6571d61c289",
"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",
@ -182,7 +182,7 @@
"test_msg_nem_signtx_multisig.py-test_nem_signtx_multisig_signer": "64eeea8ee5f838bad0cd15f7e446952c614969b0c13d7f8b18f95f74147c5991",
"test_msg_nem_signtx_others.py-test_nem_signtx_importance_transfer": "eaa237fd2c2e99da0b719f9dcd1c32863c22f3d82761e4f46559961cdc109980",
"test_msg_nem_signtx_others.py-test_nem_signtx_provision_namespace": "399e3b9cdd889ffd25a59505d2da8822b3e7775f2a9f6031cdd79c4720dbe393",
"test_msg_nem_signtx_transfers.py-test_nem_signtx_encrypted_payload": "ccbe72f47bd85de463cf537c08fe1f9314e25a0e1cb4b915ddb0084fc8de40b9",
"test_msg_nem_signtx_transfers.py-test_nem_signtx_encrypted_payload": "a1b05b9796d6509f7ee8b2fe088ac85cabf15f40535fe46b74c6c0b35851bbe6",
"test_msg_nem_signtx_transfers.py-test_nem_signtx_known_mosaic": "141da3168cd042aef5bd2fb62b52ecbca3a2ec27302f10a3a0fc98bae6d9c7da",
"test_msg_nem_signtx_transfers.py-test_nem_signtx_known_mosaic_with_levy": "0c05c1946ff84e634d391b8cb4adc9fe92c65810eb9a2b3dfb6f4f71a84c08b9",
"test_msg_nem_signtx_transfers.py-test_nem_signtx_multiple_mosaics": "e3fb11c280a9ff5121d6158f156758cc551dd7708b1c6fb3ce92ab3cffe2c184",
@ -240,21 +240,21 @@
"test_msg_signmessage.py-test_sign": "c37aec5647a983219a57a74797247505dd08e98408964207b1b34df904d6797c",
"test_msg_signmessage.py-test_sign_bch": "c37aec5647a983219a57a74797247505dd08e98408964207b1b34df904d6797c",
"test_msg_signmessage.py-test_sign_grs": "9a21b2633749b87174fb666144641f4563d58aaec5c5694e1d1eac3ac993831d",
"test_msg_signmessage.py-test_sign_long": "3593ee0fdda71eebc4ed345a14e69b211f786723c30c9f153bccdcd621b40c25",
"test_msg_signmessage.py-test_sign_long": "7576249e9bcba7937a489cf1f0c7e063026c0fcd008a98b105a96b68bb989083",
"test_msg_signmessage.py-test_sign_testnet": "c37aec5647a983219a57a74797247505dd08e98408964207b1b34df904d6797c",
"test_msg_signmessage.py-test_sign_utf": "48e01e6c84af9960581e95a60669f97eebfb8ebe43daac8f958062d77394c569",
"test_msg_signmessage_decred.py-test_sign_long": "760dd838580022cdbdb5b4b84506448cfeed2f316b68fb6669b382ad5271870e",
"test_msg_signmessage_decred.py-test_sign_long": "50da7b603a754324bc9cb364e3216656a7cc3906ca807595723b03653231b1bd",
"test_msg_signmessage_decred.py-test_sign_mainnet": "afced22a35654f96108611b53bde65e8a11cc8ab258a95012da722c818c0a2d2",
"test_msg_signmessage_decred.py-test_sign_testnet": "afced22a35654f96108611b53bde65e8a11cc8ab258a95012da722c818c0a2d2",
"test_msg_signmessage_decred.py-test_sign_utf": "068dc608b061f688875c8e0ce611d1e3e9ae269a0c9e3440374fdb1125413df8",
"test_msg_signmessage_segwit.py-test_sign": "c37aec5647a983219a57a74797247505dd08e98408964207b1b34df904d6797c",
"test_msg_signmessage_segwit.py-test_sign_grs": "9a21b2633749b87174fb666144641f4563d58aaec5c5694e1d1eac3ac993831d",
"test_msg_signmessage_segwit.py-test_sign_long": "3593ee0fdda71eebc4ed345a14e69b211f786723c30c9f153bccdcd621b40c25",
"test_msg_signmessage_segwit.py-test_sign_long": "7576249e9bcba7937a489cf1f0c7e063026c0fcd008a98b105a96b68bb989083",
"test_msg_signmessage_segwit.py-test_sign_testnet": "c37aec5647a983219a57a74797247505dd08e98408964207b1b34df904d6797c",
"test_msg_signmessage_segwit.py-test_sign_utf": "48e01e6c84af9960581e95a60669f97eebfb8ebe43daac8f958062d77394c569",
"test_msg_signmessage_segwit_native.py-test_sign": "c37aec5647a983219a57a74797247505dd08e98408964207b1b34df904d6797c",
"test_msg_signmessage_segwit_native.py-test_sign_grs": "9a21b2633749b87174fb666144641f4563d58aaec5c5694e1d1eac3ac993831d",
"test_msg_signmessage_segwit_native.py-test_sign_long": "3593ee0fdda71eebc4ed345a14e69b211f786723c30c9f153bccdcd621b40c25",
"test_msg_signmessage_segwit_native.py-test_sign_long": "7576249e9bcba7937a489cf1f0c7e063026c0fcd008a98b105a96b68bb989083",
"test_msg_signmessage_segwit_native.py-test_sign_testnet": "c37aec5647a983219a57a74797247505dd08e98408964207b1b34df904d6797c",
"test_msg_signmessage_segwit_native.py-test_sign_utf": "48e01e6c84af9960581e95a60669f97eebfb8ebe43daac8f958062d77394c569",
"test_msg_signtx.py-test_attack_change_input_address": "7660d99de0b4580f0e2af3e0c19a0a198e385fdc26de46882152c947d939b7be",
@ -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": "45e8597d27f354d8f7f18b96f563729b247f9454c3a9496ea0e5f985232e3ef7",
"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": "84c3d161e694b656ea0472dbc77dd0d88d9772f4ffffa94c4304e3e3cb958770",
"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": "09bdef88a5a43df4ff349101adc05e7b485bb437b029031406348e1a3f6d6866",
"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",

Loading…
Cancel
Save