| File: | out/../deps/openssl/openssl/crypto/cms/cms_enc.c |
| Warning: | line 165, column 13 Null pointer passed to 2nd parameter expecting 'nonnull' |
Press '?' to see keyboard shortcuts
Keyboard shortcuts:
| 1 | /* | ||||
| 2 | * Copyright 2008-2021 The OpenSSL Project Authors. All Rights Reserved. | ||||
| 3 | * | ||||
| 4 | * Licensed under the Apache License 2.0 (the "License"). You may not use | ||||
| 5 | * this file except in compliance with the License. You can obtain a copy | ||||
| 6 | * in the file LICENSE in the source distribution or at | ||||
| 7 | * https://www.openssl.org/source/license.html | ||||
| 8 | */ | ||||
| 9 | |||||
| 10 | #include "internal/cryptlib.h" | ||||
| 11 | #include <openssl/asn1t.h> | ||||
| 12 | #include <openssl/pem.h> | ||||
| 13 | #include <openssl/x509v3.h> | ||||
| 14 | #include <openssl/err.h> | ||||
| 15 | #include <openssl/cms.h> | ||||
| 16 | #include <openssl/rand.h> | ||||
| 17 | #include "crypto/evp.h" | ||||
| 18 | #include "cms_local.h" | ||||
| 19 | |||||
| 20 | /* CMS EncryptedData Utilities */ | ||||
| 21 | |||||
| 22 | /* Return BIO based on EncryptedContentInfo and key */ | ||||
| 23 | |||||
| 24 | BIO *ossl_cms_EncryptedContent_init_bio(CMS_EncryptedContentInfo *ec, | ||||
| 25 | const CMS_CTX *cms_ctx) | ||||
| 26 | { | ||||
| 27 | BIO *b; | ||||
| 28 | EVP_CIPHER_CTX *ctx; | ||||
| 29 | EVP_CIPHER *fetched_ciph = NULL((void*)0); | ||||
| 30 | const EVP_CIPHER *cipher = NULL((void*)0); | ||||
| 31 | X509_ALGOR *calg = ec->contentEncryptionAlgorithm; | ||||
| 32 | evp_cipher_aead_asn1_params aparams; | ||||
| 33 | unsigned char iv[EVP_MAX_IV_LENGTH16], *piv = NULL((void*)0); | ||||
| 34 | unsigned char *tkey = NULL((void*)0); | ||||
| 35 | int len; | ||||
| 36 | int ivlen = 0; | ||||
| 37 | size_t tkeylen = 0; | ||||
| 38 | int ok = 0; | ||||
| 39 | int enc, keep_key = 0; | ||||
| 40 | OSSL_LIB_CTX *libctx = ossl_cms_ctx_get0_libctx(cms_ctx); | ||||
| 41 | const char *propq = ossl_cms_ctx_get0_propq(cms_ctx); | ||||
| 42 | |||||
| 43 | enc = ec->cipher
| ||||
| 44 | |||||
| 45 | b = BIO_new(BIO_f_cipher()); | ||||
| 46 | if (b == NULL((void*)0)) { | ||||
| 47 | ERR_raise(ERR_LIB_CMS, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,47,__func__), ERR_set_error)((46),((256|((0x1 << 18L)| (0x2 << 18L)))),((void*)0)); | ||||
| 48 | return NULL((void*)0); | ||||
| 49 | } | ||||
| 50 | |||||
| 51 | BIO_get_cipher_ctx(b, &ctx)BIO_ctrl(b,129,0,(&ctx)); | ||||
| 52 | |||||
| 53 | (void)ERR_set_mark(); | ||||
| 54 | if (enc
| ||||
| 55 | cipher = ec->cipher; | ||||
| 56 | /* | ||||
| 57 | * If not keeping key set cipher to NULL so subsequent calls decrypt. | ||||
| 58 | */ | ||||
| 59 | if (ec->key != NULL((void*)0)) | ||||
| 60 | ec->cipher = NULL((void*)0); | ||||
| 61 | } else { | ||||
| 62 | cipher = EVP_get_cipherbyobj(calg->algorithm)EVP_get_cipherbyname(OBJ_nid2sn(OBJ_obj2nid(calg->algorithm ))); | ||||
| 63 | } | ||||
| 64 | if (cipher
| ||||
| 65 | fetched_ciph = EVP_CIPHER_fetch(libctx, EVP_CIPHER_get0_name(cipher), | ||||
| 66 | propq); | ||||
| 67 | if (fetched_ciph != NULL((void*)0)) | ||||
| 68 | cipher = fetched_ciph; | ||||
| 69 | } | ||||
| 70 | if (cipher
| ||||
| 71 | (void)ERR_clear_last_mark(); | ||||
| 72 | ERR_raise(ERR_LIB_CMS, CMS_R_UNKNOWN_CIPHER)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,72,__func__), ERR_set_error)((46),(148),((void*)0)); | ||||
| 73 | goto err; | ||||
| 74 | } | ||||
| 75 | (void)ERR_pop_to_mark(); | ||||
| 76 | |||||
| 77 | if (EVP_CipherInit_ex(ctx, cipher, NULL((void*)0), NULL((void*)0), NULL((void*)0), enc) <= 0) { | ||||
| 78 | ERR_raise(ERR_LIB_CMS, CMS_R_CIPHER_INITIALISATION_ERROR)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,78,__func__), ERR_set_error)((46),(101),((void*)0)); | ||||
| 79 | goto err; | ||||
| 80 | } | ||||
| 81 | |||||
| 82 | if (enc
| ||||
| 83 | calg->algorithm = OBJ_nid2obj(EVP_CIPHER_CTX_get_type(ctx)EVP_CIPHER_get_type(EVP_CIPHER_CTX_get0_cipher(ctx))); | ||||
| 84 | /* Generate a random IV if we need one */ | ||||
| 85 | ivlen = EVP_CIPHER_CTX_get_iv_length(ctx); | ||||
| 86 | if (ivlen > 0) { | ||||
| 87 | if (RAND_bytes_ex(libctx, iv, ivlen, 0) <= 0) | ||||
| 88 | goto err; | ||||
| 89 | piv = iv; | ||||
| 90 | } | ||||
| 91 | } else { | ||||
| 92 | if (evp_cipher_asn1_to_param_ex(ctx, calg->parameter, &aparams) <= 0) { | ||||
| 93 | ERR_raise(ERR_LIB_CMS, CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,93,__func__), ERR_set_error)((46),(102),((void*)0)); | ||||
| 94 | goto err; | ||||
| 95 | } | ||||
| 96 | if ((EVP_CIPHER_get_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER0x200000)) { | ||||
| 97 | piv = aparams.iv; | ||||
| 98 | if (ec->taglen > 0 | ||||
| 99 | && EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_AEAD_SET_TAG0x11, | ||||
| 100 | ec->taglen, ec->tag) <= 0) { | ||||
| 101 | ERR_raise(ERR_LIB_CMS, CMS_R_CIPHER_AEAD_SET_TAG_ERROR)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,101,__func__), ERR_set_error)((46),(184),((void*)0)); | ||||
| 102 | goto err; | ||||
| 103 | } | ||||
| 104 | } | ||||
| 105 | } | ||||
| 106 | len = EVP_CIPHER_CTX_get_key_length(ctx); | ||||
| 107 | if (len <= 0) | ||||
| 108 | goto err; | ||||
| 109 | tkeylen = (size_t)len; | ||||
| 110 | |||||
| 111 | /* Generate random session key */ | ||||
| 112 | if (!enc
| ||||
| 113 | tkey = OPENSSL_malloc(tkeylen)CRYPTO_malloc(tkeylen, "../deps/openssl/openssl/crypto/cms/cms_enc.c" , 113); | ||||
| 114 | if (tkey == NULL((void*)0)) { | ||||
| 115 | ERR_raise(ERR_LIB_CMS, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,115,__func__), ERR_set_error)((46),((256|((0x1 << 18L) |(0x2 << 18L)))),((void*)0)); | ||||
| 116 | goto err; | ||||
| 117 | } | ||||
| 118 | if (EVP_CIPHER_CTX_rand_key(ctx, tkey) <= 0) | ||||
| 119 | goto err; | ||||
| 120 | } | ||||
| 121 | |||||
| 122 | if (!ec->key
| ||||
| 123 | ec->key = tkey; | ||||
| 124 | ec->keylen = tkeylen; | ||||
| 125 | tkey = NULL((void*)0); | ||||
| 126 | if (enc) | ||||
| 127 | keep_key = 1; | ||||
| 128 | else | ||||
| 129 | ERR_clear_error(); | ||||
| 130 | |||||
| 131 | } | ||||
| 132 | |||||
| 133 | if (ec->keylen != tkeylen) { | ||||
| 134 | /* If necessary set key length */ | ||||
| 135 | if (EVP_CIPHER_CTX_set_key_length(ctx, ec->keylen) <= 0) { | ||||
| 136 | /* | ||||
| 137 | * Only reveal failure if debugging so we don't leak information | ||||
| 138 | * which may be useful in MMA. | ||||
| 139 | */ | ||||
| 140 | if (enc || ec->debug) { | ||||
| 141 | ERR_raise(ERR_LIB_CMS, CMS_R_INVALID_KEY_LENGTH)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,141,__func__), ERR_set_error)((46),(118),((void*)0)); | ||||
| 142 | goto err; | ||||
| 143 | } else { | ||||
| 144 | /* Use random key */ | ||||
| 145 | OPENSSL_clear_free(ec->key, ec->keylen)CRYPTO_clear_free(ec->key, ec->keylen, "../deps/openssl/openssl/crypto/cms/cms_enc.c" , 145); | ||||
| 146 | ec->key = tkey; | ||||
| 147 | ec->keylen = tkeylen; | ||||
| 148 | tkey = NULL((void*)0); | ||||
| 149 | ERR_clear_error(); | ||||
| 150 | } | ||||
| 151 | } | ||||
| 152 | } | ||||
| 153 | |||||
| 154 | if (EVP_CipherInit_ex(ctx, NULL((void*)0), NULL((void*)0), ec->key, piv, enc) <= 0) { | ||||
| 155 | ERR_raise(ERR_LIB_CMS, CMS_R_CIPHER_INITIALISATION_ERROR)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,155,__func__), ERR_set_error)((46),(101),((void*)0)); | ||||
| 156 | goto err; | ||||
| 157 | } | ||||
| 158 | if (enc
| ||||
| 159 | calg->parameter = ASN1_TYPE_new(); | ||||
| 160 | if (calg->parameter == NULL((void*)0)) { | ||||
| 161 | ERR_raise(ERR_LIB_CMS, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,161,__func__), ERR_set_error)((46),((256|((0x1 << 18L) |(0x2 << 18L)))),((void*)0)); | ||||
| 162 | goto err; | ||||
| 163 | } | ||||
| 164 | if ((EVP_CIPHER_get_flags(cipher) & EVP_CIPH_FLAG_AEAD_CIPHER0x200000)) { | ||||
| 165 | memcpy(aparams.iv, piv, ivlen); | ||||
| |||||
| 166 | aparams.iv_len = ivlen; | ||||
| 167 | aparams.tag_len = EVP_CIPHER_CTX_get_tag_length(ctx); | ||||
| 168 | if (aparams.tag_len <= 0) | ||||
| 169 | goto err; | ||||
| 170 | } | ||||
| 171 | |||||
| 172 | if (evp_cipher_param_to_asn1_ex(ctx, calg->parameter, &aparams) <= 0) { | ||||
| 173 | ERR_raise(ERR_LIB_CMS, CMS_R_CIPHER_PARAMETER_INITIALISATION_ERROR)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,173,__func__), ERR_set_error)((46),(102),((void*)0)); | ||||
| 174 | goto err; | ||||
| 175 | } | ||||
| 176 | /* If parameter type not set omit parameter */ | ||||
| 177 | if (calg->parameter->type == V_ASN1_UNDEF-1) { | ||||
| 178 | ASN1_TYPE_free(calg->parameter); | ||||
| 179 | calg->parameter = NULL((void*)0); | ||||
| 180 | } | ||||
| 181 | } | ||||
| 182 | ok = 1; | ||||
| 183 | |||||
| 184 | err: | ||||
| 185 | EVP_CIPHER_free(fetched_ciph); | ||||
| 186 | if (!keep_key || !ok) { | ||||
| 187 | OPENSSL_clear_free(ec->key, ec->keylen)CRYPTO_clear_free(ec->key, ec->keylen, "../deps/openssl/openssl/crypto/cms/cms_enc.c" , 187); | ||||
| 188 | ec->key = NULL((void*)0); | ||||
| 189 | } | ||||
| 190 | OPENSSL_clear_free(tkey, tkeylen)CRYPTO_clear_free(tkey, tkeylen, "../deps/openssl/openssl/crypto/cms/cms_enc.c" , 190); | ||||
| 191 | if (ok) | ||||
| 192 | return b; | ||||
| 193 | BIO_free(b); | ||||
| 194 | return NULL((void*)0); | ||||
| 195 | } | ||||
| 196 | |||||
| 197 | int ossl_cms_EncryptedContent_init(CMS_EncryptedContentInfo *ec, | ||||
| 198 | const EVP_CIPHER *cipher, | ||||
| 199 | const unsigned char *key, size_t keylen, | ||||
| 200 | const CMS_CTX *cms_ctx) | ||||
| 201 | { | ||||
| 202 | ec->cipher = cipher; | ||||
| 203 | if (key) { | ||||
| 204 | if ((ec->key = OPENSSL_malloc(keylen)CRYPTO_malloc(keylen, "../deps/openssl/openssl/crypto/cms/cms_enc.c" , 204)) == NULL((void*)0)) { | ||||
| 205 | ERR_raise(ERR_LIB_CMS, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,205,__func__), ERR_set_error)((46),((256|((0x1 << 18L) |(0x2 << 18L)))),((void*)0)); | ||||
| 206 | return 0; | ||||
| 207 | } | ||||
| 208 | memcpy(ec->key, key, keylen); | ||||
| 209 | } | ||||
| 210 | ec->keylen = keylen; | ||||
| 211 | if (cipher != NULL((void*)0)) | ||||
| 212 | ec->contentType = OBJ_nid2obj(NID_pkcs7_data21); | ||||
| 213 | return 1; | ||||
| 214 | } | ||||
| 215 | |||||
| 216 | int CMS_EncryptedData_set1_key(CMS_ContentInfo *cms, const EVP_CIPHER *ciph, | ||||
| 217 | const unsigned char *key, size_t keylen) | ||||
| 218 | { | ||||
| 219 | CMS_EncryptedContentInfo *ec; | ||||
| 220 | |||||
| 221 | if (!key || !keylen) { | ||||
| 222 | ERR_raise(ERR_LIB_CMS, CMS_R_NO_KEY)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,222,__func__), ERR_set_error)((46),(130),((void*)0)); | ||||
| 223 | return 0; | ||||
| 224 | } | ||||
| 225 | if (ciph) { | ||||
| 226 | cms->d.encryptedData = M_ASN1_new_of(CMS_EncryptedData)(CMS_EncryptedData *)ASN1_item_new((CMS_EncryptedData_it())); | ||||
| 227 | if (!cms->d.encryptedData) { | ||||
| 228 | ERR_raise(ERR_LIB_CMS, ERR_R_MALLOC_FAILURE)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,228,__func__), ERR_set_error)((46),((256|((0x1 << 18L) |(0x2 << 18L)))),((void*)0)); | ||||
| 229 | return 0; | ||||
| 230 | } | ||||
| 231 | cms->contentType = OBJ_nid2obj(NID_pkcs7_encrypted26); | ||||
| 232 | cms->d.encryptedData->version = 0; | ||||
| 233 | } else if (OBJ_obj2nid(cms->contentType) != NID_pkcs7_encrypted26) { | ||||
| 234 | ERR_raise(ERR_LIB_CMS, CMS_R_NOT_ENCRYPTED_DATA)(ERR_new(), ERR_set_debug("../deps/openssl/openssl/crypto/cms/cms_enc.c" ,234,__func__), ERR_set_error)((46),(122),((void*)0)); | ||||
| 235 | return 0; | ||||
| 236 | } | ||||
| 237 | ec = cms->d.encryptedData->encryptedContentInfo; | ||||
| 238 | return ossl_cms_EncryptedContent_init(ec, ciph, key, keylen, | ||||
| 239 | ossl_cms_get0_cmsctx(cms)); | ||||
| 240 | } | ||||
| 241 | |||||
| 242 | BIO *ossl_cms_EncryptedData_init_bio(const CMS_ContentInfo *cms) | ||||
| 243 | { | ||||
| 244 | CMS_EncryptedData *enc = cms->d.encryptedData; | ||||
| 245 | if (enc->encryptedContentInfo->cipher && enc->unprotectedAttrs) | ||||
| |||||
| 246 | enc->version = 2; | ||||
| 247 | return ossl_cms_EncryptedContent_init_bio(enc->encryptedContentInfo, | ||||
| 248 | ossl_cms_get0_cmsctx(cms)); | ||||
| 249 | } |