High-Level Construction
ML-KEM is built from an IND-CPA-secure PKE (Public Key Encryption) scheme,
transformed into an IND-CCA2-secure KEM via the Fujisaki-Okamoto (FO) transform.
[KeyGen]
A ← random matrix over Z_q[X]/(X^n+1) ← public, from seed
s, e ← small random polynomials (error)
t = A·s + e ← public key component
pk = (A_seed, t), sk = s
[Encaps(pk)]
r, e1, e2 ← fresh small random polynomials
u = Aᵀ·r + e1
v = tᵀ·r + e2 + encode(message)
ciphertext = (u, v)
shared_secret = H(message, pk_hash)
[Decaps(sk, ciphertext)]
recover message = decode(v - sᵀ·u)
re-encapsulate and check
shared_secret = H(message, pk_hash)