evp_enc.c revision 43c12e3d4f9bbbbd4a8ba7b149686437514bc6b6
1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/evp/evp_enc.c */
2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved.
4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written
6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com).
7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL.
8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as
10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to.  The following conditions
11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA,
12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms
14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in
17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed.
18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution
19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used.
20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or
21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package.
22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright
27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    documentation and/or other materials provided with the distribution.
31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software
32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    must display the following acknowledgement:
33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes cryptographic software written by
34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *     Eric Young (eay@cryptsoft.com)"
35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    The word 'cryptographic' can be left out if the rouines from the library
36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    being used are not cryptographic related :-).
37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from
38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the apps directory (application code) you must include an acknowledgement:
39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE.
52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or
54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed.  i.e. this code cannot simply be
55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence
56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.]
57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/evp.h>
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/engine.h>
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "evp_locl.h"
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
69e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguconst char EVP_version[]="EVP" OPENSSL_VERSION_PTEXT;
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
71221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx)
72221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
73221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	memset(ctx,0,sizeof(EVP_CIPHER_CTX));
74221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* ctx->cipher=NULL; */
75221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
76221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void)
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_CIPHER_CTX *ctx=OPENSSL_malloc(sizeof *ctx);
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx)
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_CIPHER_CTX_init(ctx);
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ctx;
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *key, const unsigned char *iv, int enc)
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cipher)
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_CIPHER_CTX_init(ctx);
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_CipherInit_ex(ctx,cipher,NULL,key,iv,enc);
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl,
94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	     const unsigned char *key, const unsigned char *iv, int enc)
95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (enc == -1)
97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		enc = ctx->encrypt;
98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else
99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (enc)
101221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			enc = 1;
102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->encrypt = enc;
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE
105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* Whether it's nice or not, "Inits" can be used on "Final"'d contexts
106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 * so this context may already have an ENGINE! Try to avoid releasing
107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 * the previous handle, re-querying for an ENGINE, and having a
108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 * reinitialisation, when it may all be unecessary. */
109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ctx->engine && ctx->cipher && (!cipher ||
110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			(cipher && (cipher->nid == ctx->cipher->nid))))
111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		goto skip_to_init;
112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (cipher)
114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		/* Ensure a context left lying around from last time is cleared
116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		 * (the previous check attempted to avoid this if the same
117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		 * ENGINE and EVP_CIPHER could be used). */
118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVP_CIPHER_CTX_cleanup(ctx);
119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		/* Restore encrypt field: it is zeroed by cleanup */
121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->encrypt = enc;
122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE
123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(impl)
124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (!ENGINE_init(impl))
126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				{
127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				}
130221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		else
132221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			/* Ask if an ENGINE is reserved for this job */
133221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			impl = ENGINE_get_cipher_engine(cipher->nid);
134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(impl)
135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			/* There's an ENGINE for this job ... (apparently) */
137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			const EVP_CIPHER *c = ENGINE_get_cipher(impl, cipher->nid);
138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if(!c)
139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				{
140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				/* One positive side-effect of US's export
141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 * control history, is that we should at least
142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 * be able to avoid using US mispellings of
143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 * "initialisation"? */
144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				}
147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			/* We'll use the ENGINE's private cipher definition */
148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			cipher = c;
149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			/* Store the ENGINE functional reference so we know
150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			 * 'cipher' came from an ENGINE and we need to release
151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			 * it when done. */
152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->engine = impl;
153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		else
155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->engine = NULL;
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->cipher=cipher;
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (ctx->cipher->ctx_size)
160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->cipher_data=OPENSSL_malloc(ctx->cipher->ctx_size);
162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (!ctx->cipher_data)
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				{
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_CIPHERINIT_EX, ERR_R_MALLOC_FAILURE);
165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				}
167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		else
169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->cipher_data = NULL;
171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
172221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->key_len = cipher->key_len;
173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->flags = 0;
174221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(ctx->cipher->flags & EVP_CIPH_CTRL_INIT)
175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL))
177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				{
178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				}
181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else if(!ctx->cipher)
184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_NO_CIPHER_SET);
186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE
189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromskip_to_init:
190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* we assume block size is a power of 2 in *cryptUpdate */
192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	OPENSSL_assert(ctx->cipher->block_size == 1
193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	    || ctx->cipher->block_size == 8
194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	    || ctx->cipher->block_size == 16);
195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(!(EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_CUSTOM_IV)) {
197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		switch(EVP_CIPHER_CTX_mode(ctx)) {
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			case EVP_CIPH_STREAM_CIPHER:
200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			case EVP_CIPH_ECB_MODE:
201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			break;
202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			case EVP_CIPH_CFB_MODE:
204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			case EVP_CIPH_OFB_MODE:
205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->num = 0;
20743c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom			/* fall-through */
208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			case EVP_CIPH_CBC_MODE:
210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) <=
212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					(int)sizeof(ctx->iv));
213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if(iv) memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			break;
216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			default:
218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			return 0;
219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			break;
220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) {
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(!ctx->cipher->init(ctx,key,iv,enc)) return 0;
225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->buf_len=0;
227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->final_used=0;
228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->block_mask=ctx->cipher->block_size-1;
229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 1;
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *in, int inl)
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->encrypt)
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_EncryptUpdate(ctx,out,outl,in,inl);
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else	return EVP_DecryptUpdate(ctx,out,outl,in,inl);
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->encrypt)
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_EncryptFinal_ex(ctx,out,outl);
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else	return EVP_DecryptFinal_ex(ctx,out,outl);
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->encrypt)
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_EncryptFinal(ctx,out,outl);
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else	return EVP_DecryptFinal(ctx,out,outl);
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *key, const unsigned char *iv)
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_CipherInit(ctx, cipher, key, iv, 1);
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl,
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		const unsigned char *key, const unsigned char *iv)
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 1);
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *key, const unsigned char *iv)
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_CipherInit(ctx, cipher, key, iv, 0);
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl,
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *key, const unsigned char *iv)
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 0);
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *in, int inl)
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,j,bl;
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
283e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (inl <= 0)
284e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
285e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		*outl = 0;
286e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		return inl == 0;
287e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
288e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ctx->buf_len == 0 && (inl&(ctx->block_mask)) == 0)
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
291221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(ctx->cipher->do_cipher(ctx,out,in,inl))
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*outl=inl;
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 1;
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*outl=0;
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=ctx->buf_len;
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bl=ctx->cipher->block_size;
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_assert(bl <= (int)sizeof(ctx->buf));
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i != 0)
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i+inl < bl)
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(&(ctx->buf[i]),in,inl);
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ctx->buf_len+=inl;
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*outl=0;
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 1;
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			j=bl-i;
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(&(ctx->buf[i]),in,j);
318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if(!ctx->cipher->do_cipher(ctx,out,ctx->buf,bl)) return 0;
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			inl-=j;
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			in+=j;
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			out+=bl;
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*outl=bl;
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl = 0;
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=inl&(bl-1);
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	inl-=i;
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (inl > 0)
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
331221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(!ctx->cipher->do_cipher(ctx,out,in,inl)) return 0;
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl+=inl;
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i != 0)
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(ctx->buf,&(in[inl]),i);
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->buf_len=i;
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = EVP_EncryptFinal_ex(ctx, out, outl);
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int n,ret;
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int i, b, bl;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	b=ctx->cipher->block_size;
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_assert(b <= sizeof ctx->buf);
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (b == 1)
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl=0;
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bl=ctx->buf_len;
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->flags & EVP_CIPH_NO_PADDING)
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(bl)
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl = 0;
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	n=b-bl;
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=bl; i<b; i++)
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->buf[i]=n;
375221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret=ctx->cipher->do_cipher(ctx,out,ctx->buf,b);
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ret)
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl=b;
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *in, int inl)
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int fix_len;
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int b;
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
390e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (inl <= 0)
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
392e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		*outl = 0;
393e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		return inl == 0;
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->flags & EVP_CIPH_NO_PADDING)
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_EncryptUpdate(ctx, out, outl, in, inl);
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	b=ctx->cipher->block_size;
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_assert(b <= sizeof ctx->final);
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ctx->final_used)
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(out,ctx->final,b);
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		out+=b;
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fix_len = 1;
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fix_len = 0;
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!EVP_EncryptUpdate(ctx,out,outl,in,inl))
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* if we have 'decrypted' a multiple of block size, make sure
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * we have a copy of this last block */
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (b > 1 && !ctx->buf_len)
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl-=b;
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->final_used=1;
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(ctx->final,&out[*outl],b);
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
424656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->final_used = 0;
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (fix_len)
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl += b;
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = EVP_DecryptFinal_ex(ctx, out, outl);
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
439656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
440656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
441656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,n;
442656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int b;
443656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
444656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*outl=0;
445656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	b=ctx->cipher->block_size;
446656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->flags & EVP_CIPH_NO_PADDING)
447656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
448656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(ctx->buf_len)
449656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
450656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
451656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
452656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl = 0;
454656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
455656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (b > 1)
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ctx->buf_len || !ctx->final_used)
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_WRONG_FINAL_BLOCK_LENGTH);
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_assert(b <= sizeof ctx->final);
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		n=ctx->final[b-1];
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (n == 0 || n > (int)b)
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<n; i++)
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (ctx->final[--b] != n)
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return(0);
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		n=ctx->cipher->block_size-n;
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<n; i++)
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			out[i]=ctx->final[i];
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl=n;
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl=0;
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx)
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_CIPHER_CTX_cleanup(ctx);
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(ctx);
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
497221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c)
498221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
499221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (c->cipher != NULL)
500221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
501221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(c->cipher->cleanup && !c->cipher->cleanup(c))
502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			return 0;
503221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		/* Cleanse cipher context data */
504221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (c->cipher_data)
505221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			OPENSSL_cleanse(c->cipher_data, c->cipher->ctx_size);
506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (c->cipher_data)
508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		OPENSSL_free(c->cipher_data);
509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE
510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (c->engine)
511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		/* The EVP_CIPHER we used belongs to an ENGINE, release the
512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		 * functional reference we held for this reason. */
513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ENGINE_finish(c->engine);
514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	memset(c,0,sizeof(EVP_CIPHER_CTX));
516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 1;
517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen)
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH)
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_KEY_LENGTH, keylen, NULL);
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(c->key_len == keylen) return 1;
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if((keylen > 0) && (c->cipher->flags & EVP_CIPH_VARIABLE_LENGTH))
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		c->key_len = keylen;
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVPerr(EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH,EVP_R_INVALID_KEY_LENGTH);
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (pad) ctx->flags &= ~EVP_CIPH_NO_PADDING;
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else ctx->flags |= EVP_CIPH_NO_PADDING;
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
540221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
541221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{
542221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int ret;
543221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(!ctx->cipher) {
544221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_NO_CIPHER_SET);
545221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
546221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
547221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(!ctx->cipher->ctrl) {
549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_NOT_IMPLEMENTED);
550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
552221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
553221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret = ctx->cipher->ctrl(ctx, type, arg, ptr);
554221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(ret == -1) {
555221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);
556221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
557221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
558221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return ret;
559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key)
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->cipher->flags & EVP_CIPH_RAND_KEY)
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key);
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (RAND_bytes(key, ctx->key_len) <= 0)
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in)
571e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if ((in == NULL) || (in->cipher == NULL))
573e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,EVP_R_INPUT_NOT_INITIALIZED);
575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
576e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE
578221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* Make sure it's safe to copy a cipher context using an ENGINE */
579221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (in->engine && !ENGINE_init(in->engine))
580221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
581221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,ERR_R_ENGINE_LIB);
582221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
583221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
584221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
585221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
586221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	EVP_CIPHER_CTX_cleanup(out);
587221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	memcpy(out,in,sizeof *out);
588221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
589221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (in->cipher_data && in->cipher->ctx_size)
590e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
591221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		out->cipher_data=OPENSSL_malloc(in->cipher->ctx_size);
592221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (!out->cipher_data)
593e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
594221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,ERR_R_MALLOC_FAILURE);
595e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			return 0;
596e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
597221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		memcpy(out->cipher_data,in->cipher_data,in->cipher->ctx_size);
598e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
599e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
600221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (in->cipher->flags & EVP_CIPH_CUSTOM_COPY)
601221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return in->cipher->ctrl((EVP_CIPHER_CTX *)in, EVP_CTRL_COPY, 0, out);
602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 1;
603e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
604e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
605