1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* crypto/des/set_key.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/* set_key.c v 1.4 eay 24/9/91
60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1.4 Speed up by 400% :-)
61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1.3 added register declarations.
62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1.2 unrolled make_key_sched a bit more
63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1.1 added norm_expand_bits
64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1.0 First working version
65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
66392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#include <openssl/crypto.h>
6704ef91b390dfcc6125913e2f2af502d23d7a5112Brian Carlstrom#include "des_locl.h"
68392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom
69221304ee937bc0910948a8be1320cb8cc4eb6d36Brian CarlstromOPENSSL_IMPLEMENT_GLOBAL(int,DES_check_key,0)	/* defaults to false */
70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const unsigned char odd_parity[256]={
72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project  1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
78656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
79656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
80656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
81656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
82656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
83656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
84656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
85656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
86656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
87656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
88656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
89656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid DES_set_odd_parity(DES_cblock *key)
90656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
91656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int i;
92656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
93656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<DES_KEY_SZ; i++)
94656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		(*key)[i]=odd_parity[(*key)[i]];
95656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
96656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
97656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint DES_check_key_parity(const_DES_cblock *key)
98656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
99656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	unsigned int i;
100656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<DES_KEY_SZ; i++)
102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if ((*key)[i] != odd_parity[(*key)[i]])
104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			return(0);
105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(1);
107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
108656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Weak and semi week keys as take from
110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * %A D.W. Davies
111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * %A W.L. Price
112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * %T Security for Computer Networks
113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * %I John Wiley & Sons
114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * %D 1984
115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Many thanks to smb@ulysses.att.com (Steven Bellovin) for the reference
116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * (and actual cblock values).
117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define NUM_WEAK_KEY	16
119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const DES_cblock weak_keys[NUM_WEAK_KEY]={
120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* weak keys */
121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E},
124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1},
125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* semi-weak keys */
126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
129656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
130656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
131656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
134656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}};
138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint DES_is_weak_key(const_DES_cblock *key)
140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	int i;
142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<NUM_WEAK_KEY; i++)
144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* Added == 0 to comparison, I obviously don't run
145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * this section very often :-(, thanks to
146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * engineering@MorningStar.Com for the fix
147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * eay 93/06/29
148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * Another problem, I was comparing only the first 4
149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * bytes, 97/03/18 */
150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (memcmp(weak_keys[i],key,sizeof(DES_cblock)) == 0) return(1);
151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(0);
152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* NOW DEFINED IN des_local.h
155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * See ecb_encrypt.c for a pseudo description of these macros.
156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	(b)^=(t),\
158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 	(a)=((a)^((t)<<(n))))
159656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
160656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	(a)=(a)^(t)^(t>>(16-(n))))
163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectstatic const DES_LONG des_skb[8][64]={
165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000000L,0x00000010L,0x20000000L,0x20000010L,
168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00010000L,0x00010010L,0x20010000L,0x20010010L,
169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000800L,0x00000810L,0x20000800L,0x20000810L,
170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00010800L,0x00010810L,0x20010800L,0x20010810L,
171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000020L,0x00000030L,0x20000020L,0x20000030L,
172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00010020L,0x00010030L,0x20010020L,0x20010030L,
173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000820L,0x00000830L,0x20000820L,0x20000830L,
174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00010820L,0x00010830L,0x20010820L,0x20010830L,
175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00080000L,0x00080010L,0x20080000L,0x20080010L,
176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00090000L,0x00090010L,0x20090000L,0x20090010L,
177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00080800L,0x00080810L,0x20080800L,0x20080810L,
178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00090800L,0x00090810L,0x20090800L,0x20090810L,
179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00080020L,0x00080030L,0x20080020L,0x20080030L,
180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00090020L,0x00090030L,0x20090020L,0x20090030L,
181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00080820L,0x00080830L,0x20080820L,0x20080830L,
182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00090820L,0x00090830L,0x20090820L,0x20090830L,
183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	},{
184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000000L,0x02000000L,0x00002000L,0x02002000L,
186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00200000L,0x02200000L,0x00202000L,0x02202000L,
187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000004L,0x02000004L,0x00002004L,0x02002004L,
188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00200004L,0x02200004L,0x00202004L,0x02202004L,
189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000400L,0x02000400L,0x00002400L,0x02002400L,
190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00200400L,0x02200400L,0x00202400L,0x02202400L,
191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000404L,0x02000404L,0x00002404L,0x02002404L,
192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00200404L,0x02200404L,0x00202404L,0x02202404L,
193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x10000000L,0x12000000L,0x10002000L,0x12002000L,
194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x10200000L,0x12200000L,0x10202000L,0x12202000L,
195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x10000004L,0x12000004L,0x10002004L,0x12002004L,
196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x10200004L,0x12200004L,0x10202004L,0x12202004L,
197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x10000400L,0x12000400L,0x10002400L,0x12002400L,
198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x10200400L,0x12200400L,0x10202400L,0x12202400L,
199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x10000404L,0x12000404L,0x10002404L,0x12002404L,
200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x10200404L,0x12200404L,0x10202404L,0x12202404L,
201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	},{
202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000000L,0x00000001L,0x00040000L,0x00040001L,
204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01000000L,0x01000001L,0x01040000L,0x01040001L,
205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000002L,0x00000003L,0x00040002L,0x00040003L,
206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01000002L,0x01000003L,0x01040002L,0x01040003L,
207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000200L,0x00000201L,0x00040200L,0x00040201L,
208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01000200L,0x01000201L,0x01040200L,0x01040201L,
209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000202L,0x00000203L,0x00040202L,0x00040203L,
210656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01000202L,0x01000203L,0x01040202L,0x01040203L,
211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x08000000L,0x08000001L,0x08040000L,0x08040001L,
212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x09000000L,0x09000001L,0x09040000L,0x09040001L,
213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x08000002L,0x08000003L,0x08040002L,0x08040003L,
214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x09000002L,0x09000003L,0x09040002L,0x09040003L,
215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x08000200L,0x08000201L,0x08040200L,0x08040201L,
216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x09000200L,0x09000201L,0x09040200L,0x09040201L,
217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x08000202L,0x08000203L,0x08040202L,0x08040203L,
218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x09000202L,0x09000203L,0x09040202L,0x09040203L,
219656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	},{
220656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
221656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000000L,0x00100000L,0x00000100L,0x00100100L,
222656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000008L,0x00100008L,0x00000108L,0x00100108L,
223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00001000L,0x00101000L,0x00001100L,0x00101100L,
224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00001008L,0x00101008L,0x00001108L,0x00101108L,
225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x04000000L,0x04100000L,0x04000100L,0x04100100L,
226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x04000008L,0x04100008L,0x04000108L,0x04100108L,
227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x04001000L,0x04101000L,0x04001100L,0x04101100L,
228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x04001008L,0x04101008L,0x04001108L,0x04101108L,
229656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00020000L,0x00120000L,0x00020100L,0x00120100L,
230656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00020008L,0x00120008L,0x00020108L,0x00120108L,
231656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00021000L,0x00121000L,0x00021100L,0x00121100L,
232656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00021008L,0x00121008L,0x00021108L,0x00121108L,
233656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x04020000L,0x04120000L,0x04020100L,0x04120100L,
234656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x04020008L,0x04120008L,0x04020108L,0x04120108L,
235656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x04021000L,0x04121000L,0x04021100L,0x04121100L,
236656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x04021008L,0x04121008L,0x04021108L,0x04121108L,
237656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	},{
238656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
239656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000000L,0x10000000L,0x00010000L,0x10010000L,
240656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000004L,0x10000004L,0x00010004L,0x10010004L,
241656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x20000000L,0x30000000L,0x20010000L,0x30010000L,
242656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x20000004L,0x30000004L,0x20010004L,0x30010004L,
243656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00100000L,0x10100000L,0x00110000L,0x10110000L,
244656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00100004L,0x10100004L,0x00110004L,0x10110004L,
245656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x20100000L,0x30100000L,0x20110000L,0x30110000L,
246656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x20100004L,0x30100004L,0x20110004L,0x30110004L,
247656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00001000L,0x10001000L,0x00011000L,0x10011000L,
248656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00001004L,0x10001004L,0x00011004L,0x10011004L,
249656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x20001000L,0x30001000L,0x20011000L,0x30011000L,
250656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x20001004L,0x30001004L,0x20011004L,0x30011004L,
251656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00101000L,0x10101000L,0x00111000L,0x10111000L,
252656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00101004L,0x10101004L,0x00111004L,0x10111004L,
253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x20101000L,0x30101000L,0x20111000L,0x30111000L,
254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x20101004L,0x30101004L,0x20111004L,0x30111004L,
255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	},{
256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000000L,0x08000000L,0x00000008L,0x08000008L,
258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000400L,0x08000400L,0x00000408L,0x08000408L,
259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00020000L,0x08020000L,0x00020008L,0x08020008L,
260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00020400L,0x08020400L,0x00020408L,0x08020408L,
261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000001L,0x08000001L,0x00000009L,0x08000009L,
262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000401L,0x08000401L,0x00000409L,0x08000409L,
263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00020001L,0x08020001L,0x00020009L,0x08020009L,
264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00020401L,0x08020401L,0x00020409L,0x08020409L,
265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
272656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	},{
274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000000L,0x00000100L,0x00080000L,0x00080100L,
276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01000000L,0x01000100L,0x01080000L,0x01080100L,
277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000010L,0x00000110L,0x00080010L,0x00080110L,
278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01000010L,0x01000110L,0x01080010L,0x01080110L,
279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00200000L,0x00200100L,0x00280000L,0x00280100L,
280656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01200000L,0x01200100L,0x01280000L,0x01280100L,
281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00200010L,0x00200110L,0x00280010L,0x00280110L,
282656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01200010L,0x01200110L,0x01280010L,0x01280110L,
283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000200L,0x00000300L,0x00080200L,0x00080300L,
284656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01000200L,0x01000300L,0x01080200L,0x01080300L,
285656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000210L,0x00000310L,0x00080210L,0x00080310L,
286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01000210L,0x01000310L,0x01080210L,0x01080310L,
287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00200200L,0x00200300L,0x00280200L,0x00280300L,
288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01200200L,0x01200300L,0x01280200L,0x01280300L,
289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00200210L,0x00200310L,0x00280210L,0x00280310L,
290656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x01200210L,0x01200310L,0x01280210L,0x01280310L,
291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	},{
292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000000L,0x04000000L,0x00040000L,0x04040000L,
294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000002L,0x04000002L,0x00040002L,0x04040002L,
295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00002000L,0x04002000L,0x00042000L,0x04042000L,
296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00002002L,0x04002002L,0x00042002L,0x04042002L,
297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000020L,0x04000020L,0x00040020L,0x04040020L,
298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000022L,0x04000022L,0x00040022L,0x04040022L,
299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00002020L,0x04002020L,0x00042020L,0x04042020L,
300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00002022L,0x04002022L,0x00042022L,0x04042022L,
301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000800L,0x04000800L,0x00040800L,0x04040800L,
302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000802L,0x04000802L,0x00040802L,0x04040802L,
303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00002800L,0x04002800L,0x00042800L,0x04042800L,
304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00002802L,0x04002802L,0x00042802L,0x04042802L,
305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000820L,0x04000820L,0x00040820L,0x04040820L,
306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00000822L,0x04000822L,0x00040822L,0x04040822L,
307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00002820L,0x04002820L,0x00042820L,0x04042820L,
308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	0x00002822L,0x04002822L,0x00042822L,0x04042822L,
309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}};
310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule)
312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (DES_check_key)
314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return DES_set_key_checked(key, schedule);
316656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
317656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	else
318656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
319656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		DES_set_key_unchecked(key, schedule);
320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return 0;
321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* return 0 if key parity is odd (correct),
325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * return -1 if key parity error,
326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * return -2 if illegal weak key.
327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */
328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule)
329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (!DES_check_key_parity(key))
331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(-1);
332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	if (DES_is_weak_key(key))
333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		return(-2);
334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	DES_set_key_unchecked(key, schedule);
335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return 0;
336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule)
339392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#ifdef OPENSSL_FIPS
340392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	{
341392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	fips_cipher_abort(DES);
342392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	private_DES_set_key_unchecked(key, schedule);
343392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom	}
344392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstromvoid private_DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule)
345392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom#endif
346656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom	static const int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
348656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	register DES_LONG c,d,t,s,t2;
349656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	register const unsigned char *in;
350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	register DES_LONG *k;
351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	register int i;
352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENBSD_DEV_CRYPTO
354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	memcpy(schedule->key,key,sizeof schedule->key);
355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	schedule->session=NULL;
356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif
357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	k = &schedule->ks->deslong[0];
358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	in = &(*key)[0];
359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2l(in,c);
361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c2l(in,d);
362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	/* do PC1 in 47 simple operations :-)
364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	 * for the inspiration. :-) */
366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PERM_OP (d,c,t,4,0x0f0f0f0fL);
367656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	HPERM_OP(c,t,-2,0xcccc0000L);
368656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	HPERM_OP(d,t,-2,0xcccc0000L);
369656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PERM_OP (d,c,t,1,0x55555555L);
370656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PERM_OP (c,d,t,8,0x00ff00ffL);
371656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	PERM_OP (d,c,t,1,0x55555555L);
372656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	d=	(((d&0x000000ffL)<<16L)| (d&0x0000ff00L)     |
373656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L));
374656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	c&=0x0fffffffL;
375656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
376656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	for (i=0; i<ITERATIONS; i++)
377656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		{
378656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		if (shifts2[i])
379656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); }
380656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		else
381656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			{ c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); }
382656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		c&=0x0fffffffL;
383656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		d&=0x0fffffffL;
384656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* could be a few less shifts but I am to lazy at this
385656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		 * point in time to investigate */
386656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		s=	des_skb[0][ (c    )&0x3f                ]|
387656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]|
388656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]|
389656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) |
390656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project						  ((c>>22L)&0x38)];
391656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		t=	des_skb[4][ (d    )&0x3f                ]|
392656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|
393656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			des_skb[6][ (d>>15L)&0x3f                ]|
394656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project			des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)];
395656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
396656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		/* table contained 0213 4657 */
397656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL;
398656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*(k++)=ROTATE(t2,30)&0xffffffffL;
399656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
400656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		t2=((s>>16L)|(t&0xffff0000L));
401656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		*(k++)=ROTATE(t2,26)&0xffffffffL;
402656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project		}
403656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
404656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project
405656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule)
406656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
407656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	return(DES_set_key(key,schedule));
408656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
409656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/*
410656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef des_fixup_key_parity
411656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectvoid des_fixup_key_parity(des_cblock *key)
412656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	{
413656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	des_set_odd_parity(key);
414656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project	}
415656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project*/
416