diff --git a/pkcs1/src/params.rs b/pkcs1/src/params.rs index c0bab6b40..3381c2b48 100644 --- a/pkcs1/src/params.rs +++ b/pkcs1/src/params.rs @@ -152,8 +152,6 @@ impl<'a> RsaPssParamsRef<'a> { impl RsaPssParams where AlgorithmIdentifier: AsAlgorithmIdentifierRef, - AlgorithmIdentifier: From>>, - Params: PartialEq, { fn context_specific_hash(&self) -> Option>> { if self.hash.as_algo_ref() == SHA_1_AI { @@ -170,7 +168,7 @@ where fn context_specific_mask_gen( &self, ) -> Option>>> { - if self.mask_gen == default_mgf1_sha1::() { + if is_default_mgf1_sha1(&self.mask_gen) { None } else { Some(ContextSpecificRef { @@ -201,7 +199,7 @@ where AlgorithmIdentifier: DecodeValue<'a, Error = der::Error> + FixedTag, AlgorithmIdentifier>: DecodeValue<'a, Error = der::Error> + FixedTag, - AlgorithmIdentifier: From>, + AlgorithmIdentifier: From>, Params: 'a, { type Error = der::Error; @@ -230,8 +228,6 @@ where for<'b> Option>>: Encode, for<'b> Option>>>: Encode, - AlgorithmIdentifier: From>, - Params: PartialEq, { fn value_len(&self) -> der::Result { self.context_specific_hash().encoded_len()? @@ -256,7 +252,7 @@ where AlgorithmIdentifier: DecodeValue<'a, Error = der::Error> + FixedTag, AlgorithmIdentifier>: DecodeValue<'a, Error = der::Error> + FixedTag, - AlgorithmIdentifier: From>, + AlgorithmIdentifier: From>, Params: 'a, { type Error = Error; @@ -267,9 +263,9 @@ where } /// Default Mask Generation Function (MGF): SHA-1. -fn default_mgf1_sha1() -> AlgorithmIdentifier> +fn default_mgf1_sha1<'a, Params>() -> AlgorithmIdentifier> where - AlgorithmIdentifier: From>, + AlgorithmIdentifier: From>, { AlgorithmIdentifier::> { oid: OID_MGF_1, @@ -277,6 +273,19 @@ where } } +/// Is `mask_gen` the default MGF (MGF1 with SHA-1)? +fn is_default_mgf1_sha1(mask_gen: &AlgorithmIdentifier>) -> bool +where + AlgorithmIdentifier: AsAlgorithmIdentifierRef, +{ + mask_gen.oid == OID_MGF_1 + && mask_gen + .parameters + .as_ref() + .map(AsAlgorithmIdentifierRef::as_algo_ref) + == Some(SHA_1_AI) +} + /// [`RsaOaepParams`] with [`AlgorithmIdentifier`] pub type RsaOaepParamsRef<'a> = RsaOaepParams>; @@ -345,13 +354,11 @@ where impl RsaOaepParams where AlgorithmIdentifier: AsAlgorithmIdentifierRef, - AlgorithmIdentifier: From>, - Params: PartialEq, { fn context_specific_mask_gen( &self, ) -> Option>>> { - if self.mask_gen == default_mgf1_sha1::() { + if is_default_mgf1_sha1(&self.mask_gen) { None } else { Some(ContextSpecificRef { @@ -412,7 +419,7 @@ where AlgorithmIdentifier: DecodeValue<'a, Error = der::Error> + FixedTag, AlgorithmIdentifier>: DecodeValue<'a, Error = der::Error> + FixedTag, - AlgorithmIdentifier: From>, + AlgorithmIdentifier: From>, Params: 'a, { type Error = der::Error; @@ -438,8 +445,6 @@ where for<'b> Option>>: Encode, for<'b> Option>>>: Encode, - AlgorithmIdentifier: From>, - Params: PartialEq, { fn value_len(&self) -> der::Result { self.context_specific_hash().encoded_len()? @@ -462,7 +467,7 @@ where AlgorithmIdentifier: DecodeValue<'a, Error = der::Error> + FixedTag, AlgorithmIdentifier>: DecodeValue<'a, Error = der::Error> + FixedTag, - AlgorithmIdentifier: From>, + AlgorithmIdentifier: From>, Params: 'a, { type Error = Error; diff --git a/pkcs1/tests/params.rs b/pkcs1/tests/params.rs index 32694f9ae..9025c500d 100644 --- a/pkcs1/tests/params.rs +++ b/pkcs1/tests/params.rs @@ -262,6 +262,32 @@ fn new_oaep_param() { ); } +/// The `*Ref` types borrow from their input, which need not be `'static`. +#[test] +fn ref_params_non_static_input() { + fn pss(der: &[u8], buf: &mut [u8]) -> usize { + let param = RsaPssParamsRef::try_from(der).unwrap(); + param.encode_to_slice(buf).unwrap().len() + } + fn oaep(der: &[u8], buf: &mut [u8]) -> usize { + let param = RsaOaepParamsRef::try_from(der).unwrap(); + param.encode_to_slice(buf).unwrap().len() + } + + let mut buf = [0_u8; 256]; + let mut der = [0_u8; 64]; + + let n = RSA_PSS_PARAMETERS_SHA2_256.len(); + der[..n].copy_from_slice(RSA_PSS_PARAMETERS_SHA2_256); + assert_eq!(pss(&der[..n], &mut buf), n); + assert_eq!(&buf[..n], RSA_PSS_PARAMETERS_SHA2_256); + + let n = RSA_OAEP_PARAMETERS_SHA2_256.len(); + der[..n].copy_from_slice(RSA_OAEP_PARAMETERS_SHA2_256); + assert_eq!(oaep(&der[..n], &mut buf), n); + assert_eq!(&buf[..n], RSA_OAEP_PARAMETERS_SHA2_256); +} + #[cfg(feature = "alloc")] mod test_alloc_trait_bounds { use der::{Decode, Encode};