
Optimierte HQC-Post-Quanten-KEM-Implementierungen für AVX2 und AVX-512 mit GFNI, plus eine einheitliche Benchmarking- und NIST-KAT-Suite für x86-IoT-Gateways.
Dieses Repository enthält die optimierten HQC-Implementierungen und den Benchmarking-Code, der das Paper "Accelerating HQC for Post-Quantum TLS 1.3 on x86 IoT Gateways" begleitet. Es ist ein Fork des offiziellen HQC-Repositorys, erweitert um AVX-512- + GFNI-Implementierungen und eine einheitliche Mess-Suite, die jede verglichene Implementierung aus derselben Codebasis, denselben Compiler-Flags und demselben Benchmark-Protokoll baut.
Alle Implementierungen bestehen die NIST Known-Answer-Tests (KAT) für HQC-1, HQC-3 und HQC-5 und behalten den eingabeunabhängigen Kontrollfluss und das Speicherzugriffsmuster der Referenzimplementierung bei.
Jede Variante unter src/x86_64/ wird zur Konfigurationszeit mit -DHQC_X86_IMPL=<variant> ausgewählt und baut in ihre eigene Bibliothek und Test-Binaries.
| Variante | Paper-Bezeichnung | ISA | Beschreibung |
|---|---|---|---|
avx256 | HQC-Referenz | AVX2 | offizielle optimierte Implementierung (Baseline) |
avx256_TC_Jang | Jang et al. | AVX2 | GFmulOpt Toom-Cook/Karatsuba-Multiplikation |
avx256_TC_GFNI | Unsere (AVX2) | AVX2+GFNI | unsere GFNI Reed-Solomon / Reed-Muller-Decoder auf dem AVX2-Build |
avx256_FAFFT_GFNI_chen | Chen et al. | AVX2+GFNI | FAFFT-Multiplikation, ursprünglicher nicht-gecachter Ablauf |
avx256_FAFFT_GFNI_chen_x2 | Chen et al. (Dagger) | AVX2+GFNI | FAFFT mit dem ring_mul_x2-Ablauf mit geteiltem Operanden |
avx256_FAFFT_GFNI_ours | Unsere FAFFT (AVX2) | AVX2+GFNI | FAFFT + Zero-Tail-Basiskonvertierung + unsere Decoder |
avx512_Robert | Robert–Véron | AVX-512 | Robert–Véron AVX-512 Polynommultiplikation |
avx512_Cabral | Cabral et al. | AVX-512+GFNI | Quellcode von Cabral et al. (enthält deren Upstream-HQC-3-hash_j-Fix vom 2026-07-21) |
avx512_TC_GFNI | Unsere TC/Karat (AVX-512) | AVX-512+GFNI | AVX-512 Toom-Cook/Karatsuba, GFNI-Decoder, AVX-512 Keccak |
avx512_FAFFT_GFNI | Unsere FAFFT (AVX-512) | AVX-512+GFNI | AVX-512-Portierung von Chen et al.s AVX2-Implementierung |
Die beiden Ours-Builds jeder ISA unterscheiden sich nur im Polynommultiplikator, sodass ihr End-to-End-Vergleich die Wahl des Multiplikators isoliert.
Voraussetzungen: GCC >= 12, CMake >= 3.21, eine x86-64-CPU. Die AVX-512-Varianten erfordern AVX-512F/BW/DQ/VL/VBMI/VBMI2/IFMA/BITALG/VPOPCNTDQ, VPCLMULQDQ und GFNI (Ice Lake / Tiger Lake / Rocket Lake / Zen 4 oder neuer).
# eine 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
# oder alle Varianten auf einmal (erstellt build-<variant>/-Verzeichnisse)
./build_all.sh
# vom Repository-Wurzelverzeichnis aus, nach dem Build
bash scripts/run_kat.sh # alle Varianten
bash scripts/run_kat.sh avx512_TC_GFNI # eine Variante
Hinweis: test_kat_hqc_* gibt bei Erfolg nichts aus und bei einer Abweichung Zeilen, die bad enthalten; das Skript durchsucht die Ausgabe entsprechend mit grep.
Das Protokoll des Papers: Turbo Boost und SMT deaktiviert, der Prozess an einen physischen Kern gebunden, und jeder berichtete Wert ist der Median aus 1.000 Stichproben von 100 Iterationen nach 10.000 Aufwärm-Iterationen. Die Skripte binden mit taskset an Kern 0.
bash scripts/measure_build.sh <variant> [...] # End-to-End-KEM-Benchmark der angegebenen Varianten
Rohprotokolle werden in benchmark_results/raw/ geschrieben; der Benchmark-Bericht enthält Min/Median/Mittelwert, und der Median ist der im Paper zitierte Wert.
src/common/ parameter-set unabhängiger HQC-Code (KEM-Schicht, Codierung)
src/ref/ Referenzimplementierung
src/x86_64/common/ gemeinsam genutzter Code der AVX2-Ära
src/x86_64/<variant> ein Verzeichnis pro verglichener Implementierung (siehe Tabelle)
lib/fips202/ Keccak (skalares PQClean + optionale XKCP AVX-512-Permutation)
tests/ KAT-, API-, Unit-Tests, Benchmarks
kats/ Known-Answer-Dateien, die von den KAT-Tests verwendet werden
scripts/ KAT- und Mess-Hilfsskripte
Das Basis-Repository und unsere Ergänzungen sind gemeinfrei (siehe LICENSE). Dieses Repository bündelt zusätzlich Drittanbieter-Implementierungen zu Messzwecken; siehe THIRD_PARTY_NOTICES.md für deren Publikationen, Herkunft und Lizenzen.