2020-03-16 10:45:00 +00:00
|
|
|
#!/usr/bin/env python3
|
|
|
|
|
#
|
|
|
|
|
# mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
|
2021-02-19 20:09:06 +03:00
|
|
|
# Copyright (C)2013-2021 The MMGen Project <mmgen@tuta.io>
|
2020-03-16 10:45:00 +00:00
|
|
|
#
|
|
|
|
|
# Project source code repository: https://github.com/mmgen/mmgen
|
|
|
|
|
# Licensed according to the terms of GPL Version 3. See LICENSE for details.
|
|
|
|
|
|
|
|
|
|
"""
|
|
|
|
|
input.py: Shared input routines for the test.py test suite
|
|
|
|
|
"""
|
|
|
|
|
|
|
|
|
|
import os,time
|
|
|
|
|
from .common import randbool
|
|
|
|
|
|
|
|
|
|
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 i in range(n):
|
|
|
|
|
m = int.from_bytes(os.urandom(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
|
|
|
|
|
mn = [w[:ssl] if len(w) >= ssl else (w[0] + 'z\b{}'.format('#'*(ssl-len(w))) + w[1:]) for w in 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 j in range(len(w)):
|
|
|
|
|
t.send(w[j])
|
|
|
|
|
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)
|