commonware-cryptography 0.0.63

Generate keys, sign arbitrary messages, and deterministically verify signatures.
Documentation
use commonware_cryptography::bls12381::primitives::{ops, variant::MinSig};
use criterion::{criterion_group, BatchSize, Criterion};
use rand::{thread_rng, Rng};

fn benchmark_aggregate_verify_multiple_public_keys(c: &mut Criterion) {
    let namespace = b"namespace";
    let mut msg = [0u8; 32];
    thread_rng().fill(&mut msg);
    for n in [10, 100, 1000, 10000].into_iter() {
        c.bench_function(&format!("{}/pks={}", module_path!(), n), |b| {
            b.iter_batched(
                || {
                    let mut public_keys = Vec::with_capacity(n);
                    let mut signatures = Vec::with_capacity(n);
                    for _ in 0..n {
                        let (private, public) = ops::keypair::<_, MinSig>(&mut thread_rng());
                        let signature =
                            ops::sign_message::<MinSig>(&private, Some(namespace), &msg);
                        public_keys.push(public);
                        signatures.push(signature);
                    }
                    (
                        public_keys,
                        ops::aggregate_signatures::<MinSig, _>(&signatures),
                    )
                },
                |(public_keys, signature)| {
                    ops::aggregate_verify_multiple_public_keys::<MinSig, _>(
                        &public_keys,
                        Some(namespace),
                        &msg,
                        &signature,
                    )
                    .unwrap();
                },
                BatchSize::SmallInput,
            );
        });
    }
}

criterion_group! {
    name = benches;
    config = Criterion::default().sample_size(10);
    targets = benchmark_aggregate_verify_multiple_public_keys
}