Skip to content

Commit

Permalink
dudect prep
Browse files Browse the repository at this point in the history
  • Loading branch information
eschorn1 committed Mar 24, 2024
1 parent f8ab279 commit b7dfaf1
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 91 deletions.
16 changes: 14 additions & 2 deletions dudect/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -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
32 changes: 3 additions & 29 deletions dudect/README.md
Original file line number Diff line number Diff line change
@@ -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 <https://docs.rs/dudect-bencher/latest/dudect_bencher/>

~~~
$ 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
...
~~~
87 changes: 27 additions & 60 deletions dudect/src/main.rs
Original file line number Diff line number Diff line change
@@ -1,87 +1,54 @@
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(())
}
}
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<EncapsKey> = 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);

0 comments on commit b7dfaf1

Please sign in to comment.