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

This commit is contained in:
The MMGen Project 2024-03-10 14:43:33 +00:00
commit faf28879f6
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
5 changed files with 19 additions and 24 deletions

View file

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

View file

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

View file

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

View file

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

View file

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