~ubuntu-branches/ubuntu/maverick/openssl/maverick

« back to all changes in this revision

Viewing changes to fips/des/fips_set_key.c

  • Committer: Bazaar Package Importer
  • Author(s): Christoph Martin
  • Date: 2004-12-16 18:41:29 UTC
  • mto: (11.1.1 lenny)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20041216184129-z7xjkul57mh1jiha
Tags: upstream-0.9.7e
ImportĀ upstreamĀ versionĀ 0.9.7e

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* crypto/des/set_key.c */
 
2
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
 
3
 * All rights reserved.
 
4
 *
 
5
 * This package is an SSL implementation written
 
6
 * by Eric Young (eay@cryptsoft.com).
 
7
 * The implementation was written so as to conform with Netscapes SSL.
 
8
 * 
 
9
 * This library is free for commercial and non-commercial use as long as
 
10
 * the following conditions are aheared to.  The following conditions
 
11
 * apply to all code found in this distribution, be it the RC4, RSA,
 
12
 * lhash, DES, etc., code; not just the SSL code.  The SSL documentation
 
13
 * included with this distribution is covered by the same copyright terms
 
14
 * except that the holder is Tim Hudson (tjh@cryptsoft.com).
 
15
 * 
 
16
 * Copyright remains Eric Young's, and as such any Copyright notices in
 
17
 * the code are not to be removed.
 
18
 * If this package is used in a product, Eric Young should be given attribution
 
19
 * as the author of the parts of the library used.
 
20
 * This can be in the form of a textual message at program startup or
 
21
 * in documentation (online or textual) provided with the package.
 
22
 * 
 
23
 * Redistribution and use in source and binary forms, with or without
 
24
 * modification, are permitted provided that the following conditions
 
25
 * are met:
 
26
 * 1. Redistributions of source code must retain the copyright
 
27
 *    notice, this list of conditions and the following disclaimer.
 
28
 * 2. Redistributions in binary form must reproduce the above copyright
 
29
 *    notice, this list of conditions and the following disclaimer in the
 
30
 *    documentation and/or other materials provided with the distribution.
 
31
 * 3. All advertising materials mentioning features or use of this software
 
32
 *    must display the following acknowledgement:
 
33
 *    "This product includes cryptographic software written by
 
34
 *     Eric Young (eay@cryptsoft.com)"
 
35
 *    The word 'cryptographic' can be left out if the rouines from the library
 
36
 *    being used are not cryptographic related :-).
 
37
 * 4. If you include any Windows specific code (or a derivative thereof) from 
 
38
 *    the apps directory (application code) you must include an acknowledgement:
 
39
 *    "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
 
40
 * 
 
41
 * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
 
42
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 
43
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
44
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 
45
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 
46
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 
47
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 
48
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 
49
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 
50
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 
51
 * SUCH DAMAGE.
 
52
 * 
 
53
 * The licence and distribution terms for any publically available version or
 
54
 * derivative of this code cannot be changed.  i.e. this code cannot simply be
 
55
 * copied and put under another distribution licence
 
56
 * [including the GNU Public Licence.]
 
57
 */
 
58
 
 
59
/* set_key.c v 1.4 eay 24/9/91
 
60
 * 1.4 Speed up by 400% :-)
 
61
 * 1.3 added register declarations.
 
62
 * 1.2 unrolled make_key_sched a bit more
 
63
 * 1.1 added norm_expand_bits
 
64
 * 1.0 First working version
 
65
 */
 
66
#include "fips_des_locl.h"
 
67
#include <openssl/fips.h>
 
68
 
 
69
#ifdef OPENSSL_FIPS
 
70
 
 
71
OPENSSL_IMPLEMENT_GLOBAL(int,DES_check_key);    /* defaults to false */
 
72
 
 
73
static const unsigned char odd_parity[256]={
 
74
  1,  1,  2,  2,  4,  4,  7,  7,  8,  8, 11, 11, 13, 13, 14, 14,
 
75
 16, 16, 19, 19, 21, 21, 22, 22, 25, 25, 26, 26, 28, 28, 31, 31,
 
76
 32, 32, 35, 35, 37, 37, 38, 38, 41, 41, 42, 42, 44, 44, 47, 47,
 
77
 49, 49, 50, 50, 52, 52, 55, 55, 56, 56, 59, 59, 61, 61, 62, 62,
 
78
 64, 64, 67, 67, 69, 69, 70, 70, 73, 73, 74, 74, 76, 76, 79, 79,
 
79
 81, 81, 82, 82, 84, 84, 87, 87, 88, 88, 91, 91, 93, 93, 94, 94,
 
80
 97, 97, 98, 98,100,100,103,103,104,104,107,107,109,109,110,110,
 
81
112,112,115,115,117,117,118,118,121,121,122,122,124,124,127,127,
 
82
128,128,131,131,133,133,134,134,137,137,138,138,140,140,143,143,
 
83
145,145,146,146,148,148,151,151,152,152,155,155,157,157,158,158,
 
84
161,161,162,162,164,164,167,167,168,168,171,171,173,173,174,174,
 
85
176,176,179,179,181,181,182,182,185,185,186,186,188,188,191,191,
 
86
193,193,194,194,196,196,199,199,200,200,203,203,205,205,206,206,
 
87
208,208,211,211,213,213,214,214,217,217,218,218,220,220,223,223,
 
88
224,224,227,227,229,229,230,230,233,233,234,234,236,236,239,239,
 
89
241,241,242,242,244,244,247,247,248,248,251,251,253,253,254,254};
 
90
 
 
91
void DES_set_odd_parity(DES_cblock *key)
 
92
        {
 
93
        int i;
 
94
 
 
95
        for (i=0; i<DES_KEY_SZ; i++)
 
96
                (*key)[i]=odd_parity[(*key)[i]];
 
97
        }
 
98
 
 
99
int DES_check_key_parity(const_DES_cblock *key)
 
100
        {
 
101
        int i;
 
102
 
 
103
        for (i=0; i<DES_KEY_SZ; i++)
 
104
                {
 
105
                if ((*key)[i] != odd_parity[(*key)[i]])
 
106
                        return(0);
 
107
                }
 
108
        return(1);
 
109
        }
 
110
 
 
111
/* Weak and semi week keys as take from
 
112
 * %A D.W. Davies
 
113
 * %A W.L. Price
 
114
 * %T Security for Computer Networks
 
115
 * %I John Wiley & Sons
 
116
 * %D 1984
 
117
 * Many thanks to smb@ulysses.att.com (Steven Bellovin) for the reference
 
118
 * (and actual cblock values).
 
119
 */
 
120
#define NUM_WEAK_KEY    16
 
121
static DES_cblock weak_keys[NUM_WEAK_KEY]={
 
122
        /* weak keys */
 
123
        {0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01},
 
124
        {0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE},
 
125
        {0x1F,0x1F,0x1F,0x1F,0x0E,0x0E,0x0E,0x0E},
 
126
        {0xE0,0xE0,0xE0,0xE0,0xF1,0xF1,0xF1,0xF1},
 
127
        /* semi-weak keys */
 
128
        {0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE},
 
129
        {0xFE,0x01,0xFE,0x01,0xFE,0x01,0xFE,0x01},
 
130
        {0x1F,0xE0,0x1F,0xE0,0x0E,0xF1,0x0E,0xF1},
 
131
        {0xE0,0x1F,0xE0,0x1F,0xF1,0x0E,0xF1,0x0E},
 
132
        {0x01,0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1},
 
133
        {0xE0,0x01,0xE0,0x01,0xF1,0x01,0xF1,0x01},
 
134
        {0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E,0xFE},
 
135
        {0xFE,0x1F,0xFE,0x1F,0xFE,0x0E,0xFE,0x0E},
 
136
        {0x01,0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E},
 
137
        {0x1F,0x01,0x1F,0x01,0x0E,0x01,0x0E,0x01},
 
138
        {0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1,0xFE},
 
139
        {0xFE,0xE0,0xFE,0xE0,0xFE,0xF1,0xFE,0xF1}};
 
140
 
 
141
int DES_is_weak_key(const_DES_cblock *key)
 
142
        {
 
143
        int i;
 
144
 
 
145
        for (i=0; i<NUM_WEAK_KEY; i++)
 
146
                /* Added == 0 to comparison, I obviously don't run
 
147
                 * this section very often :-(, thanks to
 
148
                 * engineering@MorningStar.Com for the fix
 
149
                 * eay 93/06/29
 
150
                 * Another problem, I was comparing only the first 4
 
151
                 * bytes, 97/03/18 */
 
152
                if (memcmp(weak_keys[i],key,sizeof(DES_cblock)) == 0) return(1);
 
153
        return(0);
 
154
        }
 
155
 
 
156
/* NOW DEFINED IN des_local.h
 
157
 * See ecb_encrypt.c for a pseudo description of these macros. 
 
158
 * #define PERM_OP(a,b,t,n,m) ((t)=((((a)>>(n))^(b))&(m)),\
 
159
 *      (b)^=(t),\
 
160
 *      (a)=((a)^((t)<<(n))))
 
161
 */
 
162
 
 
163
#define HPERM_OP(a,t,n,m) ((t)=((((a)<<(16-(n)))^(a))&(m)),\
 
164
        (a)=(a)^(t)^(t>>(16-(n))))
 
165
 
 
166
static const DES_LONG des_skb[8][64]={
 
167
        {
 
168
        /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
 
169
        0x00000000L,0x00000010L,0x20000000L,0x20000010L,
 
170
        0x00010000L,0x00010010L,0x20010000L,0x20010010L,
 
171
        0x00000800L,0x00000810L,0x20000800L,0x20000810L,
 
172
        0x00010800L,0x00010810L,0x20010800L,0x20010810L,
 
173
        0x00000020L,0x00000030L,0x20000020L,0x20000030L,
 
174
        0x00010020L,0x00010030L,0x20010020L,0x20010030L,
 
175
        0x00000820L,0x00000830L,0x20000820L,0x20000830L,
 
176
        0x00010820L,0x00010830L,0x20010820L,0x20010830L,
 
177
        0x00080000L,0x00080010L,0x20080000L,0x20080010L,
 
178
        0x00090000L,0x00090010L,0x20090000L,0x20090010L,
 
179
        0x00080800L,0x00080810L,0x20080800L,0x20080810L,
 
180
        0x00090800L,0x00090810L,0x20090800L,0x20090810L,
 
181
        0x00080020L,0x00080030L,0x20080020L,0x20080030L,
 
182
        0x00090020L,0x00090030L,0x20090020L,0x20090030L,
 
183
        0x00080820L,0x00080830L,0x20080820L,0x20080830L,
 
184
        0x00090820L,0x00090830L,0x20090820L,0x20090830L,
 
185
        },{
 
186
        /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */
 
187
        0x00000000L,0x02000000L,0x00002000L,0x02002000L,
 
188
        0x00200000L,0x02200000L,0x00202000L,0x02202000L,
 
189
        0x00000004L,0x02000004L,0x00002004L,0x02002004L,
 
190
        0x00200004L,0x02200004L,0x00202004L,0x02202004L,
 
191
        0x00000400L,0x02000400L,0x00002400L,0x02002400L,
 
192
        0x00200400L,0x02200400L,0x00202400L,0x02202400L,
 
193
        0x00000404L,0x02000404L,0x00002404L,0x02002404L,
 
194
        0x00200404L,0x02200404L,0x00202404L,0x02202404L,
 
195
        0x10000000L,0x12000000L,0x10002000L,0x12002000L,
 
196
        0x10200000L,0x12200000L,0x10202000L,0x12202000L,
 
197
        0x10000004L,0x12000004L,0x10002004L,0x12002004L,
 
198
        0x10200004L,0x12200004L,0x10202004L,0x12202004L,
 
199
        0x10000400L,0x12000400L,0x10002400L,0x12002400L,
 
200
        0x10200400L,0x12200400L,0x10202400L,0x12202400L,
 
201
        0x10000404L,0x12000404L,0x10002404L,0x12002404L,
 
202
        0x10200404L,0x12200404L,0x10202404L,0x12202404L,
 
203
        },{
 
204
        /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */
 
205
        0x00000000L,0x00000001L,0x00040000L,0x00040001L,
 
206
        0x01000000L,0x01000001L,0x01040000L,0x01040001L,
 
207
        0x00000002L,0x00000003L,0x00040002L,0x00040003L,
 
208
        0x01000002L,0x01000003L,0x01040002L,0x01040003L,
 
209
        0x00000200L,0x00000201L,0x00040200L,0x00040201L,
 
210
        0x01000200L,0x01000201L,0x01040200L,0x01040201L,
 
211
        0x00000202L,0x00000203L,0x00040202L,0x00040203L,
 
212
        0x01000202L,0x01000203L,0x01040202L,0x01040203L,
 
213
        0x08000000L,0x08000001L,0x08040000L,0x08040001L,
 
214
        0x09000000L,0x09000001L,0x09040000L,0x09040001L,
 
215
        0x08000002L,0x08000003L,0x08040002L,0x08040003L,
 
216
        0x09000002L,0x09000003L,0x09040002L,0x09040003L,
 
217
        0x08000200L,0x08000201L,0x08040200L,0x08040201L,
 
218
        0x09000200L,0x09000201L,0x09040200L,0x09040201L,
 
219
        0x08000202L,0x08000203L,0x08040202L,0x08040203L,
 
220
        0x09000202L,0x09000203L,0x09040202L,0x09040203L,
 
221
        },{
 
222
        /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */
 
223
        0x00000000L,0x00100000L,0x00000100L,0x00100100L,
 
224
        0x00000008L,0x00100008L,0x00000108L,0x00100108L,
 
225
        0x00001000L,0x00101000L,0x00001100L,0x00101100L,
 
226
        0x00001008L,0x00101008L,0x00001108L,0x00101108L,
 
227
        0x04000000L,0x04100000L,0x04000100L,0x04100100L,
 
228
        0x04000008L,0x04100008L,0x04000108L,0x04100108L,
 
229
        0x04001000L,0x04101000L,0x04001100L,0x04101100L,
 
230
        0x04001008L,0x04101008L,0x04001108L,0x04101108L,
 
231
        0x00020000L,0x00120000L,0x00020100L,0x00120100L,
 
232
        0x00020008L,0x00120008L,0x00020108L,0x00120108L,
 
233
        0x00021000L,0x00121000L,0x00021100L,0x00121100L,
 
234
        0x00021008L,0x00121008L,0x00021108L,0x00121108L,
 
235
        0x04020000L,0x04120000L,0x04020100L,0x04120100L,
 
236
        0x04020008L,0x04120008L,0x04020108L,0x04120108L,
 
237
        0x04021000L,0x04121000L,0x04021100L,0x04121100L,
 
238
        0x04021008L,0x04121008L,0x04021108L,0x04121108L,
 
239
        },{
 
240
        /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */
 
241
        0x00000000L,0x10000000L,0x00010000L,0x10010000L,
 
242
        0x00000004L,0x10000004L,0x00010004L,0x10010004L,
 
243
        0x20000000L,0x30000000L,0x20010000L,0x30010000L,
 
244
        0x20000004L,0x30000004L,0x20010004L,0x30010004L,
 
245
        0x00100000L,0x10100000L,0x00110000L,0x10110000L,
 
246
        0x00100004L,0x10100004L,0x00110004L,0x10110004L,
 
247
        0x20100000L,0x30100000L,0x20110000L,0x30110000L,
 
248
        0x20100004L,0x30100004L,0x20110004L,0x30110004L,
 
249
        0x00001000L,0x10001000L,0x00011000L,0x10011000L,
 
250
        0x00001004L,0x10001004L,0x00011004L,0x10011004L,
 
251
        0x20001000L,0x30001000L,0x20011000L,0x30011000L,
 
252
        0x20001004L,0x30001004L,0x20011004L,0x30011004L,
 
253
        0x00101000L,0x10101000L,0x00111000L,0x10111000L,
 
254
        0x00101004L,0x10101004L,0x00111004L,0x10111004L,
 
255
        0x20101000L,0x30101000L,0x20111000L,0x30111000L,
 
256
        0x20101004L,0x30101004L,0x20111004L,0x30111004L,
 
257
        },{
 
258
        /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */
 
259
        0x00000000L,0x08000000L,0x00000008L,0x08000008L,
 
260
        0x00000400L,0x08000400L,0x00000408L,0x08000408L,
 
261
        0x00020000L,0x08020000L,0x00020008L,0x08020008L,
 
262
        0x00020400L,0x08020400L,0x00020408L,0x08020408L,
 
263
        0x00000001L,0x08000001L,0x00000009L,0x08000009L,
 
264
        0x00000401L,0x08000401L,0x00000409L,0x08000409L,
 
265
        0x00020001L,0x08020001L,0x00020009L,0x08020009L,
 
266
        0x00020401L,0x08020401L,0x00020409L,0x08020409L,
 
267
        0x02000000L,0x0A000000L,0x02000008L,0x0A000008L,
 
268
        0x02000400L,0x0A000400L,0x02000408L,0x0A000408L,
 
269
        0x02020000L,0x0A020000L,0x02020008L,0x0A020008L,
 
270
        0x02020400L,0x0A020400L,0x02020408L,0x0A020408L,
 
271
        0x02000001L,0x0A000001L,0x02000009L,0x0A000009L,
 
272
        0x02000401L,0x0A000401L,0x02000409L,0x0A000409L,
 
273
        0x02020001L,0x0A020001L,0x02020009L,0x0A020009L,
 
274
        0x02020401L,0x0A020401L,0x02020409L,0x0A020409L,
 
275
        },{
 
276
        /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */
 
277
        0x00000000L,0x00000100L,0x00080000L,0x00080100L,
 
278
        0x01000000L,0x01000100L,0x01080000L,0x01080100L,
 
279
        0x00000010L,0x00000110L,0x00080010L,0x00080110L,
 
280
        0x01000010L,0x01000110L,0x01080010L,0x01080110L,
 
281
        0x00200000L,0x00200100L,0x00280000L,0x00280100L,
 
282
        0x01200000L,0x01200100L,0x01280000L,0x01280100L,
 
283
        0x00200010L,0x00200110L,0x00280010L,0x00280110L,
 
284
        0x01200010L,0x01200110L,0x01280010L,0x01280110L,
 
285
        0x00000200L,0x00000300L,0x00080200L,0x00080300L,
 
286
        0x01000200L,0x01000300L,0x01080200L,0x01080300L,
 
287
        0x00000210L,0x00000310L,0x00080210L,0x00080310L,
 
288
        0x01000210L,0x01000310L,0x01080210L,0x01080310L,
 
289
        0x00200200L,0x00200300L,0x00280200L,0x00280300L,
 
290
        0x01200200L,0x01200300L,0x01280200L,0x01280300L,
 
291
        0x00200210L,0x00200310L,0x00280210L,0x00280310L,
 
292
        0x01200210L,0x01200310L,0x01280210L,0x01280310L,
 
293
        },{
 
294
        /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */
 
295
        0x00000000L,0x04000000L,0x00040000L,0x04040000L,
 
296
        0x00000002L,0x04000002L,0x00040002L,0x04040002L,
 
297
        0x00002000L,0x04002000L,0x00042000L,0x04042000L,
 
298
        0x00002002L,0x04002002L,0x00042002L,0x04042002L,
 
299
        0x00000020L,0x04000020L,0x00040020L,0x04040020L,
 
300
        0x00000022L,0x04000022L,0x00040022L,0x04040022L,
 
301
        0x00002020L,0x04002020L,0x00042020L,0x04042020L,
 
302
        0x00002022L,0x04002022L,0x00042022L,0x04042022L,
 
303
        0x00000800L,0x04000800L,0x00040800L,0x04040800L,
 
304
        0x00000802L,0x04000802L,0x00040802L,0x04040802L,
 
305
        0x00002800L,0x04002800L,0x00042800L,0x04042800L,
 
306
        0x00002802L,0x04002802L,0x00042802L,0x04042802L,
 
307
        0x00000820L,0x04000820L,0x00040820L,0x04040820L,
 
308
        0x00000822L,0x04000822L,0x00040822L,0x04040822L,
 
309
        0x00002820L,0x04002820L,0x00042820L,0x04042820L,
 
310
        0x00002822L,0x04002822L,0x00042822L,0x04042822L,
 
311
        }};
 
312
 
 
313
int DES_set_key(const_DES_cblock *key, DES_key_schedule *schedule)
 
314
        {
 
315
        if (FIPS_selftest_failed())
 
316
                return -3;
 
317
        if (DES_check_key)
 
318
                {
 
319
                return DES_set_key_checked(key, schedule);
 
320
                }
 
321
        else
 
322
                {
 
323
                DES_set_key_unchecked(key, schedule);
 
324
                return 0;
 
325
                }
 
326
        }
 
327
 
 
328
/* return 0 if key parity is odd (correct),
 
329
 * return -1 if key parity error,
 
330
 * return -2 if illegal weak key.
 
331
 */
 
332
int DES_set_key_checked(const_DES_cblock *key, DES_key_schedule *schedule)
 
333
        {
 
334
        if (!DES_check_key_parity(key))
 
335
                return(-1);
 
336
        if (DES_is_weak_key(key))
 
337
                return(-2);
 
338
        if (FIPS_selftest_failed())
 
339
                return -3;
 
340
 
 
341
        DES_set_key_unchecked(key, schedule);
 
342
        return 0;
 
343
        }
 
344
 
 
345
void DES_set_key_unchecked(const_DES_cblock *key, DES_key_schedule *schedule)
 
346
        {
 
347
        static int shifts2[16]={0,0,1,1,1,1,1,1,0,1,1,1,1,1,1,0};
 
348
        register DES_LONG c,d,t,s,t2;
 
349
        register const unsigned char *in;
 
350
        register DES_LONG *k;
 
351
        register int i;
 
352
 
 
353
#ifdef OPENBSD_DEV_CRYPTO
 
354
        memcpy(schedule->key,key,sizeof schedule->key);
 
355
        schedule->session=NULL;
 
356
#endif
 
357
        k = &schedule->ks->deslong[0];
 
358
        in = &(*key)[0];
 
359
 
 
360
        c2l(in,c);
 
361
        c2l(in,d);
 
362
 
 
363
        /* do PC1 in 47 simple operations :-)
 
364
         * Thanks to John Fletcher (john_fletcher@lccmail.ocf.llnl.gov)
 
365
         * for the inspiration. :-) */
 
366
        PERM_OP (d,c,t,4,0x0f0f0f0fL);
 
367
        HPERM_OP(c,t,-2,0xcccc0000L);
 
368
        HPERM_OP(d,t,-2,0xcccc0000L);
 
369
        PERM_OP (d,c,t,1,0x55555555L);
 
370
        PERM_OP (c,d,t,8,0x00ff00ffL);
 
371
        PERM_OP (d,c,t,1,0x55555555L);
 
372
        d=      (((d&0x000000ffL)<<16L)| (d&0x0000ff00L)     |
 
373
                 ((d&0x00ff0000L)>>16L)|((c&0xf0000000L)>>4L));
 
374
        c&=0x0fffffffL;
 
375
 
 
376
        for (i=0; i<ITERATIONS; i++)
 
377
                {
 
378
                if (shifts2[i])
 
379
                        { c=((c>>2L)|(c<<26L)); d=((d>>2L)|(d<<26L)); }
 
380
                else
 
381
                        { c=((c>>1L)|(c<<27L)); d=((d>>1L)|(d<<27L)); }
 
382
                c&=0x0fffffffL;
 
383
                d&=0x0fffffffL;
 
384
                /* could be a few less shifts but I am to lazy at this
 
385
                 * point in time to investigate */
 
386
                s=      des_skb[0][ (c    )&0x3f                ]|
 
387
                        des_skb[1][((c>> 6L)&0x03)|((c>> 7L)&0x3c)]|
 
388
                        des_skb[2][((c>>13L)&0x0f)|((c>>14L)&0x30)]|
 
389
                        des_skb[3][((c>>20L)&0x01)|((c>>21L)&0x06) |
 
390
                                                  ((c>>22L)&0x38)];
 
391
                t=      des_skb[4][ (d    )&0x3f                ]|
 
392
                        des_skb[5][((d>> 7L)&0x03)|((d>> 8L)&0x3c)]|
 
393
                        des_skb[6][ (d>>15L)&0x3f                ]|
 
394
                        des_skb[7][((d>>21L)&0x0f)|((d>>22L)&0x30)];
 
395
 
 
396
                /* table contained 0213 4657 */
 
397
                t2=((t<<16L)|(s&0x0000ffffL))&0xffffffffL;
 
398
                *(k++)=ROTATE(t2,30)&0xffffffffL;
 
399
 
 
400
                t2=((s>>16L)|(t&0xffff0000L));
 
401
                *(k++)=ROTATE(t2,26)&0xffffffffL;
 
402
                }
 
403
        }
 
404
 
 
405
int DES_key_sched(const_DES_cblock *key, DES_key_schedule *schedule)
 
406
        {
 
407
        return(DES_set_key(key,schedule));
 
408
        }
 
409
/*
 
410
#undef des_fixup_key_parity
 
411
void des_fixup_key_parity(des_cblock *key)
 
412
        {
 
413
        des_set_odd_parity(key);
 
414
        }
 
415
*/
 
416
 
 
417
#endif /* def OPENSSL_FIPS */