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 |
|
11 | use mail_auth::{
|
12 | common::{
|
13 | crypto::RsaKey,
|
14 | crypto::{Ed25519Key, Sha256},
|
15 | headers::HeaderWriter,
|
16 | },
|
17 | dkim::DkimSigner,
|
18 | };
|
19 | use mail_parser::decoders::base64::base64_decode;
|
20 |
|
21 | const RSA_PRIVATE_KEY: &str = r#"-----BEGIN RSA PRIVATE KEY-----
|
22 | MIICXwIBAAKBgQDwIRP/UC3SBsEmGqZ9ZJW3/DkMoGeLnQg1fWn7/zYtIxN2SnFC
|
23 | jxOCKG9v3b4jYfcTNh5ijSsq631uBItLa7od+v/RtdC2UzJ1lWT947qR+Rcac2gb
|
24 | to/NMqJ0fzfVjH4OuKhitdY9tf6mcwGjaNBcWToIMmPSPDdQPNUYckcQ2QIDAQAB
|
25 | AoGBALmn+XwWk7akvkUlqb+dOxyLB9i5VBVfje89Teolwc9YJT36BGN/l4e0l6QX
|
26 | /1//6DWUTB3KI6wFcm7TWJcxbS0tcKZX7FsJvUz1SbQnkS54DJck1EZO/BLa5ckJ
|
27 | gAYIaqlA9C0ZwM6i58lLlPadX/rtHb7pWzeNcZHjKrjM461ZAkEA+itss2nRlmyO
|
28 | n1/5yDyCluST4dQfO8kAB3toSEVc7DeFeDhnC1mZdjASZNvdHS4gbLIA1hUGEF9m
|
29 | 3hKsGUMMPwJBAPW5v/U+AWTADFCS22t72NUurgzeAbzb1HWMqO4y4+9Hpjk5wvL/
|
30 | eVYizyuce3/fGke7aRYw/ADKygMJdW8H/OcCQQDz5OQb4j2QDpPZc0Nc4QlbvMsj
|
31 | 7p7otWRO5xRa6SzXqqV3+F0VpqvDmshEBkoCydaYwc2o6WQ5EBmExeV8124XAkEA
|
32 | qZzGsIxVP+sEVRWZmW6KNFSdVUpk3qzK0Tz/WjQMe5z0UunY9Ax9/4PVhp/j61bf
|
33 | eAYXunajbBSOLlx4D+TunwJBANkPI5S9iylsbLs6NkaMHV6k5ioHBBmgCak95JGX
|
34 | GMot/L2x0IYyMLAz6oLWh2hm7zwtb0CgOrPo1ke44hFYnfc=
|
35 | -----END RSA PRIVATE KEY-----"#;
|
36 |
|
37 | const ED25519_PRIVATE_KEY: &str = "nWGxne/9WmC6hEr0kuwsxERJxWl7MmkZcDusAxyuf2A=";
|
38 | const ED25519_PUBLIC_KEY: &str = "11qYAYKxCrfVS/7TyWQHOg7hcvPapiMlrwIaaPcHURo=";
|
39 |
|
40 | const TEST_MESSAGE: &str = r#"From: bill@example.com
|
41 | To: jdoe@example.com
|
42 | Subject: TPS Report
|
43 |
|
44 | I'm going to need those TPS reports ASAP. So, if you could do that, that'd be great.
|
45 | "#;
|
46 |
|
47 | fn 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 | }
|