Composed protocol tracks

Measured inside the handshake, not beside it.

Cycle counts on a primitive don’t tell you what a connection costs. These are full TLS and SSH key exchanges — decomposed phase by phase, sized to the byte, and cross-checked against the liboqs speed tools and eBACS reference cycles so they can be verified against the canonical numbers. Measured on x86 and ARM so the figures travel.

Run date
2026-08-22
Commit
Host
Xeon Platinum 8259CL @ 2.50GHz
liboqs
0.15.0
Architectures
aarch64 · x86_64
OpenSSL
3.0.13
Every track

Hybrid and pure post-quantum against the classical baseline.

Expand any suite for its phase decomposition. The wire column is fixed by the protocol; the timing columns move with host load — read them as a distribution, and read the tail column as how far it strays.

MLKEM768vs X2551983.3 µs82.1 µs89.0 µs95.0 µs2.77×11,9982,272 B47.5%
X25519classical baseline157.6 µs156.4 µs165.2 µs175.3 µs1.43×6,34564 Bbaseline
SecP256r1MLKEM768vs X25519235.4 µs233.1 µs243.9 µs250.5 µs2.08×4,2482,402 B+49.0%
X25519MLKEM768vs X25519240.5 µs238.4 µs249.8 µs255.9 µs1.81×4,1572,336 B+52.4%
How the handshake figure is builtThe handshake mean is composed, not timed end to end: each phase is measured in its own thousand-iteration loop and the handshake figure is their sum, with the classical keygen and derive counted twice because both parties perform them. That identity holds across every committed suite to within 0.002%, and the smoke test fails the build if it stops holding. It is why the phase bars add to exactly 100% — they are the measurement, not an attribution over it.
What these benchmarks do not measureThese are composed handshakes sized on the wire. They are not packet captures: packets per handshake, initial congestion window effects, connections per core under real concurrency, and per-connection memory are not measured here and are not inferable from this data. Where those numbers matter to a capacity decision, they need their own instrument — naming the gap is more useful than estimating across it.
Take the data

Every figure traces to a run.

Clone the harness and you should reproduce these within run-to-run variance.