""" Abertura do envelope que a API da VPS manda. Espelho do app/services/cripto.py de la, so que do lado que DECIFRA. Envelope hibrido: AES-256-GCM nos dados, RSA-OAEP na chave AES. O GCM autentica: se o corpo for adulterado no caminho, o decrypt levanta excecao em vez de devolver lixo. Ou seja, decifrou = veio integro. """ import base64 import json from cryptography.hazmat.primitives import hashes, serialization from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.ciphers.aead import AESGCM ALGORITMO = "RSA-OAEP-256+A256GCM" _OAEP = padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None, ) def carregar_chave_privada(pem: str, senha: bytes | None = None): return serialization.load_pem_private_key(pem.encode(), password=senha) def descriptografar(envelope: dict, chave_privada) -> dict: """ Abre o envelope e devolve o dict original. Levanta se o algoritmo nao for o esperado, se a chave nao for a par da publica usada la, ou se o conteudo tiver sido mexido. """ if envelope.get("alg") != ALGORITMO: raise ValueError(f"algoritmo inesperado: {envelope.get('alg')!r}") chave_aes = chave_privada.decrypt(base64.b64decode(envelope["chave"]), _OAEP) corpo = AESGCM(chave_aes).decrypt( base64.b64decode(envelope["nonce"]), base64.b64decode(envelope["dados"]), None, ) return json.loads(corpo)