summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNora Widdecke <nora@sequoia-pgp.org>2020-03-27 15:42:09 +0100
committerNora Widdecke <nora@sequoia-pgp.org>2021-01-14 15:33:35 +0100
commitbd2010d27f3d3b031a9027d0ce2f1fa013679408 (patch)
treec1ff2253c3c849f008b17f5b17583b4bdd13d527
parentb6692510fa6911c8849c5758c11825d4b7803c82 (diff)
openpgp: add use case benchmark for crypto::random
-rw-r--r--openpgp/benches/random.rs68
1 files changed, 64 insertions, 4 deletions
diff --git a/openpgp/benches/random.rs b/openpgp/benches/random.rs
index af8e4b9a..8cbb5854 100644
--- a/openpgp/benches/random.rs
+++ b/openpgp/benches/random.rs
@@ -2,15 +2,75 @@ use criterion::{black_box, criterion_group, criterion_main, AxisScale, Criterion
use sequoia_openpgp::crypto;
use sequoia_openpgp::parse::Parse;
+use sequoia_openpgp::cert::{CertBuilder, Cert};
+use sequoia_openpgp::policy::{Policy, StandardPolicy};
+use std::io::Write;
+use sequoia_openpgp::serialize::stream::{Message, Encryptor, LiteralWriter};
-fn test_random() {
- let mut buf = vec![0; 32];
+fn run_random(size: usize) {
+ let mut buf = vec![0; size];
crypto::random(&mut buf);
}
+/// Encrypts the given message.
+fn encrypt(policy: &dyn Policy,
+ sink: &mut Write, plaintext: &str, recipient: &Cert)
+ -> sequoia_openpgp::Result<()> {
+ // Build a vector of recipients to hand to Encryptor.
+ let mut recipients =
+ recipient.keys().with_policy(policy, None).alive().revoked(false)
+ .for_transport_encryption()
+ .map(|ka| ka.key().into())
+ .collect::<Vec<_>>();
+
+ // Start streaming an OpenPGP message.
+ let message = Message::new(sink);
+
+ // We want to encrypt a literal data packet.
+ let mut encryptor = Encryptor::for_recipient(
+ message, recipients.pop().expect("No encryption key found"));
+ for r in recipients {
+ encryptor = encryptor.add_recipient(r)
+ }
+ let encryptor = encryptor.build().expect("Failed to create encryptor");
+
+ // Emit a literal data packet.
+ let mut literal_writer = LiteralWriter::new(encryptor).build()?;
+
+ // Encrypt the data.
+ literal_writer.write_all(plaintext.as_bytes())?;
+
+ // Finalize the OpenPGP message to make sure that all data is
+ // written.
+ literal_writer.finalize()?;
+
+ Ok(())
+}
+
+fn run_random_use_case() {
+ let (cert, _revocation) = CertBuilder::new()
+ .add_userid("someone@example.org")
+ .add_transport_encryption_subkey()
+ .generate().unwrap();
+
+ let p = StandardPolicy::new();
+ let mut ciphertext = Vec::new();
+ encrypt(&p, &mut ciphertext, "foo", &cert);
+}
+
fn bench_random(c: &mut Criterion) {
- c.bench_function("crypto::random", |b| b.iter(|| test_random() ));
+ let mut group = c.benchmark_group("bench_crypto_random");
+
+ //group.sample_size(10);
+ for i in (8..33).step_by(8) {
+ group.bench_function(format!("crypto::random {:02}", i), |b| b.iter(|| run_random(black_box(i)) ));
+ };
+ group.finish();
+}
+
+fn bench_random_use_case(c: &mut Criterion) {
+ c.bench_function("crypto::random create/encrypt", |b| b.iter(|| run_random_use_case() ));
}
-criterion_group!(benches, bench_random);
+criterion_group!(benches, bench_random, bench_random_use_case);
criterion_main!(benches);