// 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);