Skip to content

Commit

Permalink
Add Stax layouts for generating SSKR shares
Browse files Browse the repository at this point in the history
  • Loading branch information
aido committed Apr 19, 2024
1 parent 315ec8d commit a61079e
Show file tree
Hide file tree
Showing 10 changed files with 66 additions and 66 deletions.
6 changes: 3 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,8 +98,8 @@

## [1.5.0] - 2023-10-20
### Added
- Added option to generate BIP39 mnemonics from SSKR shares even if shares do not validate against seed on device
- A user may have lost or damaged original device and now needs to generate the recovery phrase from another secure device
- Added option to recover BIP39 mnemonics from SSKR shares even if shares do not validate against seed on device
- A user may have lost or damaged original device and now needs to recover the BIP39 phrase from another secure device

### Changed
-
Expand Down Expand Up @@ -183,7 +183,7 @@

## [1.1.0] - 2023-04-04
### Added
- Generate BIP39 mnemonic phrases from SSKR shares
- Recover BIP39 mnemonic phrases from SSKR shares
- Add 'SSKR Check' menu option
- Add flow to the 'SSKR Check' menu
- Write SSKR to BIP39 functionality
Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

---

Use the utilities provided by this Ledger application to check a backed up seed or generate [Shamir's Secret Sharing (SSS)](https://en.wikipedia.org/wiki/Shamir%27s_secret_sharing) for a seed.
Use the utilities provided by this Ledger application to check a backed up BIP-39 seed, generate [Shamir's Secret Sharing (SSS)](https://en.wikipedia.org/wiki/Shamir%27s_secret_sharing) for a seed or recover a BIP-39 phrase from a Shamir's Secret Sharing backup.

Not all Ledger devices are equal. The older, less capable devices do not have the capacity to provide a full range of seed utilities. The following table lists the seed utilities provided by each devices type:
<div align="center">
Expand All @@ -28,7 +28,7 @@ Not all Ledger devices are equal. The older, less capable devices do not have th
|[Check BIP39](#check-bip39)|$${\color{green}✓}$$|$${\color{green}✓}$$|$${\color{green}✓}$$|$${\color{green}✓}$$|
|[Check Shamir's secret shares](#check-shamirs-secret-shares)|$${\color{green}✓}$$|$${\color{green}✓}$$|$${\color{green}✓}$$|$${\color{orange}✓}$$|
|[Generate Shamir's secret sharing](#generate-shamirs-secret-sharing)|$${\color{green}✓}$$|$${\color{green}✓}$$|$${\color{green}✓}$$|$${\color{orange}✓}$$|
|[Generate BIP39](#generate-bip39)|$${\color{green}✓}$$|$${\color{green}✓}$$|$${\color{green}✓}$$|$${\color{orange}✓}$$|
|[Recover BIP39](#recover-bip39)|$${\color{green}✓}$$|$${\color{green}✓}$$|$${\color{green}✓}$$|$${\color{orange}✓}$$|
|[Generate BIP85](#generate-bip85)|$${\color{red}✗}$$|$${\color{orange}✓}$$|$${\color{orange}✓}$$|$${\color{orange}✓}$$|
</div>

Expand Down Expand Up @@ -59,8 +59,8 @@ For more information about SSKR, see [SSKR for Users](https://github.com/Blockch
## Check Shamir's secret shares
The Ledger application also provides an option to confirm the onboarded seed against SSKR shares.

## Generate BIP39
When the Shamir's secret shares have been validated the user can generate the BIP39 recovery phrase derived from those shares. This option takes advantage of SSKR's ability to perform a BIP39 <-> SSKR round trip. If a user has lost or damaged their original Ledger device they may need to generate the BIP39 recovery phrase on another secure device. A BIP39 recovery phrase may still be generated even if the SSKR phrases do not match the onboarded seed of a device but are still valid SSKR shares.
## Recover BIP39
When the Shamir's secret shares have been validated the user can recover the BIP39 phrase derived from those shares. This option takes advantage of SSKR's ability to perform a BIP39 <-> SSKR round trip. If a user has lost or damaged their original Ledger device they may need to recover their BIP39 phrase on another secure device. A BIP39 phrase may still be recovered even if the SSKR phrases do not match the onboarded seed of a device but are still valid SSKR shares.

## Generate [BIP85](https://github.com/bitcoin/bips/blob/master/bip-0085.mediawiki)
Coming soon!!!!
Expand Down Expand Up @@ -90,9 +90,9 @@ flowchart LR
2.1[Check SSKR] --> 2.2[Enter SSKR Shares] --> 2.3{Validate SSKR Shares}
2.3 --> |Valid SSKR| 2.4
2.3 --> |Invalid SSKR| 2.3.1[Quit]
subgraph 2.4[Generate BIP39 Phrases]
subgraph 2.4[Recover BIP39 Phrases]
direction TB
2.4.1[Generate BIP39 Phrases] --> 2.4.2[Display BIP39 Phrases] --> 2.4.3[Quit]
2.4.1[Recover BIP39 Phrases] --> 2.4.2[Display BIP39 Phrases] --> 2.4.3[Quit]
end
end
subgraph 3[Version]
Expand Down
6 changes: 3 additions & 3 deletions TODO.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,15 @@
- [x] Save memory by setting the SSKR word buffer (G_bolos_ux_context.sskr_words_buffer) to a sensible size
- [x] Add unit tests
- [x] Add code coverage to GitHub actions
- [x] Add option to generate BIP39 mnemonics from SSKR shares even if shares do not validate against seed on device
- A user may have lost or damaged original device and now needs to generate the recovery phrase from another secure device
- [x] Add option to recover BIP39 mnemonics from SSKR shares even if shares do not validate against seed on device
- A user may have lost or damaged original device and now needs to recover the BIP39 phrase from another secure device
- [x] Fix warnings about deprecated functions during build
- [x] Remove duplicated nano code
- [x] Simplified flow code
- [x] Add flow to set SSKR threshold values
- [x] Add automated tests
- [x] Fix issue with using 'cx_crc32_hw()' function in 'onboarding_seed_sskr.c' when testing with Speculos
- [x] Generate BIP39 mnemonic phrases from SSKR shares
- [x] Recover BIP39 mnemonic phrases from SSKR shares
- [x] Add SSKR Check menu option
- [x] Add flow to the Check SSKR menu
- [x] Write SSKR to BIP39 functionality
Expand Down
8 changes: 4 additions & 4 deletions src/nano/nanos_enter_phrase.c
Original file line number Diff line number Diff line change
Expand Up @@ -132,13 +132,13 @@ UX_STEP_VALID(ux_bip39_match_step_1,
clean_exit(0),
{&C_icon_validate_14, "BIP39 Phrase", "is correct"});
UX_STEP_CB(ux_bip39_match_step_2, pb, clean_exit(0), {&C_icon_dashboard_x, "Quit"});
UX_STEP_CB(ux_bip39_generate_step_1, pbb, set_sskr_descriptor_values();
UX_STEP_CB(ux_bip39_recover_step_1, pbb, set_sskr_descriptor_values();
, {&SSKR_ICON, "Generate", "SSKR phrases"});

UX_FLOW(ux_bip39_match_flow,
&ux_bip39_match_step_1,
&ux_bip39_match_step_2,
&ux_bip39_generate_step_1);
&ux_bip39_recover_step_1);

UX_STEP_CB(ux_sskr_invalid_step_1, pbb, screen_onboarding_sskr_restore_init();
, {&C_icon_warning, "SSKR Recovery", "phrase invalid"});
Expand All @@ -158,14 +158,14 @@ UX_FLOW(ux_sskr_nomatch_flow,
&ux_sskr_nomatch_step_1,
&ux_sskr_nomatch_step_2,
&ux_sskr_nomatch_step_3,
&ux_bip39_generate_step_1);
&ux_bip39_recover_step_1);

UX_STEP_VALID(ux_sskr_match_step_1,
pbb,
clean_exit(0),
{&C_icon_validate_14, "SSKR Phrase", "is correct"});
UX_STEP_CB(ux_sskr_match_step_2, pb, clean_exit(0), {&C_icon_dashboard_x, "Quit"});
UX_STEP_CB(ux_sskr_match_step_3, pbb, generate_bip39();, {&BIP39_ICON, "Generate", "BIP39 phrase"});
UX_STEP_CB(ux_sskr_match_step_3, pbb, recover_bip39();, {&BIP39_ICON, "Recover", "BIP39 phrase"});

UX_FLOW(ux_sskr_match_flow, &ux_sskr_match_step_1, &ux_sskr_match_step_2, &ux_sskr_match_step_3);

Expand Down
8 changes: 4 additions & 4 deletions src/nano/nanox_enter_phrase.c
Original file line number Diff line number Diff line change
Expand Up @@ -192,14 +192,14 @@ UX_STEP_NOCB(ux_sskr_nomatch_step_2,
"order and spelling",
});
UX_STEP_VALID(ux_sskr_nomatch_step_3, pb, ui_idle_init(), {&C_icon_back_x, "Return to menu"});
UX_STEP_CB(ux_bip39_generate_step_1, pbb, generate_bip39();
, {&BIP39_ICON, "Generate", "BIP39 phrases"});
UX_STEP_CB(ux_bip39_recover_step_1, pbb, recover_bip39();
, {&BIP39_ICON, "Recover", "BIP39 phrases"});

UX_FLOW(ux_sskr_nomatch_flow,
&ux_sskr_nomatch_step_1,
&ux_sskr_nomatch_step_2,
&ux_sskr_nomatch_step_3,
&ux_bip39_generate_step_1);
&ux_bip39_recover_step_1);

UX_STEP_VALID(ux_sskr_match_step_1,
pbb,
Expand All @@ -210,7 +210,7 @@ UX_STEP_CB(ux_sskr_match_step_2, pb, clean_exit(0), {&C_icon_dashboard_x, "Quit"
UX_FLOW(ux_sskr_match_flow,
&ux_sskr_match_step_1,
&ux_sskr_match_step_2,
&ux_bip39_generate_step_1);
&ux_bip39_recover_step_1);

unsigned int screen_onboarding_restore_word_select_button(unsigned int button_mask,
unsigned int button_mask_counter);
Expand Down
2 changes: 1 addition & 1 deletion src/nano/ux_nano.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ void screen_common_keyboard_init(unsigned int stack_slot,
keyboard_callback_t callback);

void set_sskr_descriptor_values(void);
void generate_bip39(void);
void recover_bip39(void);

#include "ux_common/common_bip39.h"
#include "ux_common/common_sskr.h"
Expand Down
2 changes: 1 addition & 1 deletion src/nano/ux_nano_bip39.c
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ UX_STEP_CB(step_bip39_clean_exit, pb, clean_exit(0), {&C_icon_dashboard_x, "Quit

UX_FLOW(display_bip39_flow, &step_display_bip39, &step_bip39_clean_exit, FLOW_LOOP);

void generate_bip39(void) {
void recover_bip39(void) {
// BIP39 phrase should already be in G_bolos_ux_context.words_buffer so just need to display it
ux_flow_init(0, display_bip39_flow, NULL);
}
Expand Down
84 changes: 42 additions & 42 deletions src/stax/ui_stax.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ static char headerText[HEADER_SIZE] = {0};
static nbgl_layout_t *layout = 0;

static void display_home_page(void);
static void display_select_bip39_passphrase_length_page(void);
static void display_bip39_select_phrase_length_page(void);
static void display_bip39_keyboard_page(void);
static void display_result_page(const bool result);
static void display_numshares_keypad_page(void);
static void display_sskr_select_numshares_page(void);

enum bip39_check {
BACK_BUTTON_TOKEN = FIRST_USER_TOKEN,
Expand Down Expand Up @@ -57,7 +57,7 @@ static void on_quit(void) {
* About menu
*/
static const char *const infoTypes[] = {"Version", "Seed Tool"};
static const char *const infoContents[] = {APPVERSION, "(c) 2023 Ledger"};
static const char *const infoContents[] = {APPVERSION, "(c) 2024 Ledger"};

static bool on_infos(uint8_t page, nbgl_pageContent_t *content) {
if (page == 0) {
Expand Down Expand Up @@ -94,7 +94,7 @@ static void select_check_type_callback(nbgl_obj_t *obj, nbgl_touchType_t eventTy
io_seproxyhal_play_tune(TUNE_TAP_CASUAL);
if (obj == screenChildren[SELECT_CHECK_TYPE_BIP39_INDEX]) {
nbgl_layoutRelease(layout);
display_select_bip39_passphrase_length_page();
display_bip39_select_phrase_length_page();
} else if (obj == screenChildren[SELECT_CHECK_TYPE_SSKR_INDEX]) {
nbgl_layoutRelease(layout);
display_home_page();
Expand All @@ -117,7 +117,7 @@ static void display_select_check_type_page(void) {
screenChildren[SELECT_CHECK_TYPE_TEXT_INDEX] =
(nbgl_obj_t *) generic_screen_set_title(screenChildren[SELECT_CHECK_TYPE_ICON_INDEX]);
((nbgl_text_area_t *) screenChildren[SELECT_CHECK_TYPE_TEXT_INDEX])->text =
"Select type of\nRecovery you wish\nto check";
"\nSelect type of\nRecovery you wish\nto check";
// create nb words buttons
nbgl_objPoolGetArray(BUTTON,
SELECT_CHECK_TYPE_NB_BUTTONS,
Expand Down Expand Up @@ -168,7 +168,7 @@ static void select_generate_type_callback(nbgl_obj_t *obj, nbgl_touchType_t even
display_home_page();
} else if (obj == screenChildren[SELECT_GENERATE_TYPE_SSKR_INDEX]) {
nbgl_layoutRelease(layout);
display_numshares_keypad_page();
display_sskr_select_numshares_page();
} else if (obj == screenChildren[SELECT_GENERATE_TYPE_BACK_BUTTON_INDEX]) {
nbgl_layoutRelease(layout);
display_home_page();
Expand Down Expand Up @@ -214,33 +214,33 @@ static void display_select_generate_type_page(void) {
/*
* Select mnemonic size page
*/
enum select_bip_passphrase_length {
SELECT_BIP39_PASSPHRASE_LENGTH_ICON_INDEX = 0,
SELECT_BIP39_PASSPHRASE_LENGTH_TEXT_INDEX,
SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_12_INDEX,
SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_18_INDEX,
SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_24_INDEX,
SELECT_BIP39_PASSPHRASE_LENGTH_BACK_BUTTON_INDEX,
SELECT_BIP39_PASSPHRASE_LENGTH_KBD_TEXT_TOKEN,
SELECT_BIP39_PASSPHRASE_LENGTH_NB_CHILDREN
enum select_bip39_phrase_length {
SELECT_BIP39_PHRASE_LENGTH_ICON_INDEX = 0,
SELECT_BIP39_PHRASE_LENGTH_TEXT_INDEX,
SELECT_BIP39_PHRASE_LENGTH_BUTTON_12_INDEX,
SELECT_BIP39_PHRASE_LENGTH_BUTTON_18_INDEX,
SELECT_BIP39_PHRASE_LENGTH_BUTTON_24_INDEX,
SELECT_BIP39_PHRASE_LENGTH_BACK_BUTTON_INDEX,
SELECT_BIP39_PHRASE_LENGTH_KBD_TEXT_TOKEN,
SELECT_BIP39_PHRASE_LENGTH_NB_CHILDREN
};

#define SELECT_BIP39_PASSPHRASE_LENGTH_NB_BUTTONS 3
#define SELECT_BIP39_PHRASE_LENGTH_NB_BUTTONS 3

static const char *bip39_passphraseLength[] = {"12 words", "18 words", "24 words"};
static void select_bip39_passphrase_length_callback(nbgl_obj_t *obj, nbgl_touchType_t eventType) {
static void select_bip39_phrase_length_callback(nbgl_obj_t *obj, nbgl_touchType_t eventType) {
nbgl_obj_t **screenChildren = nbgl_screenGetElements(0);
if (eventType != TOUCHED) {
return;
}
io_seproxyhal_play_tune(TUNE_TAP_CASUAL);
if (obj == screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_12_INDEX]) {
if (obj == screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_12_INDEX]) {
set_mnemonic_final_size(MNEMONIC_SIZE_12);
} else if (obj == screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_18_INDEX]) {
} else if (obj == screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_18_INDEX]) {
set_mnemonic_final_size(MNEMONIC_SIZE_18);
} else if (obj == screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_24_INDEX]) {
} else if (obj == screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_24_INDEX]) {
set_mnemonic_final_size(MNEMONIC_SIZE_24);
} else if (obj == screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BACK_BUTTON_INDEX]) {
} else if (obj == screenChildren[SELECT_BIP39_PHRASE_LENGTH_BACK_BUTTON_INDEX]) {
nbgl_layoutRelease(layout);
display_select_check_type_page();
return;
Expand All @@ -249,47 +249,47 @@ static void select_bip39_passphrase_length_callback(nbgl_obj_t *obj, nbgl_touchT
display_bip39_keyboard_page();
}

static void display_select_bip39_passphrase_length_page(void) {
static void display_bip39_select_phrase_length_page(void) {
nbgl_obj_t **screenChildren;

// 3 buttons + icon + text + subText
nbgl_screenSet(&screenChildren,
6,
NULL,
(nbgl_touchCallback_t) &select_bip39_passphrase_length_callback);
(nbgl_touchCallback_t) &select_bip39_phrase_length_callback);

screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_ICON_INDEX] =
screenChildren[SELECT_BIP39_PHRASE_LENGTH_ICON_INDEX] =
(nbgl_obj_t *) generic_screen_set_icon(&C_bip39_stax_64px);
screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_TEXT_INDEX] =
screenChildren[SELECT_BIP39_PHRASE_LENGTH_TEXT_INDEX] =
(nbgl_obj_t *) generic_screen_set_title(
screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_ICON_INDEX]);
((nbgl_text_area_t *) screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_TEXT_INDEX])->text =
"How long is your\nBIP39 Recovery\nPhrase?";
screenChildren[SELECT_BIP39_PHRASE_LENGTH_ICON_INDEX]);
((nbgl_text_area_t *) screenChildren[SELECT_BIP39_PHRASE_LENGTH_TEXT_INDEX])->text =
"\nHow long is your\nBIP39 Recovery\nPhrase?";

// create nb words buttons
nbgl_objPoolGetArray(
BUTTON,
SELECT_BIP39_PASSPHRASE_LENGTH_NB_BUTTONS,
SELECT_BIP39_PHRASE_LENGTH_NB_BUTTONS,
0,
(nbgl_obj_t **) &screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_12_INDEX]);
(nbgl_obj_t **) &screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_12_INDEX]);
generic_screen_configure_buttons(
(nbgl_button_t **) &screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_12_INDEX],
SELECT_BIP39_PASSPHRASE_LENGTH_NB_BUTTONS);
((nbgl_button_t *) screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_12_INDEX])->text =
(nbgl_button_t **) &screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_12_INDEX],
SELECT_BIP39_PHRASE_LENGTH_NB_BUTTONS);
((nbgl_button_t *) screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_12_INDEX])->text =
bip39_passphraseLength[0];
((nbgl_button_t *) screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_18_INDEX])->text =
((nbgl_button_t *) screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_18_INDEX])->text =
bip39_passphraseLength[1];
((nbgl_button_t *) screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_24_INDEX])->text =
((nbgl_button_t *) screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_24_INDEX])->text =
bip39_passphraseLength[2];
((nbgl_button_t *) screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_24_INDEX])
((nbgl_button_t *) screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_24_INDEX])
->borderColor = BLACK;
((nbgl_button_t *) screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_24_INDEX])->innerColor =
((nbgl_button_t *) screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_24_INDEX])->innerColor =
BLACK;
((nbgl_button_t *) screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BUTTON_24_INDEX])
((nbgl_button_t *) screenChildren[SELECT_BIP39_PHRASE_LENGTH_BUTTON_24_INDEX])
->foregroundColor = WHITE;

// create back button
screenChildren[SELECT_BIP39_PASSPHRASE_LENGTH_BACK_BUTTON_INDEX] =
screenChildren[SELECT_BIP39_PHRASE_LENGTH_BACK_BUTTON_INDEX] =
(nbgl_obj_t *) generic_screen_set_back_button();

nbgl_screenRedraw();
Expand All @@ -312,7 +312,7 @@ static void keyboard_dispatcher(const int token, uint8_t index __attribute__((un
if (remove_word_from_mnemonic()) {
display_bip39_keyboard_page();
} else {
display_select_bip39_passphrase_length_page();
display_bip39_select_phrase_length_page();
}
} else if (token >= FIRST_SUGGESTION_TOKEN) {
nbgl_layoutRelease(layout);
Expand Down Expand Up @@ -402,7 +402,7 @@ static void display_bip39_keyboard_page() {
textToEnter, // text to display
false, // not grayed-out
BUTTON_VMARGIN, // vertical margin from the buttons
SELECT_BIP39_PASSPHRASE_LENGTH_KBD_TEXT_TOKEN);
SELECT_BIP39_PHRASE_LENGTH_KBD_TEXT_TOKEN);
nbgl_layoutDraw(layout);
}

Expand Down Expand Up @@ -494,7 +494,7 @@ static void keypad_press_callback(const char touchedKey __attribute__((unused)))
// Function currently a placeholder, remove unused attribute tag
}

static void display_numshares_keypad_page() {
static void display_sskr_select_numshares_page() {
nbgl_layoutDescription_t layoutDescription = {.modal = false,
.onActionCallback = &keypad_dispatcher};
nbgl_layoutCenteredInfo_t centeredInfo = {.text1 = NULL,
Expand Down
2 changes: 1 addition & 1 deletion tests/functional/test_sskr_128bit.py
Original file line number Diff line number Diff line change
Expand Up @@ -789,7 +789,7 @@ def nanos_sskr_128bit(backend, navigator):
navigator.navigate([NavInsID.RIGHT_CLICK], screen_change_before_first_instruction=False)
backend.wait_for_text_on_screen("Quit", 1)
navigator.navigate([NavInsID.RIGHT_CLICK], screen_change_before_first_instruction=False)
backend.wait_for_text_on_screen("Generate", 1)
backend.wait_for_text_on_screen("Recover", 1)
backend.wait_for_text_on_screen("BIP39 phrase", 1)
navigator.navigate([NavInsID.BOTH_CLICK], screen_change_before_first_instruction=False)
backend.wait_for_text_on_screen("BIP39 Phrase", 1)
Expand Down
2 changes: 1 addition & 1 deletion tests/functional/test_sskr_256bit.py
Original file line number Diff line number Diff line change
Expand Up @@ -1189,7 +1189,7 @@ def nanos_sskr_256bit(backend, navigator):
navigator.navigate([NavInsID.RIGHT_CLICK], screen_change_before_first_instruction=False)
backend.wait_for_text_on_screen("Quit", 1)
navigator.navigate([NavInsID.RIGHT_CLICK], screen_change_before_first_instruction=False)
backend.wait_for_text_on_screen("Generate", 1)
backend.wait_for_text_on_screen("Recover", 1)
backend.wait_for_text_on_screen("BIP39 phrase", 1)
navigator.navigate([NavInsID.BOTH_CLICK], screen_change_before_first_instruction=False)
backend.wait_for_text_on_screen("BIP39 Phrase", 1)
Expand Down

0 comments on commit a61079e

Please sign in to comment.