diff --git a/bench/Cargo.toml b/bench/Cargo.toml index 98d002e442..4effb42731 100644 --- a/bench/Cargo.toml +++ b/bench/Cargo.toml @@ -16,9 +16,9 @@ harness = false path = "aead.rs" [[bench]] -name = "x25519" +name = "agreement" harness = false -path = "x25519.rs" +path = "agreement.rs" [[bench]] name = "ecdsa" diff --git a/bench/agreement.rs b/bench/agreement.rs new file mode 100644 index 0000000000..e3f88d49dd --- /dev/null +++ b/bench/agreement.rs @@ -0,0 +1,84 @@ +// Copyright 2015-2023 Brian Smith. +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted, provided that the above +// copyright notice and this permission notice appear in all copies. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +#![allow(missing_docs)] + +use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion}; +use ring::{ + agreement::{self, EphemeralPrivateKey, UnparsedPublicKey}, + rand, +}; + +static ALGORITHMS: &[(&str, &agreement::Algorithm)] = &[ + ("p256", &agreement::ECDH_P256), + ("p384", &&agreement::ECDH_P384), + ("x25519", &&agreement::X25519), +]; + +fn generate_key(c: &mut Criterion) { + for (alg_name, alg) in ALGORITHMS { + c.bench_function(&bench_name(alg_name, "generate_key"), |b| { + let rng = rand::SystemRandom::new(); + b.iter(|| { + let private_key = EphemeralPrivateKey::generate(alg, &rng).unwrap(); + let _r = black_box(private_key); + }) + }); + } +} + +fn compute_public_key(c: &mut Criterion) { + for (alg_name, alg) in ALGORITHMS { + c.bench_function(&bench_name(alg_name, "compute_public_key"), |b| { + let rng = rand::SystemRandom::new(); + let my_private_key = EphemeralPrivateKey::generate(alg, &rng).unwrap(); + b.iter(|| { + let public_key = my_private_key.compute_public_key(); + let _r = black_box(public_key); + }) + }); + } +} + +fn agree_ephemeral(c: &mut Criterion) { + for (alg_name, alg) in ALGORITHMS { + c.bench_function(&bench_name(alg_name, "agree_ephemeral"), |b| { + let rng = rand::SystemRandom::new(); + let peer_public_key = { + let peer_private_key = + agreement::EphemeralPrivateKey::generate(&alg, &rng).unwrap(); + peer_private_key.compute_public_key().unwrap() + }; + let peer_public_key: &[u8] = peer_public_key.as_ref(); + + b.iter_batched( + || EphemeralPrivateKey::generate(alg, &rng).unwrap(), + |my_private_key| { + let peer_public_key = UnparsedPublicKey::new(alg, peer_public_key); + agreement::agree_ephemeral(my_private_key, &peer_public_key, |key_material| { + black_box(key_material); + }) + .unwrap(); + }, + BatchSize::LargeInput, + ) + }); + } +} + +fn bench_name(alg_name: &str, bench_name: &str) -> String { + format!("{}_{}", alg_name, bench_name) +} + +criterion_group!(agreement, generate_key, compute_public_key, agree_ephemeral); +criterion_main!(agreement); diff --git a/bench/x25519.rs b/bench/x25519.rs deleted file mode 100644 index 057ffac608..0000000000 --- a/bench/x25519.rs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright 2015-2023 Brian Smith. -// -// Permission to use, copy, modify, and/or distribute this software for any -// purpose with or without fee is hereby granted, provided that the above -// copyright notice and this permission notice appear in all copies. -// -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES -// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY -// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION -// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. -#![allow(missing_docs)] - -use criterion::{black_box, criterion_group, criterion_main, BatchSize, Criterion}; -use ring::{ - agreement::{self, EphemeralPrivateKey, UnparsedPublicKey, X25519}, - rand, -}; - -fn generate_key(c: &mut Criterion) { - c.bench_function("x25519_generate_key", |b| { - let rng = rand::SystemRandom::new(); - b.iter(|| { - let private_key = EphemeralPrivateKey::generate(&X25519, &rng).unwrap(); - let _r = black_box(private_key); - }) - }); -} - -fn compute_public_key(c: &mut Criterion) { - c.bench_function("x25519_compute_public_key", |b| { - let rng = rand::SystemRandom::new(); - let my_private_key = EphemeralPrivateKey::generate(&X25519, &rng).unwrap(); - b.iter(|| { - let public_key = my_private_key.compute_public_key(); - let _r = black_box(public_key); - }) - }); -} - -fn agree_ephemeral(c: &mut Criterion) { - c.bench_function("x25519_agree_ephemeral", |b| { - let rng = rand::SystemRandom::new(); - let peer_public_key: [u8; 32] = rand::generate(&rng).unwrap().expose(); - - b.iter_batched( - || EphemeralPrivateKey::generate(&X25519, &rng).unwrap(), - |my_private_key| { - let peer_public_key = UnparsedPublicKey::new(&X25519, &peer_public_key); - agreement::agree_ephemeral(my_private_key, &peer_public_key, |key_material| { - black_box(<[u8; 32]>::try_from(key_material).unwrap()) - }) - .unwrap(); - }, - BatchSize::LargeInput, - ) - }); -} - -criterion_group!(x25519, generate_key, compute_public_key, agree_ephemeral); -criterion_main!(x25519);