
Implementación en Rust puro del borrador del estándar FIPS 203 Module-Lattice-based Key-Encapsulation Mechanism para aplicaciones de servidor, escritorio, navegador y embebidas.
El FIPS 203 (Borrador Público Inicial) Estándar de Mecanismo de Encapsulación de Claves Basado en Retículos Modulares está escrito en Rust puro para aplicaciones de servidor, escritorio, navegador y embebidas. El repositorio fuente incluye ejemplos que demuestran benchmarking, un objetivo embebido, mediciones estadísticas de tiempo constante, fuzzing, ejecución WASM, FFI de C y enlaces de Python.
Esta crate implementa el estándar borrador FIPS 203 en Rust puro con dependencias mínimas y convencionales, y sin ningún código inseguro. Los tres conjuntos de parámetros de seguridad están completamente soportados y probados. La implementación opera en tiempo constante (fuera de rho, que es parte de la clave de encapsulación enviada a través del límite de confianza en claro), no requiere la biblioteca estándar, p. ej. #[no_std], no tiene asignaciones en el montículo, p. ej. no necesita alloc, y opcionalmente expone el RNG, por lo que es adecuado para toda la gama de aplicaciones hasta el metal desnudo. La API está estabilizada y el código está fuertemente orientado hacia la seguridad y la corrección; se implementarán más optimizaciones de rendimiento a medida que el estándar madure. Esta crate seguirá rápidamente cualquier cambio en FIPS 203 a medida que estén disponibles.
Consulte https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.ipd.pdf para obtener una descripción completa de la funcionalidad objetivo.
La funcionalidad es extremadamente sencilla de usar, como se demuestra en el siguiente ejemplo.
// Use the desired target parameter set.
use fips203::ml_kem_512; // Could also be ml_kem_768 or ml_kem_1024.
use fips203::traits::{Decaps, Encaps, KeyGen, SerDes};
// Alice runs `try_keygen()` and then serializes the encaps key `ek` for Bob (to bytes).
let (alice_ek, alice_dk) = ml_kem_512::KG::try_keygen().unwrap();
let alice_ek_bytes = alice_ek.into_bytes();
// Alice sends the encaps key `ek_bytes` to Bob.
let bob_ek_bytes = alice_ek_bytes;
// Bob deserializes the encaps `ek_bytes` and then runs `encaps() to get the shared
// secret `ssk` and ciphertext `ct`. He serializes the ciphertext `ct` for Alice (to bytes).
let bob_ek = ml_kem_512::EncapsKey::try_from_bytes(bob_ek_bytes).unwrap();
let (bob_ssk_bytes, bob_ct) = bob_ek.try_encaps().unwrap();
let bob_ct_bytes = bob_ct.into_bytes();
// Bob sends the ciphertext `ct_bytes` to Alice
let alice_ct_bytes = bob_ct_bytes;
// Alice deserializes the ciphertext `ct` and runs `decaps()` with her decaps key
let alice_ct = ml_kem_512::CipherText::try_from_bytes(alice_ct_bytes).unwrap();
let alice_ssk_bytes = alice_dk.try_decaps(&alice_ct).unwrap();
// Alice and Bob will now have the same secret key
assert_eq!(bob_ssk_bytes, alice_ssk_bytes);
La Documentación de Rust se encuentra en cada Módulo correspondiente al parámetro de seguridad deseado a continuación.
dudect.RNG expuesto.Los contenidos están licenciados bajo la Licencia Apache Versión 2.0 o la licencia MIT a su elección.
A menos que indique explícitamente lo contrario, cualquier contribución enviada intencionalmente para su inclusión en el trabajo por usted, según lo definido en la licencia Apache-2.0, se licenciará de forma dual como se indica arriba, sin términos ni condiciones adicionales.