3个版本
0.0.2-alpha.3 | 2024年7月22日 |
---|---|
0.0.2-alpha.1 | 2024年7月2日 |
466 在 密码学
每月下载量642
在 3 个crate中使用(通过 libcrux-kem)
1MB
14K SLoC
ML-KEM
该crate实现了所有三种ML-KEM(FIPS 203(初始公开草案))变体512、768和1024。它使用hax和F*进行正式验证。
此crate中的函数使用CPU功能检测来在每个平台上选择最有效的版本。要使用自己的功能检测使用特定版本,例如以下之一
mlkem768::avx2::generate_key_pair
,mlkem768::neon::generate_key_pair
,mlkem768::portable::generate_key_pair
,
类似地为封装和解封装。
use rand::{rngs::OsRng, RngCore};
// Ensure you use good randomness.
// It is not recommended to use OsRng directly!
// Instead it is highly encouraged to use RNGs like NISTs DRBG to account for
// bad system entropy.
fn random_array<const L: usize>() -> [u8; L] {
let mut rng = OsRng;
let mut seed = [0; L];
rng.try_fill_bytes(&mut seed).unwrap();
seed
}
use libcrux_ml_kem::*;
// This example uses ML-KEM 768. The other variants can be used the same way.
// Generate a key pair.
let randomness = random_array();
let key_pair = mlkem768::generate_key_pair(randomness);
// Encapsulating a shared secret to a public key.
let randomness = random_array();
let (ciphertext, shared_secret) = mlkem768::encapsulate(key_pair.public_key(), randomness);
// Decapsulating a shared secret with a private key.
let shared_secret_decapsulated = mlkem768::decapsulate(key_pair.private_key(), &ciphertext);
功能
默认情况下,所有ML-KEM参数集都启用。如有需要,它们可以在功能标志mlkem512
、mlkem768
、mlkem1024
下单独使用。
除了已验证的ML-KEM变体实现外,功能标志pre-verification
还提供了对尚未验证的ML-KEM实现(针对SIMD指令集进行优化)的访问。
Kyber第3轮
kyber
标志(与pre-verification
结合)还提供了对NIST PQ比赛第3轮提交的Kyber尚未验证实现的访问。