1/* evp_locl.h */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project 2000.
4 */
5/* ====================================================================
6 * Copyright (c) 1999 The OpenSSL Project.  All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 *    notice, this list of conditions and the following disclaimer in
17 *    the documentation and/or other materials provided with the
18 *    distribution.
19 *
20 * 3. All advertising materials mentioning features or use of this
21 *    software must display the following acknowledgment:
22 *    "This product includes software developed by the OpenSSL Project
23 *    for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 *
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 *    endorse or promote products derived from this software without
27 *    prior written permission. For written permission, please contact
28 *    licensing@OpenSSL.org.
29 *
30 * 5. Products derived from this software may not be called "OpenSSL"
31 *    nor may "OpenSSL" appear in their names without prior written
32 *    permission of the OpenSSL Project.
33 *
34 * 6. Redistributions of any form whatsoever must retain the following
35 *    acknowledgment:
36 *    "This product includes software developed by the OpenSSL Project
37 *    for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
52 *
53 * This product includes cryptographic software written by Eric Young
54 * (eay@cryptsoft.com).  This product includes software written by Tim
55 * Hudson (tjh@cryptsoft.com).
56 *
57 */
58
59/* Macros to code block cipher wrappers */
60
61/* Wrapper functions for each cipher mode */
62
63#define BLOCK_CIPHER_ecb_loop() \
64	unsigned int i, bl; \
65	bl = ctx->cipher->block_size;\
66	if(inl < bl) return 1;\
67	inl -= bl; \
68	for(i=0; i <= inl; i+=bl)
69
70#define BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \
71static int cname##_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
72{\
73	BLOCK_CIPHER_ecb_loop() \
74		cprefix##_ecb_encrypt(in + i, out + i, &((kstruct *)ctx->cipher_data)->ksched, ctx->encrypt);\
75	return 1;\
76}
77
78#define BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched) \
79static int cname##_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
80{\
81	cprefix##_ofb##cbits##_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num);\
82	return 1;\
83}
84
85#define BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \
86static int cname##_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
87{\
88	cprefix##_cbc_encrypt(in, out, (long)inl, &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, ctx->encrypt);\
89	return 1;\
90}
91
92#define BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \
93static int cname##_cfb##cbits##_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out, const unsigned char *in, unsigned int inl) \
94{\
95	cprefix##_cfb##cbits##_encrypt(in, out, (long)((cbits==1) && !(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS) ?inl*8:inl), &((kstruct *)ctx->cipher_data)->ksched, ctx->iv, &ctx->num, ctx->encrypt);\
96	return 1;\
97}
98
99#define BLOCK_CIPHER_all_funcs(cname, cprefix, cbits, kstruct, ksched) \
100	BLOCK_CIPHER_func_cbc(cname, cprefix, kstruct, ksched) \
101	BLOCK_CIPHER_func_cfb(cname, cprefix, cbits, kstruct, ksched) \
102	BLOCK_CIPHER_func_ecb(cname, cprefix, kstruct, ksched) \
103	BLOCK_CIPHER_func_ofb(cname, cprefix, cbits, kstruct, ksched)
104
105#define BLOCK_CIPHER_def1(cname, nmode, mode, MODE, kstruct, nid, block_size, \
106			  key_len, iv_len, flags, init_key, cleanup, \
107			  set_asn1, get_asn1, ctrl) \
108static const EVP_CIPHER cname##_##mode = { \
109	nid##_##nmode, block_size, key_len, iv_len, \
110	flags | EVP_CIPH_##MODE##_MODE, \
111	init_key, \
112	cname##_##mode##_cipher, \
113	cleanup, \
114	sizeof(kstruct), \
115	set_asn1, get_asn1,\
116	ctrl, \
117	NULL \
118}; \
119const EVP_CIPHER *EVP_##cname##_##mode(void) { return &cname##_##mode; }
120
121#define BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, \
122			     iv_len, flags, init_key, cleanup, set_asn1, \
123			     get_asn1, ctrl) \
124BLOCK_CIPHER_def1(cname, cbc, cbc, CBC, kstruct, nid, block_size, key_len, \
125		  iv_len, flags, init_key, cleanup, set_asn1, get_asn1, ctrl)
126
127#define BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, \
128			     iv_len, cbits, flags, init_key, cleanup, \
129			     set_asn1, get_asn1, ctrl) \
130BLOCK_CIPHER_def1(cname, cfb##cbits, cfb##cbits, CFB, kstruct, nid, 1, \
131		  key_len, iv_len, flags, init_key, cleanup, set_asn1, \
132		  get_asn1, ctrl)
133
134#define BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, \
135			     iv_len, cbits, flags, init_key, cleanup, \
136			     set_asn1, get_asn1, ctrl) \
137BLOCK_CIPHER_def1(cname, ofb##cbits, ofb, OFB, kstruct, nid, 1, \
138		  key_len, iv_len, flags, init_key, cleanup, set_asn1, \
139		  get_asn1, ctrl)
140
141#define BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, \
142			     flags, init_key, cleanup, set_asn1, \
143			     get_asn1, ctrl) \
144BLOCK_CIPHER_def1(cname, ecb, ecb, ECB, kstruct, nid, block_size, key_len, \
145		  0, flags, init_key, cleanup, set_asn1, get_asn1, ctrl)
146
147#define BLOCK_CIPHER_defs(cname, kstruct, \
148			  nid, block_size, key_len, iv_len, cbits, flags, \
149			  init_key, cleanup, set_asn1, get_asn1, ctrl) \
150BLOCK_CIPHER_def_cbc(cname, kstruct, nid, block_size, key_len, iv_len, flags, \
151		     init_key, cleanup, set_asn1, get_asn1, ctrl) \
152BLOCK_CIPHER_def_cfb(cname, kstruct, nid, key_len, iv_len, cbits, \
153		     flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \
154BLOCK_CIPHER_def_ofb(cname, kstruct, nid, key_len, iv_len, cbits, \
155		     flags, init_key, cleanup, set_asn1, get_asn1, ctrl) \
156BLOCK_CIPHER_def_ecb(cname, kstruct, nid, block_size, key_len, flags, \
157		     init_key, cleanup, set_asn1, get_asn1, ctrl)
158
159
160/*
161#define BLOCK_CIPHER_defs(cname, kstruct, \
162				nid, block_size, key_len, iv_len, flags,\
163				 init_key, cleanup, set_asn1, get_asn1, ctrl)\
164static const EVP_CIPHER cname##_cbc = {\
165	nid##_cbc, block_size, key_len, iv_len, \
166	flags | EVP_CIPH_CBC_MODE,\
167	init_key,\
168	cname##_cbc_cipher,\
169	cleanup,\
170	sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
171		sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
172	set_asn1, get_asn1,\
173	ctrl, \
174	NULL \
175};\
176const EVP_CIPHER *EVP_##cname##_cbc(void) { return &cname##_cbc; }\
177static const EVP_CIPHER cname##_cfb = {\
178	nid##_cfb64, 1, key_len, iv_len, \
179	flags | EVP_CIPH_CFB_MODE,\
180	init_key,\
181	cname##_cfb_cipher,\
182	cleanup,\
183	sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
184		sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
185	set_asn1, get_asn1,\
186	ctrl,\
187	NULL \
188};\
189const EVP_CIPHER *EVP_##cname##_cfb(void) { return &cname##_cfb; }\
190static const EVP_CIPHER cname##_ofb = {\
191	nid##_ofb64, 1, key_len, iv_len, \
192	flags | EVP_CIPH_OFB_MODE,\
193	init_key,\
194	cname##_ofb_cipher,\
195	cleanup,\
196	sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
197		sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
198	set_asn1, get_asn1,\
199	ctrl,\
200	NULL \
201};\
202const EVP_CIPHER *EVP_##cname##_ofb(void) { return &cname##_ofb; }\
203static const EVP_CIPHER cname##_ecb = {\
204	nid##_ecb, block_size, key_len, iv_len, \
205	flags | EVP_CIPH_ECB_MODE,\
206	init_key,\
207	cname##_ecb_cipher,\
208	cleanup,\
209	sizeof(EVP_CIPHER_CTX)-sizeof((((EVP_CIPHER_CTX *)NULL)->c))+\
210		sizeof((((EVP_CIPHER_CTX *)NULL)->c.kstruct)),\
211	set_asn1, get_asn1,\
212	ctrl,\
213	NULL \
214};\
215const EVP_CIPHER *EVP_##cname##_ecb(void) { return &cname##_ecb; }
216*/
217
218#define IMPLEMENT_BLOCK_CIPHER(cname, ksched, cprefix, kstruct, nid, \
219			       block_size, key_len, iv_len, cbits, \
220			       flags, init_key, \
221			       cleanup, set_asn1, get_asn1, ctrl) \
222	BLOCK_CIPHER_all_funcs(cname, cprefix, cbits, kstruct, ksched) \
223	BLOCK_CIPHER_defs(cname, kstruct, nid, block_size, key_len, iv_len, \
224			  cbits, flags, init_key, cleanup, set_asn1, \
225			  get_asn1, ctrl)
226
227#define EVP_C_DATA(kstruct, ctx)	((kstruct *)(ctx)->cipher_data)
228
229#define IMPLEMENT_CFBR(cipher,cprefix,kstruct,ksched,keysize,cbits,iv_len,fl) \
230	BLOCK_CIPHER_func_cfb(cipher##_##keysize,cprefix,cbits,kstruct,ksched) \
231	BLOCK_CIPHER_def_cfb(cipher##_##keysize,kstruct, \
232			     NID_##cipher##_##keysize, keysize/8, iv_len, cbits, \
233			     (fl)|EVP_CIPH_FLAG_DEFAULT_ASN1, \
234			     cipher##_init_key, NULL, NULL, NULL, NULL)
235
236#ifdef OPENSSL_FIPS
237#define RC2_set_key	private_RC2_set_key
238#define RC4_set_key	private_RC4_set_key
239#define CAST_set_key	private_CAST_set_key
240#define RC5_32_set_key	private_RC5_32_set_key
241#define BF_set_key	private_BF_set_key
242#define Camellia_set_key private_Camellia_set_key
243#define idea_set_encrypt_key private_idea_set_encrypt_key
244
245#define MD5_Init	private_MD5_Init
246#define MD4_Init	private_MD4_Init
247#define MD2_Init	private_MD2_Init
248#define MDC2_Init	private_MDC2_Init
249#define SHA_Init	private_SHA_Init
250
251#endif
252
253