-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
3 changed files
with
44 additions
and
91 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
... | ||
~~~ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); |