
Reine Rust-Implementierung des (Entwurfs) FIPS 203 Module-Lattice-based Key-Encapsulation Mechanism Standard für Server-, Desktop-, Browser- und eingebettete Anwendungen.
Der FIPS 203 (Erster öffentlicher Entwurf) ist ein Standard für modul-gitterbasierte Schlüsselverkapselungsmechanismen, geschrieben in reinem Rust für Server-, Desktop-, Browser- und eingebettete Anwendungen. Das Quell-Repository enthält Beispiele, die Benchmarking, ein eingebettetes Ziel, statistische Constant-Time-Messungen, Fuzzing, WASM-Ausführung, C-FFI- und Python-Bindungen demonstrieren.
Dieses Crate implementiert den Entwurf des FIPS-203-Standards in reinem Rust mit minimalen und gängigen Abhängigkeiten, und
zwar ohne jeglichen unsicheren Code. Alle drei Sicherheitsparametersätze werden vollständig unterstützt und getestet. Die Implementierung arbeitet
in konstanter Zeit (außerhalb von rho, das Bestandteil des Verkapselungsschlüssels ist, der in Klartext über die Vertrauensgrenze gesendet wird),
benötigt keine Standardbibliothek, z. B. #[no_std], hat keine Heap-Allokationen, z. B. kein alloc nötig, und stellt optional
den RNG bereit, sodass sie für das gesamte Anwendungsspektrum bis hinunter zur Bare-Metal-Programmierung geeignet ist. Die API ist stabilisiert
und der Code ist stark auf Sicherheit und Korrektheit ausgerichtet; weitere Leistungsoptimierungen werden implementiert,
sobald der Standard reift. Dieses Crate wird etwaigen Änderungen an FIPS 203 schnell folgen, sobald sie verfügbar sind.
Siehe https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.ipd.pdf für eine vollständige Beschreibung der angestrebten Funktionalität.
Die Funktionalität ist äußerst einfach zu verwenden, wie das folgende Beispiel zeigt.
// 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);
Die Rust-Dokumentation befindet sich unter jedem Modul, das dem gewünschten Sicherheitsparameter unten entspricht.
dudect-Tests.RNG.Die Inhalte sind wahlweise unter der Apache License Version 2.0 oder der MIT-Lizenz lizenziert.
Sofern Sie nicht ausdrücklich etwas anderes erklären, wird jeder von Ihnen absichtlich zur Aufnahme in das Werk eingereichte Beitrag, wie in der Apache-2.0-Lizenz definiert, unter denselben Bedingungen wie oben dual lizenziert, ohne zusätzliche Bedingungen oder Klauseln.