Skip to content

Commit

Permalink
Do not raise CMS_R_CONTENT_TYPE_NOT_ENVELOPED_DATA error in CMS_Conte…
Browse files Browse the repository at this point in the history
…ntInfo_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 #21676)
  • Loading branch information
obatysh authored and t8m committed Aug 10, 2023
1 parent 6d38cce commit 13342ef
Show file tree
Hide file tree
Showing 4 changed files with 23 additions and 8 deletions.
21 changes: 19 additions & 2 deletions crypto/cms/cms_env.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand All @@ -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) {
Expand Down
5 changes: 1 addition & 4 deletions crypto/cms/cms_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,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));
}
Expand Down
1 change: 1 addition & 0 deletions crypto/cms/cms_local.h
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,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);
Expand Down
4 changes: 2 additions & 2 deletions test/cmsapitest.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,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)
Expand Down Expand Up @@ -312,7 +312,7 @@ static int test_d2i_CMS_bio_NULL(void)
BIO_free(content);
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)
Expand Down

0 comments on commit 13342ef

Please sign in to comment.