diff --git a/CHANGELOG.md b/CHANGELOG.md index 966ff07..07c5f7b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +mail-auth 0.3.1 +================================ +- Fix: Avoid panicking on invalid RSA key input (#17) + mail-auth 0.3.0 ================================ - ``ring`` backend support. diff --git a/Cargo.toml b/Cargo.toml index ac9dcdd..9cfcf1b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "mail-auth" description = "DKIM, ARC, SPF and DMARC library for Rust" -version = "0.3.0" +version = "0.3.1" edition = "2021" authors = [ "Stalwart Labs "] license = "Apache-2.0 OR MIT" diff --git a/src/arc/mod.rs b/src/arc/mod.rs index a285379..6d6f65d 100644 --- a/src/arc/mod.rs +++ b/src/arc/mod.rs @@ -79,19 +79,14 @@ pub struct Set<'x> { pub(crate) results: Header<'x, &'x Results>, } -#[derive(Debug, PartialEq, Eq, Clone)] +#[derive(Debug, PartialEq, Eq, Clone, Default)] pub(crate) enum ChainValidation { + #[default] None, Fail, Pass, } -impl Default for ChainValidation { - fn default() -> Self { - ChainValidation::None - } -} - impl VerifySignature for Signature { fn signature(&self) -> &[u8] { &self.b diff --git a/src/common/crypto/mod.rs b/src/common/crypto/mod.rs index caadf17..5707dce 100644 --- a/src/common/crypto/mod.rs +++ b/src/common/crypto/mod.rs @@ -144,9 +144,10 @@ impl AsRef<[u8]> for HashOutput { } } -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum Algorithm { RsaSha1, + #[default] RsaSha256, Ed25519Sha256, } diff --git a/src/dkim/mod.rs b/src/dkim/mod.rs index 6c5be8a..3994232 100644 --- a/src/dkim/mod.rs +++ b/src/dkim/mod.rs @@ -24,8 +24,9 @@ pub mod parse; pub mod sign; pub mod verify; -#[derive(Debug, Clone, Copy, PartialEq, Eq)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)] pub enum Canonicalization { + #[default] Relaxed, Simple, } @@ -63,18 +64,6 @@ pub struct Signature { pub(crate) cb: Canonicalization, } -impl Default for Algorithm { - fn default() -> Self { - Algorithm::RsaSha256 - } -} - -impl Default for Canonicalization { - fn default() -> Self { - Canonicalization::Relaxed - } -} - #[derive(Debug, PartialEq, Eq, Clone)] pub struct DomainKeyReport { pub(crate) ra: String, diff --git a/src/report/mod.rs b/src/report/mod.rs index 1b955a4..86f894c 100644 --- a/src/report/mod.rs +++ b/src/report/mod.rs @@ -32,27 +32,30 @@ pub struct ReportMetadata { error: Vec, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] pub enum Alignment { Relaxed, Strict, + #[default] Unspecified, } -#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] pub enum Disposition { None, Quarantine, Reject, + #[default] Unspecified, } -#[derive(Debug, Hash, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Hash, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, Default)] pub enum ActionDisposition { None, Pass, Quarantine, Reject, + #[default] Unspecified, } @@ -70,20 +73,22 @@ pub struct PolicyPublished { impl Eq for PolicyPublished {} -#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize, Default)] pub enum DmarcResult { Pass, Fail, + #[default] Unspecified, } -#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize, Default)] pub enum PolicyOverride { Forwarded, SampledOut, TrustedForwarder, MailingList, LocalPolicy, + #[default] Other, } @@ -121,8 +126,9 @@ pub struct Identifier { header_from: String, } -#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize, Default)] pub enum DkimResult { + #[default] None, Pass, Fail, @@ -140,15 +146,17 @@ pub struct DKIMAuthResult { human_result: Option, } -#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize, Default)] pub enum SPFDomainScope { Helo, MailFrom, + #[default] Unspecified, } -#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, Serialize, Deserialize, Default)] pub enum SpfResult { + #[default] None, Neutral, Pass, @@ -191,54 +199,6 @@ pub struct Report { impl Eq for Report {} -impl Default for Alignment { - fn default() -> Self { - Alignment::Unspecified - } -} - -impl Default for Disposition { - fn default() -> Self { - Disposition::Unspecified - } -} - -impl Default for ActionDisposition { - fn default() -> Self { - ActionDisposition::None - } -} - -impl Default for DmarcResult { - fn default() -> Self { - DmarcResult::Unspecified - } -} - -impl Default for PolicyOverride { - fn default() -> Self { - PolicyOverride::Other - } -} - -impl Default for DkimResult { - fn default() -> Self { - DkimResult::None - } -} - -impl Default for SpfResult { - fn default() -> Self { - SpfResult::None - } -} - -impl Default for SPFDomainScope { - fn default() -> Self { - SPFDomainScope::Unspecified - } -} - #[derive(Debug, Clone, PartialEq, Eq)] pub enum Error { MailParseError, @@ -287,7 +247,7 @@ pub struct Feedback<'x> { headers: Option>, } -#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize, Deserialize, Default)] pub enum AuthFailureType { Adsp, BodyHash, @@ -295,62 +255,42 @@ pub enum AuthFailureType { Signature, Spf, Dmarc, + #[default] Unspecified, } -#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize, Deserialize, Default)] pub enum IdentityAlignment { None, Spf, Dkim, DkimSpf, + #[default] Unspecified, } -#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize, Deserialize, Default)] pub enum DeliveryResult { Delivered, Spam, Policy, Reject, Other, + #[default] Unspecified, } -#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Eq, Copy, Serialize, Deserialize, Default)] pub enum FeedbackType { Abuse, AuthFailure, Fraud, NotSpam, + #[default] Other, Virus, } -impl Default for AuthFailureType { - fn default() -> Self { - AuthFailureType::Unspecified - } -} - -impl Default for IdentityAlignment { - fn default() -> Self { - IdentityAlignment::Unspecified - } -} - -impl Default for DeliveryResult { - fn default() -> Self { - DeliveryResult::Unspecified - } -} - -impl Default for FeedbackType { - fn default() -> Self { - FeedbackType::Other - } -} - impl From<&crate::DkimResult> for AuthFailureType { fn from(value: &crate::DkimResult) -> Self { match value {