
Безопасная, быстрая и портативная реализация ML-KEM / FIPS 203 на C90.
mlkem-native — это безопасная, быстрая и переносимая реализация ML-KEM1 на C902. Она является форком эталонной реализации ML-KEM3.
Весь код на C в mlkem/src/* и mlkem/src/fips202/* доказанно безопасен по памяти (без переполнения памяти) и безопасен по типам (без переполнения целых чисел) с использованием CBMC4. Весь ассемблер для AArch64 и x86_64 доказанно функционально корректен, безопасен по памяти и имеет независимое от секретов время выполнения (constant-time), с использованием HOL-Light5.
mlkem-native включает нативные бэкенды для Arm (64-бит, Neon), Intel/AMD (64-бит, AVX2), RISC-V (64-бит, RVV) и POWER (ppc64le, VSX). См. benchmarks для данных о производительности.
mlkem-native поддерживается Post-Quantum Cryptography Alliance в составе Linux Foundation.
# Install base packages
sudo apt-get update
sudo apt-get install make gcc python3 git
# Clone mlkem-native
git clone https://github.com/pq-code-package/mlkem-native.git
cd mlkem-native
# Build and run tests
make build
make test
# The same using `tests`, a convenience wrapper around `make`
./scripts/tests all
# Show all options
./scripts/tests --help
См. BUILDING.md для получения дополнительной информации.
mlkem-native используется в
Весь код на C в mlkem/src/* и mlkem/src/fips202/* доказанно безопасен по памяти (без переполнения памяти) и безопасен по типам (без переполнения целых чисел). Для этого используется C Bounded Model Checker (CBMC), и это опирается на контракты функций и аннотации инвариантов циклов в исходном коде. См. proofs/cbmc для подробностей.
Весь ассемблер для AArch64 и x86_64 доказанно функционально корректен, безопасен по памяти и имеет независимое от секретов время выполнения (constant-time), на уровне объектного кода. Для этого используется интерактивный доказатель теорем HOL-Light и инфраструктура верификации s2n-bignum (которая включает модели соответствующих частей архитектур Arm и x86). См. proofs/hol_light для подробностей.
ПРИМЕЧАНИЕ: Формальная верификация никогда не является абсолютной. См. SOUNDNESS.md для подробного анализа области применения, допущений и рисков усилий по формальной верификации вокруг mlkem-native.
Весь ассемблер для AArch64 и x86_64 в mlkem-native формально доказан в HOL Light как свободный от зависимых от секретов потоков управления, шаблонов доступа к памяти и инструкций с переменной задержкой, что предотвращает большинство побочных каналов по времени (см. proofs/hol_light для подробностей). Код на C защищён от побочных каналов по времени, вносимых компилятором (таких как KyberSlash6 или clangover7), с помощью соответствующих барьеров и шаблонов constant-time.
Отсутствие зависимых от секретов ветвлений, шаблонов доступа к памяти и инструкций с переменной задержкой также тестируется с помощью valgrind
с различными комбинациями компиляторов и параметров компиляции.
Другие атаки. mlkem-native нацелен на устойчивость только к побочным каналам по времени. Другие классы атак, такие как побочные каналы по питанию и электромагнитному излучению, микроархитектурные побочные каналы (например, спекулятивное выполнение) или атаки с внедрением сбоев, в настоящее время выходят за рамки.
mlkem-native разделён на фронтенд и два бэкенда для арифметики и FIPS202 / SHA3. Фронтенд фиксирован, написан на C и охватывает все процедуры, которые не критичны для производительности. Бэкенды гибкие, отвечают за производительно-критичные процедуры и могут быть реализованы на C или в нативном коде (ассемблер/интринсики); см. mlkem/src/native/api.h для арифметического бэкенда и mlkem/src/fips202/native/api.h для бэкенда FIPS-202.
mlkem-native в настоящее время предлагает следующие бэкенды:
Если вы хотите внести вклад в новые бэкенды, пожалуйста, свяжитесь с нами или просто откройте PR.
Наш ассемблер для AArch64 разработан с использованием супероптимизатора SLOTHY, следуя подходу, описанному в статье о SLOTHY8: Мы пишем «чистый» ассемблер вручную и автоматизируем микрооптимизации (например, см. clean против optimized NTT для AArch64). См. dev/README.md для более подробной информации.
mlkem-native тестируется на всех официальных ACVP ML-KEM тестовых векторах9 и тестовых векторах ML-KEM Wycheproof10.
Вы можете запустить тесты ACVP с помощью скрипта tests или напрямую ACVP-клиента:
# Using the tests script
./scripts/tests acvp
# Using a specific ACVP release
./scripts/tests acvp --version v1.1.0.41
# Using the ACVP client directly
python3 ./test/acvp/acvp_client.py
python3 ./test/acvp/acvp_client.py --version v1.1.0.41
# Using specific ACVP test vector files (downloaded from the ACVP-Server)
# python3 ./test/acvp/acvp_client.py -p {PROMPT}.json -e {EXPECTED_RESULT}.json
# For example, assuming you have run the above
python3 ./test/acvp/acvp_client.py \
-p ./test/acvp/.acvp-data/v1.1.0.41/files/ML-KEM-keyGen-FIPS203/prompt.json \
-e ./test/acvp/.acvp-data/v1.1.0.41/files/ML-KEM-keyGen-FIPS203/expectedResults.json
Вы можете запустить тесты Wycheproof10 с помощью скрипта tests или напрямую Wycheproof-клиента:
# Using the tests script
./scripts/tests wycheproof
# Using the Wycheproof client directly
python3 ./test/wycheproof/wycheproof_client.py
Вы можете измерить производительность, использование памяти и размер двоичного файла с помощью скрипта tests:
# Speed benchmarks (-c selects cycle counter: NO, PMU, PERF, or MAC)
# Note: PERF/MAC may require the -r flag to run benchmarking binaries using sudo
./scripts/tests bench -c PMU
./scripts/tests bench -c PERF -r
# Stack usage analysis
./scripts/tests stack
# Binary size measurement
./scripts/tests size
Для результатов бенчмарков CI и исторических данных о производительности см. страницу бенчмарков.
Если вы хотите использовать mlkem-native, импортируйте mlkem в дерево исходников вашего проекта и соберите с помощью вашей любимой системы сборки. См. mlkem для получения дополнительной информации, и examples/basic для простого примера. Система сборки, предоставленная в этом репозитории, предназначена только для целей разработки.
См. API-CONVENTIONS.md для соглашений, которые применяются ко всем публичным функциям, таких как возвращаемые значения, допустимость указателей и состояние выходных буферов при ошибке.
mlkem-native полагается на реализацию FIPS-20211 и поставляется с ней. Если ваша библиотека имеет собственную реализацию FIPS-202, вы можете использовать её вместо той, что поставляется с mlkem-native. См. FIPS202.md и examples/bring_your_own_fips202 для примера с использованием tiny_sha312.
Нет. Если вам нужна сборка только на C, просто исключите каталоги mlkem/src/native и/или mlkem/src/fips202/native из вашего импорта
и сбросьте MLK_CONFIG_USE_NATIVE_BACKEND_ARITH и/или MLK_CONFIG_USE_NATIVE_BACKEND_FIPS202 в вашем mlkem_native_config.h.
Нет. Хотя мы рекомендуем рассмотреть возможность его использования, mlkem-native будет собираться и работать нормально без CBMC — просто убедитесь, что
включён cbmc.h и CBMC не определён. В частности, вам не нужно удалять все контракты
функций и инварианты циклов из кода; они будут игнорироваться, если только CBMC не установлен.
Да. Уровень безопасности — это параметр времени компиляции, настраиваемый установкой MLK_CONFIG_PARAMETER_SET=512/768/1024 в mlkem_native_config.h.
Если ваша библиотека/приложение требует несколько уровней безопасности, вы можете собрать и слинковать три экземпляра mlkem-native,
разделяя общий код; это называется «многоуровневой сборкой» и продемонстрировано в examples/multilevel_build. См. также mlkem.
Да, вы можете добавить дополнительные бэкенды для нативной арифметики ML-KEM и/или для FIPS-202. Используйте существующие бэкенды в качестве шаблонов или см. examples/custom_backend для минимального примера того, как зарегистрировать пользовательский бэкенд.
Если вы считаете, что нашли уязвимость в безопасности mlkem-native, пожалуйста, сообщите о ней через приватный отчёт об уязвимостях Github. Пожалуйста, не создавайте публичный issue на GitHub.
Если у вас есть любой другой вопрос / проблема, не связанная с безопасностью / запрос функции, пожалуйста, откройте issue на GitHub.
Если вы хотите помочь нам в разработке mlkem-native, пожалуйста, свяжитесь с нами. Вы можете связаться с командой mlkem-native через PQCA Discord. См. также CONTRIBUTING.md.
National Institute of Standards and Technology: FIPS 203 Module-Lattice-Based Key-Encapsulation Mechanism Standard, https://csrc.nist.gov/pubs/fips/203/final ↩
Строго говоря, мы полагаемся на C90 + stdint.h + 64-битный unsigned long long. ↩
Bos, Ducas, Kiltz, Lepoint, Lyubashevsky, Schanck, Schwabe, Seiler, Stehlé: CRYSTALS-Kyber C reference implementation, https://github.com/pq-crystals/kyber/tree/main/ref ↩
Diffblue, Amazon Web Services: C Bounded Model Checker, https://github.com/diffblue/cbmc ↩
John Harrison: HOL-Light Theorem Prover, https://hol-light.github.io/ ↩
Bernstein, Bhargavan, Bhasin, Chattopadhyay, Chia, Kannwischer, Kiefer, Paiva, Ravi, Tamvada: KyberSlash: Exploiting secret-dependent division timings in Kyber implementations, https://kyberslash.cr.yp.to/papers.html ↩
Antoon Purnal: clangover,
Abdulrahman, Becker, Kannwischer, Klein: Fast and Clean: Auditable high-performance assembly via constraint solving, https://eprint.iacr.org/2022/1303 ↩
National Institute of Standards and Technology: Automated Cryptographic Validation Protocol (ACVP) Server, https://github.com/usnistgov/ACVP-Server ↩
Community Cryptography Specification Project: Project Wycheproof, https://github.com/C2SP/wycheproof ↩ ↩2
National Institute of Standards and Technology: FIPS202 SHA-3 Standard: Permutation-Based Hash and Extendable-Output Functions, https://csrc.nist.gov/pubs/fips/202/final ↩
Markku-Juhani O. Saarinen: tiny_sha3, https://github.com/mjosaarinen/tiny_sha3 ↩