add missing QR tests for tmp secret import

This commit is contained in:
scgbckbone 2026-01-04 16:54:38 +01:00 committed by doc-hex
parent 51e0a81e77
commit 904601f531

View File

@ -10,7 +10,7 @@ from ckcc.protocol import CCProtocolPacker
from txn import fake_txn
from bip32 import BIP32Node
from helpers import xfp2str, a2b_hex
from charcodes import KEY_CLEAR, KEY_NFC
from charcodes import KEY_CLEAR, KEY_NFC, KEY_QR
WORDLISTS = {
@ -412,7 +412,7 @@ def generate_ephemeral_words(goto_eph_seed_menu, pick_menu_item, press_select,
def import_ephemeral_xprv(microsd_path, virtdisk_path, goto_eph_seed_menu,
pick_menu_item, need_keypress, cap_story, settings_set,
nfc_write_text, ephemeral_seed_disabled_ui, confirm_tmp_seed,
press_nfc, press_select, is_q1):
press_nfc, press_select, is_q1, scan_a_qr):
def doit(way, extended_key=None, testnet=True, seed_vault=False, from_main=False):
if testnet:
netcode = "XTN"
@ -430,11 +430,13 @@ def import_ephemeral_xprv(microsd_path, virtdisk_path, goto_eph_seed_menu,
assert extended_key == node.hwif(as_private=True)
ek = extended_key
if way == "sd":
fpath = microsd_path(fname)
elif way == "vdisk":
fpath = virtdisk_path(fname)
if way != "nfc":
if way in ["sd", "vdisk"]:
if way == "sd":
fpath = microsd_path(fname)
else:
assert way == "vdisk"
fpath = virtdisk_path(fname)
with open(fpath, "w") as f:
f.write(ek)
@ -461,6 +463,14 @@ def import_ephemeral_xprv(microsd_path, virtdisk_path, goto_eph_seed_menu,
time.sleep(0.2)
nfc_write_text(ek)
time.sleep(0.3)
elif way == "qr":
if not is_q1:
raise pytest.xfail("Mk4 no QR")
assert f"{KEY_QR} to scan QR code" in story
need_keypress(KEY_QR)
scan_a_qr(ek)
time.sleep(1)
else:
# virtual disk
if "press (2) to import from Virtual Disk" not in story:
@ -468,7 +478,7 @@ def import_ephemeral_xprv(microsd_path, virtdisk_path, goto_eph_seed_menu,
else:
need_keypress("2")
if way != "nfc":
if way in ["sd", "vdisk"]:
time.sleep(0.1)
pick_menu_item(fname)
@ -503,17 +513,19 @@ def test_ephemeral_seed_generate(num_words, generate_ephemeral_words, dice,
@pytest.mark.parametrize("num_words", [12, 18, 24])
@pytest.mark.parametrize("nfc", [False, True])
@pytest.mark.parametrize("way", ["input", "nfc", "qr"])
@pytest.mark.parametrize("truncated", [False, True])
@pytest.mark.parametrize("preserve_settings", [False, True])
@pytest.mark.parametrize("seed_vault", [False, True])
def test_ephemeral_seed_import_words(nfc, truncated, num_words, cap_menu, pick_menu_item,
reset_seed_words, goto_eph_seed_menu,
def test_ephemeral_seed_import_words(way, truncated, num_words, cap_menu, pick_menu_item,
reset_seed_words, goto_eph_seed_menu, skip_if_useless_way,
word_menu_entry, nfc_write_text, verify_ephemeral_secret_ui,
ephemeral_seed_disabled, get_seed_value_ux, seed_vault,
settings_set, cap_story, preserve_settings, seed_vault_enable,
seed_vault_delete, restore_main_seed, confirm_tmp_seed):
if truncated and not nfc: return
seed_vault_delete, restore_main_seed, confirm_tmp_seed,
scan_a_qr, nfc_disabled):
skip_if_useless_way(way)
if truncated and (way == "input"): return
words, expect_xfp = WORDLISTS[num_words]
@ -522,34 +534,40 @@ def test_ephemeral_seed_import_words(nfc, truncated, num_words, cap_menu, pick_m
goto_eph_seed_menu()
ephemeral_seed_disabled()
pick_menu_item("Import Words")
if not nfc:
if way == "input":
pick_menu_item("Import Words")
pick_menu_item(f"{num_words} Words")
time.sleep(0.1)
word_menu_entry(words.split())
else:
elif way == "nfc":
pick_menu_item("Import Words")
menu = cap_menu()
if 'Import via NFC' not in menu:
raise pytest.xfail("NFC not enabled")
pick_menu_item('Import via NFC')
if truncated:
truncated_words = truncate_seed_words(words)
nfc_write_text(truncated_words)
else:
nfc_write_text(words)
nfc_write_text(truncate_seed_words(words) if truncated else words)
time.sleep(.5)
elif way == "qr":
menu = cap_menu()
if 'Import from QR Scan' not in menu:
raise pytest.xfail("QR not available")
pick_menu_item('Import from QR Scan')
scan_a_qr(truncate_seed_words(words) if truncated else words)
time.sleep(1)
confirm_tmp_seed(seedvault=seed_vault)
xfp = verify_ephemeral_secret_ui(mnemonic=words.split(" "), expected_xfp=expect_xfp,
seed_vault=seed_vault)
nfc_seed = get_seed_value_ux(nfc=True) # export seed via NFC (always truncated)
seed_words = get_seed_value_ux()
assert " ".join(nfc_seed) == truncate_seed_words(seed_words)
if not nfc_disabled():
nfc_seed = get_seed_value_ux(nfc=True) # export seed via NFC (always truncated)
seed_words = get_seed_value_ux()
assert " ".join(nfc_seed) == truncate_seed_words(seed_words)
if seed_vault:
seed_vault_delete(xfp, not preserve_settings)
@ -557,7 +575,7 @@ def test_ephemeral_seed_import_words(nfc, truncated, num_words, cap_menu, pick_m
restore_main_seed(preserve_settings)
@pytest.mark.parametrize("way", ["sd", "vdisk", "nfc"])
@pytest.mark.parametrize("way", ["sd", "vdisk", "nfc", "qr"])
@pytest.mark.parametrize("testnet", [True, False])
@pytest.mark.parametrize("preserve_settings", [False, True])
@pytest.mark.parametrize("seed_vault", [False, True])
@ -567,8 +585,9 @@ def test_ephemeral_seed_import_tapsigner(way, testnet, pick_menu_item, cap_story
nfc_write_text, tapsigner_encrypted_backup, seed_vault,
preserve_settings, seed_vault_enable, settings_set,
seed_vault_delete, restore_main_seed, confirm_tmp_seed,
is_q1, press_select, press_nfc):
is_q1, press_select, press_nfc, scan_a_qr,
skip_if_useless_way):
skip_if_useless_way(way)
reset_seed_words()
if testnet:
netcode = "XTN"
@ -598,6 +617,13 @@ def test_ephemeral_seed_import_tapsigner(way, testnet, pick_menu_item, cap_story
time.sleep(0.2)
nfc_write_text(fname)
time.sleep(0.3)
elif way == "qr":
if not is_q1:
raise pytest.xfail("Mk4 no QR")
need_keypress(KEY_QR)
scan_a_qr(fname) # fname is b64 encoded backup itself
time.sleep(1)
else:
# virtual disk
if "press (2) to import from Virtual Disk" not in story:
@ -605,7 +631,7 @@ def test_ephemeral_seed_import_tapsigner(way, testnet, pick_menu_item, cap_story
else:
need_keypress("2")
if way != "nfc":
if way in ["sd", "vdisk"]:
time.sleep(0.1)
pick_menu_item(fname)
@ -729,15 +755,16 @@ def test_ephemeral_seed_import_tapsigner_real(data, pick_menu_item, cap_story, m
restore_main_seed(False)
@pytest.mark.parametrize("way", ["sd", "vdisk", "nfc"])
@pytest.mark.parametrize("way", ["sd", "vdisk", "nfc", "qr"])
@pytest.mark.parametrize("testnet", [True, False])
@pytest.mark.parametrize("preserve_settings", [False, True])
@pytest.mark.parametrize("seed_vault", [False, True])
def test_ephemeral_seed_import_xprv(way, testnet, reset_seed_words,
goto_eph_seed_menu, verify_ephemeral_secret_ui,
ephemeral_seed_disabled, import_ephemeral_xprv,
preserve_settings, seed_vault, seed_vault_enable,
seed_vault_delete, restore_main_seed, confirm_tmp_seed):
def test_ephemeral_seed_import_xprv(way, testnet, reset_seed_words, goto_eph_seed_menu,
verify_ephemeral_secret_ui, ephemeral_seed_disabled,
import_ephemeral_xprv, preserve_settings, seed_vault,
seed_vault_enable, seed_vault_delete, restore_main_seed,
confirm_tmp_seed, skip_if_useless_way):
skip_if_useless_way(way)
reset_seed_words()
goto_eph_seed_menu()
seed_vault_enable(seed_vault)