Browse Source

mmgen-msg: support display of unsigned message files

The MMGen Project 3 years ago
parent
commit
d817931c04
3 changed files with 46 additions and 27 deletions
  1. 6 0
      mmgen/main_msg.py
  2. 32 25
      mmgen/msg.py
  3. 8 2
      test/test_py_d/ts_regtest.py

+ 6 - 0
mmgen/main_msg.py

@@ -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',

+ 32 - 25
mmgen/msg.py

@@ -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)
+
+				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) ))
+				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):
 

+ 8 - 2
test/test_py_d/ts_regtest.py

@@ -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')