1e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* crypto/evp/enc_min.c */
2e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * All rights reserved.
4e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *
5e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * This package is an SSL implementation written
6e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * by Eric Young (eay@cryptsoft.com).
7e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * The implementation was written so as to conform with Netscapes SSL.
8e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *
9e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * This library is free for commercial and non-commercial use as long as
10e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * the following conditions are aheared to.  The following conditions
11e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * apply to all code found in this distribution, be it the RC4, RSA,
12e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * included with this distribution is covered by the same copyright terms
14e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *
16e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * Copyright remains Eric Young's, and as such any Copyright notices in
17e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * the code are not to be removed.
18e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * If this package is used in a product, Eric Young should be given attribution
19e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * as the author of the parts of the library used.
20e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * This can be in the form of a textual message at program startup or
21e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * in documentation (online or textual) provided with the package.
22e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *
23e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * Redistribution and use in source and binary forms, with or without
24e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * modification, are permitted provided that the following conditions
25e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * are met:
26e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * 1. Redistributions of source code must retain the copyright
27e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *    notice, this list of conditions and the following disclaimer.
28e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * 2. Redistributions in binary form must reproduce the above copyright
29e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *    notice, this list of conditions and the following disclaimer in the
30e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *    documentation and/or other materials provided with the distribution.
31e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * 3. All advertising materials mentioning features or use of this software
32e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *    must display the following acknowledgement:
33e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *    "This product includes cryptographic software written by
34e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *     Eric Young (eay@cryptsoft.com)"
35e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *    The word 'cryptographic' can be left out if the rouines from the library
36e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *    being used are not cryptographic related :-).
37e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * 4. If you include any Windows specific code (or a derivative thereof) from
38e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *    the apps directory (application code) you must include an acknowledgement:
39e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *
41e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * SUCH DAMAGE.
52e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu *
53e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * The licence and distribution terms for any publically available version or
54e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * derivative of this code cannot be changed.  i.e. this code cannot simply be
55e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * copied and put under another distribution licence
56e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * [including the GNU Public Licence.]
57e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu */
58e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
59e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#include <stdio.h>
60e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#include "cryptlib.h"
61e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#include <openssl/evp.h>
62e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#include <openssl/err.h>
63e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#include <openssl/rand.h>
64e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
65e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#include <openssl/engine.h>
66e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
67e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#include "evp_locl.h"
68e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
69e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguvoid EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *ctx)
70e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
71e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifdef OPENSSL_FIPS
72e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	FIPS_selftest_check();
73e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
74e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	memset(ctx,0,sizeof(EVP_CIPHER_CTX));
75e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	/* ctx->cipher=NULL; */
76e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
77e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
78e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifdef OPENSSL_FIPS
79e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
80e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* The purpose of these is to trap programs that attempt to use non FIPS
81e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu * algorithms in FIPS mode and ignore the errors.
82e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu */
83e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
84e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic int bad_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
85e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		    const unsigned char *iv, int enc)
86e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{ FIPS_ERROR_IGNORED("Cipher init"); return 0;}
87e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
88e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic int bad_do_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
89e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			 const unsigned char *in, unsigned int inl)
90e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{ FIPS_ERROR_IGNORED("Cipher update"); return 0;}
91e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
92e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu/* NB: no cleanup because it is allowed after failed init */
93e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
94e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic int bad_set_asn1(EVP_CIPHER_CTX *ctx, ASN1_TYPE *typ)
95e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{ FIPS_ERROR_IGNORED("Cipher set_asn1"); return 0;}
96e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic int bad_get_asn1(EVP_CIPHER_CTX *ctx, ASN1_TYPE *typ)
97e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{ FIPS_ERROR_IGNORED("Cipher get_asn1"); return 0;}
98e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic int bad_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
99e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{ FIPS_ERROR_IGNORED("Cipher ctrl"); return 0;}
100e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
101e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic const EVP_CIPHER bad_cipher =
102e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
103e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	0,
104e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	0,
105e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	0,
106e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	0,
107e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	0,
108e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	bad_init,
109e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	bad_do_cipher,
110e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	NULL,
111e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	0,
112e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	bad_set_asn1,
113e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	bad_get_asn1,
114e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	bad_ctrl,
115e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	NULL
116e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	};
117e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
118e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
119e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
120e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
121e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
122e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifdef OPENSSL_FIPS
123e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
124e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic int do_engine_null(ENGINE *impl) { return 0;}
125e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic int do_evp_enc_engine_null(EVP_CIPHER_CTX *ctx,
126e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				const EVP_CIPHER **pciph, ENGINE *impl)
127e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{ return 1; }
128e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
129e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic int (*do_engine_finish)(ENGINE *impl)
130e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		= do_engine_null;
131e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
132e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic int (*do_evp_enc_engine)
133e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	(EVP_CIPHER_CTX *ctx, const EVP_CIPHER **pciph, ENGINE *impl)
134e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		= do_evp_enc_engine_null;
135e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
136e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguvoid int_EVP_CIPHER_set_engine_callbacks(
137e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	int (*eng_ciph_fin)(ENGINE *impl),
138e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	int (*eng_ciph_evp)
139e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		(EVP_CIPHER_CTX *ctx, const EVP_CIPHER **pciph, ENGINE *impl))
140e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
141e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	do_engine_finish = eng_ciph_fin;
142e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	do_evp_enc_engine = eng_ciph_evp;
143e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
144e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
145e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#else
146e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
147e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#define do_engine_finish ENGINE_finish
148e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
149e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugustatic int do_evp_enc_engine(EVP_CIPHER_CTX *ctx, const EVP_CIPHER **pcipher, ENGINE *impl)
150e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
151e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if(impl)
152e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
153e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (!ENGINE_init(impl))
154e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
155e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			EVPerr(EVP_F_DO_EVP_ENC_ENGINE, EVP_R_INITIALIZATION_ERROR);
156e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			return 0;
157e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
158e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
159e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	else
160e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* Ask if an ENGINE is reserved for this job */
161e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		impl = ENGINE_get_cipher_engine((*pcipher)->nid);
162e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if(impl)
163e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
164e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* There's an ENGINE for this job ... (apparently) */
165e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		const EVP_CIPHER *c = ENGINE_get_cipher(impl, (*pcipher)->nid);
166e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if(!c)
167e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
168e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			/* One positive side-effect of US's export
169e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			 * control history, is that we should at least
170e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			 * be able to avoid using US mispellings of
171e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			 * "initialisation"? */
172e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			EVPerr(EVP_F_DO_EVP_ENC_ENGINE, EVP_R_INITIALIZATION_ERROR);
173e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			return 0;
174e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
175e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* We'll use the ENGINE's private cipher definition */
176e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		*pcipher = c;
177e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* Store the ENGINE functional reference so we know
178e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		 * 'cipher' came from an ENGINE and we need to release
179e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		 * it when done. */
180e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ctx->engine = impl;
181e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
182e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	else
183e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ctx->engine = NULL;
184e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	return 1;
185e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
186e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
187e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
188e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
189e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
190e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
191e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguint EVP_CipherInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl,
192e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	     const unsigned char *key, const unsigned char *iv, int enc)
193e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
194e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (enc == -1)
195e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		enc = ctx->encrypt;
196e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	else
197e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
198e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (enc)
199e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			enc = 1;
200e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ctx->encrypt = enc;
201e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
202e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifdef OPENSSL_FIPS
203e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if(FIPS_selftest_failed())
204e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
205e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		FIPSerr(FIPS_F_EVP_CIPHERINIT_EX,FIPS_R_FIPS_SELFTEST_FAILED);
206e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ctx->cipher = &bad_cipher;
207e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		return 0;
208e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
209e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
210e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
211e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	/* Whether it's nice or not, "Inits" can be used on "Final"'d contexts
212e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	 * so this context may already have an ENGINE! Try to avoid releasing
213e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	 * the previous handle, re-querying for an ENGINE, and having a
214e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	 * reinitialisation, when it may all be unecessary. */
215e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (ctx->engine && ctx->cipher && (!cipher ||
216e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			(cipher && (cipher->nid == ctx->cipher->nid))))
217e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		goto skip_to_init;
218e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
219e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (cipher)
220e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
221e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* Ensure a context left lying around from last time is cleared
222e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		 * (the previous check attempted to avoid this if the same
223e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		 * ENGINE and EVP_CIPHER could be used). */
224e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		EVP_CIPHER_CTX_cleanup(ctx);
225e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
226e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* Restore encrypt field: it is zeroed by cleanup */
227e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ctx->encrypt = enc;
228e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
229e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (!do_evp_enc_engine(ctx, &cipher, impl))
230e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			return 0;
231e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
232e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
233e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ctx->cipher=cipher;
234e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (ctx->cipher->ctx_size)
235e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
236e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ctx->cipher_data=OPENSSL_malloc(ctx->cipher->ctx_size);
237e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			if (!ctx->cipher_data)
238e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				{
239e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				EVPerr(EVP_F_EVP_CIPHERINIT_EX, ERR_R_MALLOC_FAILURE);
240e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				return 0;
241e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				}
242e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
243e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		else
244e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
245e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ctx->cipher_data = NULL;
246e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
247e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ctx->key_len = cipher->key_len;
248e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		ctx->flags = 0;
249e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if(ctx->cipher->flags & EVP_CIPH_CTRL_INIT)
250e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
251e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			if(!EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_INIT, 0, NULL))
252e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				{
253e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_INITIALIZATION_ERROR);
254e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				return 0;
255e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu				}
256e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
257e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
258e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	else if(!ctx->cipher)
259e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
260e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_NO_CIPHER_SET);
261e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		return 0;
262e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
263e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
264e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguskip_to_init:
265e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
266e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	/* we assume block size is a power of 2 in *cryptUpdate */
267e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	OPENSSL_assert(ctx->cipher->block_size == 1
268e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	    || ctx->cipher->block_size == 8
269e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	    || ctx->cipher->block_size == 16);
270e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
271e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if(!(EVP_CIPHER_CTX_flags(ctx) & EVP_CIPH_CUSTOM_IV)) {
272e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		switch(EVP_CIPHER_CTX_mode(ctx)) {
273e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
274e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			case EVP_CIPH_STREAM_CIPHER:
275e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			case EVP_CIPH_ECB_MODE:
276e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			break;
277e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
278e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			case EVP_CIPH_CFB_MODE:
279e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			case EVP_CIPH_OFB_MODE:
280e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
281e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ctx->num = 0;
282e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
283e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			case EVP_CIPH_CBC_MODE:
284e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
285e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			OPENSSL_assert(EVP_CIPHER_CTX_iv_length(ctx) <=
286e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu					(int)sizeof(ctx->iv));
287e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			if(iv) memcpy(ctx->oiv, iv, EVP_CIPHER_CTX_iv_length(ctx));
288e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			memcpy(ctx->iv, ctx->oiv, EVP_CIPHER_CTX_iv_length(ctx));
289e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			break;
290e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
291e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			default:
292e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			return 0;
293e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			break;
294e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
295e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
296e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
297e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifdef OPENSSL_FIPS
298e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	/* After 'key' is set no further parameters changes are permissible.
299e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	 * So only check for non FIPS enabling at this point.
300e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	 */
301e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (key && FIPS_mode())
302e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
303e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (!(ctx->cipher->flags & EVP_CIPH_FLAG_FIPS)
304e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			& !(ctx->flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW))
305e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			{
306e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			EVPerr(EVP_F_EVP_CIPHERINIT_EX, EVP_R_DISABLED_FOR_FIPS);
307e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#if 0
308e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ERR_add_error_data(2, "cipher=",
309e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu						EVP_CIPHER_name(ctx->cipher));
310e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
311e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			ctx->cipher = &bad_cipher;
312e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			return 0;
313e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			}
314e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
315e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
316e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
317e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if(key || (ctx->cipher->flags & EVP_CIPH_ALWAYS_CALL_INIT)) {
318e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if(!ctx->cipher->init(ctx,key,iv,enc)) return 0;
319e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
320e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	ctx->buf_len=0;
321e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	ctx->final_used=0;
322e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	ctx->block_mask=ctx->cipher->block_size-1;
323e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	return 1;
324e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
325e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
326e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguint EVP_CIPHER_CTX_cleanup(EVP_CIPHER_CTX *c)
327e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
328e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (c->cipher != NULL)
329e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		{
330e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if(c->cipher->cleanup && !c->cipher->cleanup(c))
331e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			return 0;
332e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* Cleanse cipher context data */
333e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		if (c->cipher_data)
334e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu			OPENSSL_cleanse(c->cipher_data, c->cipher->ctx_size);
335e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		}
336e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (c->cipher_data)
337e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		OPENSSL_free(c->cipher_data);
338e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifndef OPENSSL_NO_ENGINE
339e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if (c->engine)
340e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		/* The EVP_CIPHER we used belongs to an ENGINE, release the
341e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		 * functional reference we held for this reason. */
342e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		do_engine_finish(c->engine);
343e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
344e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	memset(c,0,sizeof(EVP_CIPHER_CTX));
345e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	return 1;
346e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
347e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
348e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguint EVP_Cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl)
349e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
350e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#ifdef OPENSSL_FIPS
351e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	FIPS_selftest_check();
352e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu#endif
353e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	return ctx->cipher->do_cipher(ctx,out,in,inl);
354e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
355e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
356e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguint EVP_CIPHER_CTX_ctrl(EVP_CIPHER_CTX *ctx, int type, int arg, void *ptr)
357e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu{
358e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	int ret;
359e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if(!ctx->cipher) {
360e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_NO_CIPHER_SET);
361e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		return 0;
362e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
363e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
364e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if(!ctx->cipher->ctrl) {
365e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_NOT_IMPLEMENTED);
366e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		return 0;
367e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
368e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
369e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	ret = ctx->cipher->ctrl(ctx, type, arg, ptr);
370e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	if(ret == -1) {
371e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		EVPerr(EVP_F_EVP_CIPHER_CTX_CTRL, EVP_R_CTRL_OPERATION_NOT_IMPLEMENTED);
372e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu		return 0;
373e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
374e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	return ret;
375e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu}
376e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
377e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguunsigned long EVP_CIPHER_CTX_flags(const EVP_CIPHER_CTX *ctx)
378e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
379e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	return ctx->cipher->flags;
380e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
381e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
382e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguint EVP_CIPHER_CTX_iv_length(const EVP_CIPHER_CTX *ctx)
383e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
384e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	return ctx->cipher->iv_len;
385e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
386e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu
387e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modaduguint EVP_CIPHER_nid(const EVP_CIPHER *cipher)
388e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	{
389e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	return cipher->nid;
390e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu	}
391