mirror of https://github.com/openssl/openssl.git
Do not raise CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA error in CMS_ContentInfo_free
This happens if this function is called for signed content.
Added ossl_cms_env_enc_content_free() for cleaning enveloped content.
Fixed indentation in ossl_cms_env_enc_content_free
Reviewed-by: Matt Caswell <matt@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/21676)
(cherry picked from commit 13342efbb9)
This commit is contained in:
parent
51a18356ee
commit
2c4fec6238
|
|
@ -26,7 +26,7 @@ static void cms_env_set_version(CMS_EnvelopedData *env);
|
|||
#define CMS_ENVELOPED_STANDARD 1
|
||||
#define CMS_ENVELOPED_AUTH 2
|
||||
|
||||
static int cms_get_enveloped_type(const CMS_ContentInfo *cms)
|
||||
static int cms_get_enveloped_type_simple(const CMS_ContentInfo *cms)
|
||||
{
|
||||
int nid = OBJ_obj2nid(cms->contentType);
|
||||
|
||||
|
|
@ -38,11 +38,28 @@ static int cms_get_enveloped_type(const CMS_ContentInfo *cms)
|
|||
return CMS_ENVELOPED_AUTH;
|
||||
|
||||
default:
|
||||
ERR_raise(ERR_LIB_CMS, CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
static int cms_get_enveloped_type(const CMS_ContentInfo *cms)
|
||||
{
|
||||
int ret = cms_get_enveloped_type_simple(cms);
|
||||
|
||||
if (ret == 0)
|
||||
ERR_raise(ERR_LIB_CMS, CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ossl_cms_env_enc_content_free(const CMS_ContentInfo *cinf)
|
||||
{
|
||||
if (cms_get_enveloped_type_simple(cinf) != 0) {
|
||||
CMS_EncryptedContentInfo *ec = ossl_cms_get0_env_enc_content(cinf);
|
||||
if (ec != NULL)
|
||||
OPENSSL_clear_free(ec->key, ec->keylen);
|
||||
}
|
||||
}
|
||||
|
||||
CMS_EnvelopedData *ossl_cms_get0_enveloped(CMS_ContentInfo *cms)
|
||||
{
|
||||
if (OBJ_obj2nid(cms->contentType) != NID_pkcs7_enveloped) {
|
||||
|
|
|
|||
|
|
@ -75,10 +75,7 @@ CMS_ContentInfo *CMS_ContentInfo_new(void)
|
|||
void CMS_ContentInfo_free(CMS_ContentInfo *cms)
|
||||
{
|
||||
if (cms != NULL) {
|
||||
CMS_EncryptedContentInfo *ec = ossl_cms_get0_env_enc_content(cms);
|
||||
|
||||
if (ec != NULL)
|
||||
OPENSSL_clear_free(ec->key, ec->keylen);
|
||||
ossl_cms_env_enc_content_free(cms);
|
||||
OPENSSL_free(cms->ctx.propq);
|
||||
ASN1_item_free((ASN1_VALUE *)cms, ASN1_ITEM_rptr(CMS_ContentInfo));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -444,6 +444,7 @@ BIO *ossl_cms_EnvelopedData_init_bio(CMS_ContentInfo *cms);
|
|||
int ossl_cms_EnvelopedData_final(CMS_ContentInfo *cms, BIO *chain);
|
||||
BIO *ossl_cms_AuthEnvelopedData_init_bio(CMS_ContentInfo *cms);
|
||||
int ossl_cms_AuthEnvelopedData_final(CMS_ContentInfo *cms, BIO *cmsbio);
|
||||
void ossl_cms_env_enc_content_free(const CMS_ContentInfo *cinf);
|
||||
CMS_EnvelopedData *ossl_cms_get0_enveloped(CMS_ContentInfo *cms);
|
||||
CMS_AuthEnvelopedData *ossl_cms_get0_auth_enveloped(CMS_ContentInfo *cms);
|
||||
CMS_EncryptedContentInfo *ossl_cms_get0_env_enc_content(const CMS_ContentInfo *cms);
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ static int test_encrypt_decrypt(const EVP_CIPHER *cipher)
|
|||
BIO_free(outmsgbio);
|
||||
CMS_ContentInfo_free(content);
|
||||
|
||||
return testresult;
|
||||
return testresult && TEST_int_eq(ERR_peek_error(), 0);
|
||||
}
|
||||
|
||||
static int test_encrypt_decrypt_aes_cbc(void)
|
||||
|
|
@ -286,7 +286,7 @@ static int test_d2i_CMS_bio_NULL(void)
|
|||
CMS_NO_SIGNER_CERT_VERIFY));
|
||||
CMS_ContentInfo_free(cms);
|
||||
BIO_free(bio);
|
||||
return ret;
|
||||
return ret && TEST_int_eq(ERR_peek_error(), 0);
|
||||
}
|
||||
|
||||
static unsigned char *read_all(BIO *bio, long *p_len)
|
||||
|
|
|
|||
Loading…
Reference in New Issue