From c4feeccb6670316990dd2fbaec1c6bc7826be942 Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Thu, 21 May 2026 12:09:33 +0000 Subject: [PATCH] enable use of `pyaes` package for testing --- mmgen/autosign/__init__.py | 5 ++++- mmgen/cfg.py | 2 ++ mmgen/crypto.py | 13 +++++++++++++ nix/user-packages.nix | 1 + test/modtest_d/dep.py | 2 +- 5 files changed, 21 insertions(+), 2 deletions(-) diff --git a/mmgen/autosign/__init__.py b/mmgen/autosign/__init__.py index 1cd5c565..6adca942 100755 --- a/mmgen/autosign/__init__.py +++ b/mmgen/autosign/__init__.py @@ -401,7 +401,10 @@ class Autosign: cfg = self.cfg, prompt = f'Default wallet ‘{wf}’ found.\nUse default wallet for autosigning?', default_yes = True): - ss_in = Wallet(Config(), fn=wf) + ss_in = Wallet(Config({ + 'test_suite': self.cfg.test_suite, + 'aes_backend': self.cfg.aes_backend + }), fn=wf) else: ss_in = get_mn_wallet() diff --git a/mmgen/cfg.py b/mmgen/cfg.py index 071d80d7..f47fd01c 100755 --- a/mmgen/cfg.py +++ b/mmgen/cfg.py @@ -229,6 +229,7 @@ class Config(Lockable): autochg_ignore_labels = False autosign = False threaded_python = not sys._is_gil_enabled() + aes_backend = 'cryptography' # regtest: bob = False @@ -333,6 +334,7 @@ class Config(Lockable): _env_opts = ( 'MMGEN_DEBUG_ALL', # special: there is no `debug_all` attribute + 'MMGEN_AES_BACKEND', 'MMGEN_BLACKLIST_DAEMONS', 'MMGEN_BOGUS_SEND', 'MMGEN_BOGUS_UNSPENT_DATA', diff --git a/mmgen/crypto.py b/mmgen/crypto.py index 4caa45cd..b148cb3c 100755 --- a/mmgen/crypto.py +++ b/mmgen/crypto.py @@ -67,6 +67,9 @@ class Crypto: def __init__(self, cfg): self.cfg = cfg self.util = cfg._util + if cfg.test_suite and self.cfg.aes_backend == 'pyaes': + self.get_aes_ctr = self.get_aes_ctr_pyaes + self.encrypt_aes_ctr = self.encrypt_aes_ctr_pyaes @staticmethod def get_aes_ctr(key, iv): @@ -78,6 +81,16 @@ class Crypto: encryptor = self.get_aes_ctr(key, iv) return encryptor.update(data) + encryptor.finalize() + @staticmethod + def get_aes_ctr_pyaes(key, iv): + import pyaes + class MyAES(pyaes.AESModeOfOperationCTR): + update = pyaes.AESModeOfOperationCTR.encrypt + return MyAES(key, pyaes.Counter(int.from_bytes(iv))) + + def encrypt_aes_ctr_pyaes(self, key, iv, data): + return self.get_aes_ctr_pyaes(key, iv).encrypt(data) + def get_hash_params(self, hash_preset): if hash_preset in self.hash_presets: return self.hash_presets[hash_preset] # N, r, p diff --git a/nix/user-packages.nix b/nix/user-packages.nix index 3c6e2c8b..cf61e739 100644 --- a/nix/user-packages.nix +++ b/nix/user-packages.nix @@ -54,5 +54,6 @@ rec { # pydantic = pydantic; # eth-keys # pure-protobuf = pure-protobuf; # THORChain # bip-utils = bip-utils; # bip_hd + # pyaes = pyaes; # developer testing }; } diff --git a/test/modtest_d/dep.py b/test/modtest_d/dep.py index 29afda48..b52c2c53 100755 --- a/test/modtest_d/dep.py +++ b/test/modtest_d/dep.py @@ -74,7 +74,7 @@ class unit_tests: msg('Is the ‘pysocks’ package installed?') return False - def cryptography(self, name, ut): + def aes(self, name, ut): from mmgen.crypto import Crypto Crypto(cfg).encrypt_aes_ctr(b'deadbeef' * 4, b'deadbeef' * 2, b'foo') return True