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