
Segura, rápida y portable implementación en C90 de ML-KEM / FIPS 203
mlkem-native es una implementación segura, rápida y portable en C901 de ML-KEM2. Es un fork de la implementación de referencia de ML-KEM3.
Todo el código C en mlkem/src/* y mlkem/src/fips202/* está demostrado como seguro en memoria (sin desbordamientos de memoria) y seguro en tipos (sin desbordamientos de enteros) usando CBMC4. Todo el ensamblador AArch64 y x86_64 está demostrado como funcionalmente correcto, seguro en memoria y de temporización independiente del secreto (tiempo constante), usando HOL-Light5.
mlkem-native incluye backends nativos para Arm (64 bits, Neon), Intel/AMD (64 bits, AVX2), RISC-V (64 bits, RVV) y POWER (ppc64le, VSX). Consulte benchmarks para datos de rendimiento.
mlkem-native cuenta con el apoyo de la Post-Quantum Cryptography Alliance como parte de la 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
Consulte BUILDING.md para más información.
mlkem-native se utiliza en
Todo el código C en mlkem/src/* y mlkem/src/fips202/* está demostrado como seguro en memoria (sin desbordamientos de memoria) y seguro en tipos (sin desbordamientos de enteros). Esto utiliza el C Bounded Model Checker (CBMC) y se basa en contratos de funciones y anotaciones de invariantes de bucle en el código fuente. Consulte proofs/cbmc para más detalles.
Todo el ensamblador AArch64 y x86_64 está demostrado como funcionalmente correcto, seguro en memoria y con temporización independiente del secreto (tiempo constante), a nivel de código objeto. Esto utiliza el demostrador de teoremas interactivo HOL-Light y la infraestructura de verificación s2n-bignum (que incluye modelos de las partes relevantes de las arquitecturas Arm y x86). Consulte proofs/hol_light para más detalles.
NOTA: La verificación formal nunca es absoluta. Consulte SOUNDNESS.md para un análisis detallado del alcance, las suposiciones y los riesgos de los esfuerzos de verificación formal en torno a mlkem-native.
Todo el ensamblador AArch64 y x86_64 en mlkem-native está formalmente demostrado en HOL Light como libre de flujo de control dependiente del secreto, patrones de acceso a memoria e instrucciones de latencia variable, frustrando la mayoría de los canales laterales de temporización (consulte proofs/hol_light para más detalles). El código C está endurecido contra canales laterales de temporización introducidos por el compilador (como KyberSlash6 o clangover7) mediante barreras adecuadas y patrones de tiempo constante.
La ausencia de ramas dependientes del secreto, patrones de acceso a memoria e instrucciones de latencia variable también se prueba usando valgrind
con varias combinaciones de compiladores y opciones de compilación.
Otros ataques. mlkem-native solo tiene como objetivo la resistencia contra canales laterales de temporización. Otras clases de ataques, como canales laterales de potencia y electromagnéticos, canales laterales microarquitectónicos (por ejemplo, ejecución especulativa) o ataques de inyección de fallos, están actualmente fuera de alcance.
mlkem-native se divide en un frontend y dos backends para aritmética y FIPS202 / SHA3. El frontend es fijo, está escrito en C y cubre todas las rutinas que no son críticas para el rendimiento. Los backends son flexibles, se encargan de las rutinas sensibles al rendimiento y pueden implementarse en C o código nativo (ensamblador/intrínsecos); consulte mlkem/src/native/api.h para el backend aritmético y mlkem/src/fips202/native/api.h para el backend FIPS-202.
mlkem-native ofrece actualmente los siguientes backends:
Si desea contribuir con nuevos backends, póngase en contacto o simplemente abra un PR.
Nuestro ensamblador AArch64 se desarrolla usando el superoptimizador SLOTHY, siguiendo el enfoque descrito en el artículo de SLOTHY8: Escribimos ensamblador 'limpio' a mano y automatizamos micro-optimizaciones (por ejemplo, consulte el NTT AArch64 limpio vs optimizado). Consulte dev/README.md para más detalles.
mlkem-native se prueba contra todos los vectores de prueba oficiales ACVP ML-KEM9 y los vectores de prueba ML-KEM de Wycheproof10.
Puede ejecutar las pruebas ACVP usando el script tests o el cliente ACVP directamente:
# 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
Puede ejecutar las pruebas Wycheproof10 usando el script tests o el cliente Wycheproof directamente:
# Using the tests script
./scripts/tests wycheproof
# Using the Wycheproof client directly
python3 ./test/wycheproof/wycheproof_client.py
Puede medir el rendimiento, el uso de memoria y el tamaño del binario usando el script 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
Para resultados de benchmark de CI y datos históricos de rendimiento, consulte la página de benchmarking.
Si desea usar mlkem-native, importe mlkem en el árbol de fuentes de su proyecto y compile usando su sistema de compilación favorito. Consulte mlkem para más información, y examples/basic para un ejemplo sencillo. El sistema de compilación proporcionado en este repositorio es solo para fines de desarrollo.
Consulte API-CONVENTIONS.md para las convenciones que se aplican a todas las funciones públicas, como valores de retorno, validez de punteros y el estado de los buffers de salida en caso de error.
mlkem-native depende de una implementación de FIPS-20211 e incluye una. Si su biblioteca tiene su propia implementación de FIPS-202, puede usarla en lugar de la que se incluye con mlkem-native. Consulte FIPS202.md, y examples/bring_your_own_fips202 para un ejemplo que usa tiny_sha312.
No. Si desea una compilación solo en C, simplemente omita los directorios mlkem/src/native y/o mlkem/src/fips202/native de su importación
y desactive MLK_CONFIG_USE_NATIVE_BACKEND_ARITH y/o MLK_CONFIG_USE_NATIVE_BACKEND_FIPS202 en su mlkem_native_config.h.
No. Si bien recomendamos que considere usarlo, mlkem-native se compilará y ejecutará correctamente sin CBMC -- solo asegúrese de
incluir cbmc.h y tener CBMC sin definir. En particular, no necesita eliminar todos los contratos de
funciones e invariantes de bucle del código; se ignorarán a menos que CBMC esté definido.
Sí. El nivel de seguridad es un parámetro de tiempo de compilación configurado estableciendo MLK_CONFIG_PARAMETER_SET=512/768/1024 en mlkem_native_config.h.
Si su biblioteca/aplicación requiere múltiples niveles de seguridad, puede compilar y enlazar tres instancias de mlkem-native
mientras comparte código común; esto se denomina 'compilación multinivel' y se demuestra en examples/multilevel_build. Consulte también mlkem.
Sí, puede añadir más backends para la aritmética nativa de ML-KEM y/o para FIPS-202. Siga los backends existentes como plantillas o consulte examples/custom_backend para un ejemplo mínimo de cómo registrar un backend personalizado.
Si cree que ha encontrado un fallo de seguridad en mlkem-native, por favor reporte la vulnerabilidad a través del reporte privado de vulnerabilidades de Github. Por favor, no cree un issue público de GitHub.
Si tiene cualquier otra pregunta / problema no relacionado con seguridad / solicitud de funcionalidad, por favor abra un issue de GitHub.
Si desea ayudarnos a construir mlkem-native, póngase en contacto. Puede contactar al equipo de mlkem-native a través del Discord de PQCA. Consulte también CONTRIBUTING.md.
Estrictamente hablando, dependemos de C90 + stdint.h + unsigned long long de 64 bits. ↩
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 ↩