mmgen-autosign: --coin support, validate that secret is well-formed

This commit is contained in:
The MMGen Project 2017-10-16 19:20:34 +03:00
commit 2435f60b03
Signed by: mmgen
GPG key ID: 62DBE9E5212F05BE

View file

@ -34,6 +34,7 @@ opts_data = lambda: {
-l, --led Use status LED to signal standby, busy and error
-s, --stealth-led Stealth LED mode - signal busy and error only, and only
after successful authorization.
-v, --verbose Produce more verbose output
""",
'notes': """
@ -90,10 +91,13 @@ tx_dir = os.path.join(mountpoint,'tx')
part_label = 'MMGEN_TX'
shm_dir = '/dev/shm'
secret_fn = 'txsign-secret'
tn_arg = ([],['--testnet=1'])[bool(opt.testnet)]
tn_arg = ['--testnet={}'.format(opt.testnet or '0')]
coin_arg = ['--coin={}'.format(opt.coin or 'btc')]
def check_daemon_running():
try: subprocess.check_output(['mmgen-tool'] + tn_arg + ['getbalance'])
cmd = ['mmgen-tool'] + tn_arg + coin_arg + ['getbalance']
vmsg('Executing: {}'.format(' '.join(cmd)))
try: subprocess.check_output(cmd)
except: die(1,'Daemon not running')
def get_wallet_files():
@ -103,11 +107,13 @@ def get_wallet_files():
return [os.path.join(shm_dir,w) for w in wfs]
def get_secret_in_dir(d,on_fail='die'):
fn = os.path.join(d,secret_fn)
try:
with open(os.path.join(d,secret_fn)) as f:
return f.read().rstrip()
with open(fn) as f: ret = f.read().rstrip()
assert is_hex_str(ret) and len(ret) == 32
return ret
except:
msg('Unable to read secret file!')
msg("Secret file '{}' non-existent, unreadable or in incorrect format!".format(fn))
if on_fail == 'die': sys.exit(1)
else: return None
@ -135,7 +141,8 @@ def sign():
unsigned = [os.path.join(tx_dir,f) for f in raw if f[:-6] not in signed]
if unsigned:
cmd = ['mmgen-txsign','--yes','--outdir='+tx_dir] + tn_arg + unsigned + wfs
cmd = ['mmgen-txsign','--yes','--outdir='+tx_dir] + tn_arg + coin_arg + unsigned + wfs
vmsg('Executing: {}'.format(' '.join(cmd)))
ret = subprocess.call(cmd)
msg('')
time.sleep(0.3)
@ -156,7 +163,7 @@ def wipe_existing_secret_files():
msg('\nWiping existing key {}'.format(fn))
subprocess.call(['wipe','-c',fn])
def create_secret_files():
def create_secret_files():
from binascii import hexlify
secret = hexlify(os.urandom(16))
for d in (tx_dir,shm_dir):
@ -239,7 +246,7 @@ def do_loop():
do_sign()
prev_status = status
if not n % 10:
msg_r('\r{}\rwaiting'.format(' '*17))
msg_r('\r{}\rWaiting'.format(' '*17))
time.sleep(1)
msg_r('.')
n += 1
@ -262,6 +269,23 @@ def check_wipe_present():
except:
die(2,"The 'wipe' utility must be installed before running this program")
def at_exit(nl=True):
if opt.led:
set_led('off')
ev.set()
led_thread.join()
if board == 'rpi':
with open(trigger[board],'w') as f: f.write('mmc0\n')
if nl: msg('')
raise SystemExit
def handler(a,b): at_exit()
# main()
if len(cmd_args) == 1 and cmd_args[0] == 'gen_secret':
do_create_secret_files()
sys.exit()
if opt.led:
import threading
status = {
@ -291,28 +315,11 @@ if opt.led:
if board == 'rpi':
with open(trigger[board],'w') as f: f.write('none\n')
# main()
if len(cmd_args) == 1 and cmd_args[0] == 'gen_secret':
do_create_secret_files()
sys.exit()
check_wipe_present()
wfs = get_wallet_files()
secret = get_secret_in_dir(shm_dir,on_fail='die')
check_daemon_running()
def at_exit(nl=True):
if opt.led:
set_led('off')
ev.set()
led_thread.join()
if board == 'rpi':
with open(trigger[board],'w') as f: f.write('mmc0\n')
if nl: msg('')
raise SystemExit
def handler(a,b): at_exit()
signal.signal(signal.SIGTERM,handler)
signal.signal(signal.SIGINT,handler)