"""! @brief Defines the encryption class."""
##
# @file Vermasseln.py
#
# @brief Defines the Vermasseln class.
#
# @section description_vermasseln Description
# Defines the base class for the program encryption mechansim.
# - Vermasseln (base class)
#
# @section libraries_configloader Libraries/Modules
# - platform Python standard library
# - Access to underlying platform’s identifying data.
# - base64 Python standard library
# - Provides functions for encoding binary data to printable ASCII characters and decoding such encodings back to binary data.
# - random Python module
# - Implements pseudo-random number generators for various distributions.
# - string Python standard library
# - Common string operations.
# - Crypto Python package
# - Provides cryptographic functionalities.
#
# @section notes_vermasseln Notes
# - None.
#
# @section todo_vermasseln TODO
# - None.
#
# @section author_vermasseln Author(s)
# - Created by Linuxero on 03/14/2025.
# - Modified by Linuxero on 03/14/2025.
#
# Copyright (c) 2025 Schnaxero. All rights reserved.
from Crypto.Cipher import AES
from base64 import b64encode, b64decode
import platform
import bcrypt
from Crypto.Hash import SHA256, SHA3_512
# from Crypto.Protocol.KDF import PBKDF2
# from Crypto.Random import get_random_bytes
import random
import string
class Vermasseln:
"""! The Vermasseln class.
Defines the class utilized by different parts of the program.
Handles the encryption/decryption of the whole program.
"""
def oscarVermasseln(self, data, local= True):
"""! Encrypts data.
@param data The data to encrypt.
@param local Is the encryption local to the host or not?
@return encrypted data.
"""
b_data = data.encode("utf-8")
cipher = self.__vermasslungsKobold(local)
ciphertext, tag = cipher.encrypt_and_digest(b_data)
decoded_data = [b64encode(x).decode("utf-8") for x in (ciphertext, tag)]
storable_data = ".".join(decoded_data)
return storable_data
def entschluesseln(self, data, local = True):
"""! Decrypts data.
@param data The data to decrypt.
@param local Is the encryption local to the host or not?
@return decrypted data on success, None on failure.
"""
try:
data_list = data.split(".")
encoded_data = [b64decode(x) for x in data_list]
cipher = self.__vermasslungsKobold(local)
decrypted_data = cipher.decrypt_and_verify(encoded_data[0], encoded_data[1])
decrypted_data = decrypted_data.decode("utf-8")
except (ValueError, IndexError) as e:
print(f"Configuration corrupted: {str(e)}")
decrypted_data = None
except Exception as e:
print(str(e))
decrypted_data = None
return decrypted_data
def __vermasslungsKobold(self, local = True):
"""! Prepares the encryption key.
@param local Is the encryption local to the host or not?
@return encryption key.
"""
key = platform.processor().encode("utf-8") if local else b"(==daniishtverhaftetwegensexy#)"
key = key[0:31]
hash_key = SHA256.new(key)
hashed = hash_key.digest()
nonce = platform.machine().encode("utf-8") if local else b"(==Uskarishtverhaftetwegensexy#)"
cipher = AES.new(hashed, AES.MODE_SIV, nonce = nonce)
return cipher
@classmethod
def userPasswordHash(self, password, salt = None):
"""! Hashes data.
@param password The data to hash.
@param salt The salt to use if available.
@return hashed data.
"""
if not salt:
salt = "".join(random.choice(string.ascii_letters + string.digits) for i in range (32))
hash_pw = (salt + password).encode("utf-8")
h_obj = SHA3_512.new(hash_pw)
password = salt + "$" + h_obj.hexdigest()
return password