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