set_key.c revision 109998
155714Skris/* crypto/des/set_key.c */
255714Skris/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
355714Skris * All rights reserved.
455714Skris *
555714Skris * This package is an SSL implementation written
655714Skris * by Eric Young (eay@cryptsoft.com).
755714Skris * The implementation was written so as to conform with Netscapes SSL.
855714Skris *
955714Skris * This library is free for commercial and non-commercial use as long as
1055714Skris * the following conditions are aheared to.  The following conditions
1155714Skris * apply to all code found in this distribution, be it the RC4, RSA,
1255714Skris * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
1355714Skris * included with this distribution is covered by the same copyright terms
1455714Skris * except that the holder is Tim Hudson (tjh@cryptsoft.com).
1555714Skris *
1655714Skris * Copyright remains Eric Young's, and as such any Copyright notices in
1755714Skris * the code are not to be removed.
1855714Skris * If this package is used in a product, Eric Young should be given attribution
1955714Skris * as the author of the parts of the library used.
2055714Skris * This can be in the form of a textual message at program startup or
2155714Skris * in documentation (online or textual) provided with the package.
2255714Skris *
2355714Skris * Redistribution and use in source and binary forms, with or without
2455714Skris * modification, are permitted provided that the following conditions
2555714Skris * are met:
2655714Skris * 1. Redistributions of source code must retain the copyright
2755714Skris *    notice, this list of conditions and the following disclaimer.
2855714Skris * 2. Redistributions in binary form must reproduce the above copyright
2955714Skris *    notice, this list of conditions and the following disclaimer in the
3055714Skris *    documentation and/or other materials provided with the distribution.
3155714Skris * 3. All advertising materials mentioning features or use of this software
3255714Skris *    must display the following acknowledgement:
3355714Skris *    "This product includes cryptographic software written by
3455714Skris *     Eric Young (eay@cryptsoft.com)"
3555714Skris *    The word 'cryptographic' can be left out if the rouines from the library
3655714Skris *    being used are not cryptographic related :-).
3755714Skris * 4. If you include any Windows specific code (or a derivative thereof) from
3855714Skris *    the apps directory (application code) you must include an acknowledgement:
3955714Skris *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
4055714Skris *
4155714Skris * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
4255714Skris * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4355714Skris * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4455714Skris * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
4555714Skris * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4655714Skris * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4755714Skris * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4855714Skris * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4955714Skris * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
5055714Skris * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
5155714Skris * SUCH DAMAGE.
5255714Skris *
5355714Skris * The licence and distribution terms for any publically available version or
5455714Skris * derivative of this code cannot be changed.  i.e. this code cannot simply be
5555714Skris * copied and put under another distribution licence
5655714Skris * [including the GNU Public Licence.]
5755714Skris */
5855714Skris
5955714Skris/* set_key.c v 1.4 eay 24/9/91
6055714Skris * 1.4 Speed up by 400% :-)
6155714Skris * 1.3 added register declarations.
6255714Skris * 1.2 unrolled make_key_sched a bit more
6355714Skris * 1.1 added norm_expand_bits
6455714Skris * 1.0 First working version
6555714Skris */
6655714Skris#include "des_locl.h"
6755714Skris
68109998SmarkmOPENSSL_IMPLEMENT_GLOBAL(int,DES_check_key);	/* defaults to false */
6955714Skris
7059191Skrisstatic const unsigned char odd_parity[256]={
7159191Skris  1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
7259191Skris 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
7359191Skris 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
7459191Skris 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
7559191Skris 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
7659191Skris 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
7759191Skris 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
7859191Skris112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
7959191Skris128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
8059191Skris145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
8159191Skris161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
8259191Skris176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
8359191Skris193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
8459191Skris208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
8559191Skris224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
8659191Skris241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
8759191Skris
88109998Smarkmvoid DES_set_odd_parity(DES_cblock *key)
8955714Skris	{
9055714Skris	int i;
9155714Skris
9255714Skris	for (i=0; i<DES_KEY_SZ; i++)
9355714Skris		(*key)[i]=odd_parity[(*key)[i]];
9455714Skris	}
9555714Skris
96109998Smarkmint DES_check_key_parity(const_DES_cblock *key)
9755714Skris	{
9855714Skris	int i;
9955714Skris
10055714Skris	for (i=0; i<DES_KEY_SZ; i++)
10155714Skris		{
10255714Skris		if ((*key)[i] != odd_parity[(*key)[i]])
10355714Skris			return(0);
10455714Skris		}
10555714Skris	return(1);
10655714Skris	}
10755714Skris
10855714Skris/* Weak and semi week keys as take from
10955714Skris * %A D.W. Davies
11055714Skris * %A W.L. Price
11155714Skris * %T Security for Computer Networks
11255714Skris * %I John Wiley & Sons
11355714Skris * %D 1984
11455714Skris * Many thanks to smb@ulysses.att.com (Steven Bellovin) for the reference
11555714Skris * (and actual cblock values).
11655714Skris */
11755714Skris#define NUM_WEAK_KEY	16
118109998Smarkmstatic DES_cblock weak_keys[NUM_WEAK_KEY]={
11955714Skris	/* weak keys */
12055714Skris	{0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
12155714Skris	{0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
12255714Skris	{0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E},
12355714Skris	{0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1},
12455714Skris	/* semi-weak keys */
12555714Skris	{0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
12655714Skris	{0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
12755714Skris	{0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
12855714Skris	{0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
12955714Skris	{0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
13055714Skris	{0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
13155714Skris	{0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
13255714Skris	{0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
13355714Skris	{0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
13455714Skris	{0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
13555714Skris	{0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
13655714Skris	{0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}};
13755714Skris
138109998Smarkmint DES_is_weak_key(const_DES_cblock *key)
13955714Skris	{
14055714Skris	int i;
14155714Skris
14255714Skris	for (i=0; i<NUM_WEAK_KEY; i++)
14359191Skris		/* Added == 0 to comparison, I obviously don't run
14455714Skris		 * this section very often :-(, thanks to
14555714Skris		 * engineering@MorningStar.Com for the fix
14655714Skris		 * eay 93/06/29
14755714Skris		 * Another problem, I was comparing only the first 4
14855714Skris		 * bytes, 97/03/18 */
149109998Smarkm		if (memcmp(weak_keys[i],key,sizeof(DES_cblock)) == 0) return(1);
15055714Skris	return(0);
15155714Skris	}
15255714Skris
15355714Skris/* NOW DEFINED IN des_local.h
15455714Skris * See ecb_encrypt.c for a pseudo description of these macros.
15555714Skris * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
15655714Skris * 	(b)^=(t),\
15755714Skris * 	(a)=((a)^((t)<<(n))))
15855714Skris */
15955714Skris
16055714Skris#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
16155714Skris	(a)=(a)^(t)^(t>>(16-(n))))
16255714Skris
16359191Skrisstatic const DES_LONG des_skb[8][64]={
16459191Skris	{
16559191Skris	/* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
16659191Skris	0x00000000L,0x00000010L,0x20000000L,0x20000010L,
16759191Skris	0x00010000L,0x00010010L,0x20010000L,0x20010010L,
16859191Skris	0x00000800L,0x00000810L,0x20000800L,0x20000810L,
16959191Skris	0x00010800L,0x00010810L,0x20010800L,0x20010810L,
17059191Skris	0x00000020L,0x00000030L,0x20000020L,0x20000030L,
17159191Skris	0x00010020L,0x00010030L,0x20010020L,0x20010030L,
17259191Skris	0x00000820L,0x00000830L,0x20000820L,0x20000830L,
17359191Skris	0x00010820L,0x00010830L,0x20010820L,0x20010830L,
17459191Skris	0x00080000L,0x00080010L,0x20080000L,0x20080010L,
17559191Skris	0x00090000L,0x00090010L,0x20090000L,0x20090010L,
17659191Skris	0x00080800L,0x00080810L,0x20080800L,0x20080810L,
17759191Skris	0x00090800L,0x00090810L,0x20090800L,0x20090810L,
17859191Skris	0x00080020L,0x00080030L,0x20080020L,0x20080030L,
17959191Skris	0x00090020L,0x00090030L,0x20090020L,0x20090030L,
18059191Skris	0x00080820L,0x00080830L,0x20080820L,0x20080830L,
18159191Skris	0x00090820L,0x00090830L,0x20090820L,0x20090830L,
18259191Skris	},{
18359191Skris	/* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
18459191Skris	0x00000000L,0x02000000L,0x00002000L,0x02002000L,
18559191Skris	0x00200000L,0x02200000L,0x00202000L,0x02202000L,
18659191Skris	0x00000004L,0x02000004L,0x00002004L,0x02002004L,
18759191Skris	0x00200004L,0x02200004L,0x00202004L,0x02202004L,
18859191Skris	0x00000400L,0x02000400L,0x00002400L,0x02002400L,
18959191Skris	0x00200400L,0x02200400L,0x00202400L,0x02202400L,
19059191Skris	0x00000404L,0x02000404L,0x00002404L,0x02002404L,
19159191Skris	0x00200404L,0x02200404L,0x00202404L,0x02202404L,
19259191Skris	0x10000000L,0x12000000L,0x10002000L,0x12002000L,
19359191Skris	0x10200000L,0x12200000L,0x10202000L,0x12202000L,
19459191Skris	0x10000004L,0x12000004L,0x10002004L,0x12002004L,
19559191Skris	0x10200004L,0x12200004L,0x10202004L,0x12202004L,
19659191Skris	0x10000400L,0x12000400L,0x10002400L,0x12002400L,
19759191Skris	0x10200400L,0x12200400L,0x10202400L,0x12202400L,
19859191Skris	0x10000404L,0x12000404L,0x10002404L,0x12002404L,
19959191Skris	0x10200404L,0x12200404L,0x10202404L,0x12202404L,
20059191Skris	},{
20159191Skris	/* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
20259191Skris	0x00000000L,0x00000001L,0x00040000L,0x00040001L,
20359191Skris	0x01000000L,0x01000001L,0x01040000L,0x01040001L,
20459191Skris	0x00000002L,0x00000003L,0x00040002L,0x00040003L,
20559191Skris	0x01000002L,0x01000003L,0x01040002L,0x01040003L,
20659191Skris	0x00000200L,0x00000201L,0x00040200L,0x00040201L,
20759191Skris	0x01000200L,0x01000201L,0x01040200L,0x01040201L,
20859191Skris	0x00000202L,0x00000203L,0x00040202L,0x00040203L,
20959191Skris	0x01000202L,0x01000203L,0x01040202L,0x01040203L,
21059191Skris	0x08000000L,0x08000001L,0x08040000L,0x08040001L,
21159191Skris	0x09000000L,0x09000001L,0x09040000L,0x09040001L,
21259191Skris	0x08000002L,0x08000003L,0x08040002L,0x08040003L,
21359191Skris	0x09000002L,0x09000003L,0x09040002L,0x09040003L,
21459191Skris	0x08000200L,0x08000201L,0x08040200L,0x08040201L,
21559191Skris	0x09000200L,0x09000201L,0x09040200L,0x09040201L,
21659191Skris	0x08000202L,0x08000203L,0x08040202L,0x08040203L,
21759191Skris	0x09000202L,0x09000203L,0x09040202L,0x09040203L,
21859191Skris	},{
21959191Skris	/* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
22059191Skris	0x00000000L,0x00100000L,0x00000100L,0x00100100L,
22159191Skris	0x00000008L,0x00100008L,0x00000108L,0x00100108L,
22259191Skris	0x00001000L,0x00101000L,0x00001100L,0x00101100L,
22359191Skris	0x00001008L,0x00101008L,0x00001108L,0x00101108L,
22459191Skris	0x04000000L,0x04100000L,0x04000100L,0x04100100L,
22559191Skris	0x04000008L,0x04100008L,0x04000108L,0x04100108L,
22659191Skris	0x04001000L,0x04101000L,0x04001100L,0x04101100L,
22759191Skris	0x04001008L,0x04101008L,0x04001108L,0x04101108L,
22859191Skris	0x00020000L,0x00120000L,0x00020100L,0x00120100L,
22959191Skris	0x00020008L,0x00120008L,0x00020108L,0x00120108L,
23059191Skris	0x00021000L,0x00121000L,0x00021100L,0x00121100L,
23159191Skris	0x00021008L,0x00121008L,0x00021108L,0x00121108L,
23259191Skris	0x04020000L,0x04120000L,0x04020100L,0x04120100L,
23359191Skris	0x04020008L,0x04120008L,0x04020108L,0x04120108L,
23459191Skris	0x04021000L,0x04121000L,0x04021100L,0x04121100L,
23559191Skris	0x04021008L,0x04121008L,0x04021108L,0x04121108L,
23659191Skris	},{
23759191Skris	/* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
23859191Skris	0x00000000L,0x10000000L,0x00010000L,0x10010000L,
23959191Skris	0x00000004L,0x10000004L,0x00010004L,0x10010004L,
24059191Skris	0x20000000L,0x30000000L,0x20010000L,0x30010000L,
24159191Skris	0x20000004L,0x30000004L,0x20010004L,0x30010004L,
24259191Skris	0x00100000L,0x10100000L,0x00110000L,0x10110000L,
24359191Skris	0x00100004L,0x10100004L,0x00110004L,0x10110004L,
24459191Skris	0x20100000L,0x30100000L,0x20110000L,0x30110000L,
24559191Skris	0x20100004L,0x30100004L,0x20110004L,0x30110004L,
24659191Skris	0x00001000L,0x10001000L,0x00011000L,0x10011000L,
24759191Skris	0x00001004L,0x10001004L,0x00011004L,0x10011004L,
24859191Skris	0x20001000L,0x30001000L,0x20011000L,0x30011000L,
24959191Skris	0x20001004L,0x30001004L,0x20011004L,0x30011004L,
25059191Skris	0x00101000L,0x10101000L,0x00111000L,0x10111000L,
25159191Skris	0x00101004L,0x10101004L,0x00111004L,0x10111004L,
25259191Skris	0x20101000L,0x30101000L,0x20111000L,0x30111000L,
25359191Skris	0x20101004L,0x30101004L,0x20111004L,0x30111004L,
25459191Skris	},{
25559191Skris	/* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
25659191Skris	0x00000000L,0x08000000L,0x00000008L,0x08000008L,
25759191Skris	0x00000400L,0x08000400L,0x00000408L,0x08000408L,
25859191Skris	0x00020000L,0x08020000L,0x00020008L,0x08020008L,
25959191Skris	0x00020400L,0x08020400L,0x00020408L,0x08020408L,
26059191Skris	0x00000001L,0x08000001L,0x00000009L,0x08000009L,
26159191Skris	0x00000401L,0x08000401L,0x00000409L,0x08000409L,
26259191Skris	0x00020001L,0x08020001L,0x00020009L,0x08020009L,
26359191Skris	0x00020401L,0x08020401L,0x00020409L,0x08020409L,
26459191Skris	0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
26559191Skris	0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
26659191Skris	0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
26759191Skris	0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
26859191Skris	0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
26959191Skris	0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
27059191Skris	0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
27159191Skris	0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
27259191Skris	},{
27359191Skris	/* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
27459191Skris	0x00000000L,0x00000100L,0x00080000L,0x00080100L,
27559191Skris	0x01000000L,0x01000100L,0x01080000L,0x01080100L,
27659191Skris	0x00000010L,0x00000110L,0x00080010L,0x00080110L,
27759191Skris	0x01000010L,0x01000110L,0x01080010L,0x01080110L,
27859191Skris	0x00200000L,0x00200100L,0x00280000L,0x00280100L,
27959191Skris	0x01200000L,0x01200100L,0x01280000L,0x01280100L,
28059191Skris	0x00200010L,0x00200110L,0x00280010L,0x00280110L,
28159191Skris	0x01200010L,0x01200110L,0x01280010L,0x01280110L,
28259191Skris	0x00000200L,0x00000300L,0x00080200L,0x00080300L,
28359191Skris	0x01000200L,0x01000300L,0x01080200L,0x01080300L,
28459191Skris	0x00000210L,0x00000310L,0x00080210L,0x00080310L,
28559191Skris	0x01000210L,0x01000310L,0x01080210L,0x01080310L,
28659191Skris	0x00200200L,0x00200300L,0x00280200L,0x00280300L,
28759191Skris	0x01200200L,0x01200300L,0x01280200L,0x01280300L,
28859191Skris	0x00200210L,0x00200310L,0x00280210L,0x00280310L,
28959191Skris	0x01200210L,0x01200310L,0x01280210L,0x01280310L,
29059191Skris	},{
29159191Skris	/* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
29259191Skris	0x00000000L,0x04000000L,0x00040000L,0x04040000L,
29359191Skris	0x00000002L,0x04000002L,0x00040002L,0x04040002L,
29459191Skris	0x00002000L,0x04002000L,0x00042000L,0x04042000L,
29559191Skris	0x00002002L,0x04002002L,0x00042002L,0x04042002L,
29659191Skris	0x00000020L,0x04000020L,0x00040020L,0x04040020L,
29759191Skris	0x00000022L,0x04000022L,0x00040022L,0x04040022L,
29859191Skris	0x00002020L,0x04002020L,0x00042020L,0x04042020L,
29959191Skris	0x00002022L,0x04002022L,0x00042022L,0x04042022L,
30059191Skris	0x00000800L,0x04000800L,0x00040800L,0x04040800L,
30159191Skris	0x00000802L,0x04000802L,0x00040802L,0x04040802L,
30259191Skris	0x00002800L,0x04002800L,0x00042800L,0x04042800L,
30359191Skris	0x00002802L,0x04002802L,0x00042802L,0x04042802L,
30459191Skris	0x00000820L,0x04000820L,0x00040820L,0x04040820L,
30559191Skris	0x00000822L,0x04000822L,0x00040822L,0x04040822L,
30659191Skris	0x00002820L,0x04002820L,0x00042820L,0x04042820L,
30759191Skris	0x00002822L,0x04002822L,0x00042822L,0x04042822L,
30859191Skris	}};
30959191Skris
310109998Smarkmint DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule)
31159191Skris	{
312109998Smarkm	if (DES_check_key)
31359191Skris		{
314109998Smarkm		return DES_set_key_checked(key, schedule);
31559191Skris		}
31659191Skris	else
31759191Skris		{
318109998Smarkm		DES_set_key_unchecked(key, schedule);
31959191Skris		return 0;
32059191Skris		}
32159191Skris	}
32259191Skris
32355714Skris/* return 0 if key parity is odd (correct),
32455714Skris * return -1 if key parity error,
32555714Skris * return -2 if illegal weak key.
32655714Skris */
327109998Smarkmint DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule)
32855714Skris	{
329109998Smarkm	if (!DES_check_key_parity(key))
33059191Skris		return(-1);
331109998Smarkm	if (DES_is_weak_key(key))
33259191Skris		return(-2);
333109998Smarkm	DES_set_key_unchecked(key, schedule);
33459191Skris	return 0;
33559191Skris	}
33659191Skris
337109998Smarkmvoid DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule)
33859191Skris	{
33955714Skris	static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
34055714Skris	register DES_LONG c,d,t,s,t2;
34155714Skris	register const unsigned char *in;
34255714Skris	register DES_LONG *k;
34355714Skris	register int i;
34455714Skris
345109998Smarkm#ifdef OPENBSD_DEV_CRYPTO
346109998Smarkm	memcpy(schedule->key,key,sizeof schedule->key);
347109998Smarkm	schedule->session=NULL;
348109998Smarkm#endif
349109998Smarkm	k = &schedule->ks->deslong[0];
35055714Skris	in = &(*key)[0];
35155714Skris
35255714Skris	c2l(in,c);
35355714Skris	c2l(in,d);
35455714Skris
35559191Skris	/* do PC1 in 47 simple operations :-)
35655714Skris	 * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
35755714Skris	 * for the inspiration. :-) */
35855714Skris	PERM_OP (d,c,t,4,0x0f0f0f0fL);
35955714Skris	HPERM_OP(c,t,-2,0xcccc0000L);
36055714Skris	HPERM_OP(d,t,-2,0xcccc0000L);
36155714Skris	PERM_OP (d,c,t,1,0x55555555L);
36255714Skris	PERM_OP (c,d,t,8,0x00ff00ffL);
36355714Skris	PERM_OP (d,c,t,1,0x55555555L);
36455714Skris	d=	(((d&0x000000ffL)<<16L)| (d&0x0000ff00L)     |
36555714Skris		 ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L));
36655714Skris	c&=0x0fffffffL;
36755714Skris
36855714Skris	for (i=0; i<ITERATIONS; i++)
36955714Skris		{
37055714Skris		if (shifts2[i])
37155714Skris			{ c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); }
37255714Skris		else
37355714Skris			{ c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); }
37455714Skris		c&=0x0fffffffL;
37555714Skris		d&=0x0fffffffL;
37655714Skris		/* could be a few less shifts but I am to lazy at this
37755714Skris		 * point in time to investigate */
37855714Skris		s=	des_skb[0][ (c    )&0x3f                ]|
37959191Skris			des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]|
38059191Skris			des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]|
38159191Skris			des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) |
38255714Skris						  ((c>>22L)&0x38)];
38355714Skris		t=	des_skb[4][ (d    )&0x3f                ]|
38455714Skris			des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|
38555714Skris			des_skb[6][ (d>>15L)&0x3f                ]|
38655714Skris			des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)];
38755714Skris
38855714Skris		/* table contained 0213 4657 */
38955714Skris		t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL;
39055714Skris		*(k++)=ROTATE(t2,30)&0xffffffffL;
39155714Skris
39255714Skris		t2=((s>>16L)|(t&0xffff0000L));
39355714Skris		*(k++)=ROTATE(t2,26)&0xffffffffL;
39455714Skris		}
39555714Skris	}
39655714Skris
397109998Smarkmint DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule)
39855714Skris	{
399109998Smarkm	return(DES_set_key(key,schedule));
40055714Skris	}
401109998Smarkm/*
40259191Skris#undef des_fixup_key_parity
40359191Skrisvoid des_fixup_key_parity(des_cblock *key)
40459191Skris	{
40559191Skris	des_set_odd_parity(key);
40659191Skris	}
407109998Smarkm*/
408