
Implementazione in Rust puro dello standard (bozza) FIPS 203 per il meccanismo di incapsulamento delle chiavi basato su reticoli modulari, per applicazioni server, desktop, browser ed embedded.
Il FIPS 203 (bozza pubblica iniziale) Standard per meccanismo di incapsulamento della chiave basato su reticoli modulari è scritto in Rust puro per applicazioni server, desktop, browser ed embedded. Il repository sorgente include esempi che dimostrano benchmark, un target embedded, misurazioni statistiche a tempo costante, fuzzing, esecuzione WASM, FFI C e binding Python.
Questa crate implementa lo standard FIPS 203 in bozza in Rust puro con dipendenze minime e comuni, e senza alcun codice unsafe. Tutti e tre i set di parametri di sicurezza sono completamente supportati e testati. L'implementazione opera a tempo costante (a eccezione di rho, che fa parte della chiave di incapsulamento inviata in chiaro attraverso il confine di fiducia), non richiede la libreria standard, ad es. #[no_std], non ha allocazioni sull'heap, ad es. non è necessario alloc, ed espone opzionalmente l'RNG, così da essere adatta all'intera gamma di applicazioni, fino al bare-metal. L'API è stabilizzata e il codice è fortemente orientato alla sicurezza e alla correttezza; ulteriori ottimizzazioni delle prestazioni saranno implementate man mano che lo standard matura. Questa crate seguirà rapidamente qualsiasi modifica a FIPS 203 non appena disponibile.
Vedi https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.ipd.pdf per una descrizione completa della funzionalità prevista.
La funzionalità è estremamente semplice da usare, come dimostra l'esempio seguente.
// 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 Documentazione Rust si trova in ogni Modulo corrispondente al parametro di sicurezza desiderato, di seguito.
dudect.RNG esposto.I contenuti sono concessi in licenza, a tua scelta, secondo la Apache License Version 2.0 o la MIT license.
Salvo indicazione contraria esplicita, qualsiasi contributo inviato intenzionalmente per l'inclusione nell'opera da parte tua, come definito nella licenza Apache-2.0, sarà concesso in doppia licenza come sopra senza ulteriori termini o condizioni.