
Оптимизированные реализации постквантового KEM HQC для AVX2 и AVX-512 с GFNI, а также унифицированный набор для бенчмаркинга и NIST KAT для IoT-шлюзов на x86.
Этот репозиторий содержит оптимизированные реализации HQC и код для бенчмаркинга, сопровождающие статью "Accelerating HQC for Post-Quantum TLS 1.3 on x86 IoT Gateways". Это форк официального репозитория HQC, расширенный реализациями AVX-512 + GFNI и унифицированным набором для измерений, который собирает каждую сравниваемую реализацию из одной и той же кодовой базы, флагов компилятора и протокола бенчмаркинга.
Все реализации проходят тесты на известные ответы (KAT) NIST для HQC-1, HQC-3 и HQC-5 и сохраняют независимый от входных данных поток управления и шаблон доступа к памяти эталонной реализации.
Каждый вариант в 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 | наши декодеры GFNI Reed-Solomon / Reed-Muller в сборке AVX2 |
avx256_FAFFT_GFNI_chen | Chen et al. | AVX2+GFNI | умножение FAFFT, оригинальный поток без кэширования |
avx256_FAFFT_GFNI_chen_x2 | Chen et al. (dagger) | AVX2+GFNI | FAFFT с потоком ring_mul_x2 с общими операндами |
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. (включает их исправление hash_j для HQC-3 от 2026-07-21) |
avx512_TC_GFNI | Ours TC/Karat (AVX-512) | AVX-512+GFNI | AVX-512 Toom-Cook/Karatsuba, декодеры GFNI, Keccak AVX-512 |
avx512_FAFFT_GFNI | Ours FAFFT (AVX-512) | AVX-512+GFNI | порт реализации AVX2 от Chen et al. на AVX-512 |
Две сборки Ours для каждой ISA различаются только умножителем полиномов,
поэтому их сквозное сравнение изолирует выбор умножителя.
Требования: 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 или новее).
# один вариант
mkdir build-avx512_TC_GFNI && cd build-avx512_TC_GFNI
cmake -DHQC_ARCH=x86_64 -DHQC_X86_IMPL=avx512_TC_GFNI ..
cmake --build . -j
# или все варианты сразу (создаёт каталоги build-<variant>/)
./build_all.sh
# из корня репозитория, после сборки
bash scripts/run_kat.sh # все варианты
bash scripts/run_kat.sh avx512_TC_GFNI # один вариант
Примечание: test_kat_hqc_* ничего не выводит при успехе и выводит строки,
содержащие bad, при несовпадении; скрипт выполняет grep вывода соответствующим образом.
Протокол из статьи: Turbo Boost и SMT отключены, процесс привязан к одному
физическому ядру, и каждое приведённое значение — медиана 1000 выборок по 100
итераций после 10 000 итераций прогрева. Скрипты привязываются к ядру 0 с
помощью taskset.
bash scripts/measure_build.sh <variant> [...] # сквозной бенчмарк KEM для указанных вариантов
Сырые логи записываются в benchmark_results/raw/; бенчмарк выводит
min/median/mean, и медиана — это значение, цитируемое в статье.
src/common/ независимый от набора параметров код HQC (слой KEM, кодирование)
src/ref/ эталонная реализация
src/x86_64/common/ общий код эпохи AVX2
src/x86_64/<variant> по одному каталогу на каждую сравниваемую реализацию (см. таблицу)
lib/fips202/ Keccak (скалярный PQClean + опциональная перестановка XKCP AVX-512)
tests/ KAT, API, модульные тесты, бенчмарки
kats/ файлы известных ответов, используемые тестами KAT
scripts/ вспомогательные скрипты для KAT и измерений
Базовый репозиторий и наши дополнения выпущены в общественное достояние
(см. LICENSE). Этот репозиторий дополнительно включает сторонние
реализации для целей измерений; см.
THIRD_PARTY_NOTICES.md для их публикаций,
происхождения и лицензий.