Return an error if no recipient type matches.
authorDr. Stephen Henson <steve@openssl.org>
Thu, 8 May 2014 12:10:56 +0000 (13:10 +0100)
committerDr. Stephen Henson <steve@openssl.org>
Fri, 9 May 2014 13:24:53 +0000 (14:24 +0100)
If the key type does not match any CMS recipient type return
an error instead of using a random key (MMA mitigation). This
does not leak any useful information to an attacker.

PR#3348
(cherry picked from commit bd43b4cf778a53ffa5d77510ecd408a009dc00d2)

crypto/cms/cms_smime.c

index 204595b908c46f1393fc47215831ef5eb0d9866a..d2b9eec3ddba3b143cce5378cb5f786c79999f89 100644 (file)
@@ -637,7 +637,7 @@ int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert)
        STACK_OF(CMS_RecipientInfo) *ris;
        CMS_RecipientInfo *ri;
        int i, r, ri_type;
-       int debug = 0;
+       int debug = 0, match_ri = 0;
        ris = CMS_get0_RecipientInfos(cms);
        if (ris)
                debug = cms->d.envelopedData->encryptedContentInfo->debug;
@@ -654,6 +654,7 @@ int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert)
                ri = sk_CMS_RecipientInfo_value(ris, i);
                if (CMS_RecipientInfo_type(ri) != ri_type)
                                continue;
+               match_ri = 1;
                if (ri_type == CMS_RECIPINFO_AGREE)
                        {
                        r = cms_kari_set1_pkey(cms, ri, pk, cert);
@@ -697,7 +698,7 @@ int CMS_decrypt_set1_pkey(CMS_ContentInfo *cms, EVP_PKEY *pk, X509 *cert)
                        }
                }
        /* If no cert and not debugging always return success */
-       if (!cert && !debug)
+       if (match_ri && !cert && !debug)
                {
                ERR_clear_error();
                return 1;