Browse Source

bip39: add `tobytes(), frombytes()` methods; Seed: remove `hexdata` attr

The MMGen Project 1 year ago
parent
commit
faf28879f6
5 changed files with 19 additions and 24 deletions
  1. 9 10
      mmgen/bip39.py
  2. 0 4
      mmgen/seed.py
  3. 1 1
      mmgen/wallet/mmhex.py
  4. 8 8
      mmgen/wallet/mnemonic.py
  5. 1 1
      mmgen/wallet/plainhex.py

+ 9 - 10
mmgen/bip39.py

@@ -68,13 +68,10 @@ class bip39(baseconv):
 		except Exception as e:
 			raise ValueError(f'{seed_bits!r}: invalid seed length for BIP39 mnemonic') from e
 
-	def tobytes(self,*args,**kwargs):
-		raise NotImplementedError('Method not supported')
+	def tohex(self, words_arg, pad=None):
+		return self.tobytes(words_arg, pad=pad).hex()
 
-	def frombytes(self,*args,**kwargs):
-		raise NotImplementedError('Method not supported')
-
-	def tohex(self,words_arg,pad=None):
+	def tobytes(self,words_arg,pad=None):
 		assert isinstance(words_arg,(list,tuple)),'words_arg must be list or tuple'
 		assert pad in (None,'seed'), f"{pad}: invalid 'pad' argument (must be None or 'seed')"
 
@@ -106,15 +103,17 @@ class bip39(baseconv):
 		if chk_bin != chk_bin_chk:
 			die( 'MnemonicError', f'invalid BIP39 seed phrase checksum ({chk_bin} != {chk_bin_chk})' )
 
-		return seed_hex
+		return seed_bytes
 
-	def fromhex(self,hexstr,pad=None,tostr=False):
+	def fromhex(self, hexstr, pad=None, tostr=False):
 		assert is_hex_str(hexstr),'seed data not a hexadecimal string'
+		return self.frombytes(bytes.fromhex(hexstr), pad=pad, tostr=tostr)
+
+	def frombytes(self, seed_bytes, pad=None, tostr=False):
 		assert tostr is False,"'tostr' must be False for 'bip39'"
 		assert pad in (None,'seed'), f"{pad}: invalid 'pad' argument (must be None or 'seed')"
 
 		wl = self.digits
-		seed_bytes = bytes.fromhex(hexstr)
 		bitlen = len(seed_bytes) * 8
 
 		assert bitlen in self.constants, f'{bitlen}: invalid seed bit length'
@@ -122,7 +121,7 @@ class bip39(baseconv):
 
 		chk_hex = sha256(seed_bytes).hexdigest()
 
-		seed_bin = f'{int(hexstr,16):0{bitlen}b}'
+		seed_bin = f'{int(seed_bytes.hex(),16):0{bitlen}b}'
 		chk_bin  = f'{int(chk_hex,16):0256b}'
 
 		res = seed_bin + chk_bin

+ 0 - 4
mmgen/seed.py

@@ -77,10 +77,6 @@ class SeedBase(MMGenObject):
 	def byte_len(self):
 		return len(self.data)
 
-	@property
-	def hexdata(self):
-		return self.data.hex()
-
 	@property
 	def fn_stem(self):
 		return self.sid

+ 1 - 1
mmgen/wallet/mmhex.py

@@ -23,7 +23,7 @@ class wallet(wallet):
 	desc = 'hexadecimal seed data with checksum'
 
 	def _format(self):
-		h = self.seed.hexdata
+		h = self.seed.data.hex()
 		self.ssdata.chksum = make_chksum_6(h)
 		self.fmt_data = f'{self.ssdata.chksum} {split_into_cols(4,h)}\n'
 

+ 8 - 8
mmgen/wallet/mnemonic.py

@@ -43,14 +43,14 @@ class wallet(wallet):
 
 	def _format(self):
 
-		hexseed = self.seed.hexdata
+		seed = self.seed.data
 
 		bc = self.conv_cls(self.wl_id)
-		mn  = bc.fromhex( hexseed, 'seed' )
-		rev = bc.tohex( mn, 'seed' )
+		mn  = bc.frombytes(seed, 'seed')
+		rev = bc.tobytes(mn, 'seed')
 
 		# Internal error, so just die on fail
-		self.cfg._util.compare_or_die( rev, 'recomputed seed', hexseed, 'original', e='Internal error' )
+		self.cfg._util.compare_or_die(rev, 'recomputed seed', seed, 'original seed', e='Internal error')
 
 		self.ssdata.mnemonic = mn
 		self.fmt_data = ' '.join(mn) + '\n'
@@ -71,10 +71,10 @@ class wallet(wallet):
 				msg(f'Invalid mnemonic: word #{n} is not in the {self.wl_id.upper()} wordlist')
 				return False
 
-		hexseed = bc.tohex( mn, 'seed' )
-		rev     = bc.fromhex( hexseed, 'seed' )
+		seed = bc.tobytes(mn, 'seed')
+		rev  = bc.frombytes(seed, 'seed')
 
-		if len(hexseed) * 4 not in Seed.lens:
+		if len(seed) * 8 not in Seed.lens:
 			msg('Invalid mnemonic (produces too large a number)')
 			return False
 
@@ -86,7 +86,7 @@ class wallet(wallet):
 			desc2 = 'original mnemonic',
 			e     = 'Internal error' )
 
-		self.seed = Seed( self.cfg, bytes.fromhex(hexseed) )
+		self.seed = Seed(self.cfg, seed)
 		self.ssdata.mnemonic = mn
 
 		self.check_usr_seed_len()

+ 1 - 1
mmgen/wallet/plainhex.py

@@ -22,7 +22,7 @@ class wallet(wallet):
 	desc = 'plain hexadecimal seed data'
 
 	def _format(self):
-		self.fmt_data = self.seed.hexdata + '\n'
+		self.fmt_data = self.seed.data.hex() + '\n'
 
 	def _deformat(self):
 		desc = self.desc