Files
kumomta/crates/dkim
Wez Furlong 4cf2e65c94 dkim: add comparitive benchmark against mail-auth
```
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]
```
2023-06-15 15:41:18 -07:00
..
2023-06-15 09:10:39 -07:00
2023-06-15 09:10:39 -07:00
2023-06-15 09:10:39 -07:00
2023-06-15 09:10:39 -07:00
2023-06-15 09:10:39 -07:00

cfdkim

DKIM (RFC6376) implementation

Features

Verifying email signatures

Example:

let res: DKIMResult = cfdkim::verify_email(&logger, &from_domain, &parsed_email).await?;

if let Some(err) = &res.error() {
  error!(logger, "dkim verify fail: {}", err);
}

println!("dkim={}", res.with_detail());

The verify_email arguments are the following:

  • logger: slog::Logger
  • from_domain: &str (RFC5322.From's domain)
  • parsed_email: mailparse::ParsedMail

Signing an email

Example:

let private_key =
    rsa::RsaPrivateKey::read_pkcs1_pem_file(Path::new("./test/keys/2022.private"))?;

let signer = SignerBuilder::new()
    .with_signed_headers(["From", "Subject"])?
    .with_private_key(private_key)
    .with_selector("2020")
    .with_signing_domain("example.com")
    .build()?;
let signature = signer.sign(&email)?;

println!("{}", signature); // DKIM-Signature: ...

See the SignerBuilder object documentation for more information.

Generate a test DKIM key

Using OpenDKIM:

opendkim-genkey \
    --testmode \
    --domain=example.com \
    --selector=2022 \
    --nosubdomains