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