
Чистая реализация на Rust (черновика) стандарта FIPS 203 Module-Lattice-based Key-Encapsulation Mechanism для серверных, настольных, браузерных и встраиваемых приложений.
Стандарт FIPS 203 (первый публичный проект) механизма инкапсуляции ключей на основе модульных решёток, написанный на чистом Rust для серверных, настольных, браузерных и встраиваемых приложений. Репозиторий исходного кода включает примеры, демонстрирующие бенчмаркинг, встраиваемую цель, статистические измерения константного времени, фаззинг, выполнение WASM, C FFI и привязки Python.
Этот крейт реализует проект стандарта FIPS 203 на чистом Rust с минимальными и распространёнными зависимостями и без какого-либо небезопасного кода. Все три набора параметров безопасности полностью поддерживаются и протестированы. Реализация работает в константном времени (за исключением rho, которая является частью ключа инкапсуляции, передаваемого через границу доверия в открытом виде), не требует стандартной библиотеки, например #[no_std], не выполняет выделений в куче, например не нуждается в alloc, и опционально предоставляет доступ к RNG, поэтому она подходит для полного спектра приложений вплоть до bare-metal. API стабилизирован, и код в значительной степени ориентирован на безопасность и корректность; дальнейшие оптимизации производительности будут реализованы по мере развития стандарта. Этот крейт будет быстро адаптироваться к любым изменениям FIPS 203 по мере их появления.
См. https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.ipd.pdf для полного описания целевой функциональности.
Функциональность чрезвычайно проста в использовании, как показано в следующем примере.
// 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);
Документация по Rust Documentation находится в каждом модуле, соответствующем требуемому параметру безопасности ниже.
dudect.RNG.Содержимое лицензировано на условиях либо Apache License Version 2.0, либо лицензии MIT на ваше усмотрение.
Если вы явно не укажете иное, любой вклад, преднамеренно предоставленный вами для включения в работу, как определено в лицензии Apache-2.0, будет лицензирован на условиях двойной лицензии, как указано выше, без каких-либо дополнительных условий.