1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
use criterion::{black_box, Throughput, criterion_group, criterion_main, Criterion};
use sequoia_openpgp::crypto;
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 run_random(size: usize) {
let mut buf = vec![0; size];
crypto::random(&mut buf);
}
/// Borrowed from the guide, chapter 02
/// 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();
let _ = encrypt(&p, &mut ciphertext, "message_text", &cert);
}
fn bench_random(c: &mut Criterion) {
let mut group = c.benchmark_group("bench_crypto_random");
group.sample_size(50);
for i in (8..33).step_by(8) {
group.throughput(Throughput::Bytes(i as u64));
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, bench_random_use_case);
criterion_main!(benches);
|