From b7dfaf1a42f1d6d1940ea35e03e7a7bf38c30d6d Mon Sep 17 00:00:00 2001 From: eschorn1 Date: Sun, 24 Mar 2024 18:14:41 -0500 Subject: [PATCH] dudect prep --- dudect/Cargo.toml | 16 +++++++-- dudect/README.md | 32 ++--------------- dudect/src/main.rs | 87 ++++++++++++++-------------------------------- 3 files changed, 44 insertions(+), 91 deletions(-) diff --git a/dudect/Cargo.toml b/dudect/Cargo.toml index 3a910b3..fbdb39e 100644 --- a/dudect/Cargo.toml +++ b/dudect/Cargo.toml @@ -8,9 +8,10 @@ license = "MIT OR Apache-2.0" [dependencies] -fips203 = { path = ".." } -rand_core = { version = "0.6.4", default-features = false } +fips203 = { path = "..", default-features = false, features = ["ml-kem-512"] } dudect-bencher = "0.6" +rand_chacha = { version = "0.3.1", default-features = false } +rand_core = { version = "0.6.4", default-features = false } [profile.bench] @@ -20,3 +21,14 @@ incremental = false lto = true opt-level = 3 overflow-checks = false +codegen-units = 1 + + +[profile.release] +debug = true +debug-assertions = false +incremental = false +lto = true +opt-level = 3 +overflow-checks = false +codegen-units = 1 diff --git a/dudect/README.md b/dudect/README.md index 46d810c..2302168 100644 --- a/dudect/README.md +++ b/dudect/README.md @@ -1,37 +1,11 @@ -An example constant-time workbench, not particularly definitive. +An example constant-time workbench. It is not particularly definitive as it is +rather sensitive to configuration & defaults. See ~~~ $ cd dudect # this directory +$ RUSTFLAGS="-C target-cpu=native" cargo run --release -- --continuous full_flow -$ cargo run --release -- --continuous encaps -running 1 benchmark continuously -bench encaps seeded with 0x27391b59854589bd -bench encaps ... : n == +0.000M, max t = +1.81314, max tau = +0.17528, (5/tau)^2 = 813 -bench encaps ... : n == +0.000M, max t = +1.86948, max tau = +0.09430, (5/tau)^2 = 2811 -bench encaps ... : n == +0.001M, max t = +1.94892, max tau = +0.08010, (5/tau)^2 = 3896 -bench encaps ... : n == +0.001M, max t = +2.76896, max tau = +0.09852, (5/tau)^2 = 2575 -bench encaps ... : n == +0.001M, max t = +3.13701, max tau = +0.10895, (5/tau)^2 = 2106 -bench encaps ... : n == +0.001M, max t = +2.91492, max tau = +0.09255, (5/tau)^2 = 2918 -bench encaps ... : n == +0.001M, max t = +3.21354, max tau = +0.08635, (5/tau)^2 = 3352 -bench encaps ... : n == +0.002M, max t = +3.24153, max tau = +0.08158, (5/tau)^2 = 3756 -bench encaps ... : n == +0.002M, max t = +3.36906, max tau = +0.07992, (5/tau)^2 = 3913 -... - - -$ cargo run --release -- --continuous decaps -running 1 benchmark continuously -bench decaps seeded with 0xec16eb4047bd7590 -bench decaps ... : n == +0.000M, max t = -1.12523, max tau = -0.11252, (5/tau)^2 = 1974 -bench decaps ... : n == +0.000M, max t = -1.68228, max tau = -0.16994, (5/tau)^2 = 865 -bench decaps ... : n == +0.001M, max t = +1.55089, max tau = +0.06353, (5/tau)^2 = 6194 -bench decaps ... : n == +0.001M, max t = +2.16336, max tau = +0.07668, (5/tau)^2 = 4252 -bench decaps ... : n == +0.001M, max t = +2.23635, max tau = +0.07090, (5/tau)^2 = 4973 -bench decaps ... : n == +0.001M, max t = +3.04987, max tau = +0.08826, (5/tau)^2 = 3209 -bench decaps ... : n == +0.001M, max t = +3.73292, max tau = +0.09998, (5/tau)^2 = 2500 -bench decaps ... : n == +0.002M, max t = +3.84010, max tau = +0.09618, (5/tau)^2 = 2702 -bench decaps ... : n == +0.002M, max t = +3.64249, max tau = +0.08602, (5/tau)^2 = 3378 -... ~~~ diff --git a/dudect/src/main.rs b/dudect/src/main.rs index e8543a4..f26e816 100644 --- a/dudect/src/main.rs +++ b/dudect/src/main.rs @@ -1,18 +1,20 @@ use dudect_bencher::{BenchRng, Class, ctbench_main, CtRunner}; use fips203::ml_kem_512; -use fips203::traits::{Decaps, Encaps, KeyGen}; -use rand_core::{CryptoRng, RngCore}; - // Could also be ml_kem_768 or ml_kem_1024. -use crate::ml_kem_512::{CipherText, DecapsKey, EncapsKey}; - +//use fips203::traits::{Decaps, Encaps, KeyGen, SerDes}; +use fips203::traits::KeyGen; +//use rand_chacha::rand_core::SeedableRng; +use rand_core::{CryptoRng, RngCore}; // Dummy RNG that regurgitates zeros when 'asked' -struct MyRng(); +#[derive(Copy, Clone)] +struct MyRng { + value: u8, +} impl RngCore for MyRng { fn next_u32(&mut self) -> u32 { unimplemented!() } fn next_u64(&mut self) -> u64 { unimplemented!() } - fn fill_bytes(&mut self, out: &mut [u8]) { out.iter_mut().for_each(|b| *b = 0); } + fn fill_bytes(&mut self, out: &mut [u8]) { out.iter_mut().for_each(|b| *b = self.value); } fn try_fill_bytes(&mut self, out: &mut [u8]) -> Result<(), rand_core::Error> { self.fill_bytes(out); Ok(()) @@ -20,68 +22,33 @@ impl RngCore for MyRng { } impl CryptoRng for MyRng {} +fn full_flow(runner: &mut CtRunner, mut _rng: &mut BenchRng) { + const ITERATIONS_INNER: usize = 5; + const ITERATIONS_OUTER: usize = 2_000; -fn encaps(runner: &mut CtRunner, mut _rng: &mut BenchRng) { - const ITERATIONS_OUTER: usize = 100; - const ITERATIONS_INNER: usize = 100; - - let (ek1, _dk1) = ml_kem_512::KG::try_keygen_vt().unwrap(); - let (ek2, _dk2) = ml_kem_512::KG::try_keygen_vt().unwrap(); - - let mut inputs: Vec = Vec::new(); - let mut classes = Vec::new(); - - for _ in 0..ITERATIONS_OUTER { - inputs.push(ek1.clone()); - classes.push(Class::Left); - } - - for _ in 0..ITERATIONS_OUTER { - inputs.push(ek2.clone()); - classes.push(Class::Right); - } - - for (class, input) in classes.into_iter().zip(inputs.into_iter()) { - runner.run_one(class, || { - let mut my_rng = MyRng {}; - for _ in 0..ITERATIONS_INNER { - let _ = input.try_encaps_with_rng_vt(&mut my_rng); - } - }) - } -} - - -fn decaps(runner: &mut CtRunner, mut _rng: &mut BenchRng) { - const ITERATIONS_OUTER: usize = 100; - const ITERATIONS_INNER: usize = 100; - - let (ek1, dk1) = ml_kem_512::KG::try_keygen_vt().unwrap(); - let (_ssk, ct1) = ek1.try_encaps_vt().unwrap(); - let (ek2, dk2) = ml_kem_512::KG::try_keygen_vt().unwrap(); - let (_ssk, ct2) = ek2.try_encaps_vt().unwrap(); + let rng_left = MyRng { value: 111 }; //rand_chacha::ChaCha8Rng::seed_from_u64(123); + let rng_right = MyRng { value: 222 }; //rand_chacha::ChaCha8Rng::seed_from_u64(456); - let mut inputs: Vec<(DecapsKey, CipherText)> = Vec::new(); - let mut classes = Vec::new(); + let mut classes = [Class::Right; ITERATIONS_OUTER]; + let mut rng_refs = [&rng_right; ITERATIONS_OUTER]; - for _ in 0..ITERATIONS_OUTER { - inputs.push((dk1.clone(), ct1.clone())); - classes.push(Class::Left); + // Interleave left and right + for i in (0..(ITERATIONS_OUTER)).step_by(2) { + classes[i] = Class::Left; + rng_refs[i] = &rng_left; } - for _ in 0..ITERATIONS_OUTER { - inputs.push((dk2.clone(), ct2.clone())); - classes.push(Class::Right); - } - - for (class, input) in classes.into_iter().zip(inputs.into_iter()) { + for (class, rng_r) in classes.into_iter().zip(rng_refs.iter()) { runner.run_one(class, || { for _ in 0..ITERATIONS_INNER { - let _ = input.0.try_decaps_vt(&input.1); + let mut rng = **rng_r; //(*rng_r).clone(); + let (_ek, _dk) = ml_kem_512::KG::try_keygen_with_rng_vt(&mut rng).unwrap(); + //let (ssk1, ct) = ek.try_encaps_with_rng_vt(&mut rng).unwrap(); + //let ssk2 = dk.try_decaps_vt(&ct).unwrap(); + //assert_eq!(ssk1.into_bytes(), ssk2.into_bytes()); } }) } } - -ctbench_main!(encaps, decaps); +ctbench_main!(full_flow);