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 | } |