From 4cf2e65c94de5f2d57eab7f9e19941c55779669b Mon Sep 17 00:00:00 2001 From: Wez Furlong Date: Thu, 15 Jun 2023 15:41:18 -0700 Subject: [PATCH] dkim: add comparitive benchmark against mail-auth MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ``` signing/sign Simple time: [1.2990 ms 1.3002 ms 1.3015 ms] thrpt: [2.3581 MiB/s 2.3603 MiB/s 2.3626 MiB/s] Found 1 outliers among 100 measurements (1.00%) 1 (1.00%) high mild signing/sign Relaxed time: [1.2942 ms 1.2955 ms 1.2968 ms] thrpt: [2.3665 MiB/s 2.3689 MiB/s 2.3712 MiB/s] Found 4 outliers among 100 measurements (4.00%) 1 (1.00%) low mild 1 (1.00%) high mild 2 (2.00%) high severe mail-auth signing/sign Simple time: [487.97 µs 488.22 µs 488.48 µs] thrpt: [6.2826 MiB/s 6.2860 MiB/s 6.2892 MiB/s] Found 1 outliers among 100 measurements (1.00%) 1 (1.00%) high severe mail-auth signing/sign Relaxed time: [494.68 µs 495.68 µs 496.68 µs] thrpt: [6.1789 MiB/s 6.1913 MiB/s 6.2039 MiB/s] ``` --- Cargo.lock | 1 + crates/dkim/Cargo.toml | 5 +++-- crates/dkim/benches/sign.rs | 31 +++++++++++++++++++++++++++---- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 81a2f686..d23378b3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -665,6 +665,7 @@ dependencies = [ "ed25519-dalek", "futures", "indexmap", + "mail-auth", "mailparse", "memchr", "nom", diff --git a/crates/dkim/Cargo.toml b/crates/dkim/Cargo.toml index f0145a61..0f641b95 100644 --- a/crates/dkim/Cargo.toml +++ b/crates/dkim/Cargo.toml @@ -29,9 +29,10 @@ tracing = "0.1" trust-dns-resolver = "0.22" [dev-dependencies] -tokio = { version = "1.25", features = ["macros"] } -regex = "1" criterion = "0.3" +mail-auth = "0.3" +regex = "1" +tokio = { version = "1.25", features = ["macros"] } [[bench]] name = "sign" diff --git a/crates/dkim/benches/sign.rs b/crates/dkim/benches/sign.rs index 728daeb2..850527c2 100644 --- a/crates/dkim/benches/sign.rs +++ b/crates/dkim/benches/sign.rs @@ -3,7 +3,6 @@ use cfdkim::{DkimPrivateKey, ParsedEmail, SignerBuilder}; use chrono::TimeZone; use criterion::{black_box, criterion_group, criterion_main, Criterion, SamplingMode, Throughput}; use rsa::pkcs1::DecodeRsaPrivateKey; -use std::path::Path; pub fn criterion_benchmark(c: &mut Criterion) { let email_text = r#"Subject: subject @@ -50,12 +49,11 @@ aliquet eu tortor nec hendrerit. Aliquam in arcu ac erat venenatis pretium at si ipsum dolor sit a. "# .replace("\n", "\r\n"); + let email = ParsedEmail::parse_bytes(email_text.as_bytes()).unwrap(); for canon in [Type::Simple, Type::Relaxed] { - let email = ParsedEmail::parse_bytes(email_text.as_bytes()).unwrap(); - let private_key = - rsa::RsaPrivateKey::read_pkcs1_pem_file(Path::new("./test/keys/2022.private")).unwrap(); + rsa::RsaPrivateKey::read_pkcs1_pem_file("./test/keys/2022.private").unwrap(); let time = chrono::Utc.with_ymd_and_hms(2021, 1, 1, 0, 0, 1).unwrap(); let signer = SignerBuilder::new() @@ -78,6 +76,31 @@ ipsum dolor sit a. }); group.finish(); } + + { + use mail_auth::common::crypto::{RsaKey, Sha256}; + use mail_auth::dkim::{Canonicalization, DkimSigner}; + + for canon in [Canonicalization::Simple, Canonicalization::Relaxed] { + let key_data = std::fs::read_to_string("./test/keys/2022.private").unwrap(); + let key = RsaKey::::from_rsa_pem(&key_data).unwrap(); + + let signer = DkimSigner::from_key(key) + .domain("example.com") + .selector("s20") + .headers(["From", "Subject"]) + .header_canonicalization(canon) + .body_canonicalization(canon); + + let mut group = c.benchmark_group("mail-auth signing"); + group.sampling_mode(SamplingMode::Flat); + group.throughput(Throughput::Bytes(email_text.len() as u64)); + group.bench_function(&format!("sign {canon:?}"), |b| { + b.iter(|| signer.sign(black_box(email_text.as_bytes())).unwrap()) + }); + group.finish(); + } + } } criterion_group!(benches, criterion_benchmark);