
Post-quantum cryptographic scheme implementation (Hamming Quasi-Cyclic) with reference and optimized versions for secure key encapsulation.
HQC is a code-based Key Encapsulation Mechanism (KEM) selected by NIST during the NIST's Post-Quantum Cryptography Standardization Project. This repository contains the implementation provided by the HQC team.
The project is organized into modular components, including cross-platform code, tests, known-answer vectors, and packaging tools.
One 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)
Optional developer tools live under tools/ and can be built using -DHQC_BUILD_TOOLS=ON (see tools/README.md for commands and usage).
Scope. This project targets resistance against timing attacks only, other side-channels attacks are not currently considered.
This project is expected to avoid secret-dependent control flows and access to secret memory locations in order to thwart timing attacks. Hardening the code against compiler-induced timing attacks is a work in progress and only vulnerabilities introduced when compiled following our compilation instructions on targetted architectures will be considered (see #11 and #12).
Till the FIPS 207 standard is available, people are encouraged to report issues here by opening a work item.
Merge requests addressing work items are also appreciated.
All sources must be formatted with clang-format before every commit.
# 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 # check format