/[mcrypt]/libmcrypt-nm/lib/tripledes.c
ViewVC logotype

Contents of /libmcrypt-nm/lib/tripledes.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1.1.1 - (show annotations) (vendor branch)
Mon May 22 13:09:16 2000 UTC (23 years, 11 months ago) by nmav
Branch: MAIN, mcrypt
CVS Tags: start, HEAD
Changes since 1.1: +0 -0 lines
File MIME type: text/plain

1
2 /* Sofware DES functions
3 * written 12 Dec 1986 by Phil Karn, KA9Q; large sections adapted from
4 * the 1977 public-domain program by Jim Gillogly
5 * Modified for additional speed - 6 December 1988 Phil Karn
6 * Modified for parameterized key schedules - Jan 1991 Phil Karn
7 * Modified modified such that will operate in EDE 3DES - 1999 Nikos Mavroyanopoulos
8 *
9 * Callers now allocate a key schedule as follows:
10 * kn = (char (*)[8])malloc(sizeof(char) * 8 * 16);
11 * or
12 * char kn[16][8];
13 */
14
15 /* modified in order to use the libmcrypt API by Nikos Mavroyanopoulos
16 * All modifications are placed under the license of libmcrypt.
17 */
18
19 /* $Id: tripledes.c,v 1.9 2000/02/09 15:15:06 nikos Exp $ */
20
21 #include "libdefs.h"
22 #include "bzero.h"
23 #include "swap.h"
24 #include "tripledes.h"
25
26 /* #define NULL 0 */
27
28 static void permute(), perminit(), spinit();
29 static word32 f();
30
31
32 /* Tables defined in the Data Encryption Standard documents */
33
34 /* initial permutation IP */
35 static char ip[] = {
36 58, 50, 42, 34, 26, 18, 10, 2,
37 60, 52, 44, 36, 28, 20, 12, 4,
38 62, 54, 46, 38, 30, 22, 14, 6,
39 64, 56, 48, 40, 32, 24, 16, 8,
40 57, 49, 41, 33, 25, 17, 9, 1,
41 59, 51, 43, 35, 27, 19, 11, 3,
42 61, 53, 45, 37, 29, 21, 13, 5,
43 63, 55, 47, 39, 31, 23, 15, 7
44 };
45
46 /* final permutation IP^-1 */
47 static char fp[] = {
48 40, 8, 48, 16, 56, 24, 64, 32,
49 39, 7, 47, 15, 55, 23, 63, 31,
50 38, 6, 46, 14, 54, 22, 62, 30,
51 37, 5, 45, 13, 53, 21, 61, 29,
52 36, 4, 44, 12, 52, 20, 60, 28,
53 35, 3, 43, 11, 51, 19, 59, 27,
54 34, 2, 42, 10, 50, 18, 58, 26,
55 33, 1, 41, 9, 49, 17, 57, 25
56 };
57
58 /* expansion operation matrix
59 * This is for reference only; it is unused in the code
60 * as the f() function performs it implicitly for speed
61 */
62 #ifdef notdef
63 static char ei[] = {
64 32, 1, 2, 3, 4, 5,
65 4, 5, 6, 7, 8, 9,
66 8, 9, 10, 11, 12, 13,
67 12, 13, 14, 15, 16, 17,
68 16, 17, 18, 19, 20, 21,
69 20, 21, 22, 23, 24, 25,
70 24, 25, 26, 27, 28, 29,
71 28, 29, 30, 31, 32, 1
72 };
73 #endif
74
75 /* permuted choice table (key) */
76 static char pc1[] = {
77 57, 49, 41, 33, 25, 17, 9,
78 1, 58, 50, 42, 34, 26, 18,
79 10, 2, 59, 51, 43, 35, 27,
80 19, 11, 3, 60, 52, 44, 36,
81
82 63, 55, 47, 39, 31, 23, 15,
83 7, 62, 54, 46, 38, 30, 22,
84 14, 6, 61, 53, 45, 37, 29,
85 21, 13, 5, 28, 20, 12, 4
86 };
87
88 /* number left rotations of pc1 */
89 static char totrot[] = {
90 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28
91 };
92
93 /* permuted choice key (table) */
94 static char pc2[] = {
95 14, 17, 11, 24, 1, 5,
96 3, 28, 15, 6, 21, 10,
97 23, 19, 12, 4, 26, 8,
98 16, 7, 27, 20, 13, 2,
99 41, 52, 31, 37, 47, 55,
100 30, 40, 51, 45, 33, 48,
101 44, 49, 39, 56, 34, 53,
102 46, 42, 50, 36, 29, 32
103 };
104
105 /* The (in)famous S-boxes */
106 static char si[8][64] = {
107 /* S1 */
108 {14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
109 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
110 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
111 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13},
112
113 /* S2 */
114 {15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
115 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
116 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
117 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9},
118
119 /* S3 */
120 {10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
121 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
122 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
123 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12},
124
125 /* S4 */
126 {7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
127 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
128 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
129 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14},
130
131 /* S5 */
132 {2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
133 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
134 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
135 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3},
136
137 /* S6 */
138 {12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
139 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
140 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
141 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13},
142
143 /* S7 */
144 {4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
145 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
146 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
147 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12},
148
149 /* S8 */
150 {13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
151 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
152 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
153 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11},
154
155 };
156
157 /* 32-bit permutation function P used on the output of the S-boxes */
158 static char p32i[] = {
159 16, 7, 20, 21,
160 29, 12, 28, 17,
161 1, 15, 23, 26,
162 5, 18, 31, 10,
163 2, 8, 24, 14,
164 32, 27, 3, 9,
165 19, 13, 30, 6,
166 22, 11, 4, 25
167 };
168
169 /* End of DES-defined tables */
170
171 /* Lookup tables initialized once only at startup by desinit() */
172
173 /* bit 0 is left-most in byte */
174 static int bytebit[] = {
175 0200, 0100, 040, 020, 010, 04, 02, 01
176 };
177
178 static int nibblebit[] = {
179 010, 04, 02, 01
180 };
181
182 /* Allocate space and initialize DES lookup arrays
183 * mode == 0: standard Data Encryption Algorithm
184 */
185 int _mcrypt_3desinit(TRIPLEDES_KEY* key)
186 {
187
188 spinit( key, 0);
189 spinit( key, 1);
190 spinit( key, 2);
191 perminit( &key->iperm, ip);
192 perminit( &key->fperm, fp);
193
194
195 return 0;
196 }
197
198
199 /* Set key (initialize key schedule array) */
200 void _mcrypt_3des_set_key(TRIPLEDES_KEY* dkey, char* user_key, int len)
201 {
202 char pc1m[56]; /* place to modify pc1 into */
203 char pcr[56]; /* place to rotate pc1 into */
204 register int i, j, l;
205 int m;
206 char *user_key1 = &user_key[0];
207 char *user_key2 = &user_key[8];
208 char *user_key3 = &user_key[16];
209
210 _mcrypt_3desinit(dkey);
211
212 /* Clear key schedule */
213 Bzero( dkey->kn[0], 16 * 8);
214 Bzero( dkey->kn[1], 16 * 8);
215 Bzero( dkey->kn[2], 16 * 8);
216
217 /* DES 1 */
218 for (j = 0; j < 56; j++) { /* convert pc1 to bits of key */
219 l = pc1[j] - 1; /* integer bit location */
220 m = l & 07; /* find bit */
221 pc1m[j] = (user_key1[l >> 3] & /* find which key byte l is in */
222 bytebit[m]) /* and which bit of that byte */
223 ? 1 : 0; /* and store 1-bit result */
224
225 }
226 for (i = 0; i < 16; i++) { /* key chunk for each iteration */
227 for (j = 0; j < 56; j++) /* rotate pc1 the right amount */
228 pcr[j] =
229 pc1m[(l = j + totrot[i]) <
230 (j < 28 ? 28 : 56) ? l : l - 28];
231 /* rotate left and right halves independently */
232 for (j = 0; j < 48; j++) { /* select bits individually */
233 /* check bit that goes to kn[j] */
234 if (pcr[pc2[j] - 1]) {
235 /* mask it in if it's there */
236 l = j % 6;
237 dkey->kn[0][i][j / 6] |= bytebit[l] >> 2;
238 }
239 }
240 }
241 /* DES 2 */
242 for (j = 0; j < 56; j++) { /* convert pc1 to bits of key */
243 l = pc1[j] - 1; /* integer bit location */
244 m = l & 07; /* find bit */
245 pc1m[j] = (user_key2[l >> 3] & /* find which key byte l is in */
246 bytebit[m]) /* and which bit of that byte */
247 ? 1 : 0; /* and store 1-bit result */
248
249 }
250 for (i = 0; i < 16; i++) { /* key chunk for each iteration */
251 for (j = 0; j < 56; j++) /* rotate pc1 the right amount */
252 pcr[j] =
253 pc1m[(l = j + totrot[i]) <
254 (j < 28 ? 28 : 56) ? l : l - 28];
255 /* rotate left and right halves independently */
256 for (j = 0; j < 48; j++) { /* select bits individually */
257 /* check bit that goes to kn[j] */
258 if (pcr[pc2[j] - 1]) {
259 /* mask it in if it's there */
260 l = j % 6;
261 dkey->kn[1][i][j / 6] |= bytebit[l] >> 2;
262 }
263 }
264 }
265 /* DES 3 */
266 for (j = 0; j < 56; j++) { /* convert pc1 to bits of key */
267 l = pc1[j] - 1; /* integer bit location */
268 m = l & 07; /* find bit */
269 pc1m[j] = (user_key3[l >> 3] & /* find which key byte l is in */
270 bytebit[m]) /* and which bit of that byte */
271 ? 1 : 0; /* and store 1-bit result */
272
273 }
274 for (i = 0; i < 16; i++) { /* key chunk for each iteration */
275 for (j = 0; j < 56; j++) /* rotate pc1 the right amount */
276 pcr[j] =
277 pc1m[(l = j + totrot[i]) <
278 (j < 28 ? 28 : 56) ? l : l - 28];
279 /* rotate left and right halves independently */
280 for (j = 0; j < 48; j++) { /* select bits individually */
281 /* check bit that goes to kn[j] */
282 if (pcr[pc2[j] - 1]) {
283 /* mask it in if it's there */
284 l = j % 6;
285 dkey->kn[2][i][j / 6] |= bytebit[l] >> 2;
286 }
287 }
288 }
289 }
290
291
292
293
294 /* In-place encryption of 64-bit block */
295
296 void _mcrypt_3des_encrypt(TRIPLEDES_KEY *key, char* block)
297 {
298 register word32 left, right;
299 register char *knp;
300 word32 work[2]; /* Working data storage */
301
302 /* DES 1 */
303 permute(block, key->iperm, (char *) work); /* Initial Permutation */
304 #ifndef WORDS_BIGENDIAN
305 left = byteswap(work[0]);
306 right = byteswap(work[1]);
307 #else
308 left = work[0];
309 right = work[1];
310 #endif
311
312 /* Do the 16 rounds.
313 * The rounds are numbered from 0 to 15. On even rounds
314 * the right half is fed to f() and the result exclusive-ORs
315 * the left half; on odd rounds the reverse is done.
316 */
317 knp = &key->kn[0][0][0];
318 left ^= f( key, 0, right, knp);
319 knp += 8;
320 right ^= f( key, 0, left, knp);
321 knp += 8;
322 left ^= f( key, 0, right, knp);
323 knp += 8;
324 right ^= f( key, 0, left, knp);
325 knp += 8;
326 left ^= f( key, 0, right, knp);
327 knp += 8;
328 right ^= f( key, 0, left, knp);
329 knp += 8;
330 left ^= f( key, 0, right, knp);
331 knp += 8;
332 right ^= f( key, 0, left, knp);
333 knp += 8;
334 left ^= f( key, 0, right, knp);
335 knp += 8;
336 right ^= f( key, 0, left, knp);
337 knp += 8;
338 left ^= f( key, 0, right, knp);
339 knp += 8;
340 right ^= f( key, 0, left, knp);
341 knp += 8;
342 left ^= f( key, 0, right, knp);
343 knp += 8;
344 right ^= f( key, 0, left, knp);
345 knp += 8;
346 left ^= f( key, 0, right, knp);
347 knp += 8;
348 right ^= f( key, 0, left, knp);
349
350 /* DES 2 */
351
352 /* Do the 16 rounds in reverse order.
353 * The rounds are numbered from 15 to 0. On even rounds
354 * the right half is fed to f() and the result exclusive-ORs
355 * the left half; on odd rounds the reverse is done.
356 */
357 knp = &key->kn[1][15][0];
358 right ^= f( key, 1, left, knp);
359 knp -= 8;
360 left ^= f( key, 1, right, knp);
361 knp -= 8;
362 right ^= f( key, 1, left, knp);
363 knp -= 8;
364 left ^= f( key, 1, right, knp);
365 knp -= 8;
366 right ^= f( key, 1, left, knp);
367 knp -= 8;
368 left ^= f( key, 1, right, knp);
369 knp -= 8;
370 right ^= f( key, 1, left, knp);
371 knp -= 8;
372 left ^= f( key, 1, right, knp);
373 knp -= 8;
374 right ^= f( key, 1, left, knp);
375 knp -= 8;
376 left ^= f( key, 1, right, knp);
377 knp -= 8;
378 right ^= f( key, 1, left, knp);
379 knp -= 8;
380 left ^= f( key, 1, right, knp);
381 knp -= 8;
382 right ^= f( key, 1, left, knp);
383 knp -= 8;
384 left ^= f( key, 1, right, knp);
385 knp -= 8;
386 right ^= f( key, 1, left, knp);
387 knp -= 8;
388 left ^= f( key, 1, right, knp);
389
390 /* Do the 16 rounds.
391 * The rounds are numbered from 0 to 15. On even rounds
392 * the right half is fed to f() and the result exclusive-ORs
393 * the left half; on odd rounds the reverse is done.
394 */
395 knp = &key->kn[2][0][0];
396 left ^= f( key, 2, right, knp);
397 knp += 8;
398 right ^= f( key, 2, left, knp);
399 knp += 8;
400 left ^= f( key, 2, right, knp);
401 knp += 8;
402 right ^= f( key, 2, left, knp);
403 knp += 8;
404 left ^= f( key, 2, right, knp);
405 knp += 8;
406 right ^= f( key, 2, left, knp);
407 knp += 8;
408 left ^= f( key, 2, right, knp);
409 knp += 8;
410 right ^= f( key, 2, left, knp);
411 knp += 8;
412 left ^= f( key, 2, right, knp);
413 knp += 8;
414 right ^= f( key, 2, left, knp);
415 knp += 8;
416 left ^= f( key, 2, right, knp);
417 knp += 8;
418 right ^= f( key, 2, left, knp);
419 knp += 8;
420 left ^= f( key, 2, right, knp);
421 knp += 8;
422 right ^= f( key, 2, left, knp);
423 knp += 8;
424 left ^= f( key, 2, right, knp);
425 knp += 8;
426 right ^= f( key, 2, left, knp);
427
428 /* Left/right half swap, plus byte swap if little-endian */
429 #ifndef WORDS_BIGENDIAN
430 work[1] = byteswap(left);
431 work[0] = byteswap(right);
432 #else
433 work[0] = right;
434 work[1] = left;
435 #endif
436 permute((char *) work, key->fperm, block); /* Inverse initial permutation */
437
438 }
439 /* In-place decryption of 64-bit block. This function is the mirror
440 * image of encryption; exactly the same steps are taken, but in
441 * reverse order
442 */
443 void _mcrypt_3des_decrypt(TRIPLEDES_KEY* key, char* block)
444 {
445 register word32 left, right;
446 register char *knp;
447 word32 work[2]; /* Working data storage */
448
449 permute(block, key->iperm, (char *) work); /* Initial permutation */
450
451 /* Left/right half swap, plus byte swap if little-endian */
452 #ifndef WORDS_BIGENDIAN
453 right = byteswap(work[0]);
454 left = byteswap(work[1]);
455 #else
456 right = work[0];
457 left = work[1];
458 #endif
459
460 /* DES 3 */
461
462 /* Do the 16 rounds in reverse order.
463 * The rounds are numbered from 15 to 0. On even rounds
464 * the right half is fed to f() and the result exclusive-ORs
465 * the left half; on odd rounds the reverse is done.
466 */
467 knp = &key->kn[2][15][0];
468 right ^= f( key, 2, left, knp);
469 knp -= 8;
470 left ^= f( key, 2, right, knp);
471 knp -= 8;
472 right ^= f( key, 2, left, knp);
473 knp -= 8;
474 left ^= f( key, 2, right, knp);
475 knp -= 8;
476 right ^= f( key, 2, left, knp);
477 knp -= 8;
478 left ^= f( key, 2, right, knp);
479 knp -= 8;
480 right ^= f( key, 2, left, knp);
481 knp -= 8;
482 left ^= f( key, 2, right, knp);
483 knp -= 8;
484 right ^= f( key, 2, left, knp);
485 knp -= 8;
486 left ^= f( key, 2, right, knp);
487 knp -= 8;
488 right ^= f( key, 2, left, knp);
489 knp -= 8;
490 left ^= f( key, 2, right, knp);
491 knp -= 8;
492 right ^= f( key, 2, left, knp);
493 knp -= 8;
494 left ^= f( key, 2, right, knp);
495 knp -= 8;
496 right ^= f( key, 2, left, knp);
497 knp -= 8;
498 left ^= f( key, 2, right, knp);
499
500
501 /* DES 2*/
502 /* Do the 16 rounds.
503 * The rounds are numbered from 0 to 15. On even rounds
504 * the right half is fed to f() and the result exclusive-ORs
505 * the left half; on odd rounds the reverse is done.
506 */
507 knp = &key->kn[1][0][0];
508 left ^= f( key, 1, right, knp);
509 knp += 8;
510 right ^= f( key, 1, left, knp);
511 knp += 8;
512 left ^= f( key, 1, right, knp);
513 knp += 8;
514 right ^= f( key, 1, left, knp);
515 knp += 8;
516 left ^= f( key, 1, right, knp);
517 knp += 8;
518 right ^= f( key, 1, left, knp);
519 knp += 8;
520 left ^= f( key, 1, right, knp);
521 knp += 8;
522 right ^= f( key, 1, left, knp);
523 knp += 8;
524 left ^= f( key, 1, right, knp);
525 knp += 8;
526 right ^= f( key, 1, left, knp);
527 knp += 8;
528 left ^= f( key, 1, right, knp);
529 knp += 8;
530 right ^= f( key, 1, left, knp);
531 knp += 8;
532 left ^= f( key, 1, right, knp);
533 knp += 8;
534 right ^= f( key, 1, left, knp);
535 knp += 8;
536 left ^= f( key, 1, right, knp);
537 knp += 8;
538 right ^= f( key, 1, left, knp);
539
540 /* DES 1 */
541 /* Do the 16 rounds in reverse order.
542 * The rounds are numbered from 15 to 0. On even rounds
543 * the right half is fed to f() and the result exclusive-ORs
544 * the left half; on odd rounds the reverse is done.
545 */
546 knp = &key->kn[0][15][0];
547 right ^= f( key, 0, left, knp);
548 knp -= 8;
549 left ^= f( key, 0, right, knp);
550 knp -= 8;
551 right ^= f( key, 0, left, knp);
552 knp -= 8;
553 left ^= f( key, 0, right, knp);
554 knp -= 8;
555 right ^= f( key, 0, left, knp);
556 knp -= 8;
557 left ^= f( key, 0, right, knp);
558 knp -= 8;
559 right ^= f( key, 0, left, knp);
560 knp -= 8;
561 left ^= f( key, 0, right, knp);
562 knp -= 8;
563 right ^= f( key, 0, left, knp);
564 knp -= 8;
565 left ^= f( key, 0, right, knp);
566 knp -= 8;
567 right ^= f( key, 0, left, knp);
568 knp -= 8;
569 left ^= f( key, 0, right, knp);
570 knp -= 8;
571 right ^= f( key, 0, left, knp);
572 knp -= 8;
573 left ^= f( key, 0, right, knp);
574 knp -= 8;
575 right ^= f( key, 0, left, knp);
576 knp -= 8;
577 left ^= f( key, 0, right, knp);
578
579
580 #ifndef WORDS_BIGENDIAN
581 work[0] = byteswap(left);
582 work[1] = byteswap(right);
583 #else
584 work[0] = left;
585 work[1] = right;
586 #endif
587 permute((char *) work, key->fperm, block); /* Inverse initial permutation */
588 }
589
590 /* Permute inblock with perm */
591 static void permute( char* inblock, char perm[16][16][8], char *outblock)
592 {
593 register char *ib, *ob; /* ptr to input or output block */
594 register char *p, *q;
595 register int j;
596
597 if (perm == NULL) {
598 /* No permutation, just copy */
599 memmove(outblock, inblock, 8);
600 return;
601 }
602 /* Clear output block */
603 Bzero(outblock, 8);
604
605 ib = inblock;
606 for (j = 0; j < 16; j += 2, ib++) { /* for each input nibble */
607 ob = outblock;
608 p = perm[j][(*ib >> 4) & 0xf];
609 q = perm[j + 1][*ib & 0xf];
610 /* and each output byte, OR the masks together */
611 *ob++ |= *p++ | *q++;
612 *ob++ |= *p++ | *q++;
613 *ob++ |= *p++ | *q++;
614 *ob++ |= *p++ | *q++;
615 *ob++ |= *p++ | *q++;
616 *ob++ |= *p++ | *q++;
617 *ob++ |= *p++ | *q++;
618 *ob++ |= *p++ | *q++;
619 }
620 }
621
622 /* The nonlinear function f(r,k), the heart of DES */
623 static word32 f(TRIPLEDES_KEY* key, int pos, register word32 r, register char* subkey)
624 {
625 register word32 *spp;
626 register word32 rval, rt;
627 register int er;
628
629 #ifdef TRACE
630 printf("f(%08lx, %02x %02x %02x %02x %02x %02x %02x %02x) = ",
631 r,
632 subkey[0], subkey[1], subkey[2],
633 subkey[3], subkey[4], subkey[5], subkey[6], subkey[7]);
634 #endif
635 /* Run E(R) ^ K through the combined S & P boxes.
636 * This code takes advantage of a convenient regularity in
637 * E, namely that each group of 6 bits in E(R) feeding
638 * a single S-box is a contiguous segment of R.
639 */
640 subkey += 7;
641
642 /* Compute E(R) for each block of 6 bits, and run thru boxes */
643 er = ((int) r << 1) | ((r & 0x80000000) ? 1 : 0);
644 spp = &key->sp[pos][7][0];
645 rval = spp[(er ^ *subkey--) & 0x3f];
646 spp -= 64;
647 rt = (word32) r >> 3;
648 rval |= spp[((int) rt ^ *subkey--) & 0x3f];
649 spp -= 64;
650 rt >>= 4;
651 rval |= spp[((int) rt ^ *subkey--) & 0x3f];
652 spp -= 64;
653 rt >>= 4;
654 rval |= spp[((int) rt ^ *subkey--) & 0x3f];
655 spp -= 64;
656 rt >>= 4;
657 rval |= spp[((int) rt ^ *subkey--) & 0x3f];
658 spp -= 64;
659 rt >>= 4;
660 rval |= spp[((int) rt ^ *subkey--) & 0x3f];
661 spp -= 64;
662 rt >>= 4;
663 rval |= spp[((int) rt ^ *subkey--) & 0x3f];
664 spp -= 64;
665 rt >>= 4;
666 rt |= (r & 1) << 5;
667 rval |= spp[((int) rt ^ *subkey) & 0x3f];
668 #ifdef TRACE
669 printf(" %08lx\n", rval);
670 #endif
671 return rval;
672 }
673 /* initialize a perm array */
674 static void perminit(char perm[16][16][8], char p[64])
675 {
676 register int l, j, k;
677 int i, m;
678
679 /* Clear the permutation array */
680 Bzero((char *) perm, 16 * 16 * 8);
681
682 for (i = 0; i < 16; i++) /* each input nibble position */
683 for (j = 0; j < 16; j++) /* each possible input nibble */
684 for (k = 0; k < 64; k++) { /* each output bit position */
685 l = p[k] - 1; /* where does this bit come from */
686 if ((l >> 2) != i) /* does it come from input posn? */
687 continue; /* if not, bit k is 0 */
688 if (!(j & nibblebit[l & 3]))
689 continue; /* any such bit in input? */
690 m = k & 07; /* which bit is this in the byte */
691 perm[i][j][k >> 3] |= bytebit[m];
692 }
693 }
694
695 /* Initialize the lookup table for the combined S and P boxes */
696 static void spinit(TRIPLEDES_KEY* key, int pos)
697 {
698 char pbox[32];
699 int p, i, s, j, rowcol;
700 word32 val;
701
702 /* Compute pbox, the inverse of p32i.
703 * This is easier to work with
704 */
705 for (p = 0; p < 32; p++) {
706 for (i = 0; i < 32; i++) {
707 if (p32i[i] - 1 == p) {
708 pbox[p] = i;
709 break;
710 }
711 }
712 }
713 for (s = 0; s < 8; s++) { /* For each S-box */
714 for (i = 0; i < 64; i++) { /* For each possible input */
715 val = 0;
716 /* The row number is formed from the first and last
717 * bits; the column number is from the middle 4
718 */
719 rowcol =
720 (i & 32) | ((i & 1) ? 16 : 0) | ((i >> 1) &
721 0xf);
722 for (j = 0; j < 4; j++) { /* For each output bit */
723 if (si[s][rowcol] & (8 >> j)) {
724 val |=
725 1L << (31 - pbox[4 * s + j]);
726 }
727 }
728 key->sp[pos][s][i] = val;
729
730 #ifdef DEBUG
731 printf("sp[%d][%2d] = %08lx\n", s, i, sp[pos][s][i]);
732 #endif
733 }
734 }
735 }

webmaster@linux.gr
ViewVC Help
Powered by ViewVC 1.1.26