mirror of
https://github.com/trezor/trezor-firmware.git
synced 2025-04-08 03:16:13 +00:00
WIP: chore(tests): eckhart tests
add Eckhart screen buttons rename passphrase click test file + fixtures eckhart click tests eckhart persistance tests eckhart device tests
This commit is contained in:
parent
cc8dcaeced
commit
7b7a081c17
@ -120,6 +120,7 @@ Arguments can be a list of internal model names, or one of the following shortcu
|
||||
* `safe` - Trezor Safe family
|
||||
* `safe3` - Trezor Safe 3 (covers T2B1 and T2T1)
|
||||
* `delizia` - covers the `delizia` UI (currently T3T1 only)
|
||||
* `eckhart` - covers the `eckhart` UI (currently T3W1 only)
|
||||
|
||||
You can specify a list as positional arguments, and exclude from it via `skip` keyword argument.
|
||||
|
||||
|
@ -1413,14 +1413,24 @@ def optiga_set_sec_max(client: "TrezorClient") -> None:
|
||||
|
||||
class ScreenButtons:
|
||||
def __init__(self, layout_type: LayoutType):
|
||||
assert layout_type in (LayoutType.Bolt, LayoutType.Delizia)
|
||||
assert layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart)
|
||||
self.layout_type = layout_type
|
||||
|
||||
def _width(self) -> int:
|
||||
return 240
|
||||
if self.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
return 240
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return 380
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
def _height(self) -> int:
|
||||
return 240
|
||||
if self.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
return 240
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return 520
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
def _grid(self, dim: int, grid_cells: int, cell: int) -> int:
|
||||
assert cell < grid_cells
|
||||
@ -1430,13 +1440,24 @@ class ScreenButtons:
|
||||
|
||||
# 3 columns, 4 rows, 1st row is input area
|
||||
def _grid35(self, x: int, y: int) -> Coords:
|
||||
assert x < 3, y < 5
|
||||
return self._grid(self._width(), 3, x), self._grid(self._height(), 5, y)
|
||||
|
||||
def _grid55(self, x: int, y: int) -> Coords:
|
||||
assert x < 5, y < 5
|
||||
return self._grid(self._width(), 5, x), self._grid(self._height(), 5, y)
|
||||
|
||||
# TODO: do not expose this
|
||||
# 3 columns, 3 rows, 1st row is input area
|
||||
def grid34(self, x: int, y: int) -> Coords:
|
||||
assert x < 3, y < 4
|
||||
return self._grid(self._width(), 3, x), self._grid(self._height(), 4, y)
|
||||
|
||||
# 2 columns, 3 rows, first two are header and description
|
||||
def _grid25(self, x: int, y: int) -> Coords:
|
||||
assert x < 2, y < 5
|
||||
return self._grid(self._width(), 2, x), self._grid(self._height(), 5, y)
|
||||
|
||||
# Horizontal coordinates
|
||||
def _left(self) -> int:
|
||||
return self._grid(self._width(), 3, 0)
|
||||
@ -1470,10 +1491,7 @@ class ScreenButtons:
|
||||
|
||||
# Menu/close menu button
|
||||
def menu(self) -> Coords:
|
||||
if self.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
return (215, 25)
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
return self._grid55(4, 0)
|
||||
|
||||
# Center of the screen
|
||||
def tap_to_confirm(self) -> Coords:
|
||||
@ -1482,12 +1500,20 @@ class ScreenButtons:
|
||||
|
||||
# Yes/No decision component
|
||||
def ui_yes(self) -> Coords:
|
||||
assert self.layout_type is LayoutType.Delizia
|
||||
return self.grid34(2, 2)
|
||||
if self.layout_type is LayoutType.Delizia:
|
||||
return self.grid34(2, 2)
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return self.ok()
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
def ui_no(self) -> Coords:
|
||||
assert self.layout_type is LayoutType.Delizia
|
||||
return self.grid34(0, 2)
|
||||
if self.layout_type is LayoutType.Delizia:
|
||||
return self.grid34(0, 2)
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return self.cancel()
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
# +/- buttons in number input component
|
||||
def number_input_minus(self) -> Coords:
|
||||
@ -1495,6 +1521,8 @@ class ScreenButtons:
|
||||
return (self._left(), self._grid(self._height(), 5, 1))
|
||||
elif self.layout_type is LayoutType.Delizia:
|
||||
return (self._left(), self._grid(self._height(), 5, 3))
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return self.grid34(0, 2)
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
@ -1503,6 +1531,8 @@ class ScreenButtons:
|
||||
return (self._right(), self._grid(self._height(), 5, 1))
|
||||
elif self.layout_type is LayoutType.Delizia:
|
||||
return (self._right(), self._grid(self._height(), 5, 3))
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return self.grid34(2, 2)
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
@ -1524,6 +1554,14 @@ class ScreenButtons:
|
||||
24: self.grid34(2, 2),
|
||||
33: self.grid34(2, 3),
|
||||
}
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
coords_map = {
|
||||
12: self._grid35(0, 2),
|
||||
18: self._grid35(2, 2),
|
||||
20: self._grid35(0, 3),
|
||||
24: self._grid35(2, 3),
|
||||
33: self._grid35(2, 4),
|
||||
}
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
@ -1532,10 +1570,10 @@ class ScreenButtons:
|
||||
def word_count_all_cancel(self) -> Coords:
|
||||
if self.layout_type is LayoutType.Bolt:
|
||||
return self.grid34(0, 3)
|
||||
|
||||
elif self.layout_type is LayoutType.Delizia:
|
||||
return self.grid34(0, 3)
|
||||
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return self._grid35(0, 4)
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
@ -1551,6 +1589,11 @@ class ScreenButtons:
|
||||
20: self.grid34(0, 1),
|
||||
33: self.grid34(2, 1),
|
||||
}
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
coords_map = {
|
||||
20: self._grid35(1, 2),
|
||||
33: self._grid35(1, 3),
|
||||
}
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
@ -1559,16 +1602,22 @@ class ScreenButtons:
|
||||
def word_count_repeated_cancel(self) -> Coords:
|
||||
if self.layout_type is LayoutType.Bolt:
|
||||
return self.grid34(0, 2)
|
||||
|
||||
elif self.layout_type is LayoutType.Delizia:
|
||||
return self.grid34(0, 3)
|
||||
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return self._grid35(1, 4)
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
# select word component buttons
|
||||
def word_check_words(self) -> "list[Coords]":
|
||||
if self.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
return [
|
||||
(self._mid(), self._grid(self._height(), 4, 1)),
|
||||
(self._mid(), self._grid(self._height(), 4, 2)),
|
||||
(self._mid(), self._grid(self._height(), 4, 3)),
|
||||
]
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return [
|
||||
(self._mid(), self._grid(self._height(), 5, 2)),
|
||||
(self._mid(), self._grid(self._height(), 5, 3)),
|
||||
@ -1579,13 +1628,20 @@ class ScreenButtons:
|
||||
|
||||
# vertical menu buttons
|
||||
def vertical_menu_items(self) -> "list[Coords]":
|
||||
assert self.layout_type is LayoutType.Delizia
|
||||
|
||||
return [
|
||||
(self._mid(), self._grid(self._height(), 4, 1)),
|
||||
(self._mid(), self._grid(self._height(), 4, 2)),
|
||||
(self._mid(), self._grid(self._height(), 4, 3)),
|
||||
]
|
||||
if self.layout_type is LayoutType.Delizia:
|
||||
return [
|
||||
(self._mid(), self._grid(self._height(), 4, 1)),
|
||||
(self._mid(), self._grid(self._height(), 4, 2)),
|
||||
(self._mid(), self._grid(self._height(), 4, 3)),
|
||||
]
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return [
|
||||
(self._mid(), self._grid(self._height(), 5, 1)),
|
||||
(self._mid(), self._grid(self._height(), 5, 2)),
|
||||
(self._mid(), self._grid(self._height(), 5, 3)),
|
||||
]
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
# Pin/passphrase keyboards
|
||||
def pin_passphrase_index(self, idx: int) -> Coords:
|
||||
@ -1595,7 +1651,6 @@ class ScreenButtons:
|
||||
return self.pin_passphrase_grid(idx % 3, idx // 3)
|
||||
|
||||
def pin_passphrase_grid(self, x: int, y: int) -> Coords:
|
||||
assert x < 3, y < 4
|
||||
y += 1 # first line is empty
|
||||
return self._grid35(x, y)
|
||||
|
||||
@ -1607,10 +1662,10 @@ class ScreenButtons:
|
||||
return self.pin_passphrase_grid(0, 3)
|
||||
|
||||
def passphrase_confirm(self) -> Coords:
|
||||
if self.layout_type is LayoutType.Bolt:
|
||||
if self.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
return self.pin_passphrase_grid(2, 3)
|
||||
elif self.layout_type is LayoutType.Delizia:
|
||||
return (215, 25)
|
||||
return self._grid55(4, 0)
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
@ -1619,19 +1674,34 @@ class ScreenButtons:
|
||||
|
||||
# Mnemonic keyboard
|
||||
def mnemonic_from_index(self, idx: int) -> Coords:
|
||||
assert idx < 9
|
||||
return self.mnemonic_grid(idx)
|
||||
|
||||
def mnemonic_grid(self, idx: int) -> Coords:
|
||||
assert idx < 9
|
||||
grid_x = idx % 3
|
||||
grid_y = idx // 3 + 1 # first line is empty
|
||||
return self.grid34(grid_x, grid_y)
|
||||
if self.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
return self.grid34(grid_x, grid_y)
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return self._grid35(grid_x, grid_y)
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
def mnemonic_erase(self) -> Coords:
|
||||
return (self._left(), self._top())
|
||||
if self.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
return (self._left(), self._top())
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return self._grid35(0, 4)
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
def mnemonic_confirm(self) -> Coords:
|
||||
return (self._mid(), self._top())
|
||||
if self.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
return (self._mid(), self._top())
|
||||
elif self.layout_type is LayoutType.Eckhart:
|
||||
return self._grid35(2, 4)
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
|
||||
BUTTON_LETTERS_BIP39 = ("abc", "def", "ghi", "jkl", "mno", "pqr", "stu", "vwx", "yz")
|
||||
@ -1639,9 +1709,9 @@ BUTTON_LETTERS_SLIP39 = ("ab", "cd", "ef", "ghij", "klm", "nopq", "rs", "tuv", "
|
||||
|
||||
# fmt: off
|
||||
PASSPHRASE_LOWERCASE_BOLT = (" ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", "*#")
|
||||
PASSPHRASE_LOWERCASE_DELIZIA = ("abc", "def", "ghi", "jkl", "mno", "pq", "rst", "uvw", "xyz", " *#")
|
||||
PASSPHRASE_LOWERCASE_DE = ("abc", "def", "ghi", "jkl", "mno", "pq", "rst", "uvw", "xyz", " *#")
|
||||
PASSPHRASE_UPPERCASE_BOLT = (" ", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ", "*#")
|
||||
PASSPHRASE_UPPERCASE_DELIZIA = ("ABC", "DEF", "GHI", "JKL", "MNO", "PQ", "RST", "UVW", "XYZ", " *#")
|
||||
PASSPHRASE_UPPERCASE_DE = ("ABC", "DEF", "GHI", "JKL", "MNO", "PQ", "RST", "UVW", "XYZ", " *#")
|
||||
PASSPHRASE_DIGITS = ("1", "2", "3", "4", "5", "6", "7", "8", "9", "0")
|
||||
PASSPHRASE_SPECIAL = ("_<>", ".:@", "/|\\", "!()", "+%&", "-[]", "?{}", ",'`", ";\"~", "$^=")
|
||||
# fmt: on
|
||||
@ -1655,15 +1725,15 @@ class ButtonActions:
|
||||
if char in " *#" or char.islower():
|
||||
if self.buttons.layout_type is LayoutType.Bolt:
|
||||
return PASSPHRASE_LOWERCASE_BOLT
|
||||
elif self.buttons.layout_type is LayoutType.Delizia:
|
||||
return PASSPHRASE_LOWERCASE_DELIZIA
|
||||
elif self.buttons.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
return PASSPHRASE_LOWERCASE_DE
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
elif char.isupper():
|
||||
if self.buttons.layout_type is LayoutType.Bolt:
|
||||
return PASSPHRASE_UPPERCASE_BOLT
|
||||
elif self.buttons.layout_type is LayoutType.Delizia:
|
||||
return PASSPHRASE_UPPERCASE_DELIZIA
|
||||
elif self.buttons.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
return PASSPHRASE_UPPERCASE_DE
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
elif char.isdigit():
|
||||
|
@ -91,7 +91,7 @@ T3B1 = TrezorModel(
|
||||
)
|
||||
|
||||
T3W1 = TrezorModel(
|
||||
name="T3W1",
|
||||
name="Safe 7",
|
||||
internal_name="T3W1",
|
||||
minimum_version=(2, 1, 0),
|
||||
vendors=VENDORS,
|
||||
|
@ -47,7 +47,7 @@ def get_char_category(char: str) -> PassphraseCategory:
|
||||
|
||||
|
||||
def go_next(debug: "DebugLink") -> LayoutContent:
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
debug.press_right()
|
||||
@ -59,7 +59,7 @@ def go_next(debug: "DebugLink") -> LayoutContent:
|
||||
|
||||
|
||||
def go_back(debug: "DebugLink", r_middle: bool = False) -> LayoutContent:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.cancel())
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
if r_middle:
|
||||
@ -114,7 +114,7 @@ def _carousel_steps(current_index: int, wanted_index: int, length: int) -> int:
|
||||
|
||||
|
||||
def unlock_gesture(debug: "DebugLink") -> LayoutContent:
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
debug.press_right()
|
||||
|
@ -15,11 +15,15 @@ DELETE_BTN_TEXTS = ("inputs__delete", "inputs__previous")
|
||||
def enter_word(
|
||||
debug: "DebugLink", word: str, is_slip39: bool = False
|
||||
) -> "LayoutContent":
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
typed_word = word[:4]
|
||||
for coords in debug.button_actions.type_word(typed_word, is_slip39=is_slip39):
|
||||
debug.click(coords)
|
||||
if debug.layout_type is LayoutType.Delizia and not is_slip39 and len(word) > 4:
|
||||
if (
|
||||
debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart)
|
||||
and not is_slip39
|
||||
and len(word) > 4
|
||||
):
|
||||
# T3T1 (delizia) BIP39 keyboard allows to "confirm" only if the word is fully written, you need to click the word to auto-complete
|
||||
debug.click(debug.screen_buttons.mnemonic_confirm())
|
||||
debug.click(debug.screen_buttons.mnemonic_confirm())
|
||||
@ -53,7 +57,7 @@ def enter_word(
|
||||
def confirm_recovery(debug: "DebugLink", title: str = "recovery__title") -> None:
|
||||
layout = debug.read_layout()
|
||||
assert TR.translate(title) == layout.title()
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.swipe_up()
|
||||
@ -80,7 +84,7 @@ def cancel_select_number_of_words(
|
||||
assert layout.title() == TR.word_count__title
|
||||
# navigate to the number and confirm it
|
||||
debug.press_left()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
elif debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
# click the button from ValuePad
|
||||
if unlock_repeated_backup:
|
||||
coords = debug.screen_buttons.word_count_repeated_cancel()
|
||||
@ -99,7 +103,12 @@ def select_number_of_words(
|
||||
layout = debug.read_layout()
|
||||
assert TR.recovery__num_of_words in layout.text_content()
|
||||
|
||||
def select_bolt() -> "LayoutContent":
|
||||
def select_bde() -> "LayoutContent":
|
||||
assert debug.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
)
|
||||
# click the button from ValuePad
|
||||
if unlock_repeated_backup:
|
||||
coords = debug.screen_buttons.word_count_repeated_word(num_of_words)
|
||||
@ -110,6 +119,7 @@ def select_number_of_words(
|
||||
return debug.read_layout()
|
||||
|
||||
def select_caesar() -> "LayoutContent":
|
||||
assert debug.layout_type is LayoutType.Caesar
|
||||
# navigate to the number and confirm it
|
||||
word_options = (20, 33) if unlock_repeated_backup else (12, 18, 20, 24, 33)
|
||||
index = word_options.index(num_of_words)
|
||||
@ -118,24 +128,13 @@ def select_number_of_words(
|
||||
debug.press_middle()
|
||||
return debug.read_layout()
|
||||
|
||||
def select_delizia() -> "LayoutContent":
|
||||
# click the button from ValuePad
|
||||
if unlock_repeated_backup:
|
||||
coords = debug.screen_buttons.word_count_repeated_word(num_of_words)
|
||||
else:
|
||||
coords = debug.screen_buttons.word_count_all_word(num_of_words)
|
||||
debug.click(coords)
|
||||
return debug.read_layout()
|
||||
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
layout = select_bolt()
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
layout = select_bde()
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
debug.press_right()
|
||||
layout = debug.read_layout()
|
||||
assert layout.title() == TR.word_count__title
|
||||
layout = select_caesar()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
layout = select_delizia()
|
||||
else:
|
||||
raise ValueError("Unknown model")
|
||||
|
||||
@ -168,7 +167,11 @@ def enter_share(
|
||||
is_first: bool = True,
|
||||
before_title: str = "recovery__title_recover",
|
||||
) -> "LayoutContent":
|
||||
if debug.layout_type is LayoutType.Caesar:
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
assert TR.translate(before_title) in debug.read_layout().title()
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
layout = debug.read_layout()
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
assert TR.translate(before_title) in debug.read_layout().title()
|
||||
layout = debug.read_layout()
|
||||
for _ in range(layout.page_count()):
|
||||
@ -177,10 +180,11 @@ def enter_share(
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.swipe_up()
|
||||
layout = debug.read_layout()
|
||||
else:
|
||||
assert TR.translate(before_title) in debug.read_layout().title()
|
||||
elif debug.layout_type is LayoutType.Eckhart:
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
layout = debug.read_layout()
|
||||
else:
|
||||
raise ValueError("Unknown model")
|
||||
|
||||
assert "MnemonicKeyboard" in layout.all_components()
|
||||
|
||||
@ -210,12 +214,18 @@ def enter_shares(
|
||||
)
|
||||
if index < len(shares) - 1:
|
||||
# FIXME: when ui-t3t1 done for shamir, we want to check the template below
|
||||
assert TR.translate(enter_share_before_title) in debug.read_layout().title()
|
||||
# TR.assert_in(
|
||||
# debug.read_layout().text_content(),
|
||||
# "recovery__x_of_y_entered_template",
|
||||
# template=(index + 1, len(shares)),
|
||||
# )
|
||||
if debug.layout_type is LayoutType.Eckhart:
|
||||
assert (
|
||||
TR.translate("recovery__x_of_y_entered_template").format(
|
||||
index + 1, len(shares)
|
||||
)
|
||||
in debug.read_layout().text_content()
|
||||
)
|
||||
else:
|
||||
assert (
|
||||
TR.translate(enter_share_before_title)
|
||||
in debug.read_layout().title()
|
||||
)
|
||||
|
||||
assert TR.translate(after_layout_text) in debug.read_layout().text_content()
|
||||
|
||||
@ -231,7 +241,6 @@ def enter_seed(
|
||||
|
||||
for word in seed_words:
|
||||
enter_word(debug, word, is_slip39=is_slip39)
|
||||
|
||||
assert TR.translate(after_layout_text) in debug.read_layout().text_content()
|
||||
|
||||
|
||||
@ -272,8 +281,8 @@ def enter_seed_previous_correct(
|
||||
layout = debug.read_layout()
|
||||
debug.press_middle()
|
||||
layout = debug.read_layout()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.click(debug.screen_buttons.mnemonic_erase()) # Top-left
|
||||
elif debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.mnemonic_erase())
|
||||
for _ in range(len(bad_word)):
|
||||
debug.click(debug.screen_buttons.mnemonic_erase())
|
||||
continue
|
||||
@ -299,7 +308,7 @@ def prepare_enter_seed(
|
||||
or TR.recovery__enter_each_word in debug.read_layout().text_content()
|
||||
or TR.translate(layout_text) in debug.read_layout().text_content()
|
||||
)
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.swipe_up()
|
||||
@ -310,6 +319,8 @@ def prepare_enter_seed(
|
||||
debug.press_right()
|
||||
layout = debug.read_layout()
|
||||
assert "MnemonicKeyboard" in layout.all_components()
|
||||
else:
|
||||
raise ValueError("Unknown model")
|
||||
|
||||
|
||||
def finalize(debug: "DebugLink") -> None:
|
||||
@ -336,7 +347,7 @@ def cancel_recovery(debug: "DebugLink", recovery_type: str = "dry_run") -> None:
|
||||
assert cancel_title in layout.title()
|
||||
for _ in range(layout.page_count()):
|
||||
debug.press_right()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
elif debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
# go to menu
|
||||
debug.click(debug.screen_buttons.menu())
|
||||
layout = debug.read_layout()
|
||||
|
@ -13,7 +13,7 @@ if TYPE_CHECKING:
|
||||
|
||||
def confirm_new_wallet(debug: "DebugLink") -> None:
|
||||
assert debug.read_layout().title() == TR.reset__title_create_wallet
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.swipe_up()
|
||||
@ -27,13 +27,13 @@ def confirm_new_wallet(debug: "DebugLink") -> None:
|
||||
)
|
||||
if debug.layout_type is LayoutType.Delizia:
|
||||
debug.swipe_up()
|
||||
elif debug.layout_type is LayoutType.Eckhart:
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
|
||||
|
||||
def confirm_read(debug: "DebugLink", middle_r: bool = False) -> None:
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.swipe_up()
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
page_count = debug.read_layout().page_count()
|
||||
if page_count > 1:
|
||||
@ -43,6 +43,10 @@ def confirm_read(debug: "DebugLink", middle_r: bool = False) -> None:
|
||||
debug.press_middle()
|
||||
else:
|
||||
debug.press_right()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.swipe_up()
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
|
||||
|
||||
def cancel_backup(
|
||||
@ -51,20 +55,29 @@ def cancel_backup(
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
debug.click(debug.screen_buttons.cancel())
|
||||
debug.click(debug.screen_buttons.cancel())
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
debug.press_left()
|
||||
debug.press_left()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.click(debug.screen_buttons.menu())
|
||||
debug.click(debug.screen_buttons.vertical_menu_items()[0])
|
||||
if confirm:
|
||||
debug.swipe_up()
|
||||
debug.click(debug.screen_buttons.tap_to_confirm())
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
debug.press_left()
|
||||
debug.press_left()
|
||||
elif debug.layout_type is LayoutType.Eckhart:
|
||||
debug.click(debug.screen_buttons.menu())
|
||||
debug.click(debug.screen_buttons.vertical_menu_items()[0])
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
|
||||
|
||||
def set_selection(debug: "DebugLink", diff: int) -> None:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
assert "NumberInputDialog" in debug.read_layout().all_components()
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
if debug.layout_type is LayoutType.Eckhart:
|
||||
assert "NumberInputScreen" in debug.read_layout().all_components()
|
||||
else:
|
||||
assert "NumberInputDialog" in debug.read_layout().all_components()
|
||||
|
||||
button = (
|
||||
debug.screen_buttons.number_input_minus()
|
||||
@ -75,7 +88,7 @@ def set_selection(debug: "DebugLink", diff: int) -> None:
|
||||
|
||||
for _ in range(diff):
|
||||
debug.click(button)
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
else:
|
||||
debug.swipe_up()
|
||||
@ -96,6 +109,8 @@ def set_selection(debug: "DebugLink", diff: int) -> None:
|
||||
for _ in range(diff):
|
||||
debug.press_right()
|
||||
debug.press_middle()
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
|
||||
|
||||
def read_words(debug: "DebugLink", do_htc: bool = True) -> list[str]:
|
||||
@ -105,23 +120,31 @@ def read_words(debug: "DebugLink", do_htc: bool = True) -> list[str]:
|
||||
debug.press_right()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.swipe_up()
|
||||
elif debug.layout_type is LayoutType.Eckhart:
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
|
||||
# Swiping through all the pages and loading the words
|
||||
layout = debug.read_layout()
|
||||
for _ in range(layout.page_count() - 1):
|
||||
words.extend(layout.seed_words())
|
||||
debug.swipe_up()
|
||||
if debug.layout_type is LayoutType.Eckhart:
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
else:
|
||||
debug.swipe_up()
|
||||
|
||||
layout = debug.read_layout()
|
||||
assert layout is not None
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
words.extend(layout.seed_words())
|
||||
|
||||
if debug.layout_type is LayoutType.Delizia:
|
||||
debug.swipe_up()
|
||||
elif debug.layout_type is LayoutType.Eckhart:
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
|
||||
# There is hold-to-confirm button
|
||||
if do_htc:
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok(), hold_ms=1500)
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.click(debug.screen_buttons.tap_to_confirm())
|
||||
@ -138,6 +161,12 @@ def read_words(debug: "DebugLink", do_htc: bool = True) -> list[str]:
|
||||
def confirm_words(debug: "DebugLink", words: list[str]) -> None:
|
||||
if debug.layout_type is LayoutType.Delizia:
|
||||
debug.swipe_up()
|
||||
elif debug.layout_type is LayoutType.Eckhart:
|
||||
# Press ok if the select word screen is not yet present
|
||||
if not TR.regexp("reset__select_word_template").match(
|
||||
debug.read_layout().subtitle()
|
||||
):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
|
||||
layout = debug.read_layout()
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
@ -158,22 +187,6 @@ def confirm_words(debug: "DebugLink", words: list[str]) -> None:
|
||||
button_pos = btn_texts.index(wanted_word)
|
||||
debug.click(debug.screen_buttons.word_check_words()[button_pos])
|
||||
layout = debug.read_layout()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
assert TR.regexp("reset__select_word_x_of_y_template").match(layout.subtitle())
|
||||
for _ in range(3):
|
||||
# "Select word 3 of 20"
|
||||
# ^
|
||||
word_pos_match = re.search(r"\d+", debug.read_layout().subtitle())
|
||||
assert word_pos_match is not None
|
||||
word_pos = int(word_pos_match.group(0))
|
||||
# Unifying both the buttons and words to lowercase
|
||||
btn_texts = [
|
||||
text.lower() for text in layout.tt_check_seed_button_contents()
|
||||
]
|
||||
wanted_word = words[word_pos - 1].lower()
|
||||
button_pos = btn_texts.index(wanted_word)
|
||||
debug.click(debug.screen_buttons.vertical_menu_items()[button_pos])
|
||||
layout = debug.read_layout()
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
assert TR.reset__select_correct_word in layout.text_content()
|
||||
debug.press_right()
|
||||
@ -193,6 +206,43 @@ def confirm_words(debug: "DebugLink", words: list[str]) -> None:
|
||||
|
||||
debug.press_middle()
|
||||
layout = debug.read_layout()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
assert TR.regexp("reset__select_word_x_of_y_template").match(layout.subtitle())
|
||||
for _ in range(3):
|
||||
# "Select word 3 of 20"
|
||||
# ^
|
||||
word_pos_match = re.search(r"\d+", debug.read_layout().subtitle())
|
||||
assert word_pos_match is not None
|
||||
word_pos = int(word_pos_match.group(0))
|
||||
# Unifying both the buttons and words to lowercase
|
||||
btn_texts = [
|
||||
text.lower() for text in layout.tt_check_seed_button_contents()
|
||||
]
|
||||
wanted_word = words[word_pos - 1].lower()
|
||||
button_pos = btn_texts.index(wanted_word)
|
||||
debug.click(debug.screen_buttons.word_check_words()[button_pos])
|
||||
layout = debug.read_layout()
|
||||
elif debug.layout_type is LayoutType.Eckhart:
|
||||
assert TR.regexp("reset__select_word_template").match(
|
||||
debug.read_layout().subtitle()
|
||||
)
|
||||
|
||||
for _ in range(3):
|
||||
# "Select word 3 of 20"
|
||||
# ^
|
||||
word_pos_match = re.search(r"\d+", debug.read_layout().subtitle())
|
||||
assert word_pos_match is not None
|
||||
word_pos = int(word_pos_match.group(0))
|
||||
# Unifying both the buttons and words to lowercase
|
||||
btn_texts = [
|
||||
text.lower() for text in layout.tt_check_seed_button_contents()
|
||||
]
|
||||
wanted_word = words[word_pos - 1].lower()
|
||||
button_pos = btn_texts.index(wanted_word)
|
||||
debug.click(debug.screen_buttons.word_check_words()[button_pos])
|
||||
layout = debug.read_layout()
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
|
||||
|
||||
def validate_mnemonics(mnemonics: list[str], expected_ems: bytes) -> None:
|
||||
|
@ -74,7 +74,7 @@ def set_autolock_delay(device_handler: "BackgroundDeviceHandler", delay_ms: int)
|
||||
debug.input("1234")
|
||||
|
||||
assert TR.regexp("auto_lock__change_template").match(
|
||||
debug.read_layout().text_content()
|
||||
debug.read_layout().text_content().strip()
|
||||
)
|
||||
|
||||
layout = go_next(debug)
|
||||
@ -113,7 +113,7 @@ def test_autolock_interrupts_signing(device_handler: "BackgroundDeviceHandler"):
|
||||
in debug.read_layout().text_content().replace(" ", "")
|
||||
)
|
||||
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
layout = debug.read_layout()
|
||||
@ -131,6 +131,8 @@ def test_autolock_interrupts_signing(device_handler: "BackgroundDeviceHandler"):
|
||||
layout = debug.read_layout()
|
||||
assert TR.send__total_amount in layout.text_content()
|
||||
assert "0.0039 BTC" in layout.text_content()
|
||||
else:
|
||||
raise ValueError(f"Unsupported layout type: {debug.layout_type}")
|
||||
|
||||
# wait for autolock to kick in
|
||||
time.sleep(10.1)
|
||||
@ -168,7 +170,7 @@ def test_autolock_does_not_interrupt_signing(device_handler: "BackgroundDeviceHa
|
||||
in debug.read_layout().text_content().replace(" ", "")
|
||||
)
|
||||
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
layout = debug.read_layout()
|
||||
@ -187,6 +189,8 @@ def test_autolock_does_not_interrupt_signing(device_handler: "BackgroundDeviceHa
|
||||
layout = debug.read_layout()
|
||||
assert TR.send__total_amount in layout.text_content()
|
||||
assert "0.0039 BTC" in layout.text_content()
|
||||
else:
|
||||
raise ValueError(f"Unsupported layout type: {debug.layout_type}")
|
||||
|
||||
def sleepy_filter(msg: MessageType) -> MessageType:
|
||||
time.sleep(10.1)
|
||||
@ -196,12 +200,14 @@ def test_autolock_does_not_interrupt_signing(device_handler: "BackgroundDeviceHa
|
||||
with device_handler.client:
|
||||
device_handler.client.set_filter(messages.TxAck, sleepy_filter)
|
||||
# confirm transaction
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.click(debug.screen_buttons.tap_to_confirm())
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
debug.press_middle()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
debug.click(debug.screen_buttons.tap_to_confirm())
|
||||
else:
|
||||
raise ValueError(f"Unsupported layout type: {debug.layout_type}")
|
||||
|
||||
signatures, tx = device_handler.result()
|
||||
assert len(signatures) == 1
|
||||
@ -227,7 +233,11 @@ def test_autolock_passphrase_keyboard(device_handler: "BackgroundDeviceHandler")
|
||||
# enter passphrase - slowly
|
||||
# keep clicking for long enough to trigger the autolock if it incorrectly ignored key presses
|
||||
for _ in range(math.ceil(11 / 1.5)):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
# click at "j"
|
||||
debug.click(_passphrase_j(debug))
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
@ -235,10 +245,13 @@ def test_autolock_passphrase_keyboard(device_handler: "BackgroundDeviceHandler")
|
||||
# NOTE: because of passphrase randomization it would be a pain to input
|
||||
# a specific passphrase, which is not in scope for this test.
|
||||
debug.press_right()
|
||||
else:
|
||||
raise ValueError(f"Unsupported layout type: {debug.layout_type}")
|
||||
|
||||
time.sleep(1.5)
|
||||
|
||||
# Send the passphrase to the client (TT has it clicked already, TR needs to input it)
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.passphrase_confirm())
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
debug.input("j" * 8)
|
||||
@ -264,15 +277,24 @@ def test_autolock_interrupts_passphrase(device_handler: "BackgroundDeviceHandler
|
||||
# enter passphrase - slowly
|
||||
# autolock must activate even if we pressed some buttons
|
||||
for _ in range(math.ceil(6 / 1.5)):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
debug.click(_center_button(debug))
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
debug.press_middle()
|
||||
else:
|
||||
raise ValueError(f"Unsupported layout type: {debug.layout_type}")
|
||||
time.sleep(1.5)
|
||||
|
||||
# wait for autolock to kick in
|
||||
time.sleep(10.1)
|
||||
assert debug.read_layout().main_component() == "Lockscreen"
|
||||
if debug.layout_type is LayoutType.Eckhart:
|
||||
assert debug.read_layout().main_component() == "Homescreen"
|
||||
else:
|
||||
assert debug.read_layout().main_component() == "Lockscreen"
|
||||
with pytest.raises(exceptions.Cancelled):
|
||||
device_handler.result()
|
||||
|
||||
@ -303,7 +325,10 @@ def test_dryrun_locks_at_number_of_words(device_handler: "BackgroundDeviceHandle
|
||||
|
||||
# wait for autolock to trigger
|
||||
time.sleep(10.1)
|
||||
assert debug.read_layout().main_component() == "Lockscreen"
|
||||
if debug.layout_type is LayoutType.Eckhart:
|
||||
assert debug.read_layout().main_component() == "Homescreen"
|
||||
else:
|
||||
assert debug.read_layout().main_component() == "Lockscreen"
|
||||
with pytest.raises(exceptions.Cancelled):
|
||||
device_handler.result()
|
||||
|
||||
@ -333,17 +358,22 @@ def test_dryrun_locks_at_word_entry(device_handler: "BackgroundDeviceHandler"):
|
||||
# select 20 words
|
||||
recovery.select_number_of_words(debug, 20)
|
||||
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
layout = go_next(debug)
|
||||
assert layout.main_component() == "MnemonicKeyboard"
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
debug.press_right()
|
||||
layout = debug.read_layout()
|
||||
assert "MnemonicKeyboard" in layout.all_components()
|
||||
else:
|
||||
raise ValueError(f"Unsupported layout type: {debug.layout_type}")
|
||||
|
||||
# make sure keyboard locks
|
||||
time.sleep(10.1)
|
||||
assert debug.read_layout().main_component() == "Lockscreen"
|
||||
if debug.layout_type is LayoutType.Eckhart:
|
||||
assert debug.read_layout().main_component() == "Homescreen"
|
||||
else:
|
||||
assert debug.read_layout().main_component() == "Lockscreen"
|
||||
with pytest.raises(exceptions.Cancelled):
|
||||
device_handler.result()
|
||||
|
||||
@ -360,7 +390,7 @@ def test_dryrun_enter_word_slowly(device_handler: "BackgroundDeviceHandler"):
|
||||
# select 20 words
|
||||
recovery.select_number_of_words(debug, 20)
|
||||
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
layout = debug.read_layout()
|
||||
assert layout.main_component() == "MnemonicKeyboard"
|
||||
|
@ -80,7 +80,7 @@ def test_backup_slip39_custom(
|
||||
# confirm backup configuration
|
||||
if share_count > 1:
|
||||
assert TR.regexp("reset__create_x_of_y_multi_share_backup_template").match(
|
||||
debug.read_layout().text_content()
|
||||
debug.read_layout().text_content().strip()
|
||||
)
|
||||
else:
|
||||
assert TR.regexp("backup__info_single_share_backup").match(
|
||||
@ -106,9 +106,12 @@ def test_backup_slip39_custom(
|
||||
all_words.append(" ".join(words))
|
||||
|
||||
# confirm backup done
|
||||
if debug.layout_type is LayoutType.Delizia and share_count > 1:
|
||||
if (
|
||||
debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart)
|
||||
and share_count > 1
|
||||
):
|
||||
reset.confirm_read(debug)
|
||||
elif debug.layout_type is not LayoutType.Delizia:
|
||||
elif debug.layout_type not in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
reset.confirm_read(debug)
|
||||
|
||||
# generate secret locally
|
||||
|
@ -31,7 +31,7 @@ if TYPE_CHECKING:
|
||||
from ..device_handler import BackgroundDeviceHandler
|
||||
|
||||
|
||||
pytestmark = pytest.mark.models("t2t1", "delizia")
|
||||
pytestmark = pytest.mark.models("t2t1", "delizia", "eckhart")
|
||||
|
||||
KEYBOARD_CATEGORIES_BOLT = [
|
||||
PassphraseCategory.DIGITS,
|
||||
@ -40,7 +40,8 @@ KEYBOARD_CATEGORIES_BOLT = [
|
||||
PassphraseCategory.SPECIAL,
|
||||
]
|
||||
|
||||
KEYBOARD_CATEGORIES_DELIZIA = [
|
||||
# Common for Delizia and Eckhart
|
||||
KEYBOARD_CATEGORIES_DE = [
|
||||
PassphraseCategory.LOWERCASE,
|
||||
PassphraseCategory.UPPERCASE,
|
||||
PassphraseCategory.DIGITS,
|
||||
@ -90,8 +91,8 @@ def prepare_passphrase_dialogue(
|
||||
def keyboard_categories(layout_type: LayoutType) -> list[PassphraseCategory]:
|
||||
if layout_type is LayoutType.Bolt:
|
||||
return KEYBOARD_CATEGORIES_BOLT
|
||||
elif layout_type is LayoutType.Delizia:
|
||||
return KEYBOARD_CATEGORIES_DELIZIA
|
||||
elif layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
return KEYBOARD_CATEGORIES_DE
|
||||
else:
|
||||
raise ValueError("Wrong layout type")
|
||||
|
||||
@ -157,7 +158,7 @@ def enter_passphrase(debug: "DebugLink") -> None:
|
||||
"""Enter a passphrase"""
|
||||
is_empty: bool = len(debug.read_layout().passphrase()) == 0
|
||||
debug.click(debug.screen_buttons.passphrase_confirm())
|
||||
if is_empty and debug.layout_type is LayoutType.Delizia:
|
||||
if is_empty and debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.ui_yes())
|
||||
|
||||
|
||||
@ -200,7 +201,7 @@ def test_passphrase_delete(device_handler: "BackgroundDeviceHandler"):
|
||||
|
||||
for _ in range(4):
|
||||
delete_char(debug)
|
||||
if debug.layout_type is LayoutType.Delizia:
|
||||
if debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
debug.read_layout()
|
||||
|
||||
input_passphrase(debug, CommonPass.SHORT[8 - 4 :])
|
||||
@ -231,7 +232,7 @@ def test_passphrase_loop_all_characters(device_handler: "BackgroundDeviceHandler
|
||||
PassphraseCategory.SPECIAL,
|
||||
):
|
||||
go_to_category(debug, category)
|
||||
if debug.layout_type is LayoutType.Delizia:
|
||||
if debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
debug.read_layout()
|
||||
|
||||
enter_passphrase(debug)
|
@ -95,7 +95,7 @@ def prepare(
|
||||
# Any action triggering the PIN dialogue
|
||||
device_handler.run(device.apply_settings, auto_lock_delay_ms=300_000) # type: ignore
|
||||
tap = True
|
||||
if situation == Situation.PIN_INPUT_CANCEL:
|
||||
elif situation == Situation.PIN_INPUT_CANCEL:
|
||||
# Any action triggering the PIN dialogue
|
||||
device_handler.run(device.apply_settings, auto_lock_delay_ms=300_000) # type: ignore
|
||||
elif situation == Situation.PIN_SETUP:
|
||||
@ -105,13 +105,19 @@ def prepare(
|
||||
TR.pin__turn_on in debug.read_layout().text_content()
|
||||
or TR.pin__info in debug.read_layout().text_content()
|
||||
)
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
go_next(debug)
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
go_next(debug)
|
||||
go_next(debug)
|
||||
go_next(debug)
|
||||
go_next(debug)
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
elif situation == Situation.PIN_CHANGE:
|
||||
# Change PIN
|
||||
device_handler.run(device.change_pin) # type: ignore
|
||||
@ -153,7 +159,7 @@ def _input_pin(debug: "DebugLink", pin: str, check: bool = False) -> None:
|
||||
"""Input the PIN"""
|
||||
if check:
|
||||
before = debug.read_layout().pin()
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
digits_order = debug.read_layout().tt_pin_digits_order()
|
||||
for digit in pin:
|
||||
digit_index = digits_order.index(digit)
|
||||
@ -162,6 +168,8 @@ def _input_pin(debug: "DebugLink", pin: str, check: bool = False) -> None:
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
for digit in pin:
|
||||
navigate_to_action_and_press(debug, digit, TR_PIN_ACTIONS)
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
|
||||
if check:
|
||||
after = debug.read_layout().pin()
|
||||
@ -170,10 +178,12 @@ def _input_pin(debug: "DebugLink", pin: str, check: bool = False) -> None:
|
||||
|
||||
def _see_pin(debug: "DebugLink") -> None:
|
||||
"""Navigate to "SHOW" and press it"""
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.pin_passphrase_input())
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
navigate_to_action_and_press(debug, SHOW, TR_PIN_ACTIONS)
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
|
||||
|
||||
def _delete_pin(debug: "DebugLink", digits_to_delete: int, check: bool = True) -> None:
|
||||
@ -182,10 +192,16 @@ def _delete_pin(debug: "DebugLink", digits_to_delete: int, check: bool = True) -
|
||||
before = debug.read_layout().pin()
|
||||
|
||||
for _ in range(digits_to_delete):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
debug.click(debug.screen_buttons.pin_passphrase_erase())
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
navigate_to_action_and_press(debug, DELETE, TR_PIN_ACTIONS)
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
|
||||
if check:
|
||||
after = debug.read_layout().pin()
|
||||
@ -194,13 +210,15 @@ def _delete_pin(debug: "DebugLink", digits_to_delete: int, check: bool = True) -
|
||||
|
||||
def _delete_all(debug: "DebugLink", check: bool = True) -> None:
|
||||
"""Navigate to "DELETE" and hold it until all digits are deleted"""
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
debug.click(
|
||||
debug.screen_buttons.pin_passphrase_erase(),
|
||||
hold_ms=1500,
|
||||
)
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
navigate_to_action_and_press(debug, DELETE, TR_PIN_ACTIONS, hold_ms=1000)
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
|
||||
if check:
|
||||
after = debug.read_layout().pin()
|
||||
@ -221,10 +239,12 @@ def _cancel_pin(debug: "DebugLink") -> None:
|
||||
|
||||
def _confirm_pin(debug: "DebugLink") -> None:
|
||||
"""Navigate to "ENTER" and press it"""
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if debug.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
debug.click(debug.screen_buttons.pin_confirm())
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
navigate_to_action_and_press(debug, ENTER, TR_PIN_ACTIONS)
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
|
||||
|
||||
def _input_see_confirm(debug: "DebugLink", pin: str) -> None:
|
||||
@ -326,15 +346,18 @@ def test_pin_setup(device_handler: "BackgroundDeviceHandler"):
|
||||
def test_pin_setup_mismatch(device_handler: "BackgroundDeviceHandler"):
|
||||
with PIN_CANCELLED, prepare(device_handler, Situation.PIN_SETUP) as debug:
|
||||
_enter_two_times(debug, "1", "2")
|
||||
if debug.layout_type is LayoutType.Bolt:
|
||||
if debug.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
go_next(debug)
|
||||
_cancel_pin(debug)
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
debug.press_middle()
|
||||
debug.press_no()
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
go_next(debug)
|
||||
_cancel_pin(debug)
|
||||
else:
|
||||
raise RuntimeError("Unknown model")
|
||||
|
||||
|
||||
@pytest.mark.setup_client(pin="1")
|
||||
|
@ -210,6 +210,8 @@ def read_and_confirm_mnemonic(
|
||||
mnemonic = yield from read_mnemonic_from_screen_caesar(debug)
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
mnemonic = yield from read_mnemonic_from_screen_delizia(debug)
|
||||
elif debug.layout_type is LayoutType.Eckhart:
|
||||
mnemonic = yield from read_mnemonic_from_screen_eckhart(debug)
|
||||
else:
|
||||
raise ValueError(f"Unknown model: {debug.layout_type}")
|
||||
|
||||
@ -277,6 +279,25 @@ def read_mnemonic_from_screen_delizia(
|
||||
return mnemonic
|
||||
|
||||
|
||||
def read_mnemonic_from_screen_eckhart(
|
||||
debug: "DebugLink",
|
||||
) -> Generator[None, "ButtonRequest", list[str]]:
|
||||
mnemonic: list[str] = []
|
||||
br = yield
|
||||
assert br.pages is not None
|
||||
|
||||
debug.read_layout()
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
|
||||
for _ in range(br.pages - 2):
|
||||
words = debug.read_layout().seed_words()
|
||||
mnemonic.extend(words)
|
||||
debug.click(debug.screen_buttons.ok())
|
||||
|
||||
debug.press_yes()
|
||||
return mnemonic
|
||||
|
||||
|
||||
def check_share(
|
||||
debug: "DebugLink", mnemonic: list[str], choose_wrong: bool = False
|
||||
) -> bool:
|
||||
@ -294,7 +315,7 @@ def check_share(
|
||||
elif debug.layout_type is LayoutType.Caesar:
|
||||
# other models have the instruction in the title/subtitle
|
||||
word_pos_match = re.search(re_num_of_word, debug.read_layout().title())
|
||||
elif debug.layout_type is LayoutType.Delizia:
|
||||
elif debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
word_pos_match = re.search(re_num_of_word, debug.read_layout().subtitle())
|
||||
else:
|
||||
word_pos_match = None
|
||||
@ -319,7 +340,7 @@ def click_info_button_bolt(debug: "DebugLink") -> Generator[Any, Any, ButtonRequ
|
||||
return (yield)
|
||||
|
||||
|
||||
def click_info_button_delizia(debug: "DebugLink"):
|
||||
def click_info_button_delizia_eckhart(debug: "DebugLink"):
|
||||
"""Click Shamir backup info button and return back."""
|
||||
debug.click(debug.screen_buttons.menu())
|
||||
layout = debug.read_layout()
|
||||
|
@ -178,7 +178,7 @@ class ModelsFilter:
|
||||
"t1": {models.T1B1},
|
||||
"t2": {models.T2T1},
|
||||
"tt": {models.T2T1},
|
||||
"safe": {models.T2B1, models.T3T1, models.T3B1},
|
||||
"safe": {models.T2B1, models.T3T1, models.T3B1, models.T3W1},
|
||||
"safe3": {models.T2B1, models.T3B1},
|
||||
"safe5": {models.T3T1},
|
||||
"delizia": {models.T3T1},
|
||||
|
@ -406,7 +406,7 @@ def test_signmessage_pagination(client: Client, message: str, is_long: bool):
|
||||
|
||||
# We cannot differentiate between a newline and space in the message read from Trezor.
|
||||
# TODO: do the check also for T2B1
|
||||
if client.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if client.layout_type in (LayoutType.Bolt, LayoutType.Delizia, LayoutType.Eckhart):
|
||||
message_read = IF.message_read.replace(" ", "").replace("...", "")
|
||||
signed_message = message.replace("\n", "").replace(" ", "")
|
||||
assert signed_message in message_read
|
||||
|
@ -40,7 +40,7 @@ def show_details_input_flow(client: Client):
|
||||
elif client.layout_type is LayoutType.Caesar:
|
||||
# Caesar - right button for "Show all"
|
||||
client.debug.press_yes()
|
||||
elif client.layout_type is LayoutType.Delizia:
|
||||
elif client.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
# Delizia - "Show all" button from context menu
|
||||
client.debug.click(client.debug.screen_buttons.menu())
|
||||
client.debug.click(client.debug.screen_buttons.vertical_menu_items()[0])
|
||||
|
@ -28,7 +28,10 @@ from ...common import MNEMONIC12
|
||||
def test_encrypt(client: Client):
|
||||
def input_flow():
|
||||
assert (yield).name == "cipher_key_value"
|
||||
assert client.debug.read_layout().text_content() == TR.misc__enable_labeling
|
||||
assert (
|
||||
client.debug.read_layout().text_content().strip()
|
||||
== TR.misc__enable_labeling
|
||||
)
|
||||
client.debug.swipe_up()
|
||||
client.debug.press_yes()
|
||||
|
||||
|
@ -255,6 +255,10 @@ def test_already_initialized(client: Client):
|
||||
def test_entropy_check(client: Client):
|
||||
with client:
|
||||
delizia = client.debug.layout_type is LayoutType.Delizia
|
||||
delizia_eckhart = client.debug.layout_type in (
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
)
|
||||
client.set_expected_responses(
|
||||
[
|
||||
messages.ButtonRequest(name="setup_device"),
|
||||
@ -271,7 +275,7 @@ def test_entropy_check(client: Client):
|
||||
messages.EntropyCheckReady,
|
||||
messages.PublicKey,
|
||||
messages.PublicKey,
|
||||
(delizia, messages.ButtonRequest(name="backup_device")),
|
||||
(delizia_eckhart, messages.ButtonRequest(name="backup_device")),
|
||||
messages.Success,
|
||||
messages.Features,
|
||||
]
|
||||
@ -291,13 +295,17 @@ def test_entropy_check(client: Client):
|
||||
@pytest.mark.setup_client(uninitialized=True)
|
||||
def test_no_entropy_check(client: Client):
|
||||
with client:
|
||||
delizia_eckhart = client.debug.layout_type in (
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
)
|
||||
delizia = client.debug.layout_type is LayoutType.Delizia
|
||||
client.set_expected_responses(
|
||||
[
|
||||
messages.ButtonRequest(name="setup_device"),
|
||||
(delizia, messages.ButtonRequest(name="confirm_setup_device")),
|
||||
messages.EntropyRequest,
|
||||
(delizia, messages.ButtonRequest(name="backup_device")),
|
||||
(delizia_eckhart, messages.ButtonRequest(name="backup_device")),
|
||||
messages.Success,
|
||||
messages.Features,
|
||||
]
|
||||
|
@ -97,7 +97,10 @@ def test_backup_slip39_single(client: Client):
|
||||
|
||||
with client:
|
||||
IF = InputFlowBip39Backup(
|
||||
client, confirm_success=(client.layout_type is not LayoutType.Delizia)
|
||||
client,
|
||||
confirm_success=(
|
||||
client.layout_type not in (LayoutType.Delizia, LayoutType.Eckhart)
|
||||
),
|
||||
)
|
||||
client.set_input_flow(IF.get())
|
||||
device.backup(client)
|
||||
|
@ -399,7 +399,11 @@ def test_hide_passphrase_from_host(client: Client):
|
||||
yield
|
||||
content = client.debug.read_layout().text_content().lower()
|
||||
assert TR.passphrase__from_host_not_shown[:50].lower() in content
|
||||
if client.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if client.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
client.debug.press_yes()
|
||||
elif client.layout_type is LayoutType.Caesar:
|
||||
client.debug.press_right()
|
||||
|
@ -24,7 +24,7 @@ from .common import (
|
||||
BRGeneratorType,
|
||||
check_pin_backoff_time,
|
||||
click_info_button_bolt,
|
||||
click_info_button_delizia,
|
||||
click_info_button_delizia_eckhart,
|
||||
click_through,
|
||||
get_text_possible_pagination,
|
||||
read_and_confirm_mnemonic,
|
||||
@ -56,6 +56,8 @@ class InputFlowBase:
|
||||
return self.input_flow_caesar
|
||||
elif self.client.layout_type is LayoutType.Delizia:
|
||||
return self.input_flow_delizia
|
||||
elif self.client.layout_type is LayoutType.Eckhart:
|
||||
return self.input_flow_eckhart
|
||||
else:
|
||||
raise ValueError("Unknown model")
|
||||
|
||||
@ -71,6 +73,10 @@ class InputFlowBase:
|
||||
"""Special for T3T1"""
|
||||
raise NotImplementedError
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
"""Special for T3W1"""
|
||||
raise NotImplementedError
|
||||
|
||||
def text_content(self) -> str:
|
||||
return self.debug.read_layout().text_content()
|
||||
|
||||
@ -250,6 +256,9 @@ class InputFlowSignMessagePagination(InputFlowBase):
|
||||
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowSignVerifyMessageLong(InputFlowBase):
|
||||
def __init__(self, client: Client, verify=False):
|
||||
@ -342,6 +351,9 @@ class InputFlowSignVerifyMessageLong(InputFlowBase):
|
||||
self.debug.press_yes()
|
||||
br = yield
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowSignMessageInfo(InputFlowBase):
|
||||
def __init__(self, client: Client):
|
||||
@ -370,6 +382,9 @@ class InputFlowSignMessageInfo(InputFlowBase):
|
||||
self.debug.swipe_up()
|
||||
yield
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowShowAddressQRCode(InputFlowBase):
|
||||
def __init__(self, client: Client):
|
||||
@ -441,6 +456,9 @@ class InputFlowShowAddressQRCode(InputFlowBase):
|
||||
# tap to confirm
|
||||
self.debug.click(self.client.debug.screen_buttons.tap_to_confirm())
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowShowAddressQRCodeCancel(InputFlowBase):
|
||||
def __init__(self, client: Client):
|
||||
@ -494,6 +512,9 @@ class InputFlowShowAddressQRCodeCancel(InputFlowBase):
|
||||
# really cancel
|
||||
self.debug.click(self.client.debug.screen_buttons.tap_to_confirm())
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowShowMultisigXPUBs(InputFlowBase):
|
||||
def __init__(self, client: Client, address: str, xpubs: list[str], index: int):
|
||||
@ -639,6 +660,9 @@ class InputFlowShowMultisigXPUBs(InputFlowBase):
|
||||
# tap to confirm
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowShowXpubQRCode(InputFlowBase):
|
||||
def __init__(self, client: Client, passphrase: bool = False):
|
||||
@ -750,6 +774,9 @@ class InputFlowShowXpubQRCode(InputFlowBase):
|
||||
# tap to confirm
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowPaymentRequestDetails(InputFlowBase):
|
||||
def __init__(self, client: Client, outputs: list[messages.TxOutputType]):
|
||||
@ -803,6 +830,9 @@ class InputFlowPaymentRequestDetails(InputFlowBase):
|
||||
self.debug.swipe_up()
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowSignTxHighFee(InputFlowBase):
|
||||
def __init__(self, client: Client):
|
||||
@ -851,6 +881,9 @@ class InputFlowSignTxHighFee(InputFlowBase):
|
||||
|
||||
self.finished = True
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
def sign_tx_go_to_info(client: Client) -> Generator[None, messages.ButtonRequest, str]:
|
||||
yield # confirm output
|
||||
@ -968,6 +1001,9 @@ class InputFlowSignTxInformation(InputFlowBase):
|
||||
self.debug.swipe_up()
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowSignTxInformationMixed(InputFlowBase):
|
||||
def __init__(self, client: Client):
|
||||
@ -1003,6 +1039,9 @@ class InputFlowSignTxInformationMixed(InputFlowBase):
|
||||
self.debug.swipe_up()
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowSignTxInformationCancel(InputFlowBase):
|
||||
def __init__(self, client: Client):
|
||||
@ -1023,6 +1062,9 @@ class InputFlowSignTxInformationCancel(InputFlowBase):
|
||||
self.debug.synchronize_at("PromptScreen")
|
||||
self.debug.click(self.client.debug.screen_buttons.tap_to_confirm())
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowSignTxInformationReplacement(InputFlowBase):
|
||||
def __init__(self, client: Client):
|
||||
@ -1061,6 +1103,7 @@ class InputFlowSignTxInformationReplacement(InputFlowBase):
|
||||
self.debug.press_right()
|
||||
|
||||
input_flow_delizia = input_flow_bolt
|
||||
input_flow_eckhart = input_flow_bolt
|
||||
|
||||
|
||||
def lock_time_input_flow_bolt(
|
||||
@ -1152,6 +1195,9 @@ class InputFlowLockTimeBlockHeight(InputFlowBase):
|
||||
self.debug, self.assert_func, double_confirm=True
|
||||
)
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowLockTimeDatetime(InputFlowBase):
|
||||
def __init__(self, client: Client, lock_time_str: str):
|
||||
@ -1172,6 +1218,9 @@ class InputFlowLockTimeDatetime(InputFlowBase):
|
||||
def input_flow_delizia(self) -> BRGeneratorType:
|
||||
yield from lock_time_input_flow_delizia(self.debug, self.assert_func)
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowEIP712ShowMore(InputFlowBase):
|
||||
SHOW_MORE = (143, 167)
|
||||
@ -1182,7 +1231,11 @@ class InputFlowEIP712ShowMore(InputFlowBase):
|
||||
|
||||
def _confirm_show_more(self) -> None:
|
||||
"""Model-specific, either clicks a screen or presses a button."""
|
||||
if self.client.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if self.client.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
self.debug.click(self.SHOW_MORE)
|
||||
elif self.client.layout_type is LayoutType.Caesar:
|
||||
self.debug.press_right()
|
||||
@ -1386,6 +1439,17 @@ class InputFlowBip39ResetBackup(InputFlowBase):
|
||||
# mnemonic phrases and rest
|
||||
self.mnemonic = yield from get_mnemonic(self.debug)
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
# 1. Confirm Reset
|
||||
# 2. Wallet created
|
||||
# 3. Backup your seed
|
||||
# 4. Backup intro
|
||||
# 5. Confirm warning
|
||||
yield from click_through(self.debug, screens=5, code=B.ResetDevice)
|
||||
|
||||
# mnemonic phrases and rest
|
||||
self.mnemonic = yield from get_mnemonic(self.debug)
|
||||
|
||||
|
||||
class InputFlowBip39ResetPIN(InputFlowBase):
|
||||
def __init__(self, client: Client):
|
||||
@ -1399,7 +1463,7 @@ class InputFlowBip39ResetPIN(InputFlowBase):
|
||||
|
||||
yield from self.PIN.setup_new_pin("654")
|
||||
|
||||
if self.debug.layout_type is LayoutType.Delizia:
|
||||
if self.debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
br = yield # Wallet created
|
||||
assert br.code == B.ResetDevice
|
||||
self.debug.press_yes()
|
||||
@ -1434,9 +1498,13 @@ class InputFlowBip39ResetFailedCheck(InputFlowBase):
|
||||
self.mnemonic = None
|
||||
|
||||
def input_flow_common(self) -> BRGeneratorType:
|
||||
screens = 5 if self.debug.layout_type is LayoutType.Delizia else 4
|
||||
screens = (
|
||||
5
|
||||
if self.debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart)
|
||||
else 4
|
||||
)
|
||||
# 1. Confirm Reset
|
||||
# 1a. (T3T1) Walet Creation done
|
||||
# 1a. (T3T1, T3W1) Walet Creation done
|
||||
# 2. Confirm backup prompt
|
||||
# 3. Backup your seed
|
||||
# 4. Confirm warning
|
||||
@ -1566,13 +1634,13 @@ class InputFlowSlip39BasicBackup(InputFlowBase):
|
||||
self.debug.swipe_up()
|
||||
assert (yield).name == "slip39_shares"
|
||||
if self.click_info:
|
||||
click_info_button_delizia(self.debug)
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.swipe_up()
|
||||
assert (yield).name == "slip39_checklist"
|
||||
self.debug.swipe_up()
|
||||
assert (yield).name == "slip39_threshold"
|
||||
if self.click_info:
|
||||
click_info_button_delizia(self.debug)
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.swipe_up()
|
||||
assert (yield).name == "slip39_checklist"
|
||||
self.debug.swipe_up()
|
||||
@ -1586,6 +1654,38 @@ class InputFlowSlip39BasicBackup(InputFlowBase):
|
||||
assert br.code == B.Success
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
if self.repeated:
|
||||
# intro confirmation screen
|
||||
assert (yield).name == "confirm_repeated_backup"
|
||||
self.debug.press_yes()
|
||||
|
||||
assert (yield).name == "backup_intro"
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_checklist"
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_shares"
|
||||
if self.click_info:
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_checklist"
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_threshold"
|
||||
if self.click_info:
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_checklist"
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "backup_warning"
|
||||
self.debug.press_yes()
|
||||
|
||||
# Mnemonic phrases
|
||||
self.mnemonics = yield from load_N_shares(self.debug, 5)
|
||||
|
||||
br = yield # Confirm backup
|
||||
assert br.code == B.Success
|
||||
self.debug.press_yes()
|
||||
|
||||
|
||||
class InputFlowSlip39BasicResetRecovery(InputFlowBase):
|
||||
def __init__(self, client: Client):
|
||||
@ -1662,6 +1762,26 @@ class InputFlowSlip39BasicResetRecovery(InputFlowBase):
|
||||
assert br.code == B.Success
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
# 1. Confirm Reset
|
||||
# 2. Wallet Created
|
||||
# 3. Backup your seed
|
||||
# 4. Backup intro
|
||||
# 5. Set & Confirm number of shares
|
||||
# 6. threshold info
|
||||
# 7. Set & confirm threshold value
|
||||
# 8. Confirm show seeds
|
||||
# 9. Warning
|
||||
# 10. Instructions
|
||||
yield from click_through(self.debug, screens=10, code=B.ResetDevice)
|
||||
|
||||
# Mnemonic phrases
|
||||
self.mnemonics = yield from load_N_shares(self.debug, 5)
|
||||
|
||||
br = yield # success screen
|
||||
assert br.code == B.Success
|
||||
self.debug.press_yes()
|
||||
|
||||
|
||||
class InputFlowSlip39CustomBackup(InputFlowBase):
|
||||
def __init__(self, client: Client, share_count: int, repeated: bool = False):
|
||||
@ -1736,6 +1856,28 @@ class InputFlowSlip39CustomBackup(InputFlowBase):
|
||||
assert br.code == B.Success
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
if self.repeated:
|
||||
yield
|
||||
self.debug.press_yes()
|
||||
|
||||
if self.share_count > 1:
|
||||
yield # Checklist
|
||||
self.debug.press_yes()
|
||||
else:
|
||||
yield # Backup intro
|
||||
self.debug.press_yes()
|
||||
|
||||
yield # Confirm show seeds
|
||||
self.debug.press_yes()
|
||||
|
||||
# Mnemonic phrases
|
||||
self.mnemonics = yield from load_N_shares(self.debug, self.share_count)
|
||||
|
||||
br = yield # Confirm backup
|
||||
assert br.code == B.Success
|
||||
self.debug.press_yes()
|
||||
|
||||
|
||||
def load_5_groups_5_shares(
|
||||
debug: DebugLink,
|
||||
@ -1840,24 +1982,24 @@ class InputFlowSlip39AdvancedBackup(InputFlowBase):
|
||||
self.debug.swipe_up()
|
||||
assert (yield).name == "slip39_groups"
|
||||
if self.click_info:
|
||||
click_info_button_delizia(self.debug)
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.swipe_up()
|
||||
assert (yield).name == "slip39_checklist"
|
||||
self.debug.swipe_up()
|
||||
assert (yield).name == "slip39_group_threshold"
|
||||
if self.click_info:
|
||||
click_info_button_delizia(self.debug)
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.swipe_up()
|
||||
assert (yield).name == "slip39_checklist"
|
||||
self.debug.swipe_up()
|
||||
for _i in range(5): # for each of 5 groups
|
||||
assert (yield).name == "slip39_shares"
|
||||
if self.click_info:
|
||||
click_info_button_delizia(self.debug)
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.swipe_up()
|
||||
assert (yield).name == "slip39_threshold"
|
||||
if self.click_info:
|
||||
click_info_button_delizia(self.debug)
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.swipe_up()
|
||||
assert (yield).name == "backup_warning"
|
||||
self.debug.press_yes()
|
||||
@ -1869,6 +2011,42 @@ class InputFlowSlip39AdvancedBackup(InputFlowBase):
|
||||
assert br.code == B.Success
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert (yield).name == "backup_intro"
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_checklist"
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_groups"
|
||||
if self.click_info:
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_checklist"
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_group_threshold"
|
||||
if self.click_info:
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_checklist"
|
||||
self.debug.press_yes()
|
||||
for _i in range(5): # for each of 5 groups
|
||||
assert (yield).name == "slip39_shares"
|
||||
if self.click_info:
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "slip39_threshold"
|
||||
if self.click_info:
|
||||
click_info_button_delizia_eckhart(self.debug)
|
||||
self.debug.press_yes()
|
||||
assert (yield).name == "backup_warning"
|
||||
self.debug.press_yes()
|
||||
|
||||
# Mnemonic phrases - show & confirm shares for all groups
|
||||
self.mnemonics = yield from load_5_groups_5_shares(self.debug)
|
||||
|
||||
br = yield # Confirm backup
|
||||
assert br.code == B.Success
|
||||
self.debug.press_yes()
|
||||
|
||||
|
||||
class InputFlowSlip39AdvancedResetRecovery(InputFlowBase):
|
||||
def __init__(self, client: Client, click_info: bool):
|
||||
@ -1957,6 +2135,29 @@ class InputFlowSlip39AdvancedResetRecovery(InputFlowBase):
|
||||
assert br.code == B.Success
|
||||
self.debug.press_yes()
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
# 1. Confirm Reset
|
||||
# 2. Wallet Created
|
||||
# 3. Prompt Backup
|
||||
# 4. Backup intro
|
||||
# 5. Confirm warning
|
||||
# 6. shares info
|
||||
# 7. Set & Confirm number of groups
|
||||
# 8. threshold info
|
||||
# 9. Set & confirm group threshold value
|
||||
# 10-19: for each of 5 groups:
|
||||
# 1. Set & Confirm number of shares
|
||||
# 2. Set & confirm share threshold value
|
||||
# 20. Confirm show seeds
|
||||
yield from click_through(self.debug, screens=20, code=B.ResetDevice)
|
||||
|
||||
# Mnemonic phrases - show & confirm shares for all groups
|
||||
self.mnemonics = yield from load_5_groups_5_shares(self.debug)
|
||||
|
||||
br = yield # safety warning
|
||||
assert br.code == B.Success
|
||||
self.debug.press_yes()
|
||||
|
||||
|
||||
class InputFlowBip39RecoveryDryRun(InputFlowBase):
|
||||
def __init__(self, client: Client, mnemonic: list[str], mismatch: bool = False):
|
||||
@ -2043,7 +2244,11 @@ class InputFlowSlip39AdvancedRecoveryAbort(InputFlowBase):
|
||||
|
||||
def input_flow_common(self) -> BRGeneratorType:
|
||||
yield from self.REC.confirm_recovery()
|
||||
if self.client.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if self.client.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
yield from self.REC.input_number_of_words(20)
|
||||
yield from self.REC.abort_recovery(True)
|
||||
|
||||
@ -2056,7 +2261,11 @@ class InputFlowSlip39AdvancedRecoveryNoAbort(InputFlowBase):
|
||||
|
||||
def input_flow_common(self) -> BRGeneratorType:
|
||||
yield from self.REC.confirm_recovery()
|
||||
if self.client.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if self.client.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
yield from self.REC.input_number_of_words(self.word_count)
|
||||
yield from self.REC.abort_recovery(False)
|
||||
else:
|
||||
@ -2165,7 +2374,11 @@ class InputFlowSlip39BasicRecoveryAbortOnNumberOfWords(InputFlowBase):
|
||||
|
||||
def input_flow_common(self) -> BRGeneratorType:
|
||||
yield from self.REC.confirm_recovery()
|
||||
if self.client.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if self.client.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
yield from self.REC.input_number_of_words(None)
|
||||
|
||||
|
||||
@ -2175,7 +2388,11 @@ class InputFlowSlip39BasicRecoveryAbort(InputFlowBase):
|
||||
|
||||
def input_flow_common(self) -> BRGeneratorType:
|
||||
yield from self.REC.confirm_recovery()
|
||||
if self.client.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if self.client.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
yield from self.REC.input_number_of_words(20)
|
||||
yield from self.REC.abort_recovery(True)
|
||||
|
||||
@ -2188,7 +2405,11 @@ class InputFlowSlip39BasicRecoveryAbortBetweenShares(InputFlowBase):
|
||||
|
||||
def input_flow_common(self) -> BRGeneratorType:
|
||||
yield from self.REC.confirm_recovery()
|
||||
if self.client.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if self.client.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
yield from self.REC.input_number_of_words(20)
|
||||
else:
|
||||
yield from self.REC.recovery_homescreen_caesar()
|
||||
@ -2208,7 +2429,11 @@ class InputFlowSlip39BasicRecoveryNoAbort(InputFlowBase):
|
||||
def input_flow_common(self) -> BRGeneratorType:
|
||||
yield from self.REC.confirm_recovery()
|
||||
|
||||
if self.client.layout_type in (LayoutType.Bolt, LayoutType.Delizia):
|
||||
if self.client.layout_type in (
|
||||
LayoutType.Bolt,
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
yield from self.REC.input_number_of_words(self.word_count)
|
||||
yield from self.REC.abort_recovery(False)
|
||||
else:
|
||||
@ -2337,6 +2562,17 @@ class InputFlowResetSkipBackup(InputFlowBase):
|
||||
self.debug.synchronize_at("PromptScreen")
|
||||
self.debug.click(self.client.debug.screen_buttons.tap_to_confirm())
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
yield from self.BAK.confirm_new_wallet()
|
||||
yield # Skip Backup
|
||||
assert TR.backup__new_wallet_created in self.text_content()
|
||||
self.debug.press_yes()
|
||||
yield
|
||||
self.debug.click(self.client.debug.screen_buttons.menu())
|
||||
self.debug.synchronize_at("VerticalMenu")
|
||||
self.debug.click(self.client.debug.screen_buttons.vertical_menu_items()[0])
|
||||
self.debug.press_no()
|
||||
|
||||
|
||||
class InputFlowConfirmAllWarnings(InputFlowBase):
|
||||
def __init__(self, client: Client):
|
||||
@ -2384,6 +2620,9 @@ class InputFlowConfirmAllWarnings(InputFlowBase):
|
||||
self.debug.press_yes()
|
||||
br = yield
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
||||
|
||||
class InputFlowFidoConfirm(InputFlowBase):
|
||||
def __init__(self, client: Client, cancel: bool = False):
|
||||
@ -2403,3 +2642,6 @@ class InputFlowFidoConfirm(InputFlowBase):
|
||||
yield
|
||||
self.debug.swipe_up()
|
||||
self.debug.click(self.client.debug.screen_buttons.tap_to_confirm())
|
||||
|
||||
def input_flow_eckhart(self) -> BRGeneratorType:
|
||||
assert False, "Not implemented"
|
||||
|
@ -102,7 +102,11 @@ class RecoveryFlow:
|
||||
if self.debug.layout_type is LayoutType.Delizia:
|
||||
assert TR.recovery__enter_each_word in self._text_content()
|
||||
else:
|
||||
assert TR.recovery__enter_backup in self._text_content()
|
||||
print(self._text_content())
|
||||
if self.client.layout_type is LayoutType.Eckhart:
|
||||
assert TR.recovery__enter_each_word in self._text_content()
|
||||
else:
|
||||
assert TR.recovery__enter_backup in self._text_content()
|
||||
is_dry_run = (
|
||||
TR.recovery__title_dry_run.lower()
|
||||
in self.debug.read_layout().title().lower()
|
||||
@ -131,7 +135,16 @@ class RecoveryFlow:
|
||||
|
||||
def abort_recovery(self, confirm: bool) -> BRGeneratorType:
|
||||
yield
|
||||
if self.client.layout_type is LayoutType.Caesar:
|
||||
if self.client.layout_type is LayoutType.Bolt:
|
||||
assert TR.recovery__enter_any_share in self._text_content()
|
||||
self.debug.press_no()
|
||||
yield
|
||||
assert TR.recovery__wanna_cancel_recovery in self._text_content()
|
||||
if confirm:
|
||||
self.debug.press_yes()
|
||||
else:
|
||||
self.debug.press_no()
|
||||
elif self.client.layout_type is LayoutType.Caesar:
|
||||
assert TR.recovery__num_of_words in self._text_content()
|
||||
self.debug.press_no()
|
||||
yield
|
||||
@ -141,7 +154,7 @@ class RecoveryFlow:
|
||||
self.debug.press_yes()
|
||||
else:
|
||||
self.debug.press_no()
|
||||
elif self.client.layout_type is LayoutType.Delizia:
|
||||
elif self.client.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
assert TR.recovery__enter_each_word in self._text_content()
|
||||
self.debug.click(self.debug.screen_buttons.menu())
|
||||
self.debug.synchronize_at("VerticalMenu")
|
||||
@ -150,14 +163,7 @@ class RecoveryFlow:
|
||||
else:
|
||||
self.debug.click(self.debug.screen_buttons.menu())
|
||||
else:
|
||||
assert TR.recovery__enter_any_share in self._text_content()
|
||||
self.debug.press_no()
|
||||
yield
|
||||
assert TR.recovery__wanna_cancel_recovery in self._text_content()
|
||||
if confirm:
|
||||
self.debug.press_yes()
|
||||
else:
|
||||
self.debug.press_no()
|
||||
raise ValueError("Unknown model!")
|
||||
|
||||
def abort_recovery_between_shares(self) -> BRGeneratorType:
|
||||
yield
|
||||
@ -321,10 +327,11 @@ class RecoveryFlow:
|
||||
if click_info:
|
||||
if self.client.layout_type is LayoutType.Bolt:
|
||||
yield from self.click_info_bolt()
|
||||
elif self.client.layout_type is LayoutType.Delizia:
|
||||
yield from self.click_info_delizia()
|
||||
else:
|
||||
raise ValueError("Unknown model!")
|
||||
elif self.client.layout_type in (
|
||||
LayoutType.Delizia,
|
||||
LayoutType.Eckhart,
|
||||
):
|
||||
yield from self.click_info_delizia_eckhart()
|
||||
yield from self.success_more_shares_needed()
|
||||
|
||||
def click_info_bolt(self) -> t.Generator[t.Any, t.Any, None]:
|
||||
@ -335,7 +342,7 @@ class RecoveryFlow:
|
||||
self.debug.swipe_up()
|
||||
self.debug.press_yes()
|
||||
|
||||
def click_info_delizia(self) -> BRGeneratorType:
|
||||
def click_info_delizia_eckhart(self) -> BRGeneratorType:
|
||||
# Moving through the menu into the show_shares screen
|
||||
self.debug.click(self.debug.screen_buttons.menu())
|
||||
self.debug.synchronize_at("VerticalMenu")
|
||||
|
@ -40,7 +40,7 @@ def test_abort(core_emulator: Emulator):
|
||||
debug = device_handler.debuglink()
|
||||
features = device_handler.features()
|
||||
|
||||
if debug.layout_type is LayoutType.Delizia:
|
||||
if debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
pytest.skip("abort not supported on T3T1")
|
||||
|
||||
assert features.recovery_status == RecoveryStatus.Nothing
|
||||
@ -167,6 +167,7 @@ def test_recovery_on_old_wallet(core_emulator: Emulator):
|
||||
layout = debug.read_layout()
|
||||
|
||||
# check that we entered the first share successfully
|
||||
print(debug.read_layout().text_content())
|
||||
assert "2 more shares needed" in layout.text_content()
|
||||
|
||||
# try entering the remaining shares
|
||||
@ -187,7 +188,7 @@ def test_recovery_multiple_resets(core_emulator: Emulator):
|
||||
shares = MNEMONIC_SLIP39_ADVANCED_20
|
||||
layout = debug.read_layout()
|
||||
expected_text = "Enter any share"
|
||||
if debug.layout_type == LayoutType.Delizia:
|
||||
if debug.layout_type in (LayoutType.Delizia, LayoutType.Eckhart):
|
||||
expected_text = "Enter each word"
|
||||
remaining = len(shares)
|
||||
for share in shares:
|
||||
|
@ -745,20 +745,20 @@
|
||||
"T2T1_cs_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "cead5ab77fe434d49f95c9b36c5f30ede92dfcba9a65e76a793efd663bc2db2c",
|
||||
"T2T1_cs_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "02fef6dbd2919c5c55f89a99306a5d9948a60a63fedb2f381108b2b5cdb0f3ef",
|
||||
"T2T1_cs_test_lock.py::test_hold_to_lock": "cbbb62fa28512c76a8c6ffda81ac8f2527050fb94f333fec8f1c204e80b22819",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "40830a50b2b1ce4e6333b3f2c4f498c1f74de3d9487e85357a5d247710dcd85c",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "686b16ba0f08c95805ec029268bcb750f623ccf20e00defcbff4a7f341747e15",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_delete": "6c9112ba6846f60cda92cd958d345692a088a9be4a096bc004c4e4f6ee5a320b",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "aacd1067210783e499692ebf5d54d7c01c3f42e7da0751a11c8bb27ddccb309b",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "9b60f466f49b0838f8b6dc50c3e4dd61264c45bdb0206f3056afee2a5d307407",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "4a08a5aee3c2aa66e3cf35277d50839eae59e262ac876c5621ce4e2549121511",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "ebd885eb2ca3df3bc14ffe7cd95b7d761fa8caa69f8b56e3a4e5fc968909027c",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "84f48256ed27bb3aa8415053973387a8d5a062f3d4b3bb9a039734d5f5ad5df3",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "c2dc9eaca217d0b4654319074ab4d9108b7e3d4378847e8e4b6d7be6f414fe74",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "2eb60be84a003b6e2eae3e73fff70a2b8f0a8f2ffafa56690d53ccb96a097bc9",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "2eb60be84a003b6e2eae3e73fff70a2b8f0a8f2ffafa56690d53ccb96a097bc9",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "f137b5b2931eee31ab91d7738fa0a3f2123529dd533fd59ac37a3f08f4e9cb3a",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "2adbcb44e4eb856d52e58a40c11efb87f68295b9fb64877c20639321638f0356",
|
||||
"T2T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "cd361cd446f7449fe26252cea4d91d2c2c9b1a9ac81a3e9756fbd74668cfb9f0",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_cycle_through_last_character": "40830a50b2b1ce4e6333b3f2c4f498c1f74de3d9487e85357a5d247710dcd85c",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "686b16ba0f08c95805ec029268bcb750f623ccf20e00defcbff4a7f341747e15",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_delete": "6c9112ba6846f60cda92cd958d345692a088a9be4a096bc004c4e4f6ee5a320b",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_delete_all": "aacd1067210783e499692ebf5d54d7c01c3f42e7da0751a11c8bb27ddccb309b",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "9b60f466f49b0838f8b6dc50c3e4dd61264c45bdb0206f3056afee2a5d307407",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "4a08a5aee3c2aa66e3cf35277d50839eae59e262ac876c5621ce4e2549121511",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "ebd885eb2ca3df3bc14ffe7cd95b7d761fa8caa69f8b56e3a4e5fc968909027c",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "84f48256ed27bb3aa8415053973387a8d5a062f3d4b3bb9a039734d5f5ad5df3",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "2eb60be84a003b6e2eae3e73fff70a2b8f0a8f2ffafa56690d53ccb96a097bc9",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "c2dc9eaca217d0b4654319074ab4d9108b7e3d4378847e8e4b6d7be6f414fe74",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "2eb60be84a003b6e2eae3e73fff70a2b8f0a8f2ffafa56690d53ccb96a097bc9",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "f137b5b2931eee31ab91d7738fa0a3f2123529dd533fd59ac37a3f08f4e9cb3a",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_loop_all_characters": "2adbcb44e4eb856d52e58a40c11efb87f68295b9fb64877c20639321638f0356",
|
||||
"T2T1_cs_test_passphrase_bde.py::test_passphrase_prompt_disappears": "cd361cd446f7449fe26252cea4d91d2c2c9b1a9ac81a3e9756fbd74668cfb9f0",
|
||||
"T2T1_cs_test_pin.py::test_last_digit_timeout": "06babf359cdfd0299c7adf901a21195b060ca554ea3ef89a4907b05a38fca6dc",
|
||||
"T2T1_cs_test_pin.py::test_pin_cancel": "4176e256dd9fc175fd5b903144eff9c349ccd881407aa41d0e6798d6e2787164",
|
||||
"T2T1_cs_test_pin.py::test_pin_change": "4070156f5671f94d819d6845455b89133361a7bcbe1a8a4460e72f92fe2166a4",
|
||||
@ -797,20 +797,20 @@
|
||||
"T2T1_de_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "fcefa34333413a7b1d72eca9d0c6742654b0959524b392adc179687ca94cf374",
|
||||
"T2T1_de_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "f271dd89a2514d42d789511bfaa3712595d1e58506e81352f5e4d4cd636e49fd",
|
||||
"T2T1_de_test_lock.py::test_hold_to_lock": "10709a23298770753088ee313e451afc161e9fa89c55b93ccc581473b4dd9927",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "efa760797ba43b9a7f96a0362ec2a68a8de411048c37ad6957da98a8f1ed841f",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "f05ccae157375a20a0565f333662a14d2aa05080e1b605c9f17295e9cde543a3",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_delete": "18ffb2beaa3b84909c5ad140abccac2ad67cc266dc40e49b6956a9aee6852258",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "1de6101a45b849bc4a087039a845c6183bbeab2617e0099c70e46382c5423169",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "a58dab10d4737cb97fff35e388c25a1dcc366e943e226c2c836f25e40b7e2f43",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "cb125eec7af27d40f9d081aceb236cc171a9fee5a5281d36855b8ca66705443d",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "8c4b13aff5c0c2e4cd69b757b77c7e305521ad8bf0ae4e2995d4f5e188a3cd5f",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "c869406723049363fa9d9f09ca38168c0a98ecf01cfeea6eb227897f25d14e9d",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "98082d0fc491306b8b71f4474166f9ef6982bb1b129a521bcd5aba1dd23f2308",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "6f35eac0c7424bd03c372987c9c7863c4ba8d211f2af85f73ce1fc37a209a15c",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "6f35eac0c7424bd03c372987c9c7863c4ba8d211f2af85f73ce1fc37a209a15c",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "da99f8b84fbba875c686e315c9e89809f86db4c519f3524df5810c07ccc6476f",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "efa4ff0e210d6ec4a3f075e3193fce4a8485a6692354c759d485d451903ff246",
|
||||
"T2T1_de_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "9eee6bfa13e3fe48b0c29c7adb3861be20e20c62717af8090298e4511d661615",
|
||||
"T2T1_de_test_passphrase_bde.py::test_cycle_through_last_character": "efa760797ba43b9a7f96a0362ec2a68a8de411048c37ad6957da98a8f1ed841f",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "f05ccae157375a20a0565f333662a14d2aa05080e1b605c9f17295e9cde543a3",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_delete": "18ffb2beaa3b84909c5ad140abccac2ad67cc266dc40e49b6956a9aee6852258",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_delete_all": "1de6101a45b849bc4a087039a845c6183bbeab2617e0099c70e46382c5423169",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "a58dab10d4737cb97fff35e388c25a1dcc366e943e226c2c836f25e40b7e2f43",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "cb125eec7af27d40f9d081aceb236cc171a9fee5a5281d36855b8ca66705443d",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "8c4b13aff5c0c2e4cd69b757b77c7e305521ad8bf0ae4e2995d4f5e188a3cd5f",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "c869406723049363fa9d9f09ca38168c0a98ecf01cfeea6eb227897f25d14e9d",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "6f35eac0c7424bd03c372987c9c7863c4ba8d211f2af85f73ce1fc37a209a15c",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "98082d0fc491306b8b71f4474166f9ef6982bb1b129a521bcd5aba1dd23f2308",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "6f35eac0c7424bd03c372987c9c7863c4ba8d211f2af85f73ce1fc37a209a15c",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "da99f8b84fbba875c686e315c9e89809f86db4c519f3524df5810c07ccc6476f",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_loop_all_characters": "efa4ff0e210d6ec4a3f075e3193fce4a8485a6692354c759d485d451903ff246",
|
||||
"T2T1_de_test_passphrase_bde.py::test_passphrase_prompt_disappears": "9eee6bfa13e3fe48b0c29c7adb3861be20e20c62717af8090298e4511d661615",
|
||||
"T2T1_de_test_pin.py::test_last_digit_timeout": "c113c631b0a62e3da0b5965844359589716b2b65b8a66e1cccb48ddb427bf10d",
|
||||
"T2T1_de_test_pin.py::test_pin_cancel": "efb9d6ca37577eabe8dfccc3622eb981af3c196cbe4205b6a78c67961a1a7125",
|
||||
"T2T1_de_test_pin.py::test_pin_change": "c730274f842d380cd5c2199b5f1894e9d9f219ca69ec06f70a6ce7e4dce7c98e",
|
||||
@ -849,20 +849,20 @@
|
||||
"T2T1_en_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "7a9d803b3baf1d4bfc9376261615ebdd3ea129583a06310f3909c8338d1ab087",
|
||||
"T2T1_en_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "1986afa48466d880d7b34f2799a3fdea434e840c13fa3c2017161a37694a97f9",
|
||||
"T2T1_en_test_lock.py::test_hold_to_lock": "16e93b1d85aad5450cd9abf415fac39001cea84869dc6743ff0ec15db24e9ee8",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "80625277f3a0aa4132f275e2073785825f2e1925f3409810d7f532b7c9fb08ef",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "2b55911cee1c00dea76b427c08889acf984acb1ebf93624977f43148a5a5a8d8",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_delete": "36fb4927e216871408bf0aefd815037db4e86cfd87cbb23daaa1d2d8ec81c835",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "678a21fcb484c9f64af01cbdf4591a9b019e6205ca8321a60bc471c521ab87ed",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "8161f39a0efd153274fa8c4f63f3b58d10b6835d4c70fce19b561aa50724827a",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "87f62e2e476c13e32c28f8c15d07ec4e1ed73028519abca6d2cdc3eedae023e1",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "eb7d504a87b3794b3e6e1ec663920a5df938596554e4979d77abc2a550b7481c",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "fc7ec0688bf0f997505c4b5c0e64bf9f5ce97fa31ab9c7d2e0999fd5629e17ac",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "1748b0b47d9a422a67c8f9299dd002342856b067dff76d7ebb825db435b64702",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "b813dbc266789ce36e803d4ea699f7e38817a8e0d95c11a23bda9569ef78a1a2",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "b813dbc266789ce36e803d4ea699f7e38817a8e0d95c11a23bda9569ef78a1a2",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "9956fa9bf399cc2014be282b128e0581b4adbb399fb16e43cd7ad68d60dbbd09",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "0f99c72bbae0033ed9e5ca1a233d587fb0974bf4a9fe46d1df5f25ed93bac343",
|
||||
"T2T1_en_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "d051fc05dc3af0c685de6ec8f00b0ab4facf8f6fd49dcece503fa15261d6c90a",
|
||||
"T2T1_en_test_passphrase_bde.py::test_cycle_through_last_character": "80625277f3a0aa4132f275e2073785825f2e1925f3409810d7f532b7c9fb08ef",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "2b55911cee1c00dea76b427c08889acf984acb1ebf93624977f43148a5a5a8d8",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_delete": "36fb4927e216871408bf0aefd815037db4e86cfd87cbb23daaa1d2d8ec81c835",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_delete_all": "678a21fcb484c9f64af01cbdf4591a9b019e6205ca8321a60bc471c521ab87ed",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "8161f39a0efd153274fa8c4f63f3b58d10b6835d4c70fce19b561aa50724827a",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "87f62e2e476c13e32c28f8c15d07ec4e1ed73028519abca6d2cdc3eedae023e1",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "eb7d504a87b3794b3e6e1ec663920a5df938596554e4979d77abc2a550b7481c",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "fc7ec0688bf0f997505c4b5c0e64bf9f5ce97fa31ab9c7d2e0999fd5629e17ac",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "b813dbc266789ce36e803d4ea699f7e38817a8e0d95c11a23bda9569ef78a1a2",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "1748b0b47d9a422a67c8f9299dd002342856b067dff76d7ebb825db435b64702",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "b813dbc266789ce36e803d4ea699f7e38817a8e0d95c11a23bda9569ef78a1a2",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "9956fa9bf399cc2014be282b128e0581b4adbb399fb16e43cd7ad68d60dbbd09",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_loop_all_characters": "0f99c72bbae0033ed9e5ca1a233d587fb0974bf4a9fe46d1df5f25ed93bac343",
|
||||
"T2T1_en_test_passphrase_bde.py::test_passphrase_prompt_disappears": "d051fc05dc3af0c685de6ec8f00b0ab4facf8f6fd49dcece503fa15261d6c90a",
|
||||
"T2T1_en_test_pin.py::test_last_digit_timeout": "a170405f1451dd9092afc83c4326e08d9076e52a6ef20c940ff916baa739e9c3",
|
||||
"T2T1_en_test_pin.py::test_pin_cancel": "477133459306a2a9f64fc2bd3abeebaf67a678e59bdd1418db4536b2be4e657f",
|
||||
"T2T1_en_test_pin.py::test_pin_change": "b3dccad89be83c8a5c62169b861835730ad46bf01fd0cf598c47b2ebb6cd3e14",
|
||||
@ -901,20 +901,20 @@
|
||||
"T2T1_es_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "eb5d07664628e4b1821ccf2ef397f36a44d8615150d7388fde37ee95c8df5727",
|
||||
"T2T1_es_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "c173fa6041155ee0b2f4085bf88b911a0d99389c39dbb8c1a78d4eafd0a7044c",
|
||||
"T2T1_es_test_lock.py::test_hold_to_lock": "5534389fe8f1aebab6cd38be5e46ceb016bae59985eadb83e154960bf98a78fa",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "e6513db1b677a9cb5c790a0dded17cb8339c8cdb159be4aa90523028a4b3424b",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "f3b863a2152d82937aa94d7815867a7d0dfea8cd1932d8f922be5c3f119e394e",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_delete": "83e7d1db22b045a611de7502aa5347d2039ff6456f5db439bec76d630ac7407e",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "893f7fb5eb46d424a814fd26abedd7febeb23f46d62149fc08488f6f61f54b84",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "56c6bc6ccbe689e83dbed1ba903a8fc94e662b57b9c2ddd429f95bac6e84316f",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "ae673718a48e986f13ce57a91fa3b116198196da89f9a86d50c0a88415af5db7",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "8a392b3da19b6dda37fc428663585ba5f668021377f23ab8921f8ccb38d168f8",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "c2c66c0efc368ee49c50fd4eb04dd06c87c4fa991daabc6cb1c2a138a8761630",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "9f81ed5ff6db55dcfd9cf6b98710da7a21bd027fe07214e2ad6e6b88e2bab7dc",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "1902a5633fbc468919dc5b00d86d7b6f38058affd6cb3d82942a1c7109c276cb",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "1902a5633fbc468919dc5b00d86d7b6f38058affd6cb3d82942a1c7109c276cb",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "236e69a890c5be0521e88ac3a0b7666b5ee12be5e80cda5231e9224786e1f7be",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "3083493ea56d4d4bda0740cb9dc748cb8d649ba93e8f96bff0bb1d4fef3ab44a",
|
||||
"T2T1_es_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "307b74f54b266b39535864807191485900e918d964919182448f2cf14a72a3fe",
|
||||
"T2T1_es_test_passphrase_bde.py::test_cycle_through_last_character": "e6513db1b677a9cb5c790a0dded17cb8339c8cdb159be4aa90523028a4b3424b",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "f3b863a2152d82937aa94d7815867a7d0dfea8cd1932d8f922be5c3f119e394e",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_delete": "83e7d1db22b045a611de7502aa5347d2039ff6456f5db439bec76d630ac7407e",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_delete_all": "893f7fb5eb46d424a814fd26abedd7febeb23f46d62149fc08488f6f61f54b84",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "56c6bc6ccbe689e83dbed1ba903a8fc94e662b57b9c2ddd429f95bac6e84316f",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "ae673718a48e986f13ce57a91fa3b116198196da89f9a86d50c0a88415af5db7",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "8a392b3da19b6dda37fc428663585ba5f668021377f23ab8921f8ccb38d168f8",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "c2c66c0efc368ee49c50fd4eb04dd06c87c4fa991daabc6cb1c2a138a8761630",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "1902a5633fbc468919dc5b00d86d7b6f38058affd6cb3d82942a1c7109c276cb",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "9f81ed5ff6db55dcfd9cf6b98710da7a21bd027fe07214e2ad6e6b88e2bab7dc",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "1902a5633fbc468919dc5b00d86d7b6f38058affd6cb3d82942a1c7109c276cb",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "236e69a890c5be0521e88ac3a0b7666b5ee12be5e80cda5231e9224786e1f7be",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_loop_all_characters": "3083493ea56d4d4bda0740cb9dc748cb8d649ba93e8f96bff0bb1d4fef3ab44a",
|
||||
"T2T1_es_test_passphrase_bde.py::test_passphrase_prompt_disappears": "307b74f54b266b39535864807191485900e918d964919182448f2cf14a72a3fe",
|
||||
"T2T1_es_test_pin.py::test_last_digit_timeout": "12f0039fae35a4be611a93edd299bc0e84ea6e039c2ca38f08e7afd382cc6668",
|
||||
"T2T1_es_test_pin.py::test_pin_cancel": "265f9341d0fa814598d248b4439a0e7dcd9940879321ef883a78e520fb6651c2",
|
||||
"T2T1_es_test_pin.py::test_pin_change": "7db85f40e61bd4b9e69d9adc84652825e56ba9fea607bdc3ded7aa033674fd16",
|
||||
@ -953,20 +953,20 @@
|
||||
"T2T1_fr_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "5f0f2574dfc8ac11d5f8f0eaa166ee6d0bf37853c206e7d6178954c01b65c1ed",
|
||||
"T2T1_fr_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "89e8ba1ad594ee86635423c6ed757e3009dc97f020c965f970683265372b50db",
|
||||
"T2T1_fr_test_lock.py::test_hold_to_lock": "6e55a8bd3cb4f3f6bde47bbfe00a523c253173edbac5f738d1e2f0b4bab64548",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "43135f43770a4fe303b3386311f6ccd69de394cac0e6e90e6ad1252849117938",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "2e1139fc821a939514b301703550c6d67473679083f08b0753d730646e602e48",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_delete": "e2bb766b41f93d79474208edea30cc6faed8298e67a41894fd630a7dd7eb368d",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "49a69849fac89d9ae12f7599193214e4b59c5d228a0cebffe17bf994ab1a0744",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "15b597557a859953a31fa2b38b8ae970038e06a3cd99e433625fbde60d7e73e8",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "4cb5b21de9f27f7d961254297722516d2a9425a1187be39320f6425a3d05ac41",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "aa2e32bfd8938b3b2c94bde8516ec5ee12b687f4b38bdc1ab6ec752f544bce1a",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "a3964189fa2ef525c9b660483e2d2b11ed224387ba4fa8d970c75a08d2cfdc3a",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "3b2f81ee87b5c47a7339982c4feaf1fcb0618038d0220262e3497abee412467b",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "d46bc8ecca3b0cb413ce66cc7d681c9169b110ced17927ae9843d45a6602d748",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "d46bc8ecca3b0cb413ce66cc7d681c9169b110ced17927ae9843d45a6602d748",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "b1389db332af33a8de480b4db026e23bec45232c246aa08efef5f59243f1e190",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "c2366383d766e669d46a9a8383cee6633a2235b8522583c210a6aae2bf951b89",
|
||||
"T2T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "1633121bde58ffe7ac7de3f0b56af7a31d0416b8076744271c626562670d1668",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_cycle_through_last_character": "43135f43770a4fe303b3386311f6ccd69de394cac0e6e90e6ad1252849117938",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "2e1139fc821a939514b301703550c6d67473679083f08b0753d730646e602e48",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_delete": "e2bb766b41f93d79474208edea30cc6faed8298e67a41894fd630a7dd7eb368d",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_delete_all": "49a69849fac89d9ae12f7599193214e4b59c5d228a0cebffe17bf994ab1a0744",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "15b597557a859953a31fa2b38b8ae970038e06a3cd99e433625fbde60d7e73e8",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "4cb5b21de9f27f7d961254297722516d2a9425a1187be39320f6425a3d05ac41",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "aa2e32bfd8938b3b2c94bde8516ec5ee12b687f4b38bdc1ab6ec752f544bce1a",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "a3964189fa2ef525c9b660483e2d2b11ed224387ba4fa8d970c75a08d2cfdc3a",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "d46bc8ecca3b0cb413ce66cc7d681c9169b110ced17927ae9843d45a6602d748",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "3b2f81ee87b5c47a7339982c4feaf1fcb0618038d0220262e3497abee412467b",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "d46bc8ecca3b0cb413ce66cc7d681c9169b110ced17927ae9843d45a6602d748",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "b1389db332af33a8de480b4db026e23bec45232c246aa08efef5f59243f1e190",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_loop_all_characters": "c2366383d766e669d46a9a8383cee6633a2235b8522583c210a6aae2bf951b89",
|
||||
"T2T1_fr_test_passphrase_bde.py::test_passphrase_prompt_disappears": "1633121bde58ffe7ac7de3f0b56af7a31d0416b8076744271c626562670d1668",
|
||||
"T2T1_fr_test_pin.py::test_last_digit_timeout": "faf87a5b210fcd13500567a7f5b8b6e076c19b08ad472a8316e4d223ec54d4b7",
|
||||
"T2T1_fr_test_pin.py::test_pin_cancel": "693731e0fda760688100528a65b4ccfc17e8f90bb34dc463438343463a075bd4",
|
||||
"T2T1_fr_test_pin.py::test_pin_change": "c53fe6d8a756a28515b2956ac1c10a03b0ddc1b1554e388949ebc6b9ff6d048e",
|
||||
@ -1005,20 +1005,20 @@
|
||||
"T2T1_pt_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "c2c056c68a01fd4448b555ce118b35b7a9d219a8cee3ba4a15cab4bc4cbab1b5",
|
||||
"T2T1_pt_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "61394ba6e1d93a848315660846c306e86c20f0d24c52491d3aa1ca03b3051f2d",
|
||||
"T2T1_pt_test_lock.py::test_hold_to_lock": "5ab34b566d1766d037546d93c58b475b2817c568ecd1e236a6b39f0433b15d6c",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "4b613eee1b8b8e25a94d4c4b3f986c3a89efe37dd9d0a4f1538452e172122b4a",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "febff9b8464435ce083976a65aee289003137660b481b3a6da1b37c40fb1df16",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_delete": "face44e71b9cee2655cc8f3f89549e70efc792660509463cab1befb1c73ca038",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "e46a0b9a22b06be228f3fe371f007a7320592952c7cba718edbc588de92323fc",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "84e6eeab7315b3f424cf8f111c27a634ed6f00fa7eb46a229da21ff67f93f09f",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "5e7b0556c8bd398e54e43c42cdec7fa92aed711776bd0303711ede0cd2f0232f",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "185c69f495ff11ec8a88dccec210d36c7ae529dee5c69ee84e94503ab31c8588",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "08190951dfe32508acb96404dc08b11b8a5e09e2e51aa8d79018b2e006042709",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "b145e43c30f17e1fd30d88d08826ac0dd3362a0800b2064098b1ee0d8f6bec4b",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "a1600296d9a158698179b6e1f7e185a20fcd1359d6616a9db72dcaf863c927f6",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "a1600296d9a158698179b6e1f7e185a20fcd1359d6616a9db72dcaf863c927f6",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "eaf90dea602333803706c5effdf31788d0a1dcf2d96f87775ef992d816868d52",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "299b2ab2fb7db00c319586d08ed4fff0288e9c7f74e846c13c0667ff9031557a",
|
||||
"T2T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "e7443ffd713d3f788e36f482f3bb7f3c85d61f8fd8a541d777e6cd69ef9cf93b",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_cycle_through_last_character": "4b613eee1b8b8e25a94d4c4b3f986c3a89efe37dd9d0a4f1538452e172122b4a",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "febff9b8464435ce083976a65aee289003137660b481b3a6da1b37c40fb1df16",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_delete": "face44e71b9cee2655cc8f3f89549e70efc792660509463cab1befb1c73ca038",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_delete_all": "e46a0b9a22b06be228f3fe371f007a7320592952c7cba718edbc588de92323fc",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "84e6eeab7315b3f424cf8f111c27a634ed6f00fa7eb46a229da21ff67f93f09f",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "5e7b0556c8bd398e54e43c42cdec7fa92aed711776bd0303711ede0cd2f0232f",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "185c69f495ff11ec8a88dccec210d36c7ae529dee5c69ee84e94503ab31c8588",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "08190951dfe32508acb96404dc08b11b8a5e09e2e51aa8d79018b2e006042709",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "a1600296d9a158698179b6e1f7e185a20fcd1359d6616a9db72dcaf863c927f6",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "b145e43c30f17e1fd30d88d08826ac0dd3362a0800b2064098b1ee0d8f6bec4b",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "a1600296d9a158698179b6e1f7e185a20fcd1359d6616a9db72dcaf863c927f6",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "eaf90dea602333803706c5effdf31788d0a1dcf2d96f87775ef992d816868d52",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_loop_all_characters": "299b2ab2fb7db00c319586d08ed4fff0288e9c7f74e846c13c0667ff9031557a",
|
||||
"T2T1_pt_test_passphrase_bde.py::test_passphrase_prompt_disappears": "e7443ffd713d3f788e36f482f3bb7f3c85d61f8fd8a541d777e6cd69ef9cf93b",
|
||||
"T2T1_pt_test_pin.py::test_last_digit_timeout": "103e9b271f58a3f1c3b876c2c00c8db836340d38dd32bce37e232c04275b6ca0",
|
||||
"T2T1_pt_test_pin.py::test_pin_cancel": "f815d225cd25017c5869608a5125b9f190cd45e8a5e1e759570b87263c5606bd",
|
||||
"T2T1_pt_test_pin.py::test_pin_change": "a1394b7399b40bd36f1177352b352d90147c2cfae70caa873eb4e1621b3f0bd7",
|
||||
@ -18509,20 +18509,20 @@
|
||||
"T3T1_cs_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "417c1da9eab9498ebca12eeb68f84bcf91e7eda06462376cc78b2c3b91bba38f",
|
||||
"T3T1_cs_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "8a7d5aad9f5d2301efd1aa12cfcf1aff57d0e4f9988af59449ce0def5038049b",
|
||||
"T3T1_cs_test_lock.py::test_hold_to_lock": "008e9e7857137a528fdabdb8c345229b54ff30ac81121d348f760896bb983f24",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "c50284eafcac56ae79a885b69c41af731fbec058cb9c1b2c1530a0eba59578fc",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "527458f500d65b077b1eaeba65a37355a3f818d0ec530ad49184638c9640373e",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_delete": "dc9bc34e1a63c051cd681cbf93d3c285debd6365d730f08f786fb62c4ec21d37",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "073bf9e87d020bc0b1cf7cc4eb88c2400ac2eeaca52f3e615e5e07b317eee6b4",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "8c9ad0f284011c9f8b4a420aa1e561d4e8d79372e15527c323dfd4df7f0e658a",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "ad596ab7750d02356f66b92bf1cdcb581a6debf0e13d6a82066ad89fadd2516a",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "dbbd7e7abdd5974d5f686694393e8482479619b5aad88327cf9ac3b4c9b32280",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "5ff39279ecc92ee01f8080cf8c1838f73df239a64821ed1acd336aaeb0b0e6a7",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "dbe63a152374a1f6a21d5ca46e04bc8cdf11538563d32c183797d4633c3048ba",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "f0397a52adbc6db15642b57287663b7c26538226883fdf32fcbda05a324a2a7a",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "f0397a52adbc6db15642b57287663b7c26538226883fdf32fcbda05a324a2a7a",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "aa10b5ae0903d63d2079614a6d88576523ac5d45f9359c7a3d9d60ac39479fef",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "6422550f3a7f8b777951300934d36f6e4e0f8e0e0b8104179f564178383d8820",
|
||||
"T3T1_cs_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "ed09230cc4dcd03e181ebb779b028104c53fa3865f386e0b93fc8bec3e9bcda0",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_cycle_through_last_character": "c50284eafcac56ae79a885b69c41af731fbec058cb9c1b2c1530a0eba59578fc",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "527458f500d65b077b1eaeba65a37355a3f818d0ec530ad49184638c9640373e",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_delete": "dc9bc34e1a63c051cd681cbf93d3c285debd6365d730f08f786fb62c4ec21d37",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_delete_all": "073bf9e87d020bc0b1cf7cc4eb88c2400ac2eeaca52f3e615e5e07b317eee6b4",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "8c9ad0f284011c9f8b4a420aa1e561d4e8d79372e15527c323dfd4df7f0e658a",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "ad596ab7750d02356f66b92bf1cdcb581a6debf0e13d6a82066ad89fadd2516a",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "dbbd7e7abdd5974d5f686694393e8482479619b5aad88327cf9ac3b4c9b32280",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "5ff39279ecc92ee01f8080cf8c1838f73df239a64821ed1acd336aaeb0b0e6a7",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "f0397a52adbc6db15642b57287663b7c26538226883fdf32fcbda05a324a2a7a",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "dbe63a152374a1f6a21d5ca46e04bc8cdf11538563d32c183797d4633c3048ba",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "f0397a52adbc6db15642b57287663b7c26538226883fdf32fcbda05a324a2a7a",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "aa10b5ae0903d63d2079614a6d88576523ac5d45f9359c7a3d9d60ac39479fef",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_loop_all_characters": "6422550f3a7f8b777951300934d36f6e4e0f8e0e0b8104179f564178383d8820",
|
||||
"T3T1_cs_test_passphrase_bde.py::test_passphrase_prompt_disappears": "ed09230cc4dcd03e181ebb779b028104c53fa3865f386e0b93fc8bec3e9bcda0",
|
||||
"T3T1_cs_test_pin.py::test_last_digit_timeout": "a55871bd8f531347fcb5aba6520f44f82656a3743ba3cd93d1e6b04ed69c22b2",
|
||||
"T3T1_cs_test_pin.py::test_pin_cancel": "cafc4112a2fa322bfe3a3418b741224782f89af94a721aa821a65210068d03ec",
|
||||
"T3T1_cs_test_pin.py::test_pin_change": "4410ad3aa1853d194d7692c5e2a9ecef8d22af2b1809a1f787cf8dfb235f1141",
|
||||
@ -18566,20 +18566,20 @@
|
||||
"T3T1_de_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "2e415e3f1da52a170dbfc98da4876c230b736f684e53c1a0431572ce1fb4d5c5",
|
||||
"T3T1_de_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "058b55b4c3807ff7036447b2d3c8cb11bcd850f4d83b098a88a76c3d0f97003f",
|
||||
"T3T1_de_test_lock.py::test_hold_to_lock": "f1914f56db5cec3b90e32e8e230ad88095fd440142fa21fa7617c2e60dc026a7",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "5479b3d89d4b012da273d984568de2feddb76a032382e9b6c1fe79537bb67aad",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "141b25b1c7a5e787008b03d386fda377d1042f5a841fb5f8a0ad05fd8f789e74",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_delete": "a351f8e01668b9fc8ed960510df87ffbb6f2744dd6d08562618478a2e1f29f6b",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "0e6a2d3f48c5a37478c75b00e3da4502771e696a3b678e9d5379699fe3c4d37f",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "b3bbd1502e2598bf65a97b7fa3ee17b7cc946312434df3c718ff524694d40c8d",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "72e69e958823e24ceb7fdff40ace2c3de29002c2c116f93425deb43b55caf456",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "7e215169b7ac4c278bf47b154a06314c381dcb4ade7dd2005476ed064516e59c",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "04b9b4e83e8cea2240339b3c66d1e324e7dc6b717eff9744096086a2e6612c39",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "1e70fc310891e4a336c928497549b58ea2aaf63bacb61c4ac6821f23633cb7d8",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "6fec17f535504713bf6d8a3b21e85116a8b9653d311a23fd0ed26bf75d216a59",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "6fec17f535504713bf6d8a3b21e85116a8b9653d311a23fd0ed26bf75d216a59",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "42b7fd13571777886f13c5f9afb7d6fac8c4530aa7b682806e1acd210b1d3882",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "47820e5f70c0c68fe5545b9adb3872f065f4dbc117d38333b7d8af3fe34cbe48",
|
||||
"T3T1_de_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "5f0dbf85426c0f8f5df1a47ea49e52bbc90785a64bba07c630965e90315bfa9d",
|
||||
"T3T1_de_test_passphrase_bde.py::test_cycle_through_last_character": "5479b3d89d4b012da273d984568de2feddb76a032382e9b6c1fe79537bb67aad",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "141b25b1c7a5e787008b03d386fda377d1042f5a841fb5f8a0ad05fd8f789e74",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_delete": "a351f8e01668b9fc8ed960510df87ffbb6f2744dd6d08562618478a2e1f29f6b",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_delete_all": "0e6a2d3f48c5a37478c75b00e3da4502771e696a3b678e9d5379699fe3c4d37f",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "b3bbd1502e2598bf65a97b7fa3ee17b7cc946312434df3c718ff524694d40c8d",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "72e69e958823e24ceb7fdff40ace2c3de29002c2c116f93425deb43b55caf456",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "7e215169b7ac4c278bf47b154a06314c381dcb4ade7dd2005476ed064516e59c",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "04b9b4e83e8cea2240339b3c66d1e324e7dc6b717eff9744096086a2e6612c39",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "6fec17f535504713bf6d8a3b21e85116a8b9653d311a23fd0ed26bf75d216a59",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "1e70fc310891e4a336c928497549b58ea2aaf63bacb61c4ac6821f23633cb7d8",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "6fec17f535504713bf6d8a3b21e85116a8b9653d311a23fd0ed26bf75d216a59",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "42b7fd13571777886f13c5f9afb7d6fac8c4530aa7b682806e1acd210b1d3882",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_loop_all_characters": "47820e5f70c0c68fe5545b9adb3872f065f4dbc117d38333b7d8af3fe34cbe48",
|
||||
"T3T1_de_test_passphrase_bde.py::test_passphrase_prompt_disappears": "5f0dbf85426c0f8f5df1a47ea49e52bbc90785a64bba07c630965e90315bfa9d",
|
||||
"T3T1_de_test_pin.py::test_last_digit_timeout": "b3f46f09362d04a4832e509f4edf7acefc50515c51f17e7fede09d65266c1189",
|
||||
"T3T1_de_test_pin.py::test_pin_cancel": "3d1c8dc5bd2303e0183a6d17112ea1127c1d100d304a5c20a332ad13890f6e11",
|
||||
"T3T1_de_test_pin.py::test_pin_change": "183779e3e93ada1c42fc9e58a9073509b8d3df1d0c0315dc9515ae8a21a7a7bc",
|
||||
@ -18623,20 +18623,20 @@
|
||||
"T3T1_en_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "dbc79cc01c7e40d3043ddf0231a74975ac5c75801cab161239d848b9cb97266f",
|
||||
"T3T1_en_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "8dea9aed81d7741c4e8db17feea5b7c09222c3bf3d86cda3590f6076dd990234",
|
||||
"T3T1_en_test_lock.py::test_hold_to_lock": "b4ca63c91c71fa0fa234c75414fd164b5894ff5d65fc99e5b3e25585c0869ac9",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "bfe9b72679d7a96ef7556eb229c5b2ffe317e3f00a8a75d3dd6a23569a2e2b03",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "51b8976fa208dd26dfc18f81eb6362426daa69ee4bed46738428c8a56094d9bf",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_delete": "aaecc001b2dc624bfd1e62f5b908a9adab997d9cfd4eb742ee94388cd18ed16e",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "beee4c8e93857b3dc9229aefe34919dca39c327876d98fbe2b7b0d676ef84884",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "45eb7d9f2deb84ee105978c13fa7bdd0639dbfb75399bdabf5cb3eeaf051ae29",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "2d7dbb776dabd5b67ff3cd9576713bee98a658c3feaef788f15b9ac5943440c4",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "2b138f5b450c6cbe1b4b22c84ccca5d00ce65383710cf18b9a6a245f9849c6da",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "757fb127aefcc01a5cbf35b9ea7fb457f3a217df13eefa3290ac35bc7159bfbe",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "7c2ee5a5a96939d09b9ad3927efcb87d3bec5db8fa3ab712b1571d0b995f2341",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "3987e9840c5ce6c637b0b050217a6bc1aa04636e69f9d111f482c8ae95e10e9f",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "3987e9840c5ce6c637b0b050217a6bc1aa04636e69f9d111f482c8ae95e10e9f",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "76bcf47232ad0b2efd6847a0c167ef687516032b1f00bc5ae426add81ada5718",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "b47f39928aa3942ef0ae0c37fa1b9babcf9a056e14cb79672076b81dbb4e60a1",
|
||||
"T3T1_en_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "618a3f28184eba404c7c8c22403b059384adf77caab19db9ea291adc732ead65",
|
||||
"T3T1_en_test_passphrase_bde.py::test_cycle_through_last_character": "bfe9b72679d7a96ef7556eb229c5b2ffe317e3f00a8a75d3dd6a23569a2e2b03",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "51b8976fa208dd26dfc18f81eb6362426daa69ee4bed46738428c8a56094d9bf",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_delete": "aaecc001b2dc624bfd1e62f5b908a9adab997d9cfd4eb742ee94388cd18ed16e",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_delete_all": "beee4c8e93857b3dc9229aefe34919dca39c327876d98fbe2b7b0d676ef84884",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "45eb7d9f2deb84ee105978c13fa7bdd0639dbfb75399bdabf5cb3eeaf051ae29",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "2d7dbb776dabd5b67ff3cd9576713bee98a658c3feaef788f15b9ac5943440c4",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "2b138f5b450c6cbe1b4b22c84ccca5d00ce65383710cf18b9a6a245f9849c6da",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "757fb127aefcc01a5cbf35b9ea7fb457f3a217df13eefa3290ac35bc7159bfbe",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "3987e9840c5ce6c637b0b050217a6bc1aa04636e69f9d111f482c8ae95e10e9f",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "7c2ee5a5a96939d09b9ad3927efcb87d3bec5db8fa3ab712b1571d0b995f2341",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "3987e9840c5ce6c637b0b050217a6bc1aa04636e69f9d111f482c8ae95e10e9f",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "76bcf47232ad0b2efd6847a0c167ef687516032b1f00bc5ae426add81ada5718",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_loop_all_characters": "b47f39928aa3942ef0ae0c37fa1b9babcf9a056e14cb79672076b81dbb4e60a1",
|
||||
"T3T1_en_test_passphrase_bde.py::test_passphrase_prompt_disappears": "618a3f28184eba404c7c8c22403b059384adf77caab19db9ea291adc732ead65",
|
||||
"T3T1_en_test_pin.py::test_last_digit_timeout": "0148d07632083c0aab92088210066cb4cbd1af2a28886dfeb9e4e46d2cbfba49",
|
||||
"T3T1_en_test_pin.py::test_pin_cancel": "9e676c054a1fa6b28863b19bb20c3b6cdf02fa5fb719e7a6fe3ef319d271a909",
|
||||
"T3T1_en_test_pin.py::test_pin_change": "e1e9890ef197048cbbd21ff6b6e3de3260b1224ab91819846c9f69b171bf7f13",
|
||||
@ -18680,20 +18680,20 @@
|
||||
"T3T1_es_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "e10d549079e227cf8b34c8178ebe2e66df912f13de067f45461ad84845cddcb7",
|
||||
"T3T1_es_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "14a0303ee6b35a54e036fdf7fdfdad33fed64d5c2d05429d62f28c01df2f9cee",
|
||||
"T3T1_es_test_lock.py::test_hold_to_lock": "25ff10a405a3050bee8e4ae17f9665f74d14cd7e4efc1d3b5dc2ea76fae59705",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "84aeacbc3d043929234703fb3dccd72c7bdc0d3bb0f28fb48ca1e7fbbb4d0f43",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "5a40a16033f0e14bdcdc3eeb5ff90aa7e523a69ad2cadc4c2d0d1c465889956a",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_delete": "212fba34f984cab514d0d8acc7ea42b7a27d57123e4321ad19a5e481dac8324a",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "98ddb83a20fba6a4add7c67853beb0a21a75361498156aa1065bb74d7b2914a2",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "505ded757d720b3ec87e12127cfc398fa8af0f24bed826499072c49b3e22a5a2",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "8824aebff8c9f9e058570441796178a7f27989f6ee38f582a1b901d4ecfb98db",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "075547f290aeca437bbaa568fbc8f6899db88a6962cfcf8f781520d612099c57",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "79c6a0f823bee2505360ae62a61096b9d86bf9967cbaf002e1a9babdc712789c",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "15d200f00654a727b000337bcac711a654f15daaa67518bc1e09b06335d03cf7",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "da7c751102a99b85f96ede00d20559d9b853c4ea0aa790761fed4581e02e64d0",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "da7c751102a99b85f96ede00d20559d9b853c4ea0aa790761fed4581e02e64d0",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "f31ce5f8302389f97750b256b0b485435e91ec5ee08747b59ada72237e4fb8da",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "e111e7f242da77a574582e1405d1404065a7bd4509f457c46ef367fd66dbef93",
|
||||
"T3T1_es_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "5361fde031f692aa40f32e0c218f5c7cb9eb7ebdfcd75525a437ab29bc11ef05",
|
||||
"T3T1_es_test_passphrase_bde.py::test_cycle_through_last_character": "84aeacbc3d043929234703fb3dccd72c7bdc0d3bb0f28fb48ca1e7fbbb4d0f43",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "5a40a16033f0e14bdcdc3eeb5ff90aa7e523a69ad2cadc4c2d0d1c465889956a",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_delete": "212fba34f984cab514d0d8acc7ea42b7a27d57123e4321ad19a5e481dac8324a",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_delete_all": "98ddb83a20fba6a4add7c67853beb0a21a75361498156aa1065bb74d7b2914a2",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "505ded757d720b3ec87e12127cfc398fa8af0f24bed826499072c49b3e22a5a2",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "8824aebff8c9f9e058570441796178a7f27989f6ee38f582a1b901d4ecfb98db",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "075547f290aeca437bbaa568fbc8f6899db88a6962cfcf8f781520d612099c57",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "79c6a0f823bee2505360ae62a61096b9d86bf9967cbaf002e1a9babdc712789c",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "da7c751102a99b85f96ede00d20559d9b853c4ea0aa790761fed4581e02e64d0",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "15d200f00654a727b000337bcac711a654f15daaa67518bc1e09b06335d03cf7",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "da7c751102a99b85f96ede00d20559d9b853c4ea0aa790761fed4581e02e64d0",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "f31ce5f8302389f97750b256b0b485435e91ec5ee08747b59ada72237e4fb8da",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_loop_all_characters": "e111e7f242da77a574582e1405d1404065a7bd4509f457c46ef367fd66dbef93",
|
||||
"T3T1_es_test_passphrase_bde.py::test_passphrase_prompt_disappears": "5361fde031f692aa40f32e0c218f5c7cb9eb7ebdfcd75525a437ab29bc11ef05",
|
||||
"T3T1_es_test_pin.py::test_last_digit_timeout": "360b933ce75a8b890d3dde92af84693df89555f92bde04bc18b677a944e55933",
|
||||
"T3T1_es_test_pin.py::test_pin_cancel": "f1257d486cbb7cf38e201755768e4585b2ca9eec9109f50e56adf9b8b26283ff",
|
||||
"T3T1_es_test_pin.py::test_pin_change": "c4460c85107447649589487d2af1896793a41fe9951b169a61df0a7d5861f4ec",
|
||||
@ -18737,20 +18737,20 @@
|
||||
"T3T1_fr_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "33f5999146317f4c8591e494d9ccdca1256cd8154f98752f9d11ee06d8bec905",
|
||||
"T3T1_fr_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "81a4083de2e5dd0cb2735fcdfff488f277f8fcfae63401f3d0adad795395e28a",
|
||||
"T3T1_fr_test_lock.py::test_hold_to_lock": "b4a79c04782cf6a422f731b2984cf6457d14458907ad62eeff2788596734201c",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "eade578f09bef8d45a2947d551be705cd6a965cc3f4ba0f4cb19f4bc6ccad229",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "594c436164883d7c39e66eab4b4fc60ca5ee2b0e9be01ac853e242fda5d7a810",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_delete": "76c73fa4aa95b1456a73a4a702070f8d1e4e1621deadf800c3a666016695bfb1",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "00fda4440890477e576f52abb53307739913652112db2fd6513cde1205bb592e",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "68f17d282a7d14fd48b81bbce9dbf062b4bc2543bbeba4c0d870c3e8b4c88bb4",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "076d980ed04dd7ff8f40a2001a2380d7290a23e0c247da10a2c34727b0654879",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "353ab91e078508d9b2815cd718510634c52664bf9ac27a8daa902e7b19bb91c8",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "04d44628eca02967820f391f02eaead6e2811f8b0ad94f8584f65aa136e126a7",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "4e7d639cdac426bc0c831e130b438b527b3d61eed8b50306d5cfff9711c7393a",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "dc5fc5b63f499df0876aecc956e4738c4275d0dccad2978e7013b1aa86d66424",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "dc5fc5b63f499df0876aecc956e4738c4275d0dccad2978e7013b1aa86d66424",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "03c08d5b5329a6a3ed5be05302dadf2a4721eb655210b5e4069b110816850795",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "634c9b42a9cd5fadbfa8793fd0844d8e84f80997bf52b7941333f9b193c5c3e0",
|
||||
"T3T1_fr_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "636816e3224b253aab48403cd198fcf62f2b6a6ee4df95bcebb5c951948d9ee4",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_cycle_through_last_character": "eade578f09bef8d45a2947d551be705cd6a965cc3f4ba0f4cb19f4bc6ccad229",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "594c436164883d7c39e66eab4b4fc60ca5ee2b0e9be01ac853e242fda5d7a810",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_delete": "76c73fa4aa95b1456a73a4a702070f8d1e4e1621deadf800c3a666016695bfb1",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_delete_all": "00fda4440890477e576f52abb53307739913652112db2fd6513cde1205bb592e",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "68f17d282a7d14fd48b81bbce9dbf062b4bc2543bbeba4c0d870c3e8b4c88bb4",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "076d980ed04dd7ff8f40a2001a2380d7290a23e0c247da10a2c34727b0654879",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "353ab91e078508d9b2815cd718510634c52664bf9ac27a8daa902e7b19bb91c8",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "04d44628eca02967820f391f02eaead6e2811f8b0ad94f8584f65aa136e126a7",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "dc5fc5b63f499df0876aecc956e4738c4275d0dccad2978e7013b1aa86d66424",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "4e7d639cdac426bc0c831e130b438b527b3d61eed8b50306d5cfff9711c7393a",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "dc5fc5b63f499df0876aecc956e4738c4275d0dccad2978e7013b1aa86d66424",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "03c08d5b5329a6a3ed5be05302dadf2a4721eb655210b5e4069b110816850795",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_loop_all_characters": "634c9b42a9cd5fadbfa8793fd0844d8e84f80997bf52b7941333f9b193c5c3e0",
|
||||
"T3T1_fr_test_passphrase_bde.py::test_passphrase_prompt_disappears": "636816e3224b253aab48403cd198fcf62f2b6a6ee4df95bcebb5c951948d9ee4",
|
||||
"T3T1_fr_test_pin.py::test_last_digit_timeout": "ce42c7128e6c30c6e421f5d9f653a003eafcbcd43d2f67b3adb71af11af6c93a",
|
||||
"T3T1_fr_test_pin.py::test_pin_cancel": "f566b5ef1b01df0fc96291eac714a44f3ab85d3bfbe43fd930d674797dd3bbe4",
|
||||
"T3T1_fr_test_pin.py::test_pin_change": "ebbf9a3572adbf869837916deb07d805d7b219c936678595a9ac10e18cf77b82",
|
||||
@ -18794,20 +18794,20 @@
|
||||
"T3T1_pt_test_backup_slip39_custom.py::test_backup_slip39_custom[2of3]": "e280538e5ac2a4b17d15008f1557d86aaa06b97cae5e564f307f126f1c1aebd8",
|
||||
"T3T1_pt_test_backup_slip39_custom.py::test_backup_slip39_custom[5of5]": "80c71d70a3a7d72dc3c2ed40e9b171a2dffc3e757e1f716b532c3580ca984fc0",
|
||||
"T3T1_pt_test_lock.py::test_hold_to_lock": "11eafea6b15f8f6e9abd932233f7d87bdc10f527f15b362f45c9b2992ce42091",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_cycle_through_last_character": "34f794c37c42d5d48fe7488291da0eaa64c73ae4a68e5700da5cbbaab67127df",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_click_same_button_many_times": "55ded59a77246d9611fef27fc2cbd7f7a310979e0be536c1e2cef6debcde2bda",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_delete": "7a9621e814820c8e34d31c53bc511a0513e9409ad2af4357c8d4d02863b1db54",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_delete_all": "17b9dd0e0154d2f8a5bd72f84fbc3df5850af6547f8fd8ff873481aa47b35f10",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_dollar_sign_deletion": "ed76567916be7c4792b2883051cfef592f7b869d4c236dfe4719c40cb9741bd7",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzL-378fe4ae": "32ff45d856030e399c7a6b9986700959c7f3d6d56ae977ef9728629ebd58b5e2",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "6782faf514031298fbb27b986bbfa86ba1ac2e0bb9948c0ddfcc01ed0aab8457",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97-ba38238e": "ab0a374dbc7cdfa55a3d002fda9528b43b32f467c5b5c8a86a94dc33c28924f9",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-11fcbfea": "b22de26ed81d60845cc533d220f98254a87568921431cca5ed7b8e8a2166feda",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input[dadadadadadadadadadadadadadadadadada-4f4d1ec7": "ae4872c9ffe24cdd4b72414f47a6445e7c1ea880f786e22b2a46254bf71fa0ff",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_input_over_50_chars": "ae4872c9ffe24cdd4b72414f47a6445e7c1ea880f786e22b2a46254bf71fa0ff",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_long_spaces_deletion": "3edfec06a86b7d7cf7ae1cd1e97b9a8d7bb0d8d855b94e4c88c1b6098e8fa89e",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_loop_all_characters": "265e14a603c4cf25b2a38ca23fb594c1b51bfc33164993b5df5ca2ee2245b2e6",
|
||||
"T3T1_pt_test_passphrase_bolt_delizia.py::test_passphrase_prompt_disappears": "d9100a96878999cc4ad31c5428d8cd7a9ba6271a2cb7d86c5234996fff0715a5",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_cycle_through_last_character": "34f794c37c42d5d48fe7488291da0eaa64c73ae4a68e5700da5cbbaab67127df",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_click_same_button_many_times": "55ded59a77246d9611fef27fc2cbd7f7a310979e0be536c1e2cef6debcde2bda",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_delete": "7a9621e814820c8e34d31c53bc511a0513e9409ad2af4357c8d4d02863b1db54",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_delete_all": "17b9dd0e0154d2f8a5bd72f84fbc3df5850af6547f8fd8ff873481aa47b35f10",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_dollar_sign_deletion": "ed76567916be7c4792b2883051cfef592f7b869d4c236dfe4719c40cb9741bd7",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_input[Y@14lw%p)JN@f54MYvys@zj'g-mnkoxeaMzLgfCxUdDSZ-aaae4aa2": "32ff45d856030e399c7a6b9986700959c7f3d6d56ae977ef9728629ebd58b5e2",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_input[abc 123-mvqzZUb9NaUc62Buk9WCP4L7hunsXFyamT]": "6782faf514031298fbb27b986bbfa86ba1ac2e0bb9948c0ddfcc01ed0aab8457",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_input[abc123ABC_<>-mtHHfh6uHtJiACwp7kzJZ97yueT6sEdQiG]": "ab0a374dbc7cdfa55a3d002fda9528b43b32f467c5b5c8a86a94dc33c28924f9",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-66a83b65": "ae4872c9ffe24cdd4b72414f47a6445e7c1ea880f786e22b2a46254bf71fa0ff",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_input[dadadadadadadadadadadadadadadadadadadadadadad-7159c03e": "b22de26ed81d60845cc533d220f98254a87568921431cca5ed7b8e8a2166feda",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_input_over_50_chars": "ae4872c9ffe24cdd4b72414f47a6445e7c1ea880f786e22b2a46254bf71fa0ff",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_long_spaces_deletion": "3edfec06a86b7d7cf7ae1cd1e97b9a8d7bb0d8d855b94e4c88c1b6098e8fa89e",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_loop_all_characters": "265e14a603c4cf25b2a38ca23fb594c1b51bfc33164993b5df5ca2ee2245b2e6",
|
||||
"T3T1_pt_test_passphrase_bde.py::test_passphrase_prompt_disappears": "d9100a96878999cc4ad31c5428d8cd7a9ba6271a2cb7d86c5234996fff0715a5",
|
||||
"T3T1_pt_test_pin.py::test_last_digit_timeout": "1f0cf830e8e0900afe1adf43add940e80dc985d83beff371709a16d985b17f0c",
|
||||
"T3T1_pt_test_pin.py::test_pin_cancel": "bb5b541dc64dadb1dff07deff7b9dda59fac608b2ebab0eb2b9187816197d199",
|
||||
"T3T1_pt_test_pin.py::test_pin_change": "4de9eecc8b6e4d35ddbc1ba5fe4a464fe749b6f29fb40d5bfbd2f2d23fc78011",
|
||||
|
Loading…
Reference in New Issue
Block a user