From 3a11141b21de677a637f15335cc9bc9c09f28e0b Mon Sep 17 00:00:00 2001 From: SantaSpeen Date: Thu, 13 Mar 2025 13:48:07 +0300 Subject: [PATCH] [+] WinConnectCrypto --- winConnect/crypto/WinConnectCrypto.py | 48 +++++++++++++++++++++++++++ winConnect/crypto/__init__.py | 8 +++++ 2 files changed, 56 insertions(+) create mode 100644 winConnect/crypto/WinConnectCrypto.py create mode 100644 winConnect/crypto/__init__.py diff --git a/winConnect/crypto/WinConnectCrypto.py b/winConnect/crypto/WinConnectCrypto.py new file mode 100644 index 0000000..03a33f9 --- /dev/null +++ b/winConnect/crypto/WinConnectCrypto.py @@ -0,0 +1,48 @@ +import logging + +from .crypto_class_base import WinConnectCryptoBase +from winConnect.exceptions import ( + WinConnectCryptoBadModeException, + WinConnectCryptoException, +) + +def test_crypto_class(crypto_class: "WinConnectCryptoBase"): + if not isinstance(crypto_class, WinConnectCryptoBase): + raise WinConnectCryptoBadModeException("crypto_class must be a subclass of WinConnectCryptoBase") + if not crypto_class.test(): + raise WinConnectCryptoException("crypto_class failed test (test_bytes != decrypt_bytes)") + +class WinConnectCrypto: + + def __init__(self): + self.__crypto_class = None + self.__log_prefix = None + self._log = logging.getLogger("WinConnectCrypto") + + def set_crypto_class(self, crypto_class: "WinConnectCryptoBase"): + self._log.debug(f"{self.__log_prefix}Updating crypto class. {self.get_info()} -> {crypto_class.__class__.__name__}") + test_crypto_class(crypto_class) + self.__crypto_class = crypto_class + self.__log_prefix = f"[{self.get_info()}] " + self._log.debug(f"{self.__log_prefix}Crypto class updated.") + + def set_logger(self, logger): + logger.debug(f"{self.__log_prefix}Setting logger") + self._log = logger + + def test_and_load(self) -> bool: + self._log.debug(f"{self.__log_prefix}Testing and loading crypto class") + if not self.__crypto_class.test(): + return False + self.__crypto_class.load() + self._log.debug(f"{self.__log_prefix}Crypto class loaded") + return True + + def get_info(self): + return self.__crypto_class.__class__.__name__ + + def encrypt(self, data: bytes) -> bytes: + return self.__crypto_class.encrypt(data) + + def decrypt(self, data: bytes) -> bytes: + return self.__crypto_class.decrypt(data) diff --git a/winConnect/crypto/__init__.py b/winConnect/crypto/__init__.py new file mode 100644 index 0000000..079eca7 --- /dev/null +++ b/winConnect/crypto/__init__.py @@ -0,0 +1,8 @@ +from .WinConnectCrypto import WinConnectCrypto +from .crypto_classes import ( + WinConnectCryptoBase, + WinConnectCryptoNone, + WinConnectCryptoSimple, + # WinConnectCryptoPassword, + # WinConnectCryptoCert +)