mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-12-16 19:38:09 +00:00
halt the device when encountered an invalid mnemonic (skip if device loaded or recovered without enforced wordlist)
This commit is contained in:
parent
810d478f4c
commit
4ce4cc5605
@ -139,27 +139,36 @@ void recovery_word(const char *word)
|
|||||||
strlcpy(words[word_pos - 1], word, sizeof(words[word_pos - 1]));
|
strlcpy(words[word_pos - 1], word, sizeof(words[word_pos - 1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (word_index + 1 == 24) { // last one
|
if (word_index + 1 < 24) { // not the last one
|
||||||
uint32_t i;
|
|
||||||
strlcpy(storage.mnemonic, words[0], sizeof(storage.mnemonic));
|
|
||||||
for (i = 1; i < word_count; i++) {
|
|
||||||
strlcat(storage.mnemonic, " ", sizeof(storage.mnemonic));
|
|
||||||
strlcat(storage.mnemonic, words[i], sizeof(storage.mnemonic));
|
|
||||||
}
|
|
||||||
if (!enforce_wordlist || mnemonic_check(storage.mnemonic)) {
|
|
||||||
storage.has_mnemonic = true;
|
|
||||||
storage_commit();
|
|
||||||
fsm_sendSuccess("Device recovered");
|
|
||||||
} else {
|
|
||||||
storage_reset();
|
|
||||||
fsm_sendFailure(FailureType_Failure_SyntaxError, "Invalid mnemonic, are words in correct order?");
|
|
||||||
}
|
|
||||||
awaiting_word = false;
|
|
||||||
layoutHome();
|
|
||||||
} else {
|
|
||||||
word_index++;
|
word_index++;
|
||||||
next_word();
|
next_word();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// the last one
|
||||||
|
strlcpy(storage.mnemonic, words[0], sizeof(storage.mnemonic));
|
||||||
|
for (uint32_t i = 1; i < word_count; i++) {
|
||||||
|
strlcat(storage.mnemonic, " ", sizeof(storage.mnemonic));
|
||||||
|
strlcat(storage.mnemonic, words[i], sizeof(storage.mnemonic));
|
||||||
|
}
|
||||||
|
|
||||||
|
awaiting_word = false;
|
||||||
|
layoutHome();
|
||||||
|
|
||||||
|
if (!mnemonic_check(storage.mnemonic)) {
|
||||||
|
if (enforce_wordlist) {
|
||||||
|
storage_reset();
|
||||||
|
fsm_sendFailure(FailureType_Failure_SyntaxError, "Invalid mnemonic, are words in correct order?");
|
||||||
|
return;
|
||||||
|
} else { // not enforcing => mark storage as imported
|
||||||
|
storage.has_imported = true;
|
||||||
|
storage.imported = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
storage.has_mnemonic = true;
|
||||||
|
storage_commit();
|
||||||
|
fsm_sendSuccess("Device recovered");
|
||||||
}
|
}
|
||||||
|
|
||||||
void recovery_abort(void)
|
void recovery_abort(void)
|
||||||
|
@ -105,7 +105,7 @@ static char sessionPassphrase[51];
|
|||||||
void storage_show_error(void)
|
void storage_show_error(void)
|
||||||
{
|
{
|
||||||
layoutDialog(&bmp_icon_error, NULL, NULL, NULL, "Storage failure", "detected.", NULL, "Please unplug", "the device.", NULL);
|
layoutDialog(&bmp_icon_error, NULL, NULL, NULL, "Storage failure", "detected.", NULL, "Please unplug", "the device.", NULL);
|
||||||
for (;;) { }
|
system_halt();
|
||||||
}
|
}
|
||||||
|
|
||||||
void storage_check_flash_errors(void)
|
void storage_check_flash_errors(void)
|
||||||
@ -353,6 +353,14 @@ const uint8_t *storage_getSeed(bool usePassphrase)
|
|||||||
if (usePassphrase && !protectPassphrase()) {
|
if (usePassphrase && !protectPassphrase()) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
// if storage was not imported (i.e. it was properly generated or recovered)
|
||||||
|
if (!storage.has_imported || !storage.imported) {
|
||||||
|
// test whether mnemonic is a valid BIP-0039 mnemonic
|
||||||
|
if (!mnemonic_check(storage.mnemonic)) {
|
||||||
|
// and if not then halt the device
|
||||||
|
storage_show_error();
|
||||||
|
}
|
||||||
|
}
|
||||||
mnemonic_to_seed(storage.mnemonic, usePassphrase ? sessionPassphrase : "", sessionSeed, get_root_node_callback); // BIP-0039
|
mnemonic_to_seed(storage.mnemonic, usePassphrase ? sessionPassphrase : "", sessionSeed, get_root_node_callback); // BIP-0039
|
||||||
sessionSeedCached = true;
|
sessionSeedCached = true;
|
||||||
sessionSeedUsesPassphrase = usePassphrase;
|
sessionSeedUsesPassphrase = usePassphrase;
|
||||||
|
Loading…
Reference in New Issue
Block a user