From 21520f5ff1bee719f2a9b03e70b00b6a4e0f1ee2 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Sat, 2 Oct 2021 18:50:53 +0530 Subject: feat(ext/crypto): decode RSAES-OAEP-params with default values (#12292) --- ext/crypto/lib.rs | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) (limited to 'ext') diff --git a/ext/crypto/lib.rs b/ext/crypto/lib.rs index 9db229266..157a9f04b 100644 --- a/ext/crypto/lib.rs +++ b/ext/crypto/lib.rs @@ -94,6 +94,8 @@ const ID_MFG1: rsa::pkcs8::ObjectIdentifier = rsa::pkcs8::ObjectIdentifier::new("1.2.840.113549.1.1.8"); const RSAES_OAEP_OID: rsa::pkcs8::ObjectIdentifier = rsa::pkcs8::ObjectIdentifier::new("1.2.840.113549.1.1.7"); +const ID_P_SPECIFIED: rsa::pkcs8::ObjectIdentifier = + rsa::pkcs8::ObjectIdentifier::new("1.2.840.113549.1.1.9"); pub fn init(maybe_seed: Option) -> Extension { Extension::builder() @@ -874,6 +876,10 @@ const MASK_GEN_ALGORITHM_TAG: rsa::pkcs8::der::TagNumber = const SALT_LENGTH_TAG: rsa::pkcs8::der::TagNumber = rsa::pkcs8::der::TagNumber::new(2); +// Context-specific tag number for pSourceAlgorithm +const P_SOURCE_ALGORITHM_TAG: rsa::pkcs8::der::TagNumber = + rsa::pkcs8::der::TagNumber::new(2); + lazy_static! { // Default HashAlgorithm for RSASSA-PSS-params (sha1) // @@ -904,6 +910,22 @@ lazy_static! { // sha1 parameters: Some(asn1::Any::from_der(&ENCODED_SHA1_HASH_ALGORITHM).unwrap()), }; + + // Default PSourceAlgorithm for RSAES-OAEP-params + // The default label is an empty string. + // + // pSpecifiedEmpty PSourceAlgorithm ::= { + // algorithm id-pSpecified, + // parameters EncodingParameters : emptyString + // } + // + // emptyString EncodingParameters ::= ''H + static ref P_SPECIFIED_EMPTY: rsa::pkcs8::AlgorithmIdentifier<'static> = rsa::pkcs8::AlgorithmIdentifier { + // id-pSpecified + oid: ID_P_SPECIFIED, + // EncodingParameters + parameters: Some(asn1::Any::from(asn1::OctetString::new(b"").unwrap())), + }; } impl<'a> TryFrom> @@ -965,9 +987,24 @@ impl<'a> TryFrom> any: rsa::pkcs8::der::asn1::Any<'a>, ) -> rsa::pkcs8::der::Result { any.sequence(|decoder| { - let hash_algorithm = decoder.decode()?; - let mask_gen_algorithm = decoder.decode()?; - let p_source_algorithm = decoder.decode()?; + let hash_algorithm = decoder + .context_specific(HASH_ALGORITHM_TAG)? + .map(TryInto::try_into) + .transpose()? + .unwrap_or(*SHA1_HASH_ALGORITHM); + + let mask_gen_algorithm = decoder + .context_specific(MASK_GEN_ALGORITHM_TAG)? + .map(TryInto::try_into) + .transpose()? + .unwrap_or(*MGF1_SHA1_MASK_ALGORITHM); + + let p_source_algorithm = decoder + .context_specific(P_SOURCE_ALGORITHM_TAG)? + .map(TryInto::try_into) + .transpose()? + .unwrap_or(*P_SPECIFIED_EMPTY); + Ok(Self { hash_algorithm, mask_gen_algorithm, -- cgit v1.2.3