diff --git a/Cargo.toml b/Cargo.toml index 38ec059..141ccce 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,3 +13,10 @@ curve25519-dalek = {version="3.0.0", features=["serde"]} sha3 = "0.9.1" bit-vec = "0.6.3" +[dev-dependencies] +criterion = {version="0.3", features=["html_reports"]} + +[[bench]] +name = "fuzzy_tags_benches" +harness = false + diff --git a/benches/fuzzy_tags_benches.rs b/benches/fuzzy_tags_benches.rs new file mode 100644 index 0000000..c067e9e --- /dev/null +++ b/benches/fuzzy_tags_benches.rs @@ -0,0 +1,26 @@ +use criterion::{criterion_group, criterion_main, Criterion, BenchmarkId}; +use fuzzymetatag::FuzzyMetaTagKeyPair; +use std::time::Duration; + +fn benchmark_generate_tag(c: &mut Criterion) { + let mut group = c.benchmark_group("generate_tags"); + group.measurement_time(Duration::new(10,0)); + for gamma in [2,4,8,16,24,32].iter() { + let key = FuzzyMetaTagKeyPair::generate(*gamma as usize); + group.bench_with_input(BenchmarkId::from_parameter(gamma), gamma, |b, _gamma| b.iter(|| { key.public_key.generate_tag() })); + } +} + +fn benchmark_test_tag(c: &mut Criterion) { + let mut group = c.benchmark_group("test_tags"); + group.measurement_time(Duration::new(10,0)); + for gamma in [2,4,8,16,24,32].iter() { + let key = FuzzyMetaTagKeyPair::generate(*gamma as usize); + let tag = key.public_key.generate_tag(); + group.bench_with_input(BenchmarkId::from_parameter(gamma), gamma, |b, _gamma| b.iter(|| { key.detection_key.test_tag(&tag) })); + } +} + + +criterion_group!(benches, benchmark_generate_tag, benchmark_test_tag); +criterion_main!(benches); \ No newline at end of file diff --git a/src/lib.rs b/src/lib.rs index 71e9bea..1a36647 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,3 @@ -#![feature(test)] #![deny(missing_docs)] #![feature(external_doc)] #![doc(include = "../README.md")] @@ -55,9 +54,12 @@ impl FuzzyMetaDetectionKey { let k_i = FuzzyMetaTagKeyPair::h(tag.u, tag.u.mul(x_i), w); // calculate the "original" plaintext - let c_i = match tag.ciphertexts.get(i).unwrap() { - true => 0x01, - false => 0x00, + let c_i = match tag.ciphertexts.get(i) { + Some(true) => 0x01, + Some(false) => 0x00, + _ => 0x00, + // we've run our of ciphertext, it doesn't really matter what we put here, the rest of the test will fail + // since the security of k_i is modelled as a random oracle, (k_i ^ 0) should also be random }; let b_i = k_i ^ c_i; @@ -180,9 +182,7 @@ impl FuzzyMetaTagKeyPair { #[cfg(test)] mod tests { - extern crate test; use crate::FuzzyMetaTagKeyPair; - use test::Bencher; #[test] fn correctness() { @@ -195,13 +195,14 @@ mod tests { } } - #[bench] - fn generate(_b: &mut Bencher) { + #[test] + fn false_postives() { + let gamma = 3; let number_of_messages = 1000; - let key = FuzzyMetaTagKeyPair::generate(3); + let key = FuzzyMetaTagKeyPair::generate(gamma); let mut false_positives = 0; for _i in 0..number_of_messages { - let key2 = FuzzyMetaTagKeyPair::generate(3); + let key2 = FuzzyMetaTagKeyPair::generate(gamma); let tag = key2.public_key.generate_tag(); assert!(key2.detection_key.test_tag(&tag)); if key.detection_key.test_tag(&tag) == true { @@ -210,8 +211,9 @@ mod tests { } println!( "Expected False Positive Rate: {}\nActual False Positive Rate: {}", - (2.0_f64).powi(-3), + (2.0_f64).powi(-(gamma as i32)), (false_positives as f64 / number_of_messages as f64) ); } + }