5 * integrated sbox & p perm
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,
83 * for manual index calculation
84 * #define fetch(box, i, sh) (*((u32int*)((uchar*)spbox + (box << 8) + ((i >> (sh)) & 0xfc))))
86 #define fetch(box, i, sh) ((spbox+(box << 6))[((i >> (sh + 2)) & 0x3f)])
89 * DES electronic codebook encryption of one block
92 block_cipher(ulong key[32], uchar text[8], int decrypting)
94 u32int right, left, v0, v1;
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);
122 for (i = 0; i < 8; i++) {
124 v0 ^= (right >> 1) | (right << 31);
125 left ^= fetch(0, v0, 24)
130 v1 ^= (right << 3) | (right >> 29);
131 left ^= fetch(1, v1, 24)
138 v0 ^= (left >> 1) | (left << 31);
139 right ^= fetch(0, v0, 24)
144 v1 ^= (left << 3) | (left >> 29);
145 right ^= fetch(1, v1, 24)
153 * final permutation, inverse initial permutation
155 v0 = ((left << 1) & 0xaaaaaaaa) | (right & 0x55555555);
156 v1 = (left & 0xaaaaaaaa) | ((right >> 1) & 0x55555555);
157 v1 = ((v1 << 6) & 0x33003300)
159 | ((v1 >> 6) & 0x00cc00cc);
160 v1 = ((v1 << 12) & 0x0f0f0000)
162 | ((v1 >> 12) & 0x0000f0f0);
163 v0 = ((v0 << 6) & 0x33003300)
165 | ((v0 >> 6) & 0x00cc00cc);
166 v0 = ((v0 << 12) & 0x0f0f0000)
168 | ((v0 >> 12) & 0x0000f0f0);
180 * triple DES electronic codebook encryption of one block
183 triple_block_cipher(ulong expanded_key[3][32], uchar text[8], int ende)
186 u32int right, left, v0, v1;
190 * initial permutation
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];
214 key = &expanded_key[j][0];
218 for (i = 0; i < 8; i++) {
220 v0 ^= (right >> 1) | (right << 31);
221 left ^= fetch(0, v0, 24)
226 v1 ^= (right << 3) | (right >> 29);
227 left ^= fetch(1, v1, 24)
234 v0 ^= (left >> 1) | (left << 31);
235 right ^= fetch(0, v0, 24)
240 v1 ^= (left << 3) | (left >> 29);
241 right ^= fetch(1, v1, 24)
254 * final permutation, inverse initial permutation
255 * left and right are swapped here
257 v0 = ((right << 1) & 0xaaaaaaaa) | (left & 0x55555555);
258 v1 = (right & 0xaaaaaaaa) | ((left >> 1) & 0x55555555);
259 v1 = ((v1 << 6) & 0x33003300)
261 | ((v1 >> 6) & 0x00cc00cc);
262 v1 = ((v1 << 12) & 0x0f0f0000)
264 | ((v1 >> 12) & 0x0000f0f0);
265 v0 = ((v0 << 6) & 0x33003300)
267 | ((v0 >> 6) & 0x00cc00cc);
268 v0 = ((v0 << 12) & 0x0f0f0000)
270 | ((v0 >> 12) & 0x0000f0f0);
282 * key compression permutation, 4 bits at a time
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,
331 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1,
335 keycompperm(u32int left, u32int right, ulong *ek)
340 for(i = 0; i < 16; i++){
341 left = (left << keysh[i]) | (left >> (28 - keysh[i]));
343 right = (right << keysh[i]) | (right >> (28 - keysh[i]));
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);
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,
431 * convert a 7 byte key to an 8 byte one
434 des56to64(uchar *k56, uchar *k64)
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];
452 * convert an 8 byte key to a 7 byte one
455 des64to56(uchar *k64, uchar *k56)
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);
474 key_setup(uchar key[7], ulong *ek)
479 des_key_setup(k64, ek);