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.
8296341Sdelphij *
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).
15296341Sdelphij *
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.
22296341Sdelphij *
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 :-).
37296341Sdelphij * 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)"
40296341Sdelphij *
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.
52296341Sdelphij *
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
59296341Sdelphij/*-
60296341Sdelphij * set_key.c v 1.4 eay 24/9/91
6155714Skris * 1.4 Speed up by 400% :-)
6255714Skris * 1.3 added register declarations.
6355714Skris * 1.2 unrolled make_key_sched a bit more
6455714Skris * 1.1 added norm_expand_bits
6555714Skris * 1.0 First working version
6655714Skris */
67246772Sjkim#include <openssl/crypto.h>
6855714Skris#include "des_locl.h"
6955714Skris
70296341SdelphijOPENSSL_IMPLEMENT_GLOBAL(int, DES_check_key, 0)
71296341Sdelphij                                                    /*
72296341Sdelphij                                                     * defaults to false
73296341Sdelphij                                                     */
74296341Sdelphijstatic const unsigned char odd_parity[256] = {
75296341Sdelphij    1, 1, 2, 2, 4, 4, 7, 7, 8, 8, 11, 11, 13, 13, 14, 14,
76296341Sdelphij    16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
77296341Sdelphij    32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
78296341Sdelphij    49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
79296341Sdelphij    64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
80296341Sdelphij    81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
81296341Sdelphij    97, 97, 98, 98, 100, 100, 103, 103, 104, 104, 107, 107, 109, 109, 110,
82296341Sdelphij    110,
83296341Sdelphij    112, 112, 115, 115, 117, 117, 118, 118, 121, 121, 122, 122, 124, 124, 127,
84296341Sdelphij    127,
85296341Sdelphij    128, 128, 131, 131, 133, 133, 134, 134, 137, 137, 138, 138, 140, 140, 143,
86296341Sdelphij    143,
87296341Sdelphij    145, 145, 146, 146, 148, 148, 151, 151, 152, 152, 155, 155, 157, 157, 158,
88296341Sdelphij    158,
89296341Sdelphij    161, 161, 162, 162, 164, 164, 167, 167, 168, 168, 171, 171, 173, 173, 174,
90296341Sdelphij    174,
91296341Sdelphij    176, 176, 179, 179, 181, 181, 182, 182, 185, 185, 186, 186, 188, 188, 191,
92296341Sdelphij    191,
93296341Sdelphij    193, 193, 194, 194, 196, 196, 199, 199, 200, 200, 203, 203, 205, 205, 206,
94296341Sdelphij    206,
95296341Sdelphij    208, 208, 211, 211, 213, 213, 214, 214, 217, 217, 218, 218, 220, 220, 223,
96296341Sdelphij    223,
97296341Sdelphij    224, 224, 227, 227, 229, 229, 230, 230, 233, 233, 234, 234, 236, 236, 239,
98296341Sdelphij    239,
99296341Sdelphij    241, 241, 242, 242, 244, 244, 247, 247, 248, 248, 251, 251, 253, 253, 254,
100296341Sdelphij    254
101296341Sdelphij};
10255714Skris
103109998Smarkmvoid DES_set_odd_parity(DES_cblock *key)
104296341Sdelphij{
105296341Sdelphij    unsigned int i;
10655714Skris
107296341Sdelphij    for (i = 0; i < DES_KEY_SZ; i++)
108296341Sdelphij        (*key)[i] = odd_parity[(*key)[i]];
109296341Sdelphij}
11055714Skris
111109998Smarkmint DES_check_key_parity(const_DES_cblock *key)
112296341Sdelphij{
113296341Sdelphij    unsigned int i;
11455714Skris
115296341Sdelphij    for (i = 0; i < DES_KEY_SZ; i++) {
116296341Sdelphij        if ((*key)[i] != odd_parity[(*key)[i]])
117296341Sdelphij            return (0);
118296341Sdelphij    }
119296341Sdelphij    return (1);
120296341Sdelphij}
12155714Skris
122296341Sdelphij/*-
123296341Sdelphij * Weak and semi week keys as take from
12455714Skris * %A D.W. Davies
12555714Skris * %A W.L. Price
12655714Skris * %T Security for Computer Networks
12755714Skris * %I John Wiley & Sons
12855714Skris * %D 1984
12955714Skris * Many thanks to smb@ulysses.att.com (Steven Bellovin) for the reference
13055714Skris * (and actual cblock values).
13155714Skris */
132296341Sdelphij#define NUM_WEAK_KEY    16
133296341Sdelphijstatic const DES_cblock weak_keys[NUM_WEAK_KEY] = {
134296341Sdelphij    /* weak keys */
135296341Sdelphij    {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01},
136296341Sdelphij    {0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE},
137296341Sdelphij    {0x1F, 0x1F, 0x1F, 0x1F, 0x0E, 0x0E, 0x0E, 0x0E},
138296341Sdelphij    {0xE0, 0xE0, 0xE0, 0xE0, 0xF1, 0xF1, 0xF1, 0xF1},
139296341Sdelphij    /* semi-weak keys */
140296341Sdelphij    {0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE},
141296341Sdelphij    {0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01, 0xFE, 0x01},
142296341Sdelphij    {0x1F, 0xE0, 0x1F, 0xE0, 0x0E, 0xF1, 0x0E, 0xF1},
143296341Sdelphij    {0xE0, 0x1F, 0xE0, 0x1F, 0xF1, 0x0E, 0xF1, 0x0E},
144296341Sdelphij    {0x01, 0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1},
145296341Sdelphij    {0xE0, 0x01, 0xE0, 0x01, 0xF1, 0x01, 0xF1, 0x01},
146296341Sdelphij    {0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E, 0xFE},
147296341Sdelphij    {0xFE, 0x1F, 0xFE, 0x1F, 0xFE, 0x0E, 0xFE, 0x0E},
148296341Sdelphij    {0x01, 0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E},
149296341Sdelphij    {0x1F, 0x01, 0x1F, 0x01, 0x0E, 0x01, 0x0E, 0x01},
150296341Sdelphij    {0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1, 0xFE},
151296341Sdelphij    {0xFE, 0xE0, 0xFE, 0xE0, 0xFE, 0xF1, 0xFE, 0xF1}
152296341Sdelphij};
15355714Skris
154109998Smarkmint DES_is_weak_key(const_DES_cblock *key)
155296341Sdelphij{
156296341Sdelphij    int i;
15755714Skris
158296341Sdelphij    for (i = 0; i < NUM_WEAK_KEY; i++)
159296341Sdelphij        /*
160296341Sdelphij         * Added == 0 to comparison, I obviously don't run this section very
161296341Sdelphij         * often :-(, thanks to engineering@MorningStar.Com for the fix eay
162296341Sdelphij         * 93/06/29 Another problem, I was comparing only the first 4 bytes,
163296341Sdelphij         * 97/03/18
164296341Sdelphij         */
165296341Sdelphij        if (memcmp(weak_keys[i], key, sizeof(DES_cblock)) == 0)
166296341Sdelphij            return (1);
167296341Sdelphij    return (0);
168296341Sdelphij}
16955714Skris
170296341Sdelphij/*-
171296341Sdelphij * NOW DEFINED IN des_local.h
172296341Sdelphij * See ecb_encrypt.c for a pseudo description of these macros.
17355714Skris * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
174296341Sdelphij *      (b)^=(t),\
175296341Sdelphij *      (a)=((a)^((t)<<(n))))
17655714Skris */
17755714Skris
17855714Skris#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
179296341Sdelphij        (a)=(a)^(t)^(t>>(16-(n))))
18055714Skris
181296341Sdelphijstatic const DES_LONG des_skb[8][64] = {
182296341Sdelphij    {
183296341Sdelphij     /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
184296341Sdelphij     0x00000000L, 0x00000010L, 0x20000000L, 0x20000010L,
185296341Sdelphij     0x00010000L, 0x00010010L, 0x20010000L, 0x20010010L,
186296341Sdelphij     0x00000800L, 0x00000810L, 0x20000800L, 0x20000810L,
187296341Sdelphij     0x00010800L, 0x00010810L, 0x20010800L, 0x20010810L,
188296341Sdelphij     0x00000020L, 0x00000030L, 0x20000020L, 0x20000030L,
189296341Sdelphij     0x00010020L, 0x00010030L, 0x20010020L, 0x20010030L,
190296341Sdelphij     0x00000820L, 0x00000830L, 0x20000820L, 0x20000830L,
191296341Sdelphij     0x00010820L, 0x00010830L, 0x20010820L, 0x20010830L,
192296341Sdelphij     0x00080000L, 0x00080010L, 0x20080000L, 0x20080010L,
193296341Sdelphij     0x00090000L, 0x00090010L, 0x20090000L, 0x20090010L,
194296341Sdelphij     0x00080800L, 0x00080810L, 0x20080800L, 0x20080810L,
195296341Sdelphij     0x00090800L, 0x00090810L, 0x20090800L, 0x20090810L,
196296341Sdelphij     0x00080020L, 0x00080030L, 0x20080020L, 0x20080030L,
197296341Sdelphij     0x00090020L, 0x00090030L, 0x20090020L, 0x20090030L,
198296341Sdelphij     0x00080820L, 0x00080830L, 0x20080820L, 0x20080830L,
199296341Sdelphij     0x00090820L, 0x00090830L, 0x20090820L, 0x20090830L,
200296341Sdelphij     },
201296341Sdelphij    {
202296341Sdelphij     /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
203296341Sdelphij     0x00000000L, 0x02000000L, 0x00002000L, 0x02002000L,
204296341Sdelphij     0x00200000L, 0x02200000L, 0x00202000L, 0x02202000L,
205296341Sdelphij     0x00000004L, 0x02000004L, 0x00002004L, 0x02002004L,
206296341Sdelphij     0x00200004L, 0x02200004L, 0x00202004L, 0x02202004L,
207296341Sdelphij     0x00000400L, 0x02000400L, 0x00002400L, 0x02002400L,
208296341Sdelphij     0x00200400L, 0x02200400L, 0x00202400L, 0x02202400L,
209296341Sdelphij     0x00000404L, 0x02000404L, 0x00002404L, 0x02002404L,
210296341Sdelphij     0x00200404L, 0x02200404L, 0x00202404L, 0x02202404L,
211296341Sdelphij     0x10000000L, 0x12000000L, 0x10002000L, 0x12002000L,
212296341Sdelphij     0x10200000L, 0x12200000L, 0x10202000L, 0x12202000L,
213296341Sdelphij     0x10000004L, 0x12000004L, 0x10002004L, 0x12002004L,
214296341Sdelphij     0x10200004L, 0x12200004L, 0x10202004L, 0x12202004L,
215296341Sdelphij     0x10000400L, 0x12000400L, 0x10002400L, 0x12002400L,
216296341Sdelphij     0x10200400L, 0x12200400L, 0x10202400L, 0x12202400L,
217296341Sdelphij     0x10000404L, 0x12000404L, 0x10002404L, 0x12002404L,
218296341Sdelphij     0x10200404L, 0x12200404L, 0x10202404L, 0x12202404L,
219296341Sdelphij     },
220296341Sdelphij    {
221296341Sdelphij     /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
222296341Sdelphij     0x00000000L, 0x00000001L, 0x00040000L, 0x00040001L,
223296341Sdelphij     0x01000000L, 0x01000001L, 0x01040000L, 0x01040001L,
224296341Sdelphij     0x00000002L, 0x00000003L, 0x00040002L, 0x00040003L,
225296341Sdelphij     0x01000002L, 0x01000003L, 0x01040002L, 0x01040003L,
226296341Sdelphij     0x00000200L, 0x00000201L, 0x00040200L, 0x00040201L,
227296341Sdelphij     0x01000200L, 0x01000201L, 0x01040200L, 0x01040201L,
228296341Sdelphij     0x00000202L, 0x00000203L, 0x00040202L, 0x00040203L,
229296341Sdelphij     0x01000202L, 0x01000203L, 0x01040202L, 0x01040203L,
230296341Sdelphij     0x08000000L, 0x08000001L, 0x08040000L, 0x08040001L,
231296341Sdelphij     0x09000000L, 0x09000001L, 0x09040000L, 0x09040001L,
232296341Sdelphij     0x08000002L, 0x08000003L, 0x08040002L, 0x08040003L,
233296341Sdelphij     0x09000002L, 0x09000003L, 0x09040002L, 0x09040003L,
234296341Sdelphij     0x08000200L, 0x08000201L, 0x08040200L, 0x08040201L,
235296341Sdelphij     0x09000200L, 0x09000201L, 0x09040200L, 0x09040201L,
236296341Sdelphij     0x08000202L, 0x08000203L, 0x08040202L, 0x08040203L,
237296341Sdelphij     0x09000202L, 0x09000203L, 0x09040202L, 0x09040203L,
238296341Sdelphij     },
239296341Sdelphij    {
240296341Sdelphij     /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
241296341Sdelphij     0x00000000L, 0x00100000L, 0x00000100L, 0x00100100L,
242296341Sdelphij     0x00000008L, 0x00100008L, 0x00000108L, 0x00100108L,
243296341Sdelphij     0x00001000L, 0x00101000L, 0x00001100L, 0x00101100L,
244296341Sdelphij     0x00001008L, 0x00101008L, 0x00001108L, 0x00101108L,
245296341Sdelphij     0x04000000L, 0x04100000L, 0x04000100L, 0x04100100L,
246296341Sdelphij     0x04000008L, 0x04100008L, 0x04000108L, 0x04100108L,
247296341Sdelphij     0x04001000L, 0x04101000L, 0x04001100L, 0x04101100L,
248296341Sdelphij     0x04001008L, 0x04101008L, 0x04001108L, 0x04101108L,
249296341Sdelphij     0x00020000L, 0x00120000L, 0x00020100L, 0x00120100L,
250296341Sdelphij     0x00020008L, 0x00120008L, 0x00020108L, 0x00120108L,
251296341Sdelphij     0x00021000L, 0x00121000L, 0x00021100L, 0x00121100L,
252296341Sdelphij     0x00021008L, 0x00121008L, 0x00021108L, 0x00121108L,
253296341Sdelphij     0x04020000L, 0x04120000L, 0x04020100L, 0x04120100L,
254296341Sdelphij     0x04020008L, 0x04120008L, 0x04020108L, 0x04120108L,
255296341Sdelphij     0x04021000L, 0x04121000L, 0x04021100L, 0x04121100L,
256296341Sdelphij     0x04021008L, 0x04121008L, 0x04021108L, 0x04121108L,
257296341Sdelphij     },
258296341Sdelphij    {
259296341Sdelphij     /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
260296341Sdelphij     0x00000000L, 0x10000000L, 0x00010000L, 0x10010000L,
261296341Sdelphij     0x00000004L, 0x10000004L, 0x00010004L, 0x10010004L,
262296341Sdelphij     0x20000000L, 0x30000000L, 0x20010000L, 0x30010000L,
263296341Sdelphij     0x20000004L, 0x30000004L, 0x20010004L, 0x30010004L,
264296341Sdelphij     0x00100000L, 0x10100000L, 0x00110000L, 0x10110000L,
265296341Sdelphij     0x00100004L, 0x10100004L, 0x00110004L, 0x10110004L,
266296341Sdelphij     0x20100000L, 0x30100000L, 0x20110000L, 0x30110000L,
267296341Sdelphij     0x20100004L, 0x30100004L, 0x20110004L, 0x30110004L,
268296341Sdelphij     0x00001000L, 0x10001000L, 0x00011000L, 0x10011000L,
269296341Sdelphij     0x00001004L, 0x10001004L, 0x00011004L, 0x10011004L,
270296341Sdelphij     0x20001000L, 0x30001000L, 0x20011000L, 0x30011000L,
271296341Sdelphij     0x20001004L, 0x30001004L, 0x20011004L, 0x30011004L,
272296341Sdelphij     0x00101000L, 0x10101000L, 0x00111000L, 0x10111000L,
273296341Sdelphij     0x00101004L, 0x10101004L, 0x00111004L, 0x10111004L,
274296341Sdelphij     0x20101000L, 0x30101000L, 0x20111000L, 0x30111000L,
275296341Sdelphij     0x20101004L, 0x30101004L, 0x20111004L, 0x30111004L,
276296341Sdelphij     },
277296341Sdelphij    {
278296341Sdelphij     /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
279296341Sdelphij     0x00000000L, 0x08000000L, 0x00000008L, 0x08000008L,
280296341Sdelphij     0x00000400L, 0x08000400L, 0x00000408L, 0x08000408L,
281296341Sdelphij     0x00020000L, 0x08020000L, 0x00020008L, 0x08020008L,
282296341Sdelphij     0x00020400L, 0x08020400L, 0x00020408L, 0x08020408L,
283296341Sdelphij     0x00000001L, 0x08000001L, 0x00000009L, 0x08000009L,
284296341Sdelphij     0x00000401L, 0x08000401L, 0x00000409L, 0x08000409L,
285296341Sdelphij     0x00020001L, 0x08020001L, 0x00020009L, 0x08020009L,
286296341Sdelphij     0x00020401L, 0x08020401L, 0x00020409L, 0x08020409L,
287296341Sdelphij     0x02000000L, 0x0A000000L, 0x02000008L, 0x0A000008L,
288296341Sdelphij     0x02000400L, 0x0A000400L, 0x02000408L, 0x0A000408L,
289296341Sdelphij     0x02020000L, 0x0A020000L, 0x02020008L, 0x0A020008L,
290296341Sdelphij     0x02020400L, 0x0A020400L, 0x02020408L, 0x0A020408L,
291296341Sdelphij     0x02000001L, 0x0A000001L, 0x02000009L, 0x0A000009L,
292296341Sdelphij     0x02000401L, 0x0A000401L, 0x02000409L, 0x0A000409L,
293296341Sdelphij     0x02020001L, 0x0A020001L, 0x02020009L, 0x0A020009L,
294296341Sdelphij     0x02020401L, 0x0A020401L, 0x02020409L, 0x0A020409L,
295296341Sdelphij     },
296296341Sdelphij    {
297296341Sdelphij     /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
298296341Sdelphij     0x00000000L, 0x00000100L, 0x00080000L, 0x00080100L,
299296341Sdelphij     0x01000000L, 0x01000100L, 0x01080000L, 0x01080100L,
300296341Sdelphij     0x00000010L, 0x00000110L, 0x00080010L, 0x00080110L,
301296341Sdelphij     0x01000010L, 0x01000110L, 0x01080010L, 0x01080110L,
302296341Sdelphij     0x00200000L, 0x00200100L, 0x00280000L, 0x00280100L,
303296341Sdelphij     0x01200000L, 0x01200100L, 0x01280000L, 0x01280100L,
304296341Sdelphij     0x00200010L, 0x00200110L, 0x00280010L, 0x00280110L,
305296341Sdelphij     0x01200010L, 0x01200110L, 0x01280010L, 0x01280110L,
306296341Sdelphij     0x00000200L, 0x00000300L, 0x00080200L, 0x00080300L,
307296341Sdelphij     0x01000200L, 0x01000300L, 0x01080200L, 0x01080300L,
308296341Sdelphij     0x00000210L, 0x00000310L, 0x00080210L, 0x00080310L,
309296341Sdelphij     0x01000210L, 0x01000310L, 0x01080210L, 0x01080310L,
310296341Sdelphij     0x00200200L, 0x00200300L, 0x00280200L, 0x00280300L,
311296341Sdelphij     0x01200200L, 0x01200300L, 0x01280200L, 0x01280300L,
312296341Sdelphij     0x00200210L, 0x00200310L, 0x00280210L, 0x00280310L,
313296341Sdelphij     0x01200210L, 0x01200310L, 0x01280210L, 0x01280310L,
314296341Sdelphij     },
315296341Sdelphij    {
316296341Sdelphij     /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
317296341Sdelphij     0x00000000L, 0x04000000L, 0x00040000L, 0x04040000L,
318296341Sdelphij     0x00000002L, 0x04000002L, 0x00040002L, 0x04040002L,
319296341Sdelphij     0x00002000L, 0x04002000L, 0x00042000L, 0x04042000L,
320296341Sdelphij     0x00002002L, 0x04002002L, 0x00042002L, 0x04042002L,
321296341Sdelphij     0x00000020L, 0x04000020L, 0x00040020L, 0x04040020L,
322296341Sdelphij     0x00000022L, 0x04000022L, 0x00040022L, 0x04040022L,
323296341Sdelphij     0x00002020L, 0x04002020L, 0x00042020L, 0x04042020L,
324296341Sdelphij     0x00002022L, 0x04002022L, 0x00042022L, 0x04042022L,
325296341Sdelphij     0x00000800L, 0x04000800L, 0x00040800L, 0x04040800L,
326296341Sdelphij     0x00000802L, 0x04000802L, 0x00040802L, 0x04040802L,
327296341Sdelphij     0x00002800L, 0x04002800L, 0x00042800L, 0x04042800L,
328296341Sdelphij     0x00002802L, 0x04002802L, 0x00042802L, 0x04042802L,
329296341Sdelphij     0x00000820L, 0x04000820L, 0x00040820L, 0x04040820L,
330296341Sdelphij     0x00000822L, 0x04000822L, 0x00040822L, 0x04040822L,
331296341Sdelphij     0x00002820L, 0x04002820L, 0x00042820L, 0x04042820L,
332296341Sdelphij     0x00002822L, 0x04002822L, 0x00042822L, 0x04042822L,
333296341Sdelphij     }
334296341Sdelphij};
33559191Skris
336109998Smarkmint DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule)
337296341Sdelphij{
338296341Sdelphij    if (DES_check_key) {
339296341Sdelphij        return DES_set_key_checked(key, schedule);
340296341Sdelphij    } else {
341296341Sdelphij        DES_set_key_unchecked(key, schedule);
342296341Sdelphij        return 0;
343296341Sdelphij    }
344296341Sdelphij}
34559191Skris
346296341Sdelphij/*-
347296341Sdelphij * return 0 if key parity is odd (correct),
34855714Skris * return -1 if key parity error,
34955714Skris * return -2 if illegal weak key.
35055714Skris */
351109998Smarkmint DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule)
352296341Sdelphij{
353296341Sdelphij    if (!DES_check_key_parity(key))
354296341Sdelphij        return (-1);
355296341Sdelphij    if (DES_is_weak_key(key))
356296341Sdelphij        return (-2);
357296341Sdelphij    DES_set_key_unchecked(key, schedule);
358296341Sdelphij    return 0;
359296341Sdelphij}
36059191Skris
361109998Smarkmvoid DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule)
362238405Sjkim#ifdef OPENSSL_FIPS
363296341Sdelphij{
364296341Sdelphij    fips_cipher_abort(DES);
365296341Sdelphij    private_DES_set_key_unchecked(key, schedule);
366296341Sdelphij}
367296341Sdelphij
368296341Sdelphijvoid private_DES_set_key_unchecked(const_DES_cblock *key,
369296341Sdelphij                                   DES_key_schedule *schedule)
370238405Sjkim#endif
371296341Sdelphij{
372296341Sdelphij    static const int shifts2[16] =
373296341Sdelphij        { 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0 };
374296341Sdelphij    register DES_LONG c, d, t, s, t2;
375296341Sdelphij    register const unsigned char *in;
376296341Sdelphij    register DES_LONG *k;
377296341Sdelphij    register int i;
37855714Skris
379109998Smarkm#ifdef OPENBSD_DEV_CRYPTO
380296341Sdelphij    memcpy(schedule->key, key, sizeof schedule->key);
381296341Sdelphij    schedule->session = NULL;
382109998Smarkm#endif
383296341Sdelphij    k = &schedule->ks->deslong[0];
384296341Sdelphij    in = &(*key)[0];
38555714Skris
386296341Sdelphij    c2l(in, c);
387296341Sdelphij    c2l(in, d);
38855714Skris
389296341Sdelphij    /*
390296341Sdelphij     * do PC1 in 47 simple operations :-) Thanks to John Fletcher
391296341Sdelphij     * (john_fletcher@lccmail.ocf.llnl.gov) for the inspiration. :-)
392296341Sdelphij     */
393296341Sdelphij    PERM_OP(d, c, t, 4, 0x0f0f0f0fL);
394296341Sdelphij    HPERM_OP(c, t, -2, 0xcccc0000L);
395296341Sdelphij    HPERM_OP(d, t, -2, 0xcccc0000L);
396296341Sdelphij    PERM_OP(d, c, t, 1, 0x55555555L);
397296341Sdelphij    PERM_OP(c, d, t, 8, 0x00ff00ffL);
398296341Sdelphij    PERM_OP(d, c, t, 1, 0x55555555L);
399296341Sdelphij    d = (((d & 0x000000ffL) << 16L) | (d & 0x0000ff00L) |
400296341Sdelphij         ((d & 0x00ff0000L) >> 16L) | ((c & 0xf0000000L) >> 4L));
401296341Sdelphij    c &= 0x0fffffffL;
40255714Skris
403296341Sdelphij    for (i = 0; i < ITERATIONS; i++) {
404296341Sdelphij        if (shifts2[i]) {
405296341Sdelphij            c = ((c >> 2L) | (c << 26L));
406296341Sdelphij            d = ((d >> 2L) | (d << 26L));
407296341Sdelphij        } else {
408296341Sdelphij            c = ((c >> 1L) | (c << 27L));
409296341Sdelphij            d = ((d >> 1L) | (d << 27L));
410296341Sdelphij        }
411296341Sdelphij        c &= 0x0fffffffL;
412296341Sdelphij        d &= 0x0fffffffL;
413296341Sdelphij        /*
414296341Sdelphij         * could be a few less shifts but I am to lazy at this point in time
415296341Sdelphij         * to investigate
416296341Sdelphij         */
417296341Sdelphij        s = des_skb[0][(c) & 0x3f] |
418296341Sdelphij            des_skb[1][((c >> 6L) & 0x03) | ((c >> 7L) & 0x3c)] |
419296341Sdelphij            des_skb[2][((c >> 13L) & 0x0f) | ((c >> 14L) & 0x30)] |
420296341Sdelphij            des_skb[3][((c >> 20L) & 0x01) | ((c >> 21L) & 0x06) |
421296341Sdelphij                       ((c >> 22L) & 0x38)];
422296341Sdelphij        t = des_skb[4][(d) & 0x3f] |
423296341Sdelphij            des_skb[5][((d >> 7L) & 0x03) | ((d >> 8L) & 0x3c)] |
424296341Sdelphij            des_skb[6][(d >> 15L) & 0x3f] |
425296341Sdelphij            des_skb[7][((d >> 21L) & 0x0f) | ((d >> 22L) & 0x30)];
42655714Skris
427296341Sdelphij        /* table contained 0213 4657 */
428296341Sdelphij        t2 = ((t << 16L) | (s & 0x0000ffffL)) & 0xffffffffL;
429296341Sdelphij        *(k++) = ROTATE(t2, 30) & 0xffffffffL;
43055714Skris
431296341Sdelphij        t2 = ((s >> 16L) | (t & 0xffff0000L));
432296341Sdelphij        *(k++) = ROTATE(t2, 26) & 0xffffffffL;
433296341Sdelphij    }
434296341Sdelphij}
43555714Skris
436109998Smarkmint DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule)
437296341Sdelphij{
438296341Sdelphij    return (DES_set_key(key, schedule));
439296341Sdelphij}
440296341Sdelphij
441296341Sdelphij/*-
44259191Skris#undef des_fixup_key_parity
44359191Skrisvoid des_fixup_key_parity(des_cblock *key)
444296341Sdelphij        {
445296341Sdelphij        des_set_odd_parity(key);
446296341Sdelphij        }
447109998Smarkm*/
448