3个版本

0.0.2-alpha.32024年7月22日
0.0.2-alpha.12024年7月2日

466密码学

Download history 106/week @ 2024-06-26 100/week @ 2024-07-03 7/week @ 2024-07-10 250/week @ 2024-07-17 241/week @ 2024-07-24 33/week @ 2024-07-31 117/week @ 2024-08-07

每月下载量642
3 个crate中使用(通过 libcrux-kem

Apache-2.0

1MB
14K SLoC

ML-KEM

该crate实现了所有三种ML-KEM(FIPS 203(初始公开草案))变体512、768和1024。它使用haxF*进行正式验证。

此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参数集都启用。如有需要,它们可以在功能标志mlkem512mlkem768mlkem1024下单独使用。

除了已验证的ML-KEM变体实现外,功能标志pre-verification还提供了对尚未验证的ML-KEM实现(针对SIMD指令集进行优化)的访问。

Kyber第3轮

kyber标志(与pre-verification结合)还提供了对NIST PQ比赛第3轮提交的Kyber尚未验证实现的访问。

依赖关系