xref: /openbsd-src/lib/libcrypto/evp/e_des3.c (revision 9bac3682a248384cde711fdda825c3b5960b1005)
1*9bac3682Sbeck /* $OpenBSD: e_des3.c,v 1.30 2024/04/09 13:52:41 beck Exp $ */
2c109e398Sbeck /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3c109e398Sbeck  * All rights reserved.
4c109e398Sbeck  *
5c109e398Sbeck  * This package is an SSL implementation written
6c109e398Sbeck  * by Eric Young (eay@cryptsoft.com).
7c109e398Sbeck  * The implementation was written so as to conform with Netscapes SSL.
8c109e398Sbeck  *
9c109e398Sbeck  * This library is free for commercial and non-commercial use as long as
10c109e398Sbeck  * the following conditions are aheared to.  The following conditions
11c109e398Sbeck  * apply to all code found in this distribution, be it the RC4, RSA,
12c109e398Sbeck  * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
13c109e398Sbeck  * included with this distribution is covered by the same copyright terms
14c109e398Sbeck  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15c109e398Sbeck  *
16c109e398Sbeck  * Copyright remains Eric Young's, and as such any Copyright notices in
17c109e398Sbeck  * the code are not to be removed.
18c109e398Sbeck  * If this package is used in a product, Eric Young should be given attribution
19c109e398Sbeck  * as the author of the parts of the library used.
20c109e398Sbeck  * This can be in the form of a textual message at program startup or
21c109e398Sbeck  * in documentation (online or textual) provided with the package.
22c109e398Sbeck  *
23c109e398Sbeck  * Redistribution and use in source and binary forms, with or without
24c109e398Sbeck  * modification, are permitted provided that the following conditions
25c109e398Sbeck  * are met:
26c109e398Sbeck  * 1. Redistributions of source code must retain the copyright
27c109e398Sbeck  *    notice, this list of conditions and the following disclaimer.
28c109e398Sbeck  * 2. Redistributions in binary form must reproduce the above copyright
29c109e398Sbeck  *    notice, this list of conditions and the following disclaimer in the
30c109e398Sbeck  *    documentation and/or other materials provided with the distribution.
31c109e398Sbeck  * 3. All advertising materials mentioning features or use of this software
32c109e398Sbeck  *    must display the following acknowledgement:
33c109e398Sbeck  *    "This product includes cryptographic software written by
34c109e398Sbeck  *     Eric Young (eay@cryptsoft.com)"
35c109e398Sbeck  *    The word 'cryptographic' can be left out if the rouines from the library
36c109e398Sbeck  *    being used are not cryptographic related :-).
37c109e398Sbeck  * 4. If you include any Windows specific code (or a derivative thereof) from
38c109e398Sbeck  *    the apps directory (application code) you must include an acknowledgement:
39c109e398Sbeck  *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40c109e398Sbeck  *
41c109e398Sbeck  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42c109e398Sbeck  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43c109e398Sbeck  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44c109e398Sbeck  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45c109e398Sbeck  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46c109e398Sbeck  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47c109e398Sbeck  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48c109e398Sbeck  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49c109e398Sbeck  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50c109e398Sbeck  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51c109e398Sbeck  * SUCH DAMAGE.
52c109e398Sbeck  *
53c109e398Sbeck  * The licence and distribution terms for any publically available version or
54c109e398Sbeck  * derivative of this code cannot be changed.  i.e. this code cannot simply be
55c109e398Sbeck  * copied and put under another distribution licence
56c109e398Sbeck  * [including the GNU Public Licence.]
57c109e398Sbeck  */
58c109e398Sbeck 
59b76ab7f9Sjsing #include <limits.h>
60c109e398Sbeck #include <stdio.h>
61a8913c44Sjsing #include <string.h>
62a8913c44Sjsing 
638cf4d6a6Sjsing #include <openssl/opensslconf.h>
648cf4d6a6Sjsing 
6540d8aef3Sdjm #ifndef OPENSSL_NO_DES
66b6ab114eSjsing 
67b6ab114eSjsing #include <openssl/des.h>
68c109e398Sbeck #include <openssl/evp.h>
69c109e398Sbeck #include <openssl/objects.h>
70c109e398Sbeck 
71c9675a23Stb #include "evp_local.h"
72b6ab114eSjsing 
73ba3920edSjsing typedef struct {
74da347917Sbeck     DES_key_schedule ks1;/* key schedule */
75da347917Sbeck     DES_key_schedule ks2;/* key schedule (for ede) */
76da347917Sbeck     DES_key_schedule ks3;/* key schedule (for ede3) */
77da347917Sbeck } DES_EDE_KEY;
78da347917Sbeck 
79da347917Sbeck #define data(ctx) ((DES_EDE_KEY *)(ctx)->cipher_data)
80da347917Sbeck 
81ba3920edSjsing static int
des_ede_init_key(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int enc)825b4a16c0Sjsing des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
835b4a16c0Sjsing     const unsigned char *iv, int enc)
845b4a16c0Sjsing {
855b4a16c0Sjsing 	DES_cblock *deskey = (DES_cblock *)key;
865b4a16c0Sjsing 
875b4a16c0Sjsing 	DES_set_key_unchecked(&deskey[0], &data(ctx)->ks1);
885b4a16c0Sjsing 	DES_set_key_unchecked(&deskey[1], &data(ctx)->ks2);
895b4a16c0Sjsing 	memcpy(&data(ctx)->ks3, &data(ctx)->ks1,
905b4a16c0Sjsing 	    sizeof(data(ctx)->ks1));
915b4a16c0Sjsing 	return 1;
925b4a16c0Sjsing }
935b4a16c0Sjsing 
945b4a16c0Sjsing static int
des_ede3_init_key(EVP_CIPHER_CTX * ctx,const unsigned char * key,const unsigned char * iv,int enc)955b4a16c0Sjsing des_ede3_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
965b4a16c0Sjsing     const unsigned char *iv, int enc)
975b4a16c0Sjsing {
985b4a16c0Sjsing 	DES_cblock *deskey = (DES_cblock *)key;
995b4a16c0Sjsing 
1005b4a16c0Sjsing 
1015b4a16c0Sjsing 	DES_set_key_unchecked(&deskey[0], &data(ctx)->ks1);
1025b4a16c0Sjsing 	DES_set_key_unchecked(&deskey[1], &data(ctx)->ks2);
1035b4a16c0Sjsing 	DES_set_key_unchecked(&deskey[2], &data(ctx)->ks3);
1045b4a16c0Sjsing 	return 1;
1055b4a16c0Sjsing }
1065b4a16c0Sjsing 
1075b4a16c0Sjsing static int
des3_ctrl(EVP_CIPHER_CTX * c,int type,int arg,void * ptr)1085b4a16c0Sjsing des3_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
1095b4a16c0Sjsing {
1105b4a16c0Sjsing 	DES_cblock *deskey = ptr;
1115b4a16c0Sjsing 
1125b4a16c0Sjsing 	switch (type) {
1135b4a16c0Sjsing 	case EVP_CTRL_RAND_KEY:
1145b4a16c0Sjsing 		if (DES_random_key(deskey) == 0)
1155b4a16c0Sjsing 			return 0;
1165b4a16c0Sjsing 		if (c->key_len >= 16 && DES_random_key(deskey + 1) == 0)
1175b4a16c0Sjsing 			return 0;
1185b4a16c0Sjsing 		if (c->key_len >= 24 && DES_random_key(deskey + 2) == 0)
1195b4a16c0Sjsing 			return 0;
1205b4a16c0Sjsing 		return 1;
1215b4a16c0Sjsing 
1225b4a16c0Sjsing 	default:
1235b4a16c0Sjsing 		return -1;
1245b4a16c0Sjsing 	}
1255b4a16c0Sjsing }
1265b4a16c0Sjsing 
1275b4a16c0Sjsing static int
des_ede_ecb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)128ba3920edSjsing des_ede_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1290a5d6edeSdjm     const unsigned char *in, size_t inl)
130c109e398Sbeck {
131e43deeb9Sjsing 	size_t i, bl;
132e43deeb9Sjsing 
133e43deeb9Sjsing 	bl = ctx->cipher->block_size;
134e43deeb9Sjsing 
135e43deeb9Sjsing 	if (inl < bl)
136e43deeb9Sjsing 		return 1;
137e43deeb9Sjsing 
138e43deeb9Sjsing 	inl -= bl;
139e43deeb9Sjsing 
140e43deeb9Sjsing 	for (i = 0; i <= inl; i += bl)
141ba3920edSjsing 		DES_ecb3_encrypt((const_DES_cblock *)(in + i), (DES_cblock *)(out + i),
142ba3920edSjsing 		    &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3, ctx->encrypt);
143fa590012Sjsing 
144c109e398Sbeck 	return 1;
145c109e398Sbeck }
146c109e398Sbeck 
147ba3920edSjsing static int
des_ede_ofb_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)148ba3920edSjsing des_ede_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1490a5d6edeSdjm     const unsigned char *in, size_t inl)
150c109e398Sbeck {
151fa590012Sjsing 	size_t chunk = LONG_MAX & ~0xff;
152b76ab7f9Sjsing 
153fa590012Sjsing 	while (inl >= chunk) {
154fa590012Sjsing 		DES_ede3_ofb64_encrypt(in, out, (long)chunk,
1550a5d6edeSdjm 		    &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
1560a5d6edeSdjm 		    (DES_cblock *)ctx->iv, &ctx->num);
157fa590012Sjsing 		inl -= chunk;
158fa590012Sjsing 		in += chunk;
159fa590012Sjsing 		out += chunk;
1600a5d6edeSdjm 	}
1610a5d6edeSdjm 	if (inl)
162da347917Sbeck 		DES_ede3_ofb64_encrypt(in, out, (long)inl,
163da347917Sbeck 		    &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
164da347917Sbeck 		    (DES_cblock *)ctx->iv, &ctx->num);
1650a5d6edeSdjm 
166c109e398Sbeck 	return 1;
167c109e398Sbeck }
168c109e398Sbeck 
169ba3920edSjsing static int
des_ede_cbc_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)170ba3920edSjsing des_ede_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1710a5d6edeSdjm     const unsigned char *in, size_t inl)
172c109e398Sbeck {
173fa590012Sjsing 	size_t chunk = LONG_MAX & ~0xff;
174b76ab7f9Sjsing 
175fa590012Sjsing 	while (inl >= chunk) {
176fa590012Sjsing 		DES_ede3_cbc_encrypt(in, out, (long)chunk,
1770a5d6edeSdjm 		    &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
1780a5d6edeSdjm 		    (DES_cblock *)ctx->iv, ctx->encrypt);
179fa590012Sjsing 		inl -= chunk;
180fa590012Sjsing 		in += chunk;
181fa590012Sjsing 		out += chunk;
1820a5d6edeSdjm 	}
1830a5d6edeSdjm 	if (inl)
184da347917Sbeck 		DES_ede3_cbc_encrypt(in, out, (long)inl,
185da347917Sbeck 		    &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
186da347917Sbeck 		    (DES_cblock *)ctx->iv, ctx->encrypt);
187c109e398Sbeck 	return 1;
188c109e398Sbeck }
189c109e398Sbeck 
190ba3920edSjsing static int
des_ede_cfb64_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)191ba3920edSjsing des_ede_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
1920a5d6edeSdjm     const unsigned char *in, size_t inl)
193c109e398Sbeck {
194fa590012Sjsing 	size_t chunk = LONG_MAX & ~0xff;
195b76ab7f9Sjsing 
196fa590012Sjsing 	while (inl >= chunk) {
197fa590012Sjsing 		DES_ede3_cfb64_encrypt(in, out, (long)chunk,
1980a5d6edeSdjm 		    &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
1990a5d6edeSdjm 		    (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt);
200fa590012Sjsing 		inl -= chunk;
201fa590012Sjsing 		in += chunk;
202fa590012Sjsing 		out += chunk;
2030a5d6edeSdjm 	}
2040a5d6edeSdjm 	if (inl)
205da347917Sbeck 		DES_ede3_cfb64_encrypt(in, out, (long)inl,
206da347917Sbeck 		    &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
207da347917Sbeck 		    (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt);
208c109e398Sbeck 	return 1;
209c109e398Sbeck }
210c109e398Sbeck 
21140d8aef3Sdjm /* Although we have a CFB-r implementation for 3-DES, it doesn't pack the right
21240d8aef3Sdjm    way, so wrap it here */
213ba3920edSjsing static int
des_ede3_cfb1_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)214ba3920edSjsing des_ede3_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2150a5d6edeSdjm     const unsigned char *in, size_t inl)
21640d8aef3Sdjm {
21740d8aef3Sdjm 	unsigned char c[1], d[1];
218fa590012Sjsing 	size_t n;
219b76ab7f9Sjsing 
220f4c4dcdcSbeck 	if (!(ctx->flags & EVP_CIPH_FLAG_LENGTH_BITS))
221f4c4dcdcSbeck 		inl *= 8;
22240d8aef3Sdjm 
223ba3920edSjsing 	for (n = 0; n < inl; ++n) {
22440d8aef3Sdjm 		c[0] = (in[n/8]&(1 << (7 - n % 8))) ? 0x80 : 0;
22540d8aef3Sdjm 		DES_ede3_cfb_encrypt(c, d, 1, 1,
22640d8aef3Sdjm 		    &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
22740d8aef3Sdjm 		    (DES_cblock *)ctx->iv, ctx->encrypt);
2280a5d6edeSdjm 		out[n / 8] = (out[n / 8] & ~(0x80 >> (unsigned int)(n % 8))) |
2290a5d6edeSdjm 		    ((d[0] & 0x80) >> (unsigned int)(n % 8));
23040d8aef3Sdjm 	}
23140d8aef3Sdjm 
23240d8aef3Sdjm 	return 1;
23340d8aef3Sdjm }
23440d8aef3Sdjm 
235ba3920edSjsing static int
des_ede3_cfb8_cipher(EVP_CIPHER_CTX * ctx,unsigned char * out,const unsigned char * in,size_t inl)236ba3920edSjsing des_ede3_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
2370a5d6edeSdjm     const unsigned char *in, size_t inl)
23840d8aef3Sdjm {
239fa590012Sjsing 	size_t chunk = LONG_MAX & ~0xff;
240b76ab7f9Sjsing 
241fa590012Sjsing 	while (inl >= chunk) {
242fa590012Sjsing 		DES_ede3_cfb_encrypt(in, out, 8, (long)chunk,
2430a5d6edeSdjm 		    &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
2440a5d6edeSdjm 		    (DES_cblock *)ctx->iv, ctx->encrypt);
245fa590012Sjsing 		inl -= chunk;
246fa590012Sjsing 		in += chunk;
247fa590012Sjsing 		out += chunk;
2480a5d6edeSdjm 	}
2490a5d6edeSdjm 	if (inl)
2500a5d6edeSdjm 		DES_ede3_cfb_encrypt(in, out, 8, (long)inl,
25140d8aef3Sdjm 		    &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
25240d8aef3Sdjm 		    (DES_cblock *)ctx->iv, ctx->encrypt);
25340d8aef3Sdjm 	return 1;
25440d8aef3Sdjm }
25540d8aef3Sdjm 
256e43deeb9Sjsing static const EVP_CIPHER des_ede_cbc = {
257e43deeb9Sjsing 	.nid = NID_des_ede_cbc,
258e43deeb9Sjsing 	.block_size = 8,
259e43deeb9Sjsing 	.key_len = 16,
260e43deeb9Sjsing 	.iv_len = 8,
261e43deeb9Sjsing 	.flags = EVP_CIPH_RAND_KEY | EVP_CIPH_CBC_MODE,
262e43deeb9Sjsing 	.init = des_ede_init_key,
263e43deeb9Sjsing 	.do_cipher = des_ede_cbc_cipher,
264e43deeb9Sjsing 	.cleanup = NULL,
265e43deeb9Sjsing 	.ctx_size = sizeof(DES_EDE_KEY),
266e43deeb9Sjsing 	.set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
267e43deeb9Sjsing 	.get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
268e43deeb9Sjsing 	.ctrl = des3_ctrl,
269e43deeb9Sjsing };
270e43deeb9Sjsing 
271e43deeb9Sjsing const EVP_CIPHER *
EVP_des_ede_cbc(void)272e43deeb9Sjsing EVP_des_ede_cbc(void)
273e43deeb9Sjsing {
274e43deeb9Sjsing 	return &des_ede_cbc;
275e43deeb9Sjsing }
276*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede_cbc);
277e43deeb9Sjsing 
278e43deeb9Sjsing static const EVP_CIPHER des_ede_cfb64 = {
279e43deeb9Sjsing 	.nid = NID_des_ede_cfb64,
280e43deeb9Sjsing 	.block_size = 1,
281e43deeb9Sjsing 	.key_len = 16,
282e43deeb9Sjsing 	.iv_len = 8,
283e43deeb9Sjsing 	.flags = EVP_CIPH_RAND_KEY | EVP_CIPH_CFB_MODE,
284e43deeb9Sjsing 	.init = des_ede_init_key,
285e43deeb9Sjsing 	.do_cipher = des_ede_cfb64_cipher,
286e43deeb9Sjsing 	.cleanup = NULL,
287e43deeb9Sjsing 	.ctx_size = sizeof(DES_EDE_KEY),
288e43deeb9Sjsing 	.set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
289e43deeb9Sjsing 	.get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
290e43deeb9Sjsing 	.ctrl = des3_ctrl,
291e43deeb9Sjsing };
292e43deeb9Sjsing 
293e43deeb9Sjsing const EVP_CIPHER *
EVP_des_ede_cfb64(void)294e43deeb9Sjsing EVP_des_ede_cfb64(void)
295e43deeb9Sjsing {
296e43deeb9Sjsing 	return &des_ede_cfb64;
297e43deeb9Sjsing }
298*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede_cfb64);
299e43deeb9Sjsing 
300e43deeb9Sjsing static const EVP_CIPHER des_ede_ofb = {
301e43deeb9Sjsing 	.nid = NID_des_ede_ofb64,
302e43deeb9Sjsing 	.block_size = 1,
303e43deeb9Sjsing 	.key_len = 16,
304e43deeb9Sjsing 	.iv_len = 8,
305e43deeb9Sjsing 	.flags = EVP_CIPH_RAND_KEY | EVP_CIPH_OFB_MODE,
306e43deeb9Sjsing 	.init = des_ede_init_key,
307e43deeb9Sjsing 	.do_cipher = des_ede_ofb_cipher,
308e43deeb9Sjsing 	.cleanup = NULL,
309e43deeb9Sjsing 	.ctx_size = sizeof(DES_EDE_KEY),
310e43deeb9Sjsing 	.set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
311e43deeb9Sjsing 	.get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
312e43deeb9Sjsing 	.ctrl = des3_ctrl,
313e43deeb9Sjsing };
314e43deeb9Sjsing 
315e43deeb9Sjsing const EVP_CIPHER *
EVP_des_ede_ofb(void)316e43deeb9Sjsing EVP_des_ede_ofb(void)
317e43deeb9Sjsing {
318e43deeb9Sjsing 	return &des_ede_ofb;
319e43deeb9Sjsing }
320*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede_ofb);
321e43deeb9Sjsing 
322e43deeb9Sjsing static const EVP_CIPHER des_ede_ecb = {
323e43deeb9Sjsing 	.nid = NID_des_ede_ecb,
324e43deeb9Sjsing 	.block_size = 8,
325e43deeb9Sjsing 	.key_len = 16,
326e43deeb9Sjsing 	.iv_len = 0,
327e43deeb9Sjsing 	.flags = EVP_CIPH_RAND_KEY | EVP_CIPH_ECB_MODE,
328e43deeb9Sjsing 	.init = des_ede_init_key,
329e43deeb9Sjsing 	.do_cipher = des_ede_ecb_cipher,
330e43deeb9Sjsing 	.cleanup = NULL,
331e43deeb9Sjsing 	.ctx_size = sizeof(DES_EDE_KEY),
332e43deeb9Sjsing 	.set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
333e43deeb9Sjsing 	.get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
334e43deeb9Sjsing 	.ctrl = des3_ctrl,
335e43deeb9Sjsing };
336e43deeb9Sjsing 
337e43deeb9Sjsing const EVP_CIPHER *
EVP_des_ede_ecb(void)338e43deeb9Sjsing EVP_des_ede_ecb(void)
339e43deeb9Sjsing {
340e43deeb9Sjsing 	return &des_ede_ecb;
341e43deeb9Sjsing }
342*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede_ecb);
343e43deeb9Sjsing 
344c109e398Sbeck 
34540d8aef3Sdjm #define des_ede3_cfb64_cipher des_ede_cfb64_cipher
346c109e398Sbeck #define des_ede3_ofb_cipher des_ede_ofb_cipher
347c109e398Sbeck #define des_ede3_cbc_cipher des_ede_cbc_cipher
348c109e398Sbeck #define des_ede3_ecb_cipher des_ede_ecb_cipher
349c109e398Sbeck 
350e43deeb9Sjsing static const EVP_CIPHER des_ede3_cbc = {
351e43deeb9Sjsing 	.nid = NID_des_ede3_cbc,
352e43deeb9Sjsing 	.block_size = 8,
353e43deeb9Sjsing 	.key_len = 24,
354e43deeb9Sjsing 	.iv_len = 8,
355e43deeb9Sjsing 	.flags = EVP_CIPH_RAND_KEY | EVP_CIPH_CBC_MODE,
356e43deeb9Sjsing 	.init = des_ede3_init_key,
357e43deeb9Sjsing 	.do_cipher = des_ede3_cbc_cipher,
358e43deeb9Sjsing 	.cleanup = NULL,
359e43deeb9Sjsing 	.ctx_size = sizeof(DES_EDE_KEY),
360e43deeb9Sjsing 	.set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
361e43deeb9Sjsing 	.get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
362e43deeb9Sjsing 	.ctrl = des3_ctrl,
363e43deeb9Sjsing };
364c109e398Sbeck 
365e43deeb9Sjsing const EVP_CIPHER *
EVP_des_ede3_cbc(void)366e43deeb9Sjsing EVP_des_ede3_cbc(void)
367e43deeb9Sjsing {
368e43deeb9Sjsing 	return &des_ede3_cbc;
369e43deeb9Sjsing }
370*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede3_cbc);
37140d8aef3Sdjm 
372e43deeb9Sjsing static const EVP_CIPHER des_ede3_cfb64 = {
373e43deeb9Sjsing 	.nid = NID_des_ede3_cfb64,
374e43deeb9Sjsing 	.block_size = 1,
375e43deeb9Sjsing 	.key_len = 24,
376e43deeb9Sjsing 	.iv_len = 8,
377e43deeb9Sjsing 	.flags = EVP_CIPH_RAND_KEY | EVP_CIPH_CFB_MODE,
378e43deeb9Sjsing 	.init = des_ede3_init_key,
379e43deeb9Sjsing 	.do_cipher = des_ede3_cfb64_cipher,
380e43deeb9Sjsing 	.cleanup = NULL,
381e43deeb9Sjsing 	.ctx_size = sizeof(DES_EDE_KEY),
382e43deeb9Sjsing 	.set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
383e43deeb9Sjsing 	.get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
384e43deeb9Sjsing 	.ctrl = des3_ctrl,
385e43deeb9Sjsing };
386e43deeb9Sjsing 
387e43deeb9Sjsing const EVP_CIPHER *
EVP_des_ede3_cfb64(void)388e43deeb9Sjsing EVP_des_ede3_cfb64(void)
389e43deeb9Sjsing {
390e43deeb9Sjsing 	return &des_ede3_cfb64;
391e43deeb9Sjsing }
392*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede3_cfb64);
393e43deeb9Sjsing 
394e43deeb9Sjsing static const EVP_CIPHER des_ede3_ofb = {
395e43deeb9Sjsing 	.nid = NID_des_ede3_ofb64,
396e43deeb9Sjsing 	.block_size = 1,
397e43deeb9Sjsing 	.key_len = 24,
398e43deeb9Sjsing 	.iv_len = 8,
399e43deeb9Sjsing 	.flags = EVP_CIPH_RAND_KEY | EVP_CIPH_OFB_MODE,
400e43deeb9Sjsing 	.init = des_ede3_init_key,
401e43deeb9Sjsing 	.do_cipher = des_ede3_ofb_cipher,
402e43deeb9Sjsing 	.cleanup = NULL,
403e43deeb9Sjsing 	.ctx_size = sizeof(DES_EDE_KEY),
404e43deeb9Sjsing 	.set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
405e43deeb9Sjsing 	.get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
406e43deeb9Sjsing 	.ctrl = des3_ctrl,
407e43deeb9Sjsing };
408e43deeb9Sjsing 
409e43deeb9Sjsing const EVP_CIPHER *
EVP_des_ede3_ofb(void)410e43deeb9Sjsing EVP_des_ede3_ofb(void)
411e43deeb9Sjsing {
412e43deeb9Sjsing 	return &des_ede3_ofb;
413e43deeb9Sjsing }
414*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede3_ofb);
415e43deeb9Sjsing 
416e43deeb9Sjsing static const EVP_CIPHER des_ede3_ecb = {
417e43deeb9Sjsing 	.nid = NID_des_ede3_ecb,
418e43deeb9Sjsing 	.block_size = 8,
419e43deeb9Sjsing 	.key_len = 24,
420e43deeb9Sjsing 	.iv_len = 0,
421e43deeb9Sjsing 	.flags = EVP_CIPH_RAND_KEY | EVP_CIPH_ECB_MODE,
422e43deeb9Sjsing 	.init = des_ede3_init_key,
423e43deeb9Sjsing 	.do_cipher = des_ede3_ecb_cipher,
424e43deeb9Sjsing 	.cleanup = NULL,
425e43deeb9Sjsing 	.ctx_size = sizeof(DES_EDE_KEY),
426e43deeb9Sjsing 	.set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
427e43deeb9Sjsing 	.get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
428e43deeb9Sjsing 	.ctrl = des3_ctrl,
429e43deeb9Sjsing };
430e43deeb9Sjsing 
431e43deeb9Sjsing const EVP_CIPHER *
EVP_des_ede3_ecb(void)432e43deeb9Sjsing EVP_des_ede3_ecb(void)
433e43deeb9Sjsing {
434e43deeb9Sjsing 	return &des_ede3_ecb;
435e43deeb9Sjsing }
436*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede3_ecb);
437e43deeb9Sjsing 
438e43deeb9Sjsing 
439e43deeb9Sjsing static const EVP_CIPHER des_ede3_cfb1 = {
440e43deeb9Sjsing 	.nid = NID_des_ede3_cfb1,
441e43deeb9Sjsing 	.block_size = 1,
442e43deeb9Sjsing 	.key_len = 24,
443e43deeb9Sjsing 	.iv_len = 8,
444e43deeb9Sjsing 	.flags = EVP_CIPH_RAND_KEY | EVP_CIPH_CFB_MODE,
445e43deeb9Sjsing 	.init = des_ede3_init_key,
446e43deeb9Sjsing 	.do_cipher = des_ede3_cfb1_cipher,
447e43deeb9Sjsing 	.cleanup = NULL,
448e43deeb9Sjsing 	.ctx_size = sizeof(DES_EDE_KEY),
449e43deeb9Sjsing 	.set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
450e43deeb9Sjsing 	.get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
451e43deeb9Sjsing 	.ctrl = des3_ctrl,
452e43deeb9Sjsing };
453e43deeb9Sjsing 
454e43deeb9Sjsing const EVP_CIPHER *
EVP_des_ede3_cfb1(void)455e43deeb9Sjsing EVP_des_ede3_cfb1(void)
456e43deeb9Sjsing {
457e43deeb9Sjsing 	return &des_ede3_cfb1;
458e43deeb9Sjsing }
459*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede3_cfb1);
460e43deeb9Sjsing 
461e43deeb9Sjsing 
462e43deeb9Sjsing static const EVP_CIPHER des_ede3_cfb8 = {
463e43deeb9Sjsing 	.nid = NID_des_ede3_cfb8,
464e43deeb9Sjsing 	.block_size = 1,
465e43deeb9Sjsing 	.key_len = 24,
466e43deeb9Sjsing 	.iv_len = 8,
467e43deeb9Sjsing 	.flags = EVP_CIPH_RAND_KEY | EVP_CIPH_CFB_MODE,
468e43deeb9Sjsing 	.init = des_ede3_init_key,
469e43deeb9Sjsing 	.do_cipher = des_ede3_cfb8_cipher,
470e43deeb9Sjsing 	.cleanup = NULL,
471e43deeb9Sjsing 	.ctx_size = sizeof(DES_EDE_KEY),
472e43deeb9Sjsing 	.set_asn1_parameters = EVP_CIPHER_set_asn1_iv,
473e43deeb9Sjsing 	.get_asn1_parameters = EVP_CIPHER_get_asn1_iv,
474e43deeb9Sjsing 	.ctrl = des3_ctrl,
475e43deeb9Sjsing };
476e43deeb9Sjsing 
477e43deeb9Sjsing const EVP_CIPHER *
EVP_des_ede3_cfb8(void)478e43deeb9Sjsing EVP_des_ede3_cfb8(void)
479e43deeb9Sjsing {
480e43deeb9Sjsing 	return &des_ede3_cfb8;
481e43deeb9Sjsing }
482*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede3_cfb8);
483e43deeb9Sjsing 
484ba3920edSjsing const EVP_CIPHER *
EVP_des_ede(void)485ba3920edSjsing EVP_des_ede(void)
486c109e398Sbeck {
487c109e398Sbeck 	return &des_ede_ecb;
488c109e398Sbeck }
489*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede);
490c109e398Sbeck 
491ba3920edSjsing const EVP_CIPHER *
EVP_des_ede3(void)492ba3920edSjsing EVP_des_ede3(void)
493c109e398Sbeck {
494c109e398Sbeck 	return &des_ede3_ecb;
495c109e398Sbeck }
496*9bac3682Sbeck LCRYPTO_ALIAS(EVP_des_ede3);
497c109e398Sbeck #endif
498