From b46cbd1ddd8df58f05251a771a02c00de7919e57 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Wed, 19 Jan 2022 11:43:52 +0000 Subject: [PATCH] replace global variables 'seed_lens' and 'dfl_seed_len' - g.seed_lens -> Seed.lens - g.dfl_seed_len -> Seed.dfl_lens --- mmgen/globalvars.py | 2 -- mmgen/help.py | 4 ++++ mmgen/main_addrgen.py | 4 ++-- mmgen/main_passgen.py | 6 +++--- mmgen/main_txbump.py | 3 ++- mmgen/main_txdo.py | 3 ++- mmgen/main_txsign.py | 3 ++- mmgen/main_wallet.py | 5 +++-- mmgen/opts.py | 6 ++++-- mmgen/seed.py | 17 ++++++++++++----- mmgen/subseed.py | 3 +++ mmgen/wallet.py | 16 ++++++++-------- 12 files changed, 45 insertions(+), 27 deletions(-) diff --git a/mmgen/globalvars.py b/mmgen/globalvars.py index 59ad9ee6..ac40de71 100755 --- a/mmgen/globalvars.py +++ b/mmgen/globalvars.py @@ -72,7 +72,6 @@ class GlobalContext(Lockable): err_disp_timeout = 0.7 short_disp_timeout = 0.3 min_time_precision = 18 - dfl_seed_len = 256 # Variables - these might be altered at runtime: @@ -262,7 +261,6 @@ class GlobalContext(Lockable): max_urandchars = 80 min_urandchars = 10 - seed_lens = 128,192,256 scramble_hash_rounds = 10 subseeds = 100 diff --git a/mmgen/help.py b/mmgen/help.py index 718f76c7..adecf471 100755 --- a/mmgen/help.py +++ b/mmgen/help.py @@ -39,6 +39,10 @@ def help_notes_func(proto,po,k): class help_notes: + def dfl_seed_len(): + from .seed import Seed + return str(Seed.dfl_len) + def password_formats(): from .passwdlist import PasswordList pwi_fs = '{:8} {:1} {:26} {:<7} {:<7} {}' diff --git a/mmgen/main_addrgen.py b/mmgen/main_addrgen.py index 28932a6a..191efd3d 100755 --- a/mmgen/main_addrgen.py +++ b/mmgen/main_addrgen.py @@ -65,7 +65,7 @@ opts_data = { for {coin_id}: {kgs} -l, --seed-len= l Specify wallet seed length of 'l' bits. This option is required only for brainwallet and incognito inputs - with non-standard (< {g.dfl_seed_len}-bit) seed lengths + with non-standard (< {dsl}-bit) seed lengths. -p, --hash-preset= p Use the scrypt hash parameters defined by preset 'p' for password hashing (default: '{g.dfl_hash_preset}') -z, --show-hash-presets Show information on available hash presets @@ -105,10 +105,10 @@ FMT CODES: }, 'code': { 'options': lambda proto,help_notes,s: s.format( - seed_lens=', '.join(map(str,g.seed_lens)), dmat=help_notes('dfl_mmtype'), kgs=help_notes('keygen_backends'), coin_id=help_notes('coin_id'), + dsl=help_notes('dfl_seed_len'), pnm=g.proj_name, what=gen_what, g=g, diff --git a/mmgen/main_passgen.py b/mmgen/main_passgen.py index c533d68a..a79c7610 100755 --- a/mmgen/main_passgen.py +++ b/mmgen/main_passgen.py @@ -54,7 +54,7 @@ opts_data = { generate passwords of half the default length. -l, --seed-len= l Specify wallet seed length of 'l' bits. This option is required only for brainwallet and incognito inputs - with non-standard (< {g.dfl_seed_len}-bit) seed lengths + with non-standard (< {dsl}-bit) seed lengths. -p, --hash-preset= p Use the scrypt hash parameters defined by preset 'p' for password hashing (default: '{g.dfl_hash_preset}') -z, --show-hash-presets Show information on available hash presets @@ -114,9 +114,9 @@ FMT CODES: """ }, 'code': { - 'options': lambda s: s.format( - seed_lens=', '.join(map(str,g.seed_lens)), + 'options': lambda help_notes,s: s.format( g=g,pnm=g.proj_name, + dsl=help_notes('dfl_seed_len'), dpf=PasswordList.dfl_pw_fmt, ), 'notes': lambda help_notes,s: s.format( diff --git a/mmgen/main_txbump.py b/mmgen/main_txbump.py index e6d5d292..d48d3e91 100755 --- a/mmgen/main_txbump.py +++ b/mmgen/main_txbump.py @@ -49,7 +49,7 @@ opts_data = { -i, --in-fmt= f Input is from wallet format 'f' (see FMT CODES below) -l, --seed-len= l Specify wallet seed length of 'l' bits. This option is required only for brainwallet and incognito inputs - with non-standard (< {g.dfl_seed_len}-bit) seed lengths. + with non-standard (< {dsl}-bit) seed lengths. -k, --keys-from-file=f Provide additional keys for non-{pnm} addresses -K, --keygen-backend=n Use backend 'n' for public key generation. Options for {coin_id}: {kgs} @@ -90,6 +90,7 @@ FMT CODES: fl=help_notes('fee_spec_letters'), kgs=help_notes('keygen_backends'), coin_id=help_notes('coin_id'), + dsl=help_notes('dfl_seed_len'), cu=proto.coin), 'notes': lambda help_notes,s: s.format( help_notes('fee'), diff --git a/mmgen/main_txdo.py b/mmgen/main_txdo.py index f4f8a633..baa9498a 100755 --- a/mmgen/main_txdo.py +++ b/mmgen/main_txdo.py @@ -56,7 +56,7 @@ opts_data = { outputs associated with each address will be included. -l, --seed-len= l Specify wallet seed length of 'l' bits. This option is required only for brainwallet and incognito inputs - with non-standard (< {g.dfl_seed_len}-bit) seed lengths. + with non-standard (< {dsl}-bit) seed lengths. -k, --keys-from-file=f Provide additional keys for non-{pnm} addresses -K, --keygen-backend=n Use backend 'n' for public key generation. Options for {coin_id}: {kgs} @@ -104,6 +104,7 @@ FMT CODES: ss_max=SubSeedIdxRange.max_idx, fe_all=fmt_list(g.autoset_opts['fee_estimate_mode'].choices,fmt='no_spc'), fe_dfl=g.autoset_opts['fee_estimate_mode'].choices[0], + dsl=help_notes('dfl_seed_len'), cu=proto.coin), 'notes': lambda help_notes,s: s.format( help_notes('txcreate'), diff --git a/mmgen/main_txsign.py b/mmgen/main_txsign.py index 1463a5b4..af6b2106 100755 --- a/mmgen/main_txsign.py +++ b/mmgen/main_txsign.py @@ -45,7 +45,7 @@ opts_data = { -O, --old-incog-fmt Specify old-format incognito input -l, --seed-len= l Specify wallet seed length of 'l' bits. This option is required only for brainwallet and incognito inputs - with non-standard (< {g.dfl_seed_len}-bit) seed lengths. + with non-standard (< {dsl}-bit) seed lengths. -p, --hash-preset=p Use the scrypt hash parameters defined by preset 'p' for password hashing (default: '{g.dfl_hash_preset}') -z, --show-hash-presets Show information on available hash presets @@ -85,6 +85,7 @@ FMT CODES: pnl=g.proj_name.lower(), kgs=help_notes('keygen_backends'), coin_id=help_notes('coin_id'), + dsl=help_notes('dfl_seed_len'), ss=g.subseeds, ss_max=SubSeedIdxRange.max_idx, cu=proto.coin), diff --git a/mmgen/main_wallet.py b/mmgen/main_wallet.py index 7682b65a..6106897c 100755 --- a/mmgen/main_wallet.py +++ b/mmgen/main_wallet.py @@ -102,7 +102,7 @@ opts_data = { -K, --keep-hash-preset Reuse hash preset of input wallet for output wallet -l, --seed-len= l Specify wallet seed length of 'l' bits. This option is required only for brainwallet and incognito inputs - with non-standard (< {g.dfl_seed_len}-bit) seed lengths. + with non-standard (< {dsl}-bit) seed lengths. -L, --label= l Specify a label 'l' for output wallet -m, --keep-label Reuse label of input wallet for output wallet -M, --master-share=i Use a master share with index 'i' (min:{ms_min}, max:{ms_max}) @@ -126,11 +126,12 @@ FMT CODES: """ }, 'code': { - 'options': lambda s: s.format( + 'options': lambda help_notes,s: s.format( iaction=capfirst(iaction), oaction=capfirst(oaction), ms_min=MasterShareIdx.min_val, ms_max=MasterShareIdx.max_val, + dsl=help_notes('dfl_seed_len'), g=g, ), 'notes': lambda help_notes,s: s.format( diff --git a/mmgen/opts.py b/mmgen/opts.py index 7c68458c..04a9ecc9 100755 --- a/mmgen/opts.py +++ b/mmgen/opts.py @@ -510,19 +510,21 @@ def check_usr_opts(usr_opts): # Raises an exception if any check fails chk_hidden_incog_output_params = chk_hidden_incog_input_params def chk_seed_len(key,val,desc): + from .seed import Seed opt_is_int(val,desc) - opt_is_in_list(int(val),g.seed_lens,desc) + opt_is_in_list(int(val),Seed.lens,desc) def chk_hash_preset(key,val,desc): opt_is_in_list(val,list(g.hash_presets.keys()),desc) def chk_brain_params(key,val,desc): + from .seed import Seed a = val.split(',') if len(a) != 2: opt_display(key,val) raise UserOptError('Option requires two comma-separated arguments') opt_is_int(a[0],'seed length '+desc) - opt_is_in_list(int(a[0]),g.seed_lens,'seed length '+desc) + opt_is_in_list(int(a[0]),Seed.lens,'seed length '+desc) opt_is_in_list(a[1],list(g.hash_presets.keys()),'hash preset '+desc) def chk_usr_randchars(key,val,desc): diff --git a/mmgen/seed.py b/mmgen/seed.py index 46a0ac7c..279b8dad 100755 --- a/mmgen/seed.py +++ b/mmgen/seed.py @@ -20,8 +20,10 @@ seed.py: Seed-related classes and methods for the MMGen suite """ -from .common import * -from .objmethods import Hilite,InitErrors +from string import hexdigits + +from .util import make_chksum_8 +from .objmethods import Hilite,InitErrors,MMGenObject from .obj import ImmutableAttr,get_obj class SeedID(str,Hilite,InitErrors): @@ -48,16 +50,21 @@ def is_seed_id(s): class SeedBase(MMGenObject): + lens = ( 128, 192, 256 ) + dfl_len = 256 + data = ImmutableAttr(bytes,typeconv=False) sid = ImmutableAttr(SeedID,typeconv=False) def __init__(self,seed_bin=None): if not seed_bin: + from .opts import opt from .crypto import get_random + from hashlib import sha256 # Truncate random data for smaller seed lengths - seed_bin = sha256(get_random(1033)).digest()[:(opt.seed_len or g.dfl_seed_len)//8] - elif len(seed_bin)*8 not in g.seed_lens: - die(3,f'{len(seed_bin)}: invalid seed length') + seed_bin = sha256(get_random(1033)).digest()[:(opt.seed_len or self.dfl_len)//8] + elif len(seed_bin)*8 not in self.lens: + die(3,f'{len(seed_bin)*8}: invalid seed bit length') self.data = seed_bin self.sid = SeedID(seed=self) diff --git a/mmgen/subseed.py b/mmgen/subseed.py index 947fc72a..f53304c3 100755 --- a/mmgen/subseed.py +++ b/mmgen/subseed.py @@ -20,6 +20,9 @@ subseed.py: Subseed classes and methods for the MMGen suite """ +from .common import * +from .color import green +from .util import msg_r,msg,qmsg from .exception import SubSeedNonceRangeExceeded from .obj import MMGenRange,IndexedDict from .seed import * diff --git a/mmgen/wallet.py b/mmgen/wallet.py index 8825879f..5f5d2dc8 100755 --- a/mmgen/wallet.py +++ b/mmgen/wallet.py @@ -446,7 +446,7 @@ class Mnemonic(WalletUnenc): hexseed = bc.tohex( mn, 'seed' ) rev = bc.fromhex( hexseed, 'seed' ) - if len(hexseed) * 4 not in g.seed_lens: + if len(hexseed) * 4 not in Seed.lens: msg('Invalid mnemonic (produces too large a number)') return False @@ -646,7 +646,7 @@ class PlainHexSeedFile(WalletUnenc): msg(f'{d!r}: not a lowercase hexadecimal string, in {desc}') return False - if not len(d)*4 in g.seed_lens: + if not len(d)*4 in Seed.lens: msg(f'Invalid data length ({len(d)}) in {desc}') return False @@ -682,7 +682,7 @@ class MMGenHexSeedFile(WalletUnenc): msg(f'{self.fmt_data.strip()!r}: invalid {desc}') return False - if not len(hstr)*4 in g.seed_lens: + if not len(hstr)*4 in Seed.lens: msg(f'Invalid data length ({len(hstr)}) in {desc}') return False @@ -900,10 +900,10 @@ class Brainwallet(WalletEnc): bw_seed_len,d.hash_preset = self.get_bw_params() else: if not opt.seed_len: - qmsg(f'Using default seed length of {yellow(str(g.dfl_seed_len))} bits\n' + qmsg(f'Using default seed length of {yellow(str(Seed.dfl_len))} bits\n' + 'If this is not what you want, use the --seed-len option' ) self._get_hash_preset() - bw_seed_len = opt.seed_len or g.dfl_seed_len + bw_seed_len = opt.seed_len or Seed.dfl_len qmsg_r('Hashing brainwallet data. Please wait...') # Use buflen arg of scrypt.hash() to get seed of desired length seed = scrypt_hash_passphrase( @@ -954,7 +954,7 @@ to exit and re-run the program with the '--old-incog-fmt' option. def _incog_data_size_chk(self): # valid sizes: 56, 64, 72 dlen = len(self.fmt_data) - seed_len = opt.seed_len or g.dfl_seed_len + seed_len = opt.seed_len or Seed.dfl_len valid_dlen = self._get_incog_data_len(seed_len) if dlen == valid_dlen: return True @@ -963,7 +963,7 @@ to exit and re-run the program with the '--old-incog-fmt' option. msg('WARNING: old-style incognito format requested. Are you sure this is correct?') msg(f'Invalid incognito data size ({dlen} bytes) for this seed length ({seed_len} bits)') msg(f'Valid data size for this seed length: {valid_dlen} bytes') - for sl in g.seed_lens: + for sl in Seed.lens: if dlen == self._get_incog_data_len(sl): die(1,f'Valid seed length for this data size: {sl} bits') msg(f'This data size ({dlen} bytes) is invalid for all available seed lengths') @@ -1144,7 +1144,7 @@ harder to find, you're advised to choose a much larger file size than this. qmsg(f'Getting hidden incog data from file {self.infile.name!r}') # Already sanity-checked: - d.target_data_len = self._get_incog_data_len(opt.seed_len or g.dfl_seed_len) + d.target_data_len = self._get_incog_data_len(opt.seed_len or Seed.dfl_len) self._check_valid_offset(self.infile,'read') flgs = os.O_RDONLY|os.O_BINARY if g.platform == 'win' else os.O_RDONLY