From faf28879f6dd9a0dc8ee4186384eab2c69acdbde Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Sun, 10 Mar 2024 14:43:33 +0000 Subject: [PATCH] bip39: add `tobytes(), frombytes()` methods; Seed: remove `hexdata` attr --- mmgen/bip39.py | 19 +++++++++---------- mmgen/seed.py | 4 ---- mmgen/wallet/mmhex.py | 2 +- mmgen/wallet/mnemonic.py | 16 ++++++++-------- mmgen/wallet/plainhex.py | 2 +- 5 files changed, 19 insertions(+), 24 deletions(-) diff --git a/mmgen/bip39.py b/mmgen/bip39.py index d9d0825b..e8891b48 100755 --- a/mmgen/bip39.py +++ b/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 diff --git a/mmgen/seed.py b/mmgen/seed.py index a14de7c4..74a401c8 100755 --- a/mmgen/seed.py +++ b/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 diff --git a/mmgen/wallet/mmhex.py b/mmgen/wallet/mmhex.py index 6c57f0d9..12885f34 100755 --- a/mmgen/wallet/mmhex.py +++ b/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' diff --git a/mmgen/wallet/mnemonic.py b/mmgen/wallet/mnemonic.py index 76533c06..8f92bbad 100755 --- a/mmgen/wallet/mnemonic.py +++ b/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() diff --git a/mmgen/wallet/plainhex.py b/mmgen/wallet/plainhex.py index 3b0ac23c..32f1e7dd 100755 --- a/mmgen/wallet/plainhex.py +++ b/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