Blob


1 #include "os.h"
2 #include <libsec.h>
4 /*
5 * integrated sbox & p perm
6 */
7 static u32int spbox[] = {
9 0x00808200,0x00000000,0x00008000,0x00808202,0x00808002,0x00008202,0x00000002,0x00008000,
10 0x00000200,0x00808200,0x00808202,0x00000200,0x00800202,0x00808002,0x00800000,0x00000002,
11 0x00000202,0x00800200,0x00800200,0x00008200,0x00008200,0x00808000,0x00808000,0x00800202,
12 0x00008002,0x00800002,0x00800002,0x00008002,0x00000000,0x00000202,0x00008202,0x00800000,
13 0x00008000,0x00808202,0x00000002,0x00808000,0x00808200,0x00800000,0x00800000,0x00000200,
14 0x00808002,0x00008000,0x00008200,0x00800002,0x00000200,0x00000002,0x00800202,0x00008202,
15 0x00808202,0x00008002,0x00808000,0x00800202,0x00800002,0x00000202,0x00008202,0x00808200,
16 0x00000202,0x00800200,0x00800200,0x00000000,0x00008002,0x00008200,0x00000000,0x00808002,
18 0x40084010,0x40004000,0x00004000,0x00084010,0x00080000,0x00000010,0x40080010,0x40004010,
19 0x40000010,0x40084010,0x40084000,0x40000000,0x40004000,0x00080000,0x00000010,0x40080010,
20 0x00084000,0x00080010,0x40004010,0x00000000,0x40000000,0x00004000,0x00084010,0x40080000,
21 0x00080010,0x40000010,0x00000000,0x00084000,0x00004010,0x40084000,0x40080000,0x00004010,
22 0x00000000,0x00084010,0x40080010,0x00080000,0x40004010,0x40080000,0x40084000,0x00004000,
23 0x40080000,0x40004000,0x00000010,0x40084010,0x00084010,0x00000010,0x00004000,0x40000000,
24 0x00004010,0x40084000,0x00080000,0x40000010,0x00080010,0x40004010,0x40000010,0x00080010,
25 0x00084000,0x00000000,0x40004000,0x00004010,0x40000000,0x40080010,0x40084010,0x00084000,
27 0x00000104,0x04010100,0x00000000,0x04010004,0x04000100,0x00000000,0x00010104,0x04000100,
28 0x00010004,0x04000004,0x04000004,0x00010000,0x04010104,0x00010004,0x04010000,0x00000104,
29 0x04000000,0x00000004,0x04010100,0x00000100,0x00010100,0x04010000,0x04010004,0x00010104,
30 0x04000104,0x00010100,0x00010000,0x04000104,0x00000004,0x04010104,0x00000100,0x04000000,
31 0x04010100,0x04000000,0x00010004,0x00000104,0x00010000,0x04010100,0x04000100,0x00000000,
32 0x00000100,0x00010004,0x04010104,0x04000100,0x04000004,0x00000100,0x00000000,0x04010004,
33 0x04000104,0x00010000,0x04000000,0x04010104,0x00000004,0x00010104,0x00010100,0x04000004,
34 0x04010000,0x04000104,0x00000104,0x04010000,0x00010104,0x00000004,0x04010004,0x00010100,
36 0x80401000,0x80001040,0x80001040,0x00000040,0x00401040,0x80400040,0x80400000,0x80001000,
37 0x00000000,0x00401000,0x00401000,0x80401040,0x80000040,0x00000000,0x00400040,0x80400000,
38 0x80000000,0x00001000,0x00400000,0x80401000,0x00000040,0x00400000,0x80001000,0x00001040,
39 0x80400040,0x80000000,0x00001040,0x00400040,0x00001000,0x00401040,0x80401040,0x80000040,
40 0x00400040,0x80400000,0x00401000,0x80401040,0x80000040,0x00000000,0x00000000,0x00401000,
41 0x00001040,0x00400040,0x80400040,0x80000000,0x80401000,0x80001040,0x80001040,0x00000040,
42 0x80401040,0x80000040,0x80000000,0x00001000,0x80400000,0x80001000,0x00401040,0x80400040,
43 0x80001000,0x00001040,0x00400000,0x80401000,0x00000040,0x00400000,0x00001000,0x00401040,
45 0x00000080,0x01040080,0x01040000,0x21000080,0x00040000,0x00000080,0x20000000,0x01040000,
46 0x20040080,0x00040000,0x01000080,0x20040080,0x21000080,0x21040000,0x00040080,0x20000000,
47 0x01000000,0x20040000,0x20040000,0x00000000,0x20000080,0x21040080,0x21040080,0x01000080,
48 0x21040000,0x20000080,0x00000000,0x21000000,0x01040080,0x01000000,0x21000000,0x00040080,
49 0x00040000,0x21000080,0x00000080,0x01000000,0x20000000,0x01040000,0x21000080,0x20040080,
50 0x01000080,0x20000000,0x21040000,0x01040080,0x20040080,0x00000080,0x01000000,0x21040000,
51 0x21040080,0x00040080,0x21000000,0x21040080,0x01040000,0x00000000,0x20040000,0x21000000,
52 0x00040080,0x01000080,0x20000080,0x00040000,0x00000000,0x20040000,0x01040080,0x20000080,
54 0x10000008,0x10200000,0x00002000,0x10202008,0x10200000,0x00000008,0x10202008,0x00200000,
55 0x10002000,0x00202008,0x00200000,0x10000008,0x00200008,0x10002000,0x10000000,0x00002008,
56 0x00000000,0x00200008,0x10002008,0x00002000,0x00202000,0x10002008,0x00000008,0x10200008,
57 0x10200008,0x00000000,0x00202008,0x10202000,0x00002008,0x00202000,0x10202000,0x10000000,
58 0x10002000,0x00000008,0x10200008,0x00202000,0x10202008,0x00200000,0x00002008,0x10000008,
59 0x00200000,0x10002000,0x10000000,0x00002008,0x10000008,0x10202008,0x00202000,0x10200000,
60 0x00202008,0x10202000,0x00000000,0x10200008,0x00000008,0x00002000,0x10200000,0x00202008,
61 0x00002000,0x00200008,0x10002008,0x00000000,0x10202000,0x10000000,0x00200008,0x10002008,
63 0x00100000,0x02100001,0x02000401,0x00000000,0x00000400,0x02000401,0x00100401,0x02100400,
64 0x02100401,0x00100000,0x00000000,0x02000001,0x00000001,0x02000000,0x02100001,0x00000401,
65 0x02000400,0x00100401,0x00100001,0x02000400,0x02000001,0x02100000,0x02100400,0x00100001,
66 0x02100000,0x00000400,0x00000401,0x02100401,0x00100400,0x00000001,0x02000000,0x00100400,
67 0x02000000,0x00100400,0x00100000,0x02000401,0x02000401,0x02100001,0x02100001,0x00000001,
68 0x00100001,0x02000000,0x02000400,0x00100000,0x02100400,0x00000401,0x00100401,0x02100400,
69 0x00000401,0x02000001,0x02100401,0x02100000,0x00100400,0x00000000,0x00000001,0x02100401,
70 0x00000000,0x00100401,0x02100000,0x00000400,0x02000001,0x02000400,0x00000400,0x00100001,
72 0x08000820,0x00000800,0x00020000,0x08020820,0x08000000,0x08000820,0x00000020,0x08000000,
73 0x00020020,0x08020000,0x08020820,0x00020800,0x08020800,0x00020820,0x00000800,0x00000020,
74 0x08020000,0x08000020,0x08000800,0x00000820,0x00020800,0x00020020,0x08020020,0x08020800,
75 0x00000820,0x00000000,0x00000000,0x08020020,0x08000020,0x08000800,0x00020820,0x00020000,
76 0x00020820,0x00020000,0x08020800,0x00000800,0x00000020,0x08020020,0x00000800,0x00020820,
77 0x08000800,0x00000020,0x08000020,0x08020000,0x08020020,0x08000000,0x00020000,0x08000820,
78 0x00000000,0x08020820,0x00020020,0x08000020,0x08020000,0x08000800,0x08000820,0x00000000,
79 0x08020820,0x00020800,0x00020800,0x00000820,0x00000820,0x00020020,0x08000000,0x08020800,
80 };
82 /*
83 * for manual index calculation
84 * #define fetch(box, i, sh) (*((u32int*)((uchar*)spbox + (box << 8) + ((i >> (sh)) & 0xfc))))
85 */
86 #define fetch(box, i, sh) ((spbox+(box << 6))[((i >> (sh + 2)) & 0x3f)])
88 /*
89 * DES electronic codebook encryption of one block
90 */
91 void
92 block_cipher(ulong key[32], uchar text[8], int decrypting)
93 {
94 u32int right, left, v0, v1;
95 int i, keystep;
97 /*
98 * initial permutation
99 */
100 v0 = text[0] | ((u32int)text[2]<<8) | ((u32int)text[4]<<16) | ((u32int)text[6]<<24);
101 left = text[1] | ((u32int)text[3]<<8) | ((u32int)text[5]<<16) | ((u32int)text[7]<<24);
102 right = (left & 0xaaaaaaaa) | ((v0 >> 1) & 0x55555555);
103 left = ((left << 1) & 0xaaaaaaaa) | (v0 & 0x55555555);
104 left = ((left << 6) & 0x33003300)
105 | (left & 0xcc33cc33)
106 | ((left >> 6) & 0x00cc00cc);
107 left = ((left << 12) & 0x0f0f0000)
108 | (left & 0xf0f00f0f)
109 | ((left >> 12) & 0x0000f0f0);
110 right = ((right << 6) & 0x33003300)
111 | (right & 0xcc33cc33)
112 | ((right >> 6) & 0x00cc00cc);
113 right = ((right << 12) & 0x0f0f0000)
114 | (right & 0xf0f00f0f)
115 | ((right >> 12) & 0x0000f0f0);
117 if (decrypting) {
118 keystep = -2;
119 key = key + 32 - 2;
120 } else
121 keystep = 2;
122 for (i = 0; i < 8; i++) {
123 v0 = key[0];
124 v0 ^= (right >> 1) | (right << 31);
125 left ^= fetch(0, v0, 24)
126 ^ fetch(2, v0, 16)
127 ^ fetch(4, v0, 8)
128 ^ fetch(6, v0, 0);
129 v1 = key[1];
130 v1 ^= (right << 3) | (right >> 29);
131 left ^= fetch(1, v1, 24)
132 ^ fetch(3, v1, 16)
133 ^ fetch(5, v1, 8)
134 ^ fetch(7, v1, 0);
135 key += keystep;
137 v0 = key[0];
138 v0 ^= (left >> 1) | (left << 31);
139 right ^= fetch(0, v0, 24)
140 ^ fetch(2, v0, 16)
141 ^ fetch(4, v0, 8)
142 ^ fetch(6, v0, 0);
143 v1 = key[1];
144 v1 ^= (left << 3) | (left >> 29);
145 right ^= fetch(1, v1, 24)
146 ^ fetch(3, v1, 16)
147 ^ fetch(5, v1, 8)
148 ^ fetch(7, v1, 0);
149 key += keystep;
152 /*
153 * final permutation, inverse initial permutation
154 */
155 v0 = ((left << 1) & 0xaaaaaaaa) | (right & 0x55555555);
156 v1 = (left & 0xaaaaaaaa) | ((right >> 1) & 0x55555555);
157 v1 = ((v1 << 6) & 0x33003300)
158 | (v1 & 0xcc33cc33)
159 | ((v1 >> 6) & 0x00cc00cc);
160 v1 = ((v1 << 12) & 0x0f0f0000)
161 | (v1 & 0xf0f00f0f)
162 | ((v1 >> 12) & 0x0000f0f0);
163 v0 = ((v0 << 6) & 0x33003300)
164 | (v0 & 0xcc33cc33)
165 | ((v0 >> 6) & 0x00cc00cc);
166 v0 = ((v0 << 12) & 0x0f0f0000)
167 | (v0 & 0xf0f00f0f)
168 | ((v0 >> 12) & 0x0000f0f0);
169 text[0] = v0;
170 text[2] = v0 >> 8;
171 text[4] = v0 >> 16;
172 text[6] = v0 >> 24;
173 text[1] = v1;
174 text[3] = v1 >> 8;
175 text[5] = v1 >> 16;
176 text[7] = v1 >> 24;
179 /*
180 * triple DES electronic codebook encryption of one block
181 */
182 void
183 triple_block_cipher(ulong expanded_key[3][32], uchar text[8], int ende)
185 ulong *key;
186 u32int right, left, v0, v1;
187 int i, j, keystep;
189 /*
190 * initial permutation
191 */
192 v0 = text[0] | ((u32int)text[2]<<8) | ((u32int)text[4]<<16) | ((u32int)text[6]<<24);
193 left = text[1] | ((u32int)text[3]<<8) | ((u32int)text[5]<<16) | ((u32int)text[7]<<24);
194 right = (left & 0xaaaaaaaa) | ((v0 >> 1) & 0x55555555);
195 left = ((left << 1) & 0xaaaaaaaa) | (v0 & 0x55555555);
196 left = ((left << 6) & 0x33003300)
197 | (left & 0xcc33cc33)
198 | ((left >> 6) & 0x00cc00cc);
199 left = ((left << 12) & 0x0f0f0000)
200 | (left & 0xf0f00f0f)
201 | ((left >> 12) & 0x0000f0f0);
202 right = ((right << 6) & 0x33003300)
203 | (right & 0xcc33cc33)
204 | ((right >> 6) & 0x00cc00cc);
205 right = ((right << 12) & 0x0f0f0000)
206 | (right & 0xf0f00f0f)
207 | ((right >> 12) & 0x0000f0f0);
209 for(j = 0; j < 3; j++){
210 if((ende & 1) == DES3D) {
211 key = &expanded_key[2-j][32-2];
212 keystep = -2;
213 } else {
214 key = &expanded_key[j][0];
215 keystep = 2;
217 ende >>= 1;
218 for (i = 0; i < 8; i++) {
219 v0 = key[0];
220 v0 ^= (right >> 1) | (right << 31);
221 left ^= fetch(0, v0, 24)
222 ^ fetch(2, v0, 16)
223 ^ fetch(4, v0, 8)
224 ^ fetch(6, v0, 0);
225 v1 = key[1];
226 v1 ^= (right << 3) | (right >> 29);
227 left ^= fetch(1, v1, 24)
228 ^ fetch(3, v1, 16)
229 ^ fetch(5, v1, 8)
230 ^ fetch(7, v1, 0);
231 key += keystep;
233 v0 = key[0];
234 v0 ^= (left >> 1) | (left << 31);
235 right ^= fetch(0, v0, 24)
236 ^ fetch(2, v0, 16)
237 ^ fetch(4, v0, 8)
238 ^ fetch(6, v0, 0);
239 v1 = key[1];
240 v1 ^= (left << 3) | (left >> 29);
241 right ^= fetch(1, v1, 24)
242 ^ fetch(3, v1, 16)
243 ^ fetch(5, v1, 8)
244 ^ fetch(7, v1, 0);
245 key += keystep;
248 v0 = left;
249 left = right;
250 right = v0;
253 /*
254 * final permutation, inverse initial permutation
255 * left and right are swapped here
256 */
257 v0 = ((right << 1) & 0xaaaaaaaa) | (left & 0x55555555);
258 v1 = (right & 0xaaaaaaaa) | ((left >> 1) & 0x55555555);
259 v1 = ((v1 << 6) & 0x33003300)
260 | (v1 & 0xcc33cc33)
261 | ((v1 >> 6) & 0x00cc00cc);
262 v1 = ((v1 << 12) & 0x0f0f0000)
263 | (v1 & 0xf0f00f0f)
264 | ((v1 >> 12) & 0x0000f0f0);
265 v0 = ((v0 << 6) & 0x33003300)
266 | (v0 & 0xcc33cc33)
267 | ((v0 >> 6) & 0x00cc00cc);
268 v0 = ((v0 << 12) & 0x0f0f0000)
269 | (v0 & 0xf0f00f0f)
270 | ((v0 >> 12) & 0x0000f0f0);
271 text[0] = v0;
272 text[2] = v0 >> 8;
273 text[4] = v0 >> 16;
274 text[6] = v0 >> 24;
275 text[1] = v1;
276 text[3] = v1 >> 8;
277 text[5] = v1 >> 16;
278 text[7] = v1 >> 24;
281 /*
282 * key compression permutation, 4 bits at a time
283 */
284 static u32int comptab[] = {
286 0x000000,0x010000,0x000008,0x010008,0x000080,0x010080,0x000088,0x010088,
287 0x000000,0x010000,0x000008,0x010008,0x000080,0x010080,0x000088,0x010088,
289 0x000000,0x100000,0x000800,0x100800,0x000000,0x100000,0x000800,0x100800,
290 0x002000,0x102000,0x002800,0x102800,0x002000,0x102000,0x002800,0x102800,
292 0x000000,0x000004,0x000400,0x000404,0x000000,0x000004,0x000400,0x000404,
293 0x400000,0x400004,0x400400,0x400404,0x400000,0x400004,0x400400,0x400404,
295 0x000000,0x000020,0x008000,0x008020,0x800000,0x800020,0x808000,0x808020,
296 0x000002,0x000022,0x008002,0x008022,0x800002,0x800022,0x808002,0x808022,
298 0x000000,0x000200,0x200000,0x200200,0x001000,0x001200,0x201000,0x201200,
299 0x000000,0x000200,0x200000,0x200200,0x001000,0x001200,0x201000,0x201200,
301 0x000000,0x000040,0x000010,0x000050,0x004000,0x004040,0x004010,0x004050,
302 0x040000,0x040040,0x040010,0x040050,0x044000,0x044040,0x044010,0x044050,
304 0x000000,0x000100,0x020000,0x020100,0x000001,0x000101,0x020001,0x020101,
305 0x080000,0x080100,0x0a0000,0x0a0100,0x080001,0x080101,0x0a0001,0x0a0101,
307 0x000000,0x000100,0x040000,0x040100,0x000000,0x000100,0x040000,0x040100,
308 0x000040,0x000140,0x040040,0x040140,0x000040,0x000140,0x040040,0x040140,
310 0x000000,0x400000,0x008000,0x408000,0x000008,0x400008,0x008008,0x408008,
311 0x000400,0x400400,0x008400,0x408400,0x000408,0x400408,0x008408,0x408408,
313 0x000000,0x001000,0x080000,0x081000,0x000020,0x001020,0x080020,0x081020,
314 0x004000,0x005000,0x084000,0x085000,0x004020,0x005020,0x084020,0x085020,
316 0x000000,0x000800,0x000000,0x000800,0x000010,0x000810,0x000010,0x000810,
317 0x800000,0x800800,0x800000,0x800800,0x800010,0x800810,0x800010,0x800810,
319 0x000000,0x010000,0x000200,0x010200,0x000000,0x010000,0x000200,0x010200,
320 0x100000,0x110000,0x100200,0x110200,0x100000,0x110000,0x100200,0x110200,
322 0x000000,0x000004,0x000000,0x000004,0x000080,0x000084,0x000080,0x000084,
323 0x002000,0x002004,0x002000,0x002004,0x002080,0x002084,0x002080,0x002084,
325 0x000000,0x000001,0x200000,0x200001,0x020000,0x020001,0x220000,0x220001,
326 0x000002,0x000003,0x200002,0x200003,0x020002,0x020003,0x220002,0x220003,
327 };
329 static int keysh[] =
331 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1,
332 };
334 static void
335 keycompperm(u32int left, u32int right, ulong *ek)
337 u32int v0, v1;
338 int i;
340 for(i = 0; i < 16; i++){
341 left = (left << keysh[i]) | (left >> (28 - keysh[i]));
342 left &= 0xfffffff0;
343 right = (right << keysh[i]) | (right >> (28 - keysh[i]));
344 right &= 0xfffffff0;
345 v0 = comptab[6 * (1 << 4) + ((left >> (32-4)) & 0xf)]
346 | comptab[5 * (1 << 4) + ((left >> (32-8)) & 0xf)]
347 | comptab[4 * (1 << 4) + ((left >> (32-12)) & 0xf)]
348 | comptab[3 * (1 << 4) + ((left >> (32-16)) & 0xf)]
349 | comptab[2 * (1 << 4) + ((left >> (32-20)) & 0xf)]
350 | comptab[1 * (1 << 4) + ((left >> (32-24)) & 0xf)]
351 | comptab[0 * (1 << 4) + ((left >> (32-28)) & 0xf)];
352 v1 = comptab[13 * (1 << 4) + ((right >> (32-4)) & 0xf)]
353 | comptab[12 * (1 << 4) + ((right >> (32-8)) & 0xf)]
354 | comptab[11 * (1 << 4) + ((right >> (32-12)) & 0xf)]
355 | comptab[10 * (1 << 4) + ((right >> (32-16)) & 0xf)]
356 | comptab[9 * (1 << 4) + ((right >> (32-20)) & 0xf)]
357 | comptab[8 * (1 << 4) + ((right >> (32-24)) & 0xf)]
358 | comptab[7 * (1 << 4) + ((right >> (32-28)) & 0xf)];
359 ek[0] = (((v0 >> (24-6)) & 0x3f) << 26)
360 | (((v0 >> (24-18)) & 0x3f) << 18)
361 | (((v1 >> (24-6)) & 0x3f) << 10)
362 | (((v1 >> (24-18)) & 0x3f) << 2);
363 ek[1] = (((v0 >> (24-12)) & 0x3f) << 26)
364 | (((v0 >> (24-24)) & 0x3f) << 18)
365 | (((v1 >> (24-12)) & 0x3f) << 10)
366 | (((v1 >> (24-24)) & 0x3f) << 2);
367 ek += 2;
371 void
372 des_key_setup(uchar key[8], ulong *ek)
374 u32int left, right, v0, v1;
376 v0 = key[0] | ((u32int)key[2] << 8) | ((u32int)key[4] << 16) | ((u32int)key[6] << 24);
377 v1 = key[1] | ((u32int)key[3] << 8) | ((u32int)key[5] << 16) | ((u32int)key[7] << 24);
378 left = ((v0 >> 1) & 0x40404040)
379 | ((v0 >> 2) & 0x10101010)
380 | ((v0 >> 3) & 0x04040404)
381 | ((v0 >> 4) & 0x01010101)
382 | ((v1 >> 0) & 0x80808080)
383 | ((v1 >> 1) & 0x20202020)
384 | ((v1 >> 2) & 0x08080808)
385 | ((v1 >> 3) & 0x02020202);
386 right = ((v0 >> 1) & 0x04040404)
387 | ((v0 << 2) & 0x10101010)
388 | ((v0 << 5) & 0x40404040)
389 | ((v1 << 0) & 0x08080808)
390 | ((v1 << 3) & 0x20202020)
391 | ((v1 << 6) & 0x80808080);
392 left = ((left << 6) & 0x33003300)
393 | (left & 0xcc33cc33)
394 | ((left >> 6) & 0x00cc00cc);
395 v0 = ((left << 12) & 0x0f0f0000)
396 | (left & 0xf0f00f0f)
397 | ((left >> 12) & 0x0000f0f0);
398 right = ((right << 6) & 0x33003300)
399 | (right & 0xcc33cc33)
400 | ((right >> 6) & 0x00cc00cc);
401 v1 = ((right << 12) & 0x0f0f0000)
402 | (right & 0xf0f00f0f)
403 | ((right >> 12) & 0x0000f0f0);
404 left = v0 & 0xfffffff0;
405 right = (v1 & 0xffffff00) | ((v0 << 4) & 0xf0);
407 keycompperm(left, right, ek);
410 static uchar parity[128] =
412 0x01, 0x02, 0x04, 0x07, 0x08, 0x0b, 0x0d, 0x0e,
413 0x10, 0x13, 0x15, 0x16, 0x19, 0x1a, 0x1c, 0x1f,
414 0x20, 0x23, 0x25, 0x26, 0x29, 0x2a, 0x2c, 0x2f,
415 0x31, 0x32, 0x34, 0x37, 0x38, 0x3b, 0x3d, 0x3e,
416 0x40, 0x43, 0x45, 0x46, 0x49, 0x4a, 0x4c, 0x4f,
417 0x51, 0x52, 0x54, 0x57, 0x58, 0x5b, 0x5d, 0x5e,
418 0x61, 0x62, 0x64, 0x67, 0x68, 0x6b, 0x6d, 0x6e,
419 0x70, 0x73, 0x75, 0x76, 0x79, 0x7a, 0x7c, 0x7f,
420 0x80, 0x83, 0x85, 0x86, 0x89, 0x8a, 0x8c, 0x8f,
421 0x91, 0x92, 0x94, 0x97, 0x98, 0x9b, 0x9d, 0x9e,
422 0xa1, 0xa2, 0xa4, 0xa7, 0xa8, 0xab, 0xad, 0xae,
423 0xb0, 0xb3, 0xb5, 0xb6, 0xb9, 0xba, 0xbc, 0xbf,
424 0xc1, 0xc2, 0xc4, 0xc7, 0xc8, 0xcb, 0xcd, 0xce,
425 0xd0, 0xd3, 0xd5, 0xd6, 0xd9, 0xda, 0xdc, 0xdf,
426 0xe0, 0xe3, 0xe5, 0xe6, 0xe9, 0xea, 0xec, 0xef,
427 0xf1, 0xf2, 0xf4, 0xf7, 0xf8, 0xfb, 0xfd, 0xfe,
428 };
430 /*
431 * convert a 7 byte key to an 8 byte one
432 */
433 void
434 des56to64(uchar *k56, uchar *k64)
436 u32int hi, lo;
438 hi = ((u32int)k56[0]<<24)|((u32int)k56[1]<<16)|((u32int)k56[2]<<8)|k56[3];
439 lo = ((u32int)k56[4]<<24)|((u32int)k56[5]<<16)|((u32int)k56[6]<<8);
441 k64[0] = parity[(hi>>25)&0x7f];
442 k64[1] = parity[(hi>>18)&0x7f];
443 k64[2] = parity[(hi>>11)&0x7f];
444 k64[3] = parity[(hi>>4)&0x7f];
445 k64[4] = parity[((hi<<3)|(lo>>29))&0x7f];
446 k64[5] = parity[(lo>>22)&0x7f];
447 k64[6] = parity[(lo>>15)&0x7f];
448 k64[7] = parity[(lo>>8)&0x7f];
451 /*
452 * convert an 8 byte key to a 7 byte one
453 */
454 void
455 des64to56(uchar *k64, uchar *k56)
457 u32int hi, lo;
459 hi = (((u32int)k64[0]&0xfe)<<24)|(((u32int)k64[1]&0xfe)<<17)|(((u32int)k64[2]&0xfe)<<10)
460 |((k64[3]&0xfe)<<3)|(k64[4]>>4);
461 lo = (((u32int)k64[4]&0xfe)<<28)|(((u32int)k64[5]&0xfe)<<21)|(((u32int)k64[6]&0xfe)<<14)
462 |(((u32int)k64[7]&0xfe)<<7);
464 k56[0] = hi>>24;
465 k56[1] = hi>>16;
466 k56[2] = hi>>8;
467 k56[3] = hi>>0;
468 k56[4] = lo>>24;
469 k56[5] = lo>>16;
470 k56[6] = lo>>8;
473 void
474 key_setup(uchar key[7], ulong *ek)
476 uchar k64[8];
478 des56to64(key, k64);
479 des_key_setup(k64, ek);