Browse Source

passgen: allow hex passwords of 32 and 48 characters

MMGen 5 years ago
parent
commit
bfcfc8676d

+ 12 - 9
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):

+ 6 - 0
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
+}

+ 6 - 0
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
+}

+ 8 - 0
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):

+ 9 - 1
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)