Skip to content

Commit 5abb303

Browse files
[cryptography/bls12381] Implement BatchVerify (#915)
1 parent f8d3794 commit 5abb303

7 files changed

Lines changed: 834 additions & 540 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use commonware_cryptography::{bls12381::Bls12381Batch, BatchScheme, Bls12381, Signer};
2+
use criterion::{criterion_group, BatchSize, Criterion};
3+
use rand::{thread_rng, Rng};
4+
use std::hint::black_box;
5+
6+
fn benchmark_batch_verify_multiple_messages(c: &mut Criterion) {
7+
let namespace = b"namespace";
8+
for n_messages in [1, 10, 100, 1000, 10000].into_iter() {
9+
let mut msgs = Vec::with_capacity(n_messages);
10+
for _ in 0..n_messages {
11+
let mut msg = [0u8; 32];
12+
thread_rng().fill(&mut msg);
13+
msgs.push(msg);
14+
}
15+
c.bench_function(&format!("{}/msgs={}", module_path!(), n_messages), |b| {
16+
b.iter_batched(
17+
|| {
18+
let mut batch = Bls12381Batch::new();
19+
let mut signer = Bls12381::new(&mut thread_rng());
20+
for msg in msgs.iter() {
21+
let sig = signer.sign(Some(namespace), msg);
22+
assert!(batch.add(Some(namespace), msg, &signer.public_key(), &sig));
23+
}
24+
batch
25+
},
26+
|batch| {
27+
black_box(batch.verify(&mut thread_rng()));
28+
},
29+
BatchSize::SmallInput,
30+
);
31+
});
32+
}
33+
}
34+
35+
criterion_group!(
36+
name = benches;
37+
config = Criterion::default().sample_size(10);
38+
targets = benchmark_batch_verify_multiple_messages
39+
);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use commonware_cryptography::{bls12381::Bls12381Batch, BatchScheme, Bls12381, Signer};
2+
use criterion::{criterion_group, BatchSize, Criterion};
3+
use rand::{thread_rng, Rng};
4+
use std::hint::black_box;
5+
6+
fn benchmark_batch_verify_multiple_public_keys(c: &mut Criterion) {
7+
let namespace = b"namespace";
8+
let mut msg = [0u8; 32];
9+
thread_rng().fill(&mut msg);
10+
for n_signers in [1, 10, 100, 1000, 10000].into_iter() {
11+
c.bench_function(&format!("{}/pks={}", module_path!(), n_signers), |b| {
12+
b.iter_batched(
13+
|| {
14+
let mut batch = Bls12381Batch::new();
15+
for _ in 0..n_signers {
16+
let mut signer = Bls12381::new(&mut thread_rng());
17+
let sig = signer.sign(Some(namespace), &msg);
18+
assert!(batch.add(Some(namespace), &msg, &signer.public_key(), &sig));
19+
}
20+
batch
21+
},
22+
|batch| {
23+
black_box(batch.verify(&mut thread_rng()));
24+
},
25+
BatchSize::SmallInput,
26+
);
27+
});
28+
}
29+
}
30+
31+
criterion_group!(
32+
name = benches;
33+
config = Criterion::default().sample_size(10);
34+
targets = benchmark_batch_verify_multiple_public_keys
35+
);

cryptography/src/bls12381/benches/bench.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ mod aggregate_public_keys;
44
mod aggregate_signatures;
55
mod aggregate_verify_multiple_messages;
66
mod aggregate_verify_multiple_public_keys;
7+
mod batch_verify_multiple_messages;
8+
mod batch_verify_multiple_public_keys;
79
mod dkg_recovery;
810
mod dkg_reshare_recovery;
911
mod signature_generation;
@@ -20,4 +22,6 @@ criterion_main!(
2022
signature_verification::benches,
2123
aggregate_verify_multiple_messages::benches,
2224
aggregate_verify_multiple_public_keys::benches,
25+
batch_verify_multiple_messages::benches,
26+
batch_verify_multiple_public_keys::benches,
2327
);

cryptography/src/bls12381/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@
99
pub mod dkg;
1010
pub mod primitives;
1111
mod scheme;
12-
pub use scheme::{Bls12381, PrivateKey, PublicKey, Signature};
12+
pub use scheme::{Bls12381, Bls12381Batch, PrivateKey, PublicKey, Signature};

0 commit comments

Comments
 (0)