Skip to content

Commit 2aadb8f

Browse files
TrAyZeNkingofpayne
authored andcommitted
Add dpa microbenchmark
1 parent 5c44fb8 commit 2aadb8f

File tree

3 files changed

+76
-2
lines changed

3 files changed

+76
-2
lines changed

Cargo.toml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,7 @@ harness = false
3636
[[bench]]
3737
name = "snr"
3838
harness = false
39+
40+
[[bench]]
41+
name = "dpa"
42+
harness = false

benches/dpa.rs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};
2+
use muscat::dpa::{dpa, Dpa};
3+
use muscat::leakage::sbox;
4+
use ndarray::{Array1, Array2};
5+
use ndarray_rand::rand::{rngs::StdRng, SeedableRng};
6+
use ndarray_rand::rand_distr::Uniform;
7+
use ndarray_rand::RandomExt;
8+
9+
fn selection_function(metadata: Array1<u8>, guess: usize) -> usize {
10+
sbox(metadata[1] ^ guess as u8).into()
11+
}
12+
13+
fn dpa_sequential(leakages: &Array2<f32>, plaintexts: &Array2<u8>) -> Dpa<Array1<u8>> {
14+
let mut dpa = Dpa::new(leakages.shape()[1], 256, selection_function);
15+
16+
for i in 0..leakages.shape()[0] {
17+
dpa.update(leakages.row(i), plaintexts.row(i).to_owned());
18+
}
19+
20+
dpa.finalize();
21+
22+
dpa
23+
}
24+
25+
fn dpa_parallel(leakages: &Array2<f32>, plaintexts: &Array2<u8>) -> Dpa<Array1<u8>> {
26+
dpa(
27+
leakages.view(),
28+
plaintexts
29+
.rows()
30+
.into_iter()
31+
.map(|x| x.to_owned())
32+
.collect::<Array1<Array1<u8>>>()
33+
.view(),
34+
256,
35+
selection_function,
36+
500,
37+
)
38+
}
39+
40+
fn bench_dpa(c: &mut Criterion) {
41+
// Seed rng to get the same output each run
42+
let mut rng = StdRng::seed_from_u64(0);
43+
44+
let mut group = c.benchmark_group("dpa");
45+
46+
group.measurement_time(std::time::Duration::from_secs(60));
47+
48+
for nb_traces in [1000, 2000, 5000].into_iter() {
49+
let leakages = Array2::random_using((nb_traces, 5000), Uniform::new(-2., 2.), &mut rng);
50+
let plaintexts =
51+
Array2::random_using((nb_traces, 16), Uniform::new_inclusive(0, 255), &mut rng);
52+
53+
group.bench_with_input(
54+
BenchmarkId::new("sequential", nb_traces),
55+
&(&leakages, &plaintexts),
56+
|b, (leakages, plaintexts)| b.iter(|| dpa_sequential(leakages, plaintexts)),
57+
);
58+
59+
group.bench_with_input(
60+
BenchmarkId::new("parallel", nb_traces),
61+
&(&leakages, &plaintexts),
62+
|b, (leakages, plaintexts)| b.iter(|| dpa_parallel(leakages, plaintexts)),
63+
);
64+
}
65+
66+
group.finish();
67+
}
68+
69+
criterion_group!(benches, bench_dpa);
70+
criterion_main!(benches);

examples/dpa.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use anyhow::Result;
22
use indicatif::ProgressIterator;
3-
use muscat::dpa::*;
3+
use muscat::dpa::Dpa;
44
use muscat::leakage::sbox;
55
use muscat::util::read_array2_from_npy_file;
6-
use ndarray::*;
6+
use ndarray::{s, Array1, Array2};
77
use rayon::iter::{ParallelBridge, ParallelIterator};
88

99
// traces format

0 commit comments

Comments
 (0)