
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 known-answer 테스트(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 이상).
# 변형 하나
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를 비활성화하고, 프로세스를 하나의 물리 코어에
고정하며, 보고되는 모든 값은 10,000회 워밍업 반복 후 100회 반복의 1,000개 샘플의
중앙값입니다. 스크립트는 taskset으로 코어 0에 고정합니다.
bash scripts/measure_build.sh <variant> [...] # 주어진 변형의 종단 간 KEM 벤치마크
원시 로그는 benchmark_results/raw/에 기록됩니다. 벤치마크는
최소/중앙/평균을 보고하며, 중앙값이 논문에서 인용된 값입니다.
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 테스트에서 사용하는 known-answer 파일
scripts/ KAT 및 측정 도우미 스크립트
기본 저장소와 우리의 추가 사항은 퍼블릭 도메인으로 공개됩니다
(LICENSE 참조). 이 저장소는 추가로 측정 목적을 위해 제3자 구현을
포함하고 있습니다. 해당 출판물, 출처, 라이선스는
THIRD_PARTY_NOTICES.md를 참조하십시오.