diff --git a/src/hash.rs b/src/hash.rs index cadb40e0..85d0703c 100644 --- a/src/hash.rs +++ b/src/hash.rs @@ -6,6 +6,7 @@ use crate::canonicalization::{ self, canonicalize_body_relaxed, canonicalize_body_simple, canonicalize_header_relaxed, canonicalize_header_simple, }; +use crate::header::HEADER; use crate::{bytes, DKIMError, DKIMHeader}; #[derive(Debug, Clone)] @@ -111,12 +112,16 @@ pub(crate) fn compute_headers_hash<'a, 'b>( { let sign = dkim_header.get_raw_tag("b").unwrap(); let value = dkim_header.raw_bytes.replace(&sign, ""); - if canonicalization_type == canonicalization::Type::Simple { - input.extend_from_slice(&"DKIM-Signature: ".as_bytes()); + let mut canonicalized_value = if canonicalization_type == canonicalization::Type::Simple { + canonicalize_header_simple(HEADER, &value.as_bytes()) } else { - input.extend_from_slice(&"dkim-signature:".as_bytes()); - } - input.extend_from_slice(&value.as_bytes()); + canonicalize_header_relaxed(HEADER, &value.as_bytes()) + }; + + // remove trailing "\r\n" + canonicalized_value.truncate(canonicalized_value.len() - 2); + + input.extend_from_slice(&canonicalized_value); } debug!(logger, "headers to hash: {:?}", input); diff --git a/src/lib.rs b/src/lib.rs index b2c9ff2e..c7b201f6 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -414,7 +414,15 @@ We lost the game. Are you hungry yet? Joe."# .replace("\n", "\r\n"); - let raw_header_dkim = r#"v=1; a=ed25519-sha256; c=relaxed/relaxed; d=football.example.com; i=@football.example.com; q=dns/txt; s=brisbane; t=1528637909; h=from : to : subject : date : message-id : from : subject : date; bh=2jUSOH9NhtVGCQWNr9BrIAPreKQjO6Sn7XIkfJVOzv8=; b=/gCrinpcQOoIfuHNQIbq4pgh9kyIK3AQUdt9OdqQehSwhEIug4D11BusFa3bT3FY5OsU7ZbnKELq+eXdp1Q1Dw=="#; + + let email = mailparse::parse_mail(raw_email.as_bytes()).unwrap(); + let h = email + .headers + .get_all_headers(HEADER) + .first() + .unwrap() + .get_value_raw(); + let raw_header_dkim = String::from_utf8_lossy(h); let resolver: Arc = Arc::new(MockResolver::new()); @@ -422,7 +430,7 @@ Joe."# &slog::Logger::root(slog::Discard, slog::o!()), Arc::clone(&resolver), &validate_header(&raw_header_dkim).unwrap(), - &mailparse::parse_mail(raw_email.as_bytes()).unwrap(), + &email, ) .await;