import requests
import base64
import hashlib

from Cryptodome.Cipher import AES
from Cryptodome.Util.Padding import pad

from constants import SMC_LICENSE_KEY, NDR_LICENSE_KEY

USER_NAME = "root"
USER_ROLE = "admin"
FRONT_IP = "192.168.0.1"

# Функция считывания общего ключа
def shared_key_reader():
    # Считываем общий секрет
    with open("secretShared.bin", "rb") as shared_file:
        # Считываем содержимое файла и преобразуем его в шестнадцатиричное представление с помощью
        # функции hex()
        shared_secret = shared_file.read().hex()

        return shared_secret

SHARED_KEY = shared_key_reader()
# Константы для запроса

# Authorization-key
# Данные, которе требуется зашифровать
# data = (SMC_LICENSE_KEY + NDR_LICENSE_KEY).encode("utf-8")

# POSTMAN
pre_data = base64.b64encode((SMC_LICENSE_KEY + NDR_LICENSE_KEY).encode('utf-8'))

# Преобразуем SHARED_KEY в байтовую строку с использованием кодировки UTF-8
key = SHARED_KEY

# Создаем инвертированный закодированный ключ
encoded_reversed_key = key[::-1].encode("utf-8")

# Вычисление вектора инициализации следующим образом:
# Берется hash-сумма MD5 от инвертированного общего ключа
# C помощью функции hexdigest() получаем строкове представление хэш суммы в виде 16ричных чисел
# Обрезаем полученое строковое представление до 16 символов
# Кодируем получившуюся строку в UTF-8
iv = hashlib.md5(encoded_reversed_key).hexdigest()[:16].encode('utf-8')

# Вычисляем хэш-сумму MD5 и представляем ее в 16ричном виде, а затем кодируем в UTF-8
key_hash = hashlib.md5(key.encode('utf-8')).hexdigest()

# Создаем объект cipher от класса AES с использованием ключа key, режима AES.MODE_CBS 
# (Cipher Block Chaining) и вектора инициализации iv
cipher = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)

# Получаем шифр путем:
# С помощью функции pad() данные data дополняются до размера блока AES и шифруются объектом cipher
encrypted = cipher.encrypt(pad(pre_data, AES.block_size))

# Полученное преобразуем в base64
encrypted_base64_authorization_key = base64.b64encode(encrypted).decode('utf-8')
authorization_key_header_data = "x-ndr-key " + encrypted_base64_authorization_key

# Authorization user
user_data = base64.b64encode(USER_NAME.encode('utf-8'))
cipher_user = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
encrypted_user = cipher_user.encrypt(pad(user_data, AES.block_size))
encrypted_base64_authorization_user = base64.b64encode(encrypted_user).decode('utf-8')

authorization_user_header_data = "x-ndr-user " + encrypted_base64_authorization_user


# Authorization role
user_role_data = base64.b64encode(USER_ROLE.encode('utf-8'))
cipher_role = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
encrypted_user_role = cipher_role.encrypt(pad(user_role_data, AES.block_size))
encrypted_base64_authorization_role = base64.b64encode(encrypted_user_role).decode('utf-8')

authorization_role_header_data = "x-ndr-role " + encrypted_base64_authorization_role

# Authorization ip
ip_data = base64.b64encode(FRONT_IP.encode('utf-8'))
cipher_ip = AES.new(key_hash.encode('utf-8'), AES.MODE_CBC, iv)
encrypted_ip = cipher_ip.encrypt(pad(ip_data, AES.block_size))
encrypted_base64_authorization_ip = base64.b64encode(encrypted_ip).decode('utf-8')

authorization_ip_header_data = "x-ndr-ip " + encrypted_base64_authorization_ip

# print("\n\n\n")
# print("key = " + encrypted_base64_authorization_key)
# print("user = " + encrypted_base64_authorization_user)
# print("role = " + encrypted_base64_authorization_role)
# print("ip = " + encrypted_base64_authorization_ip)
# print("\n\n\n")

# Запрос
request_url = "https://192.168.56.10:8000/api/v1/auth/session/login"
headers = {
    "Authorization-key": authorization_key_header_data,
    "Authorization-user": authorization_user_header_data,
    "Authorization-role": authorization_role_header_data,
    "Authorization-ip": authorization_ip_header_data,
}

response = requests.post(request_url, headers=headers, verify=False)