本仓库包含论文 "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 的两个 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,将进程固定到一个
物理核心,并且每个报告值都是 10,000 次预热迭代后
1,000 个样本(每个样本 100 次迭代)的中位数。脚本使用
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。