
AVX2およびAVX-512 with GFNI向けに最適化されたHQCポスト量子KEM実装、さらにx86 IoTゲートウェイ向けの統合ベンチマークおよびNIST KATスイート。
このリポジトリには、論文*「Accelerating HQC for Post-Quantum TLS 1.3 on x86 IoT Gateways」*に付随する最適化HQC実装とベンチマークコードが含まれています。 これは公式HQCリポジトリのフォークであり、AVX-512 + GFNI実装と、比較対象のすべての実装を同一のコードベース、コンパイラフラグ、ベンチマークプロトコルからビルドする統合計測スイートで拡張されています。
すべての実装はHQC-1、HQC-3、HQC-5のNIST既知解答テスト(KAT)に合格し、参照実装の入力非依存の制御フローとメモリアクセスパターンを維持しています。
src/x86_64/以下の各バリアントは、構成時に-DHQC_X86_IMPL=<variant>で選択され、それぞれ独自のライブラリとテストバイナリにビルドされます。
| バリアント | 論文での表記 | ISA | 説明 |
|---|---|---|---|
avx256 | HQC reference | AVX2 | 公式の最適化実装(ベースライン) |
avx256_TC_Jang | Jang et al. | AVX2 | GFmulOpt Toom-Cook/Karatsuba乗算 |
avx256_TC_GFNI | Ours (AVX2) | AVX2+GFNI | AVX2ビルド上での我々のGFNI Reed-Solomon / Reed-Mullerデコーダ |
avx256_FAFFT_GFNI_chen | Chen et al. | AVX2+GFNI | FAFFT乗算、元の非キャッシュフロー |
avx256_FAFFT_GFNI_chen_x2 | Chen et al. (dagger) | AVX2+GFNI | 共有オペランドring_mul_x2フローを用いたFAFFT |
avx256_FAFFT_GFNI_ours | Ours FAFFT (AVX2) | AVX2+GFNI | FAFFT + ゼロテール基底変換 + 我々のデコーダ |
avx512_Robert | Robert–Véron | AVX-512 | Robert–VéronのAVX-512多項式乗算 |
avx512_Cabral | Cabral et al. | AVX-512+GFNI | Cabral et al.のソースコード(2026-07-21の上流HQC-3 hash_j修正を含む) |
avx512_TC_GFNI | Ours TC/Karat (AVX-512) | AVX-512+GFNI | AVX-512 Toom-Cook/Karatsuba、GFNIデコーダ、AVX-512 Keccak |
avx512_FAFFT_GFNI | Ours FAFFT (AVX-512) | AVX-512+GFNI | Chen et al.のAVX2実装のAVX-512移植 |
各ISAの2つのOursビルドは多項式乗算器のみが異なるため、それらのエンドツーエンド比較により乗算器の選択を分離できます。
要件: GCC >= 12、CMake >= 3.21、x86-64 CPU。AVX-512バリアントにはAVX-512F/BW/DQ/VL/VBMI/VBMI2/IFMA/BITALG/VPOPCNTDQ、VPCLMULQDQ、GFNIが必要です(Ice Lake / Tiger Lake / Rocket Lake / Zen 4以降)。
# 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
注: test_kat_hqc_*は成功時には何も出力せず、不一致時にはbadを含む行を出力します。スクリプトはそれに応じて出力をgrepします。
論文のプロトコル: Turbo BoostとSMTを無効化し、プロセスを1つの物理コアに固定し、報告されるすべての値は10,000回のウォームアップ反復後の100反復×1,000サンプルの中央値です。スクリプトはtasksetでコア0に固定します。
bash scripts/measure_build.sh <variant> [...] # end-to-end KEM benchmark of the given variants
生ログはbenchmark_results/raw/に書き込まれます。ベンチマークは最小値/中央値/平均値を報告し、中央値が論文で引用されている値です。
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
ベースリポジトリと我々の追加分はパブリックドメインとして公開されています(LICENSEを参照)。このリポジトリはさらに計測目的でサードパーティ実装をベンダリングしています。それらの出版物、出所、ライセンスについてはTHIRD_PARTY_NOTICES.mdを参照してください。