
Implementaciones optimizadas de HQC post-quantum KEM para AVX2 y AVX-512 con GFNI, además de una suite unificada de benchmarking y NIST KAT para gateways IoT x86.
Este repositorio contiene las implementaciones optimizadas de HQC y el código de benchmarking que acompañan al artículo "Accelerating HQC for Post-Quantum TLS 1.3 on x86 IoT Gateways". Es un fork del repositorio oficial de HQC, ampliado con implementaciones AVX-512 + GFNI y una suite de medición unificada que compila todas las implementaciones comparadas a partir de la misma base de código, los mismos flags del compilador y el mismo protocolo de benchmark.
Todas las implementaciones superan las pruebas de respuesta conocida (KAT) de NIST para HQC-1, HQC-3 y HQC-5, y mantienen el flujo de control y el patrón de acceso a memoria independientes de la entrada de la implementación de referencia.
Cada variante bajo src/x86_64/ se selecciona en tiempo de configuración con
-DHQC_X86_IMPL=<variant> y se compila en su propia biblioteca y binarios de prueba.
| Variante | Etiqueta del artículo | ISA | Descripción |
|---|---|---|---|
avx256 | HQC reference | AVX2 | implementación optimizada oficial (línea base) |
avx256_TC_Jang | Jang et al. | AVX2 | multiplicación Toom-Cook/Karatsuba GFmulOpt |
avx256_TC_GFNI | Ours (AVX2) | AVX2+GFNI | nuestros decodificadores GFNI Reed-Solomon / Reed-Muller sobre la compilación AVX2 |
avx256_FAFFT_GFNI_chen | Chen et al. | AVX2+GFNI | multiplicación FAFFT, flujo original sin caché |
avx256_FAFFT_GFNI_chen_x2 | Chen et al. (dagger) | AVX2+GFNI | FAFFT con el flujo ring_mul_x2 de operandos compartidos |
avx256_FAFFT_GFNI_ours | Ours FAFFT (AVX2) | AVX2+GFNI | FAFFT + conversión de base zero-tail + nuestros decodificadores |
avx512_Robert | Robert–Véron | AVX-512 | multiplicación de polinomios AVX-512 de Robert–Véron |
avx512_Cabral | Cabral et al. | AVX-512+GFNI | código fuente de Cabral et al. (incluye su corrección upstream de hash_j de HQC-3 del 2026-07-21) |
avx512_TC_GFNI | Ours TC/Karat (AVX-512) | AVX-512+GFNI | Toom-Cook/Karatsuba AVX-512, decodificadores GFNI, Keccak AVX-512 |
avx512_FAFFT_GFNI | Ours FAFFT (AVX-512) | AVX-512+GFNI | port a AVX-512 de la implementación AVX2 de Chen et al. |
Las dos compilaciones Ours de cada ISA difieren únicamente en el multiplicador de polinomios, por lo que
su comparación de extremo a extremo aísla la elección del multiplicador.
Requisitos: GCC >= 12, CMake >= 3.21, una CPU x86-64. Las variantes AVX-512 requieren AVX-512F/BW/DQ/VL/VBMI/VBMI2/IFMA/BITALG/VPOPCNTDQ, VPCLMULQDQ y GFNI (Ice Lake / Tiger Lake / Rocket Lake / Zen 4 o posterior).
# one variant
mkdir build-avx512_TC_GFNI && cd build-avx512_TC_GFNI
cmake -DHQC_ARCH=x86_64 -DHQC_X86_IMPL=avx512_TC_GFNI ..
cmake --build . -j
# or every variant at once (creates build-<variant>/ directories)
./build_all.sh
# from the repository root, after building
bash scripts/run_kat.sh # all variants
bash scripts/run_kat.sh avx512_TC_GFNI # one variant
Nota: test_kat_hqc_* no imprime nada en caso de éxito e imprime líneas que contienen bad
en caso de discrepancia; el script filtra la salida en consecuencia.
El protocolo del artículo: Turbo Boost y SMT desactivados, el proceso fijado a un
núcleo físico, y cada valor reportado es la mediana de 1.000 muestras de 100
iteraciones tras 10.000 iteraciones de calentamiento. Los scripts fijan el proceso al núcleo 0 con
taskset.
bash scripts/measure_build.sh <variant> [...] # end-to-end KEM benchmark of the given variants
Los registros sin procesar se escriben en benchmark_results/raw/; el benchmark reporta
mínimo/mediana/media, y la mediana es el valor citado en el artículo.
src/common/ parameter-set independent HQC code (KEM layer, coding)
src/ref/ reference implementation
src/x86_64/common/ AVX2-era shared code
src/x86_64/<variant> one directory per compared implementation (see table)
lib/fips202/ Keccak (scalar PQClean + optional XKCP AVX-512 permutation)
tests/ KAT, API, unit tests, benchmarks
kats/ known-answer files used by the KAT tests
scripts/ KAT and measurement helper scripts
El repositorio base y nuestras adiciones se publican en el dominio público
(véase LICENSE). Este repositorio además incluye implementaciones de terceros
con fines de medición; véase
THIRD_PARTY_NOTICES.md para sus publicaciones,
orígenes y licencias.