
# ML-KEM / FIPS 203の安全、高速、ポータブルなC90実装
mlkem-native は、ML-KEM1 の安全で高速かつ移植性に優れた C902 実装です。 これは ML-KEM リファレンス実装3 のフォークです。
mlkem/src/* および mlkem/src/fips202/* 内のすべての C コードは、CBMC4 を用いてメモリ安全性(メモリオーバーフローなし)と型安全性(整数オーバーフローなし)が証明されています。すべての AArch64 および x86_64 アセンブリは、HOL-Light5 を用いて、機能的に正しく、メモリ安全であり、秘密情報に依存しないタイミング(定数時間)であることが証明されています。
mlkem-native には、Arm(64ビット、Neon)、Intel/AMD(64ビット、AVX2)、RISC-V(64ビット、RVV)、POWER(ppc64le、VSX)向けのネイティブバックエンドが含まれています。パフォーマンスデータについては benchmarks を参照してください。
mlkem-native は、Linux Foundation の一部である Post-Quantum Cryptography Alliance によって支援されています。
# 基本パッケージのインストール
sudo apt-get update
sudo apt-get install make gcc python3 git
# mlkem-native のクローン
git clone https://github.com/pq-code-package/mlkem-native.git
cd mlkem-native
# ビルドとテストの実行
make build
make test
# `make` の便利なラッパーである `tests` を使用する場合も同様
./scripts/tests all
# すべてのオプションを表示
./scripts/tests --help
詳細については BUILDING.md を参照してください。
mlkem-native は以下のプロジェクトで使用されています。
mlkem/src/* および mlkem/src/fips202/* 内のすべての C コードは、メモリ安全性(メモリオーバーフローなし)と型安全性(整数オーバーフローなし)が証明されています。 これは C Bounded Model Checker (CBMC) を使用し、ソースコード内の関数契約とループ不変条件の注釈に基づいています。詳細は proofs/cbmc を参照してください。
すべての AArch64 および x86_64 アセンブリは、オブジェクトコードレベルで、機能的に正しく、メモリ安全であり、秘密情報に依存しないタイミング(定数時間)を持つことが証明されています。これは HOL-Light 対話型定理証明器と s2n-bignum 検証インフラストラクチャ(Arm および x86 アーキテクチャの関連部分のモデルを含む)を使用します。詳細は proofs/hol_light を参照してください。
注記: 形式検証は決して絶対的なものではありません。mlkem-native に関する形式検証の範囲、前提、リスクの詳細な分析については SOUNDNESS.md を参照してください。
mlkem-native 内のすべての AArch64 および x86_64 アセンブリは、HOL Light において、秘密情報に依存する制御フロー、メモリアクセスパターン、および可変レイテンシ命令がないことが正式に証明されており、ほとんどのタイミングサイドチャネルを阻止します(詳細は proofs/hol_light を参照)。C コードは、適切なバリアと定数時間パターンを通じて、コンパイラによって導入されるタイミングサイドチャネル(KyberSlash6 や clangover7 など)に対して強化されています。
秘密情報に依存する分岐、メモリアクセスパターン、可変レイテンシ命令がないことは、valgrind を使用し、さまざまなコンパイラとコンパイルオプションの組み合わせでもテストされています。
その他の攻撃。 mlkem-native はタイミングサイドチャネルへの耐性のみを対象としています。電力および電磁サイドチャネル、マイクロアーキテクチャサイドチャネル(例: 投機的実行)、フォールトインジェクション攻撃などの他の攻撃クラスは、現在のところ対象外です。
mlkem-native は、フロントエンド と、算術および FIPS202 / SHA3 用の 2 つの バックエンド に分割されています。フロントエンドは固定で、C で書かれており、パフォーマンスに重要でないすべてのルーチンをカバーしています。バックエンドは柔軟で、パフォーマンスに敏感なルーチンを担当し、C またはネイティブコード(アセンブリ/イントリンシクス)で実装できます。算術バックエンドについては mlkem/src/native/api.h、FIPS-202 バックエンドについては mlkem/src/fips202/native/api.h を参照してください。
mlkem-native は現在、以下のバックエンドを提供しています。
新しいバックエンドの提供を希望される場合は、ご連絡いただくか、PR をオープンしてください。
私たちの AArch64 アセンブリは、SLOTHY ペーパー8 で説明されているアプローチに従い、SLOTHY スーパーオプティマイザを使用して開発されています。 「クリーンな」アセンブリを手書きし、マイクロ最適化を自動化します(例: clean と optimized AArch64 NTT を参照)。 詳細については dev/README.md を参照してください。
mlkem-native は、すべての公式 ACVP ML-KEM テストベクター9 および Wycheproof10 ML-KEM テストベクターに対してテストされています。
tests スクリプトまたは ACVP クライアント を直接使用して ACVP テストを実行できます。
# tests スクリプトを使用
./scripts/tests acvp
# 特定の ACVP リリースを使用
./scripts/tests acvp --version v1.1.0.41
# ACVP クライアントを直接使用
python3 ./test/acvp/acvp_client.py
python3 ./test/acvp/acvp_client.py --version v1.1.0.41
# 特定の ACVP テストベクターファイルを使用(ACVP-Server からダウンロード)
# python3 ./test/acvp/acvp_client.py -p {PROMPT}.json -e {EXPECTED_RESULT}.json
# 例: 上記を実行したと仮定
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
tests スクリプトまたは Wycheproof クライアント を直接使用して Wycheproof10 テストを実行できます。
# tests スクリプトを使用
./scripts/tests wycheproof
# Wycheproof クライアントを直接使用
python3 ./test/wycheproof/wycheproof_client.py
tests スクリプトを使用して、パフォーマンス、メモリ使用量、バイナリサイズを測定できます。
# 速度ベンチマーク(-c はサイクルカウンタを選択: NO、PMU、PERF、または MAC)
# 注: PERF/MAC は、ベンチマークバイナリを sudo で実行するために -r フラグが必要な場合があります
./scripts/tests bench -c PMU
./scripts/tests bench -c PERF -r
# スタック使用量の分析
./scripts/tests stack
# バイナリサイズの測定
./scripts/tests size
CI ベンチマーク結果と過去のパフォーマンスデータについては、ベンチマークページ を参照してください。
mlkem-native を使用する場合は、mlkem をプロジェクトのソースツリーにインポートし、お好みのビルドシステムでビルドしてください。詳細については mlkem を、簡単な例については examples/basic を参照してください。このリポジトリで提供されているビルドシステムは開発目的のみです。
戻り値、ポインタの有効性、エラー時の出力バッファの状態など、すべての公開関数に適用される規約については API-CONVENTIONS.md を参照してください。
mlkem-native は FIPS-20211 の実装に依存しており、同梱されています。ライブラリに独自の FIPS-202 実装がある場合は、mlkem-native に同梱されているものの代わりにそれを使用できます。FIPS202.md、および tiny_sha312 を使用した例については examples/bring_your_own_fips202 を参照してください。
いいえ。C のみのビルドが必要な場合は、インポートからディレクトリ mlkem/src/native および/または mlkem/src/fips202/native を省略し、mlkem_native_config.h で MLK_CONFIG_USE_NATIVE_BACKEND_ARITH および/または MLK_CONFIG_USE_NATIVE_BACKEND_FIPS202 の設定を解除してください。
いいえ。使用を検討することをお勧めしますが、mlkem-native は CBMC なしでも問題なくビルドおよび実行できます。cbmc.h を含め、CBMC が未定義であることを確認してください。特に、コードからすべての関数契約とループ不変条件を削除する必要は_ありません_。CBMC が設定されていない限り、それらは無視されます。
はい。セキュリティレベルは、mlkem_native_config.h で MLK_CONFIG_PARAMETER_SET=512/768/1024 を設定することによって構成されるコンパイル時パラメータです。
ライブラリ/アプリケーションで複数のセキュリティレベルが必要な場合は、共通コードを共有しながら mlkem-native の 3 つのインスタンスをビルドおよびリンクできます。これは「マルチレベルビルド」と呼ばれ、examples/multilevel_build で実証されています。mlkem も参照してください。
はい、ML-KEM ネイティブ算術および/または FIPS-202 用の追加バックエンドを追加できます。既存のバックエンドをテンプレートとして使用するか、カスタムバックエンドを登録する方法の最小限の例については examples/custom_backend を参照してください。
mlkem-native にセキュリティバグを発見したと思われる場合は、Github の プライベート脆弱性報告 を通じて脆弱性を報告してください。公開の GitHub イシューは作成しないでください。
その他の質問、セキュリティに関係のない問題、機能リクエストがある場合は、GitHub イシューをオープンしてください。
mlkem-native の構築を支援したい場合は、ご連絡ください。PQCA Discord を通じて mlkem-native チームに連絡できます。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, https://github.com/antoonpurnal/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 ↩