"""
RSA2 SDK for networkValide.

Requires: pip install pycryptodome
Request data: base64(RSA_PUBLIC_ENCRYPT_PKCS1_v1_5(raw_data chunks))
Response msg: RSA_PUBLIC_DECRYPT_PKCS1_v1_5(base64 msg chunks)
Sign: md5(data + app_key)
"""

import base64
import hashlib
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA


def encrypt_data(raw_data: str, public_key_pem: str) -> str:
    key = RSA.import_key(public_key_pem)
    cipher = PKCS1_v1_5.new(key)
    chunk_size = key.size_in_bytes() - 11
    source = raw_data.encode("utf-8")
    encrypted = b"".join(cipher.encrypt(source[i:i + chunk_size]) for i in range(0, len(source), chunk_size))
    return base64.b64encode(encrypted).decode("ascii")


def decrypt_msg(msg: str, public_key_pem: str) -> str:
    key = RSA.import_key(public_key_pem)
    cipher = PKCS1_v1_5.new(key)
    raw = base64.b64decode(msg)
    chunk_size = key.size_in_bytes()
    sentinel = object()
    plain = b"".join(cipher.decrypt(raw[i:i + chunk_size], sentinel) for i in range(0, len(raw), chunk_size))
    return plain.decode("utf-8")


def make_sign(data: str, app_key: str) -> str:
    return hashlib.md5((data + app_key).encode("utf-8")).hexdigest()
