
Implémentation pure en Rust du projet de norme FIPS 203 Module-Lattice-based Key-Encapsulation Mechanism pour applications serveur, desktop, navigateur et embarquées.
FIPS 203 (projet initial public) — Norme de mécanisme d'encapsulation de clé à base de treillis modulaires, écrite en Rust pur pour les applications serveur, de bureau, navigateur et embarquées. Le dépôt source comprend des exemples illustrant le benchmarking, une cible embarquée, des mesures statistiques à temps constant, le fuzzing, l'exécution WASM, la FFI C et des liaisons Python.
Ce crate implémente la norme projet FIPS 203 en Rust pur avec des dépendances minimales et courantes, et sans aucun code unsafe. Les trois ensembles de paramètres de sécurité sont entièrement pris en charge et testés. L'implémentation fonctionne à temps constant (en dehors de rho, qui fait partie de la clé d'encapsulation envoyée en clair à travers la frontière de confiance), ne nécessite pas la bibliothèque standard, par ex. #[no_std], ne fait aucune allocation sur le tas, par ex. pas besoin d'alloc, et expose optionnellement le RNG afin de convenir à toute la gamme d'applications jusqu'au bare-metal. L'API est stabilisée et le code est fortement orienté vers la sécurité et l'exactitude ; d'autres optimisations de performances seront mises en œuvre à mesure que la norme mûrira. Ce crate suivra rapidement toute modification de FIPS 203 dès qu'elle sera disponible.
Voir https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.ipd.pdf pour une description complète de la fonctionnalité visée.
La fonctionnalité est extrêmement simple à utiliser, comme le montre l'exemple suivant.
// 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 documentation Rust se trouve sous chaque module correspondant au paramètre de sécurité souhaité ci-dessous.
dudect.RNG exposé.Le contenu est distribué sous licence Apache License Version 2.0 ou licence MIT, à votre choix.
Sauf indication contraire explicite de votre part, toute contribution soumise intentionnellement pour inclusion dans l'œuvre, telle que définie dans la licence Apache-2.0, sera doublement concédée sous licence comme ci-dessus, sans conditions ni modalités supplémentaires.