input.py 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #!/usr/bin/env python3
  2. #
  3. # mmgen = Multi-Mode GENerator, command-line Bitcoin cold storage solution
  4. # Copyright (C)2013-2020 The MMGen Project <mmgen@tuta.io>
  5. #
  6. # Project source code repository: https://github.com/mmgen/mmgen
  7. # Licensed according to the terms of GPL Version 3. See LICENSE for details.
  8. """
  9. input.py: Shared input routines for the test.py test suite
  10. """
  11. import os,time
  12. from .common import randbool
  13. def stealth_mnemonic_entry(t,mne,mn,entry_mode,pad_entry=False):
  14. def pad_mnemonic(mn,ss_len):
  15. def get_pad_chars(n):
  16. ret = ''
  17. for i in range(n):
  18. m = int.from_bytes(os.urandom(1),'big') % 32
  19. ret += r'123579!@#$%^&*()_+-=[]{}"?/,.<>|'[m]
  20. return ret
  21. ret = []
  22. for w in mn:
  23. if entry_mode == 'short':
  24. w = w[:ss_len]
  25. if len(w) < ss_len:
  26. npc = 3
  27. w = w[0] + get_pad_chars(npc) + w[1:]
  28. if pad_entry:
  29. w += '%' * (1 + mne.em.pad_max - npc)
  30. else:
  31. w += '\n'
  32. else:
  33. w = get_pad_chars(1) + w[0] + get_pad_chars(1) + w[1:]
  34. elif len(w) > (3,5)[ss_len==12]:
  35. w = w + '\n'
  36. else:
  37. w = (
  38. get_pad_chars(2 if randbool() and entry_mode != 'short' else 0)
  39. + w[0] + get_pad_chars(2) + w[1:]
  40. + get_pad_chars(9) )
  41. w = w[:ss_len+1]
  42. ret.append(w)
  43. return ret
  44. if entry_mode == 'fixed':
  45. mn = ['bkr'] + mn[:5] + ['nfb'] + mn[5:]
  46. ssl = mne.uniq_ss_len
  47. mn = [w[:ssl] if len(w) >= ssl else (w[0] + 'z\b{}'.format('#'*(ssl-len(w))) + w[1:]) for w in mn]
  48. elif entry_mode in ('full','short'):
  49. mn = ['fzr'] + mn[:5] + ['grd','grdbxm'] + mn[5:]
  50. mn = pad_mnemonic(mn,mne.em.ss_len)
  51. mn[10] = '@#$%*##' + mn[10]
  52. wnum = 1
  53. p_ok,p_err = mne.word_prompt
  54. for w in mn:
  55. ret = t.expect((p_ok.format(wnum),p_err.format(wnum-1)))
  56. if ret == 0:
  57. wnum += 1
  58. for j in range(len(w)):
  59. t.send(w[j])
  60. time.sleep(0.005)
  61. def user_dieroll_entry(t,data):
  62. for s in data:
  63. t.expect(r'Enter die roll #.+: ',s,regex=True)
  64. time.sleep(0.005)