From d34f36e4c3ef007e1e3051f3215d387aed0d7ebc Mon Sep 17 00:00:00 2001 From: The MMGen Project Date: Tue, 15 Sep 2026 10:51:03 +0000 Subject: [PATCH] crypto: move `pyaes` backend to test suite --- mmgen/crypto.py | 28 +++++++-------------------- test/overlay/fakemods/mmgen/crypto.py | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/mmgen/crypto.py b/mmgen/crypto.py index 2723fbfb..72c9b80c 100755 --- a/mmgen/crypto.py +++ b/mmgen/crypto.py @@ -24,13 +24,14 @@ import os from collections import namedtuple from .cfg import gc -from .util import msg, msg_r, ymsg, fmt, die, make_chksum_8, oneshot_warning +from .util import msg, msg_r, ymsg, fmt, die, make_chksum_8, oneshot_warning, fmt_list class Crypto: mmenc_ext = 'mmenc' scramble_hash_rounds = 10 + aes_backends = ('cryptography',) aesctr_iv_len = 16 aesctr_dfl_iv = int.to_bytes(1, aesctr_iv_len, 'big') hincog_chk_len = 8 @@ -67,31 +68,16 @@ class Crypto: def __init__(self, cfg): self.cfg = cfg self.util = cfg._util - match self.cfg.aes_backend: - case 'cryptography': - self.get_aes_ctr = self.get_aes_ctr_cryptography - case 'pyaes': - assert cfg.test_suite, '`pyaes` module is insecure and suitable only for testing' - self.get_aes_ctr = self.get_aes_ctr_pyaes - case s: - die(3, f'{s}: unrecognized AES backend') + if self.cfg.aes_backend not in self.aes_backends: + raise ValueError( + f'{self.cfg.aes_backend}: unrecognized AES backend (available: {fmt_list(self.aes_backends)})') + self.get_aes_ctr = getattr(self, f'get_aes_ctr_{self.cfg.aes_backend}') - @staticmethod - def get_aes_ctr_cryptography(key, iv): + def get_aes_ctr_cryptography(self, key, iv): from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend return Cipher(algorithms.AES(key), modes.CTR(iv), backend=default_backend()).encryptor() - @staticmethod - def get_aes_ctr_pyaes(key, iv): - import pyaes - class MyAES(pyaes.AESModeOfOperationCTR): - update = pyaes.AESModeOfOperationCTR.encrypt - @staticmethod - def finalize(): - return b'' - return MyAES(key, pyaes.Counter(int.from_bytes(iv))) - def encrypt_aes_ctr(self, key, iv, data): encryptor = self.get_aes_ctr(key, iv) return encryptor.update(data) + encryptor.finalize() diff --git a/test/overlay/fakemods/mmgen/crypto.py b/test/overlay/fakemods/mmgen/crypto.py index fd2694b4..52217b1d 100644 --- a/test/overlay/fakemods/mmgen/crypto.py +++ b/test/overlay/fakemods/mmgen/crypto.py @@ -1,6 +1,20 @@ import os as overlay_fake_os from .crypto_orig import * +class overlay_fake_Crypto: + + def get_aes_ctr_pyaes(self, key, iv): + import pyaes + class MyAES(pyaes.AESModeOfOperationCTR): + update = pyaes.AESModeOfOperationCTR.encrypt + @staticmethod + def finalize(): + return b'' + return MyAES(key, pyaes.Counter(int.from_bytes(iv))) + +Crypto.aes_backends = ('cryptography', 'pyaes') +Crypto.get_aes_ctr_pyaes = overlay_fake_Crypto.get_aes_ctr_pyaes + if overlay_fake_os.getenv('MMGEN_TEST_SUITE_DETERMINISTIC'): overlay_fake_get_random_orig = Crypto.get_random