1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/evp/digest.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 * Copyright (c) 1998-2001 The OpenSSL Project.  All rights reserved.
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met:
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the above copyright
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer.
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    notice, this list of conditions and the following disclaimer in
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    the documentation and/or other materials provided with the
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    distribution.
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    software must display the following acknowledgment:
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    endorse or promote products derived from this software without
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    prior written permission. For written permission, please contact
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    openssl-core@openssl.org.
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5. Products derived from this software may not be called "OpenSSL"
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    nor may "OpenSSL" appear in their names without prior written
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    permission of the OpenSSL Project.
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 6. Redistributions of any form whatsoever must retain the following
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    acknowledgment:
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    "This product includes software developed by the OpenSSL Project
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *    for use in the OpenSSL Toolkit (http://www.openssl.org/)"
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OF THE POSSIBILITY OF SUCH DAMAGE.
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ====================================================================
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This product includes cryptographic software written by Eric Young
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (eay@cryptsoft.com).  This product includes software written by Tim
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Hudson (tjh@cryptsoft.com).
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project *
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h>
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h>
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/evp.h>
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/engine.h>
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
120392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
121392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include <openssl/fips.h>
122392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
123392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EVP_MD_CTX_init(EVP_MD_CTX *ctx)
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(ctx,'\0',sizeof *ctx);
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectEVP_MD_CTX *EVP_MD_CTX_create(void)
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_MD_CTX *ctx=OPENSSL_malloc(sizeof *ctx);
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
13398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom	if (ctx)
13498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		EVP_MD_CTX_init(ctx);
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ctx;
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type)
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_MD_CTX_init(ctx);
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_DigestInit_ex(ctx, type, NULL);
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl)
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	EVP_MD_CTX_clear_flags(ctx,EVP_MD_CTX_FLAG_CLEANED);
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
149221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	/* Whether it's nice or not, "Inits" can be used on "Final"'d contexts
150221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 * so this context may already have an ENGINE! Try to avoid releasing
151221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 * the previous handle, re-querying for an ENGINE, and having a
152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	 * reinitialisation, when it may all be unecessary. */
153221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ctx->engine && ctx->digest && (!type ||
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			(type && (type->type == ctx->digest->type))))
155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		goto skip_to_init;
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (type)
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Ensure an ENGINE left lying around from last time is cleared
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * (the previous check attempted to avoid this if the same
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * ENGINE and EVP_MD could be used). */
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(ctx->engine)
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ENGINE_finish(ctx->engine);
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(impl)
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if (!ENGINE_init(impl))
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
167221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_INITIALIZATION_ERROR);
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* Ask if an ENGINE is reserved for this job */
173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			impl = ENGINE_get_digest_engine(type->type);
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if(impl)
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* There's an ENGINE for this job ... (apparently) */
177221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			const EVP_MD *d = ENGINE_get_digest(impl, type->type);
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			if(!d)
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				{
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				/* Same comment from evp_enc.c */
181221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_INITIALIZATION_ERROR);
182221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				ENGINE_finish(impl);
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				return 0;
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				}
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* We'll use the ENGINE's private digest definition */
186221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			type = d;
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			/* Store the ENGINE functional reference so we know
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * 'type' came from an ENGINE and we need to release
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 * it when done. */
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ctx->engine = impl;
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			}
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ctx->engine = NULL;
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(!ctx->digest)
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
198221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVPerr(EVP_F_EVP_DIGESTINIT_EX,EVP_R_NO_DIGEST_SET);
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->digest != type)
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (ctx->digest && ctx->digest->ctx_size)
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			OPENSSL_free(ctx->md_data);
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->digest=type;
207221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (!(ctx->flags & EVP_MD_CTX_FLAG_NO_INIT) && type->ctx_size)
20898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			{
209221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			ctx->update = type->update;
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			ctx->md_data=OPENSSL_malloc(type->ctx_size);
211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			if (ctx->md_data == NULL)
21298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom				{
213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				EVPerr(EVP_F_EVP_DIGESTINIT_EX,
214221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom							ERR_R_MALLOC_FAILURE);
21598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom				return 0;
21698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom				}
21798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			}
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
220221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromskip_to_init:
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ctx->pctx)
223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		int r;
225221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		r = EVP_PKEY_CTX_ctrl(ctx->pctx, -1, EVP_PKEY_OP_TYPE_SIG,
226221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom					EVP_PKEY_CTRL_DIGESTINIT, 0, ctx);
227221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (r <= 0 && (r != -2))
228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			return 0;
229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ctx->flags & EVP_MD_CTX_FLAG_NO_INIT)
231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		return 1;
232392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
233392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	if (FIPS_mode())
234392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		{
235392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		if (FIPS_digestinit(ctx, type))
236392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom			return 1;
237392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		OPENSSL_free(ctx->md_data);
238392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		ctx->md_data = NULL;
239392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		return 0;
240392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom		}
241392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ctx->digest->init(ctx);
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromint EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count)
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
247392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
248392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	return FIPS_digestupdate(ctx, data, count);
249392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else
250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	return ctx->update(ctx,data,count);
251392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The caller can assume that this removes any secret data from the context */
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DigestFinal(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret = EVP_DigestFinal_ex(ctx, md, size);
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_MD_CTX_cleanup(ctx);
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* The caller can assume that this removes any secret data from the context */
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *size)
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
266392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
267392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	return FIPS_digestfinal(ctx, md, size);
268392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#else
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_assert(ctx->digest->md_size <= EVP_MAX_MD_SIZE);
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=ctx->digest->final(ctx,md);
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (size != NULL)
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*size=ctx->digest->md_size;
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->digest->cleanup)
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->digest->cleanup(ctx);
277221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVP_MD_CTX_set_flags(ctx,EVP_MD_CTX_FLAG_CLEANED);
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(ctx->md_data,0,ctx->digest->ctx_size);
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
281392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_MD_CTX_copy(EVP_MD_CTX *out, const EVP_MD_CTX *in)
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_MD_CTX_init(out);
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return EVP_MD_CTX_copy_ex(out, in);
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_MD_CTX_copy_ex(EVP_MD_CTX *out, const EVP_MD_CTX *in)
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned char *tmp_buf;
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if ((in == NULL) || (in->digest == NULL))
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,EVP_R_INPUT_NOT_INITIALIZED);
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Make sure it's safe to copy a digest context using an ENGINE */
300221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (in->engine && !ENGINE_init(in->engine))
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,ERR_R_ENGINE_LIB);
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (out->digest == in->digest)
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		tmp_buf = out->md_data;
310221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	    	EVP_MD_CTX_set_flags(out,EVP_MD_CTX_FLAG_REUSE);
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else tmp_buf = NULL;
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_MD_CTX_cleanup(out);
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(out,in,sizeof *out);
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (in->md_data && out->digest->ctx_size)
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
31898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		if (tmp_buf)
31998d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			out->md_data = tmp_buf;
32098d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom		else
32198d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			{
32298d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			out->md_data=OPENSSL_malloc(out->digest->ctx_size);
32398d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			if (!out->md_data)
32498d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom				{
32598d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom				EVPerr(EVP_F_EVP_MD_CTX_COPY_EX,ERR_R_MALLOC_FAILURE);
32698d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom				return 0;
32798d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom				}
32898d58bb80c64b02a33662f0ea80351d4a1535267Brian Carlstrom			}
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		memcpy(out->md_data,in->md_data,out->digest->ctx_size);
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
332221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	out->update = in->update;
333221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
334221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (in->pctx)
335221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
336221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		out->pctx = EVP_PKEY_CTX_dup(in->pctx);
337221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		if (!out->pctx)
338221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			{
339221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			EVP_MD_CTX_cleanup(out);
340221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			return 0;
341221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			}
342221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
343221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (out->digest->copy)
345656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return out->digest->copy(out,in);
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
347656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_Digest(const void *data, size_t count,
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		unsigned char *md, unsigned int *size, const EVP_MD *type, ENGINE *impl)
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_MD_CTX ctx;
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int ret;
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_MD_CTX_init(&ctx);
357221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	EVP_MD_CTX_set_flags(&ctx,EVP_MD_CTX_FLAG_ONESHOT);
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	ret=EVP_DigestInit_ex(&ctx, type, impl)
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	  && EVP_DigestUpdate(&ctx, data, count)
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	  && EVP_DigestFinal_ex(&ctx, md, size);
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_MD_CTX_cleanup(&ctx);
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return ret;
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid EVP_MD_CTX_destroy(EVP_MD_CTX *ctx)
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	EVP_MD_CTX_cleanup(ctx);
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	OPENSSL_free(ctx);
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* This call frees resources associated with the context */
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint EVP_MD_CTX_cleanup(EVP_MD_CTX *ctx)
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
375392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifndef OPENSSL_FIPS
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* Don't assume ctx->md_data was cleaned in EVP_Digest_Final,
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * because sometimes only copies of the context are ever finalised.
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 */
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->digest && ctx->digest->cleanup
380221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	    && !EVP_MD_CTX_test_flags(ctx,EVP_MD_CTX_FLAG_CLEANED))
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		ctx->digest->cleanup(ctx);
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (ctx->digest && ctx->digest->ctx_size && ctx->md_data
383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	    && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE))
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_cleanse(ctx->md_data,ctx->digest->ctx_size);
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		OPENSSL_free(ctx->md_data);
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
388392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (ctx->pctx)
390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		EVP_PKEY_CTX_free(ctx->pctx);
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if(ctx->engine)
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* The EVP_MD we used belongs to an ENGINE, release the
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * functional reference we held for this reason. */
395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		ENGINE_finish(ctx->engine);
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
397392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
398392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	FIPS_md_ctx_cleanup(ctx);
399392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memset(ctx,'\0',sizeof *ctx);
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
404