|
|
1.1.1.2 root 1: // serpent.cpp - written and placed in the public domain by Wei Dai
1.1 root 2:
1.1.1.2 root 3: /* Adapted for TrueCrypt by the TrueCrypt Foundation */
1.1 root 4:
1.1.1.2 root 5: #include "Serpent.h"
1.1.1.3 root 6: #include "Common/Endian.h"
1.1 root 7:
1.1.1.2 root 8: #ifndef LINUX_DRIVER
9: #include <memory.h>
10: #endif
1.1 root 11:
1.1.1.2 root 12: #if defined(_WIN32) && !defined(_DEBUG)
13: #include <stdlib.h>
14: #define rotlFixed _rotl
15: #define rotrFixed _rotr
1.1 root 16: #else
1.1.1.2 root 17: #define rotlFixed(x,n) (((x) << (n)) | ((x) >> (32 - (n))))
18: #define rotrFixed(x,n) (((x) >> (n)) | ((x) << (32 - (n))))
1.1 root 19: #endif
20:
1.1.1.2 root 21: // linear transformation
22: #define LT(i,a,b,c,d,e) {\
23: a = rotlFixed(a, 13); \
24: c = rotlFixed(c, 3); \
25: d = rotlFixed(d ^ c ^ (a << 3), 7); \
26: b = rotlFixed(b ^ a ^ c, 1); \
27: a = rotlFixed(a ^ b ^ d, 5); \
28: c = rotlFixed(c ^ d ^ (b << 7), 22);}
29:
30: // inverse linear transformation
31: #define ILT(i,a,b,c,d,e) {\
32: c = rotrFixed(c, 22); \
33: a = rotrFixed(a, 5); \
34: c ^= d ^ (b << 7); \
35: a ^= b ^ d; \
36: b = rotrFixed(b, 1); \
37: d = rotrFixed(d, 7) ^ c ^ (a << 3); \
38: b ^= a ^ c; \
39: c = rotrFixed(c, 3); \
40: a = rotrFixed(a, 13);}
41:
42: // order of output from S-box functions
43: #define beforeS0(f) f(0,a,b,c,d,e)
44: #define afterS0(f) f(1,b,e,c,a,d)
45: #define afterS1(f) f(2,c,b,a,e,d)
46: #define afterS2(f) f(3,a,e,b,d,c)
47: #define afterS3(f) f(4,e,b,d,c,a)
48: #define afterS4(f) f(5,b,a,e,c,d)
49: #define afterS5(f) f(6,a,c,b,e,d)
50: #define afterS6(f) f(7,a,c,d,b,e)
51: #define afterS7(f) f(8,d,e,b,a,c)
52:
53: // order of output from inverse S-box functions
54: #define beforeI7(f) f(8,a,b,c,d,e)
55: #define afterI7(f) f(7,d,a,b,e,c)
56: #define afterI6(f) f(6,a,b,c,e,d)
57: #define afterI5(f) f(5,b,d,e,c,a)
58: #define afterI4(f) f(4,b,c,e,a,d)
59: #define afterI3(f) f(3,a,b,e,c,d)
60: #define afterI2(f) f(2,b,d,e,c,a)
61: #define afterI1(f) f(1,a,b,c,e,d)
62: #define afterI0(f) f(0,a,d,b,e,c)
63:
64: // The instruction sequences for the S-box functions
65: // come from Dag Arne Osvik's paper "Speeding up Serpent".
66:
67: #define S0(i, r0, r1, r2, r3, r4) \
68: { \
69: r3 ^= r0; \
70: r4 = r1; \
71: r1 &= r3; \
72: r4 ^= r2; \
73: r1 ^= r0; \
74: r0 |= r3; \
75: r0 ^= r4; \
76: r4 ^= r3; \
77: r3 ^= r2; \
78: r2 |= r1; \
79: r2 ^= r4; \
80: r4 = ~r4; \
81: r4 |= r1; \
82: r1 ^= r3; \
83: r1 ^= r4; \
84: r3 |= r0; \
85: r1 ^= r3; \
86: r4 ^= r3; \
87: }
88:
89: #define I0(i, r0, r1, r2, r3, r4) \
90: { \
91: r2 = ~r2; \
92: r4 = r1; \
93: r1 |= r0; \
94: r4 = ~r4; \
95: r1 ^= r2; \
96: r2 |= r4; \
97: r1 ^= r3; \
98: r0 ^= r4; \
99: r2 ^= r0; \
100: r0 &= r3; \
101: r4 ^= r0; \
102: r0 |= r1; \
103: r0 ^= r2; \
104: r3 ^= r4; \
105: r2 ^= r1; \
106: r3 ^= r0; \
107: r3 ^= r1; \
108: r2 &= r3; \
109: r4 ^= r2; \
110: }
111:
112: #define S1(i, r0, r1, r2, r3, r4) \
113: { \
114: r0 = ~r0; \
115: r2 = ~r2; \
116: r4 = r0; \
117: r0 &= r1; \
118: r2 ^= r0; \
119: r0 |= r3; \
120: r3 ^= r2; \
121: r1 ^= r0; \
122: r0 ^= r4; \
123: r4 |= r1; \
124: r1 ^= r3; \
125: r2 |= r0; \
126: r2 &= r4; \
127: r0 ^= r1; \
128: r1 &= r2; \
129: r1 ^= r0; \
130: r0 &= r2; \
131: r0 ^= r4; \
132: }
133:
134: #define I1(i, r0, r1, r2, r3, r4) \
135: { \
136: r4 = r1; \
137: r1 ^= r3; \
138: r3 &= r1; \
139: r4 ^= r2; \
140: r3 ^= r0; \
141: r0 |= r1; \
142: r2 ^= r3; \
143: r0 ^= r4; \
144: r0 |= r2; \
145: r1 ^= r3; \
146: r0 ^= r1; \
147: r1 |= r3; \
148: r1 ^= r0; \
149: r4 = ~r4; \
150: r4 ^= r1; \
151: r1 |= r0; \
152: r1 ^= r0; \
153: r1 |= r4; \
154: r3 ^= r1; \
155: }
156:
157: #define S2(i, r0, r1, r2, r3, r4) \
158: { \
159: r4 = r0; \
160: r0 &= r2; \
161: r0 ^= r3; \
162: r2 ^= r1; \
163: r2 ^= r0; \
164: r3 |= r4; \
165: r3 ^= r1; \
166: r4 ^= r2; \
167: r1 = r3; \
168: r3 |= r4; \
169: r3 ^= r0; \
170: r0 &= r1; \
171: r4 ^= r0; \
172: r1 ^= r3; \
173: r1 ^= r4; \
174: r4 = ~r4; \
175: }
176:
177: #define I2(i, r0, r1, r2, r3, r4) \
178: { \
179: r2 ^= r3; \
180: r3 ^= r0; \
181: r4 = r3; \
182: r3 &= r2; \
183: r3 ^= r1; \
184: r1 |= r2; \
185: r1 ^= r4; \
186: r4 &= r3; \
187: r2 ^= r3; \
188: r4 &= r0; \
189: r4 ^= r2; \
190: r2 &= r1; \
191: r2 |= r0; \
192: r3 = ~r3; \
193: r2 ^= r3; \
194: r0 ^= r3; \
195: r0 &= r1; \
196: r3 ^= r4; \
197: r3 ^= r0; \
198: }
199:
200: #define S3(i, r0, r1, r2, r3, r4) \
201: { \
202: r4 = r0; \
203: r0 |= r3; \
204: r3 ^= r1; \
205: r1 &= r4; \
206: r4 ^= r2; \
207: r2 ^= r3; \
208: r3 &= r0; \
209: r4 |= r1; \
210: r3 ^= r4; \
211: r0 ^= r1; \
212: r4 &= r0; \
213: r1 ^= r3; \
214: r4 ^= r2; \
215: r1 |= r0; \
216: r1 ^= r2; \
217: r0 ^= r3; \
218: r2 = r1; \
219: r1 |= r3; \
220: r1 ^= r0; \
221: }
222:
223: #define I3(i, r0, r1, r2, r3, r4) \
224: { \
225: r4 = r2; \
226: r2 ^= r1; \
227: r1 &= r2; \
228: r1 ^= r0; \
229: r0 &= r4; \
230: r4 ^= r3; \
231: r3 |= r1; \
232: r3 ^= r2; \
233: r0 ^= r4; \
234: r2 ^= r0; \
235: r0 |= r3; \
236: r0 ^= r1; \
237: r4 ^= r2; \
238: r2 &= r3; \
239: r1 |= r3; \
240: r1 ^= r2; \
241: r4 ^= r0; \
242: r2 ^= r4; \
243: }
244:
245: #define S4(i, r0, r1, r2, r3, r4) \
246: { \
247: r1 ^= r3; \
248: r3 = ~r3; \
249: r2 ^= r3; \
250: r3 ^= r0; \
251: r4 = r1; \
252: r1 &= r3; \
253: r1 ^= r2; \
254: r4 ^= r3; \
255: r0 ^= r4; \
256: r2 &= r4; \
257: r2 ^= r0; \
258: r0 &= r1; \
259: r3 ^= r0; \
260: r4 |= r1; \
261: r4 ^= r0; \
262: r0 |= r3; \
263: r0 ^= r2; \
264: r2 &= r3; \
265: r0 = ~r0; \
266: r4 ^= r2; \
267: }
268:
269: #define I4(i, r0, r1, r2, r3, r4) \
270: { \
271: r4 = r2; \
272: r2 &= r3; \
273: r2 ^= r1; \
274: r1 |= r3; \
275: r1 &= r0; \
276: r4 ^= r2; \
277: r4 ^= r1; \
278: r1 &= r2; \
279: r0 = ~r0; \
280: r3 ^= r4; \
281: r1 ^= r3; \
282: r3 &= r0; \
283: r3 ^= r2; \
284: r0 ^= r1; \
285: r2 &= r0; \
286: r3 ^= r0; \
287: r2 ^= r4; \
288: r2 |= r3; \
289: r3 ^= r0; \
290: r2 ^= r1; \
291: }
292:
293: #define S5(i, r0, r1, r2, r3, r4) \
294: { \
295: r0 ^= r1; \
296: r1 ^= r3; \
297: r3 = ~r3; \
298: r4 = r1; \
299: r1 &= r0; \
300: r2 ^= r3; \
301: r1 ^= r2; \
302: r2 |= r4; \
303: r4 ^= r3; \
304: r3 &= r1; \
305: r3 ^= r0; \
306: r4 ^= r1; \
307: r4 ^= r2; \
308: r2 ^= r0; \
309: r0 &= r3; \
310: r2 = ~r2; \
311: r0 ^= r4; \
312: r4 |= r3; \
313: r2 ^= r4; \
314: }
315:
316: #define I5(i, r0, r1, r2, r3, r4) \
317: { \
318: r1 = ~r1; \
319: r4 = r3; \
320: r2 ^= r1; \
321: r3 |= r0; \
322: r3 ^= r2; \
323: r2 |= r1; \
324: r2 &= r0; \
325: r4 ^= r3; \
326: r2 ^= r4; \
327: r4 |= r0; \
328: r4 ^= r1; \
329: r1 &= r2; \
330: r1 ^= r3; \
331: r4 ^= r2; \
332: r3 &= r4; \
333: r4 ^= r1; \
334: r3 ^= r0; \
335: r3 ^= r4; \
336: r4 = ~r4; \
337: }
338:
339: #define S6(i, r0, r1, r2, r3, r4) \
340: { \
341: r2 = ~r2; \
342: r4 = r3; \
343: r3 &= r0; \
344: r0 ^= r4; \
345: r3 ^= r2; \
346: r2 |= r4; \
347: r1 ^= r3; \
348: r2 ^= r0; \
349: r0 |= r1; \
350: r2 ^= r1; \
351: r4 ^= r0; \
352: r0 |= r3; \
353: r0 ^= r2; \
354: r4 ^= r3; \
355: r4 ^= r0; \
356: r3 = ~r3; \
357: r2 &= r4; \
358: r2 ^= r3; \
359: }
360:
361: #define I6(i, r0, r1, r2, r3, r4) \
362: { \
363: r0 ^= r2; \
364: r4 = r2; \
365: r2 &= r0; \
366: r4 ^= r3; \
367: r2 = ~r2; \
368: r3 ^= r1; \
369: r2 ^= r3; \
370: r4 |= r0; \
371: r0 ^= r2; \
372: r3 ^= r4; \
373: r4 ^= r1; \
374: r1 &= r3; \
375: r1 ^= r0; \
376: r0 ^= r3; \
377: r0 |= r2; \
378: r3 ^= r1; \
379: r4 ^= r0; \
380: }
381:
382: #define S7(i, r0, r1, r2, r3, r4) \
383: { \
384: r4 = r2; \
385: r2 &= r1; \
386: r2 ^= r3; \
387: r3 &= r1; \
388: r4 ^= r2; \
389: r2 ^= r1; \
390: r1 ^= r0; \
391: r0 |= r4; \
392: r0 ^= r2; \
393: r3 ^= r1; \
394: r2 ^= r3; \
395: r3 &= r0; \
396: r3 ^= r4; \
397: r4 ^= r2; \
398: r2 &= r0; \
399: r4 = ~r4; \
400: r2 ^= r4; \
401: r4 &= r0; \
402: r1 ^= r3; \
403: r4 ^= r1; \
404: }
405:
406: #define I7(i, r0, r1, r2, r3, r4) \
407: { \
408: r4 = r2; \
409: r2 ^= r0; \
410: r0 &= r3; \
411: r2 = ~r2; \
412: r4 |= r3; \
413: r3 ^= r1; \
414: r1 |= r0; \
415: r0 ^= r2; \
416: r2 &= r4; \
417: r1 ^= r2; \
418: r2 ^= r0; \
419: r0 |= r2; \
420: r3 &= r4; \
421: r0 ^= r3; \
422: r4 ^= r1; \
423: r3 ^= r4; \
424: r4 |= r0; \
425: r3 ^= r2; \
426: r4 ^= r2; \
427: }
428:
429: // key xor
430: #define KX(r, a, b, c, d, e) {\
431: a ^= k[4 * r + 0]; \
432: b ^= k[4 * r + 1]; \
433: c ^= k[4 * r + 2]; \
434: d ^= k[4 * r + 3];}
1.1 root 435:
436:
1.1.1.2 root 437: void serpent_set_key(const unsigned __int8 userKey[], int keylen, unsigned __int8 *ks)
1.1 root 438: {
1.1.1.2 root 439: unsigned __int32 a,b,c,d,e;
440: unsigned __int32 *k = (unsigned __int32 *)ks;
441: unsigned __int32 t;
442: int i;
443:
444: for (i = 0; i < keylen / (int)sizeof(__int32); i++)
445: k[i] = LE32(((unsigned __int32*)userKey)[i]);
446:
447: if (keylen < 32)
448: k[keylen/4] |= (unsigned __int32)1 << ((keylen%4)*8);
449:
450: k += 8;
451: t = k[-1];
452: for (i = 0; i < 132; ++i)
453: k[i] = t = rotlFixed(k[i-8] ^ k[i-5] ^ k[i-3] ^ t ^ 0x9e3779b9 ^ i, 11);
454: k -= 20;
455:
456: #define LK(r, a, b, c, d, e) {\
457: a = k[(8-r)*4 + 0]; \
458: b = k[(8-r)*4 + 1]; \
459: c = k[(8-r)*4 + 2]; \
460: d = k[(8-r)*4 + 3];}
461:
462: #define SK(r, a, b, c, d, e) {\
463: k[(8-r)*4 + 4] = a; \
464: k[(8-r)*4 + 5] = b; \
465: k[(8-r)*4 + 6] = c; \
466: k[(8-r)*4 + 7] = d;} \
467:
468: for (i=0; i<4; i++)
469: {
470: afterS2(LK); afterS2(S3); afterS3(SK);
471: afterS1(LK); afterS1(S2); afterS2(SK);
472: afterS0(LK); afterS0(S1); afterS1(SK);
473: beforeS0(LK); beforeS0(S0); afterS0(SK);
474: k += 8*4;
475: afterS6(LK); afterS6(S7); afterS7(SK);
476: afterS5(LK); afterS5(S6); afterS6(SK);
477: afterS4(LK); afterS4(S5); afterS5(SK);
478: afterS3(LK); afterS3(S4); afterS4(SK);
479: }
480: afterS2(LK); afterS2(S3); afterS3(SK);
1.1 root 481: }
482:
1.1.1.4 ! root 483: #ifndef TC_MINIMIZE_CODE_SIZE
1.1 root 484:
1.1.1.2 root 485: void serpent_encrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks)
1.1 root 486: {
1.1.1.2 root 487: unsigned __int32 a, b, c, d, e;
488: unsigned int i=1;
489: const unsigned __int32 *k = (unsigned __int32 *)ks + 8;
490: unsigned __int32 *in = (unsigned __int32 *) inBlock;
491: unsigned __int32 *out = (unsigned __int32 *) outBlock;
492:
493: a = LE32(in[0]);
494: b = LE32(in[1]);
495: c = LE32(in[2]);
496: d = LE32(in[3]);
497:
498: do
499: {
500: beforeS0(KX); beforeS0(S0); afterS0(LT);
501: afterS0(KX); afterS0(S1); afterS1(LT);
502: afterS1(KX); afterS1(S2); afterS2(LT);
503: afterS2(KX); afterS2(S3); afterS3(LT);
504: afterS3(KX); afterS3(S4); afterS4(LT);
505: afterS4(KX); afterS4(S5); afterS5(LT);
506: afterS5(KX); afterS5(S6); afterS6(LT);
507: afterS6(KX); afterS6(S7);
508:
509: if (i == 4)
510: break;
511:
512: ++i;
513: c = b;
514: b = e;
515: e = d;
516: d = a;
517: a = e;
518: k += 32;
519: beforeS0(LT);
520: }
521: while (1);
522:
523: afterS7(KX);
524:
525: out[0] = LE32(d);
526: out[1] = LE32(e);
527: out[2] = LE32(b);
528: out[3] = LE32(a);
529: }
1.1 root 530:
1.1.1.4 ! root 531: #else // TC_MINIMIZE_CODE_SIZE
! 532:
! 533: typedef unsigned __int32 uint32;
! 534:
! 535: void LTf (uint32 *a, uint32 *b, uint32 *c, uint32 *d)
! 536: {
! 537: *a = rotlFixed(*a, 13);
! 538: *c = rotlFixed(*c, 3);
! 539: *d = rotlFixed(*d ^ *c ^ (*a << 3), 7);
! 540: *b = rotlFixed(*b ^ *a ^ *c, 1);
! 541: *a = rotlFixed(*a ^ *b ^ *d, 5);
! 542: *c = rotlFixed(*c ^ *d ^ (*b << 7), 22);
! 543: }
! 544:
! 545: // order of output from S-box functions
! 546: #define beforeS0LT LTf (&a,&b,&c,&d)
! 547: #define afterS0LT LTf (&b,&e,&c,&a)
! 548: #define afterS1LT LTf (&c,&b,&a,&e)
! 549: #define afterS2LT LTf (&a,&e,&b,&d)
! 550: #define afterS3LT LTf (&e,&b,&d,&c)
! 551: #define afterS4LT LTf (&b,&a,&e,&c)
! 552: #define afterS5LT LTf (&a,&c,&b,&e)
! 553: #define afterS6LT LTf (&a,&c,&d,&b)
! 554: #define afterS7LT LTf (&d,&e,&b,&a)
! 555:
! 556:
! 557: void serpent_encrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks)
! 558: {
! 559: unsigned __int32 a, b, c, d, e;
! 560: unsigned int i=1;
! 561: const unsigned __int32 *k = (unsigned __int32 *)ks + 8;
! 562: unsigned __int32 *in = (unsigned __int32 *) inBlock;
! 563: unsigned __int32 *out = (unsigned __int32 *) outBlock;
! 564:
! 565: a = LE32(in[0]);
! 566: b = LE32(in[1]);
! 567: c = LE32(in[2]);
! 568: d = LE32(in[3]);
! 569:
! 570: do
! 571: {
! 572: beforeS0(KX); beforeS0(S0); afterS0LT;
! 573: afterS0(KX); afterS0(S1); afterS1LT;
! 574: afterS1(KX); afterS1(S2); afterS2LT;
! 575: afterS2(KX); afterS2(S3); afterS3LT;
! 576: afterS3(KX); afterS3(S4); afterS4LT;
! 577: afterS4(KX); afterS4(S5); afterS5LT;
! 578: afterS5(KX); afterS5(S6); afterS6LT;
! 579: afterS6(KX); afterS6(S7);
! 580:
! 581: if (i == 4)
! 582: break;
! 583:
! 584: ++i;
! 585: c = b;
! 586: b = e;
! 587: e = d;
! 588: d = a;
! 589: a = e;
! 590: k += 32;
! 591: beforeS0LT;
! 592: }
! 593: while (1);
! 594:
! 595: afterS7(KX);
! 596:
! 597: out[0] = LE32(d);
! 598: out[1] = LE32(e);
! 599: out[2] = LE32(b);
! 600: out[3] = LE32(a);
! 601: }
! 602:
! 603: #endif // TC_MINIMIZE_CODE_SIZE
! 604:
! 605: #ifndef TC_MINIMIZE_CODE_SIZE
1.1.1.2 root 606:
607: void serpent_decrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks)
608: {
609: unsigned __int32 a, b, c, d, e;
610: const unsigned __int32 *k = (unsigned __int32 *)ks + 104;
611: unsigned int i=4;
612: unsigned __int32 *in = (unsigned __int32 *) inBlock;
613: unsigned __int32 *out = (unsigned __int32 *) outBlock;
614:
615: a = LE32(in[0]);
616: b = LE32(in[1]);
617: c = LE32(in[2]);
618: d = LE32(in[3]);
619:
620: beforeI7(KX);
621: goto start;
622:
623: do
624: {
625: c = b;
626: b = d;
627: d = e;
628: k -= 32;
629: beforeI7(ILT);
630: start:
631: beforeI7(I7); afterI7(KX);
632: afterI7(ILT); afterI7(I6); afterI6(KX);
633: afterI6(ILT); afterI6(I5); afterI5(KX);
634: afterI5(ILT); afterI5(I4); afterI4(KX);
635: afterI4(ILT); afterI4(I3); afterI3(KX);
636: afterI3(ILT); afterI3(I2); afterI2(KX);
637: afterI2(ILT); afterI2(I1); afterI1(KX);
638: afterI1(ILT); afterI1(I0); afterI0(KX);
639: }
640: while (--i != 0);
641:
642: out[0] = LE32(a);
643: out[1] = LE32(d);
644: out[2] = LE32(b);
645: out[3] = LE32(e);
1.1 root 646: }
1.1.1.4 ! root 647:
! 648: #else // TC_MINIMIZE_CODE_SIZE
! 649:
! 650: void ILTf (uint32 *a, uint32 *b, uint32 *c, uint32 *d)
! 651: {
! 652: *c = rotrFixed(*c, 22);
! 653: *a = rotrFixed(*a, 5);
! 654: *c ^= *d ^ (*b << 7);
! 655: *a ^= *b ^ *d;
! 656: *b = rotrFixed(*b, 1);
! 657: *d = rotrFixed(*d, 7) ^ *c ^ (*a << 3);
! 658: *b ^= *a ^ *c;
! 659: *c = rotrFixed(*c, 3);
! 660: *a = rotrFixed(*a, 13);
! 661: }
! 662:
! 663: #define beforeI7ILT ILTf (&a,&b,&c,&d)
! 664: #define afterI7ILT ILTf (&d,&a,&b,&e)
! 665: #define afterI6ILT ILTf (&a,&b,&c,&e)
! 666: #define afterI5ILT ILTf (&b,&d,&e,&c)
! 667: #define afterI4ILT ILTf (&b,&c,&e,&a)
! 668: #define afterI3ILT ILTf (&a,&b,&e,&c)
! 669: #define afterI2ILT ILTf (&b,&d,&e,&c)
! 670: #define afterI1ILT ILTf (&a,&b,&c,&e)
! 671: #define afterI0ILT ILTf (&a,&d,&b,&e)
! 672:
! 673: void serpent_decrypt(const unsigned __int8 *inBlock, unsigned __int8 *outBlock, unsigned __int8 *ks)
! 674: {
! 675: unsigned __int32 a, b, c, d, e;
! 676: const unsigned __int32 *k = (unsigned __int32 *)ks + 104;
! 677: unsigned int i=4;
! 678: unsigned __int32 *in = (unsigned __int32 *) inBlock;
! 679: unsigned __int32 *out = (unsigned __int32 *) outBlock;
! 680:
! 681: a = LE32(in[0]);
! 682: b = LE32(in[1]);
! 683: c = LE32(in[2]);
! 684: d = LE32(in[3]);
! 685:
! 686: beforeI7(KX);
! 687: goto start;
! 688:
! 689: do
! 690: {
! 691: c = b;
! 692: b = d;
! 693: d = e;
! 694: k -= 32;
! 695: beforeI7(ILT);
! 696: start:
! 697: beforeI7(I7); afterI7(KX);
! 698: afterI7ILT; afterI7(I6); afterI6(KX);
! 699: afterI6ILT; afterI6(I5); afterI5(KX);
! 700: afterI5ILT; afterI5(I4); afterI4(KX);
! 701: afterI4ILT; afterI4(I3); afterI3(KX);
! 702: afterI3ILT; afterI3(I2); afterI2(KX);
! 703: afterI2ILT; afterI2(I1); afterI1(KX);
! 704: afterI1ILT; afterI1(I0); afterI0(KX);
! 705: }
! 706: while (--i != 0);
! 707:
! 708: out[0] = LE32(a);
! 709: out[1] = LE32(d);
! 710: out[2] = LE32(b);
! 711: out[3] = LE32(e);
! 712: }
! 713:
! 714: #endif // TC_MINIMIZE_CODE_SIZE
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.