SDAA498 September 2026 AM62L
# OpenSSL native (through EVP provider dispatch)
openssl speed -seconds 3 -kem-algorithms ML-KEM-512 ML-KEM-768 ML-KEM-1024 X25519MLKEM768
# liboqs direct (bypasses OpenSSL EVP)
oqs_speed_kem -d 3 ML-KEM-512
oqs_speed_kem -d 3 ML-KEM-768
oqs_speed_kem -d 3 ML-KEM-1024
# wolfSSL native (--enable-armasm build)
wolfcryptbenchmark -ml-kem-512 -ml-kem-768 -ml-kem-1024| Algorithm | OpenSSL native keygen/s | liboqs (NEON) keygen/s | wolfSSL keygen/s (+armasm) | OpenSSL encaps/s | liboqs encaps/s | wolfSSL encaps/s (+armasm) | OpenSSL decaps/s | liboqs decaps/s | wolfSSL decaps/s (+armasm) |
|---|---|---|---|---|---|---|---|---|---|
| ML-KEM-512 | 4,906 | 12,829 | 18,897 | 5,743 | 11,026 | 18,355 | 3,783 | 10,007 | 12,876 |
| ML-KEM-768 | 3,130 | 7,886 | 11,881 | 3,963 | 7,299 | 11,727 | 2,668 | 6,482 | 8,521 |
| ML-KEM-1024 | 2,145 | 5,394 | 7,820 | 2,882 | 4,963 | 6,423 | 1,994 | 4,405 | 5,572 |
With --enable-armasm, wolfSSL enables aarch64 assembly for all crypto primitives — including SHAKE/Keccak (sha3_asm.S). ML-KEM performance is dominated by SHAKE-128/256 (Keccak), so the NEON Keccak assembly gives wolfSSL a 60–100% improvement over its pure-C baseline and surpasses liboqs by +47% keygen and +67% encaps on ML-KEM-512.
The liboqs NEON NTT path optimises the polynomial arithmetic, but wolfSSL's NEON Keccak speed advantage more than compensates. Without --enable-armasm, wolfSSL ML-KEM runs pure-C Keccak and trails liboqs. See Section 3.5 for the before and after comparison.