Add gcm ciphers (aes and aria) to providers.
[openssl.git] / crypto / evp / evp_enc.c
1 /*
2  * Copyright 1995-2019 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 <stdio.h>
11 #include <assert.h>
12 #include "internal/cryptlib.h"
13 #include <openssl/evp.h>
14 #include <openssl/err.h>
15 #include <openssl/rand.h>
16 #include <openssl/rand_drbg.h>
17 #include <openssl/engine.h>
18 #include <openssl/params.h>
19 #include <openssl/core_names.h>
20 #include "internal/evp_int.h"
21 #include "internal/provider.h"
22 #include "evp_locl.h"
23
24 int EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *ctx)
25 {
26     if (ctx == NULL)
27         return 1;
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))
48             return 0;
49         /* Cleanse cipher context data */
50         if (ctx->cipher_data && ctx->cipher->ctx_size)
51             OPENSSL_cleanse(ctx->cipher_data, ctx->cipher->ctx_size);
52     }
53     OPENSSL_free(ctx->cipher_data);
54 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
55     ENGINE_finish(ctx->engine);
56 #endif
57     memset(ctx, 0, sizeof(*ctx));
58     return 1;
59 }
60
61 EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void)
62 {
63     return OPENSSL_zalloc(sizeof(EVP_CIPHER_CTX));
64 }
65
66 void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
67 {
68     EVP_CIPHER_CTX_reset(ctx);
69     OPENSSL_free(ctx);
70 }
71
72 int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
73                    const unsigned char *key, const unsigned char *iv, int enc)
74 {
75     if (cipher != NULL)
76         EVP_CIPHER_CTX_reset(ctx);
77     return EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, enc);
78 }
79
80 int 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 {
84 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
85     ENGINE *tmpimpl = NULL;
86 #endif
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) {
95         enc = ctx->encrypt;
96     } else {
97         if (enc)
98             enc = 1;
99         ctx->encrypt = enc;
100     }
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
109 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
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
114      * reinitialisation, when it may all be unnecessary.
115      */
116     if (ctx->engine && ctx->cipher
117         && (cipher == NULL || cipher->nid == ctx->cipher->nid))
118         goto skip_to_init;
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     }
124 #endif
125
126     /*
127      * If there are engines involved then we should use legacy handling for now.
128      */
129     if (ctx->engine != NULL
130 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
131             || tmpimpl != NULL
132 #endif
133             || impl != NULL) {
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) {
145         case NID_aes_256_ecb:
146         case NID_aes_192_ecb:
147         case NID_aes_128_ecb:
148         case NID_aes_256_cbc:
149         case NID_aes_192_cbc:
150         case NID_aes_128_cbc:
151         case NID_aes_256_ofb128:
152         case NID_aes_192_ofb128:
153         case NID_aes_128_ofb128:
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:
163         case NID_aes_256_ctr:
164         case NID_aes_192_ctr:
165         case NID_aes_128_ctr:
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:
172             break;
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) {
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
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;
221 #endif
222     }
223
224     ctx->cipher = cipher;
225     if (ctx->provctx == NULL) {
226         ctx->provctx = ctx->cipher->newctx(ossl_provider_ctx(cipher->prov));
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) {
234         /*
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
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
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
261         return ctx->cipher->einit(ctx->provctx,
262                                   key,
263                                   key == NULL ? 0
264                                               : EVP_CIPHER_CTX_key_length(ctx),
265                                   iv,
266                                   iv == NULL ? 0
267                                              : EVP_CIPHER_CTX_iv_length(ctx));
268     }
269
270     if (ctx->cipher->dinit == NULL) {
271         EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
272         return 0;
273     }
274
275     return ctx->cipher->dinit(ctx->provctx,
276                               key,
277                               key == NULL ? 0
278                                           : EVP_CIPHER_CTX_key_length(ctx),
279                               iv,
280                               iv == NULL ? 0
281                                          : EVP_CIPHER_CTX_iv_length(ctx));
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
290          * EVP_CIPHER could be used).
291          */
292         if (ctx->cipher) {
293             unsigned long flags = ctx->flags;
294             EVP_CIPHER_CTX_reset(ctx);
295             /* Restore encrypt and flags */
296             ctx->encrypt = enc;
297             ctx->flags = flags;
298         }
299 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
300         if (impl != NULL) {
301             if (!ENGINE_init(impl)) {
302                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
303                 return 0;
304             }
305         } else {
306             impl = tmpimpl;
307         }
308         if (impl != NULL) {
309             /* There's an ENGINE for this job ... (apparently) */
310             const EVP_CIPHER *c = ENGINE_get_cipher(impl, cipher->nid);
311
312             if (c == NULL) {
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
316                  * misspellings of "initialisation"?
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;
328         } else {
329             ctx->engine = NULL;
330         }
331 #endif
332
333         ctx->cipher = cipher;
334         if (ctx->cipher->ctx_size) {
335             ctx->cipher_data = OPENSSL_zalloc(ctx->cipher->ctx_size);
336             if (ctx->cipher_data == NULL) {
337                 ctx->cipher = NULL;
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)) {
349                 ctx->cipher = NULL;
350                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
351                 return 0;
352             }
353         }
354     }
355 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
356  skip_to_init:
357 #endif
358     if (ctx->cipher == NULL)
359         return 0;
360
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
372     if (!(EVP_CIPHER_flags(EVP_CIPHER_CTX_cipher(ctx)) & EVP_CIPH_CUSTOM_IV)) {
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;
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 }
415
416 int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
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 }
424
425 int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
426 {
427     if (ctx->encrypt)
428         return EVP_EncryptFinal_ex(ctx, out, outl);
429     else
430         return EVP_DecryptFinal_ex(ctx, out, outl);
431 }
432
433 int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
434 {
435     if (ctx->encrypt)
436         return EVP_EncryptFinal(ctx, out, outl);
437     else
438         return EVP_DecryptFinal(ctx, out, outl);
439 }
440
441 int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
442                     const unsigned char *key, const unsigned char *iv)
443 {
444     return EVP_CipherInit(ctx, cipher, key, iv, 1);
445 }
446
447 int 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 }
453
454 int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
455                     const unsigned char *key, const unsigned char *iv)
456 {
457     return EVP_CipherInit(ctx, cipher, key, iv, 0);
458 }
459
460 int 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 }
466
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
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.
484  */
485 # define PTRDIFF_T uint64_t
486 #else
487 # define PTRDIFF_T size_t
488 #endif
489
490 int is_partially_overlapping(const void *ptr1, const void *ptr2, int len)
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      */
498     int overlapped = (len > 0) & (diff != 0) & ((diff < (PTRDIFF_T)len) |
499                                                 (diff > (0 - (PTRDIFF_T)len)));
500
501     return overlapped;
502 }
503
504 static int evp_EncryptDecryptUpdate(EVP_CIPHER_CTX *ctx,
505                                     unsigned char *out, int *outl,
506                                     const unsigned char *in, int inl)
507 {
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;
512
513     bl = ctx->cipher->block_size;
514
515     if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
516         /* If block size > 1 then the cipher will have to do this check */
517         if (bl == 1 && is_partially_overlapping(out, in, cmpl)) {
518             EVPerr(EVP_F_EVP_ENCRYPTDECRYPTUPDATE, EVP_R_PARTIALLY_OVERLAPPING);
519             return 0;
520         }
521
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
530     if (inl <= 0) {
531         *outl = 0;
532         return inl == 0;
533     }
534     if (is_partially_overlapping(out + ctx->buf_len, in, cmpl)) {
535         EVPerr(EVP_F_EVP_ENCRYPTDECRYPTUPDATE, EVP_R_PARTIALLY_OVERLAPPING);
536         return 0;
537     }
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;
549     OPENSSL_assert(bl <= (int)sizeof(ctx->buf));
550     if (i != 0) {
551         if (bl - i > inl) {
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);
559             inl -= j;
560             in += j;
561             if (!ctx->cipher->do_cipher(ctx, out, ctx->buf, bl))
562                 return 0;
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 }
581
582
583 int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
584                       const unsigned char *in, int inl)
585 {
586     int ret;
587     size_t soutl;
588     int blocksize;
589
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
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)
602         goto legacy;
603
604     blocksize = EVP_CIPHER_CTX_block_size(ctx);
605
606     if (ctx->cipher->cupdate == NULL  || blocksize < 1) {
607         EVPerr(EVP_F_EVP_ENCRYPTUPDATE, EVP_R_UPDATE_ERROR);
608         return 0;
609     }
610     ret = ctx->cipher->cupdate(ctx->provctx, out, &soutl,
611                                inl + (blocksize == 1 ? 0 : blocksize), in,
612                                (size_t)inl);
613
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;
620     }
621
622     return ret;
623
624     /* TODO(3.0): Remove legacy code below */
625  legacy:
626
627     return evp_EncryptDecryptUpdate(ctx, out, outl, in, inl);
628 }
629
630 int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
631 {
632     int ret;
633     ret = EVP_EncryptFinal_ex(ctx, out, outl);
634     return ret;
635 }
636
637 int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
638 {
639     int n, ret;
640     unsigned int i, b, bl;
641     size_t soutl;
642     int blocksize;
643
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
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)
655         goto legacy;
656
657     blocksize = EVP_CIPHER_CTX_block_size(ctx);
658
659     if (blocksize < 1 || ctx->cipher->cfinal == NULL) {
660         EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX, EVP_R_FINAL_ERROR);
661         return 0;
662     }
663
664     ret = ctx->cipher->cfinal(ctx->provctx, out, &soutl,
665                               blocksize == 1 ? 0 : blocksize);
666
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;
673     }
674
675     return ret;
676
677     /* TODO(3.0): Remove legacy code below */
678  legacy:
679
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;
690     OPENSSL_assert(b <= sizeof(ctx->buf));
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 }
716
717 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
718                       const unsigned char *in, int inl)
719 {
720     int fix_len, cmpl = inl, ret;
721     unsigned int b;
722     size_t soutl;
723     int blocksize;
724
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
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)
736         goto legacy;
737
738     blocksize = EVP_CIPHER_CTX_block_size(ctx);
739
740     if (ctx->cipher->cupdate == NULL || blocksize < 1) {
741         EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_UPDATE_ERROR);
742         return 0;
743     }
744     ret = ctx->cipher->cupdate(ctx->provctx, out, &soutl,
745                                inl + (blocksize == 1 ? 0 : blocksize), in,
746                                (size_t)inl);
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
761     b = ctx->cipher->block_size;
762
763     if (EVP_CIPHER_CTX_test_flags(ctx, EVP_CIPH_FLAG_LENGTH_BITS))
764         cmpl = (cmpl + 7) / 8;
765
766     if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
767         if (b == 1 && is_partially_overlapping(out, in, cmpl)) {
768             EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_PARTIALLY_OVERLAPPING);
769             return 0;
770         }
771
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
781     if (inl <= 0) {
782         *outl = 0;
783         return inl == 0;
784     }
785
786     if (ctx->flags & EVP_CIPH_NO_PADDING)
787         return evp_EncryptDecryptUpdate(ctx, out, outl, in, inl);
788
789     OPENSSL_assert(b <= sizeof(ctx->final));
790
791     if (ctx->final_used) {
792         /* see comment about PTRDIFF_T comparison above */
793         if (((PTRDIFF_T)out == (PTRDIFF_T)in)
794             || is_partially_overlapping(out, in, b)) {
795             EVPerr(EVP_F_EVP_DECRYPTUPDATE, EVP_R_PARTIALLY_OVERLAPPING);
796             return 0;
797         }
798         memcpy(out, ctx->final, b);
799         out += b;
800         fix_len = 1;
801     } else
802         fix_len = 0;
803
804     if (!evp_EncryptDecryptUpdate(ctx, out, outl, in, inl))
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 }
823
824 int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
825 {
826     int ret;
827     ret = EVP_DecryptFinal_ex(ctx, out, outl);
828     return ret;
829 }
830
831 int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
832 {
833     int i, n;
834     unsigned int b;
835     size_t soutl;
836     int ret;
837     int blocksize;
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
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)
851         goto legacy;
852
853     blocksize = EVP_CIPHER_CTX_block_size(ctx);
854
855     if (blocksize < 1 || ctx->cipher->cfinal == NULL) {
856         EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_FINAL_ERROR);
857         return 0;
858     }
859
860     ret = ctx->cipher->cfinal(ctx->provctx, out, &soutl,
861                               blocksize == 1 ? 0 : blocksize);
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
876     *outl = 0;
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);
899             return 0;
900         }
901         OPENSSL_assert(b <= sizeof(ctx->final));
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);
910             return 0;
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);
915                 return 0;
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;
924     return 1;
925 }
926
927 int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen)
928 {
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);
934
935     if (ok != EVP_CTRL_RET_UNSUPPORTED)
936         return ok;
937
938     /* TODO(3.0) legacy code follows */
939     if (c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH)
940         return EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_KEY_LENGTH, keylen, NULL);
941     if (EVP_CIPHER_CTX_key_length(c) == keylen)
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 }
950
951 int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
952 {
953     int ok;
954     OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
955
956     if (pad)
957         ctx->flags &= ~EVP_CIPH_NO_PADDING;
958     else
959         ctx->flags |= EVP_CIPH_NO_PADDING;
960
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
964     return ok != 0;
965 }
966
967 int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
968 {
969     int ret = EVP_CTRL_RET_UNSUPPORTED;
970     int set_params = 1;
971     size_t sz;
972     OSSL_PARAM params[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
973
974     if (ctx == NULL || ctx->cipher == NULL) {
975         EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_NO_CIPHER_SET);
976         return 0;
977     }
978
979     if (ctx->cipher->prov == NULL)
980         goto legacy;
981
982     switch (type) {
983     case EVP_CTRL_SET_KEY_LENGTH:
984         params[0] = OSSL_PARAM_construct_int(OSSL_CIPHER_PARAM_KEYLEN, &arg);
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 */
989     default:
990         return EVP_CTRL_RET_UNSUPPORTED;
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);
1002         break;
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;
1032     }
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);
1038     return ret;
1039
1040 /* TODO(3.0): Remove legacy code below */
1041 legacy:
1042     if (ctx->cipher->ctrl == NULL) {
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);
1048     if (ret == EVP_CTRL_RET_UNSUPPORTED) {
1049         EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL,
1050                EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);
1051         return 0;
1052     }
1053     return ret;
1054 }
1055
1056 #if !defined(FIPS_MODE)
1057 /* TODO(3.0): No support for RAND yet in the FIPS module */
1058 int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key)
1059 {
1060     int kl;
1061     if (ctx->cipher->flags & EVP_CIPH_RAND_KEY)
1062         return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key);
1063     kl = EVP_CIPHER_CTX_key_length(ctx);
1064     if (kl <= 0 || RAND_priv_bytes(key, kl) <= 0)
1065         return 0;
1066     return 1;
1067 }
1068 #endif
1069
1070 int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in)
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     }
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
1090     if (in->fetched_cipher != NULL && !EVP_CIPHER_up_ref(in->fetched_cipher)) {
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
1106 #if !defined(OPENSSL_NO_ENGINE) && !defined(FIPS_MODE)
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     }
1112 #endif
1113
1114     EVP_CIPHER_CTX_reset(out);
1115     memcpy(out, in, sizeof(*out));
1116
1117     if (in->cipher_data && in->cipher->ctx_size) {
1118         out->cipher_data = OPENSSL_malloc(in->cipher->ctx_size);
1119         if (out->cipher_data == NULL) {
1120             out->cipher = NULL;
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)
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         }
1133     return 1;
1134 }
1135
1136 static void *evp_cipher_from_dispatch(const char *name,
1137                                       const OSSL_DISPATCH *fns,
1138                                       OSSL_PROVIDER *prov)
1139 {
1140     EVP_CIPHER *cipher = NULL;
1141     int fnciphcnt = 0, fnctxcnt = 0;
1142
1143     /*
1144      * The legacy NID is set by EVP_CIPHER_fetch() if the name exists in
1145      * the object database.
1146      */
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);
1151         return NULL;
1152     }
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;
1186         case OSSL_FUNC_CIPHER_CIPHER:
1187             if (cipher->ccipher != NULL)
1188                 break;
1189             cipher->ccipher = OSSL_get_OP_cipher_cipher(fns);
1190             break;
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;
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;
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)
1214                 break;
1215             cipher->ctx_set_params = OSSL_get_OP_cipher_ctx_set_params(fns);
1216             break;
1217         }
1218     }
1219     if ((fnciphcnt != 0 && fnciphcnt != 3 && fnciphcnt != 4)
1220             || (fnciphcnt == 0 && cipher->ccipher == NULL)
1221             || fnctxcnt != 2) {
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"
1225          * functions, or a single "cipher" function. In all cases we need both
1226          * the "newctx" and "freectx" functions.
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)
1234         ossl_provider_up_ref(prov);
1235
1236     return cipher;
1237 }
1238
1239 static int evp_cipher_up_ref(void *cipher)
1240 {
1241     return EVP_CIPHER_up_ref(cipher);
1242 }
1243
1244 static void evp_cipher_free(void *cipher)
1245 {
1246     EVP_CIPHER_meth_free(cipher);
1247 }
1248
1249 EVP_CIPHER *EVP_CIPHER_fetch(OPENSSL_CTX *ctx, const char *algorithm,
1250                              const char *properties)
1251 {
1252     EVP_CIPHER *cipher =
1253         evp_generic_fetch(ctx, OSSL_OP_CIPHER, algorithm, properties,
1254                           evp_cipher_from_dispatch, evp_cipher_up_ref,
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;
1270 }
1271
1272 void 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 }