Key Encapsulation Mechanism (KEM)
A KEM is not a key exchange — it's one-way encapsulation:
[KeyGen] recipient: (pk, sk) ← ML-KEM.KeyGen()
[Encaps] sender: (ciphertext, shared_secret) ← ML-KEM.Encaps(pk)
sender transmits: ciphertext
[Decaps] recipient: shared_secret ← ML-KEM.Decaps(sk, ciphertext)
Both sender and recipient now have the same shared_secret.
Unlike ECDH, only the recipient needs to do computation. The sender's work is cheap.
In TLS: the client encapsulates to the server's KEM public key.
The server decapsulates to get the shared secret. Both derive traffic keys from it.