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