]> git.ipfire.org Git - thirdparty/openssl.git/blame - crypto/evp/evp_enc.c
GCM cipher in provider now fails if passed bad keylength
[thirdparty/openssl.git] / crypto / evp / evp_enc.c
CommitLineData
62867571 1/*
a672a02a 2 * Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
d02b48c6 3 *
4a8b0c55 4 * Licensed under the Apache License 2.0 (the "License"). You may not use
62867571
RS
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
d02b48c6
RE
8 */
9
10#include <stdio.h>
c3a73daf 11#include <assert.h>
b39fc560 12#include "internal/cryptlib.h"
ec577822 13#include <openssl/evp.h>
7f060601 14#include <openssl/err.h>
3a87a9b9 15#include <openssl/rand.h>
6decf943 16#include <openssl/rand_drbg.h>
3c27208f 17#include <openssl/engine.h>
df05f2ce
MC
18#include <openssl/params.h>
19#include <openssl/core_names.h>
135727ab 20#include "internal/evp_int.h"
df05f2ce 21#include "internal/provider.h"
57ae2e24 22#include "evp_locl.h"
d02b48c6 23
df05f2ce 24int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *ctx)
0f113f3e 25{
df05f2ce 26 if (ctx == NULL)
8baf9968 27 return 1;
df05f2ce
MC
28
29 if (ctx->cipher == NULL || ctx->cipher->prov == NULL)
30 goto legacy;
31
32 if (ctx->provctx != NULL) {
33 if (ctx->cipher->freectx != NULL)
34 ctx->cipher->freectx(ctx->provctx);
35 ctx->provctx = NULL;
36 }
37 if (ctx->fetched_cipher != NULL)
38 EVP_CIPHER_meth_free(ctx->fetched_cipher);
39 memset(ctx, 0, sizeof(*ctx));
40
41 return 1;
42
43 /* TODO(3.0): Remove legacy code below */
44 legacy:
45
46 if (ctx->cipher != NULL) {
47 if (ctx->cipher->cleanup && !ctx->cipher->cleanup(ctx))
8baf9968
RL
48 return 0;
49 /* Cleanse cipher context data */
df05f2ce
MC
50 if (ctx->cipher_data && ctx->cipher->ctx_size)
51 OPENSSL_cleanse(ctx->cipher_data, ctx->cipher->ctx_size);
8baf9968 52 }
df05f2ce 53 OPENSSL_free(ctx->cipher_data);
319e518a 54#if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
df05f2ce 55 ENGINE_finish(ctx->engine);
8baf9968 56#endif
df05f2ce 57 memset(ctx, 0, sizeof(*ctx));
8baf9968 58 return 1;
0f113f3e 59}
d02b48c6 60
b40228a6 61EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void)
0f113f3e 62{
8baf9968
RL
63 return OPENSSL_zalloc(sizeof(EVP_CIPHER_CTX));
64}
65
66void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
67{
68 EVP_CIPHER_CTX_reset(ctx);
69 OPENSSL_free(ctx);
0f113f3e 70}
581f1c84 71
360370d9 72int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
0f113f3e
MC
73 const unsigned char *key, const unsigned char *iv, int enc)
74{
ffd23209
KR
75 if (cipher != NULL)
76 EVP_CIPHER_CTX_reset(ctx);
0f113f3e
MC
77 return EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, enc);
78}
79
80int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
81 ENGINE *impl, const unsigned char *key,
82 const unsigned char *iv, int enc)
83{
319e518a 84#if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
df05f2ce 85 ENGINE *tmpimpl = NULL;
319e518a 86#endif
df05f2ce
MC
87 const EVP_CIPHER *tmpcipher;
88
89 /*
90 * enc == 1 means we are encrypting.
91 * enc == 0 means we are decrypting.
92 * enc == -1 means, use the previously initialised value for encrypt/decrypt
93 */
94 if (enc == -1) {
0f113f3e 95 enc = ctx->encrypt;
df05f2ce 96 } else {
0f113f3e
MC
97 if (enc)
98 enc = 1;
99 ctx->encrypt = enc;
100 }
df05f2ce
MC
101
102 if (cipher == NULL && ctx->cipher == NULL) {
103 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_NO_CIPHER_SET);
104 return 0;
105 }
106
107 /* TODO(3.0): Legacy work around code below. Remove this */
108
319e518a 109#if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
0f113f3e
MC
110 /*
111 * Whether it's nice or not, "Inits" can be used on "Final"'d contexts so
112 * this context may already have an ENGINE! Try to avoid releasing the
113 * previous handle, re-querying for an ENGINE, and having a
0d4fb843 114 * reinitialisation, when it may all be unnecessary.
0f113f3e 115 */
f6b94279 116 if (ctx->engine && ctx->cipher
a7f9e0a4 117 && (cipher == NULL || cipher->nid == ctx->cipher->nid))
0f113f3e 118 goto skip_to_init;
df05f2ce
MC
119
120 if (cipher != NULL && impl == NULL) {
121 /* Ask if an ENGINE is reserved for this job */
122 tmpimpl = ENGINE_get_cipher_engine(cipher->nid);
123 }
0b13e9f0 124#endif
df05f2ce
MC
125
126 /*
127 * If there are engines involved then we should use legacy handling for now.
128 */
129 if (ctx->engine != NULL
319e518a
MC
130#if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
131 || tmpimpl != NULL
132#endif
133 || impl != NULL) {
df05f2ce
MC
134 if (ctx->cipher == ctx->fetched_cipher)
135 ctx->cipher = NULL;
136 EVP_CIPHER_meth_free(ctx->fetched_cipher);
137 ctx->fetched_cipher = NULL;
138 goto legacy;
139 }
140
141 tmpcipher = (cipher == NULL) ? ctx->cipher : cipher;
142
143 if (tmpcipher->prov == NULL) {
144 switch(tmpcipher->nid) {
aab26e6f 145 case NID_aes_256_ecb:
f4a129bb
MC
146 case NID_aes_192_ecb:
147 case NID_aes_128_ecb:
718b133a
MC
148 case NID_aes_256_cbc:
149 case NID_aes_192_cbc:
150 case NID_aes_128_cbc:
ed98df51
MC
151 case NID_aes_256_ofb128:
152 case NID_aes_192_ofb128:
153 case NID_aes_128_ofb128:
75dd6d64
MC
154 case NID_aes_256_cfb128:
155 case NID_aes_192_cfb128:
156 case NID_aes_128_cfb128:
157 case NID_aes_256_cfb1:
158 case NID_aes_192_cfb1:
159 case NID_aes_128_cfb1:
160 case NID_aes_256_cfb8:
161 case NID_aes_192_cfb8:
162 case NID_aes_128_cfb8:
819a7ae9
MC
163 case NID_aes_256_ctr:
164 case NID_aes_192_ctr:
165 case NID_aes_128_ctr:
a672a02a
SL
166 case NID_aes_256_gcm:
167 case NID_aes_192_gcm:
168 case NID_aes_128_gcm:
169 case NID_aria_256_gcm:
170 case NID_aria_192_gcm:
171 case NID_aria_128_gcm:
aab26e6f 172 break;
df05f2ce
MC
173 default:
174 goto legacy;
175 }
176 }
177
178 /*
179 * Ensure a context left lying around from last time is cleared
180 * (legacy code)
181 */
182 if (cipher != NULL && ctx->cipher != NULL) {
183 OPENSSL_clear_free(ctx->cipher_data, ctx->cipher->ctx_size);
184 ctx->cipher_data = NULL;
185 }
186
187
188 /* TODO(3.0): Start of non-legacy code below */
189
190 /* Ensure a context left lying around from last time is cleared */
191 if (cipher != NULL && ctx->cipher != NULL) {
192 unsigned long flags = ctx->flags;
193
194 EVP_CIPHER_CTX_reset(ctx);
195 /* Restore encrypt and flags */
196 ctx->encrypt = enc;
197 ctx->flags = flags;
198 }
199
200 if (cipher != NULL)
201 ctx->cipher = cipher;
202 else
203 cipher = ctx->cipher;
204
205 if (cipher->prov == NULL) {
319e518a
MC
206#ifdef FIPS_MODE
207 /* We only do explict fetches inside the FIPS module */
208 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
209 return 0;
210#else
211 EVP_CIPHER *provciph =
212 EVP_CIPHER_fetch(NULL, OBJ_nid2sn(cipher->nid), "");
213
df05f2ce
MC
214 if (provciph == NULL) {
215 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
216 return 0;
217 }
218 cipher = provciph;
219 EVP_CIPHER_meth_free(ctx->fetched_cipher);
220 ctx->fetched_cipher = provciph;
319e518a 221#endif
df05f2ce
MC
222 }
223
224 ctx->cipher = cipher;
225 if (ctx->provctx == NULL) {
a39eb840 226 ctx->provctx = ctx->cipher->newctx(ossl_provider_ctx(cipher->prov));
df05f2ce
MC
227 if (ctx->provctx == NULL) {
228 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
229 return 0;
230 }
231 }
232
233 if ((ctx->flags & EVP_CIPH_NO_PADDING) != 0) {
0f113f3e 234 /*
df05f2ce
MC
235 * If this ctx was already set up for no padding then we need to tell
236 * the new cipher about it.
237 */
238 if (!EVP_CIPHER_CTX_set_padding(ctx, 0))
239 return 0;
240 }
241
718b133a
MC
242 switch (EVP_CIPHER_mode(ctx->cipher)) {
243 case EVP_CIPH_CFB_MODE:
244 case EVP_CIPH_OFB_MODE:
245 case EVP_CIPH_CBC_MODE:
246 /* For these modes we remember the original IV for later use */
247 if (!ossl_assert(EVP_CIPHER_CTX_iv_length(ctx) <= (int)sizeof(ctx->oiv))) {
248 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
249 return 0;
250 }
251 if (iv != NULL)
252 memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
253 }
254
df05f2ce
MC
255 if (enc) {
256 if (ctx->cipher->einit == NULL) {
257 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
258 return 0;
259 }
260
344cfa34
MC
261 return ctx->cipher->einit(ctx->provctx,
262 key,
33b40a10
MC
263 key == NULL ? 0
264 : EVP_CIPHER_CTX_key_length(ctx),
344cfa34 265 iv,
33b40a10
MC
266 iv == NULL ? 0
267 : EVP_CIPHER_CTX_iv_length(ctx));
df05f2ce
MC
268 }
269
270 if (ctx->cipher->dinit == NULL) {
271 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
272 return 0;
273 }
274
344cfa34
MC
275 return ctx->cipher->dinit(ctx->provctx,
276 key,
33b40a10
MC
277 key == NULL ? 0
278 : EVP_CIPHER_CTX_key_length(ctx),
344cfa34 279 iv,
33b40a10
MC
280 iv == NULL ? 0
281 : EVP_CIPHER_CTX_iv_length(ctx));
df05f2ce
MC
282
283 /* TODO(3.0): Remove legacy code below */
284 legacy:
285
286 if (cipher != NULL) {
287 /*
288 * Ensure a context left lying around from last time is cleared (we
289 * previously attempted to avoid this if the same ENGINE and
0f113f3e
MC
290 * EVP_CIPHER could be used).
291 */
292 if (ctx->cipher) {
293 unsigned long flags = ctx->flags;
c0ca39bd 294 EVP_CIPHER_CTX_reset(ctx);
0f113f3e
MC
295 /* Restore encrypt and flags */
296 ctx->encrypt = enc;
297 ctx->flags = flags;
298 }
319e518a 299#if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
df05f2ce 300 if (impl != NULL) {
0f113f3e
MC
301 if (!ENGINE_init(impl)) {
302 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
303 return 0;
304 }
df05f2ce
MC
305 } else {
306 impl = tmpimpl;
307 }
308 if (impl != NULL) {
0f113f3e
MC
309 /* There's an ENGINE for this job ... (apparently) */
310 const EVP_CIPHER *c = ENGINE_get_cipher(impl, cipher->nid);
df05f2ce
MC
311
312 if (c == NULL) {
0f113f3e
MC
313 /*
314 * One positive side-effect of US's export control history,
315 * is that we should at least be able to avoid using US
0d4fb843 316 * misspellings of "initialisation"?
0f113f3e
MC
317 */
318 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
319 return 0;
320 }
321 /* We'll use the ENGINE's private cipher definition */
322 cipher = c;
323 /*
324 * Store the ENGINE functional reference so we know 'cipher' came
325 * from an ENGINE and we need to release it when done.
326 */
327 ctx->engine = impl;
df05f2ce 328 } else {
0f113f3e 329 ctx->engine = NULL;
df05f2ce 330 }
0b13e9f0 331#endif
544a2aea 332
0f113f3e
MC
333 ctx->cipher = cipher;
334 if (ctx->cipher->ctx_size) {
b51bce94 335 ctx->cipher_data = OPENSSL_zalloc(ctx->cipher->ctx_size);
90945fa3 336 if (ctx->cipher_data == NULL) {
273a0218 337 ctx->cipher = NULL;
0f113f3e
MC
338 EVPerr(EVP_F_EVP_CIPHERINIT_EX, ERR_R_MALLOC_FAILURE);
339 return 0;
340 }
341 } else {
342 ctx->cipher_data = NULL;
343 }
344 ctx->key_len = cipher->key_len;
345 /* Preserve wrap enable flag, zero everything else */
346 ctx->flags &= EVP_CIPHER_CTX_FLAG_WRAP_ALLOW;
347 if (ctx->cipher->flags & EVP_CIPH_CTRL_INIT) {
348 if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL)) {
273a0218 349 ctx->cipher = NULL;
0f113f3e
MC
350 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
351 return 0;
352 }
353 }
0f113f3e 354 }
319e518a 355#if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
0f113f3e 356 skip_to_init:
0b13e9f0 357#endif
1702c500
P
358 if (ctx->cipher == NULL)
359 return 0;
360
0f113f3e
MC
361 /* we assume block size is a power of 2 in *cryptUpdate */
362 OPENSSL_assert(ctx->cipher->block_size == 1
363 || ctx->cipher->block_size == 8
364 || ctx->cipher->block_size == 16);
365
366 if (!(ctx->flags & EVP_CIPHER_CTX_FLAG_WRAP_ALLOW)
367 && EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_WRAP_MODE) {
368 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_WRAP_MODE_NOT_ALLOWED);
369 return 0;
370 }
371
480d3323 372 if (!(EVP_CIPHER_flags(EVP_CIPHER_CTX_cipher(ctx)) & EVP_CIPH_CUSTOM_IV)) {
0f113f3e
MC
373 switch (EVP_CIPHER_CTX_mode(ctx)) {
374
375 case EVP_CIPH_STREAM_CIPHER:
376 case EVP_CIPH_ECB_MODE:
377 break;
378
379 case EVP_CIPH_CFB_MODE:
380 case EVP_CIPH_OFB_MODE:
381
382 ctx->num = 0;
383 /* fall-through */
384
385 case EVP_CIPH_CBC_MODE:
386
387 OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) <=
388 (int)sizeof(ctx->iv));
389 if (iv)
390 memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
391 memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
392 break;
393
394 case EVP_CIPH_CTR_MODE:
395 ctx->num = 0;
396 /* Don't reuse IV for CTR mode */
397 if (iv)
398 memcpy(ctx->iv, iv, EVP_CIPHER_CTX_iv_length(ctx));
399 break;
400
401 default:
402 return 0;
0f113f3e
MC
403 }
404 }
405
406 if (key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) {
407 if (!ctx->cipher->init(ctx, key, iv, enc))
408 return 0;
409 }
410 ctx->buf_len = 0;
411 ctx->final_used = 0;
412 ctx->block_mask = ctx->cipher->block_size - 1;
413 return 1;
414}
d02b48c6 415
be06a934 416int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
0f113f3e
MC
417 const unsigned char *in, int inl)
418{
419 if (ctx->encrypt)
420 return EVP_EncryptUpdate(ctx, out, outl, in, inl);
421 else
422 return EVP_DecryptUpdate(ctx, out, outl, in, inl);
423}
d02b48c6 424
581f1c84 425int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
0f113f3e
MC
426{
427 if (ctx->encrypt)
428 return EVP_EncryptFinal_ex(ctx, out, outl);
429 else
430 return EVP_DecryptFinal_ex(ctx, out, outl);
431}
581f1c84 432
6b691a5c 433int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
0f113f3e
MC
434{
435 if (ctx->encrypt)
436 return EVP_EncryptFinal(ctx, out, outl);
437 else
438 return EVP_DecryptFinal(ctx, out, outl);
439}
d02b48c6 440
be06a934 441int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
0f113f3e
MC
442 const unsigned char *key, const unsigned char *iv)
443{
444 return EVP_CipherInit(ctx, cipher, key, iv, 1);
445}
18eda732 446
0f113f3e
MC
447int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
448 ENGINE *impl, const unsigned char *key,
449 const unsigned char *iv)
450{
451 return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 1);
452}
d02b48c6 453
be06a934 454int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
0f113f3e
MC
455 const unsigned char *key, const unsigned char *iv)
456{
457 return EVP_CipherInit(ctx, cipher, key, iv, 0);
458}
18eda732 459
0f113f3e
MC
460int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
461 ENGINE *impl, const unsigned char *key,
462 const unsigned char *iv)
463{
464 return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 0);
465}
d02b48c6 466
c3a73daf
AP
467/*
468 * According to the letter of standard difference between pointers
469 * is specified to be valid only within same object. This makes
470 * it formally challenging to determine if input and output buffers
471 * are not partially overlapping with standard pointer arithmetic.
472 */
473#ifdef PTRDIFF_T
474# undef PTRDIFF_T
475#endif
476#if defined(OPENSSL_SYS_VMS) && __INITIAL_POINTER_SIZE==64
477/*
478 * Then we have VMS that distinguishes itself by adhering to
5fc77684
AP
479 * sizeof(size_t)==4 even in 64-bit builds, which means that
480 * difference between two pointers might be truncated to 32 bits.
481 * In the context one can even wonder how comparison for
482 * equality is implemented. To be on the safe side we adhere to
483 * PTRDIFF_T even for comparison for equality.
c3a73daf
AP
484 */
485# define PTRDIFF_T uint64_t
486#else
487# define PTRDIFF_T size_t
488#endif
489
7141ba31 490int is_partially_overlapping(const void *ptr1, const void *ptr2, int len)
c3a73daf
AP
491{
492 PTRDIFF_T diff = (PTRDIFF_T)ptr1-(PTRDIFF_T)ptr2;
493 /*
494 * Check for partially overlapping buffers. [Binary logical
495 * operations are used instead of boolean to minimize number
496 * of conditional branches.]
497 */
83151b73
AP
498 int overlapped = (len > 0) & (diff != 0) & ((diff < (PTRDIFF_T)len) |
499 (diff > (0 - (PTRDIFF_T)len)));
b153f092 500
83151b73 501 return overlapped;
c3a73daf
AP
502}
503
a8bf2f8f
RL
504static int evp_EncryptDecryptUpdate(EVP_CIPHER_CTX *ctx,
505 unsigned char *out, int *outl,
506 const unsigned char *in, int inl)
0f113f3e 507{
64846096
LP
508 int i, j, bl, cmpl = inl;
509
510 if (EVP_CIPHER_CTX_test_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS))
511 cmpl = (cmpl + 7) / 8;
0f113f3e 512
7141ba31
MC
513 bl = ctx->cipher->block_size;
514
0f113f3e 515 if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
7141ba31 516 /* If block size > 1 then the cipher will have to do this check */
64846096 517 if (bl == 1 && is_partially_overlapping(out, in, cmpl)) {
a8bf2f8f 518 EVPerr(EVP_F_EVP_ENCRYPTDECRYPTUPDATE, EVP_R_PARTIALLY_OVERLAPPING);
5fc77684 519 return 0;
83151b73 520 }
5fc77684 521
0f113f3e
MC
522 i = ctx->cipher->do_cipher(ctx, out, in, inl);
523 if (i < 0)
524 return 0;
525 else
526 *outl = i;
527 return 1;
528 }
529
2c236894
MC
530 if (inl <= 0) {
531 *outl = 0;
532 return inl == 0;
533 }
64846096 534 if (is_partially_overlapping(out + ctx->buf_len, in, cmpl)) {
a8bf2f8f 535 EVPerr(EVP_F_EVP_ENCRYPTDECRYPTUPDATE, EVP_R_PARTIALLY_OVERLAPPING);
5fc77684 536 return 0;
83151b73 537 }
0f113f3e
MC
538
539 if (ctx->buf_len == 0 && (inl & (ctx->block_mask)) == 0) {
540 if (ctx->cipher->do_cipher(ctx, out, in, inl)) {
541 *outl = inl;
542 return 1;
543 } else {
544 *outl = 0;
545 return 0;
546 }
547 }
548 i = ctx->buf_len;
0f113f3e
MC
549 OPENSSL_assert(bl <= (int)sizeof(ctx->buf));
550 if (i != 0) {
3f358213 551 if (bl - i > inl) {
0f113f3e
MC
552 memcpy(&(ctx->buf[i]), in, inl);
553 ctx->buf_len += inl;
554 *outl = 0;
555 return 1;
556 } else {
557 j = bl - i;
558 memcpy(&(ctx->buf[i]), in, j);
0f113f3e
MC
559 inl -= j;
560 in += j;
5fc77684
AP
561 if (!ctx->cipher->do_cipher(ctx, out, ctx->buf, bl))
562 return 0;
0f113f3e
MC
563 out += bl;
564 *outl = bl;
565 }
566 } else
567 *outl = 0;
568 i = inl & (bl - 1);
569 inl -= i;
570 if (inl > 0) {
571 if (!ctx->cipher->do_cipher(ctx, out, in, inl))
572 return 0;
573 *outl += inl;
574 }
575
576 if (i != 0)
577 memcpy(ctx->buf, &(in[inl]), i);
578 ctx->buf_len = i;
579 return 1;
580}
d02b48c6 581
a8bf2f8f
RL
582
583int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
584 const unsigned char *in, int inl)
585{
df05f2ce
MC
586 int ret;
587 size_t soutl;
3b94944c 588 int blocksize;
df05f2ce 589
a8bf2f8f
RL
590 /* Prevent accidental use of decryption context when encrypting */
591 if (!ctx->encrypt) {
592 EVPerr(EVP_F_EVP_ENCRYPTUPDATE, EVP_R_INVALID_OPERATION);
593 return 0;
594 }
595
d4d89a07
SS
596 if (ctx->cipher == NULL) {
597 EVPerr(EVP_F_EVP_ENCRYPTUPDATE, EVP_R_NO_CIPHER_SET);
598 return 0;
599 }
600
601 if (ctx->cipher->prov == NULL)
df05f2ce
MC
602 goto legacy;
603
3b94944c
MC
604 blocksize = EVP_CIPHER_CTX_block_size(ctx);
605
606 if (ctx->cipher->cupdate == NULL || blocksize < 1) {
df05f2ce
MC
607 EVPerr(EVP_F_EVP_ENCRYPTUPDATE, EVP_R_UPDATE_ERROR);
608 return 0;
609 }
3b94944c
MC
610 ret = ctx->cipher->cupdate(ctx->provctx, out, &soutl,
611 inl + (blocksize == 1 ? 0 : blocksize), in,
612 (size_t)inl);
df05f2ce 613
36e619d7
GV
614 if (ret) {
615 if (soutl > INT_MAX) {
616 EVPerr(EVP_F_EVP_ENCRYPTUPDATE, EVP_R_UPDATE_ERROR);
617 return 0;
618 }
619 *outl = soutl;
df05f2ce 620 }
36e619d7 621
df05f2ce
MC
622 return ret;
623
624 /* TODO(3.0): Remove legacy code below */
625 legacy:
626
a8bf2f8f
RL
627 return evp_EncryptDecryptUpdate(ctx, out, outl, in, inl);
628}
629
be06a934 630int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
0f113f3e
MC
631{
632 int ret;
633 ret = EVP_EncryptFinal_ex(ctx, out, outl);
634 return ret;
635}
581f1c84
DSH
636
637int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
0f113f3e
MC
638{
639 int n, ret;
640 unsigned int i, b, bl;
df05f2ce 641 size_t soutl;
3b94944c 642 int blocksize;
0f113f3e 643
a8bf2f8f
RL
644 /* Prevent accidental use of decryption context when encrypting */
645 if (!ctx->encrypt) {
646 EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX, EVP_R_INVALID_OPERATION);
647 return 0;
648 }
649
4894dcad
P
650 if (ctx->cipher == NULL) {
651 EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX, EVP_R_NO_CIPHER_SET);
652 return 0;
653 }
654 if (ctx->cipher->prov == NULL)
df05f2ce
MC
655 goto legacy;
656
3b94944c
MC
657 blocksize = EVP_CIPHER_CTX_block_size(ctx);
658
659 if (blocksize < 1 || ctx->cipher->cfinal == NULL) {
df05f2ce
MC
660 EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX, EVP_R_FINAL_ERROR);
661 return 0;
662 }
663
3b94944c
MC
664 ret = ctx->cipher->cfinal(ctx->provctx, out, &soutl,
665 blocksize == 1 ? 0 : blocksize);
df05f2ce 666
36e619d7
GV
667 if (ret) {
668 if (soutl > INT_MAX) {
669 EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX, EVP_R_FINAL_ERROR);
670 return 0;
671 }
672 *outl = soutl;
df05f2ce 673 }
df05f2ce
MC
674
675 return ret;
676
677 /* TODO(3.0): Remove legacy code below */
678 legacy:
679
0f113f3e
MC
680 if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
681 ret = ctx->cipher->do_cipher(ctx, out, NULL, 0);
682 if (ret < 0)
683 return 0;
684 else
685 *outl = ret;
686 return 1;
687 }
688
689 b = ctx->cipher->block_size;
cbe29648 690 OPENSSL_assert(b <= sizeof(ctx->buf));
0f113f3e
MC
691 if (b == 1) {
692 *outl = 0;
693 return 1;
694 }
695 bl = ctx->buf_len;
696 if (ctx->flags & EVP_CIPH_NO_PADDING) {
697 if (bl) {
698 EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX,
699 EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
700 return 0;
701 }
702 *outl = 0;
703 return 1;
704 }
705
706 n = b - bl;
707 for (i = bl; i < b; i++)
708 ctx->buf[i] = n;
709 ret = ctx->cipher->do_cipher(ctx, out, ctx->buf, b);
710
711 if (ret)
712 *outl = b;
713
714 return ret;
715}
d02b48c6 716
be06a934 717int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
0f113f3e
MC
718 const unsigned char *in, int inl)
719{
df05f2ce 720 int fix_len, cmpl = inl, ret;
0f113f3e 721 unsigned int b;
df05f2ce 722 size_t soutl;
3b94944c 723 int blocksize;
0f113f3e 724
a8bf2f8f
RL
725 /* Prevent accidental use of encryption context when decrypting */
726 if (ctx->encrypt) {
727 EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_INVALID_OPERATION);
728 return 0;
729 }
730
d2c2e49e
P
731 if (ctx->cipher == NULL) {
732 EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_NO_CIPHER_SET);
733 return 0;
734 }
735 if (ctx->cipher->prov == NULL)
df05f2ce
MC
736 goto legacy;
737
3b94944c
MC
738 blocksize = EVP_CIPHER_CTX_block_size(ctx);
739
740 if (ctx->cipher->cupdate == NULL || blocksize < 1) {
df05f2ce
MC
741 EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_UPDATE_ERROR);
742 return 0;
743 }
3b94944c
MC
744 ret = ctx->cipher->cupdate(ctx->provctx, out, &soutl,
745 inl + (blocksize == 1 ? 0 : blocksize), in,
746 (size_t)inl);
df05f2ce
MC
747
748 if (ret) {
749 if (soutl > INT_MAX) {
750 EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_UPDATE_ERROR);
751 return 0;
752 }
753 *outl = soutl;
754 }
755
756 return ret;
757
758 /* TODO(3.0): Remove legacy code below */
759 legacy:
760
7141ba31
MC
761 b = ctx->cipher->block_size;
762
64846096
LP
763 if (EVP_CIPHER_CTX_test_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS))
764 cmpl = (cmpl + 7) / 8;
765
0f113f3e 766 if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
64846096 767 if (b == 1 && is_partially_overlapping(out, in, cmpl)) {
83151b73 768 EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_PARTIALLY_OVERLAPPING);
5fc77684 769 return 0;
83151b73 770 }
5fc77684 771
0f113f3e
MC
772 fix_len = ctx->cipher->do_cipher(ctx, out, in, inl);
773 if (fix_len < 0) {
774 *outl = 0;
775 return 0;
776 } else
777 *outl = fix_len;
778 return 1;
779 }
780
2c236894
MC
781 if (inl <= 0) {
782 *outl = 0;
783 return inl == 0;
784 }
785
0f113f3e 786 if (ctx->flags & EVP_CIPH_NO_PADDING)
a8bf2f8f 787 return evp_EncryptDecryptUpdate(ctx, out, outl, in, inl);
0f113f3e 788
cbe29648 789 OPENSSL_assert(b <= sizeof(ctx->final));
0f113f3e
MC
790
791 if (ctx->final_used) {
5fc77684
AP
792 /* see comment about PTRDIFF_T comparison above */
793 if (((PTRDIFF_T)out == (PTRDIFF_T)in)
83151b73
AP
794 || is_partially_overlapping(out, in, b)) {
795 EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_PARTIALLY_OVERLAPPING);
5fc77684 796 return 0;
83151b73 797 }
0f113f3e
MC
798 memcpy(out, ctx->final, b);
799 out += b;
800 fix_len = 1;
801 } else
802 fix_len = 0;
803
a8bf2f8f 804 if (!evp_EncryptDecryptUpdate(ctx, out, outl, in, inl))
0f113f3e
MC
805 return 0;
806
807 /*
808 * if we have 'decrypted' a multiple of block size, make sure we have a
809 * copy of this last block
810 */
811 if (b > 1 && !ctx->buf_len) {
812 *outl -= b;
813 ctx->final_used = 1;
814 memcpy(ctx->final, &out[*outl], b);
815 } else
816 ctx->final_used = 0;
817
818 if (fix_len)
819 *outl += b;
820
821 return 1;
822}
d02b48c6 823
6b691a5c 824int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
0f113f3e
MC
825{
826 int ret;
827 ret = EVP_DecryptFinal_ex(ctx, out, outl);
828 return ret;
829}
581f1c84
DSH
830
831int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
0f113f3e
MC
832{
833 int i, n;
834 unsigned int b;
df05f2ce
MC
835 size_t soutl;
836 int ret;
3b94944c 837 int blocksize;
a8bf2f8f
RL
838
839 /* Prevent accidental use of encryption context when decrypting */
840 if (ctx->encrypt) {
841 EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_INVALID_OPERATION);
842 return 0;
843 }
844
d4d89a07
SS
845 if (ctx->cipher == NULL) {
846 EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_NO_CIPHER_SET);
847 return 0;
848 }
849
850 if (ctx->cipher->prov == NULL)
df05f2ce
MC
851 goto legacy;
852
3b94944c
MC
853 blocksize = EVP_CIPHER_CTX_block_size(ctx);
854
855 if (blocksize < 1 || ctx->cipher->cfinal == NULL) {
df05f2ce
MC
856 EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_FINAL_ERROR);
857 return 0;
858 }
859
3b94944c
MC
860 ret = ctx->cipher->cfinal(ctx->provctx, out, &soutl,
861 blocksize == 1 ? 0 : blocksize);
df05f2ce
MC
862
863 if (ret) {
864 if (soutl > INT_MAX) {
865 EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_FINAL_ERROR);
866 return 0;
867 }
868 *outl = soutl;
869 }
870
871 return ret;
872
873 /* TODO(3.0): Remove legacy code below */
874 legacy:
875
0f113f3e 876 *outl = 0;
0f113f3e
MC
877 if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
878 i = ctx->cipher->do_cipher(ctx, out, NULL, 0);
879 if (i < 0)
880 return 0;
881 else
882 *outl = i;
883 return 1;
884 }
885
886 b = ctx->cipher->block_size;
887 if (ctx->flags & EVP_CIPH_NO_PADDING) {
888 if (ctx->buf_len) {
889 EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,
890 EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
891 return 0;
892 }
893 *outl = 0;
894 return 1;
895 }
896 if (b > 1) {
897 if (ctx->buf_len || !ctx->final_used) {
898 EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_WRONG_FINAL_BLOCK_LENGTH);
26a7d938 899 return 0;
0f113f3e 900 }
cbe29648 901 OPENSSL_assert(b <= sizeof(ctx->final));
0f113f3e
MC
902
903 /*
904 * The following assumes that the ciphertext has been authenticated.
905 * Otherwise it provides a padding oracle.
906 */
907 n = ctx->final[b - 1];
908 if (n == 0 || n > (int)b) {
909 EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_BAD_DECRYPT);
26a7d938 910 return 0;
0f113f3e
MC
911 }
912 for (i = 0; i < n; i++) {
913 if (ctx->final[--b] != n) {
914 EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_BAD_DECRYPT);
26a7d938 915 return 0;
0f113f3e
MC
916 }
917 }
918 n = ctx->cipher->block_size - n;
919 for (i = 0; i < n; i++)
920 out[i] = ctx->final[i];
921 *outl = n;
922 } else
923 *outl = 0;
208fb891 924 return 1;
0f113f3e 925}
d02b48c6 926
6343829a 927int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen)
0f113f3e 928{
459b15d4
SL
929 int ok;
930 OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
931
932 params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_KEYLEN, &keylen);
933 ok = evp_do_ciph_ctx_setparams(c->cipher, c->provctx, params);
13273237 934
e870791a 935 if (ok != EVP_CTRL_RET_UNSUPPORTED)
13273237
RL
936 return ok;
937
938 /* TODO(3.0) legacy code follows */
0f113f3e
MC
939 if (c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH)
940 return EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_KEY_LENGTH, keylen, NULL);
df05f2ce 941 if (EVP_CIPHER_CTX_key_length(c) == keylen)
0f113f3e
MC
942 return 1;
943 if ((keylen > 0) && (c->cipher->flags & EVP_CIPH_VARIABLE_LENGTH)) {
944 c->key_len = keylen;
945 return 1;
946 }
947 EVPerr(EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH, EVP_R_INVALID_KEY_LENGTH);
948 return 0;
949}
49528751 950
f2e5ca84 951int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
0f113f3e 952{
13273237 953 int ok;
459b15d4 954 OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
13273237 955
0f113f3e
MC
956 if (pad)
957 ctx->flags &= ~EVP_CIPH_NO_PADDING;
958 else
959 ctx->flags |= EVP_CIPH_NO_PADDING;
df05f2ce 960
459b15d4
SL
961 params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_PADDING, &pad);
962 ok = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->provctx, params);
963
13273237 964 return ok != 0;
0f113f3e 965}
f2e5ca84 966
49528751
DSH
967int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
968{
e870791a 969 int ret = EVP_CTRL_RET_UNSUPPORTED;
459b15d4
SL
970 int set_params = 1;
971 size_t sz;
972 OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
d91f4568 973
459b15d4 974 if (ctx == NULL || ctx->cipher == NULL) {
0f113f3e
MC
975 EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_NO_CIPHER_SET);
976 return 0;
977 }
978
13273237
RL
979 if (ctx->cipher->prov == NULL)
980 goto legacy;
981
982 switch (type) {
983 case EVP_CTRL_SET_KEY_LENGTH:
459b15d4 984 params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_KEYLEN, &arg);
13273237
RL
985 break;
986 case EVP_CTRL_RAND_KEY: /* Used by DES */
987 case EVP_CTRL_SET_PIPELINE_OUTPUT_BUFS: /* Used by DASYNC */
988 case EVP_CTRL_INIT: /* TODO(3.0) Purely legacy, no provider counterpart */
459b15d4 989 default:
e870791a 990 return EVP_CTRL_RET_UNSUPPORTED;
459b15d4
SL
991 case EVP_CTRL_GET_IV:
992 set_params = 0;
993 params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_IV,
994 ptr, (size_t)arg);
995 break;
996 case EVP_CTRL_AEAD_SET_IVLEN:
997 if (arg < 0)
998 return 0;
999 sz = (size_t)arg;
1000 params[0] =
1001 OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_AEAD_IVLEN, &sz);
13273237 1002 break;
459b15d4
SL
1003 case EVP_CTRL_GCM_SET_IV_FIXED:
1004 params[0] =
1005 OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_IV_FIXED,
1006 ptr, (size_t)arg);
1007 break;
1008 case EVP_CTRL_AEAD_SET_TAG:
1009 params[0] =
1010 OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG,
1011 ptr, (size_t)arg);
1012 break;
1013 case EVP_CTRL_AEAD_GET_TAG:
1014 set_params = 0;
1015 params[0] = OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG,
1016 ptr, (size_t)arg);
1017 break;
1018 case EVP_CTRL_AEAD_TLS1_AAD:
1019 /* This one does a set and a get - since it returns a padding size */
1020 params[0] =
1021 OSSL_PARAM_construct_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD,
1022 ptr, (size_t)arg);
1023 ret = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->provctx, params);
1024 if (ret <= 0)
1025 return ret;
1026 params[0] =
1027 OSSL_PARAM_construct_size_t(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD, &sz);
1028 ret = evp_do_ciph_ctx_getparams(ctx->cipher, ctx->provctx, params);
1029 if (ret <= 0)
1030 return 0;
1031 return sz;
13273237 1032 }
459b15d4
SL
1033
1034 if (set_params)
1035 ret = evp_do_ciph_ctx_setparams(ctx->cipher, ctx->provctx, params);
1036 else
1037 ret = evp_do_ciph_ctx_getparams(ctx->cipher, ctx->provctx, params);
13273237
RL
1038 return ret;
1039
459b15d4
SL
1040/* TODO(3.0): Remove legacy code below */
1041legacy:
1042 if (ctx->cipher->ctrl == NULL) {
0f113f3e
MC
1043 EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_NOT_IMPLEMENTED);
1044 return 0;
1045 }
1046
1047 ret = ctx->cipher->ctrl(ctx, type, arg, ptr);
e870791a 1048 if (ret == EVP_CTRL_RET_UNSUPPORTED) {
0f113f3e
MC
1049 EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL,
1050 EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);
1051 return 0;
1052 }
1053 return ret;
49528751 1054}
216659eb 1055
319e518a
MC
1056#if !defined(FIPS_MODE)
1057/* TODO(3.0): No support for RAND yet in the FIPS module */
216659eb 1058int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key)
0f113f3e 1059{
d0510566 1060 int kl;
0f113f3e
MC
1061 if (ctx->cipher->flags & EVP_CIPH_RAND_KEY)
1062 return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key);
d0510566
P
1063 kl = EVP_CIPHER_CTX_key_length(ctx);
1064 if (kl <= 0 || RAND_priv_bytes(key, kl) <= 0)
0f113f3e
MC
1065 return 0;
1066 return 1;
1067}
319e518a 1068#endif
216659eb 1069
c2bf7208 1070int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in)
0f113f3e
MC
1071{
1072 if ((in == NULL) || (in->cipher == NULL)) {
1073 EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, EVP_R_INPUT_NOT_INITIALIZED);
1074 return 0;
1075 }
df05f2ce
MC
1076
1077 if (in->cipher->prov == NULL)
1078 goto legacy;
1079
1080 if (in->cipher->dupctx == NULL) {
1081 EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, EVP_R_NOT_ABLE_TO_COPY_CTX);
1082 return 0;
1083 }
1084
1085 EVP_CIPHER_CTX_reset(out);
1086
1087 *out = *in;
1088 out->provctx = NULL;
1089
70c35fd1 1090 if (in->fetched_cipher != NULL && !EVP_CIPHER_up_ref(in->fetched_cipher)) {
df05f2ce
MC
1091 out->fetched_cipher = NULL;
1092 return 0;
1093 }
1094
1095 out->provctx = in->cipher->dupctx(in->provctx);
1096 if (out->provctx == NULL) {
1097 EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, EVP_R_NOT_ABLE_TO_COPY_CTX);
1098 return 0;
1099 }
1100
1101 return 1;
1102
1103 /* TODO(3.0): Remove legacy code below */
1104 legacy:
1105
319e518a 1106#if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
0f113f3e
MC
1107 /* Make sure it's safe to copy a cipher context using an ENGINE */
1108 if (in->engine && !ENGINE_init(in->engine)) {
1109 EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, ERR_R_ENGINE_LIB);
1110 return 0;
1111 }
c2bf7208
DSH
1112#endif
1113
c0ca39bd 1114 EVP_CIPHER_CTX_reset(out);
b4faea50 1115 memcpy(out, in, sizeof(*out));
0f113f3e
MC
1116
1117 if (in->cipher_data && in->cipher->ctx_size) {
1118 out->cipher_data = OPENSSL_malloc(in->cipher->ctx_size);
90945fa3 1119 if (out->cipher_data == NULL) {
273a0218 1120 out->cipher = NULL;
0f113f3e
MC
1121 EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, ERR_R_MALLOC_FAILURE);
1122 return 0;
1123 }
1124 memcpy(out->cipher_data, in->cipher_data, in->cipher->ctx_size);
1125 }
1126
1127 if (in->cipher->flags & EVP_CIPH_CUSTOM_COPY)
273a0218
BE
1128 if (!in->cipher->ctrl((EVP_CIPHER_CTX *)in, EVP_CTRL_COPY, 0, out)) {
1129 out->cipher = NULL;
1130 EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, EVP_R_INITIALIZATION_ERROR);
1131 return 0;
1132 }
0f113f3e
MC
1133 return 1;
1134}
df05f2ce 1135
6b9e3724
RL
1136static void *evp_cipher_from_dispatch(const char *name,
1137 const OSSL_DISPATCH *fns,
df05f2ce
MC
1138 OSSL_PROVIDER *prov)
1139{
1140 EVP_CIPHER *cipher = NULL;
1141 int fnciphcnt = 0, fnctxcnt = 0;
1142
0211740f
RL
1143 /*
1144 * The legacy NID is set by EVP_CIPHER_fetch() if the name exists in
1145 * the object database.
1146 */
6b9e3724
RL
1147 if ((cipher = EVP_CIPHER_meth_new(0, 0, 0)) == NULL
1148 || (cipher->name = OPENSSL_strdup(name)) == NULL) {
1149 EVP_CIPHER_meth_free(cipher);
1150 EVPerr(0, ERR_R_MALLOC_FAILURE);
df05f2ce 1151 return NULL;
6b9e3724 1152 }
df05f2ce
MC
1153
1154 for (; fns->function_id != 0; fns++) {
1155 switch (fns->function_id) {
1156 case OSSL_FUNC_CIPHER_NEWCTX:
1157 if (cipher->newctx != NULL)
1158 break;
1159 cipher->newctx = OSSL_get_OP_cipher_newctx(fns);
1160 fnctxcnt++;
1161 break;
1162 case OSSL_FUNC_CIPHER_ENCRYPT_INIT:
1163 if (cipher->einit != NULL)
1164 break;
1165 cipher->einit = OSSL_get_OP_cipher_encrypt_init(fns);
1166 fnciphcnt++;
1167 break;
1168 case OSSL_FUNC_CIPHER_DECRYPT_INIT:
1169 if (cipher->dinit != NULL)
1170 break;
1171 cipher->dinit = OSSL_get_OP_cipher_decrypt_init(fns);
1172 fnciphcnt++;
1173 break;
1174 case OSSL_FUNC_CIPHER_UPDATE:
1175 if (cipher->cupdate != NULL)
1176 break;
1177 cipher->cupdate = OSSL_get_OP_cipher_update(fns);
1178 fnciphcnt++;
1179 break;
1180 case OSSL_FUNC_CIPHER_FINAL:
1181 if (cipher->cfinal != NULL)
1182 break;
1183 cipher->cfinal = OSSL_get_OP_cipher_final(fns);
1184 fnciphcnt++;
1185 break;
718b133a
MC
1186 case OSSL_FUNC_CIPHER_CIPHER:
1187 if (cipher->ccipher != NULL)
1188 break;
1189 cipher->ccipher = OSSL_get_OP_cipher_cipher(fns);
1190 break;
df05f2ce
MC
1191 case OSSL_FUNC_CIPHER_FREECTX:
1192 if (cipher->freectx != NULL)
1193 break;
1194 cipher->freectx = OSSL_get_OP_cipher_freectx(fns);
1195 fnctxcnt++;
1196 break;
1197 case OSSL_FUNC_CIPHER_DUPCTX:
1198 if (cipher->dupctx != NULL)
1199 break;
1200 cipher->dupctx = OSSL_get_OP_cipher_dupctx(fns);
1201 break;
df05f2ce
MC
1202 case OSSL_FUNC_CIPHER_GET_PARAMS:
1203 if (cipher->get_params != NULL)
1204 break;
1205 cipher->get_params = OSSL_get_OP_cipher_get_params(fns);
1206 break;
718b133a
MC
1207 case OSSL_FUNC_CIPHER_CTX_GET_PARAMS:
1208 if (cipher->ctx_get_params != NULL)
1209 break;
1210 cipher->ctx_get_params = OSSL_get_OP_cipher_ctx_get_params(fns);
1211 break;
1212 case OSSL_FUNC_CIPHER_CTX_SET_PARAMS:
1213 if (cipher->ctx_set_params != NULL)
df05f2ce 1214 break;
718b133a 1215 cipher->ctx_set_params = OSSL_get_OP_cipher_ctx_set_params(fns);
df05f2ce
MC
1216 break;
1217 }
1218 }
718b133a
MC
1219 if ((fnciphcnt != 0 && fnciphcnt != 3 && fnciphcnt != 4)
1220 || (fnciphcnt == 0 && cipher->ccipher == NULL)
13273237 1221 || fnctxcnt != 2) {
df05f2ce
MC
1222 /*
1223 * In order to be a consistent set of functions we must have at least
1224 * a complete set of "encrypt" functions, or a complete set of "decrypt"
11dbdc07
MC
1225 * functions, or a single "cipher" function. In all cases we need both
1226 * the "newctx" and "freectx" functions.
df05f2ce
MC
1227 */
1228 EVP_CIPHER_meth_free(cipher);
1229 EVPerr(EVP_F_EVP_CIPHER_FROM_DISPATCH, EVP_R_INVALID_PROVIDER_FUNCTIONS);
1230 return NULL;
1231 }
1232 cipher->prov = prov;
1233 if (prov != NULL)
7c95390e 1234 ossl_provider_up_ref(prov);
df05f2ce
MC
1235
1236 return cipher;
1237}
1238
70c35fd1 1239static int evp_cipher_up_ref(void *cipher)
df05f2ce 1240{
70c35fd1 1241 return EVP_CIPHER_up_ref(cipher);
df05f2ce
MC
1242}
1243
1244static void evp_cipher_free(void *cipher)
1245{
1246 EVP_CIPHER_meth_free(cipher);
1247}
1248
df05f2ce
MC
1249EVP_CIPHER *EVP_CIPHER_fetch(OPENSSL_CTX *ctx, const char *algorithm,
1250 const char *properties)
1251{
0211740f
RL
1252 EVP_CIPHER *cipher =
1253 evp_generic_fetch(ctx, OSSL_OP_CIPHER, algorithm, properties,
70c35fd1 1254 evp_cipher_from_dispatch, evp_cipher_up_ref,
0211740f
RL
1255 evp_cipher_free);
1256
1257#ifndef FIPS_MODE
1258 /* TODO(3.x) get rid of the need for legacy NIDs */
1259 if (cipher != NULL) {
1260 /*
1261 * FIPS module note: since internal fetches will be entirely
1262 * provider based, we know that none of its code depends on legacy
1263 * NIDs or any functionality that use them.
1264 */
1265 cipher->nid = OBJ_sn2nid(algorithm);
1266 }
1267#endif
1268
1269 return cipher;
df05f2ce 1270}
c540f00f
RL
1271
1272void EVP_CIPHER_do_all_ex(OPENSSL_CTX *libctx,
1273 void (*fn)(EVP_CIPHER *mac, void *arg),
1274 void *arg)
1275{
1276 evp_generic_do_all(libctx, OSSL_OP_CIPHER,
1277 (void (*)(void *, void *))fn, arg,
1278 evp_cipher_from_dispatch, evp_cipher_free);
1279}