
Безопасная, быстрая и портативная реализация ML-KEM / FIPS 203 на C90.
mlkem-native — это безопасная, быстрая и переносимая реализация ML-KEM[^FIPS203] на C90[^C90]. Она является форком эталонной реализации ML-KEM[^REF].
Весь код на C в mlkem/src/* и mlkem/src/fips202/* доказанно безопасен по памяти (без переполнения памяти) и безопасен по типам (без переполнения целых чисел) с использованием CBMC[^CBMC]. Весь ассемблер для AArch64 и x86_64 доказанно функционально корректен, безопасен по памяти и имеет независимое от секретов время выполнения (constant-time), с использованием HOL-Light[^HOL-Light].
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 защищён от побочных каналов по времени, вносимых компилятором (таких как KyberSlash[^KyberSlash] или clangover[^clangover]), с помощью соответствующих барьеров и шаблонов 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, следуя подходу, описанному в статье о SLOTHY[^SLOTHY_Paper]: Мы пишем «чистый» ассемблер вручную и автоматизируем микрооптимизации (например, см. clean против optimized NTT для AArch64). См. dev/README.md для более подробной информации.
mlkem-native тестируется на всех официальных ACVP ML-KEM тестовых векторах[^ACVP] и тестовых векторах ML-KEM Wycheproof[^wycheproof].
Вы можете запустить тесты ACVP с помощью скрипта tests или напрямую ACVP-клиента: