mmgen-msg: support display of unsigned message files

This commit is contained in:
The MMGen Project 2022-03-30 15:49:45 +00:00
commit d817931c04
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
3 changed files with 46 additions and 27 deletions

View file

@ -49,6 +49,9 @@ class MsgOps:
m.write_to_file( ask_overwrite=False )
if getattr(m,'failed_sids',None):
sys.exit(1)
class verify(sign):
async def __init__(self,msgfile,addr=None):
@ -59,6 +62,9 @@ class MsgOps:
await m.verify(addr,summary=True)
if getattr(m,'failed_sids',None):
sys.exit(1)
opts_data = {
'text': {
'desc': 'Perform message signing operations for MMGen addresses',

View file

@ -147,24 +147,26 @@ class coin_msg:
yield fs.format(
'Failed Seed IDs:',
red(fmt_list(self.failed_sids,fmt='bare')) )
yield ''
yield 'Signatures:'
for n,(k,v) in enumerate(self.sigs.items()):
if self.sigs:
yield ''
yield '{:>3}) {}'.format(n+1,k)
for res in gen_entry(v):
yield res
yield 'Signatures:'
for n,(k,v) in enumerate(self.sigs.items()):
yield ''
yield '{:>3}) {}'.format(n+1,k)
for res in gen_entry(v):
yield res
def gen_single():
fs = '{:8s} {}'
for k,v in disp_data.items():
yield fs.format( v[0]+':', v[1](self.data[k]) )
yield 'Signature data:'
k = MMGenID(self.proto,mmid)
if k not in self.sigs:
die(1,f'{k}: address not found in signature data')
for res in gen_entry(self.sigs[k]):
yield res
if self.sigs:
yield 'Signature data:'
k = MMGenID(self.proto,mmid)
if k not in self.sigs:
die(1,f'{k}: address not found in signature data')
for res in gen_entry(self.sigs[k]):
yield res
disp_data = {
'message': ('Message', lambda v: grnbg(v) ),
@ -178,7 +180,9 @@ class coin_msg:
return '\n'.join(gen_single())
else:
fs2 = ' {:12s} {}'
return 'SIGNED MESSAGE DATA:\n\n ' + '\n '.join(gen_all())
return (
'{}SIGNED MESSAGE DATA:\n\n '.format('' if self.sigs else 'UN') +
'\n '.join(gen_all()) )
class unsigned(completed):
@ -256,25 +260,28 @@ class coin_msg:
async def verify(self,addr=None,summary=False):
from .rpc import rpc_init
self.rpc = await rpc_init(self.proto)
if addr:
mmaddr = MMGenID(self.proto,addr)
sigs = {k:v for k,v in self.sigs.items() if k == mmaddr}
else:
sigs = self.sigs
for k,v in sigs.items():
ret = await self.do_verify(
addr = v.get('addr_p2pkh') or v['addr'],
sig = v['sig'],
message = self.data['message'] )
if not ret:
die(3,f'Invalid signature for address {k} ({v["addr"]})')
if sigs:
from .rpc import rpc_init
self.rpc = await rpc_init(self.proto)
if summary:
msg('{} signature{} verified'.format( len(sigs), suf(sigs) ))
for k,v in sigs.items():
ret = await self.do_verify(
addr = v.get('addr_p2pkh') or v['addr'],
sig = v['sig'],
message = self.data['message'] )
if not ret:
die(3,f'Invalid signature for address {k} ({v["addr"]})')
if summary:
msg('{} signature{} verified'.format( len(sigs), suf(sigs) ))
else:
die(1,'No signatures')
def _get_obj(clsname,coin=None,network='mainnet',infile=None,data=None,*args,**kwargs):

View file

@ -264,6 +264,7 @@ class TestSuiteRegtest(TestSuiteBase,TestSuiteShared):
('bob_msgsign_userwallet', 'signing the message file (user-specified wallet)'),
('bob_msgsign_userwallets', 'signing the message file (user-specified wallets)'),
('bob_msgverify', 'verifying the message file (all addresses)'),
('bob_msgverify_raw', 'verifying the raw message file (all addresses)'),
('bob_msgverify_single', 'verifying the message file (single address)'),
('stop', 'stopping regtest daemon'),
@ -1082,15 +1083,20 @@ class TestSuiteRegtest(TestSuiteBase,TestSuiteShared):
fn2 = get_file_with_ext(self.tmpdir,'bip39')
return self.bob_msgsign([fn2,fn1])
def bob_msgverify(self,addr=None):
def bob_msgverify(self,addr=None,ext='sigmsg.json'):
return self.spawn(
'mmgen-msg', [
'--bob',
f'--outdir={self.tmpdir}',
'verify',
get_file_with_ext(self.tmpdir,'sigmsg.json'),
get_file_with_ext(self.tmpdir,ext),
] + ([addr] if addr else []) )
def bob_msgverify_raw(self):
t = self.bob_msgverify(ext='rawmsg.json')
t.req_exit_val = 1
return t
def bob_msgverify_single(self):
sid = self._user_sid('bob')
return self.bob_msgverify(addr=f'{sid}:{self.dfl_mmtype}:1')