
Implementazioni ottimizzate di HQC post-quantum KEM per AVX2 e AVX-512 con GFNI, più una suite unificata di benchmarking e NIST KAT per gateway IoT x86.
Questo repository contiene le implementazioni HQC ottimizzate e il codice di benchmarking che accompagnano l'articolo "Accelerating HQC for Post-Quantum TLS 1.3 on x86 IoT Gateways". È un fork del repository ufficiale HQC, esteso con implementazioni AVX-512 + GFNI e una suite di misurazione unificata che compila ogni implementazione confrontata dalla stessa base di codice, dagli stessi flag del compilatore e dallo stesso protocollo di benchmark.
Tutte le implementazioni superano i NIST known-answer test (KAT) per HQC-1, HQC-3, e HQC-5, e mantengono il flusso di controllo e il pattern di accesso alla memoria indipendenti dall'input dell'implementazione di riferimento.
Ogni variante sotto src/x86_64/ viene selezionata in fase di configurazione con
-DHQC_X86_IMPL=<variant> e viene compilata in una propria libreria e in propri binari di test.
| Variante | Etichetta nell'articolo | ISA | Descrizione |
|---|---|---|---|
avx256 | HQC reference | AVX2 | implementazione ottimizzata ufficiale (baseline) |
avx256_TC_Jang | Jang et al. | AVX2 | moltiplicazione GFmulOpt Toom-Cook/Karatsuba |
avx256_TC_GFNI | Ours (AVX2) | AVX2+GFNI | i nostri decoder GFNI Reed-Solomon / Reed-Muller sulla build AVX2 |
avx256_FAFFT_GFNI_chen | Chen et al. | AVX2+GFNI | moltiplicazione FAFFT, flusso originale non cached |
avx256_FAFFT_GFNI_chen_x2 | Chen et al. (dagger) | AVX2+GFNI | FAFFT con il flusso ring_mul_x2 a operandi condivisi |
avx256_FAFFT_GFNI_ours | Ours FAFFT (AVX2) | AVX2+GFNI | FAFFT + conversione di base zero-tail + i nostri decoder |
avx512_Robert | Robert–Véron | AVX-512 | moltiplicazione polinomiale AVX-512 di Robert–Véron |
avx512_Cabral | Cabral et al. | AVX-512+GFNI | codice sorgente di Cabral et al. (include la loro correzione upstream hash_j di HQC-3 del 2026-07-21) |
avx512_TC_GFNI | Ours TC/Karat (AVX-512) | AVX-512+GFNI | Toom-Cook/Karatsuba AVX-512, decoder GFNI, Keccak AVX-512 |
avx512_FAFFT_GFNI | Ours FAFFT (AVX-512) | AVX-512+GFNI | port AVX-512 dell'implementazione AVX2 di Chen et al. |
Le due build Ours di ciascuna ISA differiscono solo nel moltiplicatore polinomiale, quindi
il loro confronto end-to-end isola la scelta del moltiplicatore.
Requisiti: GCC >= 12, CMake >= 3.21, una CPU x86-64. Le varianti AVX-512 richiedono AVX-512F/BW/DQ/VL/VBMI/VBMI2/IFMA/BITALG/VPOPCNTDQ, VPCLMULQDQ e GFNI (Ice Lake / Tiger Lake / Rocket Lake / Zen 4 o successivi).
# una 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
# oppure tutte le varianti in una volta (crea le directory build-<variant>/)
./build_all.sh
# dalla radice del repository, dopo la compilazione
bash scripts/run_kat.sh # tutte le varianti
bash scripts/run_kat.sh avx512_TC_GFNI # una variante
Nota: test_kat_hqc_* non stampa nulla in caso di successo e stampa righe contenenti bad
in caso di mancata corrispondenza; lo script filtra l'output di conseguenza.
Il protocollo dell'articolo: Turbo Boost e SMT disabilitati, il processo vincolato a un
core fisico, e ogni valore riportato è la mediana di 1.000 campioni di 100
iterazioni dopo 10.000 iterazioni di warm-up. Gli script vincolano al core 0 con
taskset.
bash scripts/measure_build.sh <variant> [...] # benchmark KEM end-to-end delle varianti indicate
I log grezzi vengono scritti in benchmark_results/raw/; il report del benchmark riporta
min/mediana/media, e la mediana è il valore citato nell'articolo.
src/common/ codice HQC indipendente dal set di parametri (livello KEM, coding)
src/ref/ implementazione di riferimento
src/x86_64/common/ codice condiviso dell'era AVX2
src/x86_64/<variant> una directory per ogni implementazione confrontata (vedi tabella)
lib/fips202/ Keccak (PQClean scalare + permutazione XKCP AVX-512 opzionale)
tests/ KAT, API, unit test, benchmark
kats/ file known-answer usati dai test KAT
scripts/ script di supporto per KAT e misurazioni
Il repository di base e le nostre aggiunte sono rilasciati nel pubblico dominio
(vedi LICENSE). Questo repository include inoltre implementazioni
di terze parti per scopi di misurazione; vedi
THIRD_PARTY_NOTICES.md per le loro pubblicazioni,
origini e licenze.