RT3999: Remove sub-component version strings
[openssl.git] / crypto / evp / evp_enc.c
1 /* crypto/evp/evp_enc.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to.  The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  *    notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  *    notice, this list of conditions and the following disclaimer in the
30  *    documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  *    must display the following acknowledgement:
33  *    "This product includes cryptographic software written by
34  *     Eric Young (eay@cryptsoft.com)"
35  *    The word 'cryptographic' can be left out if the rouines from the library
36  *    being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  *    the apps directory (application code) you must include an acknowledgement:
39  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58
59 #include <stdio.h>
60 #include "internal/cryptlib.h"
61 #include <openssl/evp.h>
62 #include <openssl/err.h>
63 #include <openssl/rand.h>
64 #ifndef OPENSSL_NO_ENGINE
65 # include <openssl/engine.h>
66 #endif
67 #include "evp_locl.h"
68
69 void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx)
70 {
71     memset(ctx, 0, sizeof(*ctx));
72 }
73
74 EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void)
75 {
76     EVP_CIPHER_CTX *ctx = OPENSSL_malloc(sizeof(*ctx));
77     if (ctx)
78         EVP_CIPHER_CTX_init(ctx);
79     return ctx;
80 }
81
82 int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
83                    const unsigned char *key, const unsigned char *iv, int enc)
84 {
85     if (cipher)
86         EVP_CIPHER_CTX_init(ctx);
87     return EVP_CipherInit_ex(ctx, cipher, NULL, key, iv, enc);
88 }
89
90 int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
91                       ENGINE *impl, const unsigned char *key,
92                       const unsigned char *iv, int enc)
93 {
94     if (enc == -1)
95         enc = ctx->encrypt;
96     else {
97         if (enc)
98             enc = 1;
99         ctx->encrypt = enc;
100     }
101 #ifndef OPENSSL_NO_ENGINE
102     /*
103      * Whether it's nice or not, "Inits" can be used on "Final"'d contexts so
104      * this context may already have an ENGINE! Try to avoid releasing the
105      * previous handle, re-querying for an ENGINE, and having a
106      * reinitialisation, when it may all be unecessary.
107      */
108     if (ctx->engine && ctx->cipher && (!cipher ||
109                                        (cipher
110                                         && (cipher->nid ==
111                                             ctx->cipher->nid))))
112         goto skip_to_init;
113 #endif
114     if (cipher) {
115         /*
116          * Ensure a context left lying around from last time is cleared (the
117          * previous check attempted to avoid this if the same ENGINE and
118          * EVP_CIPHER could be used).
119          */
120         if (ctx->cipher) {
121             unsigned long flags = ctx->flags;
122             EVP_CIPHER_CTX_cleanup(ctx);
123             /* Restore encrypt and flags */
124             ctx->encrypt = enc;
125             ctx->flags = flags;
126         }
127 #ifndef OPENSSL_NO_ENGINE
128         if (impl) {
129             if (!ENGINE_init(impl)) {
130                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
131                 return 0;
132             }
133         } else
134             /* Ask if an ENGINE is reserved for this job */
135             impl = ENGINE_get_cipher_engine(cipher->nid);
136         if (impl) {
137             /* There's an ENGINE for this job ... (apparently) */
138             const EVP_CIPHER *c = ENGINE_get_cipher(impl, cipher->nid);
139             if (!c) {
140                 /*
141                  * One positive side-effect of US's export control history,
142                  * is that we should at least be able to avoid using US
143                  * mispellings of "initialisation"?
144                  */
145                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
146                 return 0;
147             }
148             /* We'll use the ENGINE's private cipher definition */
149             cipher = c;
150             /*
151              * Store the ENGINE functional reference so we know 'cipher' came
152              * from an ENGINE and we need to release it when done.
153              */
154             ctx->engine = impl;
155         } else
156             ctx->engine = NULL;
157 #endif
158
159         ctx->cipher = cipher;
160         if (ctx->cipher->ctx_size) {
161             ctx->cipher_data = OPENSSL_malloc(ctx->cipher->ctx_size);
162             if (!ctx->cipher_data) {
163                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, ERR_R_MALLOC_FAILURE);
164                 return 0;
165             }
166             memset(ctx->cipher_data, 0, ctx->cipher->ctx_size);
167         } else {
168             ctx->cipher_data = NULL;
169         }
170         ctx->key_len = cipher->key_len;
171         /* Preserve wrap enable flag, zero everything else */
172         ctx->flags &= EVP_CIPHER_CTX_FLAG_WRAP_ALLOW;
173         if (ctx->cipher->flags & EVP_CIPH_CTRL_INIT) {
174             if (!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL)) {
175                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
176                 return 0;
177             }
178         }
179     } else if (!ctx->cipher) {
180         EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_NO_CIPHER_SET);
181         return 0;
182     }
183 #ifndef OPENSSL_NO_ENGINE
184  skip_to_init:
185 #endif
186     /* we assume block size is a power of 2 in *cryptUpdate */
187     OPENSSL_assert(ctx->cipher->block_size == 1
188                    || ctx->cipher->block_size == 8
189                    || ctx->cipher->block_size == 16);
190
191     if (!(ctx->flags & EVP_CIPHER_CTX_FLAG_WRAP_ALLOW)
192         && EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_WRAP_MODE) {
193         EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_WRAP_MODE_NOT_ALLOWED);
194         return 0;
195     }
196
197     if (!(EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_CUSTOM_IV)) {
198         switch (EVP_CIPHER_CTX_mode(ctx)) {
199
200         case EVP_CIPH_STREAM_CIPHER:
201         case EVP_CIPH_ECB_MODE:
202             break;
203
204         case EVP_CIPH_CFB_MODE:
205         case EVP_CIPH_OFB_MODE:
206
207             ctx->num = 0;
208             /* fall-through */
209
210         case EVP_CIPH_CBC_MODE:
211
212             OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) <=
213                            (int)sizeof(ctx->iv));
214             if (iv)
215                 memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
216             memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
217             break;
218
219         case EVP_CIPH_CTR_MODE:
220             ctx->num = 0;
221             /* Don't reuse IV for CTR mode */
222             if (iv)
223                 memcpy(ctx->iv, iv, EVP_CIPHER_CTX_iv_length(ctx));
224             break;
225
226         default:
227             return 0;
228         }
229     }
230
231     if (key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) {
232         if (!ctx->cipher->init(ctx, key, iv, enc))
233             return 0;
234     }
235     ctx->buf_len = 0;
236     ctx->final_used = 0;
237     ctx->block_mask = ctx->cipher->block_size - 1;
238     return 1;
239 }
240
241 int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
242                      const unsigned char *in, int inl)
243 {
244     if (ctx->encrypt)
245         return EVP_EncryptUpdate(ctx, out, outl, in, inl);
246     else
247         return EVP_DecryptUpdate(ctx, out, outl, in, inl);
248 }
249
250 int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
251 {
252     if (ctx->encrypt)
253         return EVP_EncryptFinal_ex(ctx, out, outl);
254     else
255         return EVP_DecryptFinal_ex(ctx, out, outl);
256 }
257
258 int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
259 {
260     if (ctx->encrypt)
261         return EVP_EncryptFinal(ctx, out, outl);
262     else
263         return EVP_DecryptFinal(ctx, out, outl);
264 }
265
266 int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
267                     const unsigned char *key, const unsigned char *iv)
268 {
269     return EVP_CipherInit(ctx, cipher, key, iv, 1);
270 }
271
272 int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
273                        ENGINE *impl, const unsigned char *key,
274                        const unsigned char *iv)
275 {
276     return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 1);
277 }
278
279 int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
280                     const unsigned char *key, const unsigned char *iv)
281 {
282     return EVP_CipherInit(ctx, cipher, key, iv, 0);
283 }
284
285 int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
286                        ENGINE *impl, const unsigned char *key,
287                        const unsigned char *iv)
288 {
289     return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 0);
290 }
291
292 int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
293                       const unsigned char *in, int inl)
294 {
295     int i, j, bl;
296
297     if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
298         i = ctx->cipher->do_cipher(ctx, out, in, inl);
299         if (i < 0)
300             return 0;
301         else
302             *outl = i;
303         return 1;
304     }
305
306     if (inl <= 0) {
307         *outl = 0;
308         return inl == 0;
309     }
310
311     if (ctx->buf_len == 0 && (inl & (ctx->block_mask)) == 0) {
312         if (ctx->cipher->do_cipher(ctx, out, in, inl)) {
313             *outl = inl;
314             return 1;
315         } else {
316             *outl = 0;
317             return 0;
318         }
319     }
320     i = ctx->buf_len;
321     bl = ctx->cipher->block_size;
322     OPENSSL_assert(bl <= (int)sizeof(ctx->buf));
323     if (i != 0) {
324         if (i + inl < bl) {
325             memcpy(&(ctx->buf[i]), in, inl);
326             ctx->buf_len += inl;
327             *outl = 0;
328             return 1;
329         } else {
330             j = bl - i;
331             memcpy(&(ctx->buf[i]), in, j);
332             if (!ctx->cipher->do_cipher(ctx, out, ctx->buf, bl))
333                 return 0;
334             inl -= j;
335             in += j;
336             out += bl;
337             *outl = bl;
338         }
339     } else
340         *outl = 0;
341     i = inl & (bl - 1);
342     inl -= i;
343     if (inl > 0) {
344         if (!ctx->cipher->do_cipher(ctx, out, in, inl))
345             return 0;
346         *outl += inl;
347     }
348
349     if (i != 0)
350         memcpy(ctx->buf, &(in[inl]), i);
351     ctx->buf_len = i;
352     return 1;
353 }
354
355 int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
356 {
357     int ret;
358     ret = EVP_EncryptFinal_ex(ctx, out, outl);
359     return ret;
360 }
361
362 int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
363 {
364     int n, ret;
365     unsigned int i, b, bl;
366
367     if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
368         ret = ctx->cipher->do_cipher(ctx, out, NULL, 0);
369         if (ret < 0)
370             return 0;
371         else
372             *outl = ret;
373         return 1;
374     }
375
376     b = ctx->cipher->block_size;
377     OPENSSL_assert(b <= sizeof ctx->buf);
378     if (b == 1) {
379         *outl = 0;
380         return 1;
381     }
382     bl = ctx->buf_len;
383     if (ctx->flags & EVP_CIPH_NO_PADDING) {
384         if (bl) {
385             EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX,
386                    EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
387             return 0;
388         }
389         *outl = 0;
390         return 1;
391     }
392
393     n = b - bl;
394     for (i = bl; i < b; i++)
395         ctx->buf[i] = n;
396     ret = ctx->cipher->do_cipher(ctx, out, ctx->buf, b);
397
398     if (ret)
399         *outl = b;
400
401     return ret;
402 }
403
404 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
405                       const unsigned char *in, int inl)
406 {
407     int fix_len;
408     unsigned int b;
409
410     if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
411         fix_len = ctx->cipher->do_cipher(ctx, out, in, inl);
412         if (fix_len < 0) {
413             *outl = 0;
414             return 0;
415         } else
416             *outl = fix_len;
417         return 1;
418     }
419
420     if (inl <= 0) {
421         *outl = 0;
422         return inl == 0;
423     }
424
425     if (ctx->flags & EVP_CIPH_NO_PADDING)
426         return EVP_EncryptUpdate(ctx, out, outl, in, inl);
427
428     b = ctx->cipher->block_size;
429     OPENSSL_assert(b <= sizeof ctx->final);
430
431     if (ctx->final_used) {
432         memcpy(out, ctx->final, b);
433         out += b;
434         fix_len = 1;
435     } else
436         fix_len = 0;
437
438     if (!EVP_EncryptUpdate(ctx, out, outl, in, inl))
439         return 0;
440
441     /*
442      * if we have 'decrypted' a multiple of block size, make sure we have a
443      * copy of this last block
444      */
445     if (b > 1 && !ctx->buf_len) {
446         *outl -= b;
447         ctx->final_used = 1;
448         memcpy(ctx->final, &out[*outl], b);
449     } else
450         ctx->final_used = 0;
451
452     if (fix_len)
453         *outl += b;
454
455     return 1;
456 }
457
458 int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
459 {
460     int ret;
461     ret = EVP_DecryptFinal_ex(ctx, out, outl);
462     return ret;
463 }
464
465 int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
466 {
467     int i, n;
468     unsigned int b;
469     *outl = 0;
470
471     if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER) {
472         i = ctx->cipher->do_cipher(ctx, out, NULL, 0);
473         if (i < 0)
474             return 0;
475         else
476             *outl = i;
477         return 1;
478     }
479
480     b = ctx->cipher->block_size;
481     if (ctx->flags & EVP_CIPH_NO_PADDING) {
482         if (ctx->buf_len) {
483             EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,
484                    EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
485             return 0;
486         }
487         *outl = 0;
488         return 1;
489     }
490     if (b > 1) {
491         if (ctx->buf_len || !ctx->final_used) {
492             EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_WRONG_FINAL_BLOCK_LENGTH);
493             return (0);
494         }
495         OPENSSL_assert(b <= sizeof ctx->final);
496
497         /*
498          * The following assumes that the ciphertext has been authenticated.
499          * Otherwise it provides a padding oracle.
500          */
501         n = ctx->final[b - 1];
502         if (n == 0 || n > (int)b) {
503             EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_BAD_DECRYPT);
504             return (0);
505         }
506         for (i = 0; i < n; i++) {
507             if (ctx->final[--b] != n) {
508                 EVPerr(EVP_F_EVP_DECRYPTFINAL_EX, EVP_R_BAD_DECRYPT);
509                 return (0);
510             }
511         }
512         n = ctx->cipher->block_size - n;
513         for (i = 0; i < n; i++)
514             out[i] = ctx->final[i];
515         *outl = n;
516     } else
517         *outl = 0;
518     return (1);
519 }
520
521 void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
522 {
523     EVP_CIPHER_CTX_cleanup(ctx);
524     OPENSSL_free(ctx);
525 }
526
527 int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c)
528 {
529     if (!c)
530         return 0;
531     if (c->cipher != NULL) {
532         if (c->cipher->cleanup && !c->cipher->cleanup(c))
533             return 0;
534         /* Cleanse cipher context data */
535         if (c->cipher_data)
536             OPENSSL_cleanse(c->cipher_data, c->cipher->ctx_size);
537     }
538     OPENSSL_free(c->cipher_data);
539 #ifndef OPENSSL_NO_ENGINE
540     if (c->engine)
541         /*
542          * The EVP_CIPHER we used belongs to an ENGINE, release the
543          * functional reference we held for this reason.
544          */
545         ENGINE_finish(c->engine);
546 #endif
547     memset(c, 0, sizeof(*c));
548     return 1;
549 }
550
551 int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen)
552 {
553     if (c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH)
554         return EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_KEY_LENGTH, keylen, NULL);
555     if (c->key_len == keylen)
556         return 1;
557     if ((keylen > 0) && (c->cipher->flags & EVP_CIPH_VARIABLE_LENGTH)) {
558         c->key_len = keylen;
559         return 1;
560     }
561     EVPerr(EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH, EVP_R_INVALID_KEY_LENGTH);
562     return 0;
563 }
564
565 int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
566 {
567     if (pad)
568         ctx->flags &= ~EVP_CIPH_NO_PADDING;
569     else
570         ctx->flags |= EVP_CIPH_NO_PADDING;
571     return 1;
572 }
573
574 int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
575 {
576     int ret;
577     if (!ctx->cipher) {
578         EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_NO_CIPHER_SET);
579         return 0;
580     }
581
582     if (!ctx->cipher->ctrl) {
583         EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_NOT_IMPLEMENTED);
584         return 0;
585     }
586
587     ret = ctx->cipher->ctrl(ctx, type, arg, ptr);
588     if (ret == -1) {
589         EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL,
590                EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);
591         return 0;
592     }
593     return ret;
594 }
595
596 int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key)
597 {
598     if (ctx->cipher->flags & EVP_CIPH_RAND_KEY)
599         return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key);
600     if (RAND_bytes(key, ctx->key_len) <= 0)
601         return 0;
602     return 1;
603 }
604
605 int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in)
606 {
607     if ((in == NULL) || (in->cipher == NULL)) {
608         EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, EVP_R_INPUT_NOT_INITIALIZED);
609         return 0;
610     }
611 #ifndef OPENSSL_NO_ENGINE
612     /* Make sure it's safe to copy a cipher context using an ENGINE */
613     if (in->engine && !ENGINE_init(in->engine)) {
614         EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, ERR_R_ENGINE_LIB);
615         return 0;
616     }
617 #endif
618
619     EVP_CIPHER_CTX_cleanup(out);
620     memcpy(out, in, sizeof(*out));
621
622     if (in->cipher_data && in->cipher->ctx_size) {
623         out->cipher_data = OPENSSL_malloc(in->cipher->ctx_size);
624         if (!out->cipher_data) {
625             EVPerr(EVP_F_EVP_CIPHER_CTX_COPY, ERR_R_MALLOC_FAILURE);
626             return 0;
627         }
628         memcpy(out->cipher_data, in->cipher_data, in->cipher->ctx_size);
629     }
630
631     if (in->cipher->flags & EVP_CIPH_CUSTOM_COPY)
632         return in->cipher->ctrl((EVP_CIPHER_CTX *)in, EVP_CTRL_COPY, 0, out);
633     return 1;
634 }