From bfcfc8676d8d40a106287fe891dfe31db886c964 Mon Sep 17 00:00:00 2001 From: MMGen Date: Tue, 15 Oct 2019 13:58:07 +0000 Subject: [PATCH] passgen: allow hex passwords of 32 and 48 characters --- mmgen/addr.py | 21 +++++++++++-------- ...1F3A-фубар@crypto.org-hex-32[1,4,1100].pws | 6 ++++++ ...1F3A-фубар@crypto.org-hex-48[1,4,1100].pws | 6 ++++++ test/test_py_d/ts_ref.py | 8 +++++++ test/test_py_d/ts_ref_3seed.py | 10 ++++++++- 5 files changed, 41 insertions(+), 10 deletions(-) create mode 100644 test/ref/98831F3A-фубар@crypto.org-hex-32[1,4,1100].pws create mode 100644 test/ref/98831F3A-фубар@crypto.org-hex-48[1,4,1100].pws diff --git a/mmgen/addr.py b/mmgen/addr.py index db6e54f7..8b1e9fc3 100755 --- a/mmgen/addr.py +++ b/mmgen/addr.py @@ -804,11 +804,11 @@ Record this checksum: it will be used to verify the password file in the future ext = 'pws' pw_len = None dfl_pw_fmt = 'b58' - pwinfo = namedtuple('passwd_info',['min_len','max_len','dfl_len','desc','chk_func']) + pwinfo = namedtuple('passwd_info',['min_len','max_len','dfl_len','valid_lens','desc','chk_func']) pw_info = { - 'b32': pwinfo(10, 42 ,24, 'base32 password', is_b32_str), - 'b58': pwinfo(8, 36 ,20, 'base58 password', is_b58_str), - 'hex': pwinfo(64, 64 ,64, 'hexadecimal password', is_hex_str), + 'b32': pwinfo(10, 42 ,24, None, 'base32 password', is_b32_str), + 'b58': pwinfo(8, 36 ,20, None, 'base58 password', is_b58_str), + 'hex': pwinfo(32, 64 ,64, [32,48,64], 'hexadecimal password', is_hex_str), } chksum_rec_f = lambda foo,e: (str(e.idx), e.passwd) @@ -849,20 +849,22 @@ Record this checksum: it will be used to verify the password file in the future def chk_pw_len(self,passwd=None): if passwd is None: - assert self.pw_len + assert self.pw_len,'either passwd or pw_len must be set' pw_len = self.pw_len fs = '{l}: invalid user-requested length for {b} ({c}{m})' else: pw_len = len(passwd) fs = '{pw}: {b} has invalid length {l} ({c}{m} characters)' d = self.pw_info[self.pw_fmt] - if pw_len > d.max_len: + if d.valid_lens: + if pw_len not in d.valid_lens: + die(2,fs.format(l=pw_len,b=d.desc,c='not one of ',m=d.valid_lens,pw=passwd)) + elif pw_len > d.max_len: die(2,fs.format(l=pw_len,b=d.desc,c='>',m=d.max_len,pw=passwd)) elif pw_len < d.min_len: die(2,fs.format(l=pw_len,b=d.desc,c='<',m=d.min_len,pw=passwd)) def set_pw_len(self,pw_len): - assert self.pw_fmt in self.pw_info d = self.pw_info[self.pw_fmt] if pw_len is None: @@ -877,9 +879,10 @@ Record this checksum: it will be used to verify the password file in the future def make_passwd(self,hex_sec): assert self.pw_fmt in self.pw_info if self.pw_fmt == 'hex': - return hex_sec + # take most significant part + return hex_sec[:self.pw_len] else: - # we take least significant part + # take least significant part return baseconv.fromhex(hex_sec,self.pw_fmt,pad=self.pw_len,tostr=True)[-self.pw_len:] def check_format(self,pw): diff --git a/test/ref/98831F3A-фубар@crypto.org-hex-32[1,4,1100].pws b/test/ref/98831F3A-фубар@crypto.org-hex-32[1,4,1100].pws new file mode 100644 index 00000000..06d5f416 --- /dev/null +++ b/test/ref/98831F3A-фубар@crypto.org-hex-32[1,4,1100].pws @@ -0,0 +1,6 @@ +# checksum: 05C7 3678 E25E BC32 +98831F3A фубар@crypto.org hex:32 { + 1 c451cf480fa68cd7e8b59a58fc0f9885 + 4 36cde0016fb0f23b1ff98cf02cda423c + 1100 b8bc8d233d26f1906140dbb5e5657878 +} diff --git a/test/ref/98831F3A-фубар@crypto.org-hex-48[1,4,1100].pws b/test/ref/98831F3A-фубар@crypto.org-hex-48[1,4,1100].pws new file mode 100644 index 00000000..7a612901 --- /dev/null +++ b/test/ref/98831F3A-фубар@crypto.org-hex-48[1,4,1100].pws @@ -0,0 +1,6 @@ +# checksum: 7DBB FFD0 633E DE6F +98831F3A фубар@crypto.org hex:48 { + 1 798200c9adabbd41f5343bc12879905524d1b1d3669e031e + 4 6276e7091ae77c3d90c6737f36a123097f1292b66369355d + 1100 8f1d67193feca57770fd21c26ab8129813f48619469df9fe +} diff --git a/test/test_py_d/ts_ref.py b/test/test_py_d/ts_ref.py index c5ef0f37..2f62a568 100755 --- a/test/test_py_d/ts_ref.py +++ b/test/test_py_d/ts_ref.py @@ -45,6 +45,8 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared): 'ref_passwdfile_b32_12': '98831F3A-фубар@crypto.org-b32-12[1,4,1100].pws', 'ref_passwdfile_b58_10': '98831F3A-фубар@crypto.org-b58-10[1,4,1100].pws', 'ref_passwdfile_b58_20': '98831F3A-фубар@crypto.org-b58-20[1,4,1100].pws', + 'ref_passwdfile_hex_32': '98831F3A-фубар@crypto.org-hex-32[1,4,1100].pws', + 'ref_passwdfile_hex_48': '98831F3A-фубар@crypto.org-hex-48[1,4,1100].pws', 'ref_passwdfile_hex_64': '98831F3A-фубар@crypto.org-hex-64[1,4,1100].pws', 'ref_tx_file': { # data shared with ref_altcoin, autosign 'btc': ('0B8D5A[15.31789,14,tl=1320969600].rawtx', @@ -85,6 +87,8 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared): 'ref_passwdfile_b32_24_chksum': '8D56 3845 A072 A5B9', 'ref_passwdfile_b58_10_chksum': '534F CC1A 6701 9FED', 'ref_passwdfile_b58_20_chksum': 'DDD9 44B0 CA28 183F', + 'ref_passwdfile_hex_32_chksum': '05C7 3678 E25E BC32', + 'ref_passwdfile_hex_48_chksum': '7DBB FFD0 633E DE6F', 'ref_passwdfile_hex_64_chksum': 'F11D CB0A 8AE3 4D21', } cmd_group = ( # TODO: move to tooltest2 @@ -103,6 +107,8 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared): ('ref_passwdfile_chk_b58_10','saved reference password file (base58, 10 chars)'), ('ref_passwdfile_chk_b32_24','saved reference password file (base32, 24 chars)'), ('ref_passwdfile_chk_b32_12','saved reference password file (base32, 12 chars)'), + ('ref_passwdfile_chk_hex_32','saved reference password file (hexadecimal, 32 chars)'), + ('ref_passwdfile_chk_hex_48','saved reference password file (hexadecimal, 48 chars)'), ('ref_passwdfile_chk_hex_64','saved reference password file (hexadecimal, 64 chars)'), # Create the fake inputs: @@ -224,6 +230,8 @@ class TestSuiteRef(TestSuiteBase,TestSuiteShared): def ref_passwdfile_chk_b58_10(self): return self.ref_passwdfile_chk(key='b58_10',pat='Base58.*len.* 10\n') def ref_passwdfile_chk_b32_24(self): return self.ref_passwdfile_chk(key='b32_24',pat='Base32.*len.* 24\n') def ref_passwdfile_chk_b32_12(self): return self.ref_passwdfile_chk(key='b32_12',pat='Base32.*len.* 12\n') + def ref_passwdfile_chk_hex_32(self): return self.ref_passwdfile_chk(key='hex_32',pat='Hexadec.*len.* 32\n') + def ref_passwdfile_chk_hex_48(self): return self.ref_passwdfile_chk(key='hex_48',pat='Hexadec.*len.* 48\n') def ref_passwdfile_chk_hex_64(self): return self.ref_passwdfile_chk(key='hex_64',pat='Hexadec.*len.* 64\n') def ref_tx_chk(self): diff --git a/test/test_py_d/ts_ref_3seed.py b/test/test_py_d/ts_ref_3seed.py index d4272b95..d22c07f4 100755 --- a/test/test_py_d/ts_ref_3seed.py +++ b/test/test_py_d/ts_ref_3seed.py @@ -76,6 +76,7 @@ class TestSuiteRef3Seed(TestSuiteBase,TestSuiteShared): 'refpasswdgen_half_1':'D310 2593 B5D9 2E88', 'ref_b32passwdgen_1': '37B6 C218 2ABC 7508', 'ref_hexpasswdgen_1': '523A F547 0E69 8323', + 'ref_hexpasswdgen_half_1': '8E99 E696 84CE E7D5', 'refaddrgen_legacy_2': { 'btc': ('8C17 A5FA 0470 6E89','764C 66F9 7502 AAEA'), 'ltc': ('2B77 A009 D5D0 22AD','51D1 979D 0A35 F24B'), @@ -112,6 +113,7 @@ class TestSuiteRef3Seed(TestSuiteBase,TestSuiteShared): 'refpasswdgen_half_2':'12B3 4929 9506 76E0', 'ref_b32passwdgen_2': '2A28 C5C7 36EC 217A', 'ref_hexpasswdgen_2': 'B11C AC6A 1464 608D', + 'ref_hexpasswdgen_half_2': '59F3 8F48 861E 1186', 'refaddrgen_legacy_3': { 'btc': ('6FEF 6FB9 7B13 5D91','424E 4326 CFFE 5F51'), 'ltc': ('AD52 C3FE 8924 AAF0','4EBE 2E85 E969 1B30'), @@ -148,6 +150,7 @@ class TestSuiteRef3Seed(TestSuiteBase,TestSuiteShared): 'refpasswdgen_half_3':'272C B770 0176 D7EA', 'ref_b32passwdgen_3': 'F6C1 CDFB 97D9 FCAE', 'ref_hexpasswdgen_3': 'BD4F A0AC 8628 4BE4', + 'ref_hexpasswdgen_half_3': 'FBDD F733 FFB9 21C1', } cmd_group = ( # reading @@ -177,7 +180,8 @@ class TestSuiteRef3Seed(TestSuiteBase,TestSuiteShared): ('refpasswdgen', (['mmdat',pwfile],'new refwallet passwd file chksum')), ('refpasswdgen_half', (['mmdat',pwfile],'new refwallet passwd file chksum (half-length)')), ('ref_b32passwdgen', (['mmdat',pwfile],'new refwallet passwd file chksum (base32)')), - ('ref_hexpasswdgen', (['mmdat',pwfile],'new refwallet passwd file chksum (base32)')), + ('ref_hexpasswdgen', (['mmdat',pwfile],'new refwallet passwd file chksum (hex)')), + ('ref_hexpasswdgen_half',(['mmdat',pwfile],'new refwallet passwd file chksum (hex, half-length)')), ) def __init__(self,trunner,cfgs,spawn): @@ -330,3 +334,7 @@ class TestSuiteRef3Seed(TestSuiteBase,TestSuiteShared): def ref_hexpasswdgen(self,wf,pf): ea = ['--passwd-fmt=hex'] return self.addrgen(wf,pf,check_ref=True,ftype='passhex',id_str='фубар@crypto.org',extra_args=ea) + + def ref_hexpasswdgen_half(self,wf,pf): + ea = ['--passwd-fmt=hex','--passwd-len=h'] + return self.addrgen(wf,pf,check_ref=True,ftype='passhex',id_str='фубар@crypto.org',extra_args=ea)