feat(core/ui): sending button requests from rust

[no changelog]
pull/3873/head
Martin Milata 2 months ago
parent fe829a5d59
commit 3efa0f6bbd

@ -93,6 +93,7 @@ static void _librust_qstrs(void) {
MP_QSTR_bounds;
MP_QSTR_button;
MP_QSTR_button_event;
MP_QSTR_button_request;
MP_QSTR_buttons__abort;
MP_QSTR_buttons__access;
MP_QSTR_buttons__again;

@ -0,0 +1,58 @@
use crate::strutil::TString;
use num_traits::FromPrimitive;
// ButtonRequestType from messages-common.proto
// Eventually this should be generated
#[derive(Clone, Copy, FromPrimitive)]
#[repr(u16)]
pub enum ButtonRequestCode {
Other = 1,
FeeOverThreshold = 2,
ConfirmOutput = 3,
ResetDevice = 4,
ConfirmWord = 5,
WipeDevice = 6,
ProtectCall = 7,
SignTx = 8,
FirmwareCheck = 9,
Address = 10,
PublicKey = 11,
MnemonicWordCount = 12,
MnemonicInput = 13,
UnknownDerivationPath = 15,
RecoveryHomepage = 16,
Success = 17,
Warning = 18,
PassphraseEntry = 19,
PinEntry = 20,
}
impl ButtonRequestCode {
pub fn num(&self) -> u16 {
*self as u16
}
pub fn with_type(self, br_type: &'static str) -> ButtonRequest {
ButtonRequest::new(self, br_type.into())
}
pub fn from(i: u16) -> Self {
unwrap!(Self::from_u16(i))
}
}
#[derive(Clone)]
pub struct ButtonRequest {
pub code: ButtonRequestCode,
pub br_type: TString<'static>,
}
impl ButtonRequest {
pub fn new(code: ButtonRequestCode, br_type: TString<'static>) -> Self {
ButtonRequest { code, br_type }
}
pub fn from_num(code: u16, br_type: TString<'static>) -> Self {
ButtonRequest::new(ButtonRequestCode::from(code), br_type)
}
}

@ -6,6 +6,7 @@ use crate::{
strutil::TString,
time::Duration,
ui::{
button_request::{ButtonRequest, ButtonRequestCode},
component::{maybe::PaintOverlapping, MsgMap},
display::{self, Color},
geometry::{Offset, Rect},
@ -486,6 +487,7 @@ pub struct EventCtx {
paint_requested: bool,
anim_frame_scheduled: bool,
page_count: Option<usize>,
button_request: Option<ButtonRequest>,
root_repaint_requested: bool,
}
@ -512,6 +514,7 @@ impl EventCtx {
* `Child::marked_for_paint` being true. */
anim_frame_scheduled: false,
page_count: None,
button_request: None,
root_repaint_requested: false,
}
}
@ -569,6 +572,16 @@ impl EventCtx {
self.page_count
}
pub fn send_button_request(&mut self, code: ButtonRequestCode, br_type: TString<'static>) {
#[cfg(feature = "ui_debug")]
assert!(self.button_request.is_none());
self.button_request = Some(ButtonRequest::new(code, br_type));
}
pub fn button_request(&mut self) -> Option<ButtonRequest> {
self.button_request.take()
}
pub fn pop_timer(&mut self) -> Option<(TimerToken, Duration)> {
self.timers.pop()
}
@ -578,6 +591,9 @@ impl EventCtx {
self.paint_requested = false;
self.anim_frame_scheduled = false;
self.page_count = None;
#[cfg(feature = "ui_debug")]
assert!(self.button_request.is_none());
self.button_request = None;
self.root_repaint_requested = false;
}

@ -0,0 +1,65 @@
use crate::ui::{
button_request::ButtonRequest,
component::{Component, Event, EventCtx},
geometry::Rect,
};
/// Component that sends a ButtonRequest after receiving Event::Attach. The
/// request is only sent once.
#[derive(Clone)]
pub struct OneButtonRequest<T> {
button_request: Option<ButtonRequest>,
pub inner: T,
}
impl<T> OneButtonRequest<T> {
pub fn new(button_request: ButtonRequest, inner: T) -> Self {
Self {
button_request: Some(button_request),
inner,
}
}
}
impl<T: Component> Component for OneButtonRequest<T> {
type Msg = T::Msg;
fn place(&mut self, bounds: Rect) -> Rect {
self.inner.place(bounds)
}
fn event(&mut self, ctx: &mut EventCtx, event: Event) -> Option<Self::Msg> {
if matches!(event, Event::Attach) {
if let Some(button_request) = self.button_request.take() {
ctx.send_button_request(button_request.code, button_request.br_type)
}
}
self.inner.event(ctx, event)
}
fn paint(&mut self) {
self.inner.paint()
}
fn render<'s>(&self, target: &mut impl crate::ui::shape::Renderer<'s>) {
self.inner.render(target)
}
}
#[cfg(feature = "ui_debug")]
impl<T: crate::trace::Trace> crate::trace::Trace for OneButtonRequest<T> {
fn trace(&self, t: &mut dyn crate::trace::Tracer) {
self.inner.trace(t)
}
}
pub trait ButtonRequestExt {
fn one_button_request(self, br: ButtonRequest) -> OneButtonRequest<Self>
where
Self: Sized,
{
OneButtonRequest::new(br, self)
}
}
impl<T: Component> ButtonRequestExt for T {}

@ -3,6 +3,7 @@
pub mod bar;
pub mod base;
pub mod border;
pub mod button_request;
pub mod connect;
pub mod empty;
pub mod image;
@ -22,6 +23,7 @@ pub mod timeout;
pub use bar::Bar;
pub use base::{Child, Component, ComponentExt, Event, EventCtx, Never, Root, TimerToken};
pub use border::Border;
pub use button_request::{ButtonRequestExt, OneButtonRequest};
pub use empty::Empty;
#[cfg(all(feature = "jpeg", feature = "micropython"))]
pub use jpeg::Jpeg;

@ -17,6 +17,7 @@ use crate::{
},
time::Duration,
ui::{
button_request::ButtonRequest,
component::{Component, Event, EventCtx, Never, Root, TimerToken},
constant,
display::sync,
@ -248,6 +249,17 @@ impl LayoutObj {
self.inner.borrow().page_count.into()
}
fn obj_button_request(&self) -> Result<Obj, Error> {
let inner = &mut *self.inner.borrow_mut();
match inner.event_ctx.button_request() {
None => Ok(Obj::const_none()),
Some(ButtonRequest { code, br_type }) => {
(code.num().into(), br_type.try_into()?).try_into()
}
}
}
#[cfg(feature = "ui_debug")]
fn obj_bounds(&self) {
use crate::ui::display;
@ -280,6 +292,7 @@ impl LayoutObj {
Qstr::MP_QSTR_trace => obj_fn_2!(ui_layout_trace).as_obj(),
Qstr::MP_QSTR_bounds => obj_fn_1!(ui_layout_bounds).as_obj(),
Qstr::MP_QSTR_page_count => obj_fn_1!(ui_layout_page_count).as_obj(),
Qstr::MP_QSTR_button_request => obj_fn_1!(ui_layout_button_request).as_obj(),
}),
};
&TYPE
@ -470,6 +483,14 @@ extern "C" fn ui_layout_page_count(this: Obj) -> Obj {
unsafe { util::try_or_raise(block) }
}
extern "C" fn ui_layout_button_request(this: Obj) -> Obj {
let block = || {
let this: Gc<LayoutObj> = this.try_into()?;
this.obj_button_request()
};
unsafe { util::try_or_raise(block) }
}
#[cfg(feature = "ui_debug")]
#[no_mangle]
pub extern "C" fn ui_debug_layout_type() -> &'static Type {

@ -2,6 +2,7 @@
pub mod macros;
pub mod animation;
pub mod button_request;
pub mod component;
pub mod constant;
pub mod display;

@ -1688,6 +1688,9 @@ pub static mp_module_trezorui2: Module = obj_module! {
/// def page_count(self) -> int:
/// """Return the number of pages in the layout object."""
///
/// def button_request(self) -> tuple[int, str] | None:
/// """Return (code, type) of button request made during the last event or timer pass."""
///
/// class UiResult:
/// """Result of a UI operation."""
/// pass

@ -505,6 +505,8 @@ class LayoutObj(Generic[T]):
"""Paint bounds of individual components on screen."""
def page_count(self) -> int:
"""Return the number of pages in the layout object."""
def button_request(self) -> tuple[int, str] | None:
"""Return (code, type) of button request made during the last event or timer pass."""
# rust/src/ui/model_tt/layout.rs

@ -39,4 +39,4 @@ async def interact(
# We know for certain how many pages the layout will have
pages = layout.page_count() # type: ignore [Cannot access attribute "page_count" for class "LayoutType"]
await button_request(br_type, br_code, pages)
return await context.wait(layout)
return await layout

@ -1,10 +1,10 @@
from typing import TYPE_CHECKING
import trezorui2
from trezor import TR, io, loop, ui, utils
from trezor import TR, io, log, loop, ui, utils
from trezor.enums import ButtonRequestType
from trezor.wire import ActionCancelled
from trezor.wire.context import wait as ctx_wait
from trezor.messages import ButtonAck, ButtonRequest
from trezor.wire import ActionCancelled, context
from ..common import button_request, interact
@ -38,9 +38,11 @@ if __debug__:
class RustLayout(LayoutParentType[T]):
# pylint: disable=super-init-not-called
def __init__(self, layout: trezorui2.LayoutObj[T]):
self.br_chan = loop.chan()
self.layout = layout
self.timer = loop.Timer()
self.layout.attach_timer_fn(self.set_timer)
self._send_button_request()
def set_timer(self, token: int, deadline: int) -> None:
self.timer.schedule(deadline, token)
@ -62,13 +64,23 @@ class RustLayout(LayoutParentType[T]):
from trezor.enums import DebugPhysicalButton
def create_tasks(self) -> tuple[loop.AwaitableTask, ...]:
return (
self.handle_input_and_rendering(),
self.handle_timers(),
self.handle_swipe_signal(),
self.handle_button_signal(),
self.handle_result_signal(),
)
if context.CURRENT_CONTEXT:
return (
self.handle_input_and_rendering(),
self.handle_timers(),
self.handle_swipe_signal(),
self.handle_button_signal(),
self.handle_result_signal(),
self.handle_usb(context.get_context()),
)
else:
return (
self.handle_input_and_rendering(),
self.handle_timers(),
self.handle_swipe_signal(),
self.handle_button_signal(),
self.handle_result_signal(),
)
async def handle_result_signal(self) -> None:
"""Enables sending arbitrary input - ui.Result.
@ -98,30 +110,41 @@ class RustLayout(LayoutParentType[T]):
async def _press_left(self, hold_ms: int | None) -> Any:
"""Triggers left button press."""
self.layout.button_event(io.BUTTON_PRESSED, io.BUTTON_LEFT)
self._send_button_request()
self._paint()
if hold_ms is not None:
await loop.sleep(hold_ms)
return self.layout.button_event(io.BUTTON_RELEASED, io.BUTTON_LEFT)
r = self.layout.button_event(io.BUTTON_RELEASED, io.BUTTON_LEFT)
self._send_button_request()
return r
async def _press_right(self, hold_ms: int | None) -> Any:
"""Triggers right button press."""
self.layout.button_event(io.BUTTON_PRESSED, io.BUTTON_RIGHT)
self._send_button_request()
self._paint()
if hold_ms is not None:
await loop.sleep(hold_ms)
return self.layout.button_event(io.BUTTON_RELEASED, io.BUTTON_RIGHT)
r = self.layout.button_event(io.BUTTON_RELEASED, io.BUTTON_RIGHT)
self._send_button_request()
return r
async def _press_middle(self, hold_ms: int | None) -> Any:
"""Triggers middle button press."""
self.layout.button_event(io.BUTTON_PRESSED, io.BUTTON_LEFT)
self._send_button_request()
self._paint()
self.layout.button_event(io.BUTTON_PRESSED, io.BUTTON_RIGHT)
self._send_button_request()
self._paint()
if hold_ms is not None:
await loop.sleep(hold_ms)
self.layout.button_event(io.BUTTON_RELEASED, io.BUTTON_LEFT)
self._send_button_request()
self._paint()
return self.layout.button_event(io.BUTTON_RELEASED, io.BUTTON_RIGHT)
r = self.layout.button_event(io.BUTTON_RELEASED, io.BUTTON_RIGHT)
self._send_button_request()
return r
async def _press_button(
self,
@ -197,7 +220,11 @@ class RustLayout(LayoutParentType[T]):
else:
def create_tasks(self) -> tuple[loop.AwaitableTask, ...]:
return self.handle_timers(), self.handle_input_and_rendering()
return (
self.handle_timers(),
self.handle_input_and_rendering(),
self.handle_usb(context.get_context()),
)
def _first_paint(self) -> None:
self._paint()
@ -233,6 +260,7 @@ class RustLayout(LayoutParentType[T]):
msg = None
if event in (io.BUTTON_PRESSED, io.BUTTON_RELEASED):
msg = self.layout.button_event(event, button_num)
self._send_button_request()
if msg is not None:
raise ui.Result(msg)
self._paint()
@ -242,6 +270,7 @@ class RustLayout(LayoutParentType[T]):
# Using `yield` instead of `await` to avoid allocations.
token = yield self.timer
msg = self.layout.timer(token)
self._send_button_request()
if msg is not None:
raise ui.Result(msg)
self._paint()
@ -250,6 +279,20 @@ class RustLayout(LayoutParentType[T]):
"""How many paginated pages current screen has."""
return self.layout.page_count()
async def handle_usb(self, ctx: context.Context):
while True:
br_code, br_type, page_count = await loop.race(
ctx.read(()), self.br_chan.take()
)
log.debug(__name__, "ButtonRequest.type=%s", br_type)
await ctx.call(ButtonRequest(code=br_code, pages=page_count), ButtonAck)
def _send_button_request(self):
res = self.layout.button_request()
if res is not None:
br_code, br_type = res
self.br_chan.publish((br_code, br_type, self.layout.page_count()))
def draw_simple(layout: trezorui2.LayoutObj[Any]) -> None:
# Simple drawing not supported for layouts that set timers.
@ -505,7 +548,7 @@ async def show_address(
pages=layout.page_count(),
)
layout.request_complete_repaint()
result = await ctx_wait(layout)
result = await layout
# User confirmed with middle button.
if result is CONFIRMED:
@ -524,27 +567,23 @@ async def show_address(
)
return result
result = await ctx_wait(
RustLayout(
trezorui2.show_address_details(
qr_title="", # unused on this model
address=address if address_qr is None else address_qr,
case_sensitive=case_sensitive,
details_title="", # unused on this model
account=account,
path=path,
xpubs=[(xpub_title(i), xpub) for i, xpub in enumerate(xpubs)],
)
),
result = await RustLayout(
trezorui2.show_address_details(
qr_title="", # unused on this model
address=address if address_qr is None else address_qr,
case_sensitive=case_sensitive,
details_title="", # unused on this model
account=account,
path=path,
xpubs=[(xpub_title(i), xpub) for i, xpub in enumerate(xpubs)],
)
)
# Can only go back from the address details.
assert result is CANCELLED
# User pressed left cancel button, show mismatch dialogue.
else:
result = await ctx_wait(
RustLayout(trezorui2.show_mismatch(title=mismatch_title))
)
result = await RustLayout(trezorui2.show_mismatch(title=mismatch_title))
assert result in (CONFIRMED, CANCELLED)
# Right button aborts action, left goes back to showing address.
if result is CONFIRMED:
@ -1019,24 +1058,22 @@ async def confirm_value(
should_show_more_layout.page_count(),
)
result = await ctx_wait(should_show_more_layout)
result = await should_show_more_layout
if result is CONFIRMED:
return
elif result is INFO:
info_title, info_value = info_items_list[0]
await ctx_wait(
RustLayout(
trezorui2.confirm_blob(
title=info_title,
data=info_value,
description=description,
extra=None,
verb="",
verb_cancel="<",
hold=False,
chunkify=chunkify_info,
)
await RustLayout(
trezorui2.confirm_blob(
title=info_title,
data=info_value,
description=description,
extra=None,
verb="",
verb_cancel="<",
hold=False,
chunkify=chunkify_info,
)
)
else:
@ -1276,7 +1313,7 @@ async def confirm_modify_output(
address_layout.page_count(),
)
address_layout.request_complete_repaint()
await raise_if_not_confirmed(ctx_wait(address_layout))
await raise_if_not_confirmed(address_layout)
if send_button_request:
send_button_request = False
@ -1286,7 +1323,7 @@ async def confirm_modify_output(
modify_layout.page_count(),
)
modify_layout.request_complete_repaint()
result = await ctx_wait(modify_layout)
result = await modify_layout
if result is CONFIRMED:
break

@ -1,10 +1,10 @@
from typing import TYPE_CHECKING
import trezorui2
from trezor import TR, io, loop, ui, utils
from trezor import TR, io, log, loop, ui, utils
from trezor.enums import ButtonRequestType
from trezor.wire import ActionCancelled
from trezor.wire.context import wait as ctx_wait
from trezor.messages import ButtonAck, ButtonRequest
from trezor.wire import ActionCancelled, context
from ..common import button_request, interact
@ -40,9 +40,11 @@ class RustLayout(LayoutParentType[T]):
# pylint: disable=super-init-not-called
def __init__(self, layout: trezorui2.LayoutObj[T]):
self.br_chan = loop.chan()
self.layout = layout
self.timer = loop.Timer()
self.layout.attach_timer_fn(self.set_timer)
self._send_button_request()
def set_timer(self, token: int, deadline: int) -> None:
self.timer.schedule(deadline, token)
@ -63,13 +65,23 @@ class RustLayout(LayoutParentType[T]):
if __debug__:
def create_tasks(self) -> tuple[loop.AwaitableTask, ...]:
return (
self.handle_timers(),
self.handle_input_and_rendering(),
self.handle_swipe(),
self.handle_click_signal(),
self.handle_result_signal(),
)
if context.CURRENT_CONTEXT:
return (
self.handle_timers(),
self.handle_input_and_rendering(),
self.handle_swipe(),
self.handle_click_signal(),
self.handle_result_signal(),
self.handle_usb(context.get_context()),
)
else:
return (
self.handle_timers(),
self.handle_input_and_rendering(),
self.handle_swipe(),
self.handle_click_signal(),
self.handle_result_signal(),
)
async def handle_result_signal(self) -> None:
"""Enables sending arbitrary input - ui.Result.
@ -116,6 +128,7 @@ class RustLayout(LayoutParentType[T]):
(io.TOUCH_END, orig_x + 2 * off_x, orig_y + 2 * off_y),
):
msg = self.layout.touch_event(event, x, y)
self._send_button_request()
self._paint()
if msg is not None:
raise ui.Result(msg)
@ -135,10 +148,12 @@ class RustLayout(LayoutParentType[T]):
from apps.debug import notify_layout_change
self.layout.touch_event(io.TOUCH_START, x, y)
self._send_button_request()
self._paint()
if hold_ms is not None:
await loop.sleep(hold_ms)
msg = self.layout.touch_event(io.TOUCH_END, x, y)
self._send_button_request()
if msg is not None:
debug_storage.new_layout_event_id = event_id
@ -165,7 +180,17 @@ class RustLayout(LayoutParentType[T]):
else:
def create_tasks(self) -> tuple[loop.AwaitableTask, ...]:
return self.handle_timers(), self.handle_input_and_rendering()
if context.CURRENT_CONTEXT:
return (
self.handle_timers(),
self.handle_input_and_rendering(),
self.handle_usb(context.get_context()),
)
else:
return (
self.handle_timers(),
self.handle_input_and_rendering(),
)
def _first_paint(self) -> None:
ui.backlight_fade(ui.style.BACKLIGHT_NONE)
@ -205,6 +230,7 @@ class RustLayout(LayoutParentType[T]):
msg = None
if event in (io.TOUCH_START, io.TOUCH_MOVE, io.TOUCH_END):
msg = self.layout.touch_event(event, x, y)
self._send_button_request()
if msg is not None:
raise ui.Result(msg)
self._paint()
@ -214,6 +240,7 @@ class RustLayout(LayoutParentType[T]):
# Using `yield` instead of `await` to avoid allocations.
token = yield self.timer
msg = self.layout.timer(token)
self._send_button_request()
if msg is not None:
raise ui.Result(msg)
self._paint()
@ -221,6 +248,20 @@ class RustLayout(LayoutParentType[T]):
def page_count(self) -> int:
return self.layout.page_count()
async def handle_usb(self, ctx: context.Context):
while True:
br_code, br_type, page_count = await loop.race(
ctx.read(()), self.br_chan.take()
)
log.debug(__name__, "ButtonRequest.type=%s", br_type)
await ctx.call(ButtonRequest(code=br_code, pages=page_count), ButtonAck)
def _send_button_request(self):
res = self.layout.button_request()
if res is not None:
br_code, br_type = res
self.br_chan.publish((br_code, br_type, self.layout.page_count()))
def draw_simple(layout: trezorui2.LayoutObj[Any]) -> None:
# Simple drawing not supported for layouts that set timers.
@ -452,7 +493,7 @@ async def show_address(
pages=layout.page_count(),
)
layout.request_complete_repaint()
result = await ctx_wait(layout)
result = await layout
# User pressed right button.
if result is CONFIRMED:
@ -470,25 +511,21 @@ async def show_address(
)
return result
result = await ctx_wait(
RustLayout(
trezorui2.show_address_details(
qr_title=title,
address=address if address_qr is None else address_qr,
case_sensitive=case_sensitive,
details_title=details_title,
account=account,
path=path,
xpubs=[(xpub_title(i), xpub) for i, xpub in enumerate(xpubs)],
)
result = await RustLayout(
trezorui2.show_address_details(
qr_title=title,
address=address if address_qr is None else address_qr,
case_sensitive=case_sensitive,
details_title=details_title,
account=account,
path=path,
xpubs=[(xpub_title(i), xpub) for i, xpub in enumerate(xpubs)],
)
)
assert result is CANCELLED
else:
result = await ctx_wait(
RustLayout(trezorui2.show_mismatch(title=mismatch_title))
)
result = await RustLayout(trezorui2.show_mismatch(title=mismatch_title))
assert result in (CONFIRMED, CANCELLED)
# Right button aborts action, left goes back to showing address.
if result is CONFIRMED:
@ -1187,7 +1224,7 @@ async def confirm_modify_output(
address_layout.page_count(),
)
address_layout.request_complete_repaint()
await raise_if_not_confirmed(ctx_wait(address_layout))
await raise_if_not_confirmed(address_layout)
if send_button_request:
send_button_request = False
@ -1197,7 +1234,7 @@ async def confirm_modify_output(
modify_layout.page_count(),
)
modify_layout.request_complete_repaint()
result = await ctx_wait(modify_layout)
result = await modify_layout
if result is CONFIRMED:
break
@ -1212,11 +1249,11 @@ async def with_info(
await button_request(br_type, br_code, pages=main_layout.page_count())
while True:
result = await ctx_wait(main_layout)
result = await main_layout
if result is INFO:
info_layout.request_complete_repaint()
result = await ctx_wait(info_layout)
result = await info_layout
assert result is CANCELLED
main_layout.request_complete_repaint()
continue
@ -1344,8 +1381,8 @@ async def confirm_signverify(
address_layout, info_layout, br_type, br_code=BR_TYPE_OTHER
)
if result is not CONFIRMED:
result = await ctx_wait(
RustLayout(trezorui2.show_mismatch(title=TR.addr_mismatch__mismatch))
result = await RustLayout(
trezorui2.show_mismatch(title=TR.addr_mismatch__mismatch)
)
assert result in (CONFIRMED, CANCELLED)
# Right button aborts action, left goes back to showing address.

@ -3,7 +3,6 @@ from typing import Callable, Iterable
import trezorui2
from trezor import TR
from trezor.enums import ButtonRequestType
from trezor.wire.context import wait as ctx_wait
from ..common import interact
from . import RustLayout, raise_if_not_confirmed
@ -17,7 +16,7 @@ async def _is_confirmed_info(
info_func: Callable,
) -> bool:
while True:
result = await ctx_wait(dialog)
result = await dialog
if result is trezorui2.INFO:
await info_func()
@ -50,7 +49,7 @@ async def request_word(
)
)
word: str = await ctx_wait(keyboard)
word: str = await keyboard
return word
@ -143,7 +142,7 @@ async def continue_recovery(
if info_func is not None:
return await _is_confirmed_info(homepage, info_func)
else:
result = await ctx_wait(homepage)
result = await homepage
return result is CONFIRMED

@ -4,7 +4,6 @@ import trezorui2
from trezor import TR
from trezor.enums import ButtonRequestType
from trezor.wire import ActionCancelled
from trezor.wire.context import wait as ctx_wait
from ..common import interact
from . import RustLayout, raise_if_not_confirmed
@ -89,15 +88,13 @@ async def select_word(
while len(words) < 3:
words.append(words[-1])
result = await ctx_wait(
RustLayout(
trezorui2.select_word(
title=title,
description=TR.reset__select_word_x_of_y_template.format(
checked_index + 1, count
),
words=(words[0], words[1], words[2]),
)
result = await RustLayout(
trezorui2.select_word(
title=title,
description=TR.reset__select_word_x_of_y_template.format(
checked_index + 1, count
),
words=(words[0], words[1], words[2]),
)
)
if __debug__ and isinstance(result, str):
@ -173,13 +170,11 @@ async def _prompt_number(
assert isinstance(value, int)
return value
await ctx_wait(
RustLayout(
trezorui2.show_simple(
title=None,
description=info(value),
button=TR.buttons__ok_i_understand,
)
await RustLayout(
trezorui2.show_simple(
title=None,
description=info(value),
button=TR.buttons__ok_i_understand,
)
)
num_input.request_complete_repaint()

@ -157,6 +157,17 @@ class Context:
memoryview(buffer)[:msg_size],
)
async def call(
self,
msg: protobuf.MessageType,
expected_type: type[LoadedMessageType],
) -> LoadedMessageType:
assert expected_type.MESSAGE_WIRE_TYPE is not None
await self.write(msg)
del msg
return await self.read((expected_type.MESSAGE_WIRE_TYPE,), expected_type)
CURRENT_CONTEXT: Context | None = None
@ -186,11 +197,7 @@ async def call(
if CURRENT_CONTEXT is None:
raise RuntimeError("No wire context")
assert expected_type.MESSAGE_WIRE_TYPE is not None
await CURRENT_CONTEXT.write(msg)
del msg
return await CURRENT_CONTEXT.read((expected_type.MESSAGE_WIRE_TYPE,), expected_type)
return await CURRENT_CONTEXT.call(msg, expected_type)
async def call_any(

@ -41,6 +41,17 @@ class MockContext:
async def read(self, _resp_types, _resp_type):
return EthereumTypedDataValueAck(value=self.next_response)
async def call(
self,
msg: protobuf.MessageType,
expected_type: type[LoadedMessageType],
) -> LoadedMessageType:
assert expected_type.MESSAGE_WIRE_TYPE is not None
await self.write(msg)
del msg
return await self.read((expected_type.MESSAGE_WIRE_TYPE,), expected_type)
# Helper functions from trezorctl to build expected type data structures
# TODO: it could be better to group these functions into a class, to visibly differentiate it

@ -9183,9 +9183,9 @@
"T2T1_cs_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "8e8b2479b6006c1b829346d4e8625a782a6f7ac6346e24e52f82dcb946c0fe43",
"T2T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "2f89aad6748f21cffc13fc6054174ae1a58b02acb1867942229f48b8b88ae84d",
"T2T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "93f34d7ae28e05b2804057e2b5844e2ac80b992b0141befdecb9f6bd533e1d90",
"T2T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "f04dd2dcaf04b8bab5221a32bf4026a96b352f88d4d09fb0c5fa5af4e908eb27",
"T2T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "1283119ffe9877dc24cf54c2d17c86c1bea3bbe3bd88fab61a78351ece37574b",
"T2T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "6966b39783763d03f78da209a871f37e7abf81e25bbeaa61ef3aa23b55336e14",
"T2T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "a6590a72349b73e7870cc029b2a20e1c9750f2270520e8e2e33ac87d460cc55b",
"T2T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "816dc97287a08a952baa0a5a6051a13c2bda981e08184c2502a9582c4c847ac2",
"T2T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "74d94117100e2a85c7341466cf671343f4257df72c1aa78539e6fc19d5d55727",
"T2T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "3c881c6e70b7656ec061d86d7aa454e12d6428b7c8bb1b40d3e596016284bb44",
"T2T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "4eea02a651a4da7b45e25da9850e1b65beaada45ee6d3d655490521dafa897f7",
@ -9195,16 +9195,16 @@
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "06f4b7012e441435326d930378208705e53278de984b829f65710ee01414325b",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_abort": "2f89aad6748f21cffc13fc6054174ae1a58b02acb1867942229f48b8b88ae84d",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "e80c2d4b8c5ebeb70a1b550686000f381c115b3f1a91282572cc28df6ace5ea6",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "fb99ffda1ecdecf2e75f61c13d1deecc9e0612a04d33fcfb5c0c61e244cd6bf0",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "d0ac4405cb7c9c192af8654a8cb11a450d05dea809dd794963cbc21c5b29ab74",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "be084493431aab50cf76dd2c34d4af188d4f40d18b950ae1adf1ac811bde7de7",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "fd689f2c88a44f83de5a9443d97d73d28f14817cb4e030121998ceb6ed2e8a05",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "e3f558c1852b5031204544186946b1fc9dc6942eb0440f515d1b2cbb9ff734ae",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "330b30519e08bbb16abde05166478b0e3c6ced442fb2706b3286b267e5cd6448",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fb-ad8c45c0": "87d21a96f2a50abad9a75cbce923d50e9513ff7173fbe50f679ac1aae9e10406",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-644c905b0c4da21692f06fff3-30d0f8ca": "e4ac680898a749c2749f828a7b3e1611b1413778c2a1d6c6c9317180e655051f",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares2-b770e0da1363247652de97a39-6af744e3": "01d97c9e5a671eeb8b56c7ac8b25ec82e2dac5904fdf052e797ae6c054453372",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "bc8a7d98375d46bd676b8b39ef36ae20a12dfa712420bd971fad3f8cb21f1095",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "ce0bebb96e5ce058cd142b95d9f97994bce2678a339ec5b4bf4576f20005a752",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "ddf1bcc7cee67e2bc38dda78543c9d04d6c6429a6540423042117cfe6e707fab",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "0b8ba4a3d38e2ae12f87f06a21bfeec30fa892fb628b869206d2875f0aa8ce8d",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "6ea13220d030b0b2531ceddfe1af6bf8b8d6a13d103c449944d9a119217270f0",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "4d5a7fc576810fd8a1fb7504dd83d9cce623432dc897e3f871a960d35bc48fe6",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "2db3e3119116de9b001a288f040d92e4b90ae4c6178ec94f7b44d23f247e2a73",
"T2T1_cs_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "fce31a993c026c2ab3a2b381c712b6069cda27bd66b084c35005bdca81afb048",
"T2T1_cs_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "29956f95d176dba8da7eebf385ef404749d99c8a92e030e29a197846880da228",
@ -9384,11 +9384,11 @@
"T2T1_cs_test_basic.py::test_ping": "1b0c0ad21a8089c6441d577f0d15ccea46d9b2d7f77b8eb50c3d952dc0d7114d",
"T2T1_cs_test_busy_state.py::test_busy_expiry": "5807370e36255f64722c9b70002daad3b718387eaa41102561ec6a0dcbeed20a",
"T2T1_cs_test_busy_state.py::test_busy_state": "491481abc34b5ebe614e45edb1a5831cffb87b9acd28b5bb596d8e61c0b29147",
"T2T1_cs_test_cancel.py::test_cancel_message_via_cancel[message0]": "b51e0d1d0e72a525724163cceef0426977dd3bb36bc0df5a0d96979cd0ebd011",
"T2T1_cs_test_cancel.py::test_cancel_message_via_cancel[message1]": "b51e0d1d0e72a525724163cceef0426977dd3bb36bc0df5a0d96979cd0ebd011",
"T2T1_cs_test_cancel.py::test_cancel_message_via_initialize[message0]": "b51e0d1d0e72a525724163cceef0426977dd3bb36bc0df5a0d96979cd0ebd011",
"T2T1_cs_test_cancel.py::test_cancel_message_via_initialize[message1]": "b51e0d1d0e72a525724163cceef0426977dd3bb36bc0df5a0d96979cd0ebd011",
"T2T1_cs_test_cancel.py::test_cancel_on_paginated": "59a00b375bf2e60cc0e624626aaf4b651cc24200be29e41e912fbc9358f7168e",
"T2T1_cs_test_cancel.py::test_cancel_message_via_cancel[message0]": "fea263b87f3b5ccbbc7ac43de02f28a3927cc13116505a76b71047427d3b80d3",
"T2T1_cs_test_cancel.py::test_cancel_message_via_cancel[message1]": "2e607dedaaff54ba045743b6cf77f83eb81608d7e5ab22c3aaadbc13bfba9cb1",
"T2T1_cs_test_cancel.py::test_cancel_message_via_initialize[message0]": "fea263b87f3b5ccbbc7ac43de02f28a3927cc13116505a76b71047427d3b80d3",
"T2T1_cs_test_cancel.py::test_cancel_message_via_initialize[message1]": "2e607dedaaff54ba045743b6cf77f83eb81608d7e5ab22c3aaadbc13bfba9cb1",
"T2T1_cs_test_cancel.py::test_cancel_on_paginated": "19cd5133ca91858fe667cdb4cd38de92ab01eba5a232eff23ba6591f59e7f26d",
"T2T1_cs_test_debuglink.py::test_softlock_instability": "5ace49e9f6465d2a6fe19c0ccccfa5604f103b7ceb02a20a917647f09c374802",
"T2T1_cs_test_firmware_hash.py::test_firmware_hash_emu": "bf3b0b0bfc905aa8b9cb991baffb7c523f4f185f0a6531081c2e09fee5964108",
"T2T1_cs_test_firmware_hash.py::test_firmware_hash_hw": "1b0c0ad21a8089c6441d577f0d15ccea46d9b2d7f77b8eb50c3d952dc0d7114d",
@ -9440,7 +9440,7 @@
"T2T1_cs_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "be92f86f750cb31cf1f105413e2ad00053cbb8080b3c52c43b0682c8e2beae9c",
"T2T1_cs_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "3e893170b1e80dc53617b5707b94f9a486f9fbf6f7d42fe05dd7d6c1d0c3d497",
"T2T1_cs_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "e474c3b7ee87123456263add1b6a793a0478e4a5eb3887e8d8794f7890b0d4f8",
"T2T1_cs_test_msg_changepin_t2.py::test_change_failed": "3ae8aaa54debbeda6d7e2a9d4d178003b0f5c49e95478728b6c9965324eb7889",
"T2T1_cs_test_msg_changepin_t2.py::test_change_failed": "eda917e9a4b55412c89628aa1414cc5cc1c7aefccf4cd452447f9ae188d49162",
"T2T1_cs_test_msg_changepin_t2.py::test_change_invalid_current": "08ac3c286ca2a906945aa3a64f65cdaccfc9fee97c52a696be5fddb6fa350d54",
"T2T1_cs_test_msg_changepin_t2.py::test_change_pin": "1016d5ded51408eed07b9d048f8f51eceec1df950c215615670d8799a9020e83",
"T2T1_cs_test_msg_changepin_t2.py::test_remove_pin": "6b81f8e410e9eb6f12e00b96085ce069b998645b5c92100da6aad4230b9fa306",
@ -10650,9 +10650,9 @@
"T2T1_de_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "532d10d1d33670a6355c5a66eaa91cc48d88f1cac8dc9be6b156a8ea5e28677a",
"T2T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "a6031e2fc7555aa12fca1573e4d4c1b242fc9e5aee3e6f5ba7a0a0c446248243",
"T2T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "08f68408b7970643c752646103a0c2b87b939fdbf3fefc4baef358547159f473",
"T2T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "4dff74af975048a9d9bb3f157ee35a83548879c913440aaccef8d119063903a3",
"T2T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "f1c91a2ab5a56bfbc85413d61711296ca739a14c129eff64fd8dc0a02c1ae8e0",
"T2T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "e8c0a2c6e23ec2a6fcc2f0572c0e3ac1e6af4bf697789a0cace07a5b0ced6e05",
"T2T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "7308412ff00cdc11e543ed5b447f60fbe26b31514b6e63b973e1ff7020601bec",
"T2T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "fdda959fde60b0e9ffcabfc7bb0c992c4e3c59a207103158e5f6cdab97d9ff3c",
"T2T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "e8ea4f59030b9ed7a43ac1ad2cb7614fa0dc23aefbb84d661be366425d888b08",
"T2T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "9ac53a165c84a7169b1516a31c3a322c259e2e0f5d327e2be93605a01d4dd524",
"T2T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "f3a8b2faac72a00121576d82d9f8d6924318a7c9d06c30c8f4974f88bc373e8d",
@ -10662,16 +10662,16 @@
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "cfb205a8c4b04bcb0cd58feaa772994dfab3c026ef0b4524f363278b47acd913",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_abort": "a6031e2fc7555aa12fca1573e4d4c1b242fc9e5aee3e6f5ba7a0a0c446248243",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "8803ff610d055436af3c65e62f5095d5ac4270ff510963264dcf401c555b79c5",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "2afff9b5465911d33953eef488bcc483bb56f592ebb28f1a8150b1082dddac7b",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "9c321d3c97a8a334790e71c112c90ddb30f003373e7d1c64a00feeecb9f5bc44",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "85e29b77ef87355218645a113a9d1bd8df7a8850f236cefac9eb84f9b75e2ea2",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "f881175d64809ef465fff40bb4039d159b36f9aeb33f4b0dccfe4347fa9dd8ec",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "80602dd55133f67f580ab3dfd73b6401074cdd677d34f37f75781a2a3c037a30",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "46d44f853f15c05ac3fa45af7a5d7e1c063b3d8999d5affd15d0aec723ca7d63",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fb-ad8c45c0": "4a8daae73ff52d016d529efb7e32df4073c5426def3a790806c0438c4ce67c92",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-644c905b0c4da21692f06fff3-30d0f8ca": "9aa47aaaecbfb76f29abec5a89a746af3e54b2bbb8621544492757d3e28b9f0f",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares2-b770e0da1363247652de97a39-6af744e3": "d52a8fcfe810c2b15a83ae9a1a4e82310a38768daa9a4612e693caad09328b23",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "33c17d161982e254eb831ad5659ebb9f8aa2478ffa7d6cd4025dbc0e8773d4fd",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "7f32fe7e694ad2112b1cdbd0f0704660dc1050a6bf67c6f01650d8d002115363",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "3171aae7e67c53d2d82db5bb5b7b5f369c9873b6acf97b83e4aa03b4452f1279",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "ebbaf18cd0de3c80f7a8a3111870a7835fdb84377c5f5814ebf62bb54c254cfd",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "6ed7fbb11d4ef801c17550f7167b85a059a827ba2e9f743dc7be4737ee5ed680",
"T2T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "357db16be36a5a0ed19dd981b084f46d1bd874db05f2622dc5ea06237ae7490a",
"T2T1_de_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "a41c082f40c0cf424064179da18c8a28c25aea8da7aa8d97b49397b33a72fa03",
"T2T1_de_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "24f8115deb03abf6624975d228cde64253d5f6a822f216e1671ed28c45d12221",
"T2T1_de_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "03c67a21b9c0e19b7da02d4cbf7f380a2a411215abd9004d0ce9e3062e2437a3",
@ -10851,11 +10851,11 @@
"T2T1_de_test_basic.py::test_ping": "4ed24353a7aa99e894d4ed3cb45be13f54a94577289f3919be62add4c6c36390",
"T2T1_de_test_busy_state.py::test_busy_expiry": "d00c19e4be337da53afb665aa2c38784a51a91989ba65bb77aaadc8605994395",
"T2T1_de_test_busy_state.py::test_busy_state": "2e3c5140f572097a5abf9134ec2324f1d0fcafb91a73bf754672db1868a004d1",
"T2T1_de_test_cancel.py::test_cancel_message_via_cancel[message0]": "c07eceb7d7f8ecd914ceac903e30121d3a8d2a4a8e1b3597852188b9e393495e",
"T2T1_de_test_cancel.py::test_cancel_message_via_cancel[message1]": "c07eceb7d7f8ecd914ceac903e30121d3a8d2a4a8e1b3597852188b9e393495e",
"T2T1_de_test_cancel.py::test_cancel_message_via_initialize[message0]": "c07eceb7d7f8ecd914ceac903e30121d3a8d2a4a8e1b3597852188b9e393495e",
"T2T1_de_test_cancel.py::test_cancel_message_via_initialize[message1]": "c07eceb7d7f8ecd914ceac903e30121d3a8d2a4a8e1b3597852188b9e393495e",
"T2T1_de_test_cancel.py::test_cancel_on_paginated": "1aaaa6973bbea8cdf9378cd8b9abe61c3339039b5f5481735e0c5c4f3fa92e91",
"T2T1_de_test_cancel.py::test_cancel_message_via_cancel[message0]": "78c008c19b84f7784c6e26d9b1e3b04c2ef5aa6312318e53146abaa7b563cc08",
"T2T1_de_test_cancel.py::test_cancel_message_via_cancel[message1]": "0f74eaf21eeb33f4926152e82f47d0c9bc62e5e6002aecb6da2f3ebd126b1f31",
"T2T1_de_test_cancel.py::test_cancel_message_via_initialize[message0]": "78c008c19b84f7784c6e26d9b1e3b04c2ef5aa6312318e53146abaa7b563cc08",
"T2T1_de_test_cancel.py::test_cancel_message_via_initialize[message1]": "0f74eaf21eeb33f4926152e82f47d0c9bc62e5e6002aecb6da2f3ebd126b1f31",
"T2T1_de_test_cancel.py::test_cancel_on_paginated": "581f308ac81b24a6380967324898b9691c030661ffdd706d8159649bf0b2e557",
"T2T1_de_test_debuglink.py::test_softlock_instability": "b1f71b2ccea57e0375d465b3c0bc5a4fbcfab66ce4eb9701fa91fc4808e1359d",
"T2T1_de_test_firmware_hash.py::test_firmware_hash_emu": "5f74c8e2421c3e3af6f8c3fed431fe795b8a8db7b83a95a5d48ef779df916363",
"T2T1_de_test_firmware_hash.py::test_firmware_hash_hw": "4ed24353a7aa99e894d4ed3cb45be13f54a94577289f3919be62add4c6c36390",
@ -10907,7 +10907,7 @@
"T2T1_de_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "fc90ebd4d7a642a0a09596c52b690a9e867245fe475f1f2ec1b404776b24d3a9",
"T2T1_de_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "294aca06fb27eccda67897470412979142bde2e7bf363f19035c20c31277e486",
"T2T1_de_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "236fd39a8761eb753a8ba6bb411c3ea596ca0578443bbaf7d73af3c779200c3e",
"T2T1_de_test_msg_changepin_t2.py::test_change_failed": "101e76a2de2aca0e1cb8f47b79a226624fa45c092c5ba40f52dc564d59b7c025",
"T2T1_de_test_msg_changepin_t2.py::test_change_failed": "21d332ede2903b750cc7c3ad3164e1fce27765e9da37eb7261b5ffd856213035",
"T2T1_de_test_msg_changepin_t2.py::test_change_invalid_current": "291d3fa301b49446735db5c367d1e4d561b53783eaf312037b24488458ff65dd",
"T2T1_de_test_msg_changepin_t2.py::test_change_pin": "546c92a1ae7c89c2ded37d4b1e111cd62924580340db46ff269608c8ea88e1c4",
"T2T1_de_test_msg_changepin_t2.py::test_remove_pin": "cd257f3a7c48f0d4f550cbddef61a46401a1cd706dc788cdb56b574247bf0585",
@ -12117,9 +12117,9 @@
"T2T1_en_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "9d161076574c957b3708ec34771026a970b1ad90ac7bbf5b1492ded0de1f5ba4",
"T2T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "264cc069a974286064781c22c175e54bdb28000909b5dc671acfa03ab272b426",
"T2T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "7d0f0cac581360c5a8b64e229171f0c6a92972adff3c3ed334c483076021a041",
"T2T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "2561ac9a4a209c181d8cf35579db0fa36f752cb628067d59d3456d64f82f93cc",
"T2T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "980c374bd173485c06ffc3ad2f3874762ef065762ce063440791383f1bb01b08",
"T2T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "2c4f3600b0f26c4da64add476618ce5bb9d759d914afe89c5a75eec3cd7ebeac",
"T2T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "b86d2d1c561fac4055ed1c437bcdd69d2dd7f43553af6bb5630259430983f55a",
"T2T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "a1ad9e10356bd6223b37949538fbb560a4487aa9463d19a9001ad35c4834d8fd",
"T2T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "9271c61c3740658029b0fe3b375377233aaad70a97d929d984f6b1a16b3c1ef7",
"T2T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "c0886a9bef6b448d193ddf032c14b614069c5f742aacdfab0d4d21c53a5dd331",
"T2T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "4f90f47e88cca3af88975a817baa01937b21647c19d7799acea6795309bba28b",
@ -12129,16 +12129,16 @@
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "73de5bb9f1528b81396ebfd321df67f773f925d6cbd7e616a58ce30eaea27ef0",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_abort": "264cc069a974286064781c22c175e54bdb28000909b5dc671acfa03ab272b426",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "59786fd2798a68e0546515ccd7ec0d7e4c3276098545615850911899953681e1",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "bcab24b36d8ac28c76f6ebcf54f416024d3b32ef03862234a88d9128d1e16548",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "703ed967f59738cf2a41aa6780656d1a8c77ab3c2cc558820981421a9e6475df",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "12ea0985454ab09cbec3d1f9e4246f0e6c098cc8ea69774ea253a473065e6938",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "66c45751002ae4d84e0ffb3a80349585604b5f19f87d08368e806ff0ac0d6cd5",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "7d6b8c0008568f8a9fac9e6bb543b3b60845eb6aa5cc715efc5ed75f95aa27cb",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "b5d6d520a1fa9d7c8e1d074dbb9646c62f0f5ff8c4fc192f5547b671d6bf7913",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fb-ad8c45c0": "443ab1ba8f9bc006865e978418b4ccdf931f88ad5c13397467cfc01ed3b3e406",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-644c905b0c4da21692f06fff3-30d0f8ca": "7a6eda20f828b170eaf90a58813a5569ae7af9d0f49e41c4d84227e64107733c",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares2-b770e0da1363247652de97a39-6af744e3": "a16d8e9838b762534c0a2d8c82c277ba81e49f018506dc26624a4a0d8cce97c6",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "c8f48570ea01b8046ac1deb84f3a12d1b02718ef28fcb47402e9f98745769d3e",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "d31779beb275065c26d2ad3fab64682b4c55c9c0bee2e2ddab6c607762d1e551",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "35b9bc382e6e0c8778be8456f7dda77ea693ed5e8bc1168213c9ca5b1b1d5720",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "f9e8df5075762c89e5f9eacc171ecb1592c9e905ee87d07066f8d2863f7c8598",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "041e5ffdafb2812db3c37a6bcd89f50fb1906563aecffd95dbc02bceb8084172",
"T2T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "4b32bef901796d64fe03b215688da4af7c24d013b67ecd5b0d561043fa47dc44",
"T2T1_en_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "5f3413af77cc76413fe1ec3e00e17850f8de504499b5bf9d753ed4d9351931e5",
"T2T1_en_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "2b866e19489d98b9924398080478e2126fe9769b057ea725e7ba795584adb1ad",
"T2T1_en_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "e5468c5e24463f2e7f0bd7eec981bb7e942cce7dbadcdbd7c5cf3bd1df229a4f",
@ -12318,11 +12318,11 @@
"T2T1_en_test_basic.py::test_ping": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"T2T1_en_test_busy_state.py::test_busy_expiry": "6509e7c943f2d09e3a5a7c69faee74c75b321ed1614d881d1ebdb57693c7f69a",
"T2T1_en_test_busy_state.py::test_busy_state": "13fce27fd795f6f622614fde678ba3f717129a27ecc6d0c2cbd389ede4a2798f",
"T2T1_en_test_cancel.py::test_cancel_message_via_cancel[message0]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
"T2T1_en_test_cancel.py::test_cancel_message_via_cancel[message1]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
"T2T1_en_test_cancel.py::test_cancel_message_via_initialize[message0]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
"T2T1_en_test_cancel.py::test_cancel_message_via_initialize[message1]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
"T2T1_en_test_cancel.py::test_cancel_on_paginated": "498ffee2ea02e2783466cbb993f0cd83eedd3b67afde37b5d1f713fc996c1455",
"T2T1_en_test_cancel.py::test_cancel_message_via_cancel[message0]": "d702b0f90581cf17e0f77b4d318324a002deec42c2c5cb8860d51f6cb50f5739",
"T2T1_en_test_cancel.py::test_cancel_message_via_cancel[message1]": "3ed24b99952d25fcf0d9bd6d307c576862fe870ddb98288fa89b227f0e192073",
"T2T1_en_test_cancel.py::test_cancel_message_via_initialize[message0]": "d702b0f90581cf17e0f77b4d318324a002deec42c2c5cb8860d51f6cb50f5739",
"T2T1_en_test_cancel.py::test_cancel_message_via_initialize[message1]": "3ed24b99952d25fcf0d9bd6d307c576862fe870ddb98288fa89b227f0e192073",
"T2T1_en_test_cancel.py::test_cancel_on_paginated": "5c198919403dab5ba394a87544aaa95bdafe82959fbabdbe918c81e2d226b051",
"T2T1_en_test_debuglink.py::test_softlock_instability": "55cb4cbeec68bd8ccee460034677cf8053f8f688d5c3559f360c38a205b34e37",
"T2T1_en_test_firmware_hash.py::test_firmware_hash_emu": "2a63f0bd10ba99e223f571482d4af635653bb8a3bddc1d8400777ee5519bc605",
"T2T1_en_test_firmware_hash.py::test_firmware_hash_hw": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
@ -12374,7 +12374,7 @@
"T2T1_en_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "db9ffa189464d1c0ba7d3ea2533306e25e6895355083066c2b6f9b19efb54406",
"T2T1_en_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "96a18ef7ba92b18fd9d6d3856f737e8b1418df79221d6750723109c90b2d5807",
"T2T1_en_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "f478a15ed2dfde070953b1f14c6054452b0ac27ef8ab5cf9c1ea233a43676a32",
"T2T1_en_test_msg_changepin_t2.py::test_change_failed": "1526ada2ec21dc5219ac42698a1d6a9314b11f79adf37465d226ffb37b603124",
"T2T1_en_test_msg_changepin_t2.py::test_change_failed": "72e36642bd0b8832bec9e3b171da5a7fe5e2a1b44282c521a69d4fc0b5254828",
"T2T1_en_test_msg_changepin_t2.py::test_change_invalid_current": "e9925836465ef35c3d5364e90780626274a92a1123451b572b9ea11a9cd2180a",
"T2T1_en_test_msg_changepin_t2.py::test_change_pin": "256483cab21191ee110281e9f547c3fa08968f4d49fa38896f8141f5b8eb4701",
"T2T1_en_test_msg_changepin_t2.py::test_remove_pin": "6a606987a97b9d50d991288f1222adf2c819846076b2014e91909c9907a0e427",
@ -13602,9 +13602,9 @@
"T2T1_es_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "f924ac5735b5d1c42ff10bb5d74ca08b22468a4d8dd1d6b9fbe7a191d5272c76",
"T2T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "aeb20740f1aed49544823071d0fb58e942aa39ecea8dee58f4ccd872801ce798",
"T2T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "7a010cdd6866e367b0c0790d7ab31e0705a81dbe3c49b5b679d895fb5a97e4fb",
"T2T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "ee3da185b3b56bf08a4742e4bec131ed82b61db1a45070f2c74dbfe13df43978",
"T2T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "2c6502d7676bfb4f7b0cb3e93be9fd11bfa655a7115a5e1bb712eacbee0cc6f7",
"T2T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "8f1970fc42bbffbd429bed2d6ed19b2df86f82264db6711e043d493d2c893d00",
"T2T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "39accd1ed5c5575cfd9603eef34926c524c6dabd6f2aa4a7f9927609b4800ac2",
"T2T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "cae7cb874a05c6f12958687e45bcc7f8009a5d98aa757e0aa266aaf521e9fef5",
"T2T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "1b0d315dcce62c807d740072da246ef399eb4c031ca06a20be9b43c0efb8b619",
"T2T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "4783ef6eb4517eb96c57295ef5a7cf0faa7e8ccc344cafbe16b68af12dbea83f",
"T2T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "859c80626b65a088763d6c29d0200c35c65e6e24da9dd7173f2c251efb8a5699",
@ -13614,16 +13614,16 @@
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "dc511287d381e40164fb32fe409906f4042e17367ba35c7d282e281707639e30",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_abort": "aeb20740f1aed49544823071d0fb58e942aa39ecea8dee58f4ccd872801ce798",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "02de62b333ee9f4f510977e95385a06c97dc66e4d700458dc8b73c16dbf80306",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "dbea283e09e907b3f8405ff71de5b828b67be49e478a73a7f97700176ed62371",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "75082ea23878210f06b2782e3e241886df201e688b54b74f55ece47cb9a5cdf0",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "0e8e437276ab32efc4d3c961ec4f3e1ba8ba4e03eec5d640b52a38822d037df7",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "a6d9c431ee736c40d7600e824321077794e207d7088b713f96ebca875e9a8f38",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "ef5542a30ed086d193a3bb2ef3025c1190e3f7372216e2c70a8464a4066194ea",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "1a41ba9855f21bcad666b9e6e7077aee2cc770edb38b2d632a0210d5611b2c2e",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fb-ad8c45c0": "f638a59f17d88b973dd0ac432ed78e3d411fe4a56229ac29c845e019bef5de16",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-644c905b0c4da21692f06fff3-30d0f8ca": "cc18812d2f5b7ef5c23555ebcad59a28e82c01d06f2c5907b952156c44045ff2",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares2-b770e0da1363247652de97a39-6af744e3": "0a8fd0daaa315189ef7e063736fdf0301bd4ddb36ec31e2250a4f66408b1dc7c",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "c43145b81703108d19c39a9043136c7eb94c62ede3668890a226ed5a87ba709a",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "3224baf58710455f51d287069bd69865436b16182aa9d6ee9e5f6ea4e502567c",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "985a80b7cc665ddb740fd8b49fc21fff87c06a3cd42d297d9f72d41771f98bc4",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "2495dc14e3f0175f3b9c6850455dc12523a65ceaa76022ba7502a6dbd4e4f60d",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "105c981ef63c444c26e4280340e476a29ebee11015c079ec31ec3960229c154a",
"T2T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "5ade258d2f37bc47b0ce25f1478e669743e7d500a6e00f6d65b82c0367fb78c9",
"T2T1_es_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "d405d791a687be77da11e1c7b37eb49feaa5dd74b5746fac42c5916385c8b63a",
"T2T1_es_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "611d56d305fa5d605b191b866822428e99ab605e7634190e70d60070ed8f3195",
"T2T1_es_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "d224c8e21874c5a238a21cab83dc0b7ea8cf6b02f05df42b6a4cb2f3f380deb7",
@ -13803,11 +13803,11 @@
"T2T1_es_test_basic.py::test_ping": "3d2d3c815bfd09c3235e3749e66769dc375f49f9cc92f13f4a7b7df38e6bcfab",
"T2T1_es_test_busy_state.py::test_busy_expiry": "da280d408675fbdbaddefe467ce32f0fbd64726f8935dc5d49b9d2fe969f7585",
"T2T1_es_test_busy_state.py::test_busy_state": "1f9f7512198e2a8b471738fb5192fd39dac29f0ae800a128a586a79ef5f57ebb",
"T2T1_es_test_cancel.py::test_cancel_message_via_cancel[message0]": "38fcd1064e016bef25510a8a5d6a9dbb4bed8ef7d9d482a59291f3769a1a621d",
"T2T1_es_test_cancel.py::test_cancel_message_via_cancel[message1]": "38fcd1064e016bef25510a8a5d6a9dbb4bed8ef7d9d482a59291f3769a1a621d",
"T2T1_es_test_cancel.py::test_cancel_message_via_initialize[message0]": "38fcd1064e016bef25510a8a5d6a9dbb4bed8ef7d9d482a59291f3769a1a621d",
"T2T1_es_test_cancel.py::test_cancel_message_via_initialize[message1]": "38fcd1064e016bef25510a8a5d6a9dbb4bed8ef7d9d482a59291f3769a1a621d",
"T2T1_es_test_cancel.py::test_cancel_on_paginated": "e7867645a35ee40b80f8a3eeaa122571367a3d3a1f850f89f5f7b14ce28522d7",
"T2T1_es_test_cancel.py::test_cancel_message_via_cancel[message0]": "1d98be5dd1e52fe5da379d1c72d6bc9065228b1d66939ee5bd2eda2fe857b679",
"T2T1_es_test_cancel.py::test_cancel_message_via_cancel[message1]": "61caffa741cf81f709e6df2818a5ace7411fef1765e14aec7dd99b13f7d1322f",
"T2T1_es_test_cancel.py::test_cancel_message_via_initialize[message0]": "1d98be5dd1e52fe5da379d1c72d6bc9065228b1d66939ee5bd2eda2fe857b679",
"T2T1_es_test_cancel.py::test_cancel_message_via_initialize[message1]": "61caffa741cf81f709e6df2818a5ace7411fef1765e14aec7dd99b13f7d1322f",
"T2T1_es_test_cancel.py::test_cancel_on_paginated": "d842630d249b84c0582c95187ad93a13bdd42c7320407a1ed552920b281f6f9a",
"T2T1_es_test_debuglink.py::test_softlock_instability": "073cd4ce53bde3d39a8ba0cf1cb0faeead2ab1b3b4d666c7c60aab1e813c1dd1",
"T2T1_es_test_firmware_hash.py::test_firmware_hash_emu": "6f9a2eb356b7054881d6b60116f6f54e4884835b3b3881c151ba6ab5f32f8560",
"T2T1_es_test_firmware_hash.py::test_firmware_hash_hw": "3d2d3c815bfd09c3235e3749e66769dc375f49f9cc92f13f4a7b7df38e6bcfab",
@ -13859,7 +13859,7 @@
"T2T1_es_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "9bc3b09fc66b9faa15ec07cfb47ad6dc10e6965833822e9ddbeb56fe55f546e8",
"T2T1_es_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "6b9bce5a9ffc79f57f0d9f2856c65c708a0f82ddc6ffbfa84b6746421788a00d",
"T2T1_es_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "0a483f3f2c218e4141ab45e93074c062e81cdded4c27ff54d52a4d02b037670b",
"T2T1_es_test_msg_changepin_t2.py::test_change_failed": "b1e04819151d46cb2dfd1e32aaf1f6cc593fd9a422f2a93d1c18ffbde05a191c",
"T2T1_es_test_msg_changepin_t2.py::test_change_failed": "b9f80c0be3b257a0c53a16815c27ae6f3a2ba1e9ef5f7ad296c9c228acd524d9",
"T2T1_es_test_msg_changepin_t2.py::test_change_invalid_current": "8631c5489ab6371809d83c57763a62356fc8d6e392bda073f78c0e4a623af491",
"T2T1_es_test_msg_changepin_t2.py::test_change_pin": "b904e3b1e59a41b45a3b7b8de590e4d848c7225c7a9aeef3d35839f29671bc60",
"T2T1_es_test_msg_changepin_t2.py::test_remove_pin": "a7627e527f283d7a42caed5ca29b3271120cff3daf755d877d19e000745a6b02",
@ -15069,9 +15069,9 @@
"T2T1_fr_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "974d8435badcf1dd4cec0c9df6fffacc46336b769641e752e6f6f449a46773f7",
"T2T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "4d0ebbf93a6212f2a655ccb2707e8da7e8798d6e95e5786810d6484f98bd5aad",
"T2T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "fc9a5ac9b017e3b3b52c7c407d880c3d78842da4a103afa55842c09eaad1c52b",
"T2T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "617d68b91757d66a187d4171792ccbe32b75a46275d9aac439d84e88c01e3fdc",
"T2T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "b78289d8e69db34f4590d209534ff7537566adedeba3ee4958c278a82e09f15c",
"T2T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "294ebf84ed042c3614cb4d440ed2c219ec176c8235154070c727daee69caed7b",
"T2T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "15a367a52163e65271307a7b106306bdcc35334d5b95723e1a5ae621c2beba52",
"T2T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "32857469ef5cf8cf3cc347736b2f0265c0683adbce86cbf22e46b14866e0b565",
"T2T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "8d614efdd82ac142fdbe0736c5a374bcc12cb7b1545f78f40fdddfeb132da7c9",
"T2T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "99ebcfb43037d4c901d40f6b22cdad95ac8ca3d7c0b43cd281691244ef197567",
"T2T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "d5b21612ac87850a91b28c8a1f07fd7dc7f4142990bf9868126473a088a80e96",
@ -15081,16 +15081,16 @@
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "e31f44d338bd64d8a3d8d8db82d0403b2d3314a999ce0b172c044ad1ec0890f1",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_abort": "4d0ebbf93a6212f2a655ccb2707e8da7e8798d6e95e5786810d6484f98bd5aad",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "ec024a426936d65d84d7198ff2bf44a8ffa1f24e60afc00ebc0ca090937d56d6",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "4707f43e73d9d5537a8a16d3a83b3fb274c10e74fbc0d9025b445e7b89efdadf",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "e80d8bfe48bb0f2a025664197e0b8273e93977950b9e24bab3ecbcad11e2aa75",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "142b8458dba27108711b54b500d399a8f6b186d277e5c0704d82219fb70b76c9",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "1261f7b79a1cb4a110f50cb00cae5cdc590768989b69c98b542386ead92de8c6",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "cc8d63461af6e282b7fc4afcd6e418ce487cba3cf95c4b1eb9990cec648c61c8",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "2f251ec4904901641728864098844c56c3efe1e868f2f92903915ac162e3ce8f",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fb-ad8c45c0": "2618492c26098f91ea57e82feb5850d076fa707e7b0c195bb7a5760b1c47e8e3",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-644c905b0c4da21692f06fff3-30d0f8ca": "1cd921e884adbf2453e120ceae4bb61ccbd5fcfc3280eb1576e88786e006e0e2",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares2-b770e0da1363247652de97a39-6af744e3": "4618d385c51aed62a5edfa7063f61d4c5e1a2d9f4422658f2d3471b293b88d4e",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "f074b5739f3bec0e444926534fbb6be4f1269d5567e2ea6ec4a7d29315a3da8d",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "ec1610029c2085be5d2f59f55873d3104bbcdf719cbe90b99ab91098424d2a7b",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "a6370ff212817bdf354d6b12c9bd4ea9da883c5f1b28bf746d2b7745f81ace0b",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "42a66f1495a3ebeb3134c3be93ed6f4bfe8c4f9315522302192aeebe1a853edd",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "4452014cfbf7501ebadbb7d6c0954a67e9fb0d00e2ad2f9dcddbea8daf46d6fd",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "b3a5868738d31a49d3ad3a97dc5145c9f0e0cef977bb895730d981155fe758af",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "461178dd45fc130048749dd679ae202547e64c3311e07ff9ea27a593c7cbe51d",
"T2T1_fr_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "6904de14224eb55d657747ccbc0b73a093406d2910665c69dbfc65df949b1d3a",
"T2T1_fr_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "e18f67ec58ea71bbd9d8dbc83a36846b5ef494cf4653e64b93c6f858a1834dd8",
@ -15270,11 +15270,11 @@
"T2T1_fr_test_basic.py::test_ping": "5c03427cb7e315cb2f1e036c2edb2cc7c527ac80783c331fda0749bf306bcd94",
"T2T1_fr_test_busy_state.py::test_busy_expiry": "0b142663642a8981e8fb85cf0eda771d72c9d2206cd224d170b588f32da4d8cd",
"T2T1_fr_test_busy_state.py::test_busy_state": "315b1d0679a565a8a65804592914e4e8ffb3010d73795e0164b327d1776d5dda",
"T2T1_fr_test_cancel.py::test_cancel_message_via_cancel[message0]": "469c355dcabfba4a0f56eeb89834dfa595fcec58989f8c17e5db9a8a268a9b7f",
"T2T1_fr_test_cancel.py::test_cancel_message_via_cancel[message1]": "469c355dcabfba4a0f56eeb89834dfa595fcec58989f8c17e5db9a8a268a9b7f",
"T2T1_fr_test_cancel.py::test_cancel_message_via_initialize[message0]": "469c355dcabfba4a0f56eeb89834dfa595fcec58989f8c17e5db9a8a268a9b7f",
"T2T1_fr_test_cancel.py::test_cancel_message_via_initialize[message1]": "469c355dcabfba4a0f56eeb89834dfa595fcec58989f8c17e5db9a8a268a9b7f",
"T2T1_fr_test_cancel.py::test_cancel_on_paginated": "3547888bf963a9e458d362f218df5770e81b53ad850c462f98c00ea772ab42dd",
"T2T1_fr_test_cancel.py::test_cancel_message_via_cancel[message0]": "e2146f6ece95111d17b01b0f2e0bf720c845242c7b0791ce5c8af5e9ca63249e",
"T2T1_fr_test_cancel.py::test_cancel_message_via_cancel[message1]": "722d1df17cd5650880e8a634038c1f582229258661a26ee307a9a8d8737dc178",
"T2T1_fr_test_cancel.py::test_cancel_message_via_initialize[message0]": "e2146f6ece95111d17b01b0f2e0bf720c845242c7b0791ce5c8af5e9ca63249e",
"T2T1_fr_test_cancel.py::test_cancel_message_via_initialize[message1]": "722d1df17cd5650880e8a634038c1f582229258661a26ee307a9a8d8737dc178",
"T2T1_fr_test_cancel.py::test_cancel_on_paginated": "33d4d29b50e577aa96fdbdac167a6bd9f50351fa6cf3e1367291596051f74146",
"T2T1_fr_test_debuglink.py::test_softlock_instability": "8788c9a37a7e20aa1fcecdb0c8b781b9146868a5d89223f90613a4a5d5fbb22f",
"T2T1_fr_test_firmware_hash.py::test_firmware_hash_emu": "a1d024203379022355feb1ecbe72d16ded27a7060cba89469b82d14e84d8eabc",
"T2T1_fr_test_firmware_hash.py::test_firmware_hash_hw": "5c03427cb7e315cb2f1e036c2edb2cc7c527ac80783c331fda0749bf306bcd94",
@ -15326,7 +15326,7 @@
"T2T1_fr_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "e5fa81d7e17a26c8906151ccfee94221ae7be518cb3d34565a64d5e3bd89d184",
"T2T1_fr_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "c7c79c893280efdcfa43925b3e559eb5e00bc7615817ecc08920bb60f0096b6c",
"T2T1_fr_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "fd8da1b96ce39c633caac4c7bc48165bd3b8f07bc06d311deeaf050666635bd7",
"T2T1_fr_test_msg_changepin_t2.py::test_change_failed": "124e530e51e0f35f68a11cea194515f4947947a8fd094353644186c531547042",
"T2T1_fr_test_msg_changepin_t2.py::test_change_failed": "89f34ff69cde4cbe1322313ce004575fa1c58d4fc2898421887ece256984dee9",
"T2T1_fr_test_msg_changepin_t2.py::test_change_invalid_current": "018f43d9235fa8e37ed0c7dc6251d9eb1eba2e219f2b2f4fc28c55338913303b",
"T2T1_fr_test_msg_changepin_t2.py::test_change_pin": "610f987ce40ceb7c7ab6d5c4dbaf22518b33219118baf2bd161343324d93c0a9",
"T2T1_fr_test_msg_changepin_t2.py::test_remove_pin": "1bda09d5cd9f99f25778f3e104356a895f33b3b98990c508f89ee213afcf90a2",
@ -16732,9 +16732,9 @@
"T3T1_cs_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "3c6ac4165c200aff2e4100493b1f61f07666bee1980296efc4dff745dee45075",
"T3T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "1e590c419465f8e57df6e0f9e85bda9d71751da84497a68958c046dcc6270ab1",
"T3T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "eb334c59e145d62a9f68d251d0b8ab52dbda32d3768bf4fe79f0e73fd5e21abe",
"T3T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "15bd361e29b05f96f88dec6f987d38c798cb6093536fa0018553b4e65915c72b",
"T3T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "d4a17de10a15cb113a0fe80fcff712bf4155cef906529d1b45cfedeae21a1209",
"T3T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "537c0de7f1b15b90c20daac7eb952ac75c25eda0522d1e084a27207bc9b51cfe",
"T3T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "7b8ae474e0b552e733aaf7212fff42ab04f1a40a90bd4a24d2e6ec0339c95781",
"T3T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "dbf54ffb031915f5daf4314715535eec3077c057504c894f6171b741059fbb03",
"T3T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "da2e9ef780a1838e3c4605c4928ae780eadc6a3d712be1fed620eda22349aa5a",
"T3T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "62090cd2fbb8fa4439cf115749a6093849ce984bda63a8fc4cfa6523ff90cd11",
"T3T1_cs_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "f6f2893420b12f51159c6343d2e12aa561eb07cdd2af554e4e6b2a72253abc19",
@ -16744,16 +16744,16 @@
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "3c2bcdaf8606bac2d56748fd6944ac4cdc38542fa8c1c84268910ff09b24a26e",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_abort": "1e590c419465f8e57df6e0f9e85bda9d71751da84497a68958c046dcc6270ab1",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "0af7a7a73de53629bf1ed8ed77f34a1c0010a15310c8a3081ee89fb6d6c2c4a0",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "a8e6d613fb0085004901775bb95071b472b719f1669e69341c1f4dca7c49631c",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "f07044323bdc4eb3e297fff70814493f63071f701fb95e949bdd9466b9eb2514",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "d3687f2ad206424a8824c026cc23b8c2efcc207cf5666a83b10b447828aa0f32",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "666a315e37b89fd2d614e579b9dbae14e32c39359ab1790450345f0d32c89f8d",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "14b116ab0973cee00da7f207cd041cab67012d2fa902ae457d44737976a6fc10",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "feb1871fa09e7a12a1586669b056276f3a259d190fa4bdc396f4ba26fa07d851",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fb-ad8c45c0": "20bd63e82f4a56754df3ee96dc5571a81295f41ab067b35be9a965baf9594e3e",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-644c905b0c4da21692f06fff3-30d0f8ca": "4ef4f4b9fac2056860fd5253317b41ec99b729e1be892b249690efc1d31f305d",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares2-b770e0da1363247652de97a39-6af744e3": "9f116fe69f56453062534cde498c32debfab02d82ff685cf497777aeb536d747",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "3d31b330afcec7290165371e4946b5cd239eb36674927535f065d724eaf4bcdb",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "236a020544ecd081cb8854d5e02ffb74b0961bb33f13c8eeab0b1fb323b7c0bb",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "0b587dfaedf22a648a277a6a4569a0aea575c2f81b92dc5d1c636c8e112d3ca2",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "39e016c5a3d17f3cad668e6d4c7ead2cbd7db3f322f3a8eab3ddd10d0030c0e6",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "45b27f60f4d25f70bf7113af1eec6fe214f5fe5a2bb9a8279da4111209d72ee1",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "a78f85f7055be2063d01ec475356e0e7c3d9c4985fd302e42236eb03c88ca953",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "6e30344a76f7988bc928b86abafdb032b78a48607ef16cffc66d58473a7c8a13",
"T3T1_cs_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "1e7110cdc5c51a73279fccfff529d9c905203299f9de5d834aba262e5f0194a5",
"T3T1_cs_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "443583bdf27b893b6dd4b56bd5ed31f66a33e11d622a8ef2013c6e36f9b4f39a",
@ -16933,11 +16933,11 @@
"T3T1_cs_test_basic.py::test_ping": "1b0c0ad21a8089c6441d577f0d15ccea46d9b2d7f77b8eb50c3d952dc0d7114d",
"T3T1_cs_test_busy_state.py::test_busy_expiry": "5807370e36255f64722c9b70002daad3b718387eaa41102561ec6a0dcbeed20a",
"T3T1_cs_test_busy_state.py::test_busy_state": "9a846017e3ac79ae304490124caaf70eef76b60d0372c48e3cb8cfc2b334b2b0",
"T3T1_cs_test_cancel.py::test_cancel_message_via_cancel[message0]": "b51e0d1d0e72a525724163cceef0426977dd3bb36bc0df5a0d96979cd0ebd011",
"T3T1_cs_test_cancel.py::test_cancel_message_via_cancel[message1]": "b51e0d1d0e72a525724163cceef0426977dd3bb36bc0df5a0d96979cd0ebd011",
"T3T1_cs_test_cancel.py::test_cancel_message_via_initialize[message0]": "b51e0d1d0e72a525724163cceef0426977dd3bb36bc0df5a0d96979cd0ebd011",
"T3T1_cs_test_cancel.py::test_cancel_message_via_initialize[message1]": "b51e0d1d0e72a525724163cceef0426977dd3bb36bc0df5a0d96979cd0ebd011",
"T3T1_cs_test_cancel.py::test_cancel_on_paginated": "59a00b375bf2e60cc0e624626aaf4b651cc24200be29e41e912fbc9358f7168e",
"T3T1_cs_test_cancel.py::test_cancel_message_via_cancel[message0]": "fea263b87f3b5ccbbc7ac43de02f28a3927cc13116505a76b71047427d3b80d3",
"T3T1_cs_test_cancel.py::test_cancel_message_via_cancel[message1]": "2e607dedaaff54ba045743b6cf77f83eb81608d7e5ab22c3aaadbc13bfba9cb1",
"T3T1_cs_test_cancel.py::test_cancel_message_via_initialize[message0]": "fea263b87f3b5ccbbc7ac43de02f28a3927cc13116505a76b71047427d3b80d3",
"T3T1_cs_test_cancel.py::test_cancel_message_via_initialize[message1]": "2e607dedaaff54ba045743b6cf77f83eb81608d7e5ab22c3aaadbc13bfba9cb1",
"T3T1_cs_test_cancel.py::test_cancel_on_paginated": "19cd5133ca91858fe667cdb4cd38de92ab01eba5a232eff23ba6591f59e7f26d",
"T3T1_cs_test_debuglink.py::test_softlock_instability": "c6d1589a2a6f53a752806e4aa4e2b03f68685ca7213c5dd4af5c82eafa6d014a",
"T3T1_cs_test_firmware_hash.py::test_firmware_hash_emu": "bf3b0b0bfc905aa8b9cb991baffb7c523f4f185f0a6531081c2e09fee5964108",
"T3T1_cs_test_firmware_hash.py::test_firmware_hash_hw": "1b0c0ad21a8089c6441d577f0d15ccea46d9b2d7f77b8eb50c3d952dc0d7114d",
@ -16989,7 +16989,7 @@
"T3T1_cs_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "8f7a0b93fd9602605aaaaca55b409468e09715f425611bfd98519eee9f059e38",
"T3T1_cs_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "c1febab3a5f19fb7f5d52a7f8aa0b61ec00bcbbd21e8fd4df641ef7f7e737826",
"T3T1_cs_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "0151cccb0237921183ac7036f9ba711f0beaae379191bb2bc64b9830f3f971e0",
"T3T1_cs_test_msg_changepin_t2.py::test_change_failed": "76ec57af41088bd292ff93475169dd125c1992da8a1bcb29625d13bd088f960c",
"T3T1_cs_test_msg_changepin_t2.py::test_change_failed": "b0e1f29128f59d355bee664cad0eb02fcae4bfef3cf06d5196fb316af89bd858",
"T3T1_cs_test_msg_changepin_t2.py::test_change_invalid_current": "21248c1c66a4ff82086d023306e0ff4968841a9264f600190a32dfdc046bcafe",
"T3T1_cs_test_msg_changepin_t2.py::test_change_pin": "49d87a7062641b69719b84a1e5c18dd444f231a1796bca763317daffb921c25d",
"T3T1_cs_test_msg_changepin_t2.py::test_remove_pin": "98f5e95a8394a34a221a92b62d00fffd7d4c47c6252bca1c3f2d1f426e3a97c5",
@ -18139,9 +18139,9 @@
"T3T1_de_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "bedfc358a7a465f6eb9bc6366623b85eeeec83ccda92af2495041b25d4b78115",
"T3T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "696ace0f4b428b30472057e2ad641519a3750781777f4820c970fe502cd9f77d",
"T3T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "7f4161c22319a1a29f96da0f44e4e4686fbecab5c905894ddd940fd4874a0ce1",
"T3T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "e218f9ce906f50e3addbc8bdb01bfbbefdb42b0e023c57031a2b5902d8b5fb61",
"T3T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "5f90813b92b3aece66d008454c6f516fc278b500d54281a1c33b51be0eaa82cf",
"T3T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "91f03f4ec9c34a0278ca8aade6287a10ca8460ef9c41240d89ef39b5fad29b17",
"T3T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "4befb3acfff8dca6c4a95de63a7ddab93065de9c4823ba1ff640aa8799088431",
"T3T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "0725e1dec4ed68391b8a6b2ee6a24b715c4e4eb54d3b43cb655858b092be096d",
"T3T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "f9f199713e65ddd3c0de87c38c6200feeb437bb621e7b9cd2dffb426fe08a919",
"T3T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "8ad558621d0da6618b8fef7b84622fbe5002d9ac293592eb4274d65f12a40828",
"T3T1_de_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "f689f408d545a39929e410a9a80c2fefaed8d3016b4981ba6b11e512b4e1b52d",
@ -18151,16 +18151,16 @@
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "2a2785d202cf020f0aa5e62840146377d16ebe336811cd2f7b0af64456536b2e",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_abort": "696ace0f4b428b30472057e2ad641519a3750781777f4820c970fe502cd9f77d",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "97d02aaf682c6c7de7032b4636dfe88b3811be15e19b00c282ad0e795b996afb",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "84adc6852f32637d784d3b6659a5478bfcaf46c384128f478b0b67d02a94fc23",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "abc8b384279bf2a7352d692b9854d1335212f3f31a98bc0da817d2340eec00ef",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "7dca8aee178b0f410cf37e9fa09ffeeb93b01ffc238d286d564cbc98c9a2517e",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "11a3ac4ed9f8b9ecf389f673e0007dec579099b5b1a297dedbc0c9a5bd766fca",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "009e13b39f0b8a858b3ee9f597d626b7e5773713a7431d5c97a6d525ca6744c5",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "2bc4583abf984773ab36dd000a75aa446430d7aaa6d596867946e841d38e7d2e",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fb-ad8c45c0": "d86ed6bc3c866c8259173961ef12a981138d865de4ce9b9ac70854b158ba9981",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-644c905b0c4da21692f06fff3-30d0f8ca": "c4775909de03bb73ada542a4ff4938eabbc479068f95a22a76547f3cae7cf615",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares2-b770e0da1363247652de97a39-6af744e3": "9482b15d527ee4c850c3edc14eadf42284e5db401f3ee42855624383761c425e",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "e1fbbf789f5daca5f4bf5f8c44c25b32cfa324c40e19746177808f075279bd61",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "ed90c16baf66e6665f1dda17265c72c3cbdd772bb7571bfc90a60a578a8d85f4",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "3b565b07969ae6804beb55ad8179b2d84b99831a82ffd238b0be53b40615c25e",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "053a693f265775f7c7228b8d05ccaab4ab3b962f5b38749add483d3870e1be28",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "aa471a5ab69cb05d4b1d37a9cde66455040ec98a40bb592ecf7723186629dd59",
"T3T1_de_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "d12de58352a65e7132fbcbdb588509d14952a05702d6873d0461935f4fe00b9c",
"T3T1_de_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "8f11d9988ab51214ab59e3ecdea10bf810259b69f3e5c6774d6af3a8266af3e8",
"T3T1_de_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "7edd741620c6d5c96e7229e11d215ff1114630b64b814c022467c6c0a72fe740",
"T3T1_de_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "adda197012484eeba7d8a6379ced43ecbae120f985f2d4f347b4ad4afb05d6ef",
@ -18340,11 +18340,11 @@
"T3T1_de_test_basic.py::test_ping": "4ed24353a7aa99e894d4ed3cb45be13f54a94577289f3919be62add4c6c36390",
"T3T1_de_test_busy_state.py::test_busy_expiry": "d00c19e4be337da53afb665aa2c38784a51a91989ba65bb77aaadc8605994395",
"T3T1_de_test_busy_state.py::test_busy_state": "f305a101d05f33d6f0fa3d4e002fcc37a569bb3e89690dc74ad058899085aedf",
"T3T1_de_test_cancel.py::test_cancel_message_via_cancel[message0]": "c07eceb7d7f8ecd914ceac903e30121d3a8d2a4a8e1b3597852188b9e393495e",
"T3T1_de_test_cancel.py::test_cancel_message_via_cancel[message1]": "c07eceb7d7f8ecd914ceac903e30121d3a8d2a4a8e1b3597852188b9e393495e",
"T3T1_de_test_cancel.py::test_cancel_message_via_initialize[message0]": "c07eceb7d7f8ecd914ceac903e30121d3a8d2a4a8e1b3597852188b9e393495e",
"T3T1_de_test_cancel.py::test_cancel_message_via_initialize[message1]": "c07eceb7d7f8ecd914ceac903e30121d3a8d2a4a8e1b3597852188b9e393495e",
"T3T1_de_test_cancel.py::test_cancel_on_paginated": "1aaaa6973bbea8cdf9378cd8b9abe61c3339039b5f5481735e0c5c4f3fa92e91",
"T3T1_de_test_cancel.py::test_cancel_message_via_cancel[message0]": "78c008c19b84f7784c6e26d9b1e3b04c2ef5aa6312318e53146abaa7b563cc08",
"T3T1_de_test_cancel.py::test_cancel_message_via_cancel[message1]": "0f74eaf21eeb33f4926152e82f47d0c9bc62e5e6002aecb6da2f3ebd126b1f31",
"T3T1_de_test_cancel.py::test_cancel_message_via_initialize[message0]": "78c008c19b84f7784c6e26d9b1e3b04c2ef5aa6312318e53146abaa7b563cc08",
"T3T1_de_test_cancel.py::test_cancel_message_via_initialize[message1]": "0f74eaf21eeb33f4926152e82f47d0c9bc62e5e6002aecb6da2f3ebd126b1f31",
"T3T1_de_test_cancel.py::test_cancel_on_paginated": "581f308ac81b24a6380967324898b9691c030661ffdd706d8159649bf0b2e557",
"T3T1_de_test_debuglink.py::test_softlock_instability": "f533b6840f7f5b94c5baf11d12ae6b2e04a68efb292a67f8a7307f23366758d6",
"T3T1_de_test_firmware_hash.py::test_firmware_hash_emu": "5f74c8e2421c3e3af6f8c3fed431fe795b8a8db7b83a95a5d48ef779df916363",
"T3T1_de_test_firmware_hash.py::test_firmware_hash_hw": "4ed24353a7aa99e894d4ed3cb45be13f54a94577289f3919be62add4c6c36390",
@ -18396,7 +18396,7 @@
"T3T1_de_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "f21c1007eaea59c50a6cb7c63c6f4b4db6c6f211b78b4c5bda8f336ba1bcfb67",
"T3T1_de_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "a10ab0a73f43177fe38832332963d3966f52f0e42059df190aa6ca8e6453faff",
"T3T1_de_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "e64a6ddd81183c32612970a8f9526e013a7d53136cf61732714991bda7be054a",
"T3T1_de_test_msg_changepin_t2.py::test_change_failed": "6bd169a4c415d9cc065dff40e3177e90a10a74e7dbc4e7d72a600aad736708c2",
"T3T1_de_test_msg_changepin_t2.py::test_change_failed": "9ccf32e673ca1a85b5cee9c589b24df6b7792144e0c0936840d5945510a329c6",
"T3T1_de_test_msg_changepin_t2.py::test_change_invalid_current": "1ade4c776ac6f77b5226d92249521185465184f6329825353e34b03ecdf178a4",
"T3T1_de_test_msg_changepin_t2.py::test_change_pin": "2639b62eb8538e260aef167bad24e84209958952517d093f2e3d5e602e166d46",
"T3T1_de_test_msg_changepin_t2.py::test_remove_pin": "9e389b85510bdfce0b71dc8c0beda8ead9107360b430d241de1b76835d147618",
@ -19546,9 +19546,9 @@
"T3T1_en_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "6a57b810b4be43a92d396dfc3d605c211b6f1aa6787dc46d1187ab9ea1733798",
"T3T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "4e265c664333863752796376367463d27e0bd27cec4b769c10d008f043f4952d",
"T3T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "42eb8eedc199d864ea39e8dbd22ef1e9e2160e6a82967e73860210bedc7365b8",
"T3T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "629658dc4feb14309037583c186a7e3bb97b3c39adb33cd66a731c85be6ea913",
"T3T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "812f9e504c5dec3e077d86596c11966eb0e7278ce85e809a3a2871e9933e667f",
"T3T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "cb0a3043c74558979bf602a5b2333af7e87aadb789e78ad7fcd85e2ea2f90ea9",
"T3T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "fb62f4781906e3c9cb856c19203018554af912ca5fb75192d6d2551a6385246c",
"T3T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "fb7a9389d4873ae48773caaee6406ff570e5f15676767391384e422e8275034c",
"T3T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "0807d127aaa86576c6bf3bd1de2b81931ee6e266e99f04b7c628752c69df7c72",
"T3T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "b6ae624dacb8f665e4f03484486dc6b79fc8f5257ae49e91e62b656575486066",
"T3T1_en_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "4e24347e5228591d498da9357d57d5a01b5445d0943c21c8512505b5652406db",
@ -19558,16 +19558,16 @@
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "19838c4a131f4d62c7dd2443562f2b8f29f94f74253b2e4edeb96ef2e5d6501d",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_abort": "4e265c664333863752796376367463d27e0bd27cec4b769c10d008f043f4952d",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "3b546816ab0eabecfa5362ce145c0d98348dfc524a70005f38ea0fb586d7e008",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "b49ed8c62af3d83fb3826f84bdfda00621b9030856b385951cc5238c59d9a7d0",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "971db3604d75697f6112cb359804a9d372a080e6085c3321d5207ba420832c6b",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "0aee3f3ac01e30b4a56e2053d8e2a6f434bd672c6a07f4434c57826e55e9d555",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "1d2a0ec3ca058c2c52f9b093b42976ba377bb634fb3483766003ad561f34c89c",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "e31d8c1996f0bc22f64c6b45f79ce6c653fad3e28f210d7dff118adde1e28d6b",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "3eb4d5b1f25458ccf003fa726efcc5be3882e04c90d67ed4266fe257e5ac5cac",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fb-ad8c45c0": "1d93919e23c2053dafe725495349ef934afd54cae89555614c7d3d169edac8d6",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-644c905b0c4da21692f06fff3-30d0f8ca": "fb3a81295319b448ce4d8540767432317cb82100538cba3161d5b65b3b1e158e",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares2-b770e0da1363247652de97a39-6af744e3": "13d1bf36c203d6d3652becdc4b4f27207ed910db99f29c0b0ad3aac8c9d3aeee",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "1ccebb6bdbd12ec5e9efca2202f20ebfd9696306ce6646598c3f3440f339ebfa",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "5e13b86617820a9ff1b5a9ac5d21092743f6c89bb523e9f17e4f88ba1e91da08",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "21558d4237f3e390b757cd01bf68ec7b00734803e8ca7237410db4bd12985924",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "d7b20289cbdf4a283f956638088899542d4232b40cf840c209454b3e11d23320",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "9593b38f658c9e26deaf140e020ef7f52febee75958193a9b0bf25a4e896ff5c",
"T3T1_en_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "912ef70c6dee6d43d75302faaffaf6953066e79ded2d41ad0c9523d1ec2a1a1f",
"T3T1_en_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "28398ee2bfc0e8774613a51155d78039657531b4a34209c457bf364c11e7a13d",
"T3T1_en_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "7a2afcb4d00fab2004cdec95f2bc3d6c5a37c2f2e9b1749982b1571b265b51a2",
"T3T1_en_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "64626ac12c65af4f17b3654ea2cb3fd487ccf62855792c5a7cf43709996024b7",
@ -19747,11 +19747,11 @@
"T3T1_en_test_basic.py::test_ping": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
"T3T1_en_test_busy_state.py::test_busy_expiry": "6509e7c943f2d09e3a5a7c69faee74c75b321ed1614d881d1ebdb57693c7f69a",
"T3T1_en_test_busy_state.py::test_busy_state": "738e905dfe55634972474416817c53f0a22a9ebec487d9046be867ab3f2576dd",
"T3T1_en_test_cancel.py::test_cancel_message_via_cancel[message0]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
"T3T1_en_test_cancel.py::test_cancel_message_via_cancel[message1]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
"T3T1_en_test_cancel.py::test_cancel_message_via_initialize[message0]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
"T3T1_en_test_cancel.py::test_cancel_message_via_initialize[message1]": "1bd3157d54327e33542f89dcac6c7cd23808f7c9aa1b0adb390e5fcc1fd858a5",
"T3T1_en_test_cancel.py::test_cancel_on_paginated": "498ffee2ea02e2783466cbb993f0cd83eedd3b67afde37b5d1f713fc996c1455",
"T3T1_en_test_cancel.py::test_cancel_message_via_cancel[message0]": "d702b0f90581cf17e0f77b4d318324a002deec42c2c5cb8860d51f6cb50f5739",
"T3T1_en_test_cancel.py::test_cancel_message_via_cancel[message1]": "3ed24b99952d25fcf0d9bd6d307c576862fe870ddb98288fa89b227f0e192073",
"T3T1_en_test_cancel.py::test_cancel_message_via_initialize[message0]": "d702b0f90581cf17e0f77b4d318324a002deec42c2c5cb8860d51f6cb50f5739",
"T3T1_en_test_cancel.py::test_cancel_message_via_initialize[message1]": "3ed24b99952d25fcf0d9bd6d307c576862fe870ddb98288fa89b227f0e192073",
"T3T1_en_test_cancel.py::test_cancel_on_paginated": "5c198919403dab5ba394a87544aaa95bdafe82959fbabdbe918c81e2d226b051",
"T3T1_en_test_debuglink.py::test_softlock_instability": "3609018ae27ce0ab9eb091384029089ad01bb097d80d9afceb7341548b935ecb",
"T3T1_en_test_firmware_hash.py::test_firmware_hash_emu": "2a63f0bd10ba99e223f571482d4af635653bb8a3bddc1d8400777ee5519bc605",
"T3T1_en_test_firmware_hash.py::test_firmware_hash_hw": "80a6e289138a604cf351a29511cf6f85e2243591317894703152787e1351a1a3",
@ -19803,7 +19803,7 @@
"T3T1_en_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "9c861a52adb748eb9ced78260726583889dabf286377b030031471b18c4fade9",
"T3T1_en_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "6e974727f6611b6d20f08fb0e3394b9457545bfef0d9c60c86655003a3fde410",
"T3T1_en_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "ac44babb407ef9d30cc1301b9a1a7c02c92e3ff2f555f4b21909814636cfe1f7",
"T3T1_en_test_msg_changepin_t2.py::test_change_failed": "5fc1a4fa6b5074dfdf76cb081c35555fd432c62237fc77179ba49595779406d2",
"T3T1_en_test_msg_changepin_t2.py::test_change_failed": "342a87f544728c242efb04e8c0e1f97ba1c55cf52299018a1928056fc37fe5ad",
"T3T1_en_test_msg_changepin_t2.py::test_change_invalid_current": "7d4521ca4be8f334a262f3bfe4b3d2eb38ba13f55a4adf75c1d6a97c04fc0090",
"T3T1_en_test_msg_changepin_t2.py::test_change_pin": "cfe12091650149ae4310c39903c67725e9983c50ae33727add8cf5476c4ad266",
"T3T1_en_test_msg_changepin_t2.py::test_remove_pin": "2ec521e63d280bd2a551b3cd01c01d58ac79cd59d14c1c6bd7a04c3040ac715c",
@ -20953,9 +20953,9 @@
"T3T1_es_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "f63d0dd2f531b73b30882b719af8f1ab7a73a2cd1cc4e2d266a7b7c44835582b",
"T3T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "0b5ee74ba3c3fb18fff92165224915df64758dcba5328c34ec45dfe83a17b2bf",
"T3T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "09ebd80dcc9d7a83ae61aba89cd6d765a49d695354eaa8de10176bb38c25e8ea",
"T3T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "44ba7cbdbb2d00f1669f37391f06c6257d72ce3c5a609ecfab561f177fe617a9",
"T3T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "b391bdf02a4a45be41d985fc4697cabbd9bd34d3119f8f798417467ed462d63c",
"T3T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "a5487ceec2a9ce0b770043324dcffa1e3939bed1f170582a81fd4f782341d85b",
"T3T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "4552050122b494d538e57bc62640480169ac23eb5bd51f9c536ede3208105f6e",
"T3T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "3b4d5727853dba24e52bcaf136b53c644b31541042cf4078233befb5474057e0",
"T3T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "9cfd571774ffe61fa707d42d29b419992ff2c1a531b5cc8b217055c9bd1c9e24",
"T3T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "c9261f4860afebaa6db020c511407422d11ed08af50082c5a3fd9cb53d610734",
"T3T1_es_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "479c5e6b88126d8fb9238f93132688d8e8433b1c2bc6e46e79554cd4bcf3f58a",
@ -20965,16 +20965,16 @@
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "2d341da46fa9a3400aecefe493183c4666f292503c1c06944f6cdad4bdb5018f",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_abort": "0b5ee74ba3c3fb18fff92165224915df64758dcba5328c34ec45dfe83a17b2bf",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "959e031abbfabd4ae6a0eb293da80b761568564d8dbb4dd2d765d03fe56c0967",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "551d3f62b3f454aa22b96e6fc0067a1c4d9dd1e8f773214d7f7452afa385620f",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "a9ae7d17cdcd24989af6bcca343dca556969abdcb6ae9c71f9f4f5fd6ce0a19c",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "3a67bc3443050f96d0c4c8a75fd530a56e10ac3475b2e0091edbf23206902e63",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "0f1c26001259b5ad5c7d76c829f98840ef44ffe2983d5421e921b4cfbd262984",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "882411d64d76e6278a6d2fff2d7aacad8cef900fc262bdf08377072a653106f2",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "94b4ea3565ba024c632f4ee9d4bf76a605090c69537844feaa3e677d79f2231b",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fb-ad8c45c0": "3b3aa844adabee59c61bfe02dd1da657d6158f6b72fe67453acf8078ed047af6",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-644c905b0c4da21692f06fff3-30d0f8ca": "92fe7a3e8d794033bc5f58551c31a1d2c5ba32ce67be30916160c49d2926043f",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares2-b770e0da1363247652de97a39-6af744e3": "12dc603108d008cfa24a397f94f0843fd749b47cc0eaa3efeb3e70a9cdcefbfc",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "985ac0579e31affe6132031a379da9f04c1800e955fffd568c5d95e9205eecff",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "c186283f2b9fd19bda632ade2c582b069b45612a074b0299a35e112e996f988a",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "089c3f2a77b2ccc054a7dd6b1ba6bb75a172a78c720c8909c9ab78652b310063",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "a8d339776a14a549cbb6db5f5dd83c8086c7ebae973e828d370cac42bdd5cab6",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "de4c354453bf85f76b439961e74e30df10302df5c7a4d6faa7fb250a0a71518d",
"T3T1_es_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "ea8998b0ab48d3886780747b949133542d4115ca9b391947e21c6e3e3462ff57",
"T3T1_es_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "7aa840499711432e69917f40c1d0681b5c2a0510098a5b155f110cb1608f4c41",
"T3T1_es_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "8ee942007e5ef72baab7fb67a4eaade25e48da2aa92ebfeda28fda4177572467",
"T3T1_es_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "d5657e597cae4958fc657bd768d179af28f3469600be95af950697f06ab83c7d",
@ -21154,11 +21154,11 @@
"T3T1_es_test_basic.py::test_ping": "3d2d3c815bfd09c3235e3749e66769dc375f49f9cc92f13f4a7b7df38e6bcfab",
"T3T1_es_test_busy_state.py::test_busy_expiry": "da280d408675fbdbaddefe467ce32f0fbd64726f8935dc5d49b9d2fe969f7585",
"T3T1_es_test_busy_state.py::test_busy_state": "cba9b124a66e083ae97eb0588259aaa7567a8fd03303d42645d9f51ce4a6a2d0",
"T3T1_es_test_cancel.py::test_cancel_message_via_cancel[message0]": "38fcd1064e016bef25510a8a5d6a9dbb4bed8ef7d9d482a59291f3769a1a621d",
"T3T1_es_test_cancel.py::test_cancel_message_via_cancel[message1]": "38fcd1064e016bef25510a8a5d6a9dbb4bed8ef7d9d482a59291f3769a1a621d",
"T3T1_es_test_cancel.py::test_cancel_message_via_initialize[message0]": "38fcd1064e016bef25510a8a5d6a9dbb4bed8ef7d9d482a59291f3769a1a621d",
"T3T1_es_test_cancel.py::test_cancel_message_via_initialize[message1]": "38fcd1064e016bef25510a8a5d6a9dbb4bed8ef7d9d482a59291f3769a1a621d",
"T3T1_es_test_cancel.py::test_cancel_on_paginated": "e7867645a35ee40b80f8a3eeaa122571367a3d3a1f850f89f5f7b14ce28522d7",
"T3T1_es_test_cancel.py::test_cancel_message_via_cancel[message0]": "1d98be5dd1e52fe5da379d1c72d6bc9065228b1d66939ee5bd2eda2fe857b679",
"T3T1_es_test_cancel.py::test_cancel_message_via_cancel[message1]": "61caffa741cf81f709e6df2818a5ace7411fef1765e14aec7dd99b13f7d1322f",
"T3T1_es_test_cancel.py::test_cancel_message_via_initialize[message0]": "1d98be5dd1e52fe5da379d1c72d6bc9065228b1d66939ee5bd2eda2fe857b679",
"T3T1_es_test_cancel.py::test_cancel_message_via_initialize[message1]": "61caffa741cf81f709e6df2818a5ace7411fef1765e14aec7dd99b13f7d1322f",
"T3T1_es_test_cancel.py::test_cancel_on_paginated": "d842630d249b84c0582c95187ad93a13bdd42c7320407a1ed552920b281f6f9a",
"T3T1_es_test_debuglink.py::test_softlock_instability": "feba60e1880714c37e5d961dbdd5f5aeaf7b283d946be44d8309daad7fee1c98",
"T3T1_es_test_firmware_hash.py::test_firmware_hash_emu": "6f9a2eb356b7054881d6b60116f6f54e4884835b3b3881c151ba6ab5f32f8560",
"T3T1_es_test_firmware_hash.py::test_firmware_hash_hw": "3d2d3c815bfd09c3235e3749e66769dc375f49f9cc92f13f4a7b7df38e6bcfab",
@ -21210,7 +21210,7 @@
"T3T1_es_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "c122f12ce28406bc09fba1e25368fe9e204a52d77d94843a885d9f2b4a97811e",
"T3T1_es_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "9367f80f31160a72981279b6642f552419bc78e5bcbfaf0cd84b4c3d2cd1fdc8",
"T3T1_es_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "73b403297a2160cc9a477626cf4170f4a8879ee35a8bfd4f5cb14037a6ee7ea9",
"T3T1_es_test_msg_changepin_t2.py::test_change_failed": "101d4a36a62dd78ae91293d802bc0ad405d65e52f50792452968fc6d7fd2039a",
"T3T1_es_test_msg_changepin_t2.py::test_change_failed": "78f4c7b8d604e4e35b316152c77a790eaa8ea04273782e493d5e4033402d5b0a",
"T3T1_es_test_msg_changepin_t2.py::test_change_invalid_current": "65051eba72b59178e2235b6fa874fcfbeb880e74e69898cd6e33a05de7ff99d4",
"T3T1_es_test_msg_changepin_t2.py::test_change_pin": "026a511c9a7eb63f41c16c69c628a07cc46040bf62fd34de5b1973b75e459e9c",
"T3T1_es_test_msg_changepin_t2.py::test_remove_pin": "e8e63e04a31f8717f2969428315c072e4881dc7faa8870966926a2c6c07c15f4",
@ -22360,9 +22360,9 @@
"T3T1_fr_reset_recovery-test_recovery_bip39_t2.py::test_tt_pin_passphrase": "b2f1b602b48bf3bcbbb12369a66ee0e0879d7a26c399c542671e9b8871f3032c",
"T3T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_abort": "85feeb0f3d4cf30430c35fd38ddfc77cfe5a14193f324ee834dc6fd1dcdee0ad",
"T3T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_extra_share_entered": "e44d77327cec2941c462cbad4db480757a6aa4b0a6f4e19f7a53ab119b172be7",
"T3T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "6960c07e518d614f09549d6ea79aab05fab24f09159bcf61f664c9fbcae33265",
"T3T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_group_threshold_reached": "14fed7b4c7883807c1b5a21afcaa2750fc91cf4659968715dbb0251ff026f3cc",
"T3T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_noabort": "ffbb0fc217ea369ddf8f48e7996acb244723b3d90f1a236995991126e9e4e248",
"T3T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "80ed26de1c7113c0d6d924fc364169a297404ce533c8a182f42d711b06a5b1ae",
"T3T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_same_share": "c4570091395a64c40b46acea1bbaba73c2eeef503b061dc2053036b0adce7b46",
"T3T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares0-c2d2e26ad06023c60145f1-afc2dad5": "615a79f6753c275585c170398c6bb00c534d593c5aed5d7b1b27b15490c82ac0",
"T3T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_secret[shares1-c41d5cf80fed71a008a3a0-eb47093e": "eb16a5b7da1ed8b24be1db79231008fa3d4b64d308b30854fe64cb6a28102b97",
"T3T1_fr_reset_recovery-test_recovery_slip39_advanced.py::test_secret_click_info_button[shares0-c2d2-850ffa77": "164a4c03716896d3db6700cf919dcde4c715ee761070e0e2cfb014f7fd516864",
@ -22372,16 +22372,16 @@
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_1of1": "8497cb8859b51d23da7237480044c6e9c7b60e87a3cb3428d57d529733767ae4",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_abort": "85feeb0f3d4cf30430c35fd38ddfc77cfe5a14193f324ee834dc6fd1dcdee0ad",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_first_share": "9f4fcd77dad26b98f5d7b0c3e29e960f8a3daaf3fb05471c5d5178547a55f3f3",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "6ab08347663a1513cf81c006d7711cc3ef25a4b8b444adb2cd1566f5c0779f33",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_invalid_mnemonic_second_share": "22fc081333652c2121954d8b97568817d30ea26b3abce510321c50acc48f9ebd",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_noabort": "434257550a35df97886608c509a1f932fa53eb6afc33df03ce4c0bd7a2c29387",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_recover_with_pin_passphrase": "60330f58f8bea3ec4a300574b7e3ef4989d18af978c23f846765824f649caf26",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "0a6cbd84a805de18273596f5daeed2e3b207f65841a679570ac99f497786b8a0",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_same_share": "ad8acb8aa44ed8b27d876e403bddfc046253549c452471dab1ee2158a28d42e0",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares0-491b795b80fc21ccdf466c0fb-ad8c45c0": "efc2f67b938680b0be58849b77752ca483893e7c42d099d7d547813dd33220ed",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares1-644c905b0c4da21692f06fff3-30d0f8ca": "dd62e134242bec58ca7b52af08bcd57db546c111a965f92db1bad489b7ae7c93",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_secret[shares2-b770e0da1363247652de97a39-6af744e3": "2aa810576ef39cb32ff6837c29b8335e84eff606055bda54c98a6303abd5f86e",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "c1695da4dd9d771c78b41f264ea13604a951c177b293e69282ddd12ee7277031",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "8c0c32f4052d35675d16e68bc2482b3f7466928cbdf22557e6adfe68fad47f5b",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "3dd8afa6b064886ca518a853d2896c42a13b8f3dcb1888772cccd6eeeef45402",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[0]": "0d71010feb919e13db7b21f9e3eca29e9b5d3247d7e506977e1dff17d63b3356",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[1]": "c86df7925da65b59a895f5fbdee03c346cc8f17e259df889c78bda69bf33b164",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic.py::test_wrong_nth_word[2]": "16154185227dd5e2dc40396740ec0b222624b81d1501a5684d0356232e495a68",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_dryrun": "69855dee7d227ed8014c64961595f76f395e1d2ff1e7eaefea672ccc448415d4",
"T3T1_fr_reset_recovery-test_recovery_slip39_basic_dryrun.py::test_2of3_invalid_seed_dryrun": "02b3a838e4b2a18991816b36778684755999f546fcce32646d8b78d0a8cbf36c",
"T3T1_fr_reset_recovery-test_reset_backup.py::test_skip_backup_manual[BackupType.Bip39-backup_flow_bip39]": "7ac21681f55e71eb1c04394f3250b4ff4b392abd8c94bb851341436eaafc4bc3",
@ -22561,11 +22561,11 @@
"T3T1_fr_test_basic.py::test_ping": "5c03427cb7e315cb2f1e036c2edb2cc7c527ac80783c331fda0749bf306bcd94",
"T3T1_fr_test_busy_state.py::test_busy_expiry": "0b142663642a8981e8fb85cf0eda771d72c9d2206cd224d170b588f32da4d8cd",
"T3T1_fr_test_busy_state.py::test_busy_state": "251609abd57665b7882e24583141737c9b6c1ca43ff75ab8bec2181e4fa3f044",
"T3T1_fr_test_cancel.py::test_cancel_message_via_cancel[message0]": "469c355dcabfba4a0f56eeb89834dfa595fcec58989f8c17e5db9a8a268a9b7f",
"T3T1_fr_test_cancel.py::test_cancel_message_via_cancel[message1]": "469c355dcabfba4a0f56eeb89834dfa595fcec58989f8c17e5db9a8a268a9b7f",
"T3T1_fr_test_cancel.py::test_cancel_message_via_initialize[message0]": "469c355dcabfba4a0f56eeb89834dfa595fcec58989f8c17e5db9a8a268a9b7f",
"T3T1_fr_test_cancel.py::test_cancel_message_via_initialize[message1]": "469c355dcabfba4a0f56eeb89834dfa595fcec58989f8c17e5db9a8a268a9b7f",
"T3T1_fr_test_cancel.py::test_cancel_on_paginated": "3547888bf963a9e458d362f218df5770e81b53ad850c462f98c00ea772ab42dd",
"T3T1_fr_test_cancel.py::test_cancel_message_via_cancel[message0]": "e2146f6ece95111d17b01b0f2e0bf720c845242c7b0791ce5c8af5e9ca63249e",
"T3T1_fr_test_cancel.py::test_cancel_message_via_cancel[message1]": "722d1df17cd5650880e8a634038c1f582229258661a26ee307a9a8d8737dc178",
"T3T1_fr_test_cancel.py::test_cancel_message_via_initialize[message0]": "e2146f6ece95111d17b01b0f2e0bf720c845242c7b0791ce5c8af5e9ca63249e",
"T3T1_fr_test_cancel.py::test_cancel_message_via_initialize[message1]": "722d1df17cd5650880e8a634038c1f582229258661a26ee307a9a8d8737dc178",
"T3T1_fr_test_cancel.py::test_cancel_on_paginated": "33d4d29b50e577aa96fdbdac167a6bd9f50351fa6cf3e1367291596051f74146",
"T3T1_fr_test_debuglink.py::test_softlock_instability": "11479b768ca4b58acf621101c18d681126bbf66581184489922df2eea1357ba5",
"T3T1_fr_test_firmware_hash.py::test_firmware_hash_emu": "a1d024203379022355feb1ecbe72d16ded27a7060cba89469b82d14e84d8eabc",
"T3T1_fr_test_firmware_hash.py::test_firmware_hash_hw": "5c03427cb7e315cb2f1e036c2edb2cc7c527ac80783c331fda0749bf306bcd94",
@ -22617,7 +22617,7 @@
"T3T1_fr_test_msg_change_wipe_code_t2.py::test_set_remove_wipe_code": "143d20c7d11e9b3246e30c2d75de7c22e658ecbd4bfb7781a6fc98c3fe2b4e1d",
"T3T1_fr_test_msg_change_wipe_code_t2.py::test_set_wipe_code_mismatch": "67d680e6ae25fd4e1d2107aea8e7e8a48ec2d25c435ce4edb8eaa2fb4150498a",
"T3T1_fr_test_msg_change_wipe_code_t2.py::test_set_wipe_code_to_pin": "9d6002b5b1f5547d0be0e83651385d800f1b27d276c1838a846002198c974798",
"T3T1_fr_test_msg_changepin_t2.py::test_change_failed": "2f36b9bc6a3103f84647c887086ccf78b468950df0709e38b3f32955756b1549",
"T3T1_fr_test_msg_changepin_t2.py::test_change_failed": "5927032c252eac56fd04ac378d7688f837fde76be4c8b296dd134dd0d00ac7f7",
"T3T1_fr_test_msg_changepin_t2.py::test_change_invalid_current": "a7a672e01a6b436411df8bd10ced9fc6d93912ce5e7e67d290a5508f6aeb5f04",
"T3T1_fr_test_msg_changepin_t2.py::test_change_pin": "db874cb9046bc9e902fe76b69d74ab3711d7b36ca83f8b077d45f11149d8ec0a",
"T3T1_fr_test_msg_changepin_t2.py::test_remove_pin": "d2e0316c1ce92ccec54631e6385c89e2d60e9e65cc1c4913e5809b3de0c1536b",

Loading…
Cancel
Save