connect-src 'none').Two organizations establish the same AES-256 key by exchanging files over email, using ML-KEM-768 (NIST FIPS 203), a key encapsulation mechanism designed to resist quantum computers. No secret ever travels in the clear: the emailed artifacts are a public key, a ciphertext, and a short check value. All cryptography runs inside this browser tab; this page makes zero network requests.
EX1 or EX2), who initiates, and which mode to use.| Step | Who | What happens |
|---|---|---|
| 1 Generate | initiator | Creates the ML-KEM-768 key pair. The public key (1184 bytes) will be shared; the private key never leaves the machine. |
| 2 Share | initiator | Downloads the public key artifact and emails it as an attachment. Both sides confirm the key fingerprint on a call. |
| 3 Encapsulate | responder | Imports the public key, runs encapsulation, and obtains the AES-256 key plus a 1088-byte ciphertext. Shows the KCV. |
| 4 Return | responder | Downloads the ciphertext and KCV artifacts and emails them back. |
| 5 Decapsulate | initiator | Imports the ciphertext and recovers the AES-256 key with the private key. |
| 6 Verify | both | Key check values are compared. A green MATCH means both sides provably hold the same key; that is the PoC success criterion. |
| Mode | How the AES-256 key is obtained |
|---|---|
direct | The 32-byte ML-KEM shared secret is the key. Simplest; start here. |
kdf | The key is derived with HKDF-SHA-256 from the shared secret. Salt and info travel inside the artifact. |
wrap | The responder generates the key and wraps it with AES-KW under the shared secret. Use when the responder must choose the key. |
*_publickey.json (or .pem), *_ciphertext.json, *_kcv.json, *_confirmation.json.*_key.bin. This console keeps the private key in tab memory; the optional download exists only for your own continuity.The import zones accept our JSON envelope, standard PEM (-----BEGIN PUBLIC KEY-----),
raw DER, bare base64, and hex. If the counterparty uses different tooling (OpenSSL, Bouncy Castle,
an HSM), their public keys and ciphertexts still work; format friction is itself a documented
learning objective of this PoC.
docs/learnings-template.md in the repo).