test wrong pin (login_settings_tests)

This commit is contained in:
scgbckbone 2024-02-27 23:28:36 +01:00 committed by doc-hex
parent 729e05af40
commit b6e543bc2b
2 changed files with 64 additions and 4 deletions

View File

@ -189,7 +189,7 @@ Restore your seed words onto a new Coldcard.''' % num_fails
ch = await ux_show_story(msg, title='I Am Brick!', escape='6')
if ch == '6': break
async def confirm_attempt(self, attempts_left, num_fails, value):
async def confirm_attempt(self, attempts_left, value):
ch = await ux_show_story('''You have %d attempts left before this Coldcard BRICKS \
ITSELF FOREVER.
@ -227,7 +227,7 @@ Press OK to continue, X to stop for now.
if pa.num_fails > 3:
# they are approaching brickage, so warn them each attempt
await self.confirm_attempt(pa.attempts_left, pa.num_fails, pin)
await self.confirm_attempt(pa.attempts_left, pin)
dis.fullscreen("Wait...")
# do the actual login attempt now

View File

@ -154,7 +154,7 @@ def _set_kill_key(device, val, is_Q):
if is_Q:
assert "press this key at any point during login" in story
else:
assert "press this key while the anti-phishing words are shown during login" in story
assert "press this key while the anti- phishing words are shown during login" in story
assert ("Best if this does not match the first number"
" of the second half of your PIN.") in story
@ -172,9 +172,11 @@ def _remap_pin(pin, key_map):
remap_pin += ch
return remap_pin
def _login(device, pin, is_Q, scrambled=False, mk4_kbtn=None):
def _login(device, pin, is_Q, scrambled=False, mk4_kbtn=None, num_failed=None):
orig_pin = pin
scr = _cap_screen(device)
if num_failed:
assert f"{num_failed} failures, {13-num_failed} tries left" in scr
if is_Q:
top = scr.split("\n")[0].split()
is_scrambled = len(top) == 10
@ -414,6 +416,64 @@ def test_terms_ok(request):
sim.stop()
@pytest.mark.parametrize("brick", [True, False])
def test_wrong_pin_input(request, brick):
is_Q = request.config.getoption('--Q')
clean_sim_data() # remove all from previous
sim = ColdcardSimulator(args=["--early-usb", "--q1" if is_Q else "", "--pin", "22-22"])
sim.start(start_wait=6)
device = ColdcardDevice(sn=CKCC_SIMULATOR_PATH)
time.sleep(.1)
num_attmeptss = 13
for ii, i in enumerate(range(31, 43), start=1):
# pdb.set_trace()
pin = f"{i}-{i}"
scr_num_failed = (ii - 1) if ii > 1 else None
_login(device, pin, is_Q, num_failed=scr_num_failed)
time.sleep(.5)
title, story = _cap_story(device)
if ii > 4:
assert title == "WARNING"
assert pin in story # showing to user to double-check his input
assert "BRICKS ITSELF FOREVER" in story
assert f"{num_attmeptss - ii + 1} attempts left" in story
_press_select(device, is_Q)
time.sleep(.1)
title, story = _cap_story(device)
assert "WRONG PIN" in title
assert f"{num_attmeptss - ii} attempts left" in story
assert f"{ii} failure" in story
_press_select(device, is_Q)
time.sleep(.1)
if brick:
# one more wrong pin
_login(device, "91-11", is_Q, num_failed=12)
time.sleep(.5)
title, story = _cap_story(device)
assert "WARNING" == title
_press_select(device, is_Q)
time.sleep(.1)
title, story = _cap_story(device)
assert title == "I Am Brick!"
assert "After 13 failed PIN attempts this Coldcard is locked forever" in story
assert "no way to reset or recover the secure element" in story
assert "forever inaccessible" in story
assert "Restore your seed words onto a new Coldcard" in story
else:
_login(device, "22-22", is_Q, num_failed=12)
time.sleep(.5)
title, story = _cap_story(device)
assert "WARNING" == title
_press_select(device, is_Q)
time.sleep(.1)
m = _cap_menu(device)
assert "Ready To Sign" in m
sim.stop()
@pytest.mark.parametrize("nick", [None, "In trust we trust NOT"])
@pytest.mark.parametrize("randomize", [False, True])
@pytest.mark.parametrize("login_ctdwn", [None, " 5 minutes", "15 minutes"])