Files
pyqcrm/lib/Vermasseln.py

121 lines
4.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""! @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
# - <a href="https://docs.python.org/3/library/platform.html">platform</a> Python standard library
# - Access to underlying platforms identifying data.
# - <a href="https://docs.python.org/3/library/base64.html">base64</a> Python standard library
# - Provides functions for encoding binary data to printable ASCII characters and decoding such encodings back to binary data.
# - <a href="https://docs.python.org/3/library/random.html">random</a> Python module
# - Implements pseudo-random number generators for various distributions.
# - <a href="https://docs.python.org/3/library/string.html">string</a> Python standard library
# - Common string operations.
# - <a href="https://pycryptodome.readthedocs.io/en/latest/src/api.html">Crypto</a> 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