1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/evp/e_des3.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#include <stdio.h>
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "cryptlib.h"
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_DES
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/evp.h>
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h>
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "evp_locl.h"
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/des.h>
66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/rand.h>
67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
68392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifndef OPENSSL_FIPS
69392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			    const unsigned char *iv,int enc);
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede3_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			     const unsigned char *iv,int enc);
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des3_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr);
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projecttypedef struct
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    DES_key_schedule ks1;/* key schedule */
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    DES_key_schedule ks2;/* key schedule (for ede) */
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    DES_key_schedule ks3;/* key schedule (for ede3) */
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    } DES_EDE_KEY;
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define data(ctx) ((DES_EDE_KEY *)(ctx)->cipher_data)
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Because of various casts and different args can't use IMPLEMENT_BLOCK_CIPHER */
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_ecb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			      const unsigned char *in, size_t inl)
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	BLOCK_CIPHER_ecb_loop()
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		DES_ecb3_encrypt((const_DES_cblock *)(in + i),
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 (DES_cblock *)(out + i),
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 &data(ctx)->ks1, &data(ctx)->ks2,
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 &data(ctx)->ks3,
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project				 ctx->encrypt);
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_ofb_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
102221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			      const unsigned char *in, size_t inl)
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
104221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (inl>=EVP_MAXCHUNK)
105221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
106221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		DES_ede3_ofb64_encrypt(in, out, (long)EVP_MAXCHUNK,
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			       &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			       (DES_cblock *)ctx->iv, &ctx->num);
109221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		inl-=EVP_MAXCHUNK;
110221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		in +=EVP_MAXCHUNK;
111221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		out+=EVP_MAXCHUNK;
112221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
113221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (inl)
114221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		DES_ede3_ofb64_encrypt(in, out, (long)inl,
115221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				&data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
116221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                               (DES_cblock *)ctx->iv, &ctx->num);
117221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_cbc_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
122221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			      const unsigned char *in, size_t inl)
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef KSSL_DEBUG
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        int i;
127221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        char *cp;
128221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	printf("des_ede_cbc_cipher(ctx=%lx, buflen=%d)\n", ctx, ctx->buf_len);
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	printf("\t iv= ");
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        for(i=0;i<8;i++)
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project                printf("%02X",ctx->iv[i]);
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	printf("\n");
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif    /* KSSL_DEBUG */
135221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (inl>=EVP_MAXCHUNK)
136221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
137221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		DES_ede3_cbc_encrypt(in, out, (long)EVP_MAXCHUNK,
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			     &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			     (DES_cblock *)ctx->iv, ctx->encrypt);
140221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		inl-=EVP_MAXCHUNK;
141221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		in +=EVP_MAXCHUNK;
142221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		out+=EVP_MAXCHUNK;
143221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
144221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (inl)
145221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		DES_ede3_cbc_encrypt(in, out, (long)inl,
146221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			     &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
147221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                             (DES_cblock *)ctx->iv, ctx->encrypt);
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_cfb64_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
152221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			      const unsigned char *in, size_t inl)
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
154221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (inl>=EVP_MAXCHUNK)
155221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		{
156221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		DES_ede3_cfb64_encrypt(in, out, (long)EVP_MAXCHUNK,
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			       &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			       (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt);
159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		inl-=EVP_MAXCHUNK;
160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		in +=EVP_MAXCHUNK;
161221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		out+=EVP_MAXCHUNK;
162221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		}
163221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	if (inl)
164221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		DES_ede3_cfb64_encrypt(in, out, (long)inl,
165221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			       &data(ctx)->ks1, &data(ctx)->ks2, &data(ctx)->ks3,
166221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom                               (DES_cblock *)ctx->iv, &ctx->num, ctx->encrypt);
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Although we have a CFB-r implementation for 3-DES, it doesn't pack the right
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project   way, so wrap it here */
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede3_cfb1_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
173221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				const unsigned char *in, size_t inl)
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
175221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    size_t n;
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    unsigned char c[1],d[1];
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    for(n=0 ; n < inl ; ++n)
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c[0]=(in[n/8]&(1 << (7-n%8))) ? 0x80 : 0;
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_ede3_cfb_encrypt(c,d,1,1,
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			     &data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3,
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			     (DES_cblock *)ctx->iv,ctx->encrypt);
184221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	out[n/8]=(out[n/8]&~(0x80 >> (unsigned int)(n%8))) |
185221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		 ((d[0]&0x80) >> (unsigned int)(n%8));
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede3_cfb8_cipher(EVP_CIPHER_CTX *ctx, unsigned char *out,
192221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom				const unsigned char *in, size_t inl)
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    {
194221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    while (inl>=EVP_MAXCHUNK)
195221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	{
196221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	DES_ede3_cfb_encrypt(in,out,8,(long)EVP_MAXCHUNK,
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 &data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3,
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			 (DES_cblock *)ctx->iv,ctx->encrypt);
199221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	inl-=EVP_MAXCHUNK;
200221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	in +=EVP_MAXCHUNK;
201221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	out+=EVP_MAXCHUNK;
202221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	}
203221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom    if (inl)
204221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	DES_ede3_cfb_encrypt(in,out,8,(long)inl,
205221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			&data(ctx)->ks1,&data(ctx)->ks2,&data(ctx)->ks3,
206221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			(DES_cblock *)ctx->iv,ctx->encrypt);
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    return 1;
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project    }
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBLOCK_CIPHER_defs(des_ede, DES_EDE_KEY, NID_des_ede, 8, 16, 8, 64,
211221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			EVP_CIPH_RAND_KEY, des_ede_init_key, NULL,
212221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			EVP_CIPHER_set_asn1_iv,
213221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			EVP_CIPHER_get_asn1_iv,
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			des3_ctrl)
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define des_ede3_cfb64_cipher des_ede_cfb64_cipher
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define des_ede3_ofb_cipher des_ede_ofb_cipher
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define des_ede3_cbc_cipher des_ede_cbc_cipher
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define des_ede3_ecb_cipher des_ede_ecb_cipher
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBLOCK_CIPHER_defs(des_ede3, DES_EDE_KEY, NID_des_ede3, 8, 24, 8, 64,
222221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			EVP_CIPH_RAND_KEY, des_ede3_init_key, NULL,
223221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			EVP_CIPHER_set_asn1_iv,
224221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom			EVP_CIPHER_get_asn1_iv,
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			des3_ctrl)
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,1,
228221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		     EVP_CIPH_RAND_KEY, des_ede3_init_key,NULL,
229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		     EVP_CIPHER_set_asn1_iv,
230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		     EVP_CIPHER_get_asn1_iv,
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		     des3_ctrl)
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source ProjectBLOCK_CIPHER_def_cfb(des_ede3,DES_EDE_KEY,NID_des_ede3,24,8,8,
234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		     EVP_CIPH_RAND_KEY, des_ede3_init_key,NULL,
235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		     EVP_CIPHER_set_asn1_iv,
236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom		     EVP_CIPHER_get_asn1_iv,
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		     des3_ctrl)
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			    const unsigned char *iv, int enc)
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_cblock *deskey = (DES_cblock *)key;
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EVP_CHECK_DES_KEY
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (DES_set_key_checked(&deskey[0],&data(ctx)->ks1)
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		!! DES_set_key_checked(&deskey[1],&data(ctx)->ks2))
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_set_key_unchecked(&deskey[0],&data(ctx)->ks1);
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_set_key_unchecked(&deskey[1],&data(ctx)->ks2);
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(&data(ctx)->ks3,&data(ctx)->ks1,
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	       sizeof(data(ctx)->ks1));
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des_ede3_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key,
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			     const unsigned char *iv, int enc)
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_cblock *deskey = (DES_cblock *)key;
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef KSSL_DEBUG
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        int i;
263221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom        printf("des_ede3_init_key(ctx=%lx)\n", ctx);
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	printf("\tKEY= ");
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        for(i=0;i<24;i++) printf("%02X",key[i]); printf("\n");
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	printf("\t IV= ");
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project        for(i=0;i<8;i++) printf("%02X",iv[i]); printf("\n");
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif	/* KSSL_DEBUG */
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef EVP_CHECK_DES_KEY
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (DES_set_key_checked(&deskey[0],&data(ctx)->ks1)
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		|| DES_set_key_checked(&deskey[1],&data(ctx)->ks2)
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		|| DES_set_key_checked(&deskey[2],&data(ctx)->ks3))
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#else
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_set_key_unchecked(&deskey[0],&data(ctx)->ks1);
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_set_key_unchecked(&deskey[1],&data(ctx)->ks2);
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_set_key_unchecked(&deskey[2],&data(ctx)->ks3);
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 1;
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic int des3_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr)
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_cblock *deskey = ptr;
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	switch(type)
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	case EVP_CTRL_RAND_KEY:
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (RAND_bytes(ptr, c->key_len) <= 0)
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return 0;
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		DES_set_odd_parity(deskey);
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (c->key_len >= 16)
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			DES_set_odd_parity(deskey + 1);
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (c->key_len >= 24)
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			DES_set_odd_parity(deskey + 2);
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 1;
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	default:
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return -1;
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst EVP_CIPHER *EVP_des_ede(void)
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return &des_ede_ecb;
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectconst EVP_CIPHER *EVP_des_ede3(void)
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project{
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return &des_ede3_ecb;
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project}
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
316392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
317