1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-12-18 04:18:10 +00:00

feat(core): make lockscreen blank for T2B1

also allow soft-locking even when PIN is not set
This commit is contained in:
matejcik 2023-10-31 15:54:27 +01:00 committed by matejcik
parent 29d0b4836f
commit 3a28ab4c11
6 changed files with 133 additions and 92 deletions

View File

@ -0,0 +1 @@
[T2B1] Turn the screen off when device is locked, to prolong OLED life.

View File

@ -174,6 +174,8 @@ where
invisible_buttons: Child<ButtonController<T>>,
/// Display coinjoin icon?
coinjoin_icon: Option<Icon>,
/// Screensaver mode (keep screen black)
screensaver: bool,
}
impl<T> Lockscreen<T>
@ -194,6 +196,7 @@ where
instruction: Child::new(Label::centered(instruction_str.into(), theme::TEXT_NORMAL)),
invisible_buttons: Child::new(ButtonController::new(invisible_btn_layout)),
coinjoin_icon: coinjoin_authorized.then_some(theme::ICON_COINJOIN),
screensaver: !bootscreen,
}
}
}
@ -219,6 +222,10 @@ where
}
fn paint(&mut self) {
if self.screensaver {
// keep screen blank
return;
}
theme::ICON_LOCK.draw(
TOP_CENTER + Offset::y(LOCK_ICON_TOP_MARGIN),
Alignment2D::TOP_CENTER,

View File

@ -24,6 +24,9 @@ if TYPE_CHECKING:
)
_SCREENSAVER_IS_ON = False
def busy_expiry_ms() -> int:
"""
Returns the time left until the busy state expires or 0 if the device is not in the busy state.
@ -319,6 +322,11 @@ def set_homescreen() -> None:
set_default(lockscreen)
elif _SCREENSAVER_IS_ON:
from apps.homescreen import screensaver
set_default(screensaver, restart=True)
elif storage_recovery.is_in_progress():
from apps.management.recovery_device.homescreen import recovery_homescreen
@ -340,7 +348,16 @@ def lock_device(interrupt_workflow: bool = True) -> None:
def lock_device_if_unlocked() -> None:
if config.is_unlocked():
from apps.common.request_pin import can_lock_device
if not utils.USE_BACKLIGHT and not can_lock_device():
# on OLED devices without PIN, trigger screensaver
global _SCREENSAVER_IS_ON
_SCREENSAVER_IS_ON = True
set_homescreen()
elif config.is_unlocked():
lock_device(interrupt_workflow=workflow.autolock_interrupts_workflow)
@ -352,10 +369,13 @@ async def unlock_device() -> None:
"""
from apps.common.request_pin import verify_user_pin
global _SCREENSAVER_IS_ON
if not config.is_unlocked():
# verify_user_pin will raise if the PIN was invalid
await verify_user_pin()
_SCREENSAVER_IS_ON = False
set_homescreen()
wire.find_handler = workflow_handlers.find_registered_handler

View File

@ -1,3 +1,5 @@
from typing import Coroutine
import storage
import storage.cache
import storage.device
@ -45,12 +47,13 @@ async def homescreen() -> None:
lock_device()
async def lockscreen() -> None:
async def _lockscreen(screensaver: bool = False) -> None:
from apps.base import unlock_device
from apps.common.request_pin import can_lock_device
# Only show the lockscreen UI if the device can in fact be locked.
if can_lock_device():
# Only show the lockscreen UI if the device can in fact be locked, or if it is
# and OLED device (in which case the lockscreen is a screensaver).
if can_lock_device() or screensaver:
await Lockscreen(
label=storage.device.get_label(),
coinjoin_authorized=is_set_any_session(MessageType.AuthorizeCoinJoin),
@ -62,3 +65,11 @@ async def lockscreen() -> None:
await unlock_device()
except wire.PinCancelled:
pass
def lockscreen() -> Coroutine[None, None, None]:
return _lockscreen()
def screensaver() -> Coroutine[None, None, None]:
return _lockscreen(screensaver=True)

View File

@ -107,24 +107,26 @@ def start_default() -> None:
autolock_interrupts_workflow = True
def set_default(constructor: Callable[[], loop.Task]) -> None:
def set_default(constructor: Callable[[], loop.Task], restart: bool = False) -> None:
"""Configure a default workflow, which will be started next time it is needed."""
global default_constructor
if __debug__:
log.debug(__name__, "setting a new default: %s", constructor)
default_constructor = constructor
if restart:
# XXX should this be the default (or only) behavior?
kill_default()
if False: # noqa
def kill_default() -> None:
def kill_default() -> None:
"""Forcefully shut down default task.
The purpose of the call is to prevent the default task from interfering with
a synchronous layout-less workflow (e.g., the progress bar in `mnemonic.get_seed`).
If called while a workflow is running, the default task is stopped. This can be used
to prevent the default task from interfering with a synchronous layout-less workflow
(e.g., the progress bar in `mnemonic.get_seed`).
This function should only be called from a workflow registered with `on_start`.
Otherwise the default will be restarted immediately.
If called when no workflow is running, the default task will automatically be
restarted. This can be used to replace the default with a different workflow.
"""
if default_task:
if __debug__:

View File

@ -737,15 +737,15 @@
},
"TR": {
"click_tests": {
"TR_test_autolock.py::test_autolock_does_not_interrupt_preauthorized": "22f65f6d9edc7659e5c54bdda6bd38c68c96637d2eb1f8475a536c9f49423b30",
"TR_test_autolock.py::test_autolock_does_not_interrupt_signing": "3d0833002f39256a15ee5008af9d2cd304c61bc2932cb6dc844c027bfed3ed1d",
"TR_test_autolock.py::test_autolock_interrupts_passphrase": "1ab8da65492ade3e6301f784b818d355959c665ea4b91e38f6dd2de8c8b21c84",
"TR_test_autolock.py::test_autolock_interrupts_signing": "5f26a18a711ec7d17c035cc60478249281edeeac512d4561e55bd7a3c2d2ef94",
"TR_test_autolock.py::test_autolock_passphrase_keyboard": "60c8bd539f4fa4e5b4de2ac49f841d526868429ba348293665fd9a8ddc1270bd",
"TR_test_autolock.py::test_dryrun_enter_word_slowly": "817e4222e39fc362bf0b6e997f5d806291556374f1f10c995c1af773ddf51566",
"TR_test_autolock.py::test_dryrun_locks_at_number_of_words": "5b3dfca5a87c24196211c4c69e6b5297424313e8fa5fe8b7ec319c8ab3b44a71",
"TR_test_autolock.py::test_dryrun_locks_at_word_entry": "05f0b0956d12f04f96537bbc612064d25c52ef9b41ab9c8278a812c2ff7a1e08",
"TR_test_lock.py::test_hold_to_lock": "77b90847359d27503f11cddb9900a71cf311a0e1650aeb20bcee052fca5b3e33",
"TR_test_autolock.py::test_autolock_does_not_interrupt_preauthorized": "db31938e0b4969204c2411069f00ed8a314b31e0dec251cce371adb0bec1c524",
"TR_test_autolock.py::test_autolock_does_not_interrupt_signing": "21d405bf393cdb8e25817a8c9b893bd5a4d5c05fa9e1d33e98e6ba512c8c4496",
"TR_test_autolock.py::test_autolock_interrupts_passphrase": "82f963d13f42b754f8749c2587466e8a1ca3843581ccda63fb846e1311ce6f7f",
"TR_test_autolock.py::test_autolock_interrupts_signing": "0ede63ae0d813a3d27fef17f3385c96111415932e3e525c7f421e7054e2c9887",
"TR_test_autolock.py::test_autolock_passphrase_keyboard": "44274f7e1e714fde732df8c48ffb3617d1b4ecf50d32256ce6f167f40fbd5e6d",
"TR_test_autolock.py::test_dryrun_enter_word_slowly": "69c6f17ea55eb9428ea6daf64409f23702952b0dccd5f0640c10b1f4c62287eb",
"TR_test_autolock.py::test_dryrun_locks_at_number_of_words": "df7a17ab9cd2c617ce22a615e1da9bedee41f978459cbe103f2eecb8dfe8db12",
"TR_test_autolock.py::test_dryrun_locks_at_word_entry": "0c92384d1b542783bc67a3cf88da3cfa66d8dd4d4476687e3663e6bd4bb1c4e1",
"TR_test_lock.py::test_hold_to_lock": "6ac772162c2afcf472d547907050495366de6cd44f60ac0025666ef690ab67e9",
"TR_test_passphrase_tr.py::test_cancel": "4a79e82b3ddf23c087e70767f2c4d4720f980370e22be209189d4ed42a453ee8",
"TR_test_passphrase_tr.py::test_passphrase_delete": "0ec483b293e4cbaeabe1f118edcff55368720429602588f05d277b54826e9bc2",
"TR_test_passphrase_tr.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZW-381132c0": "5fe91eac5909cf3fd10a8f856f1d8f961469b49d8711d6c25788b81bd1c7e4a2",
@ -755,19 +755,19 @@
"TR_test_passphrase_tr.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "43e693afaa37d22fcbe46a44ca13f6cdd34e86b43320a4226faf04344c07c060",
"TR_test_passphrase_tr.py::test_passphrase_input_over_50_chars": "502828e28edd8147781b1714cae83eea6f71a9820c30446d7e38eeb3a43617c9",
"TR_test_passphrase_tr.py::test_passphrase_loop_all_characters": "5079e557c3ee648d7778154d65ac0f0200e2ee7e6cc88d46dfb753e314582bed",
"TR_test_pin.py::test_pin_change": "5820a43c03708f208059365711b2a46427c279c7462c2c529a73e5ad560bc36b",
"TR_test_pin.py::test_pin_delete_hold": "8f8be800e39bcfc95236abcfbb69477776885471605fe82da5d81fcfe04c397e",
"TR_test_pin.py::test_pin_empty_cannot_send": "40e337e5ef45335d8b521135f4ffca25b5578b6d9af2d91aa9650fb61fde29f1",
"TR_test_pin.py::test_pin_incorrect": "852bf321191682d6cf67c06098ef87571a42f1337609ea90bf476296b344bab4",
"TR_test_pin.py::test_pin_long": "d2a86a95b38b8c09c04f0e02a118b62174e835c3ea58aace2d46d9af2a1c561b",
"TR_test_pin.py::test_pin_long_delete": "6006261b91ea207efb220cd20cf5574e775e8e4ce04eb6f86f924f12fd818a2f",
"TR_test_pin.py::test_pin_longer_than_max": "87c113c072710169248bb56780ead04d6d4eb5f80892d4327d3af5e98cf0e336",
"TR_test_pin.py::test_pin_change": "4da53241f5751bcccbdaabeb8eaad3b201d7d8ab14508158432660862e2ac169",
"TR_test_pin.py::test_pin_delete_hold": "722b733995ae1e03496719bfabc951d832287bd041ead26eb05e536d39280122",
"TR_test_pin.py::test_pin_empty_cannot_send": "328da418bd62032cc1bc523712edae6a259982d25d5ca6609ea52c79283549b3",
"TR_test_pin.py::test_pin_incorrect": "0d3f92b0b39bab0aafb92deaf2a229fed6f3db2703e36c449440bfd2af2f5a8a",
"TR_test_pin.py::test_pin_long": "a9861a92fed71ddd42bb56a39f7c80100158e23145f1f433c06d72ccb14efaa7",
"TR_test_pin.py::test_pin_long_delete": "3833d4e71cc1c388bacb1ef4c9b7c8e47e897887b21603dec53ed4d02e381e4c",
"TR_test_pin.py::test_pin_longer_than_max": "fbd7c4034dcca37f07527e8864ab426970b7192c51a4965d0fc499d0eb6bbc24",
"TR_test_pin.py::test_pin_same_as_wipe_code": "41e5505d884d87efe05cb9401351f89c7365dbece7f911d4115516c11f52bb9b",
"TR_test_pin.py::test_pin_setup": "040256a62fb20f5284bbec0ababab6d94f6fbed1b9b9a0cebe58a73ccae7ff2d",
"TR_test_pin.py::test_pin_setup_mismatch": "4cafbb73ee107509f8766d73d2389ef246d27ade3540b835cdfaf83d2cb4a416",
"TR_test_pin.py::test_pin_short": "ab68bf7e867ae8b2ce7a4f036152220f8b7630b7a278ae73c1b85ec4078a0c7b",
"TR_test_pin.py::test_wipe_code_same_as_pin": "e75b67a93ec401ec4a42d3f9d30019ebeb5a8a7a8de26b552680ac6d2de566c9",
"TR_test_pin.py::test_wipe_code_setup": "83e31cdef28ab56a0673113050535c8c495f01143fab2f3702ac3c1cc7310467",
"TR_test_pin.py::test_pin_short": "a87619c455ec81763cbb133279f9e7fbb3b9a5a02c58e1da63640d51a4e107c3",
"TR_test_pin.py::test_wipe_code_same_as_pin": "f47457df24228743f3d7f3cc9e60c209b2c628c35d00bb1f965dda2692b4a632",
"TR_test_pin.py::test_wipe_code_setup": "4afe5ceb8f953892eea8b6b7c6997a1b5afa40b81372265a84a567b61773d89b",
"TR_test_recovery.py::test_recovery_bip39": "43a56fb1dea38503cfddf55c4a6e8d5a5188be7354bd5c2b31fde197f2af3443",
"TR_test_recovery.py::test_recovery_slip39_basic": "40df8fd6302577ff4f1d1d6d214d1ffd22791912ee4225ae86460a3fa3f3ac0f",
"TR_test_reset_bip39.py::test_reset_bip39": "7718a5386da5babb9c696d9524db78a0ec2d05f3f5bb03a9c523eeaaac0d69a1",
@ -795,8 +795,8 @@
"TR_bitcoin-test_authorize_coinjoin.py::test_get_address": "a96bebc82d5aff9c6a8583ddb354e6427689a3be4fddf082c3cd0e8722e54d46",
"TR_bitcoin-test_authorize_coinjoin.py::test_get_public_key": "4c2bba305bab30de2fcff0cec5ab1192f2e4d826d86f91f7172dfa624f5f3139",
"TR_bitcoin-test_authorize_coinjoin.py::test_multisession_authorization": "5f70b535406a6254113ed2a5f780ba98b8205abf6425eb7038d22395953aa560",
"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx[False]": "ebe4ac22942f10915507491103d1151b2416ffebfd6c3ca6f2b28be8b35d4262",
"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx[True]": "ebe4ac22942f10915507491103d1151b2416ffebfd6c3ca6f2b28be8b35d4262",
"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx[False]": "bf962269c96493db17d34978f049d3dba44ca7a311fbf53822046f7f1e3ec4df",
"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx[True]": "bf962269c96493db17d34978f049d3dba44ca7a311fbf53822046f7f1e3ec4df",
"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_large": "4f275de439c812363140d3839ebddd9243e2bb34d80d02a487361148b2bbab71",
"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_migration": "4cf48d6bb48a9efbff9e2949d657fde4dea7ae9e92f47cafdfcd11d7765d76b8",
"TR_bitcoin-test_authorize_coinjoin.py::test_sign_tx_spend": "db453154c6d8318befea7230eb2a9639fece5bdfd83c62fbb7a1e9195b77ac1b",
@ -1872,47 +1872,47 @@
"TR_test_authenticate_device.py::test_authenticate_device[\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\-d824e03c": "44cce3f1238dcb3e305191a08f3ecc2093ca0a449ab78774223b2a15f54731f3",
"TR_test_authenticate_device.py::test_authenticate_device[]": "44cce3f1238dcb3e305191a08f3ecc2093ca0a449ab78774223b2a15f54731f3",
"TR_test_authenticate_device.py::test_authenticate_device[hello world]": "44cce3f1238dcb3e305191a08f3ecc2093ca0a449ab78774223b2a15f54731f3",
"TR_test_autolock.py::test_apply_auto_lock_delay": "f74f7417dd27279b9c2db47f5d2049c3e10e5b45aeb853fed0ae01da85373a7e",
"TR_test_autolock.py::test_apply_auto_lock_delay_out_of_range[0]": "c440a218850ec7ec8a4f8ee218d2c28251d12aa455f4726202d8bde897b0a555",
"TR_test_autolock.py::test_apply_auto_lock_delay_out_of_range[1]": "c440a218850ec7ec8a4f8ee218d2c28251d12aa455f4726202d8bde897b0a555",
"TR_test_autolock.py::test_apply_auto_lock_delay_out_of_range[4194304]": "c440a218850ec7ec8a4f8ee218d2c28251d12aa455f4726202d8bde897b0a555",
"TR_test_autolock.py::test_apply_auto_lock_delay_out_of_range[536871]": "c440a218850ec7ec8a4f8ee218d2c28251d12aa455f4726202d8bde897b0a555",
"TR_test_autolock.py::test_apply_auto_lock_delay_out_of_range[9]": "c440a218850ec7ec8a4f8ee218d2c28251d12aa455f4726202d8bde897b0a555",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[10]": "5b9a1f82cd9866d3e0ba3b37e65981396d4e7fffa382093ab732d28d9e4440da",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[123]": "e6e4a741f2bb5657deff60936d895445829a1bc3ac13494bbe634a88d123431f",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[3601]": "46276d5e4c4ff353da50a1a7358c48321af4c2fbdfe2e97372aa862481cb85e4",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[536870]": "41ae39e0bd2e5c1989f409fc17f5805a7e3cc26a6d25f2b20efdea81f6e24961",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[60]": "1731db71cc1371e3ff3543bc7c4506ab4731905c6f82cd49737962d2b578586c",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[7227]": "77cce180f4325557e96d54c39e460c15acae1579b7f642f7dbf637db8c685e78",
"TR_test_autolock.py::test_autolock_cancels_ui": "1372af21ad2b3bde2a150bc877a8a44be21583631c6edf6c492064193281c24d",
"TR_test_autolock.py::test_autolock_default_value": "aac9685d90303ec5a167d80a872110efd45dfbd71048754b0c2a9e0dc0db708d",
"TR_test_autolock.py::test_autolock_ignores_getaddress": "4b0bddb201433b29a1e04816070bddceba711da26add6362781defa16a504cf2",
"TR_test_autolock.py::test_autolock_ignores_initialize": "4b0bddb201433b29a1e04816070bddceba711da26add6362781defa16a504cf2",
"TR_test_autolock.py::test_apply_auto_lock_delay": "56e15781b06dd59696c03817efe7f8716c95d8b65fc0d3b0be3281a0901e6f72",
"TR_test_autolock.py::test_apply_auto_lock_delay_out_of_range[0]": "deaec3ee8e787b4ef58ef675e64f4fc1c721296c07029bdd430ca487ec073152",
"TR_test_autolock.py::test_apply_auto_lock_delay_out_of_range[1]": "deaec3ee8e787b4ef58ef675e64f4fc1c721296c07029bdd430ca487ec073152",
"TR_test_autolock.py::test_apply_auto_lock_delay_out_of_range[4194304]": "deaec3ee8e787b4ef58ef675e64f4fc1c721296c07029bdd430ca487ec073152",
"TR_test_autolock.py::test_apply_auto_lock_delay_out_of_range[536871]": "deaec3ee8e787b4ef58ef675e64f4fc1c721296c07029bdd430ca487ec073152",
"TR_test_autolock.py::test_apply_auto_lock_delay_out_of_range[9]": "deaec3ee8e787b4ef58ef675e64f4fc1c721296c07029bdd430ca487ec073152",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[10]": "ef2f9b8c04ff989954c46942460c32e32125b7475c35e16fee2c15c121205a0f",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[123]": "6d1ef42b15d88fb84c17b9b6830ee39eba964dd31978022c3dc0179bc04b2f45",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[3601]": "94946c6e986f351aed3af94ccc67166e08906ca4fe0f37ddb43305e3e945198c",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[536870]": "43009515b95e657ce19bcfc2699f6dac50fe18caa58e91eb8445a5e2d9d7053f",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[60]": "bf6116bcf72754cbb490330b4d629121b6c271c275133fdb5137630db2460978",
"TR_test_autolock.py::test_apply_auto_lock_delay_valid[7227]": "14fc494814c65309be6a64d0c954758e3e4b459054b46025e4917a259e6f34e5",
"TR_test_autolock.py::test_autolock_cancels_ui": "1ee27abecb32d42ef8f9a3601a603e787eef338c49702f8c5e5bc30d4807800e",
"TR_test_autolock.py::test_autolock_default_value": "d810436f4404563b1a3dda410cbda2f42969ef6bc746b85fefc6fce2fe835369",
"TR_test_autolock.py::test_autolock_ignores_getaddress": "c5e41fe24ab50d93b40d5ce91a2b4232cef22046ea0d6c0e01603b01a333ada6",
"TR_test_autolock.py::test_autolock_ignores_initialize": "c5e41fe24ab50d93b40d5ce91a2b4232cef22046ea0d6c0e01603b01a333ada6",
"TR_test_basic.py::test_device_id_different": "0abb37c5dd2cc89e22f3952cfec9191413873c9c291df8c8a43a7c89f23b5fd5",
"TR_test_basic.py::test_device_id_same": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095",
"TR_test_basic.py::test_features": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095",
"TR_test_basic.py::test_ping": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095",
"TR_test_busy_state.py::test_busy_expiry": "0cff54da20c3c70d5b5de75a45fc265b29683fe322ad498f947656118691eeca",
"TR_test_busy_state.py::test_busy_state": "b3efd704b640ffbd4cad56d4702e80a59b92350a7b640753eed0e7ce5602d110",
"TR_test_busy_state.py::test_busy_state": "7bdbfa392d76bcf551685c356042ffe4463538e61e194c1381ad0eb70ef0112b",
"TR_test_cancel.py::test_cancel_message_via_cancel[message0]": "41b9fc37f230520f9d94df226ff8433822e56ea4276a31ef99171a774e477045",
"TR_test_cancel.py::test_cancel_message_via_cancel[message1]": "41b9fc37f230520f9d94df226ff8433822e56ea4276a31ef99171a774e477045",
"TR_test_cancel.py::test_cancel_message_via_initialize[message0]": "41b9fc37f230520f9d94df226ff8433822e56ea4276a31ef99171a774e477045",
"TR_test_cancel.py::test_cancel_message_via_initialize[message1]": "41b9fc37f230520f9d94df226ff8433822e56ea4276a31ef99171a774e477045",
"TR_test_cancel.py::test_cancel_on_paginated": "79f025ebfbdc5a81dae1385b17d2d802280063479c8480fa5281734fe1542385",
"TR_test_debuglink.py::test_softlock_instability": "a5def6b8a59ba049681fe36fe1d3ce736afeb4637a0477f4decf9c4ee6cdf6a2",
"TR_test_debuglink.py::test_softlock_instability": "cff029b728b242ec07f405a0fcd12a77212f0a28e9ec14f1b9e2db1b63293783",
"TR_test_firmware_hash.py::test_firmware_hash_emu": "5dde95f0c09df69cdb1e6017ff3269781e499f2c1894db677e1d06971e45d0a1",
"TR_test_firmware_hash.py::test_firmware_hash_hw": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_good": "633346cfb7dad97e9313c7e40a4ef24de43dc9debb8a133a646c8a3be73b8f6c",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_with_long_label": "5805cddcc3b50b90944ef91b44cedf0dcf70ffc8a4aa644071dc96c7d807deea",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_good": "fc78876e183a82d8099263e5b3858620f65f7842f7d31f4679dddcb045f1dfb2",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_with_long_label": "57dc2b38db364a7ba43566c700ab27a3e98a08e64efc564db53b61aa6f4098aa",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_with_notification": "5f2cecf0c5bf0e7c8743a3a9f241149abf4a09431d21b801c6989c171208aa6e",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_wrong_size": "c440a218850ec7ec8a4f8ee218d2c28251d12aa455f4726202d8bde897b0a555",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_upload_jpeg_fail": "c440a218850ec7ec8a4f8ee218d2c28251d12aa455f4726202d8bde897b0a555",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_upload_t1_fail": "c440a218850ec7ec8a4f8ee218d2c28251d12aa455f4726202d8bde897b0a555",
"TR_test_msg_applysettings.py::test_apply_settings": "706fb9d11696426598d29e122c73757388f85ddc950dccc5d06b4e1f3a962a59",
"TR_test_msg_applysettings.py::test_apply_settings_passphrase": "c41b08d7df422ee925c35970f1ca621035673eb3e08c865fa4d3afc77363cab5",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_toif_wrong_size": "deaec3ee8e787b4ef58ef675e64f4fc1c721296c07029bdd430ca487ec073152",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_upload_jpeg_fail": "deaec3ee8e787b4ef58ef675e64f4fc1c721296c07029bdd430ca487ec073152",
"TR_test_msg_applysettings.py::test_apply_homescreen_tr_upload_t1_fail": "deaec3ee8e787b4ef58ef675e64f4fc1c721296c07029bdd430ca487ec073152",
"TR_test_msg_applysettings.py::test_apply_settings": "e84453642c927b2fe15325a109672814103f2f94d7b5d70a313d921f21b88a37",
"TR_test_msg_applysettings.py::test_apply_settings_passphrase": "5775d63130fa4646263cd26d47bebc87691344dafd9e849c9fa361a1ea7f7e6b",
"TR_test_msg_applysettings.py::test_apply_settings_passphrase_on_device": "caf5f9733414c8edd4f13800250d7d3d0d3a4012844b826ed314db5c608508eb",
"TR_test_msg_applysettings.py::test_apply_settings_rotation": "b7bfea9fcc42a15b3e8a78f980bf656f46a0f73d41457b9a0be5a85c87aac11a",
"TR_test_msg_applysettings.py::test_experimental_features": "9c0faf68267426b39258e546df25ea19b81a0fd26a6577efd563b59bc15baaf2",
"TR_test_msg_applysettings.py::test_apply_settings_rotation": "28c4463b15fdd9d455f2bd6f229fd22432bfe9ba48606602e2ff637b1bc7a6bf",
"TR_test_msg_applysettings.py::test_experimental_features": "0ac7ff5ebcc73c8922545b14e8584d13199ea0c5d0712189b16e24ded22e3c17",
"TR_test_msg_applysettings.py::test_label_too_long": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095",
"TR_test_msg_applysettings.py::test_safety_checks": "a34a867f1d58b2a29c5d1724378f269ce699b380fd2206cc8cc4c06bcb76565d",
"TR_test_msg_backup_device.py::test_backup_bip39": "d8778ebc414b075141007dd18f9ecf652338947187bb2f9770101ccbfa56e233",
@ -1924,48 +1924,48 @@
"TR_test_msg_backup_device.py::test_no_backup_fails": "60c13acb4f8e40ee32f9d01415cbcbd75ffcd6a4015003d93562e84c3901a62f",
"TR_test_msg_backup_device.py::test_no_backup_show_entropy_fails": "345ab360936150d9853d9d2d871d3730786f9b78220f9b9a8205f2071c465339",
"TR_test_msg_change_wipe_code_t2.py::test_set_pin_to_wipe_code": "ea276d47a239b8389071eeed9fc51e962340f808ef642343fb30db48c8ff699d",
"TR_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "e64bac244c8055bdcc0a5e63a7a68643a7b21464ed82ee8a6679f01b907d210d",
"TR_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "3c12cf8b0abe61410de9eb830b922c2ef6154d3cc67a08c9b30f7f861d25293a",
"TR_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "d9304c9e8f08c28b5d34e4e3575850febe0b6540e526a4a6056a6af16f5c9ec8",
"TR_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "bb13ef4939949aee15b75a3c6fe89912201fa679ec094478ae3c7bc61a207c36",
"TR_test_msg_changepin_t2.py::test_change_failed": "8f37cc04900aa176242ad717b04a87ab6b89c2cfad79e803eceb09c208042a35",
"TR_test_msg_changepin_t2.py::test_change_invalid_current": "d9c649eb007f5d7dd65983373c88002e271377680a3c17260c283166bbd965e6",
"TR_test_msg_changepin_t2.py::test_change_pin": "33264f2e2b0512ef216336ccadcc88cf2ec44a29b1f07b08d2e222cecab5dc25",
"TR_test_msg_changepin_t2.py::test_remove_pin": "9658757510c92d40b545f09fe728778cd10f9f16e89de9936b1d62f2f3dea446",
"TR_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "b0e4f94c4255c5dcbd6532f3b93481344cce89a44aa3cc186ad47c2abd34bf92",
"TR_test_msg_changepin_t2.py::test_change_failed": "ace510751a5c91022e21e3e088013ff4260dfb1c25732fac80cdc88345d0cdd2",
"TR_test_msg_changepin_t2.py::test_change_invalid_current": "c8a5fdc1a70727a9992d07f44d6dbdd9886ccddd99b3a50b41eb75a7e2c2647c",
"TR_test_msg_changepin_t2.py::test_change_pin": "a218c9db7f5567458053cf075cef32d3afaec724111c3ba9f23d53b468d4b0a2",
"TR_test_msg_changepin_t2.py::test_remove_pin": "9e69d8a6e72383d4b48af12340790bef5e55ed77821f80c7ac959522885097a8",
"TR_test_msg_changepin_t2.py::test_set_failed": "36a5cde2473ea82c5031826ea4c4971043850332ab9eca1020e1ea068e97e3f3",
"TR_test_msg_changepin_t2.py::test_set_pin": "5f29f663413217c1fcf3545ebdc67a0a5c76136f247ca14bd5afc204eb198508",
"TR_test_msg_changepin_t2.py::test_set_pin": "762965944766f817ededfa4eb23166542ce71412a4d5c817a7bd0c65b974d3be",
"TR_test_msg_loaddevice.py::test_load_device_1": "5aeba25726809261dd32451cf6038a3a7aaa197e5f098745f1dff222867c6051",
"TR_test_msg_loaddevice.py::test_load_device_2": "caf04f8db960bf67885209f02f53bb79d5687aabbd63c1d437daeebf47ccea40",
"TR_test_msg_loaddevice.py::test_load_device_slip39_advanced": "5aeba25726809261dd32451cf6038a3a7aaa197e5f098745f1dff222867c6051",
"TR_test_msg_loaddevice.py::test_load_device_slip39_basic": "5aeba25726809261dd32451cf6038a3a7aaa197e5f098745f1dff222867c6051",
"TR_test_msg_loaddevice.py::test_load_device_utf": "c125e969faf756918c52c2452495b8cbc024d84484c40352dab4a47774a9de40",
"TR_test_msg_ping.py::test_ping": "4ffbed72e7ed7fbab85f830952200adf7758af81b658b56de4672344120456a6",
"TR_test_msg_wipedevice.py::test_autolock_not_retained": "f4828fc3627e44a9df8c7db31d36e3f58e9b55223be1eb5cc4230285dfaa05f9",
"TR_test_msg_wipedevice.py::test_autolock_not_retained": "0f8ee1d9d046e3832c621fd3e6efb4df56f81efab9f9c6fea1973bd2775c3298",
"TR_test_msg_wipedevice.py::test_wipe_device": "0abb37c5dd2cc89e22f3952cfec9191413873c9c291df8c8a43a7c89f23b5fd5",
"TR_test_passphrase_slip39_advanced.py::test_128bit_passphrase": "0c1d2e8f1e4b43ee5071cf1d6e31c134297ba8315f1f4568765875438e7720f5",
"TR_test_passphrase_slip39_advanced.py::test_256bit_passphrase": "0c1d2e8f1e4b43ee5071cf1d6e31c134297ba8315f1f4568765875438e7720f5",
"TR_test_passphrase_slip39_basic.py::test_2of5_passphrase": "ed4af0c4901c1f682a4ab2f7f741721265a0829d6eac91b3696f6c2c58eb8b0d",
"TR_test_passphrase_slip39_basic.py::test_3of6_passphrase": "ed4af0c4901c1f682a4ab2f7f741721265a0829d6eac91b3696f6c2c58eb8b0d",
"TR_test_pin.py::test_correct_pin": "c440a218850ec7ec8a4f8ee218d2c28251d12aa455f4726202d8bde897b0a555",
"TR_test_pin.py::test_exponential_backoff_t2": "77f8c1cc31a378f1b9db216042d74a2317b0d8b7013db9024f183fda9aec18c6",
"TR_test_pin.py::test_incorrect_pin_t2": "9bd79b46c7728319f808dd9a22ea544476fe95ce3935cff993339259c652d4d8",
"TR_test_pin.py::test_correct_pin": "deaec3ee8e787b4ef58ef675e64f4fc1c721296c07029bdd430ca487ec073152",
"TR_test_pin.py::test_exponential_backoff_t2": "3785284a7044f46b47123c8867801b989a81ea1d7fccbd2186c944f9049473d8",
"TR_test_pin.py::test_incorrect_pin_t2": "e0c34c861c8f1d9a1a4cbc0bd8c96d3ee05183631bb7b5161450bb90cb0e4416",
"TR_test_pin.py::test_no_protection": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095",
"TR_test_protection_levels.py::test_apply_settings": "b1847b253dfc1e5b42128b73e3c7b87d33ae3bbb85d10c75285ed0bdfdee2fe6",
"TR_test_protection_levels.py::test_change_pin_t2": "aaec729d4870269b59979f778350bd8775c36712c6f7c4b84e0ef971ef69a2ee",
"TR_test_protection_levels.py::test_get_address": "c0cfa80fd221f4fe608cfe1a6241b0990cf1c19af21336977e36249c0a3a6370",
"TR_test_protection_levels.py::test_get_entropy": "588c753fd2e1611b1bd6432ac45bccbb7e220da0c62ec3df87aee19852ad80e9",
"TR_test_protection_levels.py::test_get_public_key": "c0cfa80fd221f4fe608cfe1a6241b0990cf1c19af21336977e36249c0a3a6370",
"TR_test_protection_levels.py::test_initialize": "f36666e0d59c24cfc5b6d1de10708564f392e9453de253fba366f142cfb76d13",
"TR_test_protection_levels.py::test_apply_settings": "5ef2a8b4abd91ffa462afeba9aaff358b280dbcdc2f9486505dfdefa159cc630",
"TR_test_protection_levels.py::test_change_pin_t2": "eb1e880c4ef5318605679e049636ec2999acd0f0bc6c8312ba9546e40c174ffd",
"TR_test_protection_levels.py::test_get_address": "5cec735f5e5577477fcf06968c197d9e3df43d2d2071bd6fc73822d28245f4dd",
"TR_test_protection_levels.py::test_get_entropy": "cdc3b72ac640e0e9307ef5c21a7c2df7f0e5906b6ff714e4e639c6c44802b0b7",
"TR_test_protection_levels.py::test_get_public_key": "5cec735f5e5577477fcf06968c197d9e3df43d2d2071bd6fc73822d28245f4dd",
"TR_test_protection_levels.py::test_initialize": "d22db62a01a9522abe132e6e4c1b69d62b7e74e7d558ad103776a36b71b02b6a",
"TR_test_protection_levels.py::test_passphrase_cached": "5f2c9d15b92ca01e8c682408ddb8ec025aaeb54346a8c13d3bb9fafb682ec5df",
"TR_test_protection_levels.py::test_passphrase_reporting[False]": "1fe0732e63ada33b976b58b2a373f5dfff1bd93f339465682cbf34c3ac478216",
"TR_test_protection_levels.py::test_passphrase_reporting[True]": "7dae65c1512ed8de974a84eca83ba46dd158cda0177e149a4d49cf71e9e4c8d7",
"TR_test_protection_levels.py::test_passphrase_reporting[False]": "c5a8172367cd2a97f9b446512c4349bc2e2e275eadc055114c3c9c2c0cc74055",
"TR_test_protection_levels.py::test_passphrase_reporting[True]": "ddf4eaf9c9d1d341cd484658135750b684ed31a7d77a5f4e6972fa8553bd0a29",
"TR_test_protection_levels.py::test_ping": "4ffbed72e7ed7fbab85f830952200adf7758af81b658b56de4672344120456a6",
"TR_test_protection_levels.py::test_sign_message": "78045e2ab852caab13315ec3be11b0c22d8d82f479a57a6bcb559ebe9eb59efd",
"TR_test_protection_levels.py::test_signtx": "f5debfe54ee83b30255558c63a3b6ffda7685c9b635ee6d417227530e99c78bb",
"TR_test_protection_levels.py::test_unlocked": "80c0b5839cea918213e6fa3c3b5992d178b29c225baf86c32e5ce9172ab5accf",
"TR_test_protection_levels.py::test_verify_message_t2": "a609a2165006f27f6685d7ecb866283718e3dcf57952dd3df77d8aa68d4e3186",
"TR_test_protection_levels.py::test_wipe_device": "e339a136733d34f201304d2d414af53a279976193d8cd23b7813297864f07b3b",
"TR_test_protection_levels.py::test_sign_message": "3bfb26e19709830584f27aa1b1f114e7bf41cf15ca57a4ec9bfa618fcba80ad0",
"TR_test_protection_levels.py::test_signtx": "e8f34f91bacd50ffc4c446e5e381c06c18b2a376c2ca9a99c77dc637e806a90e",
"TR_test_protection_levels.py::test_unlocked": "e76b12522fd28fc08af0135271615d63a13a0ba9f013ebd1afe20ef72abe0803",
"TR_test_protection_levels.py::test_verify_message_t2": "5f04a88b0acc2daa3e87c02074a64969aeb34157006adbf15a3655e94f838bdf",
"TR_test_protection_levels.py::test_wipe_device": "bc06c63c7f5b9e7f0ada0d3d342125905b4fc463fb0eb2ba363b300909dedb9c",
"TR_test_session.py::test_cannot_resume_ended_session": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095",
"TR_test_session.py::test_clear_session": "4545535c96d81601476889cb649b84c4efc9888053b5bc22902381b2ddbdb0e5",
"TR_test_session.py::test_clear_session": "c4ec976d3a6d21237c46f4bae10a16d792cda271feae0530cbe570b91fd81a49",
"TR_test_session.py::test_derive_cardano_empty_session": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095",
"TR_test_session.py::test_derive_cardano_running_session": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095",
"TR_test_session.py::test_end_session": "8c801bd0142e5c1ad4aad50b34c7debb1b8f17a2e0a87eb7f95531b9fd15e095",