
Implementação pura em Rust do padrão (draft) FIPS 203 Module-Lattice-based Key-Encapsulation Mechanism para aplicações de servidor, desktop, navegador e embarcadas.
FIPS 203 (Rascunho Público Inicial) Padrão de Mecanismo de Encapsulamento de Chave Baseado em Reticulados Modulares escrito em Rust puro para aplicações de servidor, desktop, navegador e embarcadas. O repositório de origem inclui exemplos demonstrando benchmarks, um alvo embarcado, medições estatísticas de tempo constante, fuzzing, execução WASM, FFI em C e bindings Python.
Este crate implementa o padrão rascunho do FIPS 203 em Rust puro com dependências mínimas e convencionais, e sem nenhum código inseguro. Todos os três conjuntos de parâmetros de segurança são totalmente suportados e testados. A implementação opera em tempo constante (exceto rho, que faz parte da chave de encapsulamento enviada através da fronteira de confiança em claro), não requer a biblioteca padrão, por exemplo #[no_std], não possui alocações no heap, por exemplo, não precisa de alloc, e opcionalmente expõe a RNG, tornando-a adequada para toda a gama de aplicações até bare-metal. A API está estabilizada e o código é fortemente voltado para segurança e correção; otimizações de desempenho adicionais serão implementadas à medida que o padrão amadurecer. Este crate seguirá rapidamente quaisquer mudanças no FIPS 203 assim que estiverem disponíveis.
Consulte https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.ipd.pdf para uma descrição completa da funcionalidade alvo.
A funcionalidade é extremamente simples de usar, como demonstrado pelo exemplo a seguir.
// 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);
A Documentação em Rust está disponível em cada Módulo correspondente ao parâmetro de segurança desejado abaixo.
dudect.RNG exposta.O conteúdo é licenciado sob a Licença Apache Versão 2.0 ou a licença MIT à sua escolha.
Salvo indicação explícita em contrário, qualquer contribuição intencionalmente submetida para inclusão no trabalho por você, conforme definido na licença Apache-2.0, será licenciada duplamente como acima, sem quaisquer termos ou condições adicionais.