]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/blob - crypto/des.c
[CRYPTO] Remove unused iv field from context structure
[linux-2.6-omap-h63xx.git] / crypto / des.c
1 /* 
2  * Cryptographic API.
3  *
4  * DES & Triple DES EDE Cipher Algorithms.
5  *
6  * Originally released as descore by Dana L. How <how@isl.stanford.edu>.
7  * Modified by Raimar Falke <rf13@inf.tu-dresden.de> for the Linux-Kernel.
8  * Derived from Cryptoapi and Nettle implementations, adapted for in-place
9  * scatterlist interface.  Changed LGPL to GPL per section 3 of the LGPL.
10  *
11  * Copyright (c) 1992 Dana L. How.
12  * Copyright (c) Raimar Falke <rf13@inf.tu-dresden.de> 
13  * Copyright (c) Gisle Sælensminde <gisle@ii.uib.no>
14  * Copyright (C) 2001 Niels Möller.
15  * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
16  *
17  * This program is free software; you can redistribute it and/or modify
18  * it under the terms of the GNU General Public License as published by
19  * the Free Software Foundation; either version 2 of the License, or
20  * (at your option) any later version.
21  *
22  */
23 #include <linux/init.h>
24 #include <linux/module.h>
25 #include <linux/mm.h>
26 #include <linux/errno.h>
27 #include <asm/scatterlist.h>
28 #include <linux/crypto.h>
29
30 #define DES_KEY_SIZE            8
31 #define DES_EXPKEY_WORDS        32
32 #define DES_BLOCK_SIZE          8
33
34 #define DES3_EDE_KEY_SIZE       (3 * DES_KEY_SIZE)
35 #define DES3_EDE_EXPKEY_WORDS   (3 * DES_EXPKEY_WORDS)
36 #define DES3_EDE_BLOCK_SIZE     DES_BLOCK_SIZE
37
38 #define ROR(d,c,o)      ((d) = (d) >> (c) | (d) << (o))
39
40 struct des_ctx {
41         u32 expkey[DES_EXPKEY_WORDS];
42 };
43
44 struct des3_ede_ctx {
45         u32 expkey[DES3_EDE_EXPKEY_WORDS];
46 };
47
48 static const u32 des_keymap[] = {
49         0x02080008, 0x02082000, 0x00002008, 0x00000000,
50         0x02002000, 0x00080008, 0x02080000, 0x02082008,
51         0x00000008, 0x02000000, 0x00082000, 0x00002008,
52         0x00082008, 0x02002008, 0x02000008, 0x02080000,
53         0x00002000, 0x00082008, 0x00080008, 0x02002000,
54         0x02082008, 0x02000008, 0x00000000, 0x00082000,
55         0x02000000, 0x00080000, 0x02002008, 0x02080008,
56         0x00080000, 0x00002000, 0x02082000, 0x00000008,
57         0x00080000, 0x00002000, 0x02000008, 0x02082008,
58         0x00002008, 0x02000000, 0x00000000, 0x00082000,
59         0x02080008, 0x02002008, 0x02002000, 0x00080008,
60         0x02082000, 0x00000008, 0x00080008, 0x02002000,
61         0x02082008, 0x00080000, 0x02080000, 0x02000008,
62         0x00082000, 0x00002008, 0x02002008, 0x02080000,
63         0x00000008, 0x02082000, 0x00082008, 0x00000000,
64         0x02000000, 0x02080008, 0x00002000, 0x00082008,
65
66         0x08000004, 0x00020004, 0x00000000, 0x08020200,
67         0x00020004, 0x00000200, 0x08000204, 0x00020000,
68         0x00000204, 0x08020204, 0x00020200, 0x08000000,
69         0x08000200, 0x08000004, 0x08020000, 0x00020204,
70         0x00020000, 0x08000204, 0x08020004, 0x00000000,
71         0x00000200, 0x00000004, 0x08020200, 0x08020004,
72         0x08020204, 0x08020000, 0x08000000, 0x00000204,
73         0x00000004, 0x00020200, 0x00020204, 0x08000200,
74         0x00000204, 0x08000000, 0x08000200, 0x00020204,
75         0x08020200, 0x00020004, 0x00000000, 0x08000200,
76         0x08000000, 0x00000200, 0x08020004, 0x00020000,
77         0x00020004, 0x08020204, 0x00020200, 0x00000004,
78         0x08020204, 0x00020200, 0x00020000, 0x08000204,
79         0x08000004, 0x08020000, 0x00020204, 0x00000000,
80         0x00000200, 0x08000004, 0x08000204, 0x08020200,
81         0x08020000, 0x00000204, 0x00000004, 0x08020004,
82
83         0x80040100, 0x01000100, 0x80000000, 0x81040100,
84         0x00000000, 0x01040000, 0x81000100, 0x80040000,
85         0x01040100, 0x81000000, 0x01000000, 0x80000100,
86         0x81000000, 0x80040100, 0x00040000, 0x01000000,
87         0x81040000, 0x00040100, 0x00000100, 0x80000000,
88         0x00040100, 0x81000100, 0x01040000, 0x00000100,
89         0x80000100, 0x00000000, 0x80040000, 0x01040100,
90         0x01000100, 0x81040000, 0x81040100, 0x00040000,
91         0x81040000, 0x80000100, 0x00040000, 0x81000000,
92         0x00040100, 0x01000100, 0x80000000, 0x01040000,
93         0x81000100, 0x00000000, 0x00000100, 0x80040000,
94         0x00000000, 0x81040000, 0x01040100, 0x00000100,
95         0x01000000, 0x81040100, 0x80040100, 0x00040000,
96         0x81040100, 0x80000000, 0x01000100, 0x80040100,
97         0x80040000, 0x00040100, 0x01040000, 0x81000100,
98         0x80000100, 0x01000000, 0x81000000, 0x01040100,
99
100         0x04010801, 0x00000000, 0x00010800, 0x04010000,
101         0x04000001, 0x00000801, 0x04000800, 0x00010800,
102         0x00000800, 0x04010001, 0x00000001, 0x04000800,
103         0x00010001, 0x04010800, 0x04010000, 0x00000001,
104         0x00010000, 0x04000801, 0x04010001, 0x00000800,
105         0x00010801, 0x04000000, 0x00000000, 0x00010001,
106         0x04000801, 0x00010801, 0x04010800, 0x04000001,
107         0x04000000, 0x00010000, 0x00000801, 0x04010801,
108         0x00010001, 0x04010800, 0x04000800, 0x00010801,
109         0x04010801, 0x00010001, 0x04000001, 0x00000000,
110         0x04000000, 0x00000801, 0x00010000, 0x04010001,
111         0x00000800, 0x04000000, 0x00010801, 0x04000801,
112         0x04010800, 0x00000800, 0x00000000, 0x04000001,
113         0x00000001, 0x04010801, 0x00010800, 0x04010000,
114         0x04010001, 0x00010000, 0x00000801, 0x04000800,
115         0x04000801, 0x00000001, 0x04010000, 0x00010800,
116
117         0x00000400, 0x00000020, 0x00100020, 0x40100000,
118         0x40100420, 0x40000400, 0x00000420, 0x00000000,
119         0x00100000, 0x40100020, 0x40000020, 0x00100400,
120         0x40000000, 0x00100420, 0x00100400, 0x40000020,
121         0x40100020, 0x00000400, 0x40000400, 0x40100420,
122         0x00000000, 0x00100020, 0x40100000, 0x00000420,
123         0x40100400, 0x40000420, 0x00100420, 0x40000000,
124         0x40000420, 0x40100400, 0x00000020, 0x00100000,
125         0x40000420, 0x00100400, 0x40100400, 0x40000020,
126         0x00000400, 0x00000020, 0x00100000, 0x40100400,
127         0x40100020, 0x40000420, 0x00000420, 0x00000000,
128         0x00000020, 0x40100000, 0x40000000, 0x00100020,
129         0x00000000, 0x40100020, 0x00100020, 0x00000420,
130         0x40000020, 0x00000400, 0x40100420, 0x00100000,
131         0x00100420, 0x40000000, 0x40000400, 0x40100420,
132         0x40100000, 0x00100420, 0x00100400, 0x40000400,
133
134         0x00800000, 0x00001000, 0x00000040, 0x00801042,
135         0x00801002, 0x00800040, 0x00001042, 0x00801000,
136         0x00001000, 0x00000002, 0x00800002, 0x00001040,
137         0x00800042, 0x00801002, 0x00801040, 0x00000000,
138         0x00001040, 0x00800000, 0x00001002, 0x00000042,
139         0x00800040, 0x00001042, 0x00000000, 0x00800002,
140         0x00000002, 0x00800042, 0x00801042, 0x00001002,
141         0x00801000, 0x00000040, 0x00000042, 0x00801040,
142         0x00801040, 0x00800042, 0x00001002, 0x00801000,
143         0x00001000, 0x00000002, 0x00800002, 0x00800040,
144         0x00800000, 0x00001040, 0x00801042, 0x00000000,
145         0x00001042, 0x00800000, 0x00000040, 0x00001002,
146         0x00800042, 0x00000040, 0x00000000, 0x00801042,
147         0x00801002, 0x00801040, 0x00000042, 0x00001000,
148         0x00001040, 0x00801002, 0x00800040, 0x00000042,
149         0x00000002, 0x00001042, 0x00801000, 0x00800002,
150
151         0x10400000, 0x00404010, 0x00000010, 0x10400010,
152         0x10004000, 0x00400000, 0x10400010, 0x00004010,
153         0x00400010, 0x00004000, 0x00404000, 0x10000000,
154         0x10404010, 0x10000010, 0x10000000, 0x10404000,
155         0x00000000, 0x10004000, 0x00404010, 0x00000010,
156         0x10000010, 0x10404010, 0x00004000, 0x10400000,
157         0x10404000, 0x00400010, 0x10004010, 0x00404000,
158         0x00004010, 0x00000000, 0x00400000, 0x10004010,
159         0x00404010, 0x00000010, 0x10000000, 0x00004000,
160         0x10000010, 0x10004000, 0x00404000, 0x10400010,
161         0x00000000, 0x00404010, 0x00004010, 0x10404000,
162         0x10004000, 0x00400000, 0x10404010, 0x10000000,
163         0x10004010, 0x10400000, 0x00400000, 0x10404010,
164         0x00004000, 0x00400010, 0x10400010, 0x00004010,
165         0x00400010, 0x00000000, 0x10404000, 0x10000010,
166         0x10400000, 0x10004010, 0x00000010, 0x00404000,
167
168         0x00208080, 0x00008000, 0x20200000, 0x20208080,
169         0x00200000, 0x20008080, 0x20008000, 0x20200000,
170         0x20008080, 0x00208080, 0x00208000, 0x20000080,
171         0x20200080, 0x00200000, 0x00000000, 0x20008000,
172         0x00008000, 0x20000000, 0x00200080, 0x00008080,
173         0x20208080, 0x00208000, 0x20000080, 0x00200080,
174         0x20000000, 0x00000080, 0x00008080, 0x20208000,
175         0x00000080, 0x20200080, 0x20208000, 0x00000000,
176         0x00000000, 0x20208080, 0x00200080, 0x20008000,
177         0x00208080, 0x00008000, 0x20000080, 0x00200080,
178         0x20208000, 0x00000080, 0x00008080, 0x20200000,
179         0x20008080, 0x20000000, 0x20200000, 0x00208000,
180         0x20208080, 0x00008080, 0x00208000, 0x20200080,
181         0x00200000, 0x20000080, 0x20008000, 0x00000000,
182         0x00008000, 0x00200000, 0x20200080, 0x00208080,
183         0x20000000, 0x20208000, 0x00000080, 0x20008080,
184 };
185
186 static const u8 rotors[] = {
187         34, 13,  5, 46, 47, 18, 32, 41, 11, 53, 33, 20,
188         14, 36, 30, 24, 49,  2, 15, 37, 42, 50,  0, 21,
189         38, 48,  6, 26, 39,  4, 52, 25, 12, 27, 31, 40,
190         1, 17, 28, 29, 23, 51, 35,  7,  3, 22,  9, 43,
191
192         41, 20, 12, 53, 54, 25, 39, 48, 18, 31, 40, 27,
193         21, 43, 37,  0,  1,  9, 22, 44, 49,  2,  7, 28,
194         45, 55, 13, 33, 46, 11,  6, 32, 19, 34, 38, 47,
195         8, 24, 35, 36, 30,  3, 42, 14, 10, 29, 16, 50,
196
197         55, 34, 26, 38, 11, 39, 53,  5, 32, 45, 54, 41,
198         35,  2, 51, 14, 15, 23, 36,  3,  8, 16, 21, 42,
199         6, 12, 27, 47, 31, 25, 20, 46, 33, 48, 52,  4,
200         22,  7, 49, 50, 44, 17,  1, 28, 24, 43, 30,  9,
201
202         12, 48, 40, 52, 25, 53, 38, 19, 46,  6, 11, 55,
203         49, 16, 10, 28, 29, 37, 50, 17, 22, 30, 35,  1,
204         20, 26, 41,  4, 45, 39, 34, 31, 47,  5, 13, 18,
205         36, 21,  8,  9,  3,  0, 15, 42,  7,  2, 44, 23,
206
207         26,  5, 54, 13, 39, 38, 52, 33, 31, 20, 25, 12,
208         8, 30, 24, 42, 43, 51,  9,  0, 36, 44, 49, 15,
209         34, 40, 55, 18,  6, 53, 48, 45,  4, 19, 27, 32,
210         50, 35, 22, 23, 17, 14, 29,  1, 21, 16,  3, 37,
211
212         40, 19, 11, 27, 53, 52, 13, 47, 45, 34, 39, 26,
213         22, 44,  7,  1,  2, 10, 23, 14, 50,  3,  8, 29,
214         48, 54, 12, 32, 20, 38,  5,  6, 18, 33, 41, 46,
215         9, 49, 36, 37,  0, 28, 43, 15, 35, 30, 17, 51,
216
217         54, 33, 25, 41, 38, 13, 27,  4,  6, 48, 53, 40,
218         36,  3, 21, 15, 16, 24, 37, 28,  9, 17, 22, 43,
219         5, 11, 26, 46, 34, 52, 19, 20, 32, 47, 55, 31,
220         23,  8, 50, 51, 14, 42,  2, 29, 49, 44,  0, 10,
221
222         11, 47, 39, 55, 52, 27, 41, 18, 20,  5, 38, 54,
223         50, 17, 35, 29, 30,  7, 51, 42, 23,  0, 36,  2,
224         19, 25, 40, 31, 48, 13, 33, 34, 46,  4, 12, 45,
225         37, 22,  9, 10, 28,  1, 16, 43,  8,  3, 14, 24,
226
227         18, 54, 46,  5,  6, 34, 48, 25, 27, 12, 45,  4,
228         2, 24, 42, 36, 37, 14,  3, 49, 30,  7, 43,  9,
229         26, 32, 47, 38, 55, 20, 40, 41, 53, 11, 19, 52,
230         44, 29, 16, 17, 35,  8, 23, 50, 15, 10, 21,  0,
231
232         32, 11, 31, 19, 20, 48,  5, 39, 41, 26,  6, 18,
233         16,  7,  1, 50, 51, 28, 17,  8, 44, 21,  2, 23,
234         40, 46,  4, 52, 12, 34, 54, 55, 38, 25, 33, 13,
235         3, 43, 30,  0, 49, 22, 37,  9, 29, 24, 35, 14,
236
237         46, 25, 45, 33, 34,  5, 19, 53, 55, 40, 20, 32,
238         30, 21, 15,  9, 10, 42,  0, 22,  3, 35, 16, 37,
239         54, 31, 18, 13, 26, 48, 11, 12, 52, 39, 47, 27,
240         17,  2, 44, 14,  8, 36, 51, 23, 43,  7, 49, 28,
241
242         31, 39,  6, 47, 48, 19, 33, 38, 12, 54, 34, 46,
243         44, 35, 29, 23, 24,  1, 14, 36, 17, 49, 30, 51,
244         11, 45, 32, 27, 40,  5, 25, 26, 13, 53,  4, 41,
245         0, 16,  3, 28, 22, 50, 10, 37,  2, 21,  8, 42,
246
247         45, 53, 20,  4,  5, 33, 47, 52, 26, 11, 48, 31,
248         3, 49, 43, 37,  7, 15, 28, 50,  0,  8, 44, 10,
249         25,  6, 46, 41, 54, 19, 39, 40, 27, 38, 18, 55,
250         14, 30, 17, 42, 36,  9, 24, 51, 16, 35, 22,  1,
251
252         6, 38, 34, 18, 19, 47,  4, 13, 40, 25,  5, 45,
253         17,  8,  2, 51, 21, 29, 42,  9, 14, 22,  3, 24,
254         39, 20, 31, 55, 11, 33, 53, 54, 41, 52, 32, 12,
255         28, 44,  0,  1, 50, 23,  7, 10, 30, 49, 36, 15,
256
257         20, 52, 48, 32, 33,  4, 18, 27, 54, 39, 19,  6,
258         0, 22, 16, 10, 35, 43,  1, 23, 28, 36, 17,  7,
259         53, 34, 45, 12, 25, 47, 38, 11, 55, 13, 46, 26,
260         42,  3, 14, 15,  9, 37, 21, 24, 44,  8, 50, 29,
261
262         27,  6, 55, 39, 40, 11, 25, 34,  4, 46, 26, 13,
263         7, 29, 23, 17, 42, 50,  8, 30, 35, 43, 24, 14,
264         31, 41, 52, 19, 32, 54, 45, 18,  5, 20, 53, 33,
265         49, 10, 21, 22, 16, 44, 28,  0, 51, 15,  2, 36,
266 };
267
268 static const u8 parity[] = {
269         8,1,0,8,0,8,8,0,0,8,8,0,8,0,2,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,3,
270         0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,
271         0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,
272         8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,
273         0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,
274         8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,
275         8,0,0,8,0,8,8,0,0,8,8,0,8,0,0,8,0,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,
276         4,8,8,0,8,0,0,8,8,0,0,8,0,8,8,0,8,5,0,8,0,8,8,0,0,8,8,0,8,0,6,8,
277 };
278
279
280 static void des_small_fips_encrypt(u32 *expkey, u8 *dst, const u8 *src)
281 {
282         u32 x, y, z;
283         
284         x  = src[7];
285         x <<= 8;
286         x |= src[6];
287         x <<= 8;
288         x |= src[5];
289         x <<= 8;
290         x |= src[4];
291         y  = src[3];
292         y <<= 8;
293         y |= src[2];
294         y <<= 8;
295         y |= src[1];
296         y <<= 8;
297         y |= src[0];
298         z  = ((x >> 004) ^ y) & 0x0F0F0F0FL;
299         x ^= z << 004;
300         y ^= z;
301         z  = ((y >> 020) ^ x) & 0x0000FFFFL;
302         y ^= z << 020;
303         x ^= z;
304         z  = ((x >> 002) ^ y) & 0x33333333L;
305         x ^= z << 002;
306         y ^= z;
307         z  = ((y >> 010) ^ x) & 0x00FF00FFL;
308         y ^= z << 010;
309         x ^= z;
310         x  = x >> 1 | x << 31;
311         z  = (x ^ y) & 0x55555555L;
312         y ^= z;
313         x ^= z;
314         y  = y >> 1 | y << 31;
315         z  = expkey[0];
316         z ^= y;
317         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
318         z >>= 8;
319         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
320         z >>= 8;
321         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
322         z >>= 8;
323         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
324         z  = expkey[1];
325         z ^= y;
326         z  = z << 4 | z >> 28;
327         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
328         z >>= 8;
329         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
330         z >>= 8;
331         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
332         z >>= 8;
333         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
334         z  = expkey[2];
335         z ^= x;
336         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
337         z >>= 8;
338         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
339         z >>= 8;
340         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
341         z >>= 8;
342         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
343         z  = expkey[3];
344         z ^= x;
345         z  = z << 4 | z >> 28;
346         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
347         z >>= 8;
348         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
349         z >>= 8;
350         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
351         z >>= 8;
352         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
353         z  = expkey[4];
354         z ^= y;
355         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
356         z >>= 8;
357         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
358         z >>= 8;
359         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
360         z >>= 8;
361         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
362         z  = expkey[5];
363         z ^= y;
364         z  = z << 4 | z >> 28;
365         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
366         z >>= 8;
367         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
368         z >>= 8;
369         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
370         z >>= 8;
371         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
372         z  = expkey[6];
373         z ^= x;
374         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
375         z >>= 8;
376         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
377         z >>= 8;
378         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
379         z >>= 8;
380         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
381         z  = expkey[7];
382         z ^= x;
383         z  = z << 4 | z >> 28;
384         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
385         z >>= 8;
386         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
387         z >>= 8;
388         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
389         z >>= 8;
390         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
391         z  = expkey[8];
392         z ^= y;
393         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
394         z >>= 8;
395         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
396         z >>= 8;
397         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
398         z >>= 8;
399         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
400         z  = expkey[9];
401         z ^= y;
402         z  = z << 4 | z >> 28;
403         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
404         z >>= 8;
405         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
406         z >>= 8;
407         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
408         z >>= 8;
409         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
410         z  = expkey[10];
411         z ^= x;
412         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
413         z >>= 8;
414         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
415         z >>= 8;
416         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
417         z >>= 8;
418         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
419         z  = expkey[11];
420         z ^= x;
421         z  = z << 4 | z >> 28;
422         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
423         z >>= 8;
424         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
425         z >>= 8;
426         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
427         z >>= 8;
428         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
429         z  = expkey[12];
430         z ^= y;
431         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
432         z >>= 8;
433         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
434         z >>= 8;
435         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
436         z >>= 8;
437         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
438         z  = expkey[13];
439         z ^= y;
440         z  = z << 4 | z >> 28;
441         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
442         z >>= 8;
443         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
444         z >>= 8;
445         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
446         z >>= 8;
447         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
448         z  = expkey[14];
449         z ^= x;
450         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
451         z >>= 8;
452         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
453         z >>= 8;
454         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
455         z >>= 8;
456         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
457         z  = expkey[15];
458         z ^= x;
459         z  = z << 4 | z >> 28;
460         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
461         z >>= 8;
462         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
463         z >>= 8;
464         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
465         z >>= 8;
466         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
467         z  = expkey[16];
468         z ^= y;
469         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
470         z >>= 8;
471         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
472         z >>= 8;
473         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
474         z >>= 8;
475         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
476         z  = expkey[17];
477         z ^= y;
478         z  = z << 4 | z >> 28;
479         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
480         z >>= 8;
481         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
482         z >>= 8;
483         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
484         z >>= 8;
485         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
486         z  = expkey[18];
487         z ^= x;
488         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
489         z >>= 8;
490         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
491         z >>= 8;
492         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
493         z >>= 8;
494         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
495         z  = expkey[19];
496         z ^= x;
497         z  = z << 4 | z >> 28;
498         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
499         z >>= 8;
500         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
501         z >>= 8;
502         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
503         z >>= 8;
504         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
505         z  = expkey[20];
506         z ^= y;
507         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
508         z >>= 8;
509         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
510         z >>= 8;
511         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
512         z >>= 8;
513         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
514         z  = expkey[21];
515         z ^= y;
516         z  = z << 4 | z >> 28;
517         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
518         z >>= 8;
519         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
520         z >>= 8;
521         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
522         z >>= 8;
523         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
524         z  = expkey[22];
525         z ^= x;
526         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
527         z >>= 8;
528         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
529         z >>= 8;
530         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
531         z >>= 8;
532         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
533         z  = expkey[23];
534         z ^= x;
535         z  = z << 4 | z >> 28;
536         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
537         z >>= 8;
538         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
539         z >>= 8;
540         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
541         z >>= 8;
542         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
543         z  = expkey[24];
544         z ^= y;
545         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
546         z >>= 8;
547         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
548         z >>= 8;
549         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
550         z >>= 8;
551         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
552         z  = expkey[25];
553         z ^= y;
554         z  = z << 4 | z >> 28;
555         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
556         z >>= 8;
557         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
558         z >>= 8;
559         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
560         z >>= 8;
561         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
562         z  = expkey[26];
563         z ^= x;
564         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
565         z >>= 8;
566         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
567         z >>= 8;
568         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
569         z >>= 8;
570         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
571         z  = expkey[27];
572         z ^= x;
573         z  = z << 4 | z >> 28;
574         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
575         z >>= 8;
576         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
577         z >>= 8;
578         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
579         z >>= 8;
580         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
581         z  = expkey[28];
582         z ^= y;
583         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
584         z >>= 8;
585         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
586         z >>= 8;
587         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
588         z >>= 8;
589         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
590         z  = expkey[29];
591         z ^= y;
592         z  = z << 4 | z >> 28;
593         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
594         z >>= 8;
595         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
596         z >>= 8;
597         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
598         z >>= 8;
599         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
600         z  = expkey[30];
601         z ^= x;
602         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
603         z >>= 8;
604         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
605         z >>= 8;
606         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
607         z >>= 8;
608         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
609         z  = expkey[31];
610         z ^= x;
611         z  = z << 4 | z >> 28;
612         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
613         z >>= 8;
614         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
615         z >>= 8;
616         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
617         z >>= 8;
618         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
619         x  = x << 1 | x >> 31;
620         z  = (x ^ y) & 0x55555555L;
621         y ^= z;
622         x ^= z;
623         y  = y << 1 | y >> 31;
624         z  = ((x >> 010) ^ y) & 0x00FF00FFL;
625         x ^= z << 010;
626         y ^= z;
627         z  = ((y >> 002) ^ x) & 0x33333333L;
628         y ^= z << 002;
629         x ^= z;
630         z  = ((x >> 020) ^ y) & 0x0000FFFFL;
631         x ^= z << 020;
632         y ^= z;
633         z  = ((y >> 004) ^ x) & 0x0F0F0F0FL;
634         y ^= z << 004;
635         x ^= z;
636         dst[0] = x;
637         x >>= 8;
638         dst[1] = x;
639         x >>= 8;
640         dst[2] = x;
641         x >>= 8;
642         dst[3] = x;
643         dst[4] = y;
644         y >>= 8;
645         dst[5] = y;
646         y >>= 8;
647         dst[6] = y;
648         y >>= 8;
649         dst[7] = y;
650 }
651
652 static void des_small_fips_decrypt(u32 *expkey, u8 *dst, const u8 *src)
653 {
654         u32 x, y, z;
655         
656         x  = src[7];
657         x <<= 8;
658         x |= src[6];
659         x <<= 8;
660         x |= src[5];
661         x <<= 8;
662         x |= src[4];
663         y  = src[3];
664         y <<= 8;
665         y |= src[2];
666         y <<= 8;
667         y |= src[1];
668         y <<= 8;
669         y |= src[0];
670         z  = ((x >> 004) ^ y) & 0x0F0F0F0FL;
671         x ^= z << 004;
672         y ^= z;
673         z  = ((y >> 020) ^ x) & 0x0000FFFFL;
674         y ^= z << 020;
675         x ^= z;
676         z  = ((x >> 002) ^ y) & 0x33333333L;
677         x ^= z << 002;
678         y ^= z;
679         z  = ((y >> 010) ^ x) & 0x00FF00FFL;
680         y ^= z << 010;
681         x ^= z;
682         x  = x >> 1 | x << 31;
683         z  = (x ^ y) & 0x55555555L;
684         y ^= z;
685         x ^= z;
686         y  = y >> 1 | y << 31;
687         z  = expkey[31];
688         z ^= y;
689         z  = z << 4 | z >> 28;
690         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
691         z >>= 8;
692         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
693         z >>= 8;
694         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
695         z >>= 8;
696         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
697         z  = expkey[30];
698         z ^= y;
699         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
700         z >>= 8;
701         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
702         z >>= 8;
703         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
704         z >>= 8;
705         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
706         z  = expkey[29];
707         z ^= x;
708         z  = z << 4 | z >> 28;
709         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
710         z >>= 8;
711         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
712         z >>= 8;
713         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
714         z >>= 8;
715         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
716         z  = expkey[28];
717         z ^= x;
718         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
719         z >>= 8;
720         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
721         z >>= 8;
722         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
723         z >>= 8;
724         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
725         z  = expkey[27];
726         z ^= y;
727         z  = z << 4 | z >> 28;
728         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
729         z >>= 8;
730         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
731         z >>= 8;
732         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
733         z >>= 8;
734         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
735         z  = expkey[26];
736         z ^= y;
737         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
738         z >>= 8;
739         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
740         z >>= 8;
741         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
742         z >>= 8;
743         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
744         z  = expkey[25];
745         z ^= x;
746         z  = z << 4 | z >> 28;
747         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
748         z >>= 8;
749         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
750         z >>= 8;
751         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
752         z >>= 8;
753         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
754         z  = expkey[24];
755         z ^= x;
756         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
757         z >>= 8;
758         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
759         z >>= 8;
760         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
761         z >>= 8;
762         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
763         z  = expkey[23];
764         z ^= y;
765         z  = z << 4 | z >> 28;
766         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
767         z >>= 8;
768         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
769         z >>= 8;
770         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
771         z >>= 8;
772         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
773         z  = expkey[22];
774         z ^= y;
775         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
776         z >>= 8;
777         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
778         z >>= 8;
779         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
780         z >>= 8;
781         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
782         z  = expkey[21];
783         z ^= x;
784         z  = z << 4 | z >> 28;
785         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
786         z >>= 8;
787         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
788         z >>= 8;
789         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
790         z >>= 8;
791         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
792         z  = expkey[20];
793         z ^= x;
794         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
795         z >>= 8;
796         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
797         z >>= 8;
798         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
799         z >>= 8;
800         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
801         z  = expkey[19];
802         z ^= y;
803         z  = z << 4 | z >> 28;
804         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
805         z >>= 8;
806         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
807         z >>= 8;
808         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
809         z >>= 8;
810         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
811         z  = expkey[18];
812         z ^= y;
813         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
814         z >>= 8;
815         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
816         z >>= 8;
817         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
818         z >>= 8;
819         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
820         z  = expkey[17];
821         z ^= x;
822         z  = z << 4 | z >> 28;
823         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
824         z >>= 8;
825         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
826         z >>= 8;
827         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
828         z >>= 8;
829         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
830         z  = expkey[16];
831         z ^= x;
832         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
833         z >>= 8;
834         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
835         z >>= 8;
836         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
837         z >>= 8;
838         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
839         z  = expkey[15];
840         z ^= y;
841         z  = z << 4 | z >> 28;
842         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
843         z >>= 8;
844         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
845         z >>= 8;
846         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
847         z >>= 8;
848         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
849         z  = expkey[14];
850         z ^= y;
851         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
852         z >>= 8;
853         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
854         z >>= 8;
855         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
856         z >>= 8;
857         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
858         z  = expkey[13];
859         z ^= x;
860         z  = z << 4 | z >> 28;
861         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
862         z >>= 8;
863         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
864         z >>= 8;
865         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
866         z >>= 8;
867         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
868         z  = expkey[12];
869         z ^= x;
870         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
871         z >>= 8;
872         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
873         z >>= 8;
874         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
875         z >>= 8;
876         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
877         z  = expkey[11];
878         z ^= y;
879         z  = z << 4 | z >> 28;
880         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
881         z >>= 8;
882         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
883         z >>= 8;
884         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
885         z >>= 8;
886         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
887         z  = expkey[10];
888         z ^= y;
889         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
890         z >>= 8;
891         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
892         z >>= 8;
893         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
894         z >>= 8;
895         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
896         z  = expkey[9];
897         z ^= x;
898         z  = z << 4 | z >> 28;
899         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
900         z >>= 8;
901         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
902         z >>= 8;
903         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
904         z >>= 8;
905         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
906         z  = expkey[8];
907         z ^= x;
908         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
909         z >>= 8;
910         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
911         z >>= 8;
912         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
913         z >>= 8;
914         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
915         z  = expkey[7];
916         z ^= y;
917         z  = z << 4 | z >> 28;
918         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
919         z >>= 8;
920         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
921         z >>= 8;
922         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
923         z >>= 8;
924         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
925         z  = expkey[6];
926         z ^= y;
927         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
928         z >>= 8;
929         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
930         z >>= 8;
931         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
932         z >>= 8;
933         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
934         z  = expkey[5];
935         z ^= x;
936         z  = z << 4 | z >> 28;
937         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
938         z >>= 8;
939         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
940         z >>= 8;
941         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
942         z >>= 8;
943         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
944         z  = expkey[4];
945         z ^= x;
946         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
947         z >>= 8;
948         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
949         z >>= 8;
950         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
951         z >>= 8;
952         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
953         z  = expkey[3];
954         z ^= y;
955         z  = z << 4 | z >> 28;
956         x ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
957         z >>= 8;
958         x ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
959         z >>= 8;
960         x ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
961         z >>= 8;
962         x ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
963         z  = expkey[2];
964         z ^= y;
965         x ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
966         z >>= 8;
967         x ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
968         z >>= 8;
969         x ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
970         z >>= 8;
971         x ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
972         z  = expkey[1];
973         z ^= x;
974         z  = z << 4 | z >> 28;
975         y ^= * (u32 *) ((u8 *) (des_keymap + 448) + (0xFC & z));
976         z >>= 8;
977         y ^= * (u32 *) ((u8 *) (des_keymap + 384) + (0xFC & z));
978         z >>= 8;
979         y ^= * (u32 *) ((u8 *) (des_keymap + 320) + (0xFC & z));
980         z >>= 8;
981         y ^= * (u32 *) ((u8 *) (des_keymap + 256) + (0xFC & z));
982         z  = expkey[0];
983         z ^= x;
984         y ^= * (u32 *) ((u8 *) (des_keymap + 192) + (0xFC & z));
985         z >>= 8;
986         y ^= * (u32 *) ((u8 *) (des_keymap + 128) + (0xFC & z));
987         z >>= 8;
988         y ^= * (u32 *) ((u8 *) (des_keymap + 64) + (0xFC & z));
989         z >>= 8;
990         y ^= * (u32 *) ((u8 *) des_keymap + (0xFC & z));
991         x  = x << 1 | x >> 31;
992         z  = (x ^ y) & 0x55555555L;
993         y ^= z;
994         x ^= z;
995         y  = y << 1 | y >> 31;
996         z  = ((x >> 010) ^ y) & 0x00FF00FFL;
997         x ^= z << 010;
998         y ^= z;
999         z  = ((y >> 002) ^ x) & 0x33333333L;
1000         y ^= z << 002;
1001         x ^= z;
1002         z  = ((x >> 020) ^ y) & 0x0000FFFFL;
1003         x ^= z << 020;
1004         y ^= z;
1005         z  = ((y >> 004) ^ x) & 0x0F0F0F0FL;
1006         y ^= z << 004;
1007         x ^= z;
1008         dst[0] = x;
1009         x >>= 8;
1010         dst[1] = x;
1011         x >>= 8;
1012         dst[2] = x;
1013         x >>= 8;
1014         dst[3] = x;
1015         dst[4] = y;
1016         y >>= 8;
1017         dst[5] = y;
1018         y >>= 8;
1019         dst[6] = y;
1020         y >>= 8;
1021         dst[7] = y;
1022 }
1023
1024 /*
1025  * RFC2451: Weak key checks SHOULD be performed.
1026  */
1027 static int setkey(u32 *expkey, const u8 *key, unsigned int keylen, u32 *flags)
1028 {
1029         const u8 *k;
1030         u8 *b0, *b1;
1031         u32 n, w;
1032         u8 bits0[56], bits1[56];
1033
1034         n  = parity[key[0]]; n <<= 4;
1035         n |= parity[key[1]]; n <<= 4;
1036         n |= parity[key[2]]; n <<= 4;
1037         n |= parity[key[3]]; n <<= 4;
1038         n |= parity[key[4]]; n <<= 4;
1039         n |= parity[key[5]]; n <<= 4;
1040         n |= parity[key[6]]; n <<= 4;
1041         n |= parity[key[7]];
1042         w = 0x88888888L;
1043         
1044         if ((*flags & CRYPTO_TFM_REQ_WEAK_KEY)
1045             && !((n - (w >> 3)) & w)) {  /* 1 in 10^10 keys passes this test */
1046                 if (n < 0x41415151) {
1047                         if (n < 0x31312121) {
1048                                 if (n < 0x14141515) {
1049                                         /* 01 01 01 01 01 01 01 01 */
1050                                         if (n == 0x11111111) goto weak;
1051                                         /* 01 1F 01 1F 01 0E 01 0E */
1052                                         if (n == 0x13131212) goto weak;
1053                                 } else {
1054                                         /* 01 E0 01 E0 01 F1 01 F1 */
1055                                         if (n == 0x14141515) goto weak;
1056                                         /* 01 FE 01 FE 01 FE 01 FE */
1057                                         if (n == 0x16161616) goto weak;
1058                                 }
1059                         } else {
1060                                 if (n < 0x34342525) {
1061                                         /* 1F 01 1F 01 0E 01 0E 01 */
1062                                         if (n == 0x31312121) goto weak;
1063                                         /* 1F 1F 1F 1F 0E 0E 0E 0E (?) */
1064                                         if (n == 0x33332222) goto weak;
1065                                 } else {
1066                                         /* 1F E0 1F E0 0E F1 0E F1 */
1067                                         if (n == 0x34342525) goto weak;
1068                                         /* 1F FE 1F FE 0E FE 0E FE */
1069                                         if (n == 0x36362626) goto weak;
1070                                 }
1071                         }
1072                 } else {
1073                         if (n < 0x61616161) {
1074                                 if (n < 0x44445555) {
1075                                         /* E0 01 E0 01 F1 01 F1 01 */
1076                                         if (n == 0x41415151) goto weak;
1077                                         /* E0 1F E0 1F F1 0E F1 0E */
1078                                         if (n == 0x43435252) goto weak;
1079                                 } else {
1080                                         /* E0 E0 E0 E0 F1 F1 F1 F1 (?) */
1081                                         if (n == 0x44445555) goto weak;
1082                                         /* E0 FE E0 FE F1 FE F1 FE */
1083                                         if (n == 0x46465656) goto weak;
1084                                 }
1085                         } else {
1086                                 if (n < 0x64646565) {
1087                                         /* FE 01 FE 01 FE 01 FE 01 */
1088                                         if (n == 0x61616161) goto weak;
1089                                         /* FE 1F FE 1F FE 0E FE 0E */
1090                                         if (n == 0x63636262) goto weak;
1091                                 } else {
1092                                         /* FE E0 FE E0 FE F1 FE F1 */
1093                                         if (n == 0x64646565) goto weak;
1094                                         /* FE FE FE FE FE FE FE FE */
1095                                         if (n == 0x66666666) goto weak;
1096                                 }
1097                         }
1098                 }
1099         
1100                 goto not_weak;
1101 weak:
1102                 *flags |= CRYPTO_TFM_RES_WEAK_KEY;
1103                 return -EINVAL;
1104         }
1105
1106 not_weak:
1107
1108         /* explode the bits */
1109         n = 56;
1110         b0 = bits0;
1111         b1 = bits1;
1112         
1113         do {
1114                 w = (256 | *key++) << 2;
1115                 do {
1116                         --n;
1117                         b1[n] = 8 & w;
1118                         w >>= 1;
1119                         b0[n] = 4 & w;
1120                 } while ( w >= 16 );
1121         } while ( n );
1122         
1123         /* put the bits in the correct places */
1124         n = 16;
1125         k = rotors;
1126         
1127         do {
1128                 w   = (b1[k[ 0   ]] | b0[k[ 1   ]]) << 4;
1129                 w  |= (b1[k[ 2   ]] | b0[k[ 3   ]]) << 2;
1130                 w  |=  b1[k[ 4   ]] | b0[k[ 5   ]];
1131                 w <<= 8;
1132                 w  |= (b1[k[ 6   ]] | b0[k[ 7   ]]) << 4;
1133                 w  |= (b1[k[ 8   ]] | b0[k[ 9   ]]) << 2;
1134                 w  |=  b1[k[10   ]] | b0[k[11   ]];
1135                 w <<= 8;
1136                 w  |= (b1[k[12   ]] | b0[k[13   ]]) << 4;
1137                 w  |= (b1[k[14   ]] | b0[k[15   ]]) << 2;
1138                 w  |=  b1[k[16   ]] | b0[k[17   ]];
1139                 w <<= 8;
1140                 w  |= (b1[k[18   ]] | b0[k[19   ]]) << 4;
1141                 w  |= (b1[k[20   ]] | b0[k[21   ]]) << 2;
1142                 w  |=  b1[k[22   ]] | b0[k[23   ]];
1143                 expkey[0] = w;
1144                 
1145                 w   = (b1[k[ 0+24]] | b0[k[ 1+24]]) << 4;
1146                 w  |= (b1[k[ 2+24]] | b0[k[ 3+24]]) << 2;
1147                 w  |=  b1[k[ 4+24]] | b0[k[ 5+24]];
1148                 w <<= 8;
1149                 w  |= (b1[k[ 6+24]] | b0[k[ 7+24]]) << 4;
1150                 w  |= (b1[k[ 8+24]] | b0[k[ 9+24]]) << 2;
1151                 w  |=  b1[k[10+24]] | b0[k[11+24]];
1152                 w <<= 8;
1153                 w  |= (b1[k[12+24]] | b0[k[13+24]]) << 4;
1154                 w  |= (b1[k[14+24]] | b0[k[15+24]]) << 2;
1155                 w  |=  b1[k[16+24]] | b0[k[17+24]];
1156                 w <<= 8;
1157                 w  |= (b1[k[18+24]] | b0[k[19+24]]) << 4;
1158                 w  |= (b1[k[20+24]] | b0[k[21+24]]) << 2;
1159                 w  |=  b1[k[22+24]] | b0[k[23+24]];
1160                 
1161                 ROR(w, 4, 28);      /* could be eliminated */
1162                 expkey[1] = w;
1163
1164                 k += 48;
1165                 expkey += 2;
1166         } while (--n);
1167
1168         return 0;
1169 }
1170
1171 static int des_setkey(void *ctx, const u8 *key, unsigned int keylen, u32 *flags)
1172 {
1173         return setkey(((struct des_ctx *)ctx)->expkey, key, keylen, flags);
1174 }
1175
1176 static void des_encrypt(void *ctx, u8 *dst, const u8 *src)
1177 {
1178         des_small_fips_encrypt(((struct des_ctx *)ctx)->expkey, dst, src);
1179 }
1180
1181 static void des_decrypt(void *ctx, u8 *dst, const u8 *src)
1182 {
1183         des_small_fips_decrypt(((struct des_ctx *)ctx)->expkey, dst, src);
1184 }
1185
1186 /* 
1187  * RFC2451:
1188  *
1189  *   For DES-EDE3, there is no known need to reject weak or
1190  *   complementation keys.  Any weakness is obviated by the use of
1191  *   multiple keys.
1192  *
1193  *   However, if the first two or last two independent 64-bit keys are
1194  *   equal (k1 == k2 or k2 == k3), then the DES3 operation is simply the
1195  *   same as DES.  Implementers MUST reject keys that exhibit this
1196  *   property.
1197  *
1198  */
1199 static int des3_ede_setkey(void *ctx, const u8 *key,
1200                            unsigned int keylen, u32 *flags)
1201 {
1202         unsigned int i, off;
1203         struct des3_ede_ctx *dctx = ctx;
1204
1205         if (!(memcmp(key, &key[DES_KEY_SIZE], DES_KEY_SIZE) && 
1206             memcmp(&key[DES_KEY_SIZE], &key[DES_KEY_SIZE * 2],
1207                                                 DES_KEY_SIZE))) {
1208
1209                 *flags |= CRYPTO_TFM_RES_BAD_KEY_SCHED;
1210                 return -EINVAL;
1211         }
1212         
1213         for (i = 0, off = 0; i < 3; i++, off += DES_EXPKEY_WORDS,
1214                                                         key += DES_KEY_SIZE) {
1215                 int ret = setkey(&dctx->expkey[off], key, DES_KEY_SIZE, flags);
1216                 if (ret < 0)
1217                         return ret;
1218         }       
1219         return 0;
1220 }
1221
1222 static void des3_ede_encrypt(void *ctx, u8 *dst, const u8 *src)
1223 {
1224         struct des3_ede_ctx *dctx = ctx;
1225         
1226         des_small_fips_encrypt(dctx->expkey, dst, src);
1227         des_small_fips_decrypt(&dctx->expkey[DES_EXPKEY_WORDS], dst, dst);
1228         des_small_fips_encrypt(&dctx->expkey[DES_EXPKEY_WORDS * 2], dst, dst);
1229 }
1230
1231 static void des3_ede_decrypt(void *ctx, u8 *dst, const u8 *src)
1232 {
1233         struct des3_ede_ctx *dctx = ctx;
1234
1235         des_small_fips_decrypt(&dctx->expkey[DES_EXPKEY_WORDS * 2], dst, src);
1236         des_small_fips_encrypt(&dctx->expkey[DES_EXPKEY_WORDS], dst, dst);
1237         des_small_fips_decrypt(dctx->expkey, dst, dst);
1238 }
1239
1240 static struct crypto_alg des_alg = {
1241         .cra_name               =       "des",
1242         .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
1243         .cra_blocksize          =       DES_BLOCK_SIZE,
1244         .cra_ctxsize            =       sizeof(struct des_ctx),
1245         .cra_module             =       THIS_MODULE,
1246         .cra_list               =       LIST_HEAD_INIT(des_alg.cra_list),
1247         .cra_u                  =       { .cipher = {
1248         .cia_min_keysize        =       DES_KEY_SIZE,
1249         .cia_max_keysize        =       DES_KEY_SIZE,
1250         .cia_setkey             =       des_setkey,
1251         .cia_encrypt            =       des_encrypt,
1252         .cia_decrypt            =       des_decrypt } }
1253 };
1254
1255 static struct crypto_alg des3_ede_alg = {
1256         .cra_name               =       "des3_ede",
1257         .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
1258         .cra_blocksize          =       DES3_EDE_BLOCK_SIZE,
1259         .cra_ctxsize            =       sizeof(struct des3_ede_ctx),
1260         .cra_module             =       THIS_MODULE,
1261         .cra_list               =       LIST_HEAD_INIT(des3_ede_alg.cra_list),
1262         .cra_u                  =       { .cipher = {
1263         .cia_min_keysize        =       DES3_EDE_KEY_SIZE,
1264         .cia_max_keysize        =       DES3_EDE_KEY_SIZE,
1265         .cia_setkey             =       des3_ede_setkey,
1266         .cia_encrypt            =       des3_ede_encrypt,
1267         .cia_decrypt            =       des3_ede_decrypt } }
1268 };
1269
1270 MODULE_ALIAS("des3_ede");
1271
1272 static int __init init(void)
1273 {
1274         int ret = 0;
1275         
1276         ret = crypto_register_alg(&des_alg);
1277         if (ret < 0)
1278                 goto out;
1279
1280         ret = crypto_register_alg(&des3_ede_alg);
1281         if (ret < 0)
1282                 crypto_unregister_alg(&des_alg);
1283 out:    
1284         return ret;
1285 }
1286
1287 static void __exit fini(void)
1288 {
1289         crypto_unregister_alg(&des3_ede_alg);
1290         crypto_unregister_alg(&des_alg);
1291 }
1292
1293 module_init(init);
1294 module_exit(fini);
1295
1296 MODULE_LICENSE("GPL");
1297 MODULE_DESCRIPTION("DES & Triple DES EDE Cipher Algorithms");