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
67392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
68392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include <openssl/fips.h>
69392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "evp_locl.h"
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
72392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
73392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#define M_do_cipher(ctx, out, in, inl) FIPS_cipher(ctx, out, in, inl)
74392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else
75392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#define M_do_cipher(ctx, out, in, inl) ctx->cipher->do_cipher(ctx, out, in, inl)
76392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
77392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
78392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
79e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguconst char EVP_version[]="EVP" OPENSSL_VERSION_PTEXT;
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromvoid EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx)
82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	memset(ctx,0,sizeof(EVP_CIPHER_CTX));
84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* ctx->cipher=NULL; */
85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void)
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_CIPHER_CTX *ctx=OPENSSL_malloc(sizeof *ctx);
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx)
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_CIPHER_CTX_init(ctx);
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ctx;
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CipherInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *key, const unsigned char *iv, int enc)
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (cipher)
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_CIPHER_CTX_init(ctx);
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_CipherInit_ex(ctx,cipher,NULL,key,iv,enc);
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
103221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl,
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	     const unsigned char *key, const unsigned char *iv, int enc)
105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (enc == -1)
107221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		enc = ctx->encrypt;
108221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else
109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (enc)
111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			enc = 1;
112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->encrypt = enc;
113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE
115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* Whether it's nice or not, "Inits" can be used on "Final"'d contexts
116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 * so this context may already have an ENGINE! Try to avoid releasing
117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 * the previous handle, re-querying for an ENGINE, and having a
118221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 * reinitialisation, when it may all be unecessary. */
119221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ctx->engine && ctx->cipher && (!cipher ||
120221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			(cipher && (cipher->nid == ctx->cipher->nid))))
121221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		goto skip_to_init;
122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
123221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (cipher)
124221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
125221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		/* Ensure a context left lying around from last time is cleared
126221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		 * (the previous check attempted to avoid this if the same
127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		 * ENGINE and EVP_CIPHER could be used). */
128392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		if (ctx->cipher)
129392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			{
130392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			unsigned long flags = ctx->flags;
131392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			EVP_CIPHER_CTX_cleanup(ctx);
132392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			/* Restore encrypt and flags */
133392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			ctx->encrypt = enc;
134392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			ctx->flags = flags;
135392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			}
136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE
137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(impl)
138221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
139221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (!ENGINE_init(impl))
140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				{
141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				}
144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		else
146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			/* Ask if an ENGINE is reserved for this job */
147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			impl = ENGINE_get_cipher_engine(cipher->nid);
148221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(impl)
149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			/* There's an ENGINE for this job ... (apparently) */
151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			const EVP_CIPHER *c = ENGINE_get_cipher(impl, cipher->nid);
152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if(!c)
153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				{
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				/* One positive side-effect of US's export
155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 * control history, is that we should at least
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 * be able to avoid using US mispellings of
157221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				 * "initialisation"? */
158221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				}
161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			/* We'll use the ENGINE's private cipher definition */
162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			cipher = c;
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			/* Store the ENGINE functional reference so we know
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			 * 'cipher' came from an ENGINE and we need to release
165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			 * it when done. */
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->engine = impl;
167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
168221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		else
169221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->engine = NULL;
170221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
171221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
172392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
173a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom		if (FIPS_mode())
174a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom			return FIPS_cipherinit(ctx, cipher, key, iv, enc);
175f42d491ab90c82302b0054c62014c1ee9b638affBrian Carlstrom#endif
176221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->cipher=cipher;
177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (ctx->cipher->ctx_size)
178221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
179221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->cipher_data=OPENSSL_malloc(ctx->cipher->ctx_size);
180221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (!ctx->cipher_data)
181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				{
182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_CIPHERINIT_EX, ERR_R_MALLOC_FAILURE);
183221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				}
185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		else
187221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
188221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->cipher_data = NULL;
189221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
190221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->key_len = cipher->key_len;
191221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ctx->flags = 0;
192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(ctx->cipher->flags & EVP_CIPH_CTRL_INIT)
193221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL))
195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				{
196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
197221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				return 0;
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				}
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	else if(!ctx->cipher)
202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_NO_CIPHER_SET);
204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE
207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromskip_to_init:
208221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
209392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
210a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom	if (FIPS_mode())
211a1a5710c055e139ea00e785f9eb55b3af3e4dab1Brian Carlstrom		return FIPS_cipherinit(ctx, cipher, key, iv, enc);
212f42d491ab90c82302b0054c62014c1ee9b638affBrian Carlstrom#endif
213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* we assume block size is a power of 2 in *cryptUpdate */
214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	OPENSSL_assert(ctx->cipher->block_size == 1
215221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	    || ctx->cipher->block_size == 8
216221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	    || ctx->cipher->block_size == 16);
217221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
218221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(!(EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_CUSTOM_IV)) {
219221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		switch(EVP_CIPHER_CTX_mode(ctx)) {
220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
221221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			case EVP_CIPH_STREAM_CIPHER:
222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			case EVP_CIPH_ECB_MODE:
223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			break;
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			case EVP_CIPH_CFB_MODE:
226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			case EVP_CIPH_OFB_MODE:
227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->num = 0;
22943c12e3d4f9bbbbd4a8ba7b149686437514bc6b6Brian Carlstrom			/* fall-through */
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			case EVP_CIPH_CBC_MODE:
232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) <=
234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					(int)sizeof(ctx->iv));
235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if(iv) memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			break;
238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
239392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			case EVP_CIPH_CTR_MODE:
240392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			ctx->num = 0;
241392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			/* Don't reuse IV for CTR mode */
242392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			if(iv)
243392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom				memcpy(ctx->iv, iv, EVP_CIPHER_CTX_iv_length(ctx));
244392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			break;
245392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			default:
247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			return 0;
248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			break;
249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) {
253221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(!ctx->cipher->init(ctx,key,iv,enc)) return 0;
254221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
255221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->buf_len=0;
256221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->final_used=0;
257221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ctx->block_mask=ctx->cipher->block_size-1;
258221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 1;
259221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
260221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CipherUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *in, int inl)
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->encrypt)
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_EncryptUpdate(ctx,out,outl,in,inl);
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else	return EVP_DecryptUpdate(ctx,out,outl,in,inl);
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CipherFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->encrypt)
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_EncryptFinal_ex(ctx,out,outl);
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else	return EVP_DecryptFinal_ex(ctx,out,outl);
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CipherFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->encrypt)
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_EncryptFinal(ctx,out,outl);
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else	return EVP_DecryptFinal(ctx,out,outl);
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_EncryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *key, const unsigned char *iv)
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_CipherInit(ctx, cipher, key, iv, 1);
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx,const EVP_CIPHER *cipher, ENGINE *impl,
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		const unsigned char *key, const unsigned char *iv)
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 1);
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher,
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *key, const unsigned char *iv)
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_CipherInit(ctx, cipher, key, iv, 0);
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl,
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *key, const unsigned char *iv)
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_CipherInit_ex(ctx, cipher, impl, key, iv, 0);
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *in, int inl)
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,j,bl;
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
312392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
313392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		{
314392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		i = M_do_cipher(ctx, out, in, inl);
315392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		if (i < 0)
316392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			return 0;
317392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		else
318392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			*outl = i;
319392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		return 1;
320392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		}
321392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
322e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (inl <= 0)
323e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
324e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		*outl = 0;
325e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		return inl == 0;
326e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
327e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ctx->buf_len == 0 && (inl&(ctx->block_mask)) == 0)
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
330392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		if(M_do_cipher(ctx,out,in,inl))
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*outl=inl;
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 1;
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*outl=0;
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=ctx->buf_len;
342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bl=ctx->cipher->block_size;
343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_assert(bl <= (int)sizeof(ctx->buf));
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i != 0)
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (i+inl < bl)
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(&(ctx->buf[i]),in,inl);
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ctx->buf_len+=inl;
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*outl=0;
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 1;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			j=bl-i;
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			memcpy(&(ctx->buf[i]),in,j);
357392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			if(!M_do_cipher(ctx,out,ctx->buf,bl)) return 0;
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			inl-=j;
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			in+=j;
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			out+=bl;
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			*outl=bl;
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl = 0;
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	i=inl&(bl-1);
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	inl-=i;
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (inl > 0)
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
370392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		if(!M_do_cipher(ctx,out,in,inl)) return 0;
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl+=inl;
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (i != 0)
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(ctx->buf,&(in[inl]),i);
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ctx->buf_len=i;
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = EVP_EncryptFinal_ex(ctx, out, outl);
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int n,ret;
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int i, b, bl;
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
392392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
393392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		{
394392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		ret = M_do_cipher(ctx, out, NULL, 0);
395392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		if (ret < 0)
396392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			return 0;
397392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		else
398392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			*outl = ret;
399392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		return 1;
400392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		}
401392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	b=ctx->cipher->block_size;
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_assert(b <= sizeof ctx->buf);
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (b == 1)
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl=0;
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	bl=ctx->buf_len;
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->flags & EVP_CIPH_NO_PADDING)
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(bl)
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EVPerr(EVP_F_EVP_ENCRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
416656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
417656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl = 0;
418656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
419656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
420656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
421656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	n=b-bl;
422656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=bl; i<b; i++)
423656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->buf[i]=n;
424392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	ret=M_do_cipher(ctx,out,ctx->buf,b);
425656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
426656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
427656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ret)
428656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl=b;
429656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
430656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
431656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
432656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
433656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl,
434656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	     const unsigned char *in, int inl)
435656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
436656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int fix_len;
437656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int b;
438656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
439392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
440392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		{
441392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		fix_len = M_do_cipher(ctx, out, in, inl);
442392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		if (fix_len < 0)
443392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			{
444392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			*outl = 0;
445392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			return 0;
446392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			}
447392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		else
448392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			*outl = fix_len;
449392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		return 1;
450392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		}
451392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
452e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (inl <= 0)
453656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
454e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		*outl = 0;
455e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		return inl == 0;
456656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
457656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
458656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->flags & EVP_CIPH_NO_PADDING)
459656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_EncryptUpdate(ctx, out, outl, in, inl);
460656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
461656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	b=ctx->cipher->block_size;
462656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_assert(b <= sizeof ctx->final);
463656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
464656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ctx->final_used)
465656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
466656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(out,ctx->final,b);
467656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		out+=b;
468656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fix_len = 1;
469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		fix_len = 0;
472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!EVP_EncryptUpdate(ctx,out,outl,in,inl))
475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* if we have 'decrypted' a multiple of block size, make sure
478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * we have a copy of this last block */
479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (b > 1 && !ctx->buf_len)
480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl-=b;
482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->final_used=1;
483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(ctx->final,&out[*outl],b);
484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->final_used = 0;
487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (fix_len)
489656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl += b;
490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
491656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
492656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
493656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
494656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
495656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
496656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = EVP_DecryptFinal_ex(ctx, out, outl);
498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
502656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i,n;
504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int b;
505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	*outl=0;
506392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
507392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	if (ctx->cipher->flags & EVP_CIPH_FLAG_CUSTOM_CIPHER)
508392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		{
509392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		i = M_do_cipher(ctx, out, NULL, 0);
510392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		if (i < 0)
511392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			return 0;
512392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		else
513392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			*outl = i;
514392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		return 1;
515392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		}
516392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
517656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	b=ctx->cipher->block_size;
518656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->flags & EVP_CIPH_NO_PADDING)
519656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(ctx->buf_len)
521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl = 0;
526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (b > 1)
529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ctx->buf_len || !ctx->final_used)
531656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_WRONG_FINAL_BLOCK_LENGTH);
533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_assert(b <= sizeof ctx->final);
536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		n=ctx->final[b-1];
537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (n == 0 || n > (int)b)
538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<n; i++)
543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (ctx->final[--b] != n)
545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return(0);
548656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
549656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
550656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		n=ctx->cipher->block_size-n;
551656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		for (i=0; i<n; i++)
552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			out[i]=ctx->final[i];
553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl=n;
554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*outl=0;
557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
559656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
560656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
561656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx)
563656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVP_CIPHER_CTX_cleanup(ctx);
565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(ctx);
566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
569221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c)
570221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
571392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifndef OPENSSL_FIPS
572221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (c->cipher != NULL)
573221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
574221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if(c->cipher->cleanup && !c->cipher->cleanup(c))
575221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			return 0;
576221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		/* Cleanse cipher context data */
577221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (c->cipher_data)
578221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			OPENSSL_cleanse(c->cipher_data, c->cipher->ctx_size);
579221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
580221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (c->cipher_data)
581221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		OPENSSL_free(c->cipher_data);
582392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
583221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE
584221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (c->engine)
585221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		/* The EVP_CIPHER we used belongs to an ENGINE, release the
586221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		 * functional reference we held for this reason. */
587221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ENGINE_finish(c->engine);
588221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
589392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
590392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	FIPS_cipher_ctx_cleanup(c);
591392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
592221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	memset(c,0,sizeof(EVP_CIPHER_CTX));
593221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 1;
594221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
595221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CIPHER_CTX_set_key_length(EVP_CIPHER_CTX *c, int keylen)
597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(c->cipher->flags & EVP_CIPH_CUSTOM_KEY_LENGTH)
599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_KEY_LENGTH, keylen, NULL);
600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(c->key_len == keylen) return 1;
601656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if((keylen > 0) && (c->cipher->flags & EVP_CIPH_VARIABLE_LENGTH))
602656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		c->key_len = keylen;
604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVPerr(EVP_F_EVP_CIPHER_CTX_SET_KEY_LENGTH,EVP_R_INVALID_KEY_LENGTH);
607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
610656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *ctx, int pad)
611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
612656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (pad) ctx->flags &= ~EVP_CIPH_NO_PADDING;
613656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else ctx->flags |= EVP_CIPH_NO_PADDING;
614656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
615656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
616656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
618221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom{
619221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	int ret;
620221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(!ctx->cipher) {
621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_NO_CIPHER_SET);
622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(!ctx->cipher->ctrl) {
626221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_NOT_IMPLEMENTED);
627221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
630221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	ret = ctx->cipher->ctrl(ctx, type, arg, ptr);
631221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if(ret == -1) {
632221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);
633221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
634221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
635221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return ret;
636221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom}
637221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_CIPHER_CTX_rand_key(EVP_CIPHER_CTX *ctx, unsigned char *key)
639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->cipher->flags & EVP_CIPH_RAND_KEY)
641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_RAND_KEY, 0, key);
642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (RAND_bytes(key, ctx->key_len) <= 0)
643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
645656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
646656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
647221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint EVP_CIPHER_CTX_copy(EVP_CIPHER_CTX *out, const EVP_CIPHER_CTX *in)
648e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
649221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if ((in == NULL) || (in->cipher == NULL))
650e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
651221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,EVP_R_INPUT_NOT_INITIALIZED);
652221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
653e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
654221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#ifndef OPENSSL_NO_ENGINE
655221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* Make sure it's safe to copy a cipher context using an ENGINE */
656221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (in->engine && !ENGINE_init(in->engine))
657221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
658221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,ERR_R_ENGINE_LIB);
659221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 0;
660221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
661221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom#endif
662221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
663221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	EVP_CIPHER_CTX_cleanup(out);
664221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	memcpy(out,in,sizeof *out);
665221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
666221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (in->cipher_data && in->cipher->ctx_size)
667e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
668221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		out->cipher_data=OPENSSL_malloc(in->cipher->ctx_size);
669221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (!out->cipher_data)
670e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
671221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			EVPerr(EVP_F_EVP_CIPHER_CTX_COPY,ERR_R_MALLOC_FAILURE);
672e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			return 0;
673e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
674221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		memcpy(out->cipher_data,in->cipher_data,in->cipher->ctx_size);
675e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
676e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
677221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (in->cipher->flags & EVP_CIPH_CUSTOM_COPY)
678221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return in->cipher->ctrl((EVP_CIPHER_CTX *)in, EVP_CTRL_COPY, 0, out);
679221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return 1;
680e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
681e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
682