rustexamples/dkim_sign.rs -rw-r--r-- 2.8 KiB
1/*
2 * Copyright (c) 2020-2023, Stalwart Labs Ltd.
3 *
4 * Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
5 * https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
6 * <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
7 * option. This file may not be copied, modified, or distributed
8 * except according to those terms.
9 */
10
11use mail_auth::{
12 common::{
13 crypto::RsaKey,
14 crypto::{Ed25519Key, Sha256},
15 headers::HeaderWriter,
16 },
17 dkim::DkimSigner,
18};
19use mail_parser::decoders::base64::base64_decode;
20
21const RSA_PRIVATE_KEY: &str = r#"-----BEGIN RSA PRIVATE KEY-----
22MIICXwIBAAKBgQDwIRP/UC3SBsEmGqZ9ZJW3/DkMoGeLnQg1fWn7/zYtIxN2SnFC
23jxOCKG9v3b4jYfcTNh5ijSsq631uBItLa7od+v/RtdC2UzJ1lWT947qR+Rcac2gb
24to/NMqJ0fzfVjH4OuKhitdY9tf6mcwGjaNBcWToIMmPSPDdQPNUYckcQ2QIDAQAB
25AoGBALmn+XwWk7akvkUlqb+dOxyLB9i5VBVfje89Teolwc9YJT36BGN/l4e0l6QX
26/1//6DWUTB3KI6wFcm7TWJcxbS0tcKZX7FsJvUz1SbQnkS54DJck1EZO/BLa5ckJ
27gAYIaqlA9C0ZwM6i58lLlPadX/rtHb7pWzeNcZHjKrjM461ZAkEA+itss2nRlmyO
28n1/5yDyCluST4dQfO8kAB3toSEVc7DeFeDhnC1mZdjASZNvdHS4gbLIA1hUGEF9m
293hKsGUMMPwJBAPW5v/U+AWTADFCS22t72NUurgzeAbzb1HWMqO4y4+9Hpjk5wvL/
30eVYizyuce3/fGke7aRYw/ADKygMJdW8H/OcCQQDz5OQb4j2QDpPZc0Nc4QlbvMsj
317p7otWRO5xRa6SzXqqV3+F0VpqvDmshEBkoCydaYwc2o6WQ5EBmExeV8124XAkEA
32qZzGsIxVP+sEVRWZmW6KNFSdVUpk3qzK0Tz/WjQMe5z0UunY9Ax9/4PVhp/j61bf
33eAYXunajbBSOLlx4D+TunwJBANkPI5S9iylsbLs6NkaMHV6k5ioHBBmgCak95JGX
34GMot/L2x0IYyMLAz6oLWh2hm7zwtb0CgOrPo1ke44hFYnfc=
35-----END RSA PRIVATE KEY-----"#;
36
37const ED25519_PRIVATE_KEY: &str = "nWGxne/9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A=";
38const ED25519_PUBLIC_KEY: &str = "11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=";
39
40const TEST_MESSAGE: &str = r#"From: bill@example.com
41To: jdoe@example.com
42Subject: TPS Report
43
44I'm going to need those TPS reports ASAP. So, if you could do that, that'd be great.
45"#;
46
47fn main() {
48 // Sign an e-mail message using RSA-SHA256
49 let pk_rsa = RsaKey::<Sha256>::from_pkcs1_pem(RSA_PRIVATE_KEY).unwrap();
50 let signature_rsa = DkimSigner::from_key(pk_rsa)
51 .domain("example.com")
52 .selector("default")
53 .headers(["From", "To", "Subject"])
54 .sign(TEST_MESSAGE.as_bytes())
55 .unwrap();
56
57 // Sign an e-mail message using ED25519-SHA256
58 let pk_ed = Ed25519Key::from_bytes(
59 &base64_decode(ED25519_PUBLIC_KEY.as_bytes()).unwrap(),
60 &base64_decode(ED25519_PRIVATE_KEY.as_bytes()).unwrap(),
61 )
62 .unwrap();
63 let signature_ed = DkimSigner::from_key(pk_ed)
64 .domain("example.com")
65 .selector("default-ed")
66 .headers(["From", "To", "Subject"])
67 .sign(TEST_MESSAGE.as_bytes())
68 .unwrap();
69
70 // Print the message including both signatures to stdout
71 println!(
72 "{}{}{}",
73 signature_rsa.to_header(),
74 signature_ed.to_header(),
75 TEST_MESSAGE
76 );
77}