From e4d952c519a64885564dedbe46e88bfe309efbd7 Mon Sep 17 00:00:00 2001 From: Jonas Schneider-Bensch Date: Thu, 13 Jun 2024 13:09:25 +0200 Subject: [PATCH] Include raw KEM operations in benchmark --- libcrux-psq/benches/psq.rs | 117 +++++++++++++++++++++++++++++++------ 1 file changed, 100 insertions(+), 17 deletions(-) diff --git a/libcrux-psq/benches/psq.rs b/libcrux-psq/benches/psq.rs index da302710b..3381147c9 100644 --- a/libcrux-psq/benches/psq.rs +++ b/libcrux-psq/benches/psq.rs @@ -1,8 +1,9 @@ +use classic_mceliece_rust::{decapsulate_boxed, encapsulate_boxed}; use rand::thread_rng; use std::time::Duration; use criterion::{criterion_group, criterion_main, BatchSize, Criterion}; -pub fn comparisons_key_generation(c: &mut Criterion) { +pub fn comparisons_kem_key_generation(c: &mut Criterion) { let mut rng = thread_rng(); let mut group = c.benchmark_group("PSK-PQ Key Generation"); group.measurement_time(Duration::from_secs(15)); @@ -25,16 +26,96 @@ pub fn comparisons_key_generation(c: &mut Criterion) { }); } -pub fn comparisons_psk_generation(c: &mut Criterion) { +pub fn comparisons_kem_encaps(c: &mut Criterion) { let mut rng = thread_rng(); - let mut group = c.benchmark_group("PSK-PQ Pre-Shared Key Generation"); + let mut group = c.benchmark_group("Raw KEM Encapsulation"); + group.measurement_time(Duration::from_secs(15)); + + group.bench_function("libcrux ML-KEM-768", |b| { + b.iter_batched( + || libcrux_kem::key_gen(libcrux_kem::Algorithm::MlKem768, &mut rng).unwrap(), + |(_sk, pk)| { + let _ = pk.encapsulate(&mut thread_rng()); + }, + BatchSize::SmallInput, + ) + }); + + group.bench_function("libcrux X25519", |b| { + b.iter_batched( + || libcrux_kem::key_gen(libcrux_kem::Algorithm::X25519, &mut rng).unwrap(), + |(_sk, pk)| { + let _ = pk.encapsulate(&mut thread_rng()); + }, + BatchSize::SmallInput, + ) + }); + + group.bench_function("classic_mceliece_rust (mceliece460896f)", |b| { + b.iter_batched( + || classic_mceliece_rust::keypair_boxed(&mut rng), + |(pk, _sk)| { + let _ = encapsulate_boxed(&pk, &mut thread_rng()); + }, + BatchSize::SmallInput, + ) + }); +} + +pub fn comparisons_kem_decaps(c: &mut Criterion) { + let mut rng = thread_rng(); + let mut group = c.benchmark_group("Raw KEM Decapsulation"); + group.measurement_time(Duration::from_secs(15)); + + group.bench_function("libcrux ML-KEM-768", |b| { + b.iter_batched( + || { + let (sk, pk) = + libcrux_kem::key_gen(libcrux_kem::Algorithm::MlKem768, &mut rng).unwrap(); + let (_ss, enc) = pk.encapsulate(&mut rng).unwrap(); + (sk, enc) + }, + |(sk, enc)| enc.decapsulate(&sk), + BatchSize::SmallInput, + ) + }); + + group.bench_function("libcrux X25519", |b| { + b.iter_batched( + || { + let (sk, pk) = + libcrux_kem::key_gen(libcrux_kem::Algorithm::X25519, &mut rng).unwrap(); + let (_ss, enc) = pk.encapsulate(&mut rng).unwrap(); + (sk, enc) + }, + |(sk, enc)| enc.decapsulate(&sk), + BatchSize::SmallInput, + ) + }); + + group.bench_function("classic_mceliece_rust (mceliece460896f)", |b| { + b.iter_batched( + || { + let (pk, sk) = classic_mceliece_rust::keypair_boxed(&mut rng); + let (enc, _ss) = encapsulate_boxed(&pk, &mut rng); + (sk, enc) + }, + |(sk, enc)| decapsulate_boxed(&enc, &sk), + BatchSize::SmallInput, + ) + }); +} + +pub fn comparisons_psk_send(c: &mut Criterion) { + let mut rng = thread_rng(); + let mut group = c.benchmark_group("PSK-PQ Pre-Shared Key Send"); group.measurement_time(Duration::from_secs(15)); group.bench_function("libcrux ML-KEM-768", |b| { b.iter_batched( || libcrux_psq::generate_key_pair(libcrux_psq::Algorithm::MlKem768, &mut rng).unwrap(), |(_sk, pk)| { - let _ = pk.generate_psk( + let _ = pk.send_psk( b"bench context", chrono::Duration::hours(1), &mut thread_rng(), @@ -48,7 +129,7 @@ pub fn comparisons_psk_generation(c: &mut Criterion) { b.iter_batched( || libcrux_psq::generate_key_pair(libcrux_psq::Algorithm::X25519, &mut rng).unwrap(), |(_sk, pk)| { - let _ = pk.generate_psk( + let _ = pk.send_psk( b"bench context", chrono::Duration::hours(1), &mut thread_rng(), @@ -65,7 +146,7 @@ pub fn comparisons_psk_generation(c: &mut Criterion) { .unwrap() }, |(_sk, pk)| { - let _ = pk.generate_psk( + let _ = pk.send_psk( b"bench context", chrono::Duration::hours(1), &mut thread_rng(), @@ -76,9 +157,9 @@ pub fn comparisons_psk_generation(c: &mut Criterion) { }); } -pub fn comparisons_psk_derivation(c: &mut Criterion) { +pub fn comparisons_psk_receive(c: &mut Criterion) { let mut rng = thread_rng(); - let mut group = c.benchmark_group("PSK-PQ Pre-Shared Key Derivation"); + let mut group = c.benchmark_group("PSK-PQ Pre-Shared Key Receive"); group.measurement_time(Duration::from_secs(15)); group.bench_function("libcrux ML-KEM-768", |b| { @@ -89,12 +170,12 @@ pub fn comparisons_psk_derivation(c: &mut Criterion) { .unwrap(); let (_psk, message) = pk - .generate_psk(b"bench context", chrono::Duration::hours(1), &mut rng) + .send_psk(b"bench context", chrono::Duration::hours(1), &mut rng) .unwrap(); (pk, sk, message) }, |(pk, sk, message)| { - let _ = sk.derive_psk(&pk, &message, b"bench context"); + let _ = sk.receive_psk(&pk, &message, b"bench context"); }, BatchSize::SmallInput, ) @@ -108,12 +189,12 @@ pub fn comparisons_psk_derivation(c: &mut Criterion) { .unwrap(); let (_psk, message) = pk - .generate_psk(b"bench context", chrono::Duration::hours(1), &mut rng) + .send_psk(b"bench context", chrono::Duration::hours(1), &mut rng) .unwrap(); (pk, sk, message) }, |(pk, sk, message)| { - let _ = sk.derive_psk(&pk, &message, b"bench context"); + let _ = sk.receive_psk(&pk, &message, b"bench context"); }, BatchSize::SmallInput, ) @@ -129,12 +210,12 @@ pub fn comparisons_psk_derivation(c: &mut Criterion) { .unwrap(); let (_psk, message) = pk - .generate_psk(b"bench context", chrono::Duration::hours(1), &mut rng) + .send_psk(b"bench context", chrono::Duration::hours(1), &mut rng) .unwrap(); (pk, sk, message) }, |(pk, sk, message)| { - let _ = sk.derive_psk(&pk, &message, b"bench context"); + let _ = sk.receive_psk(&pk, &message, b"bench context"); }, BatchSize::SmallInput, ) @@ -142,9 +223,11 @@ pub fn comparisons_psk_derivation(c: &mut Criterion) { } pub fn comparisons(c: &mut Criterion) { - comparisons_key_generation(c); - comparisons_psk_generation(c); - comparisons_psk_derivation(c); + comparisons_kem_key_generation(c); + comparisons_kem_encaps(c); + comparisons_kem_decaps(c); + comparisons_psk_send(c); + comparisons_psk_receive(c); } criterion_group!(benches, comparisons);