Browse Source

use pycryptodome/pycryptodomex for Keccak testing

The MMGen Project 1 year ago
parent
commit
e1f68963a7
4 changed files with 36 additions and 7 deletions
  1. 9 0
      mmgen/util.py
  2. 2 0
      test/gentest.py
  3. 9 6
      test/hashfunc.py
  4. 16 1
      test/unit_tests_d/ut_dep.py

+ 9 - 0
mmgen/util.py

@@ -399,6 +399,15 @@ def async_run(coro):
 	import asyncio
 	return asyncio.run(coro)
 
+def load_cryptodomex(called=[]):
+	if not called:
+		try:
+			import Cryptodome
+		except ImportError:
+			import Crypto
+			sys.modules['Cryptodome'] = sys.modules['Crypto']
+		called.append(True)
+
 def wrap_ripemd160(called=[]):
 	if not called:
 		try:

+ 2 - 0
test/gentest.py

@@ -230,6 +230,8 @@ class GenToolMonero_python(GenTool):
 
 	def __init__(self,*args,**kwargs):
 		super().__init__(*args,**kwargs)
+		from mmgen.util import load_cryptodomex
+		load_cryptodomex()
 		try:
 			from monero.seed import Seed
 		except:

+ 9 - 6
test/hashfunc.py

@@ -109,12 +109,15 @@ class TestKeccak(TestHashFunc):
 		from mmgen.contrib.keccak import keccak_256
 		self.t_cls = keccak_256
 		from mmgen.pyversion import python_version
-		if python_version >= '3.11':
-			ymsg(f'Skipping keccak random data test for Python version {python_version} (no pysha3)')
-			self.hashlib = None
-		elif gc.platform == 'win':
-			ymsg(f'Skipping keccak random data test for Windows platform (no pysha3)')
-			self.hashlib = None
+		if python_version >= '3.11' or gc.platform == 'win':
+			class hashlib:
+				@staticmethod
+				def keccak_256(data):
+					return keccak.new(data=data,digest_bytes=32)
+			from mmgen.util import load_cryptodomex
+			load_cryptodomex()
+			from Cryptodome.Hash import keccak
+			self.hashlib = hashlib
 		else:
 			import sha3
 			self.hashlib = sha3

+ 16 - 1
test/unit_tests_d/ut_dep.py

@@ -15,7 +15,7 @@ from ..include.common import cfg,vmsg,check_solc_ver
 
 class unit_tests:
 
-	altcoin_deps = ('pysha3','py_ecc','solc')
+	altcoin_deps = ('pysha3','py_ecc','solc','pycryptodomex')
 	win_skip = ('pysha3','led')
 
 	def led(self,name,ut):
@@ -36,6 +36,21 @@ class unit_tests:
 			from sha3 import keccak_256
 		return True
 
+	def pycryptodomex(self,name,ut): # ETH,XMR
+		from mmgen.pyversion import python_version
+		if python_version >= '3.11' or gc.platform == 'win':
+			try:
+				from mmgen.util import load_cryptodomex
+			except Exception as e:
+				msg(str(e))
+				ymsg('Please install the ‘pycryptodome’ or ‘pycryptodomex’ package on your system')
+				return False
+		elif gc.platform != 'win':
+			ut.skip_msg(f'platform {gc.platform!r}')
+		else:
+			ut.skip_msg(f'Python version {python_version}')
+		return True
+
 	def py_ecc(self,name,ut): # ETH
 		from py_ecc.secp256k1 import privtopub
 		return True