
Sichere, schnelle und portable C90-Implementierung von ML-KEM / FIPS 203
mlkem-native ist eine sichere, schnelle und portable C901-Implementierung von ML-KEM2. Es ist ein Fork der ML-KEM-Referenzimplementierung3.
Der gesamte C-Code in mlkem/src/* und mlkem/src/fips202/* ist als speichersicher (kein Speicherüberlauf) und typsicher (kein Integer-Überlauf) bewiesen, unter Verwendung von CBMC4. Der gesamte AArch64- und x86_64-Assemblycode ist als funktional korrekt, speichersicher und mit geheimnisunabhängigem Timing (konstantzeitlich) bewiesen, unter Verwendung von HOL-Light5.
mlkem-native enthält native Backends für Arm (64-Bit, Neon), Intel/AMD (64-Bit, AVX2), RISC-V (64-Bit, RVV) und POWER (ppc64le, VSX). Siehe Benchmarks für Leistungsdaten.
mlkem-native wird von der Post-Quantum Cryptography Alliance als Teil der Linux Foundation unterstützt.
# Basis-Pakete installieren
sudo apt-get update
sudo apt-get install make gcc python3 git
# mlkem-native klonen
git clone https://github.com/pq-code-package/mlkem-native.git
cd mlkem-native
# Build und Tests ausführen
make build
make test
# Dasselbe mit `tests`, einem Komfort-Wrapper um `make`
./scripts/tests all
# Alle Optionen anzeigen
./scripts/tests --help
Weitere Informationen finden Sie in BUILDING.md.
mlkem-native wird verwendet in
Der gesamte C-Code in mlkem/src/* und mlkem/src/fips202/* ist als speichersicher (kein Speicherüberlauf) und typsicher (kein Integer-Überlauf) bewiesen. Dies verwendet den C Bounded Model Checker (CBMC) und baut auf Funktionsverträgen und Schleifeninvarianten-Annotationen im Quellcode auf. Siehe proofs/cbmc für Details.
Der gesamte AArch64- und x86_64-Assemblycode ist als funktional korrekt, speichersicher und mit geheimnisunabhängigem Timing (konstantzeitlich) auf Objektcode-Ebene bewiesen. Dies verwendet den interaktiven Theorembeweiser HOL-Light und die Verifikationsinfrastruktur s2n-bignum (die Modelle der relevanten Teile der Arm- und x86-Architekturen enthält). Siehe proofs/hol_light für Details.
HINWEIS: Formale Verifikation ist niemals absolut. Siehe SOUNDNESS.md für eine detaillierte Analyse des Umfangs, der Annahmen und der Risiken der formalen Verifikationsbemühungen rund um mlkem-native.
Der gesamte AArch64- und x86_64-Assemblycode in mlkem-native ist in HOL Light formal als frei von geheimnisabhängigem Kontrollfluss, Speicherzugriffsmustern und Anweisungen mit variabler Latenz bewiesen, wodurch die meisten Timing-Seitenkanäle vereitelt werden (siehe proofs/hol_light für Details). C-Code ist gegen compilerinduzierte Timing-Seitenkanäle (wie KyberSlash6 oder clangover7) durch geeignete Barrieren und Konstantzeit-Muster gehärtet.
Die Abwesenheit von geheimnisabhängigen Verzweigungen, Speicherzugriffsmustern und Anweisungen mit variabler Latenz wird auch mit valgrind
mit verschiedenen Kombinationen von Compilern und Kompilierungsoptionen getestet.
Andere Angriffe. mlkem-native zielt nur auf Widerstand gegen Timing-Seitenkanäle ab. Andere Angriffsklassen wie Strom- und elektromagnetische Seitenkanäle, mikroarchitektonische Seitenkanäle (z. B. spekulative Ausführung) oder Fehlerinjektionsangriffe sind derzeit außerhalb des Rahmens.
mlkem-native ist in ein Frontend und zwei Backends für Arithmetik und FIPS202 / SHA3 aufgeteilt. Das Frontend ist fest, in C geschrieben und deckt alle Routinen ab, die nicht leistungskritisch sind. Die Backends sind flexibel, kümmern sich um leistungssensitive Routinen und können in C oder nativem Code (Assembly/Intrinsics) implementiert werden; siehe mlkem/src/native/api.h für das Arithmetik-Backend und mlkem/src/fips202/native/api.h für das FIPS-202-Backend.
mlkem-native bietet derzeit die folgenden Backends an:
Wenn Sie neue Backends beitragen möchten, kontaktieren Sie uns bitte oder eröffnen Sie einfach einen PR.
Unser AArch64-Assemblycode wird mit dem SLOTHY-Superoptimierer entwickelt, dem Ansatz aus dem SLOTHY-Papier8 folgend: Wir schreiben 'sauberen' Assemblycode von Hand und automatisieren Mikrooptimierungen (z. B. siehe clean vs. optimized AArch64-NTT). Siehe dev/README.md für weitere Details.
mlkem-native wird gegen alle offiziellen ACVP-ML-KEM-Testvektoren9 und die Wycheproof10-ML-KEM-Testvektoren getestet.
Sie können ACVP-Tests mit dem tests-Skript oder dem ACVP-Client direkt ausführen:
# Mit dem tests-Skript
./scripts/tests acvp
# Mit einer bestimmten ACVP-Version
./scripts/tests acvp --version v1.1.0.41
# Mit dem ACVP-Client direkt
python3 ./test/acvp/acvp_client.py
python3 ./test/acvp/acvp_client.py --version v1.1.0.41
# Mit bestimmten ACVP-Testvektordateien (vom ACVP-Server heruntergeladen)
# python3 ./test/acvp/acvp_client.py -p {PROMPT}.json -e {EXPECTED_RESULT}.json
# Zum Beispiel, vorausgesetzt Sie haben das Obige ausgeführt
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
Sie können Wycheproof10-Tests mit dem tests-Skript oder dem Wycheproof-Client direkt ausführen:
# Mit dem tests-Skript
./scripts/tests wycheproof
# Mit dem Wycheproof-Client direkt
python3 ./test/wycheproof/wycheproof_client.py
Sie können Leistung, Speichernutzung und Binärgröße mit dem tests-Skript messen:
# Geschwindigkeits-Benchmarks (-c wählt den Zykluszähler: NO, PMU, PERF oder MAC)
# Hinweis: PERF/MAC kann das -r-Flag erfordern, um Benchmark-Binaries mit sudo auszuführen
./scripts/tests bench -c PMU
./scripts/tests bench -c PERF -r
# Stack-Nutzungsanalyse
./scripts/tests stack
# Binärgrößenmessung
./scripts/tests size
Für CI-Benchmarkergebnisse und historische Leistungsdaten siehe die Benchmarking-Seite.
Wenn Sie mlkem-native verwenden möchten, importieren Sie mlkem in den Quellbaum Ihres Projekts und bauen Sie mit Ihrem bevorzugten Build-System. Siehe mlkem für weitere Informationen und examples/basic für ein einfaches Beispiel. Das in diesem Repository bereitgestellte Build-System dient nur Entwicklungszwecken.
Siehe API-CONVENTIONS.md für Konventionen, die für alle öffentlichen Funktionen gelten, wie Rückgabewerte, Zeigergültigkeit und den Zustand von Ausgabepuffern bei Fehlern.
mlkem-native verlässt sich auf eine Implementierung von FIPS-20211 und wird mit dieser geliefert. Wenn Ihre Bibliothek eine eigene FIPS-202-Implementierung hat, können Sie diese anstelle der mit mlkem-native gelieferten verwenden. Siehe FIPS202.md und examples/bring_your_own_fips202 für ein Beispiel mit tiny_sha312.
Nein. Wenn Sie einen reinen C-Build möchten, lassen Sie einfach die Verzeichnisse mlkem/src/native und/oder mlkem/src/fips202/native aus Ihrem Import
weg und setzen Sie MLK_CONFIG_USE_NATIVE_BACKEND_ARITH und/oder MLK_CONFIG_USE_NATIVE_BACKEND_FIPS202 in Ihrer mlkem_native_config.h zurück.
Nein. Obwohl wir empfehlen, die Verwendung in Betracht zu ziehen, baut und läuft mlkem-native auch ohne CBMC einwandfrei – stellen Sie nur sicher, dass Sie
cbmc.h einbinden und CBMC undefiniert lassen. Insbesondere müssen Sie nicht alle Funktionsverträge
und Schleifeninvarianten aus dem Code entfernen; sie werden ignoriert, es sei denn, CBMC ist gesetzt.
Ja. Die Sicherheitsstufe ist ein Kompilierzeitparameter, der durch Setzen von MLK_CONFIG_PARAMETER_SET=512/768/1024 in mlkem_native_config.h konfiguriert wird.
Wenn Ihre Bibliothek/Anwendung mehrere Sicherheitsstufen erfordert, können Sie drei Instanzen von mlkem-native bauen und verlinken,
während gemeinsamer Code geteilt wird; dies wird als 'Multi-Level-Build' bezeichnet und ist in examples/multilevel_build demonstriert. Siehe auch mlkem.
Ja, Sie können weitere Backends für ML-KEM-native Arithmetik und/oder für FIPS-202 hinzufügen. Folgen Sie den vorhandenen Backends als Vorlagen oder siehe examples/custom_backend für ein minimales Beispiel, wie Sie ein benutzerdefiniertes Backend registrieren.
Wenn Sie glauben, einen Sicherheitsfehler in mlkem-native gefunden zu haben, melden Sie die Schwachstelle bitte über Githubs private Schwachstellenmeldung. Bitte erstellen Sie kein öffentliches GitHub-Issue.
Wenn Sie eine andere Frage / ein nicht sicherheitsbezogenes Problem / eine Feature-Anfrage haben, eröffnen Sie bitte ein GitHub-Issue.
Wenn Sie uns beim Aufbau von mlkem-native helfen möchten, kontaktieren Sie uns bitte. Sie können das mlkem-native-Team über den PQCA-Discord erreichen. Siehe auch CONTRIBUTING.md.
Streng genommen verlassen wir uns auf C90 + stdint.h + 64-Bit-unsigned long long. ↩
National Institute of Standards and Technology: FIPS 203 Module-Lattice-Based Key-Encapsulation Mechanism Standard, https://csrc.nist.gov/pubs/fips/203/final ↩
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 ↩