Browse Source

lazy imports of hashlib, string

The MMGen Project 3 years ago
parent
commit
bb96d6223f
5 changed files with 18 additions and 6 deletions
  1. 1 1
      mmgen/baseconv.py
  2. 2 1
      mmgen/cfg.py
  3. 4 1
      mmgen/crypto.py
  4. 7 3
      mmgen/util.py
  5. 4 0
      mmgen/wallet.py

+ 1 - 1
mmgen/baseconv.py

@@ -20,7 +20,6 @@
 baseconv.py:  base conversion class for the MMGen suite
 """
 
-from hashlib import sha256
 from collections import namedtuple
 
 from .exception import BaseConversionError,BaseConversionPadError,HexadecimalStringError,SeedLengthError
@@ -92,6 +91,7 @@ class baseconv(object):
 		return self.digits
 
 	def get_wordlist_chksum(self):
+		from hashlib import sha256
 		return sha256( ' '.join(self.digits).encode() ).hexdigest()[:8]
 
 	def check_wordlist(self):

+ 2 - 1
mmgen/cfg.py

@@ -24,7 +24,7 @@ cfg.py: API for the MMGen runtime configuration file and related files
 # override_from_env() during init, so global config vars that are set from the environment
 # (such as g.test_suite) cannot be used here.
 
-import sys,os,re,hashlib
+import sys,os,re
 from collections import namedtuple
 
 from .globalvars import *
@@ -111,6 +111,7 @@ class CfgFileSample(CfgFile):
 
 	@staticmethod
 	def compute_chksum(data):
+		import hashlib
 		return hashlib.new('ripemd160','\n'.join(data).encode()).hexdigest()
 
 	@property

+ 4 - 1
mmgen/crypto.py

@@ -21,7 +21,6 @@ crypto.py: Random number, password hashing and symmetric encryption routines for
 """
 
 import os
-from hashlib import sha256
 from collections import namedtuple
 
 from .globalvars import g
@@ -70,6 +69,7 @@ def get_hash_params(hash_preset):
 		die(3,f"{hash_preset}: invalid 'hash_preset' value")
 
 def sha256_rounds(s,n):
+	from hashlib import sha256
 	for i in range(n):
 		s = sha256(s).digest()
 	return s
@@ -251,6 +251,7 @@ def add_user_random(rand_bytes,desc):
 	assert type(rand_bytes) == bytes, 'add_user_random_chk1'
 	if opt.usr_randchars:
 		if not g.user_entropy:
+			from hashlib import sha256
 			g.user_entropy = sha256(_get_random_data_from_user(opt.usr_randchars,desc)).digest()
 			urand_desc = 'user-supplied entropy'
 		else:
@@ -341,6 +342,7 @@ def mmgen_encrypt(data,desc='data',hash_preset=None):
 		hash_preset = hp,
 		passwd_file = opt.passwd_file )
 	key    = make_key(passwd,salt,hp)
+	from hashlib import sha256
 	enc_d  = encrypt_data( sha256(nonce+data).digest() + nonce + data, key, iv, desc=desc )
 	return salt+iv+enc_d
 
@@ -359,6 +361,7 @@ def mmgen_decrypt(data,desc='data',hash_preset=None):
 	key    = make_key(passwd,salt,hp)
 	dec_d  = decrypt_data( enc_d, key, iv, desc )
 	sha256_len = 32
+	from hashlib import sha256
 	if dec_d[:sha256_len] == sha256(dec_d[sha256_len:]).digest():
 		vmsg('OK')
 		return dec_d[sha256_len+mmenc_nonce_len:]

+ 7 - 3
mmgen/util.py

@@ -21,8 +21,6 @@ util.py:  Low-level routines imported by other modules in the MMGen suite
 """
 
 import sys,os,time,re
-from hashlib import sha256
-from string import hexdigits,digits
 
 from .color import *
 from .globalvars import g
@@ -276,7 +274,6 @@ def int2bytespec(n,spec,fmt,print_sym=True):
 	return '{:{}f}{}'.format( n / spec2int(spec), fmt, spec if print_sym else '' )
 
 def parse_bytespec(nbytes):
-	import re
 	m = re.match(r'([0123456789.]+)(.*)',nbytes)
 	if m:
 		if m.group(2):
@@ -331,16 +328,20 @@ def make_chksum_N(s,nchars,sep=False):
 		s = s.encode()
 	if nchars%4 or not (4 <= nchars <= 64):
 		return False
+	from hashlib import sha256
 	s = sha256(sha256(s).digest()).hexdigest().upper()
 	sep = ('',' ')[bool(sep)]
 	return sep.join([s[i*4:i*4+4] for i in range(nchars//4)])
 
 def make_chksum_8(s,sep=False):
 	from .obj import HexStr
+	from hashlib import sha256
 	s = HexStr(sha256(sha256(s).digest()).hexdigest()[:8].upper(),case='upper')
 	return '{} {}'.format(s[:4],s[4:]) if sep else s
+
 def make_chksum_6(s):
 	from .obj import HexStr
+	from hashlib import sha256
 	if isinstance(s,str):
 		s = s.encode()
 	return HexStr(sha256(s).hexdigest()[:6])
@@ -349,6 +350,7 @@ def is_chksum_6(s):
 	return len(s) == 6 and is_hex_str_lc(s)
 
 def make_iv_chksum(s):
+	from hashlib import sha256
 	return sha256(s).hexdigest()[:8].upper()
 
 def splitN(s,n,sep=None): # always return an n-element list
@@ -406,9 +408,11 @@ def is_int(s):
 		return False
 
 def is_hex_str(s):
+	from string import hexdigits
 	return set(list(s.lower())) <= set(list(hexdigits.lower()))
 
 def is_hex_str_lc(s):
+	from string import hexdigits
 	return set(list(s)) <= set(list(hexdigits.lower()))
 
 def is_utf8(s):

+ 4 - 0
mmgen/wallet.py

@@ -350,6 +350,7 @@ class WalletEnc(Wallet):
 		else:
 			self._get_new_passphrase()
 
+		from hashlib import sha256
 		d.salt     = sha256( crypto.get_random(128) ).digest()[:crypto.salt_len]
 		key        = crypto.make_key( d.passwd, d.salt, d.hash_preset )
 		d.key_id   = make_chksum_8(key)
@@ -911,6 +912,7 @@ to exit and re-run the program with the '--old-incog-fmt' option.
 	}
 
 	def _make_iv_chksum(self,s):
+		from hashlib import sha256
 		return sha256(s).hexdigest()[:8].upper()
 
 	def _get_incog_data_len(self,seed_len):
@@ -952,6 +954,7 @@ to exit and re-run the program with the '--old-incog-fmt' option.
 
 		d.salt = crypto.get_random( crypto.salt_len )
 		key = crypto.make_key( d.passwd, d.salt, d.hash_preset, 'incog wallet key' )
+		from hashlib import sha256
 		chk = sha256(self.seed.data).digest()[:8]
 		d.enc_seed = crypto.encrypt_data(
 			chk + self.seed.data,
@@ -1001,6 +1004,7 @@ to exit and re-run the program with the '--old-incog-fmt' option.
 
 	def _verify_seed_newfmt(self,data):
 		chk,seed = data[:8],data[8:]
+		from hashlib import sha256
 		if sha256(seed).digest()[:8] == chk:
 			qmsg('Passphrase{} are correct'.format( self.msg['dec_chk'].format('and') ))
 			return seed