From 8a68f00ab700f5784104736b34f17ae881bf6c60 Mon Sep 17 00:00:00 2001 From: MMGen Date: Wed, 16 Oct 2019 10:42:46 +0000 Subject: [PATCH] AddrList, passgen: minor fixes; add altcoin ref file tests --- mmgen/addr.py | 15 ++++++------- mmgen/main_passgen.py | 9 ++++---- mmgen/obj.py | 6 +++--- test/test_py_d/ts_ref_altcoin.py | 36 +++++++++++++++++++++----------- 4 files changed, 40 insertions(+), 26 deletions(-) diff --git a/mmgen/addr.py b/mmgen/addr.py index 4ad2e6f2..301ceccf 100755 --- a/mmgen/addr.py +++ b/mmgen/addr.py @@ -610,7 +610,7 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file for e in self.data: c = ' '+e.label if enable_comments and e.label else '' if type(self) == KeyList: - out.append(fs.format(e.idx,'{} {}'.format(self.al_id.mmtype.wif_label,e.sec.wif),c)) + out.append(fs.format(e.idx,'{}: {}'.format(self.al_id.mmtype.wif_label,e.sec.wif),c)) elif type(self) == PasswordList: out.append(fs.format(e.idx,e.passwd,c)) else: # First line with idx @@ -618,7 +618,7 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file if self.has_keys: if opt.b16: out.append(fs.format('', 'orig_hex: '+e.sec.orig_hex,c)) - out.append(fs.format('','{} {}'.format(self.al_id.mmtype.wif_label,e.sec.wif),c)) + out.append(fs.format('','{}: {}'.format(self.al_id.mmtype.wif_label,e.sec.wif),c)) for k in ('viewkey','wallet_passwd'): v = getattr(e,k) if v: out.append(fs.format('','{}: {}'.format(k,v),c)) @@ -638,6 +638,7 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file ret = AddrListList() le = self.entry_type + iifs = "{!r}: invalid identifier [expected '{}:']" while lines: idx,addr,lbl = self.get_line(lines) @@ -649,12 +650,12 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file if self.has_keys: # order: wif,(orig_hex),viewkey,wallet_passwd d = self.get_line(lines) - assert d[0] == self.al_id.mmtype.wif_label,"Invalid line in file: '{}'".format(' '.join(d)) + assert d[0] == self.al_id.mmtype.wif_label+':',iifs.format(d[0],self.al_id.mmtype.wif_label) a.sec = PrivKey(wif=d[1]) for k,dtype in (('viewkey',ViewKey),('wallet_passwd',WalletPassword)): if k in self.al_id.mmtype.extra_attrs: d = self.get_line(lines) - assert d[0] == k+':',"Invalid line in file: '{}'".format(' '.join(d)) + assert d[0] == k+':',iifs.format(d[0],k) setattr(a,k,dtype(d[1])) ret.append(a) @@ -741,7 +742,7 @@ Removed {{}} duplicate WIF key{{}} from keylist (also in {pnm} key-address file data = self.parse_file_body(lines[1:-1]) assert isinstance(data,list),'Invalid file body data' except Exception as e: - lcs = ', list item {}'.format(self.line_ctr) if self.line_ctr else '' + lcs = ', content line {}'.format(self.line_ctr) if self.line_ctr else '' m = 'Invalid data in {} list file {!r}{} ({})'.format(self.data_desc,self.infile,lcs,e.args[0]) if exit_on_error: die(3,m) msg(msg) @@ -810,8 +811,8 @@ Record this checksum: it will be used to verify the password file in the future dfl_pw_fmt = 'b58' pwinfo = namedtuple('passwd_info',['min_len','max_len','dfl_len','valid_lens','desc','chk_func']) pw_info = { - 'b32': pwinfo(10, 42 ,24, None, 'base32 password', is_b32_str), - 'b58': pwinfo(8, 36 ,20, None, 'base58 password', is_b58_str), + 'b32': pwinfo(10, 42 ,24, None, 'base32 password', is_b32_str), # 32**24 < 2**128 + 'b58': pwinfo(8, 36 ,20, None, 'base58 password', is_b58_str), # 58**20 < 2**128 'hex': pwinfo(32, 64 ,64, [32,48,64], 'hexadecimal password', is_hex_str), } chksum_rec_f = lambda foo,e: (str(e.idx), e.passwd) diff --git a/mmgen/main_passgen.py b/mmgen/main_passgen.py index d95134d9..713182d0 100755 --- a/mmgen/main_passgen.py +++ b/mmgen/main_passgen.py @@ -88,13 +88,14 @@ EXAMPLES: {g.prog_name} alice@nowhere.com 1-10 Generate ten base58 passwords of length 16 for Alice's email account: - {g.prog_name} -L16 alice@nowhere.com 1-10 + {g.prog_name} --passwd-len=16 alice@nowhere.com 1-10 Generate ten base32 passwords of length {i32.dfl_len} for Alice's email account: - {g.prog_name} -b alice@nowhere.com 1-10 + {g.prog_name} --passwd-fmt=b32 alice@nowhere.com 1-10 - The three sets of passwords are completely unrelated to each other, so - Alice doesn't need to worry about password reuse. + All passwords are cryptographically unlinkable with each other, including + passwords with the same format but different length, so Alice needn't worry + about inadvertent reuse of private data. NOTES FOR ALL GENERATOR COMMANDS diff --git a/mmgen/obj.py b/mmgen/obj.py index 305d4cd9..343dea0e 100755 --- a/mmgen/obj.py +++ b/mmgen/obj.py @@ -878,7 +878,7 @@ class MMGenAddrType(str,Hilite,InitErrors,MMGenObject): 'compressed':False, 'gen_method':'ethereum', 'addr_fmt':'ethereum', - 'wif_label':'privkey:', + 'wif_label':'privkey', 'extra_attrs': ('wallet_passwd',), 'desc':'Ethereum address' }, 'Z': { 'name':'zcash_z', @@ -893,7 +893,7 @@ class MMGenAddrType(str,Hilite,InitErrors,MMGenObject): 'compressed':False, 'gen_method':'monero', 'addr_fmt':'monero', - 'wif_label':'spendkey:', + 'wif_label':'spendkey', 'extra_attrs': ('viewkey','wallet_passwd'), 'desc':'Monero address'} } @@ -911,7 +911,7 @@ class MMGenAddrType(str,Hilite,InitErrors,MMGenObject): assert me in g.proto.mmtypes + ('P',), ( "'{}': invalid address type for {}".format(me.name,g.proto.__name__)) me.extra_attrs = v['extra_attrs'] if 'extra_attrs' in v else () - me.wif_label = v['wif_label'] if 'wif_label' in v else 'wif:' + me.wif_label = v['wif_label'] if 'wif_label' in v else 'wif' return me raise ValueError('not found') except Exception as e: diff --git a/test/test_py_d/ts_ref_altcoin.py b/test/test_py_d/ts_ref_altcoin.py index 2f0a3af1..319dd598 100755 --- a/test/test_py_d/ts_ref_altcoin.py +++ b/test/test_py_d/ts_ref_altcoin.py @@ -164,38 +164,50 @@ class TestSuiteRefAltcoin(TestSuiteRef,TestSuiteBase): def ref_addrfile_chk_eth(self): - return self.ref_addrfile_chk(ftype='addr',coin='ETH',subdir='ethereum',pfx='-ETH') + return self.ref_addrfile_chk(ftype='addr',coin='ETH',subdir='ethereum',pfx='-ETH', + pat='ETH Mainnet.*Ethereum') def ref_addrfile_chk_etc(self): - return self.ref_addrfile_chk(ftype='addr',coin='ETC',subdir='ethereum_classic',pfx='-ETC') + return self.ref_addrfile_chk(ftype='addr',coin='ETC',subdir='ethereum_classic',pfx='-ETC', + pat='ETH Mainnet.*Ethereum') def ref_addrfile_chk_dash(self): - return self.ref_addrfile_chk(ftype='addr',coin='DASH',subdir='dash',pfx='-DASH-C') + return self.ref_addrfile_chk(ftype='addr',coin='DASH',subdir='dash',pfx='-DASH-C', + pat='DASH Mainnet.*Compressed') def ref_addrfile_chk_zec(self): - return self.ref_addrfile_chk(ftype='addr',coin='ZEC',subdir='zcash',pfx='-ZEC-C') + return self.ref_addrfile_chk(ftype='addr',coin='ZEC',subdir='zcash',pfx='-ZEC-C', + pat='ZEC Mainnet.*Compressed') def ref_addrfile_chk_zec_z(self): - return self.ref_addrfile_chk(ftype='addr',coin='ZEC',subdir='zcash',pfx='-ZEC-Z',mmtype='z') + return self.ref_addrfile_chk(ftype='addr',coin='ZEC',subdir='zcash',pfx='-ZEC-Z',mmtype='z', + pat='ZEC Mainnet.*Zcash_z') def ref_addrfile_chk_xmr(self): - return self.ref_addrfile_chk(ftype='addr',coin='XMR',subdir='monero',pfx='-XMR-M') + return self.ref_addrfile_chk(ftype='addr',coin='XMR',subdir='monero',pfx='-XMR-M', + pat='XMR Mainnet.*Monero') def ref_keyaddrfile_chk_eth(self): - return self.ref_addrfile_chk(ftype='keyaddr',coin='ETH',subdir='ethereum',pfx='-ETH') + return self.ref_addrfile_chk(ftype='keyaddr',coin='ETH',subdir='ethereum',pfx='-ETH', + pat='ETH Mainnet.*Ethereum') def ref_keyaddrfile_chk_etc(self): - return self.ref_addrfile_chk(ftype='keyaddr',coin='ETC',subdir='ethereum_classic',pfx='-ETC') + return self.ref_addrfile_chk(ftype='keyaddr',coin='ETC',subdir='ethereum_classic',pfx='-ETC', + pat='ETH Mainnet.*Ethereum') def ref_keyaddrfile_chk_dash(self): - return self.ref_addrfile_chk(ftype='keyaddr',coin='DASH',subdir='dash',pfx='-DASH-C') + return self.ref_addrfile_chk(ftype='keyaddr',coin='DASH',subdir='dash',pfx='-DASH-C', + pat='DASH Mainnet.*Compressed') def ref_keyaddrfile_chk_zec(self): - return self.ref_addrfile_chk(ftype='keyaddr',coin='ZEC',subdir='zcash',pfx='-ZEC-C') + return self.ref_addrfile_chk(ftype='keyaddr',coin='ZEC',subdir='zcash',pfx='-ZEC-C', + pat='ZEC Mainnet.*Compressed') def ref_keyaddrfile_chk_zec_z(self): - return self.ref_addrfile_chk(ftype='keyaddr',coin='ZEC',subdir='zcash',pfx='-ZEC-Z',mmtype='z') + return self.ref_addrfile_chk(ftype='keyaddr',coin='ZEC',subdir='zcash',pfx='-ZEC-Z',mmtype='z', + pat='ZEC Mainnet.*Zcash_z') def ref_keyaddrfile_chk_xmr(self): - return self.ref_addrfile_chk(ftype='keyaddr',coin='XMR',subdir='monero',pfx='-XMR-M') + return self.ref_addrfile_chk(ftype='keyaddr',coin='XMR',subdir='monero',pfx='-XMR-M', + pat='XMR Mainnet.*Monero')