The failure mode of a teaching animation is showing a plausible number that
is wrong. So each page's implementation is checked in two independent ways before it ships.
| Page | Core implemented from scratch | Independent check | Vectors |
| SHA-256 | Padding, schedule, 64 rounds, feed-forward | WebCrypto crypto.subtle | 51 (empty, "abc", 55/56, 63/64, 119/120, 1000 B, random binary, non-ASCII) |
| AES | S-box from GF(2⁸) inversion + affine map, ShiftRows, MixColumns, key schedule | Node aes-128/192/256-ecb; in-page WebCrypto AES-CBC with a zero IV (browsers expose no raw ECB) | FIPS 197 C.1/C.2/C.3 + Appendix B, then 90 random key/plaintext pairs across all three key sizes |
| RC4 | KSA and PRGA, keystream and XOR | RFC 6229 §2 published keystreams, plus a separately written RC4 that must also reproduce them | 19 vectors including offsets 16/240/256 (the first 512 bytes of the stream), then 200 random key/message round trips |
| Diffie–Hellman | Square-and-multiply modular exponentiation on BigInt | Python's built-in pow() — an independent big-integer implementation | 28 groups: teaching primes, a 64-bit safe prime, a smooth-order prime, the RFC 7919 ffdhe2048 group, plus 25 random groups |
| RSA | Key generation, extended Euclid (Bézout table), square-and-multiply, CRT, integer roots, a from-scratch SHA-256 | Python's pow() and hashlib.sha256 | n, φ(n), λ(n), e·d ≡ 1 (mod φ and mod λ), c, m, the signature, and the digest re-derived from the message bytes |
| TLS 1.3 | The RFC 8446 key schedule and record layer, and X25519 written out from RFC 7748's ladder | RFC 8448 §3 — the IETF's own worked handshake trace, extracted from the RFC text by a script rather than transcribed | 31 published values: every secret, traffic key, IV, Finished MAC and transcript hash, plus the SHA-256 of three encrypted records |
| TLS 1.2 | The RFC 5246 §5 PRF, the master-secret and key-expansion schedule, RSA key transport, CBC with MAC-then-encrypt, and a real padding oracle | An independent Python implementation of the RFC's P_hash, plus the oracle's own output | The PRF output, master secret and key_block recomputed byte for byte; the oracle must return the plaintext it was given, on fresh random inputs and a two-block record |
| WPA2 | PBKDF2 PMK, the 802.11i PRF-512, the KCK/KEK/TK split, four EAPOL frames and their MICs | Python's pbkdf2_hmac and an independent implementation of the PRF and the EAPOL MIC | Three published IEEE vectors for the PMK, the PTK, and every MIC — each recomputed from the definitions in Python |
| WPA3 / SAE | Hunting-and-pecking to a curve point, the commit/exchange/confirm exchange on P-256 | WebCrypto's own ECDH — the point arithmetic must agree with it — plus explicit negative cases | The password element on the curve, both sides agreeing on the shared secret and the confirm, and a wrong password failing to authenticate |