
Implémentations optimisées du KEM post-quantique HQC pour AVX2 et AVX-512 avec GFNI, ainsi qu'une suite unifiée de benchmarking et de NIST KAT pour les passerelles IoT x86.
Ce dépôt contient les implémentations HQC optimisées et le code de benchmarking accompagnant l'article « Accelerating HQC for Post-Quantum TLS 1.3 on x86 IoT Gateways ». Il s'agit d'un fork du dépôt HQC officiel, étendu avec des implémentations AVX-512 + GFNI et une suite de mesure unifiée qui compile chaque implémentation comparée à partir de la même base de code, des mêmes options de compilation et du même protocole de benchmark.
Toutes les implémentations passent les tests à réponse connue (KAT) du NIST pour HQC-1, HQC-3 et HQC-5, et conservent le flux de contrôle et le motif d'accès mémoire indépendants des entrées de l'implémentation de référence.
Chaque variante sous src/x86_64/ est sélectionnée au moment de la configuration avec
-DHQC_X86_IMPL=<variant> et est compilée dans sa propre bibliothèque et ses propres binaires de test.
| Variante | Libellé de l'article | ISA | Description |
|---|---|---|---|
avx256 | HQC reference | AVX2 | implémentation optimisée officielle (référence) |
avx256_TC_Jang | Jang et al. | AVX2 | multiplication Toom-Cook/Karatsuba GFmulOpt |
avx256_TC_GFNI | Ours (AVX2) | AVX2+GFNI | nos décodeurs Reed-Solomon / Reed-Muller GFNI sur la compilation AVX2 |
avx256_FAFFT_GFNI_chen | Chen et al. | AVX2+GFNI | multiplication FAFFT, flux original non mis en cache |
avx256_FAFFT_GFNI_chen_x2 | Chen et al. (dagger) | AVX2+GFNI | FAFFT avec le flux ring_mul_x2 à opérandes partagés |
avx256_FAFFT_GFNI_ours | Ours FAFFT (AVX2) | AVX2+GFNI | FAFFT + conversion de base à queue nulle + nos décodeurs |
avx512_Robert | Robert–Véron | AVX-512 | multiplication polynomiale AVX-512 de Robert–Véron |
avx512_Cabral | Cabral et al. | AVX-512+GFNI | code source de Cabral et al. (inclut leur correctif amont hash_j de HQC-3 du 2026-07-21) |
avx512_TC_GFNI | Ours TC/Karat (AVX-512) | AVX-512+GFNI | Toom-Cook/Karatsuba AVX-512, décodeurs GFNI, Keccak AVX-512 |
avx512_FAFFT_GFNI | Ours FAFFT (AVX-512) | AVX-512+GFNI | portage AVX-512 de l'implémentation AVX2 de Chen et al. |
Les deux compilations Ours de chaque ISA ne diffèrent que par le multiplicateur polynomial, de sorte que
leur comparaison de bout en bout isole le choix du multiplicateur.
Prérequis : GCC >= 12, CMake >= 3.21, un CPU x86-64. Les variantes AVX-512 nécessitent AVX-512F/BW/DQ/VL/VBMI/VBMI2/IFMA/BITALG/VPOPCNTDQ, VPCLMULQDQ et GFNI (Ice Lake / Tiger Lake / Rocket Lake / Zen 4 ou plus récent).
# une variante
mkdir build-avx512_TC_GFNI && cd build-avx512_TC_GFNI
cmake -DHQC_ARCH=x86_64 -DHQC_X86_IMPL=avx512_TC_GFNI ..
cmake --build . -j
# ou toutes les variantes en une fois (crée les répertoires build-<variant>/)
./build_all.sh
# depuis la racine du dépôt, après compilation
bash scripts/run_kat.sh # toutes les variantes
bash scripts/run_kat.sh avx512_TC_GFNI # une variante
Remarque : test_kat_hqc_* n'affiche rien en cas de succès et des lignes contenant bad
en cas d'échec ; le script filtre la sortie en conséquence.
Protocole de l'article : Turbo Boost et SMT désactivés, le processus épinglé à un
cœur physique, et chaque valeur rapportée est la médiane de 1 000 échantillons de 100
itérations après 10 000 itérations de préchauffage. Les scripts épinglent au cœur 0 avec
taskset.
bash scripts/measure_build.sh <variant> [...] # benchmark KEM de bout en bout des variantes données
Les journaux bruts sont écrits dans benchmark_results/raw/ ; le benchmark rapporte
min/médiane/moyenne, et la médiane est la valeur citée dans l'article.
src/common/ code HQC indépendant du jeu de paramètres (couche KEM, codage)
src/ref/ implémentation de référence
src/x86_64/common/ code partagé de l'ère AVX2
src/x86_64/<variant> un répertoire par implémentation comparée (voir tableau)
lib/fips202/ Keccak (PQClean scalaire + permutation XKCP AVX-512 optionnelle)
tests/ KAT, API, tests unitaires, benchmarks
kats/ fichiers à réponse connue utilisés par les tests KAT
scripts/ scripts utilitaires KAT et de mesure
Le dépôt de base et nos ajouts sont placés dans le domaine public
(voir LICENSE). Ce dépôt intègre en outre des
implémentations tierces à des fins de mesure ; voir
THIRD_PARTY_NOTICES.md pour leurs publications,
origines et licences.