Ir al contenido

MlKem

MlKem expone las operaciones ML-KEM crudas (FIPS 203) para usuarios avanzados que construyen protocolos custom. Si solo necesita cifrar y descifrar datos, use AegisCipher en su lugar.

class MlKem:
def __init__(self, level: SecurityLevel = SecurityLevel.ML_KEM_768) -> None
def generate_keypair(self) -> KeyPair
def encapsulate(self, public_key: bytes) -> tuple[bytes, bytes]
def decapsulate(self, capsule: bytes, secret_key: bytes) -> bytes
def load_public_key_b64(self, b64: str, level: SecurityLevel | None = None) -> bytes
MlKem(level: SecurityLevel = SecurityLevel.ML_KEM_768)

Crea una nueva instancia de ML-KEM con el nivel de seguridad especificado.

ParámetroTipoDefaultDescripción
levelSecurityLevelML_KEM_768El nivel de seguridad ML-KEM a usar

Genera un nuevo keypair ML-KEM para el nivel de seguridad configurado.

Retorna: KeyPair — Un objeto con los atributos public_key (bytes) y secret_key (bytes).

Realiza la encapsulación ML-KEM: genera una capsule y un shared secret de 32 bytes usando la clave pública del receptor.

ParámetroTipoDescripción
public_keybytesLa clave pública ML-KEM del receptor

Retorna: tuple[bytes, bytes] — Una tupla (capsule, shared_secret):

  • capsule — La clave encapsulada (enviala al dueño de la clave)
  • shared_secret — 32 bytes para usar como clave simétrica

Lanza:

  • InvalidParameterError — Si el tamaño de la clave pública no coincide con el nivel de seguridad
  • RngError — Si el CSPRNG del OS no está disponible

Realiza la desencapsulación ML-KEM: recupera el shared secret de 32 bytes desde una capsule usando la clave secreta.

ParámetroTipoDescripción
capsulebytesLa capsule proveniente de encapsulate()
secret_keybytesLa clave secreta ML-KEM del receptor

Retorna: bytes — El shared secret de 32 bytes

def load_public_key_b64(self, b64: str, level: SecurityLevel | None = None) -> bytes

Carga una clave pública desde su representación Base64 URL-safe.

ParámetroTipoDefaultDescripción
b64str—String Base64 URL-safe con o sin padding =.
levelSecurityLevel | NoneNoneNivel de seguridad ML-KEM esperado. Si es None, usa el nivel configurado en esta instancia de MlKem.

Retorna: bytes — Los bytes de la clave pública decodificada.

Lanza:

  • AegisQError — Si el string no es Base64 válido.
  • InvalidParameterError — Si el tamaño decodificado no corresponde al nivel indicado.

Ejemplo:

>>> kem = MlKem()
>>> keypair = kem.generate_keypair()
>>> b64 = keypair.public_key_b64()
>>> recovered = kem.load_public_key_b64(b64)
>>> recovered == keypair.public_key
True
from aegisq import MlKem, SecurityLevel
kem = MlKem(level=SecurityLevel.ML_KEM_768)
keypair = kem.generate_keypair()
# Encapsular: produce una capsule + shared secret de 32 bytes
capsule, shared_secret = kem.encapsulate(keypair.public_key)
# capsule → 1088 bytes — enviar al dueño de la clave
# shared_secret → 32 bytes — usar como clave simétrica
# Desencapsular: recupera el mismo shared secret de 32 bytes
recovered = kem.decapsulate(capsule, keypair.secret_key)
import hmac
assert hmac.compare_digest(shared_secret, recovered)