4 releases

new 0.0.2-beta.3 Feb 24, 2025
0.0.2-alpha.3 Jul 22, 2024
0.0.2-alpha.1 Jul 2, 2024

#172 in Cryptography

Download history 1957/week @ 2024-10-29 1586/week @ 2024-11-05 1563/week @ 2024-11-12 1489/week @ 2024-11-19 802/week @ 2024-11-26 1381/week @ 2024-12-03 1204/week @ 2024-12-10 1183/week @ 2024-12-17 273/week @ 2024-12-24 391/week @ 2024-12-31 1437/week @ 2025-01-07 1730/week @ 2025-01-14 1636/week @ 2025-01-21 1555/week @ 2025-01-28 1585/week @ 2025-02-04 1518/week @ 2025-02-11

6,418 downloads per month
Used in 5 crates (via libcrux-kem)

Apache-2.0

1MB
20K SLoC

ML-KEM

This crate implements all three ML-KEM (FIPS 203 (Initial Public Draft)) variants 512, 768, and 1024. It is formally verified using hax and F*.

Functions in this crate use CPU feature detection to pick the most efficient version on each platform. To use a specific version with your own feature detection use e.g. one of the following

  • mlkem768::avx2::generate_key_pair,
  • mlkem768::neon::generate_key_pair,
  • mlkem768::portable::generate_key_pair,

analogously for encapsulation and decapsulation.

 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);

Features

By default, all ML-KEM parameter sets are enabled. If required, they are available individually under feature flags mlkem512, mlkem768, mlkem1024.

The implementation is optimized for the AVX2 and NEON SIMD instruction sets.

Note that the NEON implementation is not yet fully verified.

Kyber Round 3

The kyber flag also gives access to an, as yet, unverified implementation of Kyber as submitted in Round 3 of the NIST PQ competition.

Verification

verified

Please refer to this file for detail on the verification of this crate.

Dependencies