1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
//! Development-related functionality
pub use blobby;
mod fixed;
mod mac;
mod rng;
mod variable;
mod xof;
pub use fixed::*;
pub use mac::*;
pub use variable::*;
pub use xof::*;
/// Define hash function test
#[macro_export]
#[cfg_attr(docsrs, doc(cfg(feature = "dev")))]
macro_rules! new_test {
($name:ident, $test_name:expr, $hasher:ty, $test_func:ident $(,)?) => {
#[test]
fn $name() {
use digest::dev::blobby::Blob2Iterator;
let data = include_bytes!(concat!("data/", $test_name, ".blb"));
for (i, row) in Blob2Iterator::new(data).unwrap().enumerate() {
let [input, output] = row.unwrap();
if let Some(desc) = $test_func::<$hasher>(input, output) {
panic!(
"\n\
Failed test №{}: {}\n\
input:\t{:?}\n\
output:\t{:?}\n",
i, desc, input, output,
);
}
}
}
};
}
/// Define [`Update`][crate::Update] impl benchmark
#[macro_export]
#[cfg_attr(docsrs, doc(cfg(feature = "dev")))]
macro_rules! bench_update {
(
$init:expr;
$($name:ident $bs:expr;)*
) => {
$(
#[bench]
fn $name(b: &mut Bencher) {
let mut d = $init;
let data = [0; $bs];
b.iter(|| {
digest::Update::update(&mut d, &data[..]);
});
b.bytes = $bs;
}
)*
};
}
/// Feed ~1 MiB of pseudorandom data to an updatable state.
pub fn feed_rand_16mib<D: crate::Update>(d: &mut D) {
let buf = &mut [0u8; 1024];
let mut rng = rng::RNG;
let n = 16 * (1 << 20) / buf.len();
for _ in 0..n {
rng.fill(buf);
d.update(buf);
// additional byte, so size of fed data
// will not be multiple of block size
d.update(&[42]);
}
}
|