#!/usr/bin/env python3 # # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution # Copyright (C)2013-2024 The MMGen Project # # Project source code repository: https://github.com/mmgen/mmgen-wallet # Licensed according to the terms of GPL Version 3. See LICENSE for details. """ test.cmdtest_py_d.input: Shared input routines for the cmdtest.py test suite """ import time from .common import randbool from ..include.common import getrand def stealth_mnemonic_entry(t,mne,mn,entry_mode,pad_entry=False): def pad_mnemonic(mn,ss_len): def get_pad_chars(n): ret = '' for _ in range(n): m = int.from_bytes(getrand(1),'big') % 32 ret += r'123579!@#$%^&*()_+-=[]{}"?/,.<>|'[m] return ret ret = [] for w in mn: if entry_mode == 'short': w = w[:ss_len] if len(w) < ss_len: npc = 3 w = w[0] + get_pad_chars(npc) + w[1:] if pad_entry: w += '%' * (1 + mne.em.pad_max - npc) else: w += '\n' else: w = get_pad_chars(1) + w[0] + get_pad_chars(1) + w[1:] elif len(w) > (3,5)[ss_len==12]: w = w + '\n' else: w = ( get_pad_chars(2 if randbool() and entry_mode != 'short' else 0) + w[0] + get_pad_chars(2) + w[1:] + get_pad_chars(9) ) w = w[:ss_len+1] ret.append(w) return ret if entry_mode == 'fixed': mn = ['bkr'] + mn[:5] + ['nfb'] + mn[5:] ssl = mne.uniq_ss_len def gen_mn(): for w in mn: if len(w) >= ssl: yield w[:ssl] else: yield w[0] + 'z\b' + '#' * (ssl-len(w)) + w[1:] mn = list(gen_mn()) elif entry_mode in ('full','short'): mn = ['fzr'] + mn[:5] + ['grd','grdbxm'] + mn[5:] mn = pad_mnemonic(mn,mne.em.ss_len) mn[10] = '@#$%*##' + mn[10] wnum = 1 p_ok,p_err = mne.word_prompt for w in mn: ret = t.expect((p_ok.format(wnum),p_err.format(wnum-1))) if ret == 0: wnum += 1 for char in w: t.send(char) time.sleep(0.005) def user_dieroll_entry(t,data): for s in data: t.expect(r'Enter die roll #.+: ',s,regex=True) time.sleep(0.005)