1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2025-01-18 11:21:11 +00:00

fix(core): improve error popups

This commit is contained in:
grdddj 2023-05-10 15:59:17 +02:00 committed by Martin Milata
parent 74246150e5
commit 393bc48b6b
9 changed files with 58 additions and 61 deletions

View File

@ -56,7 +56,7 @@ async def request_pin(
async def request_pin_confirm(ctx: Context, *args: Any, **kwargs: Any) -> str: async def request_pin_confirm(ctx: Context, *args: Any, **kwargs: Any) -> str:
from trezor.ui.layouts import confirm_reenter_pin, pin_mismatch from trezor.ui.layouts import confirm_reenter_pin, pin_mismatch_popup
while True: while True:
pin1 = await request_pin(ctx, "Enter new PIN", *args, **kwargs) pin1 = await request_pin(ctx, "Enter new PIN", *args, **kwargs)
@ -64,7 +64,7 @@ async def request_pin_confirm(ctx: Context, *args: Any, **kwargs: Any) -> str:
pin2 = await request_pin(ctx, "Re-enter new PIN", *args, **kwargs) pin2 = await request_pin(ctx, "Re-enter new PIN", *args, **kwargs)
if pin1 == pin2: if pin1 == pin2:
return pin1 return pin1
await pin_mismatch(ctx) await pin_mismatch_popup(ctx)
async def request_pin_and_sd_salt( async def request_pin_and_sd_salt(

View File

@ -102,17 +102,17 @@ async def _request_wipe_code_confirm(ctx: Context, pin: str) -> str:
from apps.common.request_pin import request_pin from apps.common.request_pin import request_pin
from trezor.ui.layouts import ( from trezor.ui.layouts import (
confirm_reenter_pin, confirm_reenter_pin,
pin_mismatch, pin_mismatch_popup,
wipe_code_same_as_pin, wipe_code_same_as_pin_popup,
) )
while True: while True:
code1 = await request_pin(ctx, "Enter new wipe code") code1 = await request_pin(ctx, "Enter new wipe code")
if code1 == pin: if code1 == pin:
await wipe_code_same_as_pin(ctx) await wipe_code_same_as_pin_popup(ctx)
continue continue
await confirm_reenter_pin(ctx, br_type="set_wipe_code", is_wipe_code=True) await confirm_reenter_pin(ctx, br_type="set_wipe_code", is_wipe_code=True)
code2 = await request_pin(ctx, "Re-enter wipe code") code2 = await request_pin(ctx, "Re-enter wipe code")
if code1 == code2: if code1 == code2:
return code1 return code1
await pin_mismatch(ctx, br_type="set_wipe_code", is_wipe_code=True) await pin_mismatch_popup(ctx, is_wipe_code=True)

View File

@ -8,7 +8,7 @@ import storage.device as storage_device
from trezor import config, io, log, loop, utils, wire, workflow from trezor import config, io, log, loop, utils, wire, workflow
from trezor.crypto import hashlib from trezor.crypto import hashlib
from trezor.crypto.curve import nist256p1 from trezor.crypto.curve import nist256p1
from trezor.ui.layouts import show_popup from trezor.ui.layouts import show_error_popup
from apps.base import set_homescreen from apps.base import set_homescreen
from apps.common import cbor from apps.common import cbor
@ -611,14 +611,14 @@ async def _confirm_fido(title: str, credential: Credential) -> bool:
async def _confirm_bogus_app(title: str) -> None: async def _confirm_bogus_app(title: str) -> None:
if _last_auth_valid: if _last_auth_valid:
await show_popup( await show_error_popup(
title, title,
"This device is already registered with this application.", "This device is already registered with this application.",
"Already registered.", "Already registered.",
timeout_ms=_POPUP_TIMEOUT_MS, timeout_ms=_POPUP_TIMEOUT_MS,
) )
else: else:
await show_popup( await show_error_popup(
title, title,
"This device is not registered with this application.", "This device is not registered with this application.",
"Not registered.", "Not registered.",
@ -834,12 +834,12 @@ class Fido2ConfirmExcluded(Fido2ConfirmMakeCredential):
await send_cmd(cmd, self.iface) await send_cmd(cmd, self.iface)
self.finished = True self.finished = True
await show_popup( await show_error_popup(
"FIDO2 Register", "FIDO2 Register",
"This device is already registered with {}.", "This device is already registered with {}.",
"Already registered.", "Already registered.",
self._cred.rp_id, # description_param self._cred.rp_id, # description_param
_POPUP_TIMEOUT_MS, timeout_ms=_POPUP_TIMEOUT_MS,
) )
@ -917,7 +917,7 @@ class Fido2ConfirmNoPin(State):
await send_cmd(cmd, self.iface) await send_cmd(cmd, self.iface)
self.finished = True self.finished = True
await show_popup( await show_error_popup(
"FIDO2 Verify User", "FIDO2 Verify User",
"Please enable PIN protection.", "Please enable PIN protection.",
"Unable to verify user.", "Unable to verify user.",
@ -940,12 +940,12 @@ class Fido2ConfirmNoCredentials(Fido2ConfirmGetAssertion):
await send_cmd(cmd, self.iface) await send_cmd(cmd, self.iface)
self.finished = True self.finished = True
await show_popup( await show_error_popup(
"FIDO2 Authenticate", "FIDO2 Authenticate",
"This device is not registered with\n{}.", "This device is not registered with\n{}.",
"Not registered.", "Not registered.",
self._creds[0].app_name(), # description_param self._creds[0].app_name(), # description_param
_POPUP_TIMEOUT_MS, timeout_ms=_POPUP_TIMEOUT_MS,
) )

View File

@ -280,7 +280,7 @@ async def show_error_and_raise(
raise NotImplementedError raise NotImplementedError
async def show_popup( async def show_error_popup(
title: str, title: str,
description: str, description: str,
subtitle: str | None = None, subtitle: str | None = None,

View File

@ -487,8 +487,8 @@ async def show_error_and_raise(
ctx, ctx,
RustLayout( RustLayout(
trezorui2.show_error( trezorui2.show_error(
title=content, title=subheader or "",
description=subheader or "", description=content,
button=button.upper(), button=button.upper(),
allow_cancel=False, allow_cancel=False,
) )
@ -1098,21 +1098,27 @@ async def confirm_signverify(
) )
async def show_popup( async def show_error_popup(
title: str, title: str,
description: str, description: str,
subtitle: str | None = None, subtitle: str | None = None,
description_param: str = "", description_param: str = "",
timeout_ms: int = 3000, *,
button: str = "",
timeout_ms: int = 0,
) -> None: ) -> None:
if not button and not timeout_ms:
raise ValueError("Either button or timeout_ms must be set")
if subtitle: if subtitle:
title += f"\n{subtitle}" title += f"\n{subtitle}"
await RustLayout( await RustLayout(
trezorui2.show_error( trezorui2.show_error(
title=title, title=title,
description=description.format(description_param), description=description.format(description_param),
button="", button=button,
time_ms=timeout_ms, time_ms=timeout_ms,
allow_cancel=False,
) )
) )
@ -1192,38 +1198,26 @@ async def confirm_reenter_pin(
) )
async def pin_mismatch( async def pin_mismatch_popup(
ctx: GenericContext, ctx: GenericContext,
br_type: str = "set_pin",
br_code: ButtonRequestType = BR_TYPE_OTHER,
is_wipe_code: bool = False, is_wipe_code: bool = False,
) -> None: ) -> None:
title = "WIPE CODE MISMATCH" if is_wipe_code else "PIN MISMATCH" await button_request(ctx, "pin_mismatch", code=BR_TYPE_OTHER)
title = "Wipe code mismatch" if is_wipe_code else "PIN mismatch"
description = "wipe codes" if is_wipe_code else "PINs" description = "wipe codes" if is_wipe_code else "PINs"
return await confirm_action( return await show_error_popup(
ctx,
br_type,
title, title,
action=f"The {description} you entered do not match.\n\nPlease try again.", f"The {description} you entered do not match.",
verb="TRY AGAIN", button="TRY AGAIN",
verb_cancel=None,
br_code=br_code,
) )
async def wipe_code_same_as_pin( async def wipe_code_same_as_pin_popup(ctx: GenericContext) -> None:
ctx: GenericContext, await button_request(ctx, "wipe_code_same_as_pin", code=BR_TYPE_OTHER)
br_type: str = "set_wipe_code", return await show_error_popup(
br_code: ButtonRequestType = BR_TYPE_OTHER, "Invalid wipe code",
) -> None: "The wipe code must be different from your PIN.",
return await confirm_action( button="TRY AGAIN",
ctx,
br_type,
"INVALID WIPE CODE",
action="The wipe code must be different from your PIN.\n\nPlease try again.",
verb="TRY AGAIN",
verb_cancel=None,
br_code=br_code,
) )

View File

@ -19,7 +19,7 @@ import pytest
from trezorlib import btc, device, messages from trezorlib import btc, device, messages
from trezorlib.client import MAX_PIN_LENGTH, PASSPHRASE_TEST_PATH from trezorlib.client import MAX_PIN_LENGTH, PASSPHRASE_TEST_PATH
from trezorlib.debuglink import TrezorClientDebugLink as Client from trezorlib.debuglink import TrezorClientDebugLink as Client
from trezorlib.exceptions import Cancelled, TrezorFailure from trezorlib.exceptions import TrezorFailure
from ..input_flows import InputFlowNewCodeMismatch from ..input_flows import InputFlowNewCodeMismatch
@ -97,7 +97,7 @@ def test_set_remove_wipe_code(client: Client):
def test_set_wipe_code_mismatch(client: Client): def test_set_wipe_code_mismatch(client: Client):
with client, pytest.raises(Cancelled): with client, pytest.raises(TrezorFailure):
IF = InputFlowNewCodeMismatch(client, WIPE_CODE4, WIPE_CODE6) IF = InputFlowNewCodeMismatch(client, WIPE_CODE4, WIPE_CODE6)
client.set_input_flow(IF.get()) client.set_input_flow(IF.get())

View File

@ -122,7 +122,7 @@ def test_set_failed(client: Client):
# Check that there's no PIN protection # Check that there's no PIN protection
_check_no_pin(client) _check_no_pin(client)
with client, pytest.raises(Cancelled): with client, pytest.raises(TrezorFailure):
IF = InputFlowNewCodeMismatch(client, PIN4, PIN60) IF = InputFlowNewCodeMismatch(client, PIN4, PIN60)
client.set_input_flow(IF.get()) client.set_input_flow(IF.get())

View File

@ -133,6 +133,10 @@ class InputFlowNewCodeMismatch(InputFlowBase):
yield from input_two_different_pins() yield from input_two_different_pins()
yield # PIN mismatch yield # PIN mismatch
self.debug.press_yes() # try again
yield # PIN entry again
self.debug.press_no() # cancel self.debug.press_no() # cancel
@ -158,7 +162,6 @@ class InputFlowCodeChangeFail(InputFlowBase):
yield # enter new pin again (but different) yield # enter new pin again (but different)
self.debug.input(self.new_pin_2) self.debug.input(self.new_pin_2)
# So the mismatch screen is visible
yield # PIN mismatch yield # PIN mismatch
self.debug.press_yes() # try again self.debug.press_yes() # try again

View File

@ -726,11 +726,11 @@
"TT_test_pin.py::test_pin_long": "34692638906727bd3ebf89468aa8d4658866f1aac7775e8cae28bb337d588b3d", "TT_test_pin.py::test_pin_long": "34692638906727bd3ebf89468aa8d4658866f1aac7775e8cae28bb337d588b3d",
"TT_test_pin.py::test_pin_long_delete": "eea0b6485700cce2bc6c13e6d1971e4add11355aa155edf2fcb9bb699dfb0654", "TT_test_pin.py::test_pin_long_delete": "eea0b6485700cce2bc6c13e6d1971e4add11355aa155edf2fcb9bb699dfb0654",
"TT_test_pin.py::test_pin_longer_than_max": "6a7e55fd6d3ff117ee5deb40f1c07cf8d3248931a29e4de6498d813744af2981", "TT_test_pin.py::test_pin_longer_than_max": "6a7e55fd6d3ff117ee5deb40f1c07cf8d3248931a29e4de6498d813744af2981",
"TT_test_pin.py::test_pin_same_as_wipe_code": "8a4174aa065036cd6f111edd668384951fd6184bd18e174cf177925e3933083b", "TT_test_pin.py::test_pin_same_as_wipe_code": "f309e8ffbb4e55a934038b73c8c4f1d250f66b6136d806ddb82fda88aa62648b",
"TT_test_pin.py::test_pin_setup": "470ba3c1e991f14b99ef0256774dcb25ec8efa2e24951f923e9439e1f5d9e71d", "TT_test_pin.py::test_pin_setup": "470ba3c1e991f14b99ef0256774dcb25ec8efa2e24951f923e9439e1f5d9e71d",
"TT_test_pin.py::test_pin_setup_mismatch": "bc3d883b79a2edef4cc38f0284afe8afcb5f7cc49d601a371a131859bfb628cb", "TT_test_pin.py::test_pin_setup_mismatch": "2f4de6411cddb4cc29dad201de1b388267aa0a579652c87ada7b22661debe343",
"TT_test_pin.py::test_pin_short": "b5377990e4a1f324133601e3ca4726cde7af50b3e2c3f53738022ed9108a6a79", "TT_test_pin.py::test_pin_short": "b5377990e4a1f324133601e3ca4726cde7af50b3e2c3f53738022ed9108a6a79",
"TT_test_pin.py::test_wipe_code_same_as_pin": "c674e074339d04370bfc99c846bc055cf1ba135ee1c44d22f7307c42057451d3", "TT_test_pin.py::test_wipe_code_same_as_pin": "d6257f611689fa0e5616bd47861dcc4dad6c48d2d1f642ce923a66cae3dbb236",
"TT_test_pin.py::test_wipe_code_setup": "677797c95ed903fbf03f6e872610855aec253ac5a45bd211dbda96e02464df60", "TT_test_pin.py::test_wipe_code_setup": "677797c95ed903fbf03f6e872610855aec253ac5a45bd211dbda96e02464df60",
"TT_test_recovery.py::test_recovery_bip39": "614e9204c01c379b4b88ba618addd50f22cf9f75492f2363cdca14acee1c883f", "TT_test_recovery.py::test_recovery_bip39": "614e9204c01c379b4b88ba618addd50f22cf9f75492f2363cdca14acee1c883f",
"TT_test_recovery.py::test_recovery_slip39_basic": "73e2c4e4c4cb75206a5b739e4196035a4a3eef83a434a880ac27a8c7b5a3a0e2", "TT_test_recovery.py::test_recovery_slip39_basic": "73e2c4e4c4cb75206a5b739e4196035a4a3eef83a434a880ac27a8c7b5a3a0e2",
@ -1696,7 +1696,7 @@
"TT_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Slip39_Advanced-backup-dcbda5cf": "dbadedde1fd638f72f33590ae32425a0a645c9a0818a5030f0bd9adbe961c2bf", "TT_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Slip39_Advanced-backup-dcbda5cf": "dbadedde1fd638f72f33590ae32425a0a645c9a0818a5030f0bd9adbe961c2bf",
"TT_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Slip39_Basic-backup_fl-1577de4d": "245fafadd5b9181f1a512414ce9c486fff2b9c76044c4855bc143e4f5fd28592", "TT_reset_recovery-test_reset_backup.py::test_skip_backup_msg[BackupType.Slip39_Basic-backup_fl-1577de4d": "245fafadd5b9181f1a512414ce9c486fff2b9c76044c4855bc143e4f5fd28592",
"TT_reset_recovery-test_reset_bip39_t2.py::test_already_initialized": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "TT_reset_recovery-test_reset_bip39_t2.py::test_already_initialized": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_reset_recovery-test_reset_bip39_t2.py::test_failed_pin": "722134783cb2abc73cd695ee1d1ede6f0de8d5402409e656f722208343d81a39", "TT_reset_recovery-test_reset_bip39_t2.py::test_failed_pin": "1902731b7775c17a45864707b5609c61b5f3de702391357b89dc85a424774301",
"TT_reset_recovery-test_reset_bip39_t2.py::test_reset_device": "fa804eaa19c56485ae7f156ba47a3c9642aa70e65295a19e018cf7e0c7156d25", "TT_reset_recovery-test_reset_bip39_t2.py::test_reset_device": "fa804eaa19c56485ae7f156ba47a3c9642aa70e65295a19e018cf7e0c7156d25",
"TT_reset_recovery-test_reset_bip39_t2.py::test_reset_device_192": "cf6b6b9b6c760f229725028cb9413ffc8fe31563045d8b13361a17c040e8a41f", "TT_reset_recovery-test_reset_bip39_t2.py::test_reset_device_192": "cf6b6b9b6c760f229725028cb9413ffc8fe31563045d8b13361a17c040e8a41f",
"TT_reset_recovery-test_reset_bip39_t2.py::test_reset_device_pin": "73f2cc80c5a9d03fb31b6508cbe20832db16dbb32b6edab5aaf108ba062fd840", "TT_reset_recovery-test_reset_bip39_t2.py::test_reset_device_pin": "73f2cc80c5a9d03fb31b6508cbe20832db16dbb32b6edab5aaf108ba062fd840",
@ -1799,15 +1799,15 @@
"TT_test_msg_backup_device.py::test_interrupt_backup_fails": "cdf801e16b046079569e4055f43a86a45d7eace58793427ef5433f71e75961f9", "TT_test_msg_backup_device.py::test_interrupt_backup_fails": "cdf801e16b046079569e4055f43a86a45d7eace58793427ef5433f71e75961f9",
"TT_test_msg_backup_device.py::test_no_backup_fails": "fada9d38ec099b3c6a4fd8bf994bb1f3431e40085128b4e0cd9deb8344dec53e", "TT_test_msg_backup_device.py::test_no_backup_fails": "fada9d38ec099b3c6a4fd8bf994bb1f3431e40085128b4e0cd9deb8344dec53e",
"TT_test_msg_backup_device.py::test_no_backup_show_entropy_fails": "e00c46a70bc5bbfdd3bb6da5a712698e7c79bc8ebd78262ec0f13ef9ee6aec95", "TT_test_msg_backup_device.py::test_no_backup_show_entropy_fails": "e00c46a70bc5bbfdd3bb6da5a712698e7c79bc8ebd78262ec0f13ef9ee6aec95",
"TT_test_msg_change_wipe_code_t2.py::test_set_pin_to_wipe_code": "f0c7493358ebfca355a677822efb1bb9a860715f6746ee76a16311f9e4c5dd7f", "TT_test_msg_change_wipe_code_t2.py::test_set_pin_to_wipe_code": "a9bd775d5fa279ae44eb9498b59eb6af5a78f6ebcae46563ab0d33962d50c82f",
"TT_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "d397af1119fdbdca182ca58ae47f978f66a4cb05b91c0b54922cf4914a58beca", "TT_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "36ce2fa2d74131cc8fed47d335ff485524402d30fe0f5de14e6f9e590ddc00e4",
"TT_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "6a4e349e960b95e75d29f96c5619906a23c63283fdf6b933026a546596f08d54", "TT_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "4882e50989dd4dcebaba685785c713f0ee54b80be13cf66c8c2d4ab111062f33",
"TT_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "e98b69f7a44b1f19cf579ea48ebadecd84d979c4e6852b46320b4e04572a8429", "TT_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "a98ad32b9cf93579b798a76aa60370e2444493307c5743093351edd03b15b008",
"TT_test_msg_changepin_t2.py::test_change_failed": "6ab25151a51ff5f57fbdb01e4c7af8cbeb10508d6c91277f7c5defc6e50d236f", "TT_test_msg_changepin_t2.py::test_change_failed": "565e26dcb8d24f1ad18f4fe03ac8d114fda94a46a0c31f7960497777718845b4",
"TT_test_msg_changepin_t2.py::test_change_invalid_current": "8a94b2df5c14297b9ffc7529bac4af9c867efa5a87796db7aa78750be400062e", "TT_test_msg_changepin_t2.py::test_change_invalid_current": "c11d3f8d788f61a7213bb2dba71ae0517e686e6cb73653addafa5f60d611afbe",
"TT_test_msg_changepin_t2.py::test_change_pin": "4897e28024f677075b5a2fe941876e87bf6ffe5a1ec40d3658d643f6c042aabb", "TT_test_msg_changepin_t2.py::test_change_pin": "4897e28024f677075b5a2fe941876e87bf6ffe5a1ec40d3658d643f6c042aabb",
"TT_test_msg_changepin_t2.py::test_remove_pin": "1a415b1d0d626bf52c08f948f8761ad84f18550931ba34e422c0ee58862f060e", "TT_test_msg_changepin_t2.py::test_remove_pin": "1a415b1d0d626bf52c08f948f8761ad84f18550931ba34e422c0ee58862f060e",
"TT_test_msg_changepin_t2.py::test_set_failed": "a0377c8b0d194f65bf7b6532aa04488cb5a2c81b9cb43e351d5a31c0013c4d0b", "TT_test_msg_changepin_t2.py::test_set_failed": "59e8d307d78714fabc1fabf86d0ff763407b951ccb90883df5e1f2ef03d2ea09",
"TT_test_msg_changepin_t2.py::test_set_pin": "9c9787d1fe80cf530e6c92079a36d440effca54587eb9f5a6b7fdd34406dae17", "TT_test_msg_changepin_t2.py::test_set_pin": "9c9787d1fe80cf530e6c92079a36d440effca54587eb9f5a6b7fdd34406dae17",
"TT_test_msg_loaddevice.py::test_load_device_1": "3643774c15de3f99b82fff125bc05b9af066f5c08b7861a117f0c05da79ba1c5", "TT_test_msg_loaddevice.py::test_load_device_1": "3643774c15de3f99b82fff125bc05b9af066f5c08b7861a117f0c05da79ba1c5",
"TT_test_msg_loaddevice.py::test_load_device_2": "e37151e13b8a880033a82c065a41271d19f8c4a2b3c34985a7f5f04c1f4f0010", "TT_test_msg_loaddevice.py::test_load_device_2": "e37151e13b8a880033a82c065a41271d19f8c4a2b3c34985a7f5f04c1f4f0010",
@ -1845,7 +1845,7 @@
"TT_test_protection_levels.py::test_wipe_device": "af075bdd0d287154aeee0aa6f8a1066be24f2aab8a6f5f4ab7e1bdd26af380e9", "TT_test_protection_levels.py::test_wipe_device": "af075bdd0d287154aeee0aa6f8a1066be24f2aab8a6f5f4ab7e1bdd26af380e9",
"TT_test_sdcard.py::test_sd_format": "45731c43d45fd5d86cdc462a1dbbde1ad83a02fdb5abffa2e8bf54af2f0cd1ee", "TT_test_sdcard.py::test_sd_format": "45731c43d45fd5d86cdc462a1dbbde1ad83a02fdb5abffa2e8bf54af2f0cd1ee",
"TT_test_sdcard.py::test_sd_no_format": "3590feffa9193c304105fba0afae84bc93e54f1a4706490bd63b9d56a202a1a7", "TT_test_sdcard.py::test_sd_no_format": "3590feffa9193c304105fba0afae84bc93e54f1a4706490bd63b9d56a202a1a7",
"TT_test_sdcard.py::test_sd_protect_unlock": "1e500d3abe7d308a451267df9da4b0a3167ffe25e16c42ee219ca449c38fd500", "TT_test_sdcard.py::test_sd_protect_unlock": "674dd28470342a9cffe39da611f55dd0ae217db3d965da99bc3cbef8f8521bbf",
"TT_test_session.py::test_cannot_resume_ended_session": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "TT_test_session.py::test_cannot_resume_ended_session": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"TT_test_session.py::test_clear_session": "4978f02d2c97e997eaf8417e511dfdfdbe9675f82e7d849117ba5cf6ce653c53", "TT_test_session.py::test_clear_session": "4978f02d2c97e997eaf8417e511dfdfdbe9675f82e7d849117ba5cf6ce653c53",
"TT_test_session.py::test_derive_cardano_empty_session": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3", "TT_test_session.py::test_derive_cardano_empty_session": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
@ -1880,7 +1880,7 @@
"TT_tezos-test_sign_tx.py::test_tezos_smart_contract_delegation": "90ed61bc1f075503fa7fc1d9a4137d38b8c9a0ff12a86ed19d936c6758ccd9f0", "TT_tezos-test_sign_tx.py::test_tezos_smart_contract_delegation": "90ed61bc1f075503fa7fc1d9a4137d38b8c9a0ff12a86ed19d936c6758ccd9f0",
"TT_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer": "bec3ec92587c50ee286e1257954a9248c28dfd5eb09cefbbd89f35357ce35021", "TT_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer": "bec3ec92587c50ee286e1257954a9248c28dfd5eb09cefbbd89f35357ce35021",
"TT_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer_to_contract": "b4aee29d5b8c16f60cc2eb87cc4a5c63402141a9409ddcc7ec0d2af272aab79d", "TT_tezos-test_sign_tx.py::test_tezos_smart_contract_transfer_to_contract": "b4aee29d5b8c16f60cc2eb87cc4a5c63402141a9409ddcc7ec0d2af272aab79d",
"TT_webauthn-test_msg_webauthn.py::test_add_remove": "48e680f749e86f04a5da52a23b1ec23aee8d526af66b30438d423dda7b5be53a", "TT_webauthn-test_msg_webauthn.py::test_add_remove": "40f10f46427749ccb4b5573ccbb7e6ba5d2871abfca6ce201bfa20b97150b19f",
"TT_webauthn-test_u2f_counter.py::test_u2f_counter": "d46453a7846a8fd8a5f513937104c82cf8662f76be39017dbc217abf0eb3600a", "TT_webauthn-test_u2f_counter.py::test_u2f_counter": "d46453a7846a8fd8a5f513937104c82cf8662f76be39017dbc217abf0eb3600a",
"TT_zcash-test_sign_tx.py::test_external_presigned": "0020164adcd1f8558664940a171683e1c6a43da9612344a84822d1bebc68a654", "TT_zcash-test_sign_tx.py::test_external_presigned": "0020164adcd1f8558664940a171683e1c6a43da9612344a84822d1bebc68a654",
"TT_zcash-test_sign_tx.py::test_one_two": "d2975b997628fb3a82c3fcb5c792f79c7fa64cba3c350517408fb863db8e759e", "TT_zcash-test_sign_tx.py::test_one_two": "d2975b997628fb3a82c3fcb5c792f79c7fa64cba3c350517408fb863db8e759e",