Home | History | Annotate | Download | only in evp
      1 /* crypto/evp/evp_enc.c */
      2 /* Copyright (C) 1995-1998 Eric Young (eay (at) cryptsoft.com)
      3  * All rights reserved.
      4  *
      5  * This package is an SSL implementation written
      6  * by Eric Young (eay (at) 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 (at) 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 (at) 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 (at) 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 			return FIPS_cipherinit(ctx, cipher, key, iv, enc);
    176 #endif
    177 		ctx->cipher=cipher;
    178 		if (ctx->cipher->ctx_size)
    179 			{
    180 			ctx->cipher_data=OPENSSL_malloc(ctx->cipher->ctx_size);
    181 			if (!ctx->cipher_data)
    182 				{
    183 				EVPerr(EVP_F_EVP_CIPHERINIT_EX, ERR_R_MALLOC_FAILURE);
    184 				return 0;
    185 				}
    186 			}
    187 		else
    188 			{
    189 			ctx->cipher_data = NULL;
    190 			}
    191 		ctx->key_len = cipher->key_len;
    192 		ctx->flags = 0;
    193 		if(ctx->cipher->flags & EVP_CIPH_CTRL_INIT)
    194 			{
    195 			if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL))
    196 				{
    197 				EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
    198 				return 0;
    199 				}
    200 			}
    201 		}
    202 	else if(!ctx->cipher)
    203 		{
    204 		EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_NO_CIPHER_SET);
    205 		return 0;
    206 		}
    207 #ifndef OPENSSL_NO_ENGINE
    208 skip_to_init:
    209 #endif
    210 #ifdef OPENSSL_FIPS
    211 	if (FIPS_mode())
    212 		return FIPS_cipherinit(ctx, cipher, key, iv, enc);
    213 #endif
    214 	/* we assume block size is a power of 2 in *cryptUpdate */
    215 	OPENSSL_assert(ctx->cipher->block_size == 1
    216 	    || ctx->cipher->block_size == 8
    217 	    || ctx->cipher->block_size == 16);
    218 
    219 	if(!(EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_CUSTOM_IV)) {
    220 		switch(EVP_CIPHER_CTX_mode(ctx)) {
    221 
    222 			case EVP_CIPH_STREAM_CIPHER:
    223 			case EVP_CIPH_ECB_MODE:
    224 			break;
    225 
    226 			case EVP_CIPH_CFB_MODE:
    227 			case EVP_CIPH_OFB_MODE:
    228 
    229 			ctx->num = 0;
    230 			/* fall-through */
    231 
    232 			case EVP_CIPH_CBC_MODE:
    233 
    234 			OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) <=
    235 					(int)sizeof(ctx->iv));
    236 			if(iv) memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
    237 			memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
    238 			break;
    239 
    240 			case EVP_CIPH_CTR_MODE:
    241 			ctx->num = 0;
    242 			/* Don't reuse IV for CTR mode */
    243 			if(iv)
    244 				memcpy(ctx->iv, iv, EVP_CIPHER_CTX_iv_length(ctx));
    245 			break;
    246 
    247 			default:
    248 			return 0;
    249 			break;
    250 		}
    251 	}
    252 
    253 	if(key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) {
    254 		if(!ctx->cipher->init(ctx,key,iv,enc)) return 0;
    255 	}
    256 	ctx->buf_len=0;
    257 	ctx->final_used=0;
    258 	ctx->block_mask=ctx->cipher->block_size-1;
    259 	return 1;
    260 	}
    261 
    262 int EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
    263 	     const unsigned char *in, int inl)
    264 	{
    265 	if (ctx->encrypt)
    266 		return EVP_EncryptUpdate(ctx,out,outl,in,inl);
    267 	else	return EVP_DecryptUpdate(ctx,out,outl,in,inl);
    268 	}
    269 
    270 int EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
    271 	{
    272 	if (ctx->encrypt)
    273 		return EVP_EncryptFinal_ex(ctx,out,outl);
    274 	else	return EVP_DecryptFinal_ex(ctx,out,outl);
    275 	}
    276 
    277 int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
    278 	{
    279 	if (ctx->encrypt)
    280 		return EVP_EncryptFinal(ctx,out,outl);
    281 	else	return EVP_DecryptFinal(ctx,out,outl);
    282 	}
    283 
    284 int EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
    285 	     const unsigned char *key, const unsigned char *iv)
    286 	{
    287 	return EVP_CipherInit(ctx, cipher, key, iv, 1);
    288 	}
    289 
    290 int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl,
    291 		const unsigned char *key, const unsigned char *iv)
    292 	{
    293 	return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 1);
    294 	}
    295 
    296 int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
    297 	     const unsigned char *key, const unsigned char *iv)
    298 	{
    299 	return EVP_CipherInit(ctx, cipher, key, iv, 0);
    300 	}
    301 
    302 int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl,
    303 	     const unsigned char *key, const unsigned char *iv)
    304 	{
    305 	return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 0);
    306 	}
    307 
    308 int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
    309 	     const unsigned char *in, int inl)
    310 	{
    311 	int i,j,bl;
    312 
    313 	if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
    314 		{
    315 		i = M_do_cipher(ctx, out, in, inl);
    316 		if (i < 0)
    317 			return 0;
    318 		else
    319 			*outl = i;
    320 		return 1;
    321 		}
    322 
    323 	if (inl <= 0)
    324 		{
    325 		*outl = 0;
    326 		return inl == 0;
    327 		}
    328 
    329 	if(ctx->buf_len == 0 && (inl&(ctx->block_mask)) == 0)
    330 		{
    331 		if(M_do_cipher(ctx,out,in,inl))
    332 			{
    333 			*outl=inl;
    334 			return 1;
    335 			}
    336 		else
    337 			{
    338 			*outl=0;
    339 			return 0;
    340 			}
    341 		}
    342 	i=ctx->buf_len;
    343 	bl=ctx->cipher->block_size;
    344 	OPENSSL_assert(bl <= (int)sizeof(ctx->buf));
    345 	if (i != 0)
    346 		{
    347 		if (i+inl < bl)
    348 			{
    349 			memcpy(&(ctx->buf[i]),in,inl);
    350 			ctx->buf_len+=inl;
    351 			*outl=0;
    352 			return 1;
    353 			}
    354 		else
    355 			{
    356 			j=bl-i;
    357 			memcpy(&(ctx->buf[i]),in,j);
    358 			if(!M_do_cipher(ctx,out,ctx->buf,bl)) return 0;
    359 			inl-=j;
    360 			in+=j;
    361 			out+=bl;
    362 			*outl=bl;
    363 			}
    364 		}
    365 	else
    366 		*outl = 0;
    367 	i=inl&(bl-1);
    368 	inl-=i;
    369 	if (inl > 0)
    370 		{
    371 		if(!M_do_cipher(ctx,out,in,inl)) return 0;
    372 		*outl+=inl;
    373 		}
    374 
    375 	if (i != 0)
    376 		memcpy(ctx->buf,&(in[inl]),i);
    377 	ctx->buf_len=i;
    378 	return 1;
    379 	}
    380 
    381 int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
    382 	{
    383 	int ret;
    384 	ret = EVP_EncryptFinal_ex(ctx, out, outl);
    385 	return ret;
    386 	}
    387 
    388 int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
    389 	{
    390 	int n,ret;
    391 	unsigned int i, b, bl;
    392 
    393 	if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
    394 		{
    395 		ret = M_do_cipher(ctx, out, NULL, 0);
    396 		if (ret < 0)
    397 			return 0;
    398 		else
    399 			*outl = ret;
    400 		return 1;
    401 		}
    402 
    403 	b=ctx->cipher->block_size;
    404 	OPENSSL_assert(b <= sizeof ctx->buf);
    405 	if (b == 1)
    406 		{
    407 		*outl=0;
    408 		return 1;
    409 		}
    410 	bl=ctx->buf_len;
    411 	if (ctx->flags & EVP_CIPH_NO_PADDING)
    412 		{
    413 		if(bl)
    414 			{
    415 			EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
    416 			return 0;
    417 			}
    418 		*outl = 0;
    419 		return 1;
    420 		}
    421 
    422 	n=b-bl;
    423 	for (i=bl; i<b; i++)
    424 		ctx->buf[i]=n;
    425 	ret=M_do_cipher(ctx,out,ctx->buf,b);
    426 
    427 
    428 	if(ret)
    429 		*outl=b;
    430 
    431 	return ret;
    432 	}
    433 
    434 int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
    435 	     const unsigned char *in, int inl)
    436 	{
    437 	int fix_len;
    438 	unsigned int b;
    439 
    440 	if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
    441 		{
    442 		fix_len = M_do_cipher(ctx, out, in, inl);
    443 		if (fix_len < 0)
    444 			{
    445 			*outl = 0;
    446 			return 0;
    447 			}
    448 		else
    449 			*outl = fix_len;
    450 		return 1;
    451 		}
    452 
    453 	if (inl <= 0)
    454 		{
    455 		*outl = 0;
    456 		return inl == 0;
    457 		}
    458 
    459 	if (ctx->flags & EVP_CIPH_NO_PADDING)
    460 		return EVP_EncryptUpdate(ctx, out, outl, in, inl);
    461 
    462 	b=ctx->cipher->block_size;
    463 	OPENSSL_assert(b <= sizeof ctx->final);
    464 
    465 	if(ctx->final_used)
    466 		{
    467 		memcpy(out,ctx->final,b);
    468 		out+=b;
    469 		fix_len = 1;
    470 		}
    471 	else
    472 		fix_len = 0;
    473 
    474 
    475 	if(!EVP_EncryptUpdate(ctx,out,outl,in,inl))
    476 		return 0;
    477 
    478 	/* if we have 'decrypted' a multiple of block size, make sure
    479 	 * we have a copy of this last block */
    480 	if (b > 1 && !ctx->buf_len)
    481 		{
    482 		*outl-=b;
    483 		ctx->final_used=1;
    484 		memcpy(ctx->final,&out[*outl],b);
    485 		}
    486 	else
    487 		ctx->final_used = 0;
    488 
    489 	if (fix_len)
    490 		*outl += b;
    491 
    492 	return 1;
    493 	}
    494 
    495 int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
    496 	{
    497 	int ret;
    498 	ret = EVP_DecryptFinal_ex(ctx, out, outl);
    499 	return ret;
    500 	}
    501 
    502 int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
    503 	{
    504 	unsigned int i, b;
    505         unsigned char pad, padding_good;
    506 	*outl=0;
    507 
    508 	if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
    509 		{
    510 		int ret = M_do_cipher(ctx, out, NULL, 0);
    511 		if (ret < 0)
    512 			return 0;
    513 		else
    514 			*outl = ret;
    515 		return 1;
    516 		}
    517 
    518 	b=(unsigned int)(ctx->cipher->block_size);
    519 	if (ctx->flags & EVP_CIPH_NO_PADDING)
    520 		{
    521 		if(ctx->buf_len)
    522 			{
    523 			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
    524 			return 0;
    525 			}
    526 		*outl = 0;
    527 		return 1;
    528 		}
    529 	if (b > 1)
    530 		{
    531 		if (ctx->buf_len || !ctx->final_used)
    532 			{
    533 			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_WRONG_FINAL_BLOCK_LENGTH);
    534 			return(0);
    535 			}
    536 		OPENSSL_assert(b <= sizeof ctx->final);
    537 		pad=ctx->final[b-1];
    538 
    539 		padding_good = (unsigned char)(~constant_time_is_zero_8(pad));
    540 		padding_good &= constant_time_ge_8(b, pad);
    541 
    542                 for (i = 1; i < b; ++i)
    543 			{
    544 			unsigned char is_pad_index = constant_time_lt_8(i, pad);
    545 			unsigned char pad_byte_good = constant_time_eq_8(ctx->final[b-i-1], pad);
    546 			padding_good &= constant_time_select_8(is_pad_index, pad_byte_good, 0xff);
    547 			}
    548 
    549 		/*
    550 		 * At least 1 byte is always padding, so we always write b - 1
    551 		 * bytes to avoid a timing leak. The caller is required to have |b|
    552 		 * bytes space in |out| by the API contract.
    553 		 */
    554 		for (i = 0; i < b - 1; ++i)
    555 			out[i] = ctx->final[i] & padding_good;
    556 		/* Safe cast: for a good padding, EVP_MAX_IV_LENGTH >= b >= pad */
    557 		*outl = padding_good & ((unsigned char)(b - pad));
    558 		return padding_good & 1;
    559 		}
    560 	else
    561 		{
    562 		*outl = 0;
    563 		return 1;
    564 		}
    565 	}
    566 
    567 void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
    568 	{
    569 	if (ctx)
    570 		{
    571 		EVP_CIPHER_CTX_cleanup(ctx);
    572 		OPENSSL_free(ctx);
    573 		}
    574 	}
    575 
    576 int EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c)
    577 	{
    578 #ifndef OPENSSL_FIPS
    579 	if (c->cipher != NULL)
    580 		{
    581 		if(c->cipher->cleanup && !c->cipher->cleanup(c))
    582 			return 0;
    583 		/* Cleanse cipher context data */
    584 		if (c->cipher_data)
    585 			OPENSSL_cleanse(c->cipher_data, c->cipher->ctx_size);
    586 		}
    587 	if (c->cipher_data)
    588 		OPENSSL_free(c->cipher_data);
    589 #endif
    590 #ifndef OPENSSL_NO_ENGINE
    591 	if (c->engine)
    592 		/* The EVP_CIPHER we used belongs to an ENGINE, release the
    593 		 * functional reference we held for this reason. */
    594 		ENGINE_finish(c->engine);
    595 #endif
    596 #ifdef OPENSSL_FIPS
    597 	FIPS_cipher_ctx_cleanup(c);
    598 #endif
    599 	memset(c,0,sizeof(EVP_CIPHER_CTX));
    600 	return 1;
    601 	}
    602 
    603 int EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen)
    604 	{
    605 	if(c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH)
    606 		return EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_KEY_LENGTH, keylen, NULL);
    607 	if(c->key_len == keylen) return 1;
    608 	if((keylen > 0) && (c->cipher->flags & EVP_CIPH_VARIABLE_LENGTH))
    609 		{
    610 		c->key_len = keylen;
    611 		return 1;
    612 		}
    613 	EVPerr(EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH,EVP_R_INVALID_KEY_LENGTH);
    614 	return 0;
    615 	}
    616 
    617 int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
    618 	{
    619 	if (pad) ctx->flags &= ~EVP_CIPH_NO_PADDING;
    620 	else ctx->flags |= EVP_CIPH_NO_PADDING;
    621 	return 1;
    622 	}
    623 
    624 int EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
    625 {
    626 	int ret;
    627 	if(!ctx->cipher) {
    628 		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_NO_CIPHER_SET);
    629 		return 0;
    630 	}
    631 
    632 	if(!ctx->cipher->ctrl) {
    633 		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_NOT_IMPLEMENTED);
    634 		return 0;
    635 	}
    636 
    637 	ret = ctx->cipher->ctrl(ctx, type, arg, ptr);
    638 	if(ret == -1) {
    639 		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);
    640 		return 0;
    641 	}
    642 	return ret;
    643 }
    644 
    645 int EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key)
    646 	{
    647 	if (ctx->cipher->flags & EVP_CIPH_RAND_KEY)
    648 		return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key);
    649 	if (RAND_bytes(key, ctx->key_len) <= 0)
    650 		return 0;
    651 	return 1;
    652 	}
    653 
    654 int EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in)
    655 	{
    656 	if ((in == NULL) || (in->cipher == NULL))
    657 		{
    658 		EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,EVP_R_INPUT_NOT_INITIALIZED);
    659 		return 0;
    660 		}
    661 #ifndef OPENSSL_NO_ENGINE
    662 	/* Make sure it's safe to copy a cipher context using an ENGINE */
    663 	if (in->engine && !ENGINE_init(in->engine))
    664 		{
    665 		EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,ERR_R_ENGINE_LIB);
    666 		return 0;
    667 		}
    668 #endif
    669 
    670 	EVP_CIPHER_CTX_cleanup(out);
    671 	memcpy(out,in,sizeof *out);
    672 
    673 	if (in->cipher_data && in->cipher->ctx_size)
    674 		{
    675 		out->cipher_data=OPENSSL_malloc(in->cipher->ctx_size);
    676 		if (!out->cipher_data)
    677 			{
    678 			EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,ERR_R_MALLOC_FAILURE);
    679 			return 0;
    680 			}
    681 		memcpy(out->cipher_data,in->cipher_data,in->cipher->ctx_size);
    682 		}
    683 
    684 	if (in->cipher->flags & EVP_CIPH_CUSTOM_COPY)
    685 		return in->cipher->ctrl((EVP_CIPHER_CTX *)in, EVP_CTRL_COPY, 0, out);
    686 	return 1;
    687 	}
    688