2f121ff9cb67313b9d351ae6aac074f042bb1b45
[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 "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 "constant_time_locl.h"
68 #include "evp_locl.h"
69
70 const char EVP_version[]="EVP" OPENSSL_VERSION_PTEXT;
71
72 void EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx)
73         {
74         memset(ctx,0,sizeof(EVP_CIPHER_CTX));
75         /* ctx->cipher=NULL; */
76         }
77
78 EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void)
79         {
80         EVP_CIPHER_CTX *ctx=OPENSSL_malloc(sizeof *ctx);
81         if (ctx)
82                 EVP_CIPHER_CTX_init(ctx);
83         return ctx;
84         }
85
86 int EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
87              const unsigned char *key, const unsigned char *iv, int enc)
88         {
89         if (cipher)
90                 EVP_CIPHER_CTX_init(ctx);
91         return EVP_CipherInit_ex(ctx,cipher,NULL,key,iv,enc);
92         }
93
94 int EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl,
95              const unsigned char *key, const unsigned char *iv, int enc)
96         {
97         if (enc == -1)
98                 enc = ctx->encrypt;
99         else
100                 {
101                 if (enc)
102                         enc = 1;
103                 ctx->encrypt = enc;
104                 }
105 #ifndef OPENSSL_NO_ENGINE
106         /* Whether it's nice or not, "Inits" can be used on "Final"'d contexts
107          * so this context may already have an ENGINE! Try to avoid releasing
108          * the previous handle, re-querying for an ENGINE, and having a
109          * reinitialisation, when it may all be unecessary. */
110         if (ctx->engine && ctx->cipher && (!cipher ||
111                         (cipher && (cipher->nid == 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
117                  * (the previous check attempted to avoid this if the same
118                  * ENGINE and EVP_CIPHER could be used). */
119                 if (ctx->cipher)
120                         {
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                         {
130                         if (!ENGINE_init(impl))
131                                 {
132                                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
133                                 return 0;
134                                 }
135                         }
136                 else
137                         /* Ask if an ENGINE is reserved for this job */
138                         impl = ENGINE_get_cipher_engine(cipher->nid);
139                 if(impl)
140                         {
141                         /* There's an ENGINE for this job ... (apparently) */
142                         const EVP_CIPHER *c = ENGINE_get_cipher(impl, cipher->nid);
143                         if(!c)
144                                 {
145                                 /* One positive side-effect of US's export
146                                  * control history, is that we should at least
147                                  * be able to avoid using US mispellings of
148                                  * "initialisation"? */
149                                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
150                                 return 0;
151                                 }
152                         /* We'll use the ENGINE's private cipher definition */
153                         cipher = c;
154                         /* Store the ENGINE functional reference so we know
155                          * 'cipher' came from an ENGINE and we need to release
156                          * it when done. */
157                         ctx->engine = impl;
158                         }
159                 else
160                         ctx->engine = NULL;
161 #endif
162
163                 ctx->cipher=cipher;
164                 if (ctx->cipher->ctx_size)
165                         {
166                         ctx->cipher_data=OPENSSL_malloc(ctx->cipher->ctx_size);
167                         if (!ctx->cipher_data)
168                                 {
169                                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, ERR_R_MALLOC_FAILURE);
170                                 return 0;
171                                 }
172                         }
173                 else
174                         {
175                         ctx->cipher_data = NULL;
176                         }
177                 ctx->key_len = cipher->key_len;
178                 /* Preserve wrap enable flag, zero everything else */
179                 ctx->flags &= EVP_CIPHER_CTX_FLAG_WRAP_ALLOW;
180                 if(ctx->cipher->flags & EVP_CIPH_CTRL_INIT)
181                         {
182                         if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL))
183                                 {
184                                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
185                                 return 0;
186                                 }
187                         }
188                 }
189         else if(!ctx->cipher)
190                 {
191                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_NO_CIPHER_SET);
192                 return 0;
193                 }
194 #ifndef OPENSSL_NO_ENGINE
195 skip_to_init:
196 #endif
197         /* we assume block size is a power of 2 in *cryptUpdate */
198         OPENSSL_assert(ctx->cipher->block_size == 1
199             || ctx->cipher->block_size == 8
200             || ctx->cipher->block_size == 16);
201
202         if(!(ctx->flags & EVP_CIPHER_CTX_FLAG_WRAP_ALLOW)
203                 && EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_WRAP_MODE)
204                 {
205                 EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_WRAP_MODE_NOT_ALLOWED);
206                 return 0;
207                 }
208
209         if(!(EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_CUSTOM_IV)) {
210                 switch(EVP_CIPHER_CTX_mode(ctx)) {
211
212                         case EVP_CIPH_STREAM_CIPHER:
213                         case EVP_CIPH_ECB_MODE:
214                         break;
215
216                         case EVP_CIPH_CFB_MODE:
217                         case EVP_CIPH_OFB_MODE:
218
219                         ctx->num = 0;
220                         /* fall-through */
221
222                         case EVP_CIPH_CBC_MODE:
223
224                         OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) <=
225                                         (int)sizeof(ctx->iv));
226                         if(iv) memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
227                         memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
228                         break;
229
230                         case EVP_CIPH_CTR_MODE:
231                         ctx->num = 0;
232                         /* Don't reuse IV for CTR mode */
233                         if(iv)
234                                 memcpy(ctx->iv, iv, EVP_CIPHER_CTX_iv_length(ctx));
235                         break;
236
237                         default:
238                         return 0;
239                         break;
240                 }
241         }
242                 
243
244         if(key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) {
245                 if(!ctx->cipher->init(ctx,key,iv,enc)) return 0;
246         }
247         ctx->buf_len=0;
248         ctx->final_used=0;
249         ctx->block_mask=ctx->cipher->block_size-1;
250         return 1;
251         }
252
253 int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
254              const unsigned char *in, int inl)
255         {
256         if (ctx->encrypt)
257                 return EVP_EncryptUpdate(ctx,out,outl,in,inl);
258         else    return EVP_DecryptUpdate(ctx,out,outl,in,inl);
259         }
260
261 int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
262         {
263         if (ctx->encrypt)
264                 return EVP_EncryptFinal_ex(ctx,out,outl);
265         else    return EVP_DecryptFinal_ex(ctx,out,outl);
266         }
267
268 int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
269         {
270         if (ctx->encrypt)
271                 return EVP_EncryptFinal(ctx,out,outl);
272         else    return EVP_DecryptFinal(ctx,out,outl);
273         }
274
275 int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
276              const unsigned char *key, const unsigned char *iv)
277         {
278         return EVP_CipherInit(ctx, cipher, key, iv, 1);
279         }
280
281 int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl,
282                 const unsigned char *key, const unsigned char *iv)
283         {
284         return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 1);
285         }
286
287 int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
288              const unsigned char *key, const unsigned char *iv)
289         {
290         return EVP_CipherInit(ctx, cipher, key, iv, 0);
291         }
292
293 int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl,
294              const unsigned char *key, const unsigned char *iv)
295         {
296         return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 0);
297         }
298
299 int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
300              const unsigned char *in, int inl)
301         {
302         int i,j,bl;
303
304         if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
305                 {
306                 i = ctx->cipher->do_cipher(ctx, out, in, inl);
307                 if (i < 0)
308                         return 0;
309                 else
310                         *outl = i;
311                 return 1;
312                 }
313
314         if (inl <= 0)
315                 {
316                 *outl = 0;
317                 return inl == 0;
318                 }
319
320         if(ctx->buf_len == 0 && (inl&(ctx->block_mask)) == 0)
321                 {
322                 if(ctx->cipher->do_cipher(ctx,out,in,inl))
323                         {
324                         *outl=inl;
325                         return 1;
326                         }
327                 else
328                         {
329                         *outl=0;
330                         return 0;
331                         }
332                 }
333         i=ctx->buf_len;
334         bl=ctx->cipher->block_size;
335         OPENSSL_assert(bl <= (int)sizeof(ctx->buf));
336         if (i != 0)
337                 {
338                 if (i+inl < bl)
339                         {
340                         memcpy(&(ctx->buf[i]),in,inl);
341                         ctx->buf_len+=inl;
342                         *outl=0;
343                         return 1;
344                         }
345                 else
346                         {
347                         j=bl-i;
348                         memcpy(&(ctx->buf[i]),in,j);
349                         if(!ctx->cipher->do_cipher(ctx,out,ctx->buf,bl)) return 0;
350                         inl-=j;
351                         in+=j;
352                         out+=bl;
353                         *outl=bl;
354                         }
355                 }
356         else
357                 *outl = 0;
358         i=inl&(bl-1);
359         inl-=i;
360         if (inl > 0)
361                 {
362                 if(!ctx->cipher->do_cipher(ctx,out,in,inl)) return 0;
363                 *outl+=inl;
364                 }
365
366         if (i != 0)
367                 memcpy(ctx->buf,&(in[inl]),i);
368         ctx->buf_len=i;
369         return 1;
370         }
371
372 int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
373         {
374         int ret;
375         ret = EVP_EncryptFinal_ex(ctx, out, outl);
376         return ret;
377         }
378
379 int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
380         {
381         int n,ret;
382         unsigned int i, b, bl;
383
384         if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
385                 {
386                 ret = ctx->cipher->do_cipher(ctx, out, NULL, 0);
387                 if (ret < 0)
388                         return 0;
389                 else 
390                         *outl = ret;
391                 return 1;
392                 }
393
394         b=ctx->cipher->block_size;
395         OPENSSL_assert(b <= sizeof ctx->buf);
396         if (b == 1)
397                 {
398                 *outl=0;
399                 return 1;
400                 }
401         bl=ctx->buf_len;
402         if (ctx->flags & EVP_CIPH_NO_PADDING)
403                 {
404                 if(bl)
405                         {
406                         EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
407                         return 0;
408                         }
409                 *outl = 0;
410                 return 1;
411                 }
412
413         n=b-bl;
414         for (i=bl; i<b; i++)
415                 ctx->buf[i]=n;
416         ret=ctx->cipher->do_cipher(ctx,out,ctx->buf,b);
417
418
419         if(ret)
420                 *outl=b;
421
422         return ret;
423         }
424
425 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
426              const unsigned char *in, int inl)
427         {
428         int fix_len;
429         unsigned int b;
430
431         if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
432                 {
433                 fix_len = ctx->cipher->do_cipher(ctx, out, in, inl);
434                 if (fix_len < 0)
435                         {
436                         *outl = 0;
437                         return 0;
438                         }
439                 else
440                         *outl = fix_len;
441                 return 1;
442                 }
443
444         if (inl <= 0)
445                 {
446                 *outl = 0;
447                 return inl == 0;
448                 }
449
450         if (ctx->flags & EVP_CIPH_NO_PADDING)
451                 return EVP_EncryptUpdate(ctx, out, outl, in, inl);
452
453         b=ctx->cipher->block_size;
454         OPENSSL_assert(b <= sizeof ctx->final);
455
456         if(ctx->final_used)
457                 {
458                 memcpy(out,ctx->final,b);
459                 out+=b;
460                 fix_len = 1;
461                 }
462         else
463                 fix_len = 0;
464
465
466         if(!EVP_EncryptUpdate(ctx,out,outl,in,inl))
467                 return 0;
468
469         /* if we have 'decrypted' a multiple of block size, make sure
470          * we have a copy of this last block */
471         if (b > 1 && !ctx->buf_len)
472                 {
473                 *outl-=b;
474                 ctx->final_used=1;
475                 memcpy(ctx->final,&out[*outl],b);
476                 }
477         else
478                 ctx->final_used = 0;
479
480         if (fix_len)
481                 *outl += b;
482                 
483         return 1;
484         }
485
486 int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
487         {
488         int ret;
489         ret = EVP_DecryptFinal_ex(ctx, out, outl);
490         return ret;
491         }
492
493 int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
494         {
495         unsigned int i, b;
496         unsigned char pad, padding_good;
497         *outl=0;
498
499         if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
500                 {
501                 int ret = ctx->cipher->do_cipher(ctx, out, NULL, 0);
502                 if (ret < 0)
503                         return 0;
504                 else
505                         *outl = ret;
506                 return 1;
507                 }
508
509         b=(unsigned int)(ctx->cipher->block_size);
510         if (ctx->flags & EVP_CIPH_NO_PADDING)
511                 {
512                 if(ctx->buf_len)
513                         {
514                         EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
515                         return 0;
516                         }
517                 *outl = 0;
518                 return 1;
519                 }
520         if (b > 1)
521                 {
522                 if (ctx->buf_len || !ctx->final_used)
523                         {
524                         EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_WRONG_FINAL_BLOCK_LENGTH);
525                         return(0);
526                         }
527                 OPENSSL_assert(b <= sizeof ctx->final);
528                 pad=ctx->final[b-1];
529
530                 padding_good = (unsigned char)(~constant_time_is_zero_8(pad));
531                 padding_good &= constant_time_ge_8(b, pad);
532
533                 for (i = 1; i < b; ++i)
534                         {
535                         unsigned char is_pad_index = constant_time_lt_8(i, pad);
536                         unsigned char pad_byte_good = constant_time_eq_8(ctx->final[b-i-1], pad);
537                         padding_good &= constant_time_select_8(is_pad_index, pad_byte_good, 0xff);
538                         }
539
540                 /*
541                  * At least 1 byte is always padding, so we always write b - 1
542                  * bytes to avoid a timing leak. The caller is required to have |b|
543                  * bytes space in |out| by the API contract.
544                  */
545                 for (i = 0; i < b - 1; ++i)
546                         out[i] = ctx->final[i] & padding_good;
547                 /* Safe cast: for a good padding, EVP_MAX_IV_LENGTH >= b >= pad */
548                 *outl = padding_good & ((unsigned char)(b - pad));
549                 return padding_good & 1;
550                 }
551         else
552                 {
553                 *outl = 0;
554                 return 1;
555                 }
556         }
557
558 void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
559         {
560         if (ctx)
561                 {
562                 EVP_CIPHER_CTX_cleanup(ctx);
563                 OPENSSL_free(ctx);
564                 }
565         }
566
567 int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c)
568         {
569         if (c->cipher != NULL)
570                 {
571                 if(c->cipher->cleanup && !c->cipher->cleanup(c))
572                         return 0;
573                 /* Cleanse cipher context data */
574                 if (c->cipher_data)
575                         OPENSSL_cleanse(c->cipher_data, c->cipher->ctx_size);
576                 }
577         if (c->cipher_data)
578                 OPENSSL_free(c->cipher_data);
579 #ifndef OPENSSL_NO_ENGINE
580         if (c->engine)
581                 /* The EVP_CIPHER we used belongs to an ENGINE, release the
582                  * functional reference we held for this reason. */
583                 ENGINE_finish(c->engine);
584 #endif
585         memset(c,0,sizeof(EVP_CIPHER_CTX));
586         return 1;
587         }
588
589 int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen)
590         {
591         if(c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH) 
592                 return EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_KEY_LENGTH, keylen, NULL);
593         if(c->key_len == keylen) return 1;
594         if((keylen > 0) && (c->cipher->flags & EVP_CIPH_VARIABLE_LENGTH))
595                 {
596                 c->key_len = keylen;
597                 return 1;
598                 }
599         EVPerr(EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH,EVP_R_INVALID_KEY_LENGTH);
600         return 0;
601         }
602
603 int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
604         {
605         if (pad) ctx->flags &= ~EVP_CIPH_NO_PADDING;
606         else ctx->flags |= EVP_CIPH_NO_PADDING;
607         return 1;
608         }
609
610 int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
611 {
612         int ret;
613         if(!ctx->cipher) {
614                 EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_NO_CIPHER_SET);
615                 return 0;
616         }
617
618         if(!ctx->cipher->ctrl) {
619                 EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_NOT_IMPLEMENTED);
620                 return 0;
621         }
622
623         ret = ctx->cipher->ctrl(ctx, type, arg, ptr);
624         if(ret == -1) {
625                 EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);
626                 return 0;
627         }
628         return ret;
629 }
630
631 int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key)
632         {
633         if (ctx->cipher->flags & EVP_CIPH_RAND_KEY)
634                 return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key);
635         if (RAND_bytes(key, ctx->key_len) <= 0)
636                 return 0;
637         return 1;
638         }
639
640 int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in)
641         {
642         if ((in == NULL) || (in->cipher == NULL))
643                 {
644                 EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,EVP_R_INPUT_NOT_INITIALIZED);
645                 return 0;
646                 }
647 #ifndef OPENSSL_NO_ENGINE
648         /* Make sure it's safe to copy a cipher context using an ENGINE */
649         if (in->engine && !ENGINE_init(in->engine))
650                 {
651                 EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,ERR_R_ENGINE_LIB);
652                 return 0;
653                 }
654 #endif
655
656         EVP_CIPHER_CTX_cleanup(out);
657         memcpy(out,in,sizeof *out);
658
659         if (in->cipher_data && in->cipher->ctx_size)
660                 {
661                 out->cipher_data=OPENSSL_malloc(in->cipher->ctx_size);
662                 if (!out->cipher_data)
663                         {
664                         EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,ERR_R_MALLOC_FAILURE);
665                         return 0;
666                         }
667                 memcpy(out->cipher_data,in->cipher_data,in->cipher->ctx_size);
668                 }
669
670         if (in->cipher->flags & EVP_CIPH_CUSTOM_COPY)
671                 return in->cipher->ctrl((EVP_CIPHER_CTX *)in, EVP_CTRL_COPY, 0, out);
672         return 1;
673         }