mirror of
https://github.com/openssl/openssl.git
synced 2026-01-18 17:11:31 +01:00
CMS: Produce error when AEAD algorithms are used in enveloped data
Fixes GH-21414 Reviewed-by: Matt Caswell <matt@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/27772)
This commit is contained in:
committed by
Tomas Mraz
parent
5eeeaa7da3
commit
2dda0c50ea
@@ -23,7 +23,7 @@
|
|||||||
/* Return BIO based on EncryptedContentInfo and key */
|
/* Return BIO based on EncryptedContentInfo and key */
|
||||||
|
|
||||||
BIO *ossl_cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec,
|
BIO *ossl_cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec,
|
||||||
const CMS_CTX *cms_ctx)
|
const CMS_CTX *cms_ctx, int auth)
|
||||||
{
|
{
|
||||||
BIO *b;
|
BIO *b;
|
||||||
EVP_CIPHER_CTX *ctx;
|
EVP_CIPHER_CTX *ctx;
|
||||||
@@ -104,6 +104,10 @@ BIO *ossl_cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec,
|
|||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
if ((EVP_CIPHER_get_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER)) {
|
if ((EVP_CIPHER_get_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER)) {
|
||||||
|
if (!auth) {
|
||||||
|
ERR_raise(ERR_LIB_CMS, CMS_R_CIPHER_AEAD_IN_ENVELOPED_DATA);
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
piv = aparams.iv;
|
piv = aparams.iv;
|
||||||
if (ec->taglen > 0
|
if (ec->taglen > 0
|
||||||
&& EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
|
&& EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG,
|
||||||
@@ -255,5 +259,5 @@ BIO *ossl_cms_EncryptedData_init_bio(const CMS_ContentInfo *cms)
|
|||||||
if (enc->encryptedContentInfo->cipher && enc->unprotectedAttrs)
|
if (enc->encryptedContentInfo->cipher && enc->unprotectedAttrs)
|
||||||
enc->version = 2;
|
enc->version = 2;
|
||||||
return ossl_cms_EncryptedContent_init_bio(enc->encryptedContentInfo,
|
return ossl_cms_EncryptedContent_init_bio(enc->encryptedContentInfo,
|
||||||
ossl_cms_get0_cmsctx(cms));
|
ossl_cms_get0_cmsctx(cms), 0);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1173,7 +1173,8 @@ static BIO *cms_EnvelopedData_Decryption_init_bio(CMS_ContentInfo *cms)
|
|||||||
{
|
{
|
||||||
CMS_EncryptedContentInfo *ec = cms->d.envelopedData->encryptedContentInfo;
|
CMS_EncryptedContentInfo *ec = cms->d.envelopedData->encryptedContentInfo;
|
||||||
BIO *contentBio = ossl_cms_EncryptedContent_init_bio(ec,
|
BIO *contentBio = ossl_cms_EncryptedContent_init_bio(ec,
|
||||||
ossl_cms_get0_cmsctx(cms));
|
ossl_cms_get0_cmsctx(cms),
|
||||||
|
0);
|
||||||
EVP_CIPHER_CTX *ctx = NULL;
|
EVP_CIPHER_CTX *ctx = NULL;
|
||||||
|
|
||||||
if (contentBio == NULL)
|
if (contentBio == NULL)
|
||||||
@@ -1209,7 +1210,7 @@ static BIO *cms_EnvelopedData_Encryption_init_bio(CMS_ContentInfo *cms)
|
|||||||
/* Get BIO first to set up key */
|
/* Get BIO first to set up key */
|
||||||
|
|
||||||
ec = env->encryptedContentInfo;
|
ec = env->encryptedContentInfo;
|
||||||
ret = ossl_cms_EncryptedContent_init_bio(ec, ossl_cms_get0_cmsctx(cms));
|
ret = ossl_cms_EncryptedContent_init_bio(ec, ossl_cms_get0_cmsctx(cms), 0);
|
||||||
|
|
||||||
/* If error end of processing */
|
/* If error end of processing */
|
||||||
if (!ret)
|
if (!ret)
|
||||||
@@ -1261,7 +1262,7 @@ BIO *ossl_cms_AuthEnvelopedData_init_bio(CMS_ContentInfo *cms)
|
|||||||
ec->tag = aenv->mac->data;
|
ec->tag = aenv->mac->data;
|
||||||
ec->taglen = aenv->mac->length;
|
ec->taglen = aenv->mac->length;
|
||||||
}
|
}
|
||||||
ret = ossl_cms_EncryptedContent_init_bio(ec, ossl_cms_get0_cmsctx(cms));
|
ret = ossl_cms_EncryptedContent_init_bio(ec, ossl_cms_get0_cmsctx(cms), 1);
|
||||||
|
|
||||||
/* If error or no cipher end of processing */
|
/* If error or no cipher end of processing */
|
||||||
if (ret == NULL || ec->cipher == NULL)
|
if (ret == NULL || ec->cipher == NULL)
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ static const ERR_STRING_DATA CMS_str_reasons[] = {
|
|||||||
"certificate has no keyid"},
|
"certificate has no keyid"},
|
||||||
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_CERTIFICATE_VERIFY_ERROR),
|
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_CERTIFICATE_VERIFY_ERROR),
|
||||||
"certificate verify error"},
|
"certificate verify error"},
|
||||||
|
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_CIPHER_AEAD_IN_ENVELOPED_DATA),
|
||||||
|
"cipher aead in enveloped data"},
|
||||||
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_CIPHER_AEAD_SET_TAG_ERROR),
|
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_CIPHER_AEAD_SET_TAG_ERROR),
|
||||||
"cipher aead set tag error"},
|
"cipher aead set tag error"},
|
||||||
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_CIPHER_GET_TAG), "cipher get tag"},
|
{ERR_PACK(ERR_LIB_CMS, 0, CMS_R_CIPHER_GET_TAG), "cipher get tag"},
|
||||||
|
|||||||
@@ -464,7 +464,7 @@ int ossl_cms_set1_ias(CMS_IssuerAndSerialNumber **pias, X509 *cert);
|
|||||||
int ossl_cms_set1_keyid(ASN1_OCTET_STRING **pkeyid, X509 *cert);
|
int ossl_cms_set1_keyid(ASN1_OCTET_STRING **pkeyid, X509 *cert);
|
||||||
|
|
||||||
BIO *ossl_cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec,
|
BIO *ossl_cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec,
|
||||||
const CMS_CTX *ctx);
|
const CMS_CTX *ctx, int auth);
|
||||||
BIO *ossl_cms_EncryptedData_init_bio(const CMS_ContentInfo *cms);
|
BIO *ossl_cms_EncryptedData_init_bio(const CMS_ContentInfo *cms);
|
||||||
int ossl_cms_EncryptedContent_init(CMS_EncryptedContentInfo *ec,
|
int ossl_cms_EncryptedContent_init(CMS_EncryptedContentInfo *ec,
|
||||||
const EVP_CIPHER *cipher,
|
const EVP_CIPHER *cipher,
|
||||||
|
|||||||
@@ -311,6 +311,7 @@ CMS_R_ATTRIBUTE_ERROR:161:attribute error
|
|||||||
CMS_R_CERTIFICATE_ALREADY_PRESENT:175:certificate already present
|
CMS_R_CERTIFICATE_ALREADY_PRESENT:175:certificate already present
|
||||||
CMS_R_CERTIFICATE_HAS_NO_KEYID:160:certificate has no keyid
|
CMS_R_CERTIFICATE_HAS_NO_KEYID:160:certificate has no keyid
|
||||||
CMS_R_CERTIFICATE_VERIFY_ERROR:100:certificate verify error
|
CMS_R_CERTIFICATE_VERIFY_ERROR:100:certificate verify error
|
||||||
|
CMS_R_CIPHER_AEAD_IN_ENVELOPED_DATA:200:cipher aead in enveloped data
|
||||||
CMS_R_CIPHER_AEAD_SET_TAG_ERROR:184:cipher aead set tag error
|
CMS_R_CIPHER_AEAD_SET_TAG_ERROR:184:cipher aead set tag error
|
||||||
CMS_R_CIPHER_GET_TAG:185:cipher get tag
|
CMS_R_CIPHER_GET_TAG:185:cipher get tag
|
||||||
CMS_R_CIPHER_INITIALISATION_ERROR:101:cipher initialisation error
|
CMS_R_CIPHER_INITIALISATION_ERROR:101:cipher initialisation error
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
# define CMS_R_CERTIFICATE_ALREADY_PRESENT 175
|
# define CMS_R_CERTIFICATE_ALREADY_PRESENT 175
|
||||||
# define CMS_R_CERTIFICATE_HAS_NO_KEYID 160
|
# define CMS_R_CERTIFICATE_HAS_NO_KEYID 160
|
||||||
# define CMS_R_CERTIFICATE_VERIFY_ERROR 100
|
# define CMS_R_CERTIFICATE_VERIFY_ERROR 100
|
||||||
|
# define CMS_R_CIPHER_AEAD_IN_ENVELOPED_DATA 200
|
||||||
# define CMS_R_CIPHER_AEAD_SET_TAG_ERROR 184
|
# define CMS_R_CIPHER_AEAD_SET_TAG_ERROR 184
|
||||||
# define CMS_R_CIPHER_GET_TAG 185
|
# define CMS_R_CIPHER_GET_TAG 185
|
||||||
# define CMS_R_CIPHER_INITIALISATION_ERROR 101
|
# define CMS_R_CIPHER_INITIALISATION_ERROR 101
|
||||||
|
|||||||
7
test/cms-msg/enveloped-content-type-for-aes-gcm.pem
Normal file
7
test/cms-msg/enveloped-content-type-for-aes-gcm.pem
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
-----BEGIN PKCS7-----
|
||||||
|
MIAGCSqGSIb3DQEHA6CAMIACAQIxNqI0AgEEMAgEBkMwRkVFMDALBglghkgBZQME
|
||||||
|
AQUEGPN0q9rM3neSiY7HIADpnqWym33mRZC4JDCABgkqhkiG9w0BBwEwHgYJYIZI
|
||||||
|
AWUDBAEGMBEEDIExQGiHZFSYa0ZBqQIBEKCABGNap+JL1B21Mq7ojKPzVuxtRkg3
|
||||||
|
LWt8khnK1EzfmV7e64l5KnTdjq9+gfbwOfbuhTavfBI7VK/ZtpH3HII4fCOe37kV
|
||||||
|
mju8/YnYeRq2KcxESmJBySV/veMwxqmHGAw71JyHpg4AAAAAAAAAAAAA
|
||||||
|
-----END PKCS7-----
|
||||||
@@ -46,10 +46,11 @@ static int test_encrypt_decrypt(const EVP_CIPHER *cipher)
|
|||||||
CMS_TEXT)))
|
CMS_TEXT)))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
if (!TEST_ptr(contentbio =
|
if (!(EVP_CIPHER_get_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER)
|
||||||
CMS_EnvelopedData_decrypt(content->d.envelopedData,
|
&& !TEST_ptr(contentbio =
|
||||||
NULL, privkey, cert, NULL,
|
CMS_EnvelopedData_decrypt(content->d.envelopedData,
|
||||||
CMS_TEXT, NULL, NULL)))
|
NULL, privkey, cert, NULL,
|
||||||
|
CMS_TEXT, NULL, NULL)))
|
||||||
goto end;
|
goto end;
|
||||||
|
|
||||||
/* Check we got the message we first started with */
|
/* Check we got the message we first started with */
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ my ($no_des, $no_dh, $no_dsa, $no_ec, $no_ec2m, $no_rc2, $no_zlib)
|
|||||||
|
|
||||||
$no_rc2 = 1 if disabled("legacy");
|
$no_rc2 = 1 if disabled("legacy");
|
||||||
|
|
||||||
plan tests => 32;
|
plan tests => 33;
|
||||||
|
|
||||||
ok(run(test(["pkcs7_test"])), "test pkcs7");
|
ok(run(test(["pkcs7_test"])), "test pkcs7");
|
||||||
|
|
||||||
@@ -1312,6 +1312,16 @@ ok(!run(app(['openssl', 'cms', '-verify',
|
|||||||
])),
|
])),
|
||||||
"issue#19643");
|
"issue#19643");
|
||||||
|
|
||||||
|
# Check that users get error when using incorrect envelope type for AEAD algorithms
|
||||||
|
ok(!run(app(['openssl', 'cms', '-decrypt',
|
||||||
|
'-inform', 'PEM', '-stream',
|
||||||
|
'-secretkey', '000102030405060708090A0B0C0D0E0F',
|
||||||
|
'-secretkeyid', 'C0FEE0',
|
||||||
|
'-in', srctop_file("test/cms-msg",
|
||||||
|
"enveloped-content-type-for-aes-gcm.pem")
|
||||||
|
])),
|
||||||
|
"Error AES-GCM in enveloped content type");
|
||||||
|
|
||||||
# Check that kari encryption with originator does not segfault
|
# Check that kari encryption with originator does not segfault
|
||||||
with({ exit_checker => sub { return shift == 3; } },
|
with({ exit_checker => sub { return shift == 3; } },
|
||||||
sub {
|
sub {
|
||||||
|
|||||||
Reference in New Issue
Block a user