diff --git a/digest/src/core_api/ct_variable.rs b/digest/src/core_api/ct_variable.rs index eeb9cd554..d8ad3e8ca 100644 --- a/digest/src/core_api/ct_variable.rs +++ b/digest/src/core_api/ct_variable.rs @@ -4,7 +4,7 @@ use super::{ }; #[cfg(feature = "mac")] use crate::MacMarker; -use crate::{CustomizedInit, HashMarker, VarOutputCustomized}; +use crate::{CollisionResistance, CustomizedInit, HashMarker, VarOutputCustomized}; use core::{ fmt, marker::PhantomData, @@ -46,6 +46,15 @@ where { } +impl CollisionResistance for CtVariableCoreWrapper +where + T: VariableOutputCore + CollisionResistance, + OutSize: ArraySize + IsLessOrEqual, + LeEq: NonZero, +{ + type CollisionResistance = T::CollisionResistance; +} + impl BlockSizeUser for CtVariableCoreWrapper where T: VariableOutputCore, diff --git a/digest/src/core_api/rt_variable.rs b/digest/src/core_api/rt_variable.rs index 1cb212ea9..6b69f09d9 100644 --- a/digest/src/core_api/rt_variable.rs +++ b/digest/src/core_api/rt_variable.rs @@ -1,7 +1,7 @@ use super::{AlgorithmName, BlockSizeUser, TruncSide, VariableOutputCore}; #[cfg(feature = "mac")] use crate::MacMarker; -use crate::{HashMarker, InvalidBufferSize}; +use crate::{CollisionResistance, HashMarker, InvalidBufferSize}; use crate::{InvalidOutputSize, Reset, Update, VariableOutput, VariableOutputReset}; use block_buffer::BlockBuffer; use core::{ @@ -56,6 +56,10 @@ impl HashMarker for RtVariableCoreWrapper #[cfg(feature = "mac")] impl MacMarker for RtVariableCoreWrapper {} +impl CollisionResistance for RtVariableCoreWrapper { + type CollisionResistance = T::CollisionResistance; +} + impl BlockSizeUser for RtVariableCoreWrapper { type BlockSize = T::BlockSize; } diff --git a/digest/src/core_api/wrapper.rs b/digest/src/core_api/wrapper.rs index 6cd006fab..242871772 100644 --- a/digest/src/core_api/wrapper.rs +++ b/digest/src/core_api/wrapper.rs @@ -3,8 +3,8 @@ use super::{ UpdateCore, XofReaderCoreWrapper, }; use crate::{ - CustomizedInit, ExtendableOutput, ExtendableOutputReset, FixedOutput, FixedOutputReset, - HashMarker, Update, + CollisionResistance, CustomizedInit, ExtendableOutput, ExtendableOutputReset, FixedOutput, + FixedOutputReset, HashMarker, Update, }; use block_buffer::BlockBuffer; use core::{ @@ -36,6 +36,10 @@ impl HashMarker for CoreWrapper {} #[cfg(feature = "mac")] impl MacMarker for CoreWrapper {} +impl CollisionResistance for CoreWrapper { + type CollisionResistance = T::CollisionResistance; +} + // this blanket impl is needed for HMAC impl BlockSizeUser for CoreWrapper { type BlockSize = T::BlockSize; diff --git a/digest/src/lib.rs b/digest/src/lib.rs index 6537d84a9..de2a784b6 100644 --- a/digest/src/lib.rs +++ b/digest/src/lib.rs @@ -74,6 +74,7 @@ pub use mac::{CtOutput, Mac, MacError, MacMarker}; pub use xof_fixed::XofFixedWrapper; use core::fmt; +use crypto_common::typenum::Unsigned; /// Types which consume data with byte granularity. pub trait Update { @@ -282,6 +283,14 @@ pub trait VarOutputCustomized: Sized { fn new_customized(customization: &[u8], output_size: usize) -> Self; } +/// Types with a certain collision resistance. +pub trait CollisionResistance { + /// Collision resistance in bytes. This applies to an output size of `CollisionResistance * 2`. + /// The collision resistance with a smaller output size is not defined by this trait and is at + /// least the given collision resistance with a bigger output. + type CollisionResistance: Unsigned; +} + /// The error type used in variable hash traits. #[derive(Clone, Copy, Debug, Default)] pub struct InvalidOutputSize; diff --git a/digest/src/xof_fixed.rs b/digest/src/xof_fixed.rs index d852904bf..a5e5d77a4 100644 --- a/digest/src/xof_fixed.rs +++ b/digest/src/xof_fixed.rs @@ -6,8 +6,8 @@ use crypto_common::hazmat::SerializableState; use crypto_common::{BlockSizeUser, KeyInit, KeySizeUser, OutputSizeUser, Reset}; use crate::{ - CustomizedInit, ExtendableOutput, ExtendableOutputReset, FixedOutput, FixedOutputReset, - HashMarker, Update, + CollisionResistance, CustomizedInit, ExtendableOutput, ExtendableOutputReset, FixedOutput, + FixedOutputReset, HashMarker, Update, }; /// Wrapper around [`ExtendableOutput`] types adding [`OutputSizeUser`] with the given size of `S`. @@ -51,6 +51,12 @@ impl crate::MacMarker { } +impl CollisionResistance + for XofFixedWrapper +{ + type CollisionResistance = T::CollisionResistance; +} + // this blanket impl is needed for HMAC impl BlockSizeUser for XofFixedWrapper { type BlockSize = T::BlockSize;