improve load_cryptodome() monkey-patch function

This commit is contained in:
The MMGen Project 2024-12-30 11:31:39 +00:00
commit 51e456a4e5
Signed by: mmgen
GPG key ID: 3F8B1861E32B7DA2
6 changed files with 32 additions and 26 deletions

View file

@ -1 +1 @@
pycryptodomex
pycryptodome

View file

@ -30,18 +30,30 @@ def die_pause(ev=0, s=''):
input('Press ENTER to exit')
sys.exit(ev)
# monkey-patch function for monero-python: permits its use with pycryptodome (e.g. MSYS2)
# instead of the expected pycryptodomex
def load_cryptodomex():
try:
import Cryptodome # cryptodomex
except ImportError:
def cffi_override_fixup():
from cffi import FFI
class FFI_override:
def cdef(self, csource, override=False, packed=False, pack=None):
self._cdef(csource, override=True, packed=packed, pack=pack)
FFI.cdef = FFI_override.cdef
# monkey-patch function: makes modules pycryptodome and pycryptodomex available to packages that
# expect them (monero-python, eth-keys), regardless of which one is installed on system
def load_cryptodome(called=[]):
if not called:
cffi_override_fixup()
try:
import Crypto # cryptodome
import Crypto # Crypto == pycryptodome
except ImportError:
die(2, 'Unable to import either the ‘pycryptodomex’ or ‘pycryptodome’ package')
try:
import Cryptodome # Crypto == pycryptodome
except ImportError:
die(2, 'Unable to import the ‘pycryptodome’ or ‘pycryptodomex’ package')
else:
sys.modules['Crypto'] = Cryptodome # Crypto == pycryptodome
else:
sys.modules['Cryptodome'] = Crypto
sys.modules['Cryptodome'] = Crypto # Cryptodome == pycryptodomex
called.append(True)
# called with no arguments by pyethereum.utils:
def get_keccak(cfg=None, cached_ret=[]):
@ -51,15 +63,8 @@ def get_keccak(cfg=None, cached_ret=[]):
cfg._util.qmsg('Using internal keccak module by user request')
from .contrib.keccak import keccak_256
else:
try:
from Cryptodome.Hash import keccak
except ImportError as e:
try:
from Crypto.Hash import keccak
except ImportError as e2:
msg(f'{e2} and {e}')
die('MMGenImportError',
'Please install the ‘pycryptodome’ or ‘pycryptodomex’ package on your system')
load_cryptodome()
from Crypto.Hash import keccak
def keccak_256(data):
return keccak.new(data=data, digest_bytes=32)
cached_ret.append(keccak_256)

View file

@ -91,4 +91,5 @@ ignored-classes = [ # ignored for no-member, otherwise checked
"SwapMgrBase",
"Opts",
"Help",
"FFI_override",
]

View file

@ -565,7 +565,6 @@ from mmgen.key import PrivKey
from mmgen.addr import MMGenAddrType
from mmgen.addrgen import KeyGenerator, AddrGenerator
from mmgen.keygen import get_backends
from mmgen.util2 import load_cryptodomex
from test.include.common import getrand, get_ethkey, set_globals
gtr = namedtuple('gen_tool_result', ['wif', 'addr', 'viewkey'])
@ -582,9 +581,9 @@ vmsg = cfg._util.vmsg
proto = cfg._proto
if proto.coin == 'XMR':
# This must be done at top level, not in monero tool __init__
load_cryptodomex()
if proto.coin in ('XMR', 'ETH', 'ETC'):
from mmgen.util2 import load_cryptodome
load_cryptodome()
if __name__ == '__main__':
from mmgen.main import launch

View file

@ -32,7 +32,8 @@ class unit_tests:
def keccak(self, name, ut): # used by ETH, XMR
from mmgen.util2 import get_keccak
try:
get_keccak()
keccak_256 = get_keccak()
keccak_256(b'abc')
except Exception as e:
rmsg(str(e))
return False

View file

@ -47,8 +47,8 @@ class unit_tests:
return True
def monero_python(self, name, ut):
from mmgen.util2 import load_cryptodomex
load_cryptodomex()
from mmgen.util2 import load_cryptodome
load_cryptodome()
from monero.seed import Seed
Seed('deadbeef' * 8).public_address()
return True