• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
EVP_CIPHER_CTX_init(EVP_CIPHER_CTX * ctx)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 
EVP_CIPHER_CTX_new(void)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 
EVP_CipherInit(EVP_CIPHER_CTX * ctx,const EVP_CIPHER * cipher,const unsigned char * key,const unsigned char * iv,int enc)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 
EVP_CipherInit_ex(EVP_CIPHER_CTX * ctx,const EVP_CIPHER * cipher,ENGINE * impl,const unsigned char * key,const unsigned char * iv,int enc)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 
EVP_CipherUpdate(EVP_CIPHER_CTX * ctx,unsigned char * out,int * outl,const unsigned char * in,int inl)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 
EVP_CipherFinal_ex(EVP_CIPHER_CTX * ctx,unsigned char * out,int * outl)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 
EVP_CipherFinal(EVP_CIPHER_CTX * ctx,unsigned char * out,int * outl)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 
EVP_EncryptInit(EVP_CIPHER_CTX * ctx,const EVP_CIPHER * cipher,const unsigned char * key,const unsigned char * iv)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 
EVP_EncryptInit_ex(EVP_CIPHER_CTX * ctx,const EVP_CIPHER * cipher,ENGINE * impl,const unsigned char * key,const unsigned char * iv)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 
EVP_DecryptInit(EVP_CIPHER_CTX * ctx,const EVP_CIPHER * cipher,const unsigned char * key,const unsigned char * iv)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 
EVP_DecryptInit_ex(EVP_CIPHER_CTX * ctx,const EVP_CIPHER * cipher,ENGINE * impl,const unsigned char * key,const unsigned char * iv)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 
EVP_EncryptUpdate(EVP_CIPHER_CTX * ctx,unsigned char * out,int * outl,const unsigned char * in,int inl)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 
EVP_EncryptFinal(EVP_CIPHER_CTX * ctx,unsigned char * out,int * outl)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 
EVP_EncryptFinal_ex(EVP_CIPHER_CTX * ctx,unsigned char * out,int * outl)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 
EVP_DecryptUpdate(EVP_CIPHER_CTX * ctx,unsigned char * out,int * outl,const unsigned char * in,int inl)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 
EVP_DecryptFinal(EVP_CIPHER_CTX * ctx,unsigned char * out,int * outl)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 
EVP_DecryptFinal_ex(EVP_CIPHER_CTX * ctx,unsigned char * out,int * outl)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 
EVP_CIPHER_CTX_free(EVP_CIPHER_CTX * ctx)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 
EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX * c)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 
EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX * c,int keylen)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 
EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX * ctx,int pad)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 
EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX * ctx,int type,int arg,void * ptr)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 
EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX * ctx,unsigned char * key)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 
EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX * out,const EVP_CIPHER_CTX * in)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