fix test_change_pins.py; remove mk3 code

This commit is contained in:
scgbckbone 2024-02-07 08:49:49 +01:00 committed by doc-hex
parent 2ac2e4ed63
commit 30480f084a

View File

@ -13,8 +13,9 @@
# 33-33 main duress wallet
# 66-66 brickme
#
import pytest, time, os
from helpers import xfp2str
import pytest, time
from charcodes import KEY_RIGHT, KEY_ENTER
CLR_PIN = '999999-999999'
@ -23,16 +24,6 @@ def under_duress(request):
# add flag: --duress to commandline to indicate this mode
return request.config.getoption('duress')
@pytest.fixture
def get_duress_secret(sim_exec):
def doit(pin):
# read the duress secret
rv = sim_exec(f'from pincodes import pa; RV.write(repr(pa.fetch(duress_pin=b"{pin}")))')
if rv.startswith('Traceback'):
raise RuntimeError(rv)
assert rv[0:2] == "b'"
return eval(rv)
return doit
@pytest.fixture
def verify_pin_set(sim_exec):
@ -51,11 +42,6 @@ def verify_pin_set(sim_exec):
return doit
@pytest.fixture
def get_secondary_login(sim_exec):
def doit():
return sim_exec('from pincodes import pa; RV.write(repr(pa.is_secondary))') == 'True'
return doit
@pytest.fixture
def goto_pin_options(pick_menu_item, goto_home):
@ -67,40 +53,65 @@ def goto_pin_options(pick_menu_item, goto_home):
return doit
@pytest.fixture
def my_enter_pin(cap_screen, need_keypress):
def my_enter_pin(cap_screen, need_keypress, is_q1):
def doit(pin):
time.sleep(.01) # required?
time.sleep(.01) # required?
scr = cap_screen().split('\n')
title = scr[1]
assert scr[2] == 'Enter PIN Prefix'
for ch in pin:
if ch != '-':
time.sleep(.05) # required?
need_keypress(ch)
time.sleep(.05) # required?
continue
if ch == '-':
need_keypress('y')
time.sleep(.1) # required
if is_q1:
assert scr[2] == 'Enter first part of PIN'
prefix, suffix = pin.split("-")
for n in prefix:
need_keypress(n)
time.sleep(.1)
scr = cap_screen().split('\n')
assert ('Recognize these?' in scr) or ('Write these down:' in scr)
words = scr[2:4]
need_keypress('y')
# move second part
need_keypress(KEY_RIGHT)
time.sleep(.1)
scr = cap_screen().split('\n')
time.sleep(.1) # required
scr = cap_screen().split('\n')
assert scr[-1] == 'Enter rest of PIN'
assert scr[2] == 'Enter second part of PIN'
words = scr[-3].split(" ") # split on 2 spaces
assert len(words) == 2
for n in suffix:
need_keypress(n)
time.sleep(.1)
need_keypress(KEY_ENTER)
else:
assert scr[2] == 'Enter PIN Prefix'
for ch in pin:
if ch != '-':
time.sleep(.05) # required?
need_keypress(ch)
time.sleep(.05) # required?
continue
if ch == '-':
need_keypress('y')
time.sleep(.1) # required
scr = cap_screen().split('\n')
assert ('Recognize these?' in scr) or ('Write these down:' in scr)
words = scr[2:4]
need_keypress('y')
time.sleep(.1) # required
scr = cap_screen().split('\n')
assert scr[-1] == 'Enter rest of PIN'
need_keypress('y')
need_keypress('y')
time.sleep(0.1)
return title, words
return doit
@pytest.fixture
def change_pin(cap_screen, cap_story, cap_menu, need_keypress, my_enter_pin):
def doit(old_pin, new_pin, hdr_text, expect_fail=None):
@ -157,16 +168,10 @@ def change_pin(cap_screen, cap_story, cap_menu, need_keypress, my_enter_pin):
return doit
@pytest.mark.parametrize('new_pin', ['77-77', '123456-654321', '79-654321', '123456-12'])
def test_main_pin(goto_pin_options, pick_menu_item, cap_story, cap_screen, need_keypress, change_pin, new_pin, verify_pin_set, get_secondary_login, under_duress):
def test_main_pin(goto_pin_options, pick_menu_item, cap_story, cap_screen, need_keypress,
change_pin, new_pin, verify_pin_set, under_duress):
goto_pin_options()
try:
pick_menu_item('Change Main PIN')
except KeyError:
# secondary login, for example
assert get_secondary_login()
raise pytest.skip('cant change main from secondary')
pick_menu_item("Change Main PIN")
DEF_PIN = '12-12' if not under_duress else '33-33'
change_pin(DEF_PIN, new_pin, 'Main PIN')
@ -176,109 +181,4 @@ def test_main_pin(goto_pin_options, pick_menu_item, cap_story, cap_screen, need_
change_pin(new_pin, DEF_PIN, 'Main PIN')
verify_pin_set(DEF_PIN)
@pytest.mark.parametrize('new_pin', ['77-77', '123456-654321', '79-654321', '123456-12'])
def test_duress_pin(goto_pin_options, pick_menu_item, cap_story, cap_screen, need_keypress, change_pin, new_pin, get_duress_secret, under_duress, only_mk3):
goto_pin_options()
pick_menu_item('Duress PIN')
try:
change_pin(None, new_pin, 'Duress PIN')
except ValueError:
if under_duress:
raise pytest.xfail("cant change duress while under duress")
else:
raise
# duress secret should be complex
d_secret = get_duress_secret(new_pin)
assert len(set(d_secret)) > 20
assert d_secret[0] == 0x01, "not xprv?"
# changing PIN shouldn't change secret
pick_menu_item('Duress PIN')
change_pin(new_pin, '123-123', 'Duress PIN')
rb = get_duress_secret('123-123')
assert rb == d_secret
pick_menu_item('Duress PIN')
change_pin('123-123', CLR_PIN, 'Duress PIN')
# clearing PIN should clear secret
zz = get_duress_secret('')
assert zz == b'\0'*72
@pytest.mark.parametrize('new_pin', ['77-77', '123456-654321', '79-654321', '123456-12'])
def test_secondary_pin(is_mark3, goto_pin_options, pick_menu_item, cap_story, cap_screen, need_keypress, change_pin, new_pin, verify_pin_set, get_secondary_login, only_mk3):
if get_secondary_login():
raise pytest.skip('not intended for use under secondary login')
goto_pin_options()
if is_mark3:
raise pytest.skip('mark3 doesnt support secondary wallet')
pick_menu_item('Second Wallet')
try:
change_pin(None, new_pin, 'Second PIN')
except ValueError:
if under_duress:
raise pytest.xfail("cant change secondary while under duress")
else:
raise
verify_pin_set(new_pin, secondary=1)
pick_menu_item('Second Wallet')
change_pin(new_pin, CLR_PIN, 'Second PIN')
verify_pin_set('', secondary=1)
@pytest.mark.parametrize('new_pin', ['77-77', '123456-654321', '79-654321', '123456-12'])
def test_secondary_from_secondary_pin(is_mark3, goto_pin_options, pick_menu_item, cap_story, cap_screen, need_keypress, change_pin, new_pin, verify_pin_set, get_secondary_login, only_mk3):
# XXX Obsolete now?
# when logged into secondary wallet, you can't clear PIN, and we use a 23-23 as value
if not get_secondary_login():
raise pytest.skip('intended for use under secondary login')
if is_mark3:
raise pytest.skip('mark3 doesnt support secondary wallet')
goto_pin_options()
ASSUME_PIN = '23-23'
pick_menu_item('Second Wallet')
change_pin(ASSUME_PIN, new_pin, 'Second PIN')
verify_pin_set(new_pin)
pick_menu_item('Second Wallet')
change_pin(new_pin, ASSUME_PIN, 'Second PIN')
verify_pin_set(ASSUME_PIN)
@pytest.mark.parametrize('new_pin', ['77-77', '123456-654321', '79-654321', '123456-12'])
def test_brickme_pin(goto_pin_options, pick_menu_item, cap_story, cap_screen, need_keypress, change_pin, new_pin, verify_pin_set, get_secondary_login, under_duress, only_mk3):
goto_pin_options()
try:
pick_menu_item('Brick Me PIN')
except KeyError:
# secondary login, for example
assert get_secondary_login()
raise pytest.skip('cant do brickme in this mode')
try:
change_pin(None, new_pin, 'Brickme PIN')
except ValueError:
if under_duress:
raise pytest.xfail("cant change brickme while under duress")
else:
raise
verify_pin_set(new_pin, brickme=1)
pick_menu_item('Brick Me PIN')
change_pin(new_pin, CLR_PIN, 'Brickme PIN')
verify_pin_set('', brickme=1)
# EOF