Aegis stops being a bag of cryptographic primitives and becomes
a thing that can establish authenticated post-quantum sessions
between two parties who have never communicated before.
What shipped:
- MLKEM1024KEM — bare ML-KEM-1024 (FIPS 203 Cat-5) as a
standalone Tier 1 KEM, with 25 NIST KeyGen KATs.
- X25519 namespace + DHKeyPair envelope.
- IdentityKeyPair / IdentityPublicKey — long-term identity
as (ML-DSA-65 signing, X25519 DH).
- PrekeyBundle, SignedPrekey, SignedPQKEMPrekey,
OneTimePrekey, PrekeyBundleSecrets — Bob's
server-publishable record + the secrets he retains, with
per-role domain-separated signatures and JSON wire format.
- PQXDH.initiate / PQXDH.respond — the key-exchange itself.
HKDF combiner over four (or three) DH outputs + ML-KEM
shared secret; mirrors Signal's PQXDH derivation with
Aegis-specific labels.
- InitialMessage — Codable wire format Alice sends to Bob.
- SafetyNumber — Signal-format-compatible 12 × 5-digit
fingerprint over both identities, order-independent,
5200-iteration SHA-512.
Test status: 148 tests, 3 skipped (issue #1), 0 failures.
Sprint structure followed the Sprint-2 pattern (one commit per
deliverable, single tag at the end). Six commits stacked from
v0.0.4-sprint-3:
7d86845 expose MLKEM1024KEM
c699b1f X25519 + Identity
d1944c0 PrekeyBundle + signature chain
bd7a86d PQXDH handshake
17ce606 SafetyNumber
(this commit) docs closeout
Open follow-ups:
- #10 — optional libsignal byte-level interop test
(deferred from this sprint; alternative pinned-input
PQXDH KAT also outlined there)
- #9 — upstream CryptoKit MLKEM1024 trap (workaround
shipped in MLKEM1024.swift)
pre-council-approval (Maintainer @DemigodDSK, 2026-04-27)