
Post-quantum cryptographic scheme implementation (Hamming Quasi-Cyclic) with reference and optimized versions for secure key encapsulation.
This repository provides the official implementation of HQC, a code-based Key Encapsulation Mechanism (KEM) whose security is based on the hardness of solving the Quasi-Cylic Syndrome Decoding (QCSD) problem. HQC is one of the selected algorithms from the NIST's Post-Quantum Cryptography Standardization Project.
The project is organized into modular components, including cross-platform code, tests, known-answer vectors, and packaging tools.
You can build any variant in an out-of-tree directory and run the full test-suite
with a single command line. Choose the architecture (HQC_ARCH), the exact
SIMD back-end if applicable (HQC_X86_IMPL), and an optional runtime sanitizer
(HQC_SANITIZER).
# 1) Configure
cmake -S . -B build-<arch> \
-DCMAKE_BUILD_TYPE=Release \
-DHQC_ARCH=<arch> \
-DHQC_X86_IMPL=<impl> \
-DHQC_SANITIZER=<sanitizer>
# 2) Build
cmake --build build-<arch> -- -j$(nproc)
# 3) Test
ctest --test-dir build-<arch> --output-on-failure -j$(nproc)
Configuration Options
<arch>: ref, x86_64<impl>: avx256<sanitizer>: NONE, ASAN, LSAN, MSAN, UBSANExample 1 (Portable reference implementation)
rm -rf build-ref &&
cmake -S . -B build-ref \
-DCMAKE_BUILD_TYPE=Release \
-DHQC_ARCH=ref &&
cmake --build build-ref -j$(nproc) &&
ctest --test-dir build-ref -j$(nproc)
Example 2 (Optimized AVX2 implementation (Haswell/AVX256))
rm -rf build-avx256 &&
cmake -S . -B build-avx256 \
-DCMAKE_BUILD_TYPE=Release \
-DHQC_ARCH=x86_64 \
-DHQC_X86_IMPL=avx256 &&
cmake --build build-avx256 -j$(nproc) &&
ctest --test-dir build-avx256 -j$(nproc)
All sources must be formatted with clang-format before every commit.
Our CI pipeline runs cmake --build <build-dir> --target check-format
and will fail if any file deviates from the project style.
# Run from the build directory you already created
cmake --build build-<arch> --target clang-format # rewrites files in-place
cmake --build build-<arch> --target check-format # just checks, no changes