Skip to content

Commit fbfa72d

Browse files
committed
Merge branch 'checkbackup'
2 parents 82a4edf + eb96b5e commit fbfa72d

File tree

2 files changed

+39
-27
lines changed

2 files changed

+39
-27
lines changed

src/commander.c

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -305,11 +305,15 @@ static int commander_process_backup_check(const char *key, const char *filename,
305305
if (wallet_generate_node(key, seed, &node) == DBB_ERROR) {
306306
ret = DBB_ERROR;
307307
} else {
308+
uint8_t is_hidden = wallet_is_hidden();
309+
// constant time !is_hidden
310+
uint8_t negated[] = {1, 0};
311+
uint8_t is_main = negated[is_hidden];
308312
uint8_t main_ok = MEMEQ(node.private_key, memory_master_hww(NULL), MEM_PAGE_LEN) &&
309313
MEMEQ(node.chain_code, memory_master_hww_chaincode(NULL), MEM_PAGE_LEN);
310314
uint8_t hidden_ok = MEMEQ(node.private_key, memory_hidden_hww(NULL), MEM_PAGE_LEN) &&
311315
MEMEQ(node.chain_code, memory_hidden_hww_chaincode(NULL), MEM_PAGE_LEN);
312-
ret = (main_ok | hidden_ok) ? DBB_OK : DBB_ERROR; // bitwise for constant time
316+
ret = (is_main & main_ok) | (is_hidden & hidden_ok) ? DBB_OK : DBB_ERROR; // bitwise for constant time
313317
}
314318
utils_zero(seed, sizeof(seed));
315319
}
@@ -395,11 +399,6 @@ static void commander_process_backup(yajl_val json_node)
395399
char source[MAX(MAX(strlens(attr_str(ATTR_U2F)), strlens(attr_str(ATTR_HWW))),
396400
strlens(attr_str(ATTR_all))) + 1];
397401

398-
if (wallet_is_locked()) {
399-
commander_fill_report(cmd_str(CMD_backup), NULL, DBB_ERR_IO_LOCKED);
400-
return;
401-
}
402-
403402
if (strlens(value)) {
404403
if (STREQ(value, attr_str(ATTR_list))) {
405404
sd_list(CMD_backup);
@@ -410,17 +409,6 @@ static void commander_process_backup(yajl_val json_node)
410409
return;
411410
}
412411

413-
if (strlens(erase)) {
414-
// Erase single file
415-
int status = touch_button_press(TOUCH_LONG_WARN);
416-
if (status == DBB_TOUCHED) {
417-
sd_erase(CMD_backup, erase);
418-
} else {
419-
commander_fill_report(cmd_str(CMD_backup), NULL, status);
420-
}
421-
return;
422-
}
423-
424412
if (strlens(source_y)) {
425413
snprintf(source, sizeof(source), "%s", source_y);
426414
} else {
@@ -432,12 +420,6 @@ static void commander_process_backup(yajl_val json_node)
432420
}
433421
}
434422

435-
if (!strlens(key) && !STREQ(source, attr_str(ATTR_U2F))) {
436-
// Exit if backing up HWW but no key given
437-
commander_fill_report(cmd_str(CMD_seed), NULL, DBB_ERR_SD_KEY);
438-
return;
439-
}
440-
441423
if (check) {
442424
// Verify existing backup
443425
if (STREQ(source, attr_str(ATTR_all))) {
@@ -448,6 +430,30 @@ static void commander_process_backup(yajl_val json_node)
448430
return;
449431
}
450432

433+
434+
if (wallet_is_locked()) {
435+
commander_fill_report(cmd_str(CMD_backup), NULL, DBB_ERR_IO_LOCKED);
436+
return;
437+
}
438+
439+
if (strlens(erase)) {
440+
// Erase single file
441+
int status = touch_button_press(TOUCH_LONG_WARN);
442+
if (status == DBB_TOUCHED) {
443+
sd_erase(CMD_backup, erase);
444+
} else {
445+
commander_fill_report(cmd_str(CMD_backup), NULL, status);
446+
}
447+
return;
448+
}
449+
450+
451+
if (!strlens(key) && !STREQ(source, attr_str(ATTR_U2F))) {
452+
// Exit if backing up HWW but no key given
453+
commander_fill_report(cmd_str(CMD_seed), NULL, DBB_ERR_SD_KEY);
454+
return;
455+
}
456+
451457
if (filename) {
452458
// Create new backup
453459
commander_process_backup_create(key, filename, source);

tests/tests_api.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -607,18 +607,22 @@ static void tests_seed_xpub_backup(void)
607607
ASSERT_SUCCESS;
608608

609609
{
610-
// Check backup should also work with the hidden password.
611610
char set_hidden_wallet_cmd[512];
612611
snprintf(set_hidden_wallet_cmd, sizeof(set_hidden_wallet_cmd),
613612
"{\"%s\":\"%s\",\"%s\":\"%s\"}", cmd_str(CMD_password),
614613
hidden_pwd, cmd_str(CMD_key), "hiddenpassword");
615614
api_format_send_cmd(cmd_str(CMD_hidden_password), set_hidden_wallet_cmd, KEY_STANDARD);
616615
ASSERT_SUCCESS;
617616

618-
617+
// Check backup of hidden wallet should not work using the main device password.
619618
snprintf(check, sizeof(check), "{\"check\":\"%s\", \"key\":\"hiddenpassword\"}",
620619
filename);
621620
api_format_send_cmd(cmd_str(CMD_backup), check, KEY_STANDARD);
621+
ASSERT_REPORT_HAS(flag_msg(DBB_ERR_SD_NO_MATCH));
622+
// Works with the hidden wallet device password.
623+
snprintf(check, sizeof(check), "{\"check\":\"%s\", \"key\":\"hiddenpassword\"}",
624+
filename);
625+
api_format_send_cmd(cmd_str(CMD_backup), check, KEY_HIDDEN);
622626
ASSERT_SUCCESS;
623627
}
624628

@@ -2734,8 +2738,10 @@ static void tests_echo_tfa(void)
27342738
KEY_STANDARD);
27352739
ASSERT_REPORT_HAS(flag_msg(DBB_ERR_IO_LOCKED));
27362740

2737-
api_format_send_cmd(cmd_str(CMD_backup), attr_str(ATTR_list), KEY_STANDARD);
2738-
ASSERT_REPORT_HAS(flag_msg(DBB_ERR_IO_LOCKED));
2741+
if (!TEST_LIVE_DEVICE) {
2742+
api_format_send_cmd(cmd_str(CMD_backup), attr_str(ATTR_list), KEY_STANDARD);
2743+
ASSERT_REPORT_HAS("test_backup.pdf");
2744+
}
27392745
}
27402746

27412747

0 commit comments

Comments
 (0)