|
|
1.1 root 1: sed 's/^ //' >README <<\*-*-END-*-*
2: To compile:
3:
4: cc -o hash2.0 hash2.0.c standardSBoxes2.c
5:
6: To run:
7:
8: <inputFile hash2.0
9:
10: The inputFile is read and a hash value computed from it. The hash
11: value is then printed on standard out.
12:
13: options:
14:
15: You can increase the number of iterations to 4 by saying:
16:
17: <inputFile hash2.0 4
18:
19: You can increase the size of the output to 256 bits by saying:
20:
21: <inputFile hash2.0 4 256
22: *-*-END-*-*
23: sed 's/^ //' >hash2.0.c <<\*-*-END-*-*
24: /* This is a reference implementation of Snefru. Snefru is a one-way hash
25: function that provides authentication. It does not provide secrecy.
26:
27: Snefru is named after a Pharaoh of ancient Egypt.
28:
29:
30:
31: Copyright (c) Xerox Corporation 1989 All rights reserved.
32:
33: License to copy and use this software is granted provided that it is
34: identified as the 'Xerox Secure Hash Function' in all material mentioning
35: or referencing this software or this hash function.
36:
37: License is also granted to make and use derivative works provided that such
38: works are identified as 'derived from the Xerox Secure Hash Function' in
39: all material mentioning or referencing the derived work.
40:
41: Xerox Corporation makes no representations concerning either the
42: merchantability of this software or the suitability of this software for
43: any particular purpose. It is provided "as is" without express or implied
44: warranty of any kind.
45:
46: These notices must be retained in any copies of any part of this software.
47:
48:
49:
50: This is version 2.0, July 31, 1989.
51:
52: Version 2.0 is algorithmically different from versions 1.4 and 1.3.
53: In particular, version 2.0 makes the following changes:
54:
55: 1.) The S-boxes in version 2.0 have been computed in accordance with a
56: publicly known algorithm.
57:
58: 2.) The special case handling of inputs shorter than 64 bytes has been
59: deleted. This special case code offered little performance advantage and
60: increased the complexity of the algorithm. In addition, Coppersmith
61: noticed a weakness that affected the 128-bit-input/128-bit-output version
62: of Snefru (though not the 512-bit input/128-bit or 256-bit output version).
63:
64: 3.) The parameters p0, p1, and p2 have been eliminated. There are several
65: reasons for this change. The principle reason is that they increase the
66: complexity both of the code and the conceptual complexity of the hash
67: function, and provide only modest improvement in security.
68:
69: 4.) Because the parameter mechanism was used to distinguish between inputs
70: that differ only in the number of trailing 0 bits, a different mechanism
71: has been adopted. This new mechanism simply counts the number of bits in
72: the input, and then places this 64-bit bit-count into the rightmost
73: 64-bits of the last block hashed. A slightly different method of applying
74: the hash also been adopted.
75:
76: 5.) Several people requested a larger output (to provide greater
77: security). Because this will not always be needed, the algorithm was
78: modified to generate either 128 bits or 256 bits of output, depending on a
79: command line option. Notice that 128 bits of output only provides 64
80: "real" bits of security (because of square root attacks) and similarly 256
81: bits of output provides only 128 "real" bits of security. Use of the
82: higher security 256-bit output will slow down the algorithm by about 1/3
83: (32 bytes per application of Hash512 versus 48 bytes per application of
84: Hash512).
85:
86: 6.) Other non-algorithmic changes have been made to the code, in keeping
87: with various criticisms and comments.
88:
89:
90:
91: A 128 bit output should provide adequate security for most commercial
92: applications (barring discovery of some unexpected weakness in the
93: algorithm). Where higher security is desired, the 256-bit output
94: size can be used.
95:
96: Version 1.4 differs from Version 1.3 only in the wording of the export
97: notice. Version 1.3 forbids export entirely.
98:
99: Version 1.3 fixes a security bug in handling short files (64 bytes or less).
100: Such files should use the length of the file as a parameter to the hash,
101: to prevent two files of different lengths from producing the same hash
102: value if one file is a prefix of another. This had been done for long
103: files (greater than 64 bytes in length) but was overlooked for short
104: files.
105:
106: In addition, Version 1.3 improves the way in which the parameter is mixed
107: into the hash. In essence, the change mixes in the parameter one more
108: time. Although a similar effect can be achieved by increasing the security
109: parameter by 1 (e.g., from 2 to 3) this also increases the amount of
110: computation required by 50%.
111:
112: Version 1.3 also makes some more changes in the notices that accompany the
113: code.
114:
115: Version 1.2 makes no changes in the code. Only the notices that accompany
116: the code have changed, and some changes in the comments.
117:
118: Version 1.1 added the routine 'convertBytes' to convert an array of 'char'
119: into an array of unsigned long int. This conversion is a no-op on the SUN
120: and many other computers, but will have an effect on the VAX and computers
121: with 'backwards' byte ordering. It will also SLOW DOWN THE HASH FUNCTION,
122: so it should be removed whenever possible if speed is an issue.
123:
124: This program reads from the standard input until EOF is reached (the first
125: 'read' that does not return a full buffer of data). The data on the
126: standard input is 'hashed' with a cryptographically secure one-way hash
127: function (also known as a 'message digest', 'fingerprint', 'Manipulation
128: Detection Code' or 'MDC'). The hash is then printed on the standard
129: output.
130:
131: The input can be of any size. The output is either 128 bits printed as 32
132: characters in hex, or 256 bits printed as 64 characters in hex.
133:
134: The primary use of one-way hash functions is to determine if there have been
135: any unauthorized, malicious, or accidental changes made to a file. For
136: example, if an executable program file produces the hash '209884c4
137: 2e89d967 5456ac0e 61269550', then any change to that program file will
138: cause the hash to be changed. Thus, the tampering can be detected by
139: comparing the current output value with the previously computed (and
140: presumably correct) output value.
141:
142: Hash512 is the centrol routine in this program. It is used in this program
143: in a linear fashion -- i.e., a sequential file is hashed down by repeated
144: applications of Hash512. Changing a single bit in the file would then
145: require completely re-computing the hash from the point of change onward.
146:
147: Hash512 can be used in a tree-structured fashion to authenticate a large
148: table of data. This would imply that changing a single bit would not force
149: a complete re-computation of the hash value, but would instead require
150: only log n re-computations of Hash512 to 'patch up' the changes along the
151: path from the root to the changed leaf entry. A tree-structured
152: application also has the advantage that any single entry in the table can
153: subsequently be authenticated by someone who knows only the
154: 'authentication path' from the root of the tree to the leaf entry. These
155: concepts are discussed more thoroughly in 'Secrecy, Authentication, and
156: Public Key Systems' by Ralph C. Merkle, UMI Research Press, 1982 (see
157: particularly Chapter 2, 'One Way Hash Functions'). The use of a
158: tree-structured pattern of applications of a one-way hash function is
159: covered by U.S. Patent #4,309,569, 'Method of Providing Digital
160: Signatures' (contact Stanford University, Office of Technology Licensing).
161:
162:
163: At the present time (July 31, 1989) the author knows of no method for
164: 'breaking' this one-way function, (i.e., finding two input files that
165: produce the same output value). The algorithm has undergone some review
166: for security. Further review is expected. Use of this algorithm for
167: production use is not recomended at this time. Note that we are
168: specifically examining the security of Hash512 with a 512-bit input and a
169: 128-bit output, and Hash512 with a 512-bit input and a 256-bit output.
170: Use of other sizes is not recomended at this time. In particular, we
171: recomend against the use of output sizes smaller than 128 bits, and
172: recomend against the use of an input that is less than 2 (two) times the
173: size of the output. When the input size equals the output size, Snefru
174: suffers a serious degradation in security (an observation due to
175: Coppersmith).
176:
177: If anyone using this program finds two different inputs that produce the same
178: output, please contact Ralph C. Merkle via E-mail ([email protected]) or
179: via normal mail at: Xerox PARC 3333 Coyote Hill Road Palo Alto, CA 94304
180: (415) 494-4000
181:
182:
183: See the paper 'A Software One Way Hash Function', by Ralph C. Merkle, for a
184: more detailed explanation.
185:
186: The following test cases were taken directly from a terminal, and can be used
187: to verify the correct functioning of an implementation of Snefru. The
188: first input is simply a carriage return. The second input is '1', the
189: third input is '12', etc. The test sequence is repeated with security
190: parameter "4" and with the output size set to "256".
191:
192: % hash
193:
194: 13af7619 ab98d4b5 f5e0a9e6 b26b5452
195: % hash
196: 1
197: 578c83f8 8fe1f6a8 c119d2ba 3a9256c2
198: % hash
199: 12
200: 255468d4 b4bd985b 696a7313 6027fc80
201: % hash
202: 123
203: f5339a52 9c4dafc5 34fe3f0d 7a66baf7
204: % hash
205: 1234
206: 2645ff86 9a6c0ec6 5c49c20d d9050165
207: % hash
208: 12345
209: 387d2929 8ed52ece 88e64f38 fe4fdb11
210: % hash
211: 123456
212: f29f8915 d23a0e02 838cc2e2 75f5dfe7
213: % hash
214: 1234567
215: 4fb0f76e 9af16a2d 61844b9c e833e18f
216: % hash
217: 12345678
218: aacc56fc 85910fef e81fc697 6b061f4e
219: % hash
220: 123456789
221: e6997849 44ed68a1 c762ea1e 90c77967
222:
223:
224: % hash 4 256
225:
226: 6c504351 ce7f4b7a 93adb29a f9781ff9 2150f157 fee18661 eef511a3 fc83ddf
227: % hash 4 256
228: 1
229: 65d657f8 85ad8b4a b35999cc 3ded8b82 7cf71fa4 25424750 35778910 d6c2e320
230: % hash 4 256
231: 12
232: 7636f3d1 af139cf9 58f46f99 66221282 a444732a 7de59da5 d3481c6b bd6e7092
233: % hash 4 256
234: 123
235: cd3c7163 5b14c7c2 c24be864 4baab592 b8ab5b99 91ee5ee5 b3cf7a7f c6426ad7
236: % hash 4 256
237: 1234
238: 9ba783a1 290cb21e fe196a02 3286ece5 49394c75 1ddd607e 5d67c4dc 549c62eb
239: % hash 4 256
240: 12345
241: c9680da8 ef00d2f8 4459a8e9 b50ada71 c63cae6f dcb6f774 f6998783 30a4a1f4
242: % hash 4 256
243: 123456
244: 7656d389 f980bbe8 94152abe c6dc5f16 faf21c60 3b8f5098 861acf3c c059467b
245: % hash 4 256
246: 1234567
247: d96eb599 8377bb1d 74a02a2f ac9a85 3175250e 4796af36 36609747 372bba80
248: % hash 4 256
249: 12345678
250: b7818f09 2118e98a 140af09a 6cca4e6f 1eba88e7 52c20174 653637c9 d628f33f
251: % hash 4 256
252: 123456789
253: c2242249 1187baaa 94725400 8dffd5b 38f01557 9f3f2390 50969991 fdc1a810
254: %
255:
256:
257:
258: Note that 'unsigned long int' MUST be 32 bits
259:
260: Implementor: Ralph C. Merkle
261:
262: */
263:
264:
265:
266:
267: #define inputFile 0 /* normally set up for standard in */
268: #define errorFile 2 /* normally set up for standard error */
269:
270: /* WARNING: Changing the following parameter may affect security in
271: non-obvious ways */
272: #define inputBlockSize 16 /* size in 32-bit words of an input block to
273: the hash routine */
274: #define maxOutputBlockSize 8 /* size in 32-bit words of largest output
275: block from the hash routine */
276:
277:
278:
279: #define bufferSize 3072 /* MUST be 3 * 2**n, n > 5 */
280: #define bufferSizeInWords 768 /* MUST be bufferSize/4 */
281: #define maxSBoxCount 8
282: #define maxSBoxCountDiv2 4 /* has to equal maxSBoxCount/2, of course */
283: #define maxWordCount 16 /* maximum valid value for wordCount */
284:
285: /* Note that the following variable should be set either to 4 or to 8. */
286: int outputBlockSize = 4; /* default to normal 4 32-bit word or 128 bit
287: output size */
288:
289: /* default to normal 48-byte chunk size. Must be
290: inputBlockSize-outputBlockSize */
291: int chunkSize = 12;
292:
293: /* initialize the default value for the security parameter */
294: int securityLevel = 2;
295:
296: int shiftTable[4] = {16, 8, 16, 24};
297:
298: typedef unsigned long int sBox[256];
299:
300:
301: /* The standard S boxes must be defined in another file */
302: extern sBox standardSBoxes[maxSBoxCount];
303:
304:
305: /* an array needed only for the fast version of HashN -- Hash512. It's safe
306: to ignore this array if you don't need to understand the speeded up
307: version. Note that the 32-bit word specified by
308: 'rotatedRightStandardSBoxes[i][j][k]' is rotated right by i*8 bits */
309: sBox rotatedRightStandardSBoxes[4][maxSBoxCount];
310:
311:
312:
313: /* The following routine is a simple error exit routine -- it prints a
314: message and aborts */
315: void errAbort (s)
316: char *s;
317: {
318: int length;
319:
320: for (length = 0; s[length] != 0; length++);
321: if (write (errorFile, s, length) != length)
322: exit (2);
323: if (write (errorFile, "\n", 1) != 1)
324: exit (2);
325: exit (1);
326: };
327:
328:
329: /* The following routine converts a byte array to an array of unsigned long
330: int. It is primarily intended to eliminate the byte-ordering problem.
331: VAXes order the bytes in a character array differently than SUN's do. Note
332: that this routine will SLOW DOWN THE HASH FUNCTION */
333: void convertBytes (buffer, wordBuffer)
334: char buffer[bufferSize];
335: unsigned long int wordBuffer[bufferSizeInWords];
336:
337: {
338: int i;
339: unsigned long int t0, t1, t2, t3;
340:
341: /* buffer -- an input buffer of characters
342:
343: wordBuffer -- an output buffer of unsigned long int's
344:
345: */
346:
347: for (i = 0; i < bufferSizeInWords; i++) {
348:
349: t0 = buffer[4 * i];
350: t1 = buffer[4 * i + 1];
351: t2 = buffer[4 * i + 2];
352: t3 = buffer[4 * i + 3];
353: t0 &= 0xff;
354: t1 &= 0xff;
355: t2 &= 0xff;
356: t3 &= 0xff;
357: wordBuffer[i] = (t0 << 24) | (t1 << 16) | (t2 << 8) | t3;
358:
359: };
360:
361: };
362:
363:
364:
365: void HashN (output, wordCount, input, localSecurityLevel)
366: unsigned long int output[maxOutputBlockSize];
367: int wordCount;
368: unsigned long int input[];
369: int localSecurityLevel;
370:
371: {
372:
373: /* Note that we are computing localSecurityLevel * wordCount * 4
374: rounds. */
375:
376: unsigned long int mask;
377: unsigned long int block[maxWordCount]; /* holds the array of data
378: being hashed */
379: unsigned long int SBoxEntry; /* just a temporary */
380: int shift;
381: int i;
382: int index;
383: int next, last;
384: int byteInWord;
385:
386:
387: mask = wordCount - 1; /* presumes wordCount is a power of 2 */
388:
389:
390: /* Test for various error conditions and logic problems */
391:
392: if (localSecurityLevel * 2 > maxSBoxCount)
393: errAbort ("Too few S-boxes");
394: if (wordCount > maxWordCount)
395: errAbort ("Logic error, wordCount > maxWordCount");
396: if (wordCount != 16)
397: errAbort ("Security warning, input size not equal to 512 bits");
398: /* note that this routine will fail spectacularly on 8 byte blocks,
399: hence the following ban. */
400: if (wordCount < 4)
401: errAbort (" wordCount too small");
402: if ((wordCount & mask) != 0)
403: errAbort ("logic error, wordCount not a power of 2");
404: if (outputBlockSize > wordCount)
405: errAbort ("logic error, outputBlockSize is too big");
406: if ((outputBlockSize != 4) & (outputBlockSize != 8))
407: errAbort ("Output size neither 128 nor 256 bits");
408:
409: /* All the error condtions have now been checked -- everything should
410: work smoothly */
411:
412:
413: /* initialize the block to be encrypted from the input */
414: for (i = 0; i < wordCount; i++)
415: block[i] = input[i];
416:
417:
418:
419: for (index = 0; index < localSecurityLevel; index++) {
420:
421:
422: for (byteInWord = 0; byteInWord < 4; byteInWord++) {
423:
424:
425: for (i = 0; i < wordCount; i++) {
426: next = (i + 1) & mask;
427: last = (i + mask) & mask; /* really last = (i-1)
428: MOD wordCount */
429:
430: SBoxEntry = standardSBoxes[2 * index + ((i / 2) & 1)][block[i] & 0xff];
431: block[next] ^= SBoxEntry;
432: block[last] ^= SBoxEntry;
433: };
434:
435:
436: /* Rotate right all 32-bit words in the entire block
437: at once. */
438: shift = shiftTable[byteInWord];
439: for (i = 0; i < wordCount; i++)
440: block[i] = (block[i] >> shift) | (block[i] << (32 - shift));
441:
442:
443: }; /* end of byteInWord going from 0 to 3 */
444:
445:
446: }; /* end of index going from 0 to
447: localSecurityLevel-1 */
448:
449:
450:
451: for (i = 0; i < outputBlockSize; i++)
452: output[i] = input[i] ^ block[mask - i];
453:
454:
455: };
456:
457:
458:
459:
460: void Hash512 (output, input, localSecurityLevel)
461: unsigned long int output[maxOutputBlockSize];
462: unsigned long int input[];
463: int localSecurityLevel;
464:
465: {
466:
467: /* This routine is a specialized version of HashN. It is optimized
468: for speed, and assumes that the input is always 16 words long
469: It hashes 512 bits, hence its name. */
470: /* You need not try to figure out this routine unless you wish to
471: figure out a fast implementation of Snefru */
472:
473: /* the following are two pointers to S-boxes */
474: unsigned long int *SBox0;
475: unsigned long int *SBox1;
476:
477:
478: /* the array 'block' is divided into 16 distinct variables */
479: unsigned long int block0, block1, block2, block3;
480: unsigned long int block4, block5, block6, block7;
481: unsigned long int block8, block9, block10, block11;
482: unsigned long int block12, block13, block14, block15;
483:
484: unsigned long int SBoxEntry; /* just a temporary */
485: int index;
486:
487: if (inputBlockSize != 16)
488: errAbort ("Hash512 called with inputBlockSize != 16");
489: if ((outputBlockSize != 4) & (outputBlockSize != 8))
490: errAbort ("Hash512 called with outputBlockSize != 4 or 8");
491:
492: /* initialize the block to be encrypted from the input */
493: /* Note that in theory block<i> should be kept in register. Not all
494: compilers can do this, even when there are enough registers --
495: this will degrade performance significantly. */
496: block0 = input[0];
497: block1 = input[1];
498: block2 = input[2];
499: block3 = input[3];
500: block4 = input[4];
501: block5 = input[5];
502: block6 = input[6];
503: block7 = input[7];
504: block8 = input[8];
505: block9 = input[9];
506: block10 = input[10];
507: block11 = input[11];
508: block12 = input[12];
509: block13 = input[13];
510: block14 = input[14];
511: block15 = input[15];
512:
513:
514:
515: for (index = 0; index < 2 * localSecurityLevel; index += 2) {
516:
517:
518: /* set up the base address for the two S-box pointers. */
519: SBox0 = rotatedRightStandardSBoxes[0][index];
520: SBox1 = SBox0 + 256;
521:
522:
523: /* In the following unrolled code, the basic 'assembly
524: language' block that is repeated is:
525:
526: 1 temp1 = shift(block<i>, shiftConstant)
527: 2 temp2 = temp1 & 0x3fc
528: 3 temp3 = SBox<0 or 1> + temp2
529: 4 temp4 = *temp3
530: 5 block<i-1> ^= temp4
531: 6 block<i+1> ^= temp4
532:
533: In step 1, we simply shift the ith 32-bit block to bring the
534: 8-bit byte into the right position. Note that we will
535: also build-in a left-shift by 2 bits at this stage, to
536: eliminate the left shift required later because we are
537: indexing into an array of 4-byte table entries.
538:
539: In step 2, we mask off the desired 8 bits. Note that 0x3fc
540: is simply 0xff << 2.
541:
542: In step 3, we use a normal integer add to compute the actual
543: address of the S-box entry. Note that one of two pointers
544: is used, as appropriate. Temp3 then holds the actual byte
545: address of the desired S-box entry.
546:
547: In step 4, we load the 4-byte S-box entry.
548:
549: In steps 5 and 6, we XOR the loaded S-box entry with both the
550: previous and the next 32-bit entries in the 'block' array.
551:
552: Typical optimizing comilers might fail to put all the
553: block<i> variables into registers. This can result in
554: significant performance degradation. Also, most compilers
555: will use a separate left-shift-by-2 after masking off the
556: needed 8 bits, but the performance degradation caused by
557: this oversight should be modest.
558:
559: */
560:
561: SBoxEntry = SBox0[block0 & 0xff];
562: block1 ^= SBoxEntry;
563: block15 ^= SBoxEntry;
564: SBoxEntry = SBox0[block1 & 0xff];
565: block2 ^= SBoxEntry;
566: block0 ^= SBoxEntry;
567: SBoxEntry = SBox1[block2 & 0xff];
568: block3 ^= SBoxEntry;
569: block1 ^= SBoxEntry;
570: SBoxEntry = SBox1[block3 & 0xff];
571: block4 ^= SBoxEntry;
572: block2 ^= SBoxEntry;
573: SBoxEntry = SBox0[block4 & 0xff];
574: block5 ^= SBoxEntry;
575: block3 ^= SBoxEntry;
576: SBoxEntry = SBox0[block5 & 0xff];
577: block6 ^= SBoxEntry;
578: block4 ^= SBoxEntry;
579: SBoxEntry = SBox1[block6 & 0xff];
580: block7 ^= SBoxEntry;
581: block5 ^= SBoxEntry;
582: SBoxEntry = SBox1[block7 & 0xff];
583: block8 ^= SBoxEntry;
584: block6 ^= SBoxEntry;
585: SBoxEntry = SBox0[block8 & 0xff];
586: block9 ^= SBoxEntry;
587: block7 ^= SBoxEntry;
588: SBoxEntry = SBox0[block9 & 0xff];
589: block10 ^= SBoxEntry;
590: block8 ^= SBoxEntry;
591: SBoxEntry = SBox1[block10 & 0xff];
592: block11 ^= SBoxEntry;
593: block9 ^= SBoxEntry;
594: SBoxEntry = SBox1[block11 & 0xff];
595: block12 ^= SBoxEntry;
596: block10 ^= SBoxEntry;
597: SBoxEntry = SBox0[block12 & 0xff];
598: block13 ^= SBoxEntry;
599: block11 ^= SBoxEntry;
600: SBoxEntry = SBox0[block13 & 0xff];
601: block14 ^= SBoxEntry;
602: block12 ^= SBoxEntry;
603: SBoxEntry = SBox1[block14 & 0xff];
604: block15 ^= SBoxEntry;
605: block13 ^= SBoxEntry;
606: SBoxEntry = SBox1[block15 & 0xff];
607: block0 ^= SBoxEntry;
608: block14 ^= SBoxEntry;
609:
610: /* SBox0 = rotatedRightStandardSBoxes[2][index]; */
611: SBox0 += 2 * maxSBoxCount * 256;
612: SBox1 = SBox0 + 256;
613:
614: SBoxEntry = SBox0[(block0 >> 16) & 0xff];
615: block1 ^= SBoxEntry;
616: block15 ^= SBoxEntry;
617: SBoxEntry = SBox0[(block1 >> 16) & 0xff];
618: block2 ^= SBoxEntry;
619: block0 ^= SBoxEntry;
620: SBoxEntry = SBox1[(block2 >> 16) & 0xff];
621: block3 ^= SBoxEntry;
622: block1 ^= SBoxEntry;
623: SBoxEntry = SBox1[(block3 >> 16) & 0xff];
624: block4 ^= SBoxEntry;
625: block2 ^= SBoxEntry;
626: SBoxEntry = SBox0[(block4 >> 16) & 0xff];
627: block5 ^= SBoxEntry;
628: block3 ^= SBoxEntry;
629: SBoxEntry = SBox0[(block5 >> 16) & 0xff];
630: block6 ^= SBoxEntry;
631: block4 ^= SBoxEntry;
632: SBoxEntry = SBox1[(block6 >> 16) & 0xff];
633: block7 ^= SBoxEntry;
634: block5 ^= SBoxEntry;
635: SBoxEntry = SBox1[(block7 >> 16) & 0xff];
636: block8 ^= SBoxEntry;
637: block6 ^= SBoxEntry;
638: SBoxEntry = SBox0[(block8 >> 16) & 0xff];
639: block9 ^= SBoxEntry;
640: block7 ^= SBoxEntry;
641: SBoxEntry = SBox0[(block9 >> 16) & 0xff];
642: block10 ^= SBoxEntry;
643: block8 ^= SBoxEntry;
644: SBoxEntry = SBox1[(block10 >> 16) & 0xff];
645: block11 ^= SBoxEntry;
646: block9 ^= SBoxEntry;
647: SBoxEntry = SBox1[(block11 >> 16) & 0xff];
648: block12 ^= SBoxEntry;
649: block10 ^= SBoxEntry;
650: SBoxEntry = SBox0[(block12 >> 16) & 0xff];
651: block13 ^= SBoxEntry;
652: block11 ^= SBoxEntry;
653: SBoxEntry = SBox0[(block13 >> 16) & 0xff];
654: block14 ^= SBoxEntry;
655: block12 ^= SBoxEntry;
656: SBoxEntry = SBox1[(block14 >> 16) & 0xff];
657: block15 ^= SBoxEntry;
658: block13 ^= SBoxEntry;
659: SBoxEntry = SBox1[(block15 >> 16) & 0xff];
660: block0 ^= SBoxEntry;
661: block14 ^= SBoxEntry;
662:
663:
664: /* SBox0 = rotatedRightStandardSBoxes[1][index]; */
665: SBox0 -= maxSBoxCount * 256;
666: SBox1 = SBox0 + 256;
667:
668: SBoxEntry = SBox0[block0 >> 24];
669: block1 ^= SBoxEntry;
670: block15 ^= SBoxEntry;
671: SBoxEntry = SBox0[block1 >> 24];
672: block2 ^= SBoxEntry;
673: block0 ^= SBoxEntry;
674: SBoxEntry = SBox1[block2 >> 24];
675: block3 ^= SBoxEntry;
676: block1 ^= SBoxEntry;
677: SBoxEntry = SBox1[block3 >> 24];
678: block4 ^= SBoxEntry;
679: block2 ^= SBoxEntry;
680: SBoxEntry = SBox0[block4 >> 24];
681: block5 ^= SBoxEntry;
682: block3 ^= SBoxEntry;
683: SBoxEntry = SBox0[block5 >> 24];
684: block6 ^= SBoxEntry;
685: block4 ^= SBoxEntry;
686: SBoxEntry = SBox1[block6 >> 24];
687: block7 ^= SBoxEntry;
688: block5 ^= SBoxEntry;
689: SBoxEntry = SBox1[block7 >> 24];
690: block8 ^= SBoxEntry;
691: block6 ^= SBoxEntry;
692: SBoxEntry = SBox0[block8 >> 24];
693: block9 ^= SBoxEntry;
694: block7 ^= SBoxEntry;
695: SBoxEntry = SBox0[block9 >> 24];
696: block10 ^= SBoxEntry;
697: block8 ^= SBoxEntry;
698: SBoxEntry = SBox1[block10 >> 24];
699: block11 ^= SBoxEntry;
700: block9 ^= SBoxEntry;
701: SBoxEntry = SBox1[block11 >> 24];
702: block12 ^= SBoxEntry;
703: block10 ^= SBoxEntry;
704: SBoxEntry = SBox0[block12 >> 24];
705: block13 ^= SBoxEntry;
706: block11 ^= SBoxEntry;
707: SBoxEntry = SBox0[block13 >> 24];
708: block14 ^= SBoxEntry;
709: block12 ^= SBoxEntry;
710: SBoxEntry = SBox1[block14 >> 24];
711: block15 ^= SBoxEntry;
712: block13 ^= SBoxEntry;
713: SBoxEntry = SBox1[block15 >> 24];
714: block0 ^= SBoxEntry;
715: block14 ^= SBoxEntry;
716:
717:
718: /* SBox0 = rotatedRightStandardSBoxes[3][index]; */
719: SBox0 += 2 * maxSBoxCount * 256;
720: SBox1 = SBox0 + 256;
721:
722: SBoxEntry = SBox0[(block0 >> 8) & 0xff];
723: block1 ^= SBoxEntry;
724: block15 ^= SBoxEntry;
725: SBoxEntry = SBox0[(block1 >> 8) & 0xff];
726: block2 ^= SBoxEntry;
727: block0 ^= SBoxEntry;
728: SBoxEntry = SBox1[(block2 >> 8) & 0xff];
729: block3 ^= SBoxEntry;
730: block1 ^= SBoxEntry;
731: SBoxEntry = SBox1[(block3 >> 8) & 0xff];
732: block4 ^= SBoxEntry;
733: block2 ^= SBoxEntry;
734: SBoxEntry = SBox0[(block4 >> 8) & 0xff];
735: block5 ^= SBoxEntry;
736: block3 ^= SBoxEntry;
737: SBoxEntry = SBox0[(block5 >> 8) & 0xff];
738: block6 ^= SBoxEntry;
739: block4 ^= SBoxEntry;
740: SBoxEntry = SBox1[(block6 >> 8) & 0xff];
741: block7 ^= SBoxEntry;
742: block5 ^= SBoxEntry;
743: SBoxEntry = SBox1[(block7 >> 8) & 0xff];
744: block8 ^= SBoxEntry;
745: block6 ^= SBoxEntry;
746: SBoxEntry = SBox0[(block8 >> 8) & 0xff];
747: block9 ^= SBoxEntry;
748: block7 ^= SBoxEntry;
749: SBoxEntry = SBox0[(block9 >> 8) & 0xff];
750: block10 ^= SBoxEntry;
751: block8 ^= SBoxEntry;
752: SBoxEntry = SBox1[(block10 >> 8) & 0xff];
753: block11 ^= SBoxEntry;
754: block9 ^= SBoxEntry;
755: SBoxEntry = SBox1[(block11 >> 8) & 0xff];
756: block12 ^= SBoxEntry;
757: block10 ^= SBoxEntry;
758: SBoxEntry = SBox0[(block12 >> 8) & 0xff];
759: block13 ^= SBoxEntry;
760: block11 ^= SBoxEntry;
761: SBoxEntry = SBox0[(block13 >> 8) & 0xff];
762: block14 ^= SBoxEntry;
763: block12 ^= SBoxEntry;
764: SBoxEntry = SBox1[(block14 >> 8) & 0xff];
765: block15 ^= SBoxEntry;
766: block13 ^= SBoxEntry;
767: SBoxEntry = SBox1[(block15 >> 8) & 0xff];
768: block0 ^= SBoxEntry;
769: block14 ^= SBoxEntry;
770:
771:
772:
773: }; /* end of index going from 0 to
774: 2*localSecurityLevel-2 in steps of 2 */
775:
776:
777: output[0] = input[0] ^ block15;
778: output[1] = input[1] ^ block14;
779: output[2] = input[2] ^ block13;
780: output[3] = input[3] ^ block12;
781:
782: /* generate an extra 128 bits if the output is 256 bits */
783: if (outputBlockSize == 8) {
784: output[4] = input[4] ^ block11;
785: output[5] = input[5] ^ block10;
786: output[6] = input[6] ^ block9;
787: output[7] = input[7] ^ block8;
788: };
789:
790:
791: };
792:
793:
794: /* Hash512twice does exactly that. It hashes 512 bits using both Hash512 and
795: HashN. The output of the two implementations is then compared, and if
796: they differ an error message is issued. This insures that two different
797: quite different C routines compute the same value, and is quite
798: helpful in catching bugs, implementation errors, etc.
799:
800: It should be particularly helpful to the implementor trying to "tune" the
801: hash function for speed, as it provides a constant check on correctness.
802:
803: */
804:
805: void Hash512twice (output, input, localSecurityLevel)
806: unsigned long int output[maxOutputBlockSize];
807: unsigned long int input[];
808: int localSecurityLevel;
809:
810: {
811: unsigned long int out1[maxOutputBlockSize];
812: unsigned long int out2[maxOutputBlockSize];
813: int i;
814:
815: HashN (out1, inputBlockSize, input, localSecurityLevel);
816: Hash512 (out2, input, localSecurityLevel);
817: for (i = 0; i < outputBlockSize; i++)
818: if (out1[i] != out2[i])
819: errAbort (" Hash512 and HashN differ");
820: for (i = 0; i < outputBlockSize; i++)
821: output[i] = out1[i];
822: };
823:
824:
825:
826: /* The main program reads the input, hashes it, and prints the result. Much
827: of the logic in the main program is taken up with the trivia of buffer
828: management, error checking, command-line parameter checking, self-tests,
829: and the like. The actual use of the hash function occupies a modest
830: portion of the overall program.
831:
832: The basic idea is simple. As an example, if H is the hash function that
833: produces either 128-bit (or 256-bit) outputs, and if we pick an input
834: string that is 3 "chunks" long then we are computing:
835:
836: output = H( H( H( H(
837: 0 || chunk[0]) || chunk[1]) || chunk[2]) || bit-length)
838:
839: "bit-length" is a "chunk" sized field into which has been put the length of
840: the input, in bits, right justified. Note that the size of a "chunk" is
841: just the input size minus the output size.
842:
843: "0" is a vector of 0 bits of the same size (in bits) as the output of H
844: (i.e., either 128 or 256 bits).
845:
846: "||" is the concatenation operator, and is used to concatenate the output
847: field of the preceding computation of H with the next "chunk" of bits from
848: the input.
849:
850: "chunk" is an array which holds the input string. The final element of the
851: array is left justified and zero-filled on the right.
852:
853: */
854:
855: void main (argc, argv)
856: int argc;
857: char *argv[];
858:
859: {
860:
861: int i;
862: char buffer[bufferSize];
863: int hitEOF = 0; /* 0 means we haven't hit EOF, 1 means we
864: have */
865: unsigned long int wordBuffer[bufferSizeInWords];
866: unsigned long int hash[maxOutputBlockSize];
867: unsigned long int hashArray[inputBlockSize];
868: unsigned long int bitCount[2]; /* the 64-bit count of the number of
869: bits in the input */
870: int byteCount; /* the count of the number of bytes we have
871: in the buffer */
872: int dataLoc; /* the location of the next block of data we
873: wish to hash down. Note this is the index
874: into an array of 32-bit elements, not
875: bytes */
876:
877:
878:
879: /* self-test, to make sure everything is okay. */
880: /* First, test the standard S boxes to make sure they haven't been
881: damaged. */
882: /* Test to make sure each column is a permutation. */
883: for (i = 0; i < maxSBoxCount; i++) {
884: char testArray[256];
885: int testShift = 0;
886: int j;
887:
888: for (testShift = 0; testShift < 32; testShift += 8) {
889: for (j = 0; j < 256; j++)
890: testArray[j] = 0;
891: for (j = 0; j < 256; j++)
892: testArray[(standardSBoxes[i][j] >> testShift) & 0xff]++;
893: for (j = 0; j < 256; j++)
894: if (testArray[j] != 1)
895: errAbort ("Table error -- the standard S box is corrupted");
896: };
897: };
898: /* Okay, the standard S-box hasn't been damaged */
899:
900:
901:
902: /* Set up the rotated array for the fast hash routine */
903: {
904: int index; /* ranges over the S box indices */
905: int rotation; /* ranges over the four possible
906: byte-rotations */
907: int i; /* ranges over the 256 possible S-box entries */
908:
909: for (index = 0; index < maxSBoxCount; index++)
910: for (rotation = 0; rotation < 4; rotation++)
911: for (i = 0; i < 256; i++)
912: rotatedRightStandardSBoxes[rotation][index][i] =
913: (standardSBoxes[index][i] >> (rotation * 8)) |
914: (standardSBoxes[index][i] << (32 - rotation * 8));
915:
916:
917: };
918:
919:
920:
921: /* Now try hashing something. Note that we're testing both HashN and
922: Hash512 here */
923: {
924: unsigned long int testInput[inputBlockSize];
925: unsigned long int testOutput[maxOutputBlockSize];
926: int j;
927: int k;
928:
929: /* Set output size to 256 bits -- just for this test routine */
930: outputBlockSize = maxOutputBlockSize;
931: chunkSize = inputBlockSize - outputBlockSize;
932:
933: if (maxOutputBlockSize != 8)
934: errAbort ("The output block size has changed, update the self-test");
935: if (inputBlockSize != 16)
936: errAbort ("The input block size has changed, update the self-test");
937: if (maxSBoxCount != 8)
938: errAbort ("Wrong number of S boxes, update the self-test");
939:
940: for (i = 0; i < inputBlockSize; i++)
941: testInput[i] = 0; /* zero the input */
942: k = 0; /* zero the pointer into the input buffer */
943: for (i = 0; i < 50; i++) {
944: Hash512twice (testOutput, testInput, 4);
945: /* Copy the output into a new slot in the input buffer */
946: for (j = 0; j < maxOutputBlockSize; j++)
947: testInput[k+j] = testOutput[j];
948: k += maxOutputBlockSize;
949: /* reset pointer into input buffer
950: if it might overflow next time */
951: if ( (k+maxOutputBlockSize) > inputBlockSize) k=0;
952: };
953: if ((testOutput[0] != 1967985403) || (testOutput[1] != 2688653266) ||
954: (testOutput[2] != 3911883902) || (testOutput[3] != 1117323144) ||
955: (testOutput[4] != 4238876879) || (testOutput[5] != 877649382) ||
956: (testOutput[6] != 1112396746) || (testOutput[7] != 324992866)
957: )
958: errAbort ("Test hash of 64 bytes of 0 failed");
959: };
960: /* Okay, we can hash at least 50 64-byte values correctly. */
961:
962:
963:
964: outputBlockSize = 4; /* default is 4 32-bit words, or 128 bits */
965: chunkSize = inputBlockSize - outputBlockSize;
966:
967: /* Check command line arguments */
968: if (argc == 3) {
969: /* Two arguments -- generate the Large Economy Size Output of
970: 256 bits */
971: outputBlockSize = 8; /* 8 32-bit words */
972: chunkSize = inputBlockSize - outputBlockSize;
973: if ((argv[2][0] != '2') |
974: (argv[2][1] != '5') |
975: (argv[2][2] != '6'))
976: errAbort ("usage: hash <security level> [256]");
977: argc--;
978: };
979:
980: if ((bufferSizeInWords % chunkSize) != 0)
981: errAbort ("Buffer size is fouled up");
982:
983: if (argc > 2)
984: errAbort ("usage: hash [ <security level> [ <output size> ] ]");
985: else if (argc == 2) {
986: securityLevel = 0;
987: if (argv[1][0] == '2')
988: securityLevel = 2;
989: else if (argv[1][0] == '3')
990: securityLevel = 3;
991: else if (argv[1][0] == '4')
992: securityLevel = 4;
993:
994: if ((argv[1][1] != 0) || (securityLevel == 0))
995: errAbort ("The security level can only be 2, 3, or 4 (4 is most secure).");
996: };
997:
998:
999: /* Apply the one-way hash function to the standard input */
1000:
1001:
1002: bitCount[0] = 0;
1003: bitCount[1] = 0;
1004: byteCount = read (inputFile, buffer, bufferSize);
1005: if (byteCount < 0)
1006: errAbort ("Error on first read from standard input");
1007: if (byteCount != bufferSize)
1008: hitEOF = 1; /* set EOF flag true if didn't fill buffer */
1009:
1010:
1011: bitCount[1] += byteCount * 8; /* increment the total number of bits
1012: read */
1013: /* bump the upper 32 bits when the lower 32-bits wraps around */
1014: if (bitCount[1] < (byteCount * 8))
1015: bitCount[0] += 1;
1016:
1017: /* zero out rest of buffer */
1018: for (i = byteCount; i < bufferSize; i++)
1019: buffer[i] = 0;
1020:
1021: /* following conversion required for machines with byte-ordering
1022: unlike the SUN */
1023: convertBytes (buffer, wordBuffer);
1024: dataLoc = 0; /* 4-byte-word location in data input buffer */
1025:
1026:
1027:
1028: /* Now we hash it down with multiple applications of Hash512 */
1029:
1030: for (i = 0; i < inputBlockSize; i++)
1031: hashArray[i] = 0; /* initialize hashArray */
1032:
1033: /* Hash each chunk in the input (either 48 byte chunks or 32 byte
1034: chunks) -- and keep the result in hashArray. Note that the first
1035: 16 (32) bytes of hashArray holds the output of the previous hash
1036: computation. */
1037:
1038: while (byteCount > 0) {
1039: if (dataLoc + chunkSize > bufferSize)
1040: errAbort ("logic error, buffer over run");
1041:
1042: /* Get the next chunk */
1043: for (i = 0; i < chunkSize; i++)
1044: hashArray[outputBlockSize + i] = wordBuffer[dataLoc + i];
1045: /* and hash it in */
1046: Hash512 (hashArray, hashArray, securityLevel);
1047:
1048: /* increment index to next 48-byte input chunk */
1049: dataLoc += chunkSize;
1050:
1051:
1052: /* decrement the number of bytes left to process */
1053: /* Yes, if byteCount was less than chunkSize this might make
1054: byteCount negative. It's ok, it's caught in the following
1055: "if" statement */
1056: byteCount -= chunkSize * 4;
1057:
1058: /* Out of data -- read some more */
1059: if (byteCount <= 0) {
1060: if (hitEOF == 1)
1061: byteCount = 0;
1062: else {
1063: if (byteCount != 0)
1064: errAbort ("Logic error near EOF");
1065: byteCount = read (inputFile, buffer, bufferSize);
1066: if (byteCount < 0)
1067: errAbort ("Error while reading from input");
1068: if (byteCount != bufferSize)
1069: hitEOF = 1;
1070: };
1071:
1072: bitCount[1] += byteCount * 8; /* increment the
1073: bit-count */
1074: /* bump the upper 32 bits when the lower 32-bits
1075: wraps around */
1076: if (bitCount[1] < (byteCount * 8))
1077: bitCount[0] += 1;
1078:
1079: /* zero out rest of buffer */
1080: for (i = byteCount; i < bufferSize; i++)
1081: buffer[i] = 0;
1082:
1083: convertBytes (buffer, wordBuffer);
1084: dataLoc = 0;
1085: };
1086: }; /* end of while */
1087:
1088:
1089: /* Zero out the remainder of hashArray */
1090: for (i = 0; i < chunkSize; i++)
1091: hashArray[outputBlockSize + i] = 0;
1092:
1093: /* Put the 64-bit bit-count into the final 64-bits of the block about
1094: to be hashed */
1095: hashArray[inputBlockSize - 2] = bitCount[0]; /* upper 32 bits of
1096: count */
1097: hashArray[inputBlockSize - 1] = bitCount[1]; /* lower 32 bits of
1098: count */
1099:
1100: /* Final hash down. */
1101: Hash512 (hash, hashArray, securityLevel);
1102:
1103: /* 'hash' now holds the hashed result, which is printed on standard
1104: output */
1105: for (i = 0; i < outputBlockSize; i++)
1106: printf (" %x", hash[i]);
1107: printf ("\n");
1108: exit (0);
1109: };
1110: *-*-END-*-*
1111: sed 's/^ //' >hashComment <<\*-*-END-*-*
1112: Following are the hash totals computed for the files "hash2.0.c"
1113: and "standardSBoxes2.c". The user should be aware that any change
1114: in these files at all (e.g., addition of a blank at the end of any line,
1115: conversion of a tab into an equivalent number of spaces, etc) will
1116: result in a different value of the checksum. However, in
1117: a purely logical sense it does little good to verify the correctness
1118: of the contents of a file using as a test the checksum program
1119: which has just been copied from that very same file.....
1120:
1121: Despite this annoying circularity, I have included the checksum
1122: values. They at least serve as a guard against simple errors
1123: and clumsy efforts at subversion.
1124:
1125: Also, if the recipient should ever manage to receive a correct copy
1126: of the hash total program, then this correct version can be used
1127: to verify all further updates, changes, etc.
1128:
1129: hash2.0.c: a3878c2d c96c6f8e b4026ae2 9669f027
1130: standardSBoxes2.c: 49b91919 1a896a dc976159 c6885587
1131: *-*-END-*-*
1132: sed 's/^ //' >stdSBoxes2.c <<\*-*-END-*-*
1133: /* This is the standard S box used by the one-way hash function Snefru.
1134: See the paper 'A Software One Way Hash Function', by Ralph C. Merkle,
1135: for a more detailed explanation.
1136:
1137: Version 2.0
1138:
1139: NOTE: This set of tables is different from Version 1.0.
1140: Version 2.0 is recomended, Version 1.0 should not be used.
1141:
1142: August 1, 1989
1143:
1144: Copyright (c) Xerox Corporation 1989
1145: All rights reserved.
1146:
1147: License to copy and use this software is granted provided that it is identified
1148: as the 'Tables For the Xerox Secure Hash Function' in all material mentioning
1149: or referencing this software.
1150:
1151: License is also granted to make and use derivative works provided that such
1152: works are identified as 'derived from the Tables For the Xerox Secure Hash
1153: Function' in all material mentioning or referencing the derived work.
1154:
1155: Xerox Corporation makes no representations concerning either the
1156: merchantability of this software or the suitability of this software for any
1157: particular purpose. It is provided "as is" without express or implied
1158: warranty of any kind.
1159:
1160:
1161: These notices must be retained in any copies of any part of this software.
1162:
1163:
1164:
1165: Implementor: Ralph C. Merkle
1166:
1167: */
1168:
1169: #define maxSBoxCount 8
1170:
1171:
1172:
1173: long int standardSBoxes[maxSBoxCount][256] = {
1174:
1175: { /* Start of S Box 0 */
1176: 0x64F9001B, /* 0 */
1177: 0xFEDDCDF6, /* 1 */
1178: 0x7C8FF1E2, /* 2 */
1179: 0x11D71514, /* 3 */
1180: 0x8B8C18D3, /* 4 */
1181: 0xDDDF881E, /* 5 */
1182: 0x6EAB5056, /* 6 */
1183: 0x88CED8E1, /* 7 */
1184: 0x49148959, /* 8 */
1185: 0x69C56FD5, /* 9 */
1186: 0xB7994F03, /* 10 */
1187: 0xFBCEE3E, /* 11 */
1188: 0x3C264940, /* 12 */
1189: 0x21557E58, /* 13 */
1190: 0xE14B3FC2, /* 14 */
1191: 0x2E5CF591, /* 15 */
1192: 0xDCEFF8CE, /* 16 */
1193: 0x92A1648, /* 17 */
1194: 0xBE812936, /* 18 */
1195: 0xFF7B0C6A, /* 19 */
1196: 0xD5251037, /* 20 */
1197: 0xAFA448F1, /* 21 */
1198: 0x7DAFC95A, /* 22 */
1199: 0x1EA69C3F, /* 23 */
1200: 0xA417ABE7, /* 24 */
1201: 0x5890E423, /* 25 */
1202: 0xB0CB70C0, /* 26 */
1203: 0xC85025F7, /* 27 */
1204: 0x244D97E3, /* 28 */
1205: 0x1FF3595F, /* 29 */
1206: 0xC4EC6396, /* 30 */
1207: 0x59181E17, /* 31 */
1208: 0xE635B477, /* 32 */
1209: 0x354E7DBF, /* 33 */
1210: 0x796F7753, /* 34 */
1211: 0x66EB52CC, /* 35 */
1212: 0x77C3F995, /* 36 */
1213: 0x32E3A927, /* 37 */
1214: 0x80CCAED6, /* 38 */
1215: 0x4E2BE89D, /* 39 */
1216: 0x375BBD28, /* 40 */
1217: 0xAD1A3D05, /* 41 */
1218: 0x2B1B42B3, /* 42 */
1219: 0x16C44C71, /* 43 */
1220: 0x4D54BFA8, /* 44 */
1221: 0xE57DDC7A, /* 45 */
1222: 0xEC6D8144, /* 46 */
1223: 0x5A71046B, /* 47 */
1224: 0xD8229650, /* 48 */
1225: 0x87FC8F24, /* 49 */
1226: 0xCBC60E09, /* 50 */
1227: 0xB6390366, /* 51 */
1228: 0xD9F76092, /* 52 */
1229: 0xD393A70B, /* 53 */
1230: 0x1D31A08A, /* 54 */
1231: 0x9CD971C9, /* 55 */
1232: 0x5C1EF445, /* 56 */
1233: 0x86FAB694, /* 57 */
1234: 0xFDB44165, /* 58 */
1235: 0x8EAAFCBE, /* 59 */
1236: 0x4BCAC6EB, /* 60 */
1237: 0xFB7A94E5, /* 61 */
1238: 0x5789D04E, /* 62 */
1239: 0xFA13CF35, /* 63 */
1240: 0x236B8DA9, /* 64 */
1241: 0x4133F000, /* 65 */
1242: 0x6224261C, /* 66 */
1243: 0xF412F23B, /* 67 */
1244: 0xE75E56A4, /* 68 */
1245: 0x30022116, /* 69 */
1246: 0xBAF17F1F, /* 70 */
1247: 0xD09872F9, /* 71 */
1248: 0xC1A3699C, /* 72 */
1249: 0xF1E802AA, /* 73 */
1250: 0xDD145DC, /* 74 */
1251: 0x4FDCE093, /* 75 */
1252: 0x8D8412F0, /* 76 */
1253: 0x6CD0F376, /* 77 */
1254: 0x3DE6B73D, /* 78 */
1255: 0x84BA737F, /* 79 */
1256: 0xB43A30F2, /* 80 */
1257: 0x44569F69, /* 81 */
1258: 0xE4EACA, /* 82 */
1259: 0xB58DE3B0, /* 83 */
1260: 0x959113C8, /* 84 */
1261: 0xD62EFEE9, /* 85 */
1262: 0x90861F83, /* 86 */
1263: 0xCED69874, /* 87 */
1264: 0x2F793CEE, /* 88 */
1265: 0xE8571C30, /* 89 */
1266: 0x483665D1, /* 90 */
1267: 0xAB07B031, /* 91 */
1268: 0x914C844F, /* 92 */
1269: 0x15BF3BE8, /* 93 */
1270: 0x2C3F2A9A, /* 94 */
1271: 0x9EB95FD4, /* 95 */
1272: 0x92E7472D, /* 96 */
1273: 0x2297CC5B, /* 97 */
1274: 0xEE5F2782, /* 98 */
1275: 0x5377B562, /* 99 */
1276: 0xDB8EBBCF, /* 100 */
1277: 0xF961DEDD, /* 101 */
1278: 0xC59B5C60, /* 102 */
1279: 0x1BD3910D, /* 103 */
1280: 0x26D206AD, /* 104 */
1281: 0xB28514D8, /* 105 */
1282: 0x5ECF6B52, /* 106 */
1283: 0x7FEA78BB, /* 107 */
1284: 0x504879AC, /* 108 */
1285: 0xED34A884, /* 109 */
1286: 0x36E51D3C, /* 110 */
1287: 0x1753741D, /* 111 */
1288: 0x8C47CAED, /* 112 */
1289: 0x9D0A40EF, /* 113 */
1290: 0x3145E221, /* 114 */
1291: 0xDA27EB70, /* 115 */
1292: 0xDF730BA3, /* 116 */
1293: 0x183C8789, /* 117 */
1294: 0x739AC0A6, /* 118 */
1295: 0x9A58DFC6, /* 119 */
1296: 0x54B134C1, /* 120 */
1297: 0xAC3E242E, /* 121 */
1298: 0xCC493902, /* 122 */
1299: 0x7B2DDA99, /* 123 */
1300: 0x8F15BC01, /* 124 */
1301: 0x29FD38C7, /* 125 */
1302: 0x27D5318F, /* 126 */
1303: 0x604AAFF5, /* 127 */
1304: 0xF29C6818, /* 128 */
1305: 0xC38AA2EC, /* 129 */
1306: 0x1019D4C3, /* 130 */
1307: 0xA8FB936E, /* 131 */
1308: 0x20ED7B39, /* 132 */
1309: 0xB686119, /* 133 */
1310: 0x89A0906F, /* 134 */
1311: 0x1CC7829E, /* 135 */
1312: 0x9952EF4B, /* 136 */
1313: 0x850E9E8C, /* 137 */
1314: 0xCD063A90, /* 138 */
1315: 0x67002F8E, /* 139 */
1316: 0xCFAC8CB7, /* 140 */
1317: 0xEAA24B11, /* 141 */
1318: 0x988B4E6C, /* 142 */
1319: 0x46F066DF, /* 143 */
1320: 0xCA7EEC08, /* 144 */
1321: 0xC7BBA664, /* 145 */
1322: 0x831D17BD, /* 146 */
1323: 0x63F575E6, /* 147 */
1324: 0x9764350E, /* 148 */
1325: 0x47870D42, /* 149 */
1326: 0x26CA4A2, /* 150 */
1327: 0x8167D587, /* 151 */
1328: 0x61B6ADAB, /* 152 */
1329: 0xAA6564D2, /* 153 */
1330: 0x70DA237B, /* 154 */
1331: 0x25E1C74A, /* 155 */
1332: 0xA1C901A0, /* 156 */
1333: 0xEB0A5DA, /* 157 */
1334: 0x7670F741, /* 158 */
1335: 0x51C05AEA, /* 159 */
1336: 0x933DFA32, /* 160 */
1337: 0x759FF1A, /* 161 */
1338: 0x56010AB8, /* 162 */
1339: 0x5FDECB78, /* 163 */
1340: 0x3F32EDF8, /* 164 */
1341: 0xAEBEDBB9, /* 165 */
1342: 0x39F8326D, /* 166 */
1343: 0xD20858C5, /* 167 */
1344: 0x9B638BE4, /* 168 */
1345: 0xA572C80A, /* 169 */
1346: 0x28E0A19F, /* 170 */
1347: 0x432099FC, /* 171 */
1348: 0x3A37C3CD, /* 172 */
1349: 0xBF95C585, /* 173 */
1350: 0xB392C12A, /* 174 */
1351: 0x6AA707D7, /* 175 */
1352: 0x52F66A61, /* 176 */
1353: 0x12D483B1, /* 177 */
1354: 0x96435B5E, /* 178 */
1355: 0x3E75802B, /* 179 */
1356: 0x3BA52B33, /* 180 */
1357: 0xA99F51A5, /* 181 */
1358: 0xBDA1E157, /* 182 */
1359: 0x78C2E70C, /* 183 */
1360: 0xFCAE7CE0, /* 184 */
1361: 0xD1602267, /* 185 */
1362: 0x2AFFAC4D, /* 186 */
1363: 0x4A510947, /* 187 */
1364: 0xAB2B83A, /* 188 */
1365: 0x7A04E579, /* 189 */
1366: 0x340DFD80, /* 190 */
1367: 0xB916E922, /* 191 */
1368: 0xE29D5E9B, /* 192 */
1369: 0xF5624AF4, /* 193 */
1370: 0x4CA9D9AF, /* 194 */
1371: 0x6BBD2CFE, /* 195 */
1372: 0xE3B7F620, /* 196 */
1373: 0xC2746E07, /* 197 */
1374: 0x5B42B9B6, /* 198 */
1375: 0xA06919BC, /* 199 */
1376: 0xF0F2C40F, /* 200 */
1377: 0x72217AB5, /* 201 */
1378: 0x14C19DF3, /* 202 */
1379: 0xF3802DAE, /* 203 */
1380: 0xE094BEB4, /* 204 */
1381: 0xA2101AFF, /* 205 */
1382: 0x529575D, /* 206 */
1383: 0x55CDB27C, /* 207 */
1384: 0xA33BDDB2, /* 208 */
1385: 0x6528B37D, /* 209 */
1386: 0x740C05DB, /* 210 */
1387: 0xE96A62C4, /* 211 */
1388: 0x40782846, /* 212 */
1389: 0x6D30D706, /* 213 */
1390: 0xBBF48E2C, /* 214 */
1391: 0xBCE2D3DE, /* 215 */
1392: 0x49E37FA, /* 216 */
1393: 0x1B5E634, /* 217 */
1394: 0x2D886D8D, /* 218 */
1395: 0x7E5A2E7E, /* 219 */
1396: 0xD7412013, /* 220 */
1397: 0x6E90F97, /* 221 */
1398: 0xE45D3EBA, /* 222 */
1399: 0xB8AD3386, /* 223 */
1400: 0x13051B25, /* 224 */
1401: 0xC035354, /* 225 */
1402: 0x71C89B75, /* 226 */
1403: 0xC638FBD0, /* 227 */
1404: 0x197F11A1, /* 228 */
1405: 0xEF0F08FB, /* 229 */
1406: 0xF8448651, /* 230 */
1407: 0x38409563, /* 231 */
1408: 0x452F4443, /* 232 */
1409: 0x5D464D55, /* 233 */
1410: 0x3D8764C, /* 234 */
1411: 0xB1B8D638, /* 235 */
1412: 0xA70BBA2F, /* 236 */
1413: 0x94B3D210, /* 237 */
1414: 0xEB6692A7, /* 238 */
1415: 0xD409C2D9, /* 239 */
1416: 0x68838526, /* 240 */
1417: 0xA6DB8A15, /* 241 */
1418: 0x751F6C98, /* 242 */
1419: 0xDE769A88, /* 243 */
1420: 0xC9EE4668, /* 244 */
1421: 0x1A82A373, /* 245 */
1422: 0x896AA49, /* 246 */
1423: 0x42233681, /* 247 */
1424: 0xF62C55CB, /* 248 */
1425: 0x9F1C5404, /* 249 */
1426: 0xF74FB15C, /* 250 */
1427: 0xC06E4312, /* 251 */
1428: 0x6FFE5D72, /* 252 */
1429: 0x8AA8678B, /* 253 */
1430: 0x337CD129, /* 254 */
1431: 0x8211CEFD /* 255 */
1432: /* End of S Box 0 */ },
1433:
1434:
1435: {
1436: /* Start of S Box 1 */
1437:
1438: 0x74A1D09, /* 0 */
1439: 0x52A10E5A, /* 1 */
1440: 0x9275A3F8, /* 2 */
1441: 0x4B82506C, /* 3 */
1442: 0x37DF7E1B, /* 4 */
1443: 0x4C78B3C5, /* 5 */
1444: 0xCEFAB1DA, /* 6 */
1445: 0xF472267E, /* 7 */
1446: 0xB63045F6, /* 8 */
1447: 0xD66A1FC0, /* 9 */
1448: 0x400298E3, /* 10 */
1449: 0x27E60C94, /* 11 */
1450: 0x87D2F1B8, /* 12 */
1451: 0xDF9E56CC, /* 13 */
1452: 0x45CD1803, /* 14 */
1453: 0x1D35E098, /* 15 */
1454: 0xCCE7C736, /* 16 */
1455: 0x3483BF1, /* 17 */
1456: 0x1F7307D7, /* 18 */
1457: 0xC6E8F948, /* 19 */
1458: 0xE613C111, /* 20 */
1459: 0x3955C6FF, /* 21 */
1460: 0x1170ED7C, /* 22 */
1461: 0x8E95DA41, /* 23 */
1462: 0x99C31BF4, /* 24 */
1463: 0xA4DA8021, /* 25 */
1464: 0x7B5F94FB, /* 26 */
1465: 0xDD0DA51F, /* 27 */
1466: 0x6562AA77, /* 28 */
1467: 0x556BCB23, /* 29 */
1468: 0xDB1BACC6, /* 30 */
1469: 0x798040B9, /* 31 */
1470: 0xBFE5378F, /* 32 */
1471: 0x731D55E6, /* 33 */
1472: 0xDAA5BFEE, /* 34 */
1473: 0x389BBC60, /* 35 */
1474: 0x1B33FBA4, /* 36 */
1475: 0x9C567204, /* 37 */
1476: 0x36C26C68, /* 38 */
1477: 0x77EE9D69, /* 39 */
1478: 0x8AEB3E88, /* 40 */
1479: 0x2D50B5CE, /* 41 */
1480: 0x9579E790, /* 42 */
1481: 0x42B13CFC, /* 43 */
1482: 0x33FBD32B, /* 44 */
1483: 0xEE0503A7, /* 45 */
1484: 0xB5862824, /* 46 */
1485: 0x15E41EAD, /* 47 */
1486: 0xC8412EF7, /* 48 */
1487: 0x9D441275, /* 49 */
1488: 0x2FCEC582, /* 50 */
1489: 0x5FF483B7, /* 51 */
1490: 0x8F3931DF, /* 52 */
1491: 0x2E5D2A7B, /* 53 */
1492: 0x49467BF9, /* 54 */
1493: 0x653DEA9, /* 55 */
1494: 0x2684CE35, /* 56 */
1495: 0x7E655E5C, /* 57 */
1496: 0xF12771D8, /* 58 */
1497: 0xBB15CC67, /* 59 */
1498: 0xAB097CA1, /* 60 */
1499: 0x983DCF52, /* 61 */
1500: 0x10DDF026, /* 62 */
1501: 0x21267F57, /* 63 */
1502: 0x2C58F6B4, /* 64 */
1503: 0x31043265, /* 65 */
1504: 0xBAB8C01, /* 66 */
1505: 0xD5492099, /* 67 */
1506: 0xACAAE619, /* 68 */
1507: 0x944CE54A, /* 69 */
1508: 0xF2D13D39, /* 70 */
1509: 0xADD3FC32, /* 71 */
1510: 0xCDA08A40, /* 72 */
1511: 0xE2B0D451, /* 73 */
1512: 0x9EFE08AE, /* 74 */
1513: 0xB9D50FD2, /* 75 */
1514: 0xEA5CD7FD, /* 76 */
1515: 0xC9A749DD, /* 77 */
1516: 0x13EA2253, /* 78 */
1517: 0x832DEBAA, /* 79 */
1518: 0x24BE640F, /* 80 */
1519: 0xE03E926A, /* 81 */
1520: 0x29E01CDE, /* 82 */
1521: 0x8BF59F18, /* 83 */
1522: 0xF9D00B6, /* 84 */
1523: 0xE1238B46, /* 85 */
1524: 0x1E7D8E34, /* 86 */
1525: 0x93619ADB, /* 87 */
1526: 0x76B32F9F, /* 88 */
1527: 0xBD972CEC, /* 89 */
1528: 0xE31FA976, /* 90 */
1529: 0xA68FBB10, /* 91 */
1530: 0xFB3BA49D, /* 92 */
1531: 0x8587C41D, /* 93 */
1532: 0xA5ADD1D0, /* 94 */
1533: 0xF3CF84BF, /* 95 */
1534: 0xD4E11150, /* 96 */
1535: 0xD9FFA6BC, /* 97 */
1536: 0xC3F6018C, /* 98 */
1537: 0xAEF10572, /* 99 */
1538: 0x74A64B2F, /* 100 */
1539: 0xE7DC9559, /* 101 */
1540: 0x2AAE35D5, /* 102 */
1541: 0x5B6F587F, /* 103 */
1542: 0xA9E353FE, /* 104 */
1543: 0xCA4FB674, /* 105 */
1544: 0x4BA24A8, /* 106 */
1545: 0xE5C6875F, /* 107 */
1546: 0xDCBC6266, /* 108 */
1547: 0x6BC5C03F, /* 109 */
1548: 0x661EEF02, /* 110 */
1549: 0xED740BAB, /* 111 */
1550: 0x58E34E4, /* 112 */
1551: 0xB7E946CF, /* 113 */
1552: 0x88698125, /* 114 */
1553: 0x72EC48ED, /* 115 */
1554: 0xB11073A3, /* 116 */
1555: 0xA13485EB, /* 117 */
1556: 0xA2A2429C, /* 118 */
1557: 0xFA407547, /* 119 */
1558: 0x50B76713, /* 120 */
1559: 0x5418C37D, /* 121 */
1560: 0x96192DA5, /* 122 */
1561: 0x170BB04B, /* 123 */
1562: 0x518A021E, /* 124 */
1563: 0xB0AC13D1, /* 125 */
1564: 0x963FA2A, /* 126 */
1565: 0x4A6E10E1, /* 127 */
1566: 0x58472BDC, /* 128 */
1567: 0xF7F8D962, /* 129 */
1568: 0x979139EA, /* 130 */
1569: 0x8D856538, /* 131 */
1570: 0xC0997042, /* 132 */
1571: 0x48324D7A, /* 133 */
1572: 0x447623CB, /* 134 */
1573: 0x8CBBE364, /* 135 */
1574: 0x6E0C6B0E, /* 136 */
1575: 0xD36D63B0, /* 137 */
1576: 0x3F244C84, /* 138 */
1577: 0x3542C971, /* 139 */
1578: 0x2B228DC1, /* 140 */
1579: 0xCB0325BB, /* 141 */
1580: 0xF8C0D6E9, /* 142 */
1581: 0xDE11066B, /* 143 */
1582: 0xA8649327, /* 144 */
1583: 0xFC31F83E, /* 145 */
1584: 0x7DD80406, /* 146 */
1585: 0xF916DD61, /* 147 */
1586: 0xD89F79D3, /* 148 */
1587: 0x615144C2, /* 149 */
1588: 0xEBB45D31, /* 150 */
1589: 0x28002958, /* 151 */
1590: 0x56890A37, /* 152 */
1591: 0xF05B3808, /* 153 */
1592: 0x123AE844, /* 154 */
1593: 0x86839E16, /* 155 */
1594: 0x914B0D83, /* 156 */
1595: 0xC506B43C, /* 157 */
1596: 0xCF3CBA5E, /* 158 */
1597: 0x7C60F5C9, /* 159 */
1598: 0x22DEB2A0, /* 160 */
1599: 0x5D9C2715, /* 161 */
1600: 0xC77BA0EF, /* 162 */
1601: 0x4F45360B, /* 163 */
1602: 0xC1017D8B, /* 164 */
1603: 0xE45ADC29, /* 165 */
1604: 0xA759909B, /* 166 */
1605: 0x412CD293, /* 167 */
1606: 0xD7D796B1, /* 168 */
1607: 0xC8FF30, /* 169 */
1608: 0x23A34A80, /* 170 */
1609: 0x4EC15C91, /* 171 */
1610: 0x714E78B5, /* 172 */
1611: 0x47B9E42E, /* 173 */
1612: 0x78F3EA4D, /* 174 */
1613: 0x7F078F5B, /* 175 */
1614: 0x346C593A, /* 176 */
1615: 0xA3A87A1A, /* 177 */
1616: 0x9BCBFE12, /* 178 */
1617: 0x3D439963, /* 179 */
1618: 0xB2EF6D8E, /* 180 */
1619: 0xB8D46028, /* 181 */
1620: 0x6C2FD5CA, /* 182 */
1621: 0x62675256, /* 183 */
1622: 0x1F2A2F3, /* 184 */
1623: 0xBC96AE0A, /* 185 */
1624: 0x709A8920, /* 186 */
1625: 0xB4146E87, /* 187 */
1626: 0x6308B9E2, /* 188 */
1627: 0x64BDA7BA, /* 189 */
1628: 0xAFED6892, /* 190 */
1629: 0x6037F2A2, /* 191 */
1630: 0xF52969E0, /* 192 */
1631: 0xADB43A6, /* 193 */
1632: 0x82811400, /* 194 */
1633: 0x90D0BDF0, /* 195 */
1634: 0x19C9549E, /* 196 */
1635: 0x203F6A73, /* 197 */
1636: 0x1ACCAF4F, /* 198 */
1637: 0x89714E6D, /* 199 */
1638: 0x164D4705, /* 200 */
1639: 0x67665F07, /* 201 */
1640: 0xEC206170, /* 202 */
1641: 0xC2182B2, /* 203 */
1642: 0xA02B9C81, /* 204 */
1643: 0x53289722, /* 205 */
1644: 0xF6A97686, /* 206 */
1645: 0x140E4179, /* 207 */
1646: 0x9F778849, /* 208 */
1647: 0x9A88E15D, /* 209 */
1648: 0x25CADB54, /* 210 */
1649: 0xD157F36F, /* 211 */
1650: 0x32A421C3, /* 212 */
1651: 0xB368E98A, /* 213 */
1652: 0x5A92CD0D, /* 214 */
1653: 0x757AA8D4, /* 215 */
1654: 0xC20AC278, /* 216 */
1655: 0x8B551C7, /* 217 */
1656: 0x849491E8, /* 218 */
1657: 0x4DC75AD6, /* 219 */
1658: 0x697C33BE, /* 220 */
1659: 0xBAF0CA33, /* 221 */
1660: 0x46125B4E, /* 222 */
1661: 0x59D677B3, /* 223 */
1662: 0x30D9C8F2, /* 224 */
1663: 0xD0AF860C, /* 225 */
1664: 0x1C7FD0FA, /* 226 */
1665: 0xFE0FF72C, /* 227 */
1666: 0x5C8D6F43, /* 228 */
1667: 0x57FDEC3B, /* 229 */
1668: 0x6AB6AD97, /* 230 */
1669: 0xD22ADF89, /* 231 */
1670: 0x18171785, /* 232 */
1671: 0x2BFE22D, /* 233 */
1672: 0x6DB80917, /* 234 */
1673: 0x80B216AF, /* 235 */
1674: 0xE85E4F9A, /* 236 */
1675: 0x7A1C306E, /* 237 */
1676: 0x6FC49BF5, /* 238 */
1677: 0x3AF7A11C, /* 239 */
1678: 0x81E215E7, /* 240 */
1679: 0x68363FCD, /* 241 */
1680: 0x3E9357C8, /* 242 */
1681: 0xEF52FD55, /* 243 */
1682: 0x3B8BAB4C, /* 244 */
1683: 0x3C8CF495, /* 245 */
1684: 0xBEFCEEBD, /* 246 */
1685: 0xFD25B714, /* 247 */
1686: 0xC498D83D, /* 248 */
1687: 0xD2E1A8D, /* 249 */
1688: 0xE9F966AC, /* 250 */
1689: 0xE387445, /* 251 */
1690: 0x435419E5, /* 252 */
1691: 0x5E7EBEC4, /* 253 */
1692: 0xAA90B8D9, /* 254 */
1693: 0xFF1A3A96}, /* 255 */
1694:
1695: {
1696: /* Start of S-box 2 */
1697:
1698: 0x4A8FE4E3, /* 0 */
1699: 0xF27D99CD, /* 1 */
1700: 0xD04A40CA, /* 2 */
1701: 0xCB5FF194, /* 3 */
1702: 0x3668275A, /* 4 */
1703: 0xFF4816BE, /* 5 */
1704: 0xA78B394C, /* 6 */
1705: 0x4C6BE9DB, /* 7 */
1706: 0x4EEC38D2, /* 8 */
1707: 0x4296EC80, /* 9 */
1708: 0xCDCE96F8, /* 10 */
1709: 0x888C2F38, /* 11 */
1710: 0xE75508F5, /* 12 */
1711: 0x7B916414, /* 13 */
1712: 0x60AA14A, /* 14 */
1713: 0xA214F327, /* 15 */
1714: 0xBE608DAF, /* 16 */
1715: 0x1EBBDEC2, /* 17 */
1716: 0x61F98CE9, /* 18 */
1717: 0xE92156FE, /* 19 */
1718: 0x4F22D7A3, /* 20 */
1719: 0x3F76A8D9, /* 21 */
1720: 0x559A4B33, /* 22 */
1721: 0x38AD2959, /* 23 */
1722: 0xF3F17E9E, /* 24 */
1723: 0x85E1BA91, /* 25 */
1724: 0xE5EBA6FB, /* 26 */
1725: 0x73DCD48C, /* 27 */
1726: 0xF5C3FF78, /* 28 */
1727: 0x481B6058, /* 29 */
1728: 0x8A3297F7, /* 30 */
1729: 0x8F1F3BF4, /* 31 */
1730: 0x93785AB2, /* 32 */
1731: 0x477A4A5B, /* 33 */
1732: 0x6334EB5D, /* 34 */
1733: 0x6D251B2E, /* 35 */
1734: 0x74A9102D, /* 36 */
1735: 0x7E38FFA, /* 37 */
1736: 0x915C9C62, /* 38 */
1737: 0xCCC275EA, /* 39 */
1738: 0x6BE273EC, /* 40 */
1739: 0x3EBDDD70, /* 41 */
1740: 0xD895796C, /* 42 */
1741: 0xDC54A91B, /* 43 */
1742: 0xC9AFDF81, /* 44 */
1743: 0x23633F73, /* 45 */
1744: 0x275119B4, /* 46 */
1745: 0xB19F6B67, /* 47 */
1746: 0x50756E22, /* 48 */
1747: 0x2BB152E2, /* 49 */
1748: 0x76EA46A2, /* 50 */
1749: 0xA353E232, /* 51 */
1750: 0x2F596AD6, /* 52 */
1751: 0xB1EDB0B, /* 53 */
1752: 0x2D3D9A4, /* 54 */
1753: 0x78B47843, /* 55 */
1754: 0x64893E90, /* 56 */
1755: 0x40F0CAAD, /* 57 */
1756: 0xF68D3AD7, /* 58 */
1757: 0x46FD1707, /* 59 */
1758: 0x1C9C67EF, /* 60 */
1759: 0xB5E086DE, /* 61 */
1760: 0x96EE6CA6, /* 62 */
1761: 0x9AA34774, /* 63 */
1762: 0x1BA4F48A, /* 64 */
1763: 0x8D01ABFD, /* 65 */
1764: 0x183EE1F6, /* 66 */
1765: 0x5FF8AA7A, /* 67 */
1766: 0x17E4FAAE, /* 68 */
1767: 0x303983B0, /* 69 */
1768: 0x6C08668B, /* 70 */
1769: 0xD4AC4382, /* 71 */
1770: 0xE6C5849F, /* 72 */
1771: 0x92FEFB53, /* 73 */
1772: 0xC1CAC4CE, /* 74 */
1773: 0x43501388, /* 75 */
1774: 0x441118CF, /* 76 */
1775: 0xEC4FB308, /* 77 */
1776: 0x53A08E86, /* 78 */
1777: 0x9E0FE0C5, /* 79 */
1778: 0xF91C1525, /* 80 */
1779: 0xAC45BE05, /* 81 */
1780: 0xD7987CB5, /* 82 */
1781: 0x49BA1487, /* 83 */
1782: 0x57938940, /* 84 */
1783: 0xD5877648, /* 85 */
1784: 0xA958727F, /* 86 */
1785: 0x58DFE3C3, /* 87 */
1786: 0xF436CF77, /* 88 */
1787: 0x399E4D11, /* 89 */
1788: 0xF0A5BFA9, /* 90 */
1789: 0xEF61A33B, /* 91 */
1790: 0xA64CAC60, /* 92 */
1791: 0x4A8D0BA, /* 93 */
1792: 0x30DD572, /* 94 */
1793: 0xB83D320F, /* 95 */
1794: 0xCAB23045, /* 96 */
1795: 0xE366F2F0, /* 97 */
1796: 0x815D008D, /* 98 */
1797: 0xC897A43A, /* 99 */
1798: 0x1D352DF3, /* 100 */
1799: 0xB9CC571D, /* 101 */
1800: 0x8BF38744, /* 102 */
1801: 0x72209092, /* 103 */
1802: 0xEBA124EB, /* 104 */
1803: 0xFB99CE5E, /* 105 */
1804: 0x3BB94293, /* 106 */
1805: 0x28DA549C, /* 107 */
1806: 0xAAB8A228, /* 108 */
1807: 0xA4197785, /* 109 */
1808: 0x33C70296, /* 110 */
1809: 0x25F6259B, /* 111 */
1810: 0x5C85DA21, /* 112 */
1811: 0xDF15BDEE, /* 113 */
1812: 0x15B7C7E8, /* 114 */
1813: 0xE2ABEF75, /* 115 */
1814: 0xFCC19BC1, /* 116 */
1815: 0x417FF868, /* 117 */
1816: 0x14884434, /* 118 */
1817: 0x62825179, /* 119 */
1818: 0xC6D5C11C, /* 120 */
1819: 0xE4705DC, /* 121 */
1820: 0x22700DE0, /* 122 */
1821: 0xD3D2AF18, /* 123 */
1822: 0x9BE822A0, /* 124 */
1823: 0x35B669F1, /* 125 */
1824: 0xC42BB55C, /* 126 */
1825: 0xA801252, /* 127 */
1826: 0x115BF0FC, /* 128 */
1827: 0x3CD7D856, /* 129 */
1828: 0xB43F5F9D, /* 130 */
1829: 0xC2306516, /* 131 */
1830: 0xA1231C47, /* 132 */
1831: 0xF149207E, /* 133 */
1832: 0x5209A795, /* 134 */
1833: 0x34B3CCD8, /* 135 */
1834: 0x67AEFE54, /* 136 */
1835: 0x2C83924E, /* 137 */
1836: 0x6662CBAC, /* 138 */
1837: 0x5EEDD161, /* 139 */
1838: 0x84E681AA, /* 140 */
1839: 0x5D57D26B, /* 141 */
1840: 0xFA465CC4, /* 142 */
1841: 0x7E3AC3A8, /* 143 */
1842: 0xBF7C0CC6, /* 144 */
1843: 0xE18A9AA1, /* 145 */
1844: 0xC32F0A6F, /* 146 */
1845: 0xB22CC00D, /* 147 */
1846: 0x3D280369, /* 148 */
1847: 0x994E554F, /* 149 */
1848: 0x68F480D3, /* 150 */
1849: 0xADCFF5E6, /* 151 */
1850: 0x3A8EB265, /* 152 */
1851: 0x83269831, /* 153 */
1852: 0xBD568A09, /* 154 */
1853: 0x4BC8AE6A, /* 155 */
1854: 0x69F56D2B, /* 156 */
1855: 0xF17EAC8, /* 157 */
1856: 0x772EB6C7, /* 158 */
1857: 0x9F41343C, /* 159 */
1858: 0xAB1D0742, /* 160 */
1859: 0x826A6F50, /* 161 */
1860: 0xFEA2097C, /* 162 */
1861: 0x1912C283, /* 163 */
1862: 0xCE185899, /* 164 */
1863: 0xE4444839, /* 165 */
1864: 0x2D8635D5, /* 166 */
1865: 0x65D0B1FF, /* 167 */
1866: 0x865A7F17, /* 168 */
1867: 0x326D9FB1, /* 169 */
1868: 0x59E52820, /* 170 */
1869: 0x90ADE1, /* 171 */
1870: 0x753C7149, /* 172 */
1871: 0x9DDD8B98, /* 173 */
1872: 0xA5A691DA, /* 174 */
1873: 0xD0382BB, /* 175 */
1874: 0x8904C930, /* 176 */
1875: 0x86CB000, /* 177 */
1876: 0x6E69D3BD, /* 178 */
1877: 0x24D4E7A7, /* 179 */
1878: 0x5244FD0, /* 180 */
1879: 0x101A5E0C, /* 181 */
1880: 0x6A947DCB, /* 182 */
1881: 0xE840F77B, /* 183 */
1882: 0x7D0C5003, /* 184 */
1883: 0x7C370F1F, /* 185 */
1884: 0x805245ED, /* 186 */
1885: 0xE05E3D3F, /* 187 */
1886: 0x7906880E, /* 188 */
1887: 0xBABFCD35, /* 189 */
1888: 0x1A7EC697, /* 190 */
1889: 0x8C052324, /* 191 */
1890: 0xC6EC8DF, /* 192 */
1891: 0xD129A589, /* 193 */
1892: 0xC7A75B02, /* 194 */
1893: 0x12D81DE7, /* 195 */
1894: 0xD9BE2A66, /* 196 */
1895: 0x1F4263AB, /* 197 */
1896: 0xDE73FDB6, /* 198 */
1897: 0x2A00680A, /* 199 */
1898: 0x56649E36, /* 200 */
1899: 0x3133ED55, /* 201 */
1900: 0x90FA0BF2, /* 202 */
1901: 0x2910A02A, /* 203 */
1902: 0x949D9D46, /* 204 */
1903: 0xA0D1DCDD, /* 205 */
1904: 0xCFC9B7D4, /* 206 */
1905: 0xD2677BE5, /* 207 */
1906: 0x95CB36B3, /* 208 */
1907: 0x13CD9410, /* 209 */
1908: 0xDBF73313, /* 210 */
1909: 0xB7C6E8C0, /* 211 */
1910: 0xF781414B, /* 212 */
1911: 0x510B016D, /* 213 */
1912: 0xB0DE1157, /* 214 */
1913: 0xD6B0F62C, /* 215 */
1914: 0xBB074ECC, /* 216 */
1915: 0x7F1395B7, /* 217 */
1916: 0xEE792CF9, /* 218 */
1917: 0xEA6FD63E, /* 219 */
1918: 0x5BD6938E, /* 220 */
1919: 0xAF02FC64, /* 221 */
1920: 0xDAB57AB8, /* 222 */
1921: 0x8EDB3784, /* 223 */
1922: 0x8716318F, /* 224 */
1923: 0x164D1A01, /* 225 */
1924: 0x26F26141, /* 226 */
1925: 0xB372E6B9, /* 227 */
1926: 0xF8FC2B06, /* 228 */
1927: 0x7AC00E04, /* 229 */
1928: 0x3727B89A, /* 230 */
1929: 0x97E9BCA5, /* 231 */
1930: 0x9C2A742F, /* 232 */
1931: 0xBC3B1F7D, /* 233 */
1932: 0x7165B471, /* 234 */
1933: 0x609B4C29, /* 235 */
1934: 0x20925351, /* 236 */
1935: 0x5AE72112, /* 237 */
1936: 0x454BE5D1, /* 238 */
1937: 0xC0FFB95F, /* 239 */
1938: 0xDD0EF919, /* 240 */
1939: 0x6F2D70C9, /* 241 */
1940: 0x974C5BF, /* 242 */
1941: 0x98AA6263, /* 243 */
1942: 0x1D91E4D, /* 244 */
1943: 0x2184BB6E, /* 245 */
1944: 0x70C43C1E, /* 246 */
1945: 0x4D435915, /* 247 */
1946: 0xAE7B8523, /* 248 */
1947: 0xB6FB06BC, /* 249 */
1948: 0x5431EE76, /* 250 */
1949: 0xFDBC5D26, /* 251 */
1950: 0xED77493D, /* 252 */
1951: 0xC5712EE4, /* 253 */
1952: 0xA8380437, /* 254 */
1953: 0x2EEF261A}, /* 255 */
1954:
1955: {
1956: /* Start of S Box 3 */
1957:
1958: 0x5A79392B, /* 0 */
1959: 0xB8AF32C2, /* 1 */
1960: 0x41F7720A, /* 2 */
1961: 0x833A61EC, /* 3 */
1962: 0x13DFEDAC, /* 4 */
1963: 0xC4990BC4, /* 5 */
1964: 0xDC0F54BC, /* 6 */
1965: 0xFEDD5E88, /* 7 */
1966: 0x80DA1881, /* 8 */
1967: 0x4DEA1AFD, /* 9 */
1968: 0xFD402CC6, /* 10 */
1969: 0xAE67CC7A, /* 11 */
1970: 0xC5238525, /* 12 */
1971: 0x8EA01254, /* 13 */
1972: 0xB56B9BD5, /* 14 */
1973: 0x862FBD6D, /* 15 */
1974: 0xAC8575D3, /* 16 */
1975: 0x6FBA3714, /* 17 */
1976: 0xDA7EBF46, /* 18 */
1977: 0x59CD5238, /* 19 */
1978: 0x8AC9DBFE, /* 20 */
1979: 0x353729FC, /* 21 */
1980: 0xE497D7F2, /* 22 */
1981: 0xC3AB84E0, /* 23 */
1982: 0xF05A114B, /* 24 */
1983: 0x7B887A75, /* 25 */
1984: 0xEDC603DD, /* 26 */
1985: 0x5E6FE680, /* 27 */
1986: 0x2C84B399, /* 28 */
1987: 0x884EB1DA, /* 29 */
1988: 0x1CB8C8BF, /* 30 */
1989: 0xAA51098A, /* 31 */
1990: 0xC862231C, /* 32 */
1991: 0x8BAC2221, /* 33 */
1992: 0x21B387E5, /* 34 */
1993: 0x208A430D, /* 35 */
1994: 0x2A3F0F8B, /* 36 */
1995: 0xA5FF9CD2, /* 37 */
1996: 0x6012A2EA, /* 38 */
1997: 0x147A9EE7, /* 39 */
1998: 0xF62A501D, /* 40 */
1999: 0xB4B2E51A, /* 41 */
2000: 0x3EF3484C, /* 42 */
2001: 0xC0253C59, /* 43 */
2002: 0x2B82B536, /* 44 */
2003: 0xAA9696B, /* 45 */
2004: 0xBE0C109B, /* 46 */
2005: 0xC70B7929, /* 47 */
2006: 0xCE3E8A19, /* 48 */
2007: 0x2F66950E, /* 49 */
2008: 0x459F1C2C, /* 50 */
2009: 0xE68FB93D, /* 51 */
2010: 0xA3C3FF3E, /* 52 */
2011: 0x62B45C62, /* 53 */
2012: 0x300991CB, /* 54 */
2013: 0x1914C57, /* 55 */
2014: 0x7F7BC06A, /* 56 */
2015: 0x182831F5, /* 57 */
2016: 0xE7B74BCA, /* 58 */
2017: 0xFA50F6D0, /* 59 */
2018: 0x523CAA61, /* 60 */
2019: 0xE3A7CF05, /* 61 */
2020: 0xE9E41311, /* 62 */
2021: 0x280A21D1, /* 63 */
2022: 0x6A4297E1, /* 64 */
2023: 0xF24DC67E, /* 65 */
2024: 0xFC3189E6, /* 66 */
2025: 0xB72BF34F, /* 67 */
2026: 0x4B1E67AF, /* 68 */
2027: 0x543402CE, /* 69 */
2028: 0x79A59867, /* 70 */
2029: 0x648E02A, /* 71 */
2030: 0xA3AC17, /* 72 */
2031: 0xC6208D35, /* 73 */
2032: 0x6E7F5F76, /* 74 */
2033: 0xA45BB4BE, /* 75 */
2034: 0xF168FA63, /* 76 */
2035: 0x3F4125F3, /* 77 */
2036: 0xF311406F, /* 78 */
2037: 0x2706565, /* 79 */
2038: 0xBFE58022, /* 80 */
2039: 0xCFCFDD9, /* 81 */
2040: 0x735A7F7, /* 82 */
2041: 0x8F049092, /* 83 */
2042: 0xD98EDC27, /* 84 */
2043: 0xF5C5D55C, /* 85 */
2044: 0xE0F201DB, /* 86 */
2045: 0xDCAFC9A, /* 87 */
2046: 0x7727FB79, /* 88 */
2047: 0xAF43ABF4, /* 89 */
2048: 0x26E938C1, /* 90 */
2049: 0x401B26A6, /* 91 */
2050: 0x900720FA, /* 92 */
2051: 0x2752D97B, /* 93 */
2052: 0xCFF1D1B3, /* 94 */
2053: 0xA9D9E424, /* 95 */
2054: 0x42DB99AB, /* 96 */
2055: 0x6CF8BE5F, /* 97 */
2056: 0xE82CEBE3, /* 98 */
2057: 0x3AFB733B, /* 99 */
2058: 0x6B734EB6, /* 100 */
2059: 0x1036414A, /* 101 */
2060: 0x975F667C, /* 102 */
2061: 0x49D6377, /* 103 */
2062: 0xBA587C60, /* 104 */
2063: 0xB1D10483, /* 105 */
2064: 0xDE1AEFCC, /* 106 */
2065: 0x1129D055, /* 107 */
2066: 0x72051E91, /* 108 */
2067: 0x6946D623, /* 109 */
2068: 0xF9E86EA7, /* 110 */
2069: 0x48768C00, /* 111 */
2070: 0xB0166C93, /* 112 */
2071: 0x9956BBF0, /* 113 */
2072: 0x1F1F6D84, /* 114 */
2073: 0xFB15E18E, /* 115 */
2074: 0x33B495D, /* 116 */
2075: 0x56E3362E, /* 117 */
2076: 0x4F44C53C, /* 118 */
2077: 0x747CBA51, /* 119 */
2078: 0x89D37872, /* 120 */
2079: 0x5D9C331B, /* 121 */
2080: 0xD2EF9FA8, /* 122 */
2081: 0x254917F8, /* 123 */
2082: 0x1B106F47, /* 124 */
2083: 0x37D75553, /* 125 */
2084: 0xB3F053B0, /* 126 */
2085: 0x7DCCD8EF, /* 127 */
2086: 0xD30EB802, /* 128 */
2087: 0x5889F42D, /* 129 */
2088: 0x610206D7, /* 130 */
2089: 0x1A7D34A1, /* 131 */
2090: 0x92D87DD8, /* 132 */
2091: 0xE5F4A315, /* 133 */
2092: 0xD1CF0E71, /* 134 */
2093: 0xB22DFE45, /* 135 */
2094: 0xB901E8EB, /* 136 */
2095: 0xFC0CE5E, /* 137 */
2096: 0x2EFA60C9, /* 138 */
2097: 0x2DE74290, /* 139 */
2098: 0x36D0C906, /* 140 */
2099: 0x381C70E4, /* 141 */
2100: 0x4C6DA5B5, /* 142 */
2101: 0x3D81A682, /* 143 */
2102: 0x7E381F34, /* 144 */
2103: 0x396C4F52, /* 145 */
2104: 0x95AD5901, /* 146 */
2105: 0x1DB50C5A, /* 147 */
2106: 0x29982E9E, /* 148 */
2107: 0x1557689F, /* 149 */
2108: 0x3471EE42, /* 150 */
2109: 0xD7E2F7C0, /* 151 */
2110: 0x8795A1E2, /* 152 */
2111: 0xBC324D8D, /* 153 */
2112: 0xE224C3C8, /* 154 */
2113: 0x12837E39, /* 155 */
2114: 0xCDEE3D74, /* 156 */
2115: 0x7AD2143F, /* 157 */
2116: 0xE13D40C, /* 158 */
2117: 0x78BD4A68, /* 159 */
2118: 0xA2EB194D, /* 160 */
2119: 0xDB9451F9, /* 161 */
2120: 0x859B71DC, /* 162 */
2121: 0x5C4F5B89, /* 163 */
2122: 0xCA14A8A4, /* 164 */
2123: 0xEF92F003, /* 165 */
2124: 0x16741D98, /* 166 */
2125: 0x33AA4444, /* 167 */
2126: 0x9E967FBB, /* 168 */
2127: 0x92E3020, /* 169 */
2128: 0xD86A35B8, /* 170 */
2129: 0x8CC17B10, /* 171 */
2130: 0xE1BF08AE, /* 172 */
2131: 0x55693FC5, /* 173 */
2132: 0x7680AD13, /* 174 */
2133: 0x1E6546E8, /* 175 */
2134: 0x23B6E7B9, /* 176 */
2135: 0xEE77A4B2, /* 177 */
2136: 0x8ED0533, /* 178 */
2137: 0x44FD2895, /* 179 */
2138: 0xB6393B69, /* 180 */
2139: 0x5D6CACF, /* 181 */
2140: 0x9819B209, /* 182 */
2141: 0xECBBB72F, /* 183 */
2142: 0x9A75779C, /* 184 */
2143: 0xEAEC0749, /* 185 */
2144: 0x94A65AEE, /* 186 */
2145: 0xBDF52DC3, /* 187 */
2146: 0xD6A25D04, /* 188 */
2147: 0x82008E4E, /* 189 */
2148: 0xA6DE160F, /* 190 */
2149: 0x9B036AFB, /* 191 */
2150: 0x228B3A66, /* 192 */
2151: 0x5FB10A70, /* 193 */
2152: 0xCC338B58, /* 194 */
2153: 0x5378A9DF, /* 195 */
2154: 0xC908BCA9, /* 196 */
2155: 0x4959E25B, /* 197 */
2156: 0x46909A97, /* 198 */
2157: 0x66AE8F6E, /* 199 */
2158: 0xDD0683E9, /* 200 */
2159: 0x65F994B4, /* 201 */
2160: 0x6426CDA5, /* 202 */
2161: 0xC24B8840, /* 203 */
2162: 0x32539DA0, /* 204 */
2163: 0x63175650, /* 205 */
2164: 0xD0C815FF, /* 206 */
2165: 0x50CBC41E, /* 207 */
2166: 0xF7C774A3, /* 208 */
2167: 0x31B0C231, /* 209 */
2168: 0x8D0D8116, /* 210 */
2169: 0x24BEF16C, /* 211 */
2170: 0xD555D256, /* 212 */
2171: 0xDF47EA8C, /* 213 */
2172: 0x6D21ECCD, /* 214 */
2173: 0xA887A012, /* 215 */
2174: 0x84542AED, /* 216 */
2175: 0xA7B9C1BD, /* 217 */
2176: 0x914C1BB1, /* 218 */
2177: 0xA0D5B67D, /* 219 */
2178: 0x438CE937, /* 220 */
2179: 0x7030F873, /* 221 */
2180: 0x71F6B0C7, /* 222 */
2181: 0x574576BA, /* 223 */
2182: 0xF8BC4541, /* 224 */
2183: 0x9C61D348, /* 225 */
2184: 0x1960579D, /* 226 */
2185: 0x17C4DAAD, /* 227 */
2186: 0x96A4CB0B, /* 228 */
2187: 0xC193F2F6, /* 229 */
2188: 0x756EAFA2, /* 230 */
2189: 0x7C1D2F94, /* 231 */
2190: 0xF4FE2B43, /* 232 */
2191: 0xCB86E33A, /* 233 */
2192: 0xEBD4C728, /* 234 */
2193: 0x9D18AE64, /* 235 */
2194: 0x9FE13E30, /* 236 */
2195: 0x3CE0F5DE, /* 237 */
2196: 0xABA1F985, /* 238 */
2197: 0xADDC2718, /* 239 */
2198: 0x68CE6278, /* 240 */
2199: 0xD45E241F, /* 241 */
2200: 0xA15C82B7, /* 242 */
2201: 0x3B2293D4, /* 243 */
2202: 0x739EDD32, /* 244 */
2203: 0x674A6BF1, /* 245 */
2204: 0x5B5D587F, /* 246 */
2205: 0x4772DEAA, /* 247 */
2206: 0x4A63968F, /* 248 */
2207: 0xBE68686, /* 249 */
2208: 0x513D6426, /* 250 */
2209: 0x939A4787, /* 251 */
2210: 0xBBA89296, /* 252 */
2211: 0x4EC20007, /* 253 */
2212: 0x818D0D08, /* 254 */
2213: 0xFF64DFD6}, /* 255 */
2214:
2215: {
2216: /* Start of S Box 4 */
2217:
2218: 0xCB2297CB, /* 0 */
2219: 0xDB48A144, /* 1 */
2220: 0xA16CBE4B, /* 2 */
2221: 0xBBEA1D6C, /* 3 */
2222: 0x5AF6B6B7, /* 4 */
2223: 0x8A8110B6, /* 5 */
2224: 0xF9236EF9, /* 6 */
2225: 0xC98F83E6, /* 7 */
2226: 0xF9C65B8, /* 8 */
2227: 0x252D4A89, /* 9 */
2228: 0xA497F068, /* 10 */
2229: 0xA5D7ED2D, /* 11 */
2230: 0x94C22845, /* 12 */
2231: 0x9DA1C8C4, /* 13 */
2232: 0xE27C2E2E, /* 14 */
2233: 0x6E8BA2B4, /* 15 */
2234: 0xC3DD17FB, /* 16 */
2235: 0x498CD482, /* 17 */
2236: 0xDFE6A9F, /* 18 */
2237: 0xB0705829, /* 19 */
2238: 0x9A1E6DC1, /* 20 */
2239: 0xF829717C, /* 21 */
2240: 0x7BB8E3A, /* 22 */
2241: 0xDA3C0B02, /* 23 */
2242: 0x1AF82FC7, /* 24 */
2243: 0x73B70955, /* 25 */
2244: 0x7A04379C, /* 26 */
2245: 0x5EE20A28, /* 27 */
2246: 0x83712AE5, /* 28 */
2247: 0xF4C47C6D, /* 29 */
2248: 0xDF72BA56, /* 30 */
2249: 0xD794858D, /* 31 */
2250: 0x8C0CF709, /* 32 */
2251: 0x18F0F390, /* 33 */
2252: 0xB6C69B35, /* 34 */
2253: 0xBF2F01DB, /* 35 */
2254: 0x2FA74DCA, /* 36 */
2255: 0xD0CD9127, /* 37 */
2256: 0xBDE66CEC, /* 38 */
2257: 0x3DEEBD46, /* 39 */
2258: 0x57C88FC3, /* 40 */
2259: 0xCEE1406F, /* 41 */
2260: 0x66385A, /* 42 */
2261: 0xF3C3444F, /* 43 */
2262: 0x3A79D5D5, /* 44 */
2263: 0x75751EB9, /* 45 */
2264: 0x3E7F8185, /* 46 */
2265: 0x521C2605, /* 47 */
2266: 0xE1AAAB6E, /* 48 */
2267: 0x38EBB80F, /* 49 */
2268: 0xBEE7E904, /* 50 */
2269: 0x61CB9647, /* 51 */
2270: 0xEA54904E, /* 52 */
2271: 0x5AE00E4, /* 53 */
2272: 0x2D7AC65F, /* 54 */
2273: 0x87751A1, /* 55 */
2274: 0xDCD82915, /* 56 */
2275: 0x921EE16, /* 57 */
2276: 0xDD86D33B, /* 58 */
2277: 0xD6BD491A, /* 59 */
2278: 0x40FBADF0, /* 60 */
2279: 0x4232CBD2, /* 61 */
2280: 0x33808D10, /* 62 */
2281: 0x39098C42, /* 63 */
2282: 0x193F3199, /* 64 */
2283: 0xBC1E47A, /* 65 */
2284: 0x4A82B149, /* 66 */
2285: 0x2B65A8A, /* 67 */
2286: 0x104CDC8E, /* 68 */
2287: 0x24A8F52C, /* 69 */
2288: 0x685C6077, /* 70 */
2289: 0xC79F95C9, /* 71 */
2290: 0x1D11FE50, /* 72 */
2291: 0xC08DAFCD, /* 73 */
2292: 0x7B1A9A03, /* 74 */
2293: 0x1C1F11D8, /* 75 */
2294: 0x84250E7F, /* 76 */
2295: 0x979DB248, /* 77 */
2296: 0xEBDC0501, /* 78 */
2297: 0xB9553395, /* 79 */
2298: 0xE3C05EA8, /* 80 */
2299: 0xB1E51C4C, /* 81 */
2300: 0x13B0E681, /* 82 */
2301: 0x3B407766, /* 83 */
2302: 0x36DB3087, /* 84 */
2303: 0xEE17C9FC, /* 85 */
2304: 0x6C53ECF2, /* 86 */
2305: 0xADCCC58F, /* 87 */
2306: 0xC427660B, /* 88 */
2307: 0xEFD5867D, /* 89 */
2308: 0x9B6D54A5, /* 90 */
2309: 0x6FF1AEFF, /* 91 */
2310: 0x8E787952, /* 92 */
2311: 0x9E2BFFE0, /* 93 */
2312: 0x8761D034, /* 94 */
2313: 0xE00BDBAD, /* 95 */
2314: 0xAE99A8D3, /* 96 */
2315: 0xCC03F6E2, /* 97 */
2316: 0xFD0ED807, /* 98 */
2317: 0xE508AE3, /* 99 */
2318: 0xB74182AB, /* 100 */
2319: 0x4349245D, /* 101 */
2320: 0xD120A465, /* 102 */
2321: 0xB246A641, /* 103 */
2322: 0xAF3B7AB0, /* 104 */
2323: 0x2A6488BB, /* 105 */
2324: 0x4B3A0D1F, /* 106 */
2325: 0xE7C7E58C, /* 107 */
2326: 0x3FAFF2EB, /* 108 */
2327: 0x90445FFD, /* 109 */
2328: 0xCF38C393, /* 110 */
2329: 0x995D07E7, /* 111 */
2330: 0xF24F1B36, /* 112 */
2331: 0x356F6891, /* 113 */
2332: 0x6D6EBCBE, /* 114 */
2333: 0x8DA9E262, /* 115 */
2334: 0x50FD520E, /* 116 */
2335: 0x5BCA9E1E, /* 117 */
2336: 0x37472CF3, /* 118 */
2337: 0x69075057, /* 119 */
2338: 0x7EC5FDED, /* 120 */
2339: 0xCAB892A, /* 121 */
2340: 0xFB2412BA, /* 122 */
2341: 0x1728DEBF, /* 123 */
2342: 0xA000A988, /* 124 */
2343: 0xD843CE79, /* 125 */
2344: 0x42E20DD, /* 126 */
2345: 0x4FE8F853, /* 127 */
2346: 0x56659C3C, /* 128 */
2347: 0x2739D119, /* 129 */
2348: 0xA78A6120, /* 130 */
2349: 0x80960375, /* 131 */
2350: 0x70420611, /* 132 */
2351: 0x85E09F78, /* 133 */
2352: 0xABD17E96, /* 134 */
2353: 0x1B513EAF, /* 135 */
2354: 0x1E01EB63, /* 136 */
2355: 0x26AD2133, /* 137 */
2356: 0xA890C094, /* 138 */
2357: 0x7613CF60, /* 139 */
2358: 0x817E781B, /* 140 */
2359: 0xA39113D7, /* 141 */
2360: 0xE957FA58, /* 142 */
2361: 0x4131B99E, /* 143 */
2362: 0x28B1EFDA, /* 144 */
2363: 0x66ACFBA7, /* 145 */
2364: 0xFF68944A, /* 146 */
2365: 0x77A44FD1, /* 147 */
2366: 0x7F331522, /* 148 */
2367: 0x59FFB3FA, /* 149 */
2368: 0xA6DF935B, /* 150 */
2369: 0xFA12D9DF, /* 151 */
2370: 0xC6BF6F3F, /* 152 */
2371: 0x89520CF6, /* 153 */
2372: 0x659EDD6A, /* 154 */
2373: 0x544DA739, /* 155 */
2374: 0x8B052538, /* 156 */
2375: 0x7C30EA21, /* 157 */
2376: 0xC2345525, /* 158 */
2377: 0x15927FB2, /* 159 */
2378: 0x144A436B, /* 160 */
2379: 0xBA107B8B, /* 161 */
2380: 0x1219AC97, /* 162 */
2381: 0x6730432, /* 163 */
2382: 0x31831AB3, /* 164 */
2383: 0xC55A5C24, /* 165 */
2384: 0xAA0FCD3E, /* 166 */
2385: 0xE5606BE8, /* 167 */
2386: 0x5C88F19B, /* 168 */
2387: 0x4C0841EE, /* 169 */
2388: 0x1FE37267, /* 170 */
2389: 0x11F9C4F4, /* 171 */
2390: 0x9F1B9DAE, /* 172 */
2391: 0x864E76D0, /* 173 */
2392: 0xE637C731, /* 174 */
2393: 0xD97D23A6, /* 175 */
2394: 0x32F53D5C, /* 176 */
2395: 0xB8161980, /* 177 */
2396: 0x93FA0F84, /* 178 */
2397: 0xCAEF0870, /* 179 */
2398: 0x8874487E, /* 180 */
2399: 0x98F2CC73, /* 181 */
2400: 0x645FB5C6, /* 182 */
2401: 0xCD853659, /* 183 */
2402: 0x2062470D, /* 184 */
2403: 0x16EDE8E9, /* 185 */
2404: 0x6B06DAB5, /* 186 */
2405: 0x78B43900, /* 187 */
2406: 0xFC95B786, /* 188 */
2407: 0x5D8E7DE1, /* 189 */
2408: 0x465B5954, /* 190 */
2409: 0xFE7BA014, /* 191 */
2410: 0xF7D23F7B, /* 192 */
2411: 0x92BC8B18, /* 193 */
2412: 0x3593592, /* 194 */
2413: 0x55CEF4F7, /* 195 */
2414: 0x74B27317, /* 196 */
2415: 0x79DE1FC2, /* 197 */
2416: 0xC8A0BFBD, /* 198 */
2417: 0x229398CC, /* 199 */
2418: 0x62A602CE, /* 200 */
2419: 0xBCB94661, /* 201 */
2420: 0x5336D206, /* 202 */
2421: 0xD2A375FE, /* 203 */
2422: 0x6A6AB483, /* 204 */
2423: 0x4702A5A4, /* 205 */
2424: 0xA2E9D73D, /* 206 */
2425: 0x23A2E0F1, /* 207 */
2426: 0x9189140A, /* 208 */
2427: 0x581D18DC, /* 209 */
2428: 0xB39A922B, /* 210 */
2429: 0x82356212, /* 211 */
2430: 0xD5F432A9, /* 212 */
2431: 0xD356C2A3, /* 213 */
2432: 0x5F765B4D, /* 214 */
2433: 0x450AFCC8, /* 215 */
2434: 0x4415E137, /* 216 */
2435: 0xE8ECDFBC, /* 217 */
2436: 0xED0DE3EA, /* 218 */
2437: 0x60D42B13, /* 219 */
2438: 0xF13DF971, /* 220 */
2439: 0x71FC5DA2, /* 221 */
2440: 0xC1455340, /* 222 */
2441: 0xF087742F, /* 223 */
2442: 0xF55E5751, /* 224 */
2443: 0x67B3C1F8, /* 225 */
2444: 0xAC6B8774, /* 226 */
2445: 0x7DCFAAAC, /* 227 */
2446: 0x95983BC0, /* 228 */
2447: 0x489BB0B1, /* 229 */
2448: 0x2C184223, /* 230 */
2449: 0x964B6726, /* 231 */
2450: 0x2BD3271C, /* 232 */
2451: 0x72266472, /* 233 */
2452: 0xDED64530, /* 234 */
2453: 0xA2AA343, /* 235 */
2454: 0xD4F716A0, /* 236 */
2455: 0xB4DAD6D9, /* 237 */
2456: 0x2184345E, /* 238 */
2457: 0x512C990C, /* 239 */
2458: 0x29D92D08, /* 240 */
2459: 0x2EBE709A, /* 241 */
2460: 0x1144C69, /* 242 */
2461: 0x34584B9D, /* 243 */
2462: 0xE4634ED6, /* 244 */
2463: 0xECC963CF, /* 245 */
2464: 0x3C6984AA, /* 246 */
2465: 0x4ED056EF, /* 247 */
2466: 0x9CA56976, /* 248 */
2467: 0x8F3E80D4, /* 249 */
2468: 0xB5BAE7C5, /* 250 */
2469: 0x30B5CAF5, /* 251 */
2470: 0x63F33A64, /* 252 */
2471: 0xA9E4BBDE, /* 253 */
2472: 0xF6B82298, /* 254 */
2473: 0x4D673C1D}, /* 255 */
2474:
2475: {
2476: /* Start of S Box 5 */
2477:
2478: 0x4B4F1121, /* 0 */
2479: 0xBA183081, /* 1 */
2480: 0xC784F41F, /* 2 */
2481: 0xD17D0BAC, /* 3 */
2482: 0x83D2267, /* 4 */
2483: 0x37B1361E, /* 5 */
2484: 0x3581AD05, /* 6 */
2485: 0xFDA2F6BC, /* 7 */
2486: 0x1E892CDD, /* 8 */
2487: 0xB56D3C3A, /* 9 */
2488: 0x32140E46, /* 10 */
2489: 0x138D8AAB, /* 11 */
2490: 0xE14773D4, /* 12 */
2491: 0x5B0E71DF, /* 13 */
2492: 0x5D1FE055, /* 14 */
2493: 0x3FB991D3, /* 15 */
2494: 0xF1F46C71, /* 16 */
2495: 0xA325988C, /* 17 */
2496: 0x10F66E80, /* 18 */
2497: 0xB1006348, /* 19 */
2498: 0x726A9F60, /* 20 */
2499: 0x3B67F8BA, /* 21 */
2500: 0x4E114EF4, /* 22 */
2501: 0x5C52115, /* 23 */
2502: 0x4C5CA11C, /* 24 */
2503: 0x99E1EFD8, /* 25 */
2504: 0x471B83B3, /* 26 */
2505: 0xCBF7E524, /* 27 */
2506: 0x43AD82F5, /* 28 */
2507: 0x690CA93B, /* 29 */
2508: 0xFAA61BB2, /* 30 */
2509: 0x12A832B5, /* 31 */
2510: 0xB734F943, /* 32 */
2511: 0xBD22AEA7, /* 33 */
2512: 0x88FEC626, /* 34 */
2513: 0x5E80C3E7, /* 35 */
2514: 0xBE3EAF5E, /* 36 */
2515: 0x44617652, /* 37 */
2516: 0xA5724475, /* 38 */
2517: 0xBB3B9695, /* 39 */
2518: 0x7F3FEE8F, /* 40 */
2519: 0x964E7DEB, /* 41 */
2520: 0x518C052D, /* 42 */
2521: 0x2A0BBC2B, /* 43 */
2522: 0xC2175F5C, /* 44 */
2523: 0x9A7B3889, /* 45 */
2524: 0xA70D8D0C, /* 46 */
2525: 0xEACCDD29, /* 47 */
2526: 0xCCCD6658, /* 48 */
2527: 0x34BB25E6, /* 49 */
2528: 0xB8391090, /* 50 */
2529: 0xF651356F, /* 51 */
2530: 0x52987C9E, /* 52 */
2531: 0xC16C1CD, /* 53 */
2532: 0x8E372D3C, /* 54 */
2533: 0x2FC6EBBD, /* 55 */
2534: 0x6E5DA3E3, /* 56 */
2535: 0xB0E27239, /* 57 */
2536: 0x5F685738, /* 58 */
2537: 0x45411786, /* 59 */
2538: 0x67F65F8, /* 60 */
2539: 0x61778B40, /* 61 */
2540: 0x81AB2E65, /* 62 */
2541: 0x14C8F0F9, /* 63 */
2542: 0xA6B7B4CE, /* 64 */
2543: 0x4036EAEC, /* 65 */
2544: 0xBF62B00A, /* 66 */
2545: 0xECFD5E02, /* 67 */
2546: 0x45449A6, /* 68 */
2547: 0xB20AFD28, /* 69 */
2548: 0x2166D273, /* 70 */
2549: 0xD13A863, /* 71 */
2550: 0x89508756, /* 72 */
2551: 0xD51A7530, /* 73 */
2552: 0x2D653F7A, /* 74 */
2553: 0x3CDBDBC3, /* 75 */
2554: 0x80C9DF4F, /* 76 */
2555: 0x3D5812D9, /* 77 */
2556: 0x53FBB1F3, /* 78 */
2557: 0xC0F185C0, /* 79 */
2558: 0x7A3C3D7E, /* 80 */
2559: 0x68646410, /* 81 */
2560: 0x857607A0, /* 82 */
2561: 0x1D12622E, /* 83 */
2562: 0x97F33466, /* 84 */
2563: 0xDB4C9917, /* 85 */
2564: 0x6469607C, /* 86 */
2565: 0x566E043D, /* 87 */
2566: 0x79EF1EDB, /* 88 */
2567: 0x2C05898D, /* 89 */
2568: 0xC9578E25, /* 90 */
2569: 0xCD380101, /* 91 */
2570: 0x46E04377, /* 92 */
2571: 0x7D1CC7A9, /* 93 */
2572: 0x6552B837, /* 94 */
2573: 0x20192608, /* 95 */
2574: 0xB97500C5, /* 96 */
2575: 0xED296B44, /* 97 */
2576: 0x368648B4, /* 98 */
2577: 0x62995CD5, /* 99 */
2578: 0x82731400, /* 100 */
2579: 0xF9AEBD8B, /* 101 */
2580: 0x3844C0C7, /* 102 */
2581: 0x7C2DE794, /* 103 */
2582: 0x33A1A770, /* 104 */
2583: 0x8AE528C2, /* 105 */
2584: 0x5A2BE812, /* 106 */
2585: 0x1F8F4A07, /* 107 */
2586: 0x2B5ED7CA, /* 108 */
2587: 0x937EB564, /* 109 */
2588: 0x6FDA7E11, /* 110 */
2589: 0xE49B5D6C, /* 111 */
2590: 0xB4B3244E, /* 112 */
2591: 0x18AA53A4, /* 113 */
2592: 0x3A061334, /* 114 */
2593: 0x4D6067A3, /* 115 */
2594: 0x83BA5868, /* 116 */
2595: 0x9BDF4DFE, /* 117 */
2596: 0x7449F261, /* 118 */
2597: 0x709F8450, /* 119 */
2598: 0xCAD133CB, /* 120 */
2599: 0xDE941C3F, /* 121 */
2600: 0xF52AE484, /* 122 */
2601: 0x781D77ED, /* 123 */
2602: 0x7E4395F0, /* 124 */
2603: 0xAE103B59, /* 125 */
2604: 0x922331BB, /* 126 */
2605: 0x42CE50C8, /* 127 */
2606: 0xE6F08153, /* 128 */
2607: 0xE7D941D0, /* 129 */
2608: 0x5028ED6B, /* 130 */
2609: 0xB3D2C49B, /* 131 */
2610: 0xAD4D9C3E, /* 132 */
2611: 0xD201FB6E, /* 133 */
2612: 0xA45BD5BE, /* 134 */
2613: 0xFFCB7F4B, /* 135 */
2614: 0x579D7806, /* 136 */
2615: 0xF821BB5B, /* 137 */
2616: 0x59D592AD, /* 138 */
2617: 0xD0BE0C31, /* 139 */
2618: 0xD4E3B676, /* 140 */
2619: 0x107165A, /* 141 */
2620: 0xFE939D2, /* 142 */
2621: 0x49BCAAFD, /* 143 */
2622: 0x55FFCFE5, /* 144 */
2623: 0x2EC1F783, /* 145 */
2624: 0xF39A09A5, /* 146 */
2625: 0x3EB42772, /* 147 */
2626: 0x19B55A5D, /* 148 */
2627: 0x24A0679, /* 149 */
2628: 0x8C83B3F7, /* 150 */
2629: 0x8642BA1D, /* 151 */
2630: 0xACACD9EA, /* 152 */
2631: 0x87D352C4, /* 153 */
2632: 0x60931F45, /* 154 */
2633: 0xA05F97D7, /* 155 */
2634: 0x1CECD42C, /* 156 */
2635: 0xE2FCC87B, /* 157 */
2636: 0xB60F94E2, /* 158 */
2637: 0x67A34B0B, /* 159 */
2638: 0xFCDD40C9, /* 160 */
2639: 0xB150A27, /* 161 */
2640: 0xD3EE9E04, /* 162 */
2641: 0x582E29E9, /* 163 */
2642: 0x4AC22B41, /* 164 */
2643: 0x6AC4E1B8, /* 165 */
2644: 0xBCCAA51A, /* 166 */
2645: 0x237AF30E, /* 167 */
2646: 0xEBC3B709, /* 168 */
2647: 0xC4A59D19, /* 169 */
2648: 0x284BC98A, /* 170 */
2649: 0xE9D41A93, /* 171 */
2650: 0x6BFA2018, /* 172 */
2651: 0x73B2D651, /* 173 */
2652: 0x11F9A2FA, /* 174 */
2653: 0xCE09BFF1, /* 175 */
2654: 0x41A470AA, /* 176 */
2655: 0x25888F22, /* 177 */
2656: 0x77E754E8, /* 178 */
2657: 0xF7330D8E, /* 179 */
2658: 0x158EAB16, /* 180 */
2659: 0xC5D68842, /* 181 */
2660: 0xC685A6F6, /* 182 */
2661: 0xE5B82FDE, /* 183 */
2662: 0x9EA3A96, /* 184 */
2663: 0x6DDE1536, /* 185 */
2664: 0x4FA919DA, /* 186 */
2665: 0x26C0BE9F, /* 187 */
2666: 0x9EED6F69, /* 188 */
2667: 0xF05555F2, /* 189 */
2668: 0xE06FC285, /* 190 */
2669: 0x9CD76D23, /* 191 */
2670: 0xAF452A92, /* 192 */
2671: 0xEFC74CB7, /* 193 */
2672: 0x9D6B4732, /* 194 */
2673: 0x8BE408EE, /* 195 */
2674: 0x22401D0D, /* 196 */
2675: 0xEE6C459D, /* 197 */
2676: 0x7587CB82, /* 198 */
2677: 0xE8746862, /* 199 */
2678: 0x5CBDDE87, /* 200 */
2679: 0x98794278, /* 201 */
2680: 0x31AFB94D, /* 202 */
2681: 0xC11E0F2F, /* 203 */
2682: 0x30E8FC2A, /* 204 */
2683: 0xCF3261EF, /* 205 */
2684: 0x1A3023E1, /* 206 */
2685: 0xAA2F86CF, /* 207 */
2686: 0xF202E24A, /* 208 */
2687: 0x8D08DCFF, /* 209 */
2688: 0x764837C6, /* 210 */
2689: 0xA26374CC, /* 211 */
2690: 0x9F7C3E88, /* 212 */
2691: 0x949CC57D, /* 213 */
2692: 0xDD26A07F, /* 214 */
2693: 0xC39EFAB0, /* 215 */
2694: 0xC8F879A1, /* 216 */
2695: 0xDCE67BB9, /* 217 */
2696: 0xF4B0A435, /* 218 */
2697: 0x912C9AE0, /* 219 */
2698: 0xD85603E4, /* 220 */
2699: 0x953A9BBF, /* 221 */
2700: 0xFB8290D6, /* 222 */
2701: 0xAEBCD5F, /* 223 */
2702: 0x16206A9A, /* 224 */
2703: 0x6C787A14, /* 225 */
2704: 0xD9A0F16A, /* 226 */
2705: 0x29BF4F74, /* 227 */
2706: 0x8F8BCE91, /* 228 */
2707: 0xE5A9354, /* 229 */
2708: 0xAB038CB1, /* 230 */
2709: 0x1B8AD11B, /* 231 */
2710: 0xE327FF49, /* 232 */
2711: 0x53DA20, /* 233 */
2712: 0x90CF51DC, /* 234 */
2713: 0xDA92FE6D, /* 235 */
2714: 0x390CA47, /* 236 */
2715: 0xA8958097, /* 237 */
2716: 0xA9DC5BAF, /* 238 */
2717: 0x3931E3C1, /* 239 */
2718: 0x840446B6, /* 240 */
2719: 0x63D069FB, /* 241 */
2720: 0xD7460299, /* 242 */
2721: 0x7124ECD1, /* 243 */
2722: 0x791E613, /* 244 */
2723: 0x485918FC, /* 245 */
2724: 0xD635D04C, /* 246 */
2725: 0xDF96AC33, /* 247 */
2726: 0x66F2D303, /* 248 */
2727: 0x247056AE, /* 249 */
2728: 0xA1A7B2A8, /* 250 */
2729: 0x27D8CC9C, /* 251 */
2730: 0x17B6E998, /* 252 */
2731: 0x7BF5590F, /* 253 */
2732: 0xFE97F557, /* 254 */
2733: 0x5471D8A2}, /* 255 */
2734:
2735: {
2736: /* Start of S Box 6 */
2737:
2738: 0x83A327A1, /* 0 */
2739: 0x9F379F51, /* 1 */
2740: 0x40A7D007, /* 2 */
2741: 0x11307423, /* 3 */
2742: 0x224587C1, /* 4 */
2743: 0xAC27D63B, /* 5 */
2744: 0x3B7E64EA, /* 6 */
2745: 0x2E1CBFA6, /* 7 */
2746: 0x9996000, /* 8 */
2747: 0x3BC0E2C, /* 9 */
2748: 0xD4C4478A, /* 10 */
2749: 0x4542E0AB, /* 11 */
2750: 0xFEDA26D4, /* 12 */
2751: 0xC1D10FCB, /* 13 */
2752: 0x8252F596, /* 14 */
2753: 0x4494EB5C, /* 15 */
2754: 0xA362F314, /* 16 */
2755: 0xF5BA81FD, /* 17 */
2756: 0x75C3A376, /* 18 */
2757: 0x4CA214CA, /* 19 */
2758: 0xE164DEDD, /* 20 */
2759: 0x5088FA97, /* 21 */
2760: 0x4B0930E0, /* 22 */
2761: 0x2FCFB7E8, /* 23 */
2762: 0x33A6F4B2, /* 24 */
2763: 0xC7E94211, /* 25 */
2764: 0x2D66C774, /* 26 */
2765: 0x43BE8BAE, /* 27 */
2766: 0xC663D445, /* 28 */
2767: 0x908EB130, /* 29 */
2768: 0xF4E3BE15, /* 30 */
2769: 0x63B9D566, /* 31 */
2770: 0x529396B5, /* 32 */
2771: 0x1E1BE743, /* 33 */
2772: 0x4D5FF63F, /* 34 */
2773: 0x985E4A83, /* 35 */
2774: 0x71AB9DF7, /* 36 */
2775: 0xC516C6F5, /* 37 */
2776: 0x85C19AB4, /* 38 */
2777: 0x1F4DAEE4, /* 39 */
2778: 0xF2973431, /* 40 */
2779: 0xB713DC5E, /* 41 */
2780: 0x3F2E159A, /* 42 */
2781: 0xC824DA16, /* 43 */
2782: 0x6BF376A, /* 44 */
2783: 0xB2FE23EC, /* 45 */
2784: 0xE39B1C22, /* 46 */
2785: 0xF1EECB5F, /* 47 */
2786: 0x8E82D52, /* 48 */
2787: 0x565686C2, /* 49 */
2788: 0xAB0AEA93, /* 50 */
2789: 0xFD47219F, /* 51 */
2790: 0xEBDBABD7, /* 52 */
2791: 0x2404A185, /* 53 */
2792: 0x8C7312B9, /* 54 */
2793: 0xA8F2D828, /* 55 */
2794: 0xC8902DA, /* 56 */
2795: 0x65B42B63, /* 57 */
2796: 0xC0BBEF62, /* 58 */
2797: 0x4E3E4CEF, /* 59 */
2798: 0x788F8018, /* 60 */
2799: 0xEE1EBAB7, /* 61 */
2800: 0x93928F9D, /* 62 */
2801: 0x683D2903, /* 63 */
2802: 0xD3B60689, /* 64 */
2803: 0xAFCB0DDC, /* 65 */
2804: 0x88A4C47A, /* 66 */
2805: 0xF6DD9C3D, /* 67 */
2806: 0x7EA5FCA0, /* 68 */
2807: 0x8A6D7244, /* 69 */
2808: 0xBE11F120, /* 70 */
2809: 0x4FF91B8, /* 71 */
2810: 0x8D2DC8C0, /* 72 */
2811: 0x27F97FDB, /* 73 */
2812: 0x7F9E1F47, /* 74 */
2813: 0x1734F0C7, /* 75 */
2814: 0x26F3ED8E, /* 76 */
2815: 0xDF8F2BF, /* 77 */
2816: 0xB0833D9E, /* 78 */
2817: 0xE420A4E5, /* 79 */
2818: 0xA423CAE6, /* 80 */
2819: 0x95616772, /* 81 */
2820: 0x9AE6C049, /* 82 */
2821: 0x75941F2, /* 83 */
2822: 0xD8E12812, /* 84 */
2823: 0xF6F4F, /* 85 */
2824: 0x3C0D6B05, /* 86 */
2825: 0x6CEF921C, /* 87 */
2826: 0xB82BC264, /* 88 */
2827: 0x396CB008, /* 89 */
2828: 0x5D608A6F, /* 90 */
2829: 0x6D7782C8, /* 91 */
2830: 0x186550AA, /* 92 */
2831: 0x6B6FEC09, /* 93 */
2832: 0x28E70B13, /* 94 */
2833: 0x57CE5688, /* 95 */
2834: 0xECD3AF84, /* 96 */
2835: 0x23335A95, /* 97 */
2836: 0x91F40CD2, /* 98 */
2837: 0x7B6A3B26, /* 99 */
2838: 0xBD32B3B6, /* 100 */
2839: 0x3754A6FB, /* 101 */
2840: 0x8ED088F0, /* 102 */
2841: 0xF867E87C, /* 103 */
2842: 0x20851746, /* 104 */
2843: 0x6410F9C6, /* 105 */
2844: 0x35380442, /* 106 */
2845: 0xC2CA10A7, /* 107 */
2846: 0x1ADEA27F, /* 108 */
2847: 0x76BDDD79, /* 109 */
2848: 0x92742CF4, /* 110 */
2849: 0xE98F7EE, /* 111 */
2850: 0x164E931D, /* 112 */
2851: 0xB9C835B3, /* 113 */
2852: 0x69060A99, /* 114 */
2853: 0xB44C531E, /* 115 */
2854: 0xFA7B66FE, /* 116 */
2855: 0xC98A5B53, /* 117 */
2856: 0x7D95AAE9, /* 118 */
2857: 0x302F467B, /* 119 */
2858: 0x74B811DE, /* 120 */
2859: 0xF3866ABD, /* 121 */
2860: 0xB5B3D32D, /* 122 */
2861: 0xFC3157A4, /* 123 */
2862: 0xD251FE19, /* 124 */
2863: 0xB5D8EAC, /* 125 */
2864: 0xDA71FFD5, /* 126 */
2865: 0x47EA05A3, /* 127 */
2866: 0x5C6A9E1, /* 128 */
2867: 0xCA0EE958, /* 129 */
2868: 0x9939034D, /* 130 */
2869: 0x25DC5EDF, /* 131 */
2870: 0x79083CB1, /* 132 */
2871: 0x86768450, /* 133 */
2872: 0xCF757D6D, /* 134 */
2873: 0x5972B6BC, /* 135 */
2874: 0xA78D59C9, /* 136 */
2875: 0xC4AD8D41, /* 137 */
2876: 0x2A362AD3, /* 138 */
2877: 0xD1179991, /* 139 */
2878: 0x601407FF, /* 140 */
2879: 0xDCF50917, /* 141 */
2880: 0x587069D0, /* 142 */
2881: 0xE0821ED6, /* 143 */
2882: 0xDBB59427, /* 144 */
2883: 0x73911A4B, /* 145 */
2884: 0x7C904FC3, /* 146 */
2885: 0x844AFB92, /* 147 */
2886: 0x6F8C955D, /* 148 */
2887: 0xE8C0C5BB, /* 149 */
2888: 0xB67AB987, /* 150 */
2889: 0xA529D96C, /* 151 */
2890: 0xF91F7181, /* 152 */
2891: 0x618B1B06, /* 153 */
2892: 0xE718BB0C, /* 154 */
2893: 0x8BD7615B, /* 155 */
2894: 0xD5A93A59, /* 156 */
2895: 0x54AEF81B, /* 157 */
2896: 0x772136E3, /* 158 */
2897: 0xCE44FD9C, /* 159 */
2898: 0x10CDA57E, /* 160 */
2899: 0x87D66E0B, /* 161 */
2900: 0x3D798967, /* 162 */
2901: 0x1B2C1804, /* 163 */
2902: 0x3EDFBD68, /* 164 */
2903: 0x15F6E62B, /* 165 */
2904: 0xEF68B854, /* 166 */
2905: 0x3896DB35, /* 167 */
2906: 0x12B7B5E2, /* 168 */
2907: 0xCB489029, /* 169 */
2908: 0x9E4F98A5, /* 170 */
2909: 0x62EB77A8, /* 171 */
2910: 0x217C24A2, /* 172 */
2911: 0x964152F6, /* 173 */
2912: 0x49B2080A, /* 174 */
2913: 0x53D23EE7, /* 175 */
2914: 0x48FB6D69, /* 176 */
2915: 0x1903D190, /* 177 */
2916: 0x9449E494, /* 178 */
2917: 0xBF6E7886, /* 179 */
2918: 0xFB356CFA, /* 180 */
2919: 0x3A261365, /* 181 */
2920: 0x424BC1EB, /* 182 */
2921: 0xA1192570, /* 183 */
2922: 0x19CA782, /* 184 */
2923: 0x9D3F7E0E, /* 185 */
2924: 0x9C127575, /* 186 */
2925: 0xEDF02039, /* 187 */
2926: 0xAD57BCCE, /* 188 */
2927: 0x5C153277, /* 189 */
2928: 0x81A84540, /* 190 */
2929: 0xBCAA7356, /* 191 */
2930: 0xCCD59B60, /* 192 */
2931: 0xA62A629B, /* 193 */
2932: 0xA25CCD10, /* 194 */
2933: 0x2B5B65CF, /* 195 */
2934: 0x1C535832, /* 196 */
2935: 0x55FD4E3A, /* 197 */
2936: 0x31D9790D, /* 198 */
2937: 0xF06BC37D, /* 199 */
2938: 0x4AFC1D71, /* 200 */
2939: 0xAEED5533, /* 201 */
2940: 0xBA461634, /* 202 */
2941: 0xBB694B78, /* 203 */
2942: 0x5F3A5C73, /* 204 */
2943: 0x6A3C764A, /* 205 */
2944: 0x8FB0CCA9, /* 206 */
2945: 0xF725684C, /* 207 */
2946: 0x4FE5382F, /* 208 */
2947: 0x1D0163AF, /* 209 */
2948: 0x5AA07A8F, /* 210 */
2949: 0xE205A8ED, /* 211 */
2950: 0xC30BAD38, /* 212 */
2951: 0xFF22CF1F, /* 213 */
2952: 0x72432E2E, /* 214 */
2953: 0x32C2518B, /* 215 */
2954: 0x3487CE4E, /* 216 */
2955: 0x7AE0AC02, /* 217 */
2956: 0x709FA098, /* 218 */
2957: 0xA3B395A, /* 219 */
2958: 0x5B4043F8, /* 220 */
2959: 0xA9E48C36, /* 221 */
2960: 0x149A8521, /* 222 */
2961: 0xD07DEE6B, /* 223 */
2962: 0x46ACD2F3, /* 224 */
2963: 0x8958DFFC, /* 225 */
2964: 0xB3A1223C, /* 226 */
2965: 0xB11D31C4, /* 227 */
2966: 0xCD7F4D3E, /* 228 */
2967: 0xF28E3AD, /* 229 */
2968: 0xE5B100BE, /* 230 */
2969: 0xAAC54824, /* 231 */
2970: 0xE9C9D7BA, /* 232 */
2971: 0x9BD47001, /* 233 */
2972: 0x80F149B0, /* 234 */
2973: 0x66022F0F, /* 235 */
2974: 0x20C4048, /* 236 */
2975: 0x6EFA192A, /* 237 */
2976: 0x67073F8D, /* 238 */
2977: 0x13EC7BF9, /* 239 */
2978: 0x3655011A, /* 240 */
2979: 0xE6AFE157, /* 241 */
2980: 0xD9845F6E, /* 242 */
2981: 0xDECC4425, /* 243 */
2982: 0x511AE2CC, /* 244 */
2983: 0xDF81B4D8, /* 245 */
2984: 0xD7809E55, /* 246 */
2985: 0xD6D883D9, /* 247 */
2986: 0x2CC7978C, /* 248 */
2987: 0x5E787CC5, /* 249 */
2988: 0xDD0033D1, /* 250 */
2989: 0xA050C937, /* 251 */
2990: 0x97F75DCD, /* 252 */
2991: 0x299DE580, /* 253 */
2992: 0x41E2B261, /* 254 */
2993: 0xEA5A54F1}, /* 255 */
2994:
2995: {
2996: /* Start of S Box 7 */
2997:
2998: 0x7E672590, /* 0 */
2999: 0xBEA513BB, /* 1 */
3000: 0x2C906FE6, /* 2 */
3001: 0x86029C2B, /* 3 */
3002: 0x55DC4F74, /* 4 */
3003: 0x553398E, /* 5 */
3004: 0x63E09647, /* 6 */
3005: 0xCAFD0BAB, /* 7 */
3006: 0x264C37DF, /* 8 */
3007: 0x8272210F, /* 9 */
3008: 0x67AFA669, /* 10 */
3009: 0x12D98A5F, /* 11 */
3010: 0x8CAB23C4, /* 12 */
3011: 0x75C68BD1, /* 13 */
3012: 0xC3370470, /* 14 */
3013: 0x33F37F4E, /* 15 */
3014: 0x283992FF, /* 16 */
3015: 0xE73A3A67, /* 17 */
3016: 0x1032F283, /* 18 */
3017: 0xF5AD9FC2, /* 19 */
3018: 0x963F0C5D, /* 20 */
3019: 0x664FBC45, /* 21 */
3020: 0x202BA41C, /* 22 */
3021: 0xC7C02D80, /* 23 */
3022: 0x54731E84, /* 24 */
3023: 0x8A1085F5, /* 25 */
3024: 0x601D80FB, /* 26 */
3025: 0x2F968E55, /* 27 */
3026: 0x35E96812, /* 28 */
3027: 0xE45A8F78, /* 29 */
3028: 0xBD7DE662, /* 30 */
3029: 0x3B6E6EAD, /* 31 */
3030: 0x8097C5EF, /* 32 */
3031: 0x70B6781, /* 33 */
3032: 0xB1E508F3, /* 34 */
3033: 0x24E4FAE3, /* 35 */
3034: 0xB81A7805, /* 36 */
3035: 0xEC0FC918, /* 37 */
3036: 0x43C8774B, /* 38 */
3037: 0x9B2512A9, /* 39 */
3038: 0x2B05AD04, /* 40 */
3039: 0x32C2536F, /* 41 */
3040: 0xEDF236E0, /* 42 */
3041: 0x8BC4B0CF, /* 43 */
3042: 0xBACEB837, /* 44 */
3043: 0x4535B289, /* 45 */
3044: 0xD0E94C3, /* 46 */
3045: 0xA5A371D0, /* 47 */
3046: 0xAD695A58, /* 48 */
3047: 0x39E3437D, /* 49 */
3048: 0x9186BFFC, /* 50 */
3049: 0x21038C3B, /* 51 */
3050: 0xAA9DFF9, /* 52 */
3051: 0x5D1F06CE, /* 53 */
3052: 0x62DEF8A4, /* 54 */
3053: 0xF740A2B4, /* 55 */
3054: 0xA2575868, /* 56 */
3055: 0x682683C1, /* 57 */
3056: 0xDBB30FAC, /* 58 */
3057: 0x61FE1928, /* 59 */
3058: 0x468A6511, /* 60 */
3059: 0xC61CD5F4, /* 61 */
3060: 0xE54D9800, /* 62 */
3061: 0x6B98D7F7, /* 63 */
3062: 0x8418B6A5, /* 64 */
3063: 0x5F09A5D2, /* 65 */
3064: 0x90B4E80B, /* 66 */
3065: 0x49B2C852, /* 67 */
3066: 0x69F11C77, /* 68 */
3067: 0x17412B7E, /* 69 */
3068: 0x7F6FC0ED, /* 70 */
3069: 0x56838DCC, /* 71 */
3070: 0x6E9546A2, /* 72 */
3071: 0xD0758619, /* 73 */
3072: 0x87B9B9A, /* 74 */
3073: 0xD231A01D, /* 75 */
3074: 0xAF46D415, /* 76 */
3075: 0x97060FD, /* 77 */
3076: 0xD920F657, /* 78 */
3077: 0x882D3F9F, /* 79 */
3078: 0x3AE7C3C9, /* 80 */
3079: 0xE8A00D9B, /* 81 */
3080: 0x4FE67EBE, /* 82 */
3081: 0x2EF80EB2, /* 83 */
3082: 0xC1916B0C, /* 84 */
3083: 0xF4DFFEA0, /* 85 */
3084: 0xB97EB3EB, /* 86 */
3085: 0xFDFF84DD, /* 87 */
3086: 0xFF8B14F1, /* 88 */
3087: 0xE96B0572, /* 89 */
3088: 0xF64B508C, /* 90 */
3089: 0xAE220A6E, /* 91 */
3090: 0x4423AE5A, /* 92 */
3091: 0xC2BECE5E, /* 93 */
3092: 0xDE27567C, /* 94 */
3093: 0xFC935C63, /* 95 */
3094: 0x47075573, /* 96 */
3095: 0xE65B27F0, /* 97 */
3096: 0xE121FD22, /* 98 */
3097: 0xF2668753, /* 99 */
3098: 0x2DEBF5D7, /* 100 */
3099: 0x8347E08D, /* 101 */
3100: 0xAC5EDA03, /* 102 */
3101: 0x2A7CEBE9, /* 103 */
3102: 0x3FE8D92E, /* 104 */
3103: 0x23542FE4, /* 105 */
3104: 0x1FA7BD50, /* 106 */
3105: 0xCF9B4102, /* 107 */
3106: 0x9D0DBA39, /* 108 */
3107: 0x9CB8902A, /* 109 */
3108: 0xA7249D8B, /* 110 */
3109: 0xF6D667A, /* 111 */
3110: 0x5EBFA9EC, /* 112 */
3111: 0x6A594DF2, /* 113 */
3112: 0x79600938, /* 114 */
3113: 0x23B7591, /* 115 */
3114: 0xEA2C79C8, /* 116 */
3115: 0xC99D07EA, /* 117 */
3116: 0x64CB5EE1, /* 118 */
3117: 0x1A9CAB3D, /* 119 */
3118: 0x76DB9527, /* 120 */
3119: 0xC08E012F, /* 121 */
3120: 0x3DFB481A, /* 122 */
3121: 0x872F22E7, /* 123 */
3122: 0x2948D15C, /* 124 */
3123: 0xA4782C79, /* 125 */
3124: 0x6F50D232, /* 126 */
3125: 0x78F0728A, /* 127 */
3126: 0x5A87AAB1, /* 128 */
3127: 0xC4E2C19C, /* 129 */
3128: 0xEE767387, /* 130 */
3129: 0x1B2A1864, /* 131 */
3130: 0x7B8D10D3, /* 132 */
3131: 0xD1713161, /* 133 */
3132: 0xEEAC456, /* 134 */
3133: 0xD8799E06, /* 135 */
3134: 0xB645B548, /* 136 */
3135: 0x4043CB65, /* 137 */
3136: 0xA874FB29, /* 138 */
3137: 0x4B12D030, /* 139 */
3138: 0x7D687413, /* 140 */
3139: 0x18EF9A1F, /* 141 */
3140: 0xD7631D4C, /* 142 */
3141: 0x5829C7DA, /* 143 */
3142: 0xCDFA30FA, /* 144 */
3143: 0xC5084BB0, /* 145 */
3144: 0x92CD20E2, /* 146 */
3145: 0xD4C16940, /* 147 */
3146: 0x3283EC0, /* 148 */
3147: 0xA917813F, /* 149 */
3148: 0x9A587D01, /* 150 */
3149: 0x70041F8F, /* 151 */
3150: 0xDC6AB1DC, /* 152 */
3151: 0xDDAEE3D5, /* 153 */
3152: 0x31829742, /* 154 */
3153: 0x198C022D, /* 155 */
3154: 0x1C9EAFCB, /* 156 */
3155: 0x5BBC6C49, /* 157 */
3156: 0xD3D3293A, /* 158 */
3157: 0x16D50007, /* 159 */
3158: 0x4BB8820, /* 160 */
3159: 0x3C5C2A41, /* 161 */
3160: 0x37EE7AF8, /* 162 */
3161: 0x8EB04025, /* 163 */
3162: 0x9313ECBA, /* 164 */
3163: 0xBFFC4799, /* 165 */
3164: 0x8955A744, /* 166 */
3165: 0xEF85D633, /* 167 */
3166: 0x504499A7, /* 168 */
3167: 0xA6CA6A86, /* 169 */
3168: 0xBB3D3297, /* 170 */
3169: 0xB34A8236, /* 171 */
3170: 0x6DCCBE4F, /* 172 */
3171: 0x6143394, /* 173 */
3172: 0xCE19FC7B, /* 174 */
3173: 0xCCC3C6C6, /* 175 */
3174: 0xE36254AE, /* 176 */
3175: 0x77B7EDA1, /* 177 */
3176: 0xA133DD9E, /* 178 */
3177: 0xEBF9356A, /* 179 */
3178: 0x513CCF88, /* 180 */
3179: 0xE2A1B417, /* 181 */
3180: 0x972EE5BD, /* 182 */
3181: 0x853824CD, /* 183 */
3182: 0x5752F4EE, /* 184 */
3183: 0x6C1142E8, /* 185 */
3184: 0x3EA4F309, /* 186 */
3185: 0xB2B5934A, /* 187 */
3186: 0xDFD628AA, /* 188 */
3187: 0x59ACEA3E, /* 189 */
3188: 0xA01EB92C, /* 190 */
3189: 0x389964BC, /* 191 */
3190: 0xDA305DD4, /* 192 */
3191: 0x19A59B7, /* 193 */
3192: 0x11D2CA93, /* 194 */
3193: 0xFAA6D3B9, /* 195 */
3194: 0x4E772ECA, /* 196 */
3195: 0x72651776, /* 197 */
3196: 0xFB4E5B0E, /* 198 */
3197: 0xA38F91A8, /* 199 */
3198: 0x1D0663B5, /* 200 */
3199: 0x30F4F192, /* 201 */
3200: 0xB50051B6, /* 202 */
3201: 0xB716CCB3, /* 203 */
3202: 0x4ABD1B59, /* 204 */
3203: 0x146C5F26, /* 205 */
3204: 0xF134E2DE, /* 206 */
3205: 0xF67C6C, /* 207 */
3206: 0xB0E1B795, /* 208 */
3207: 0x98AA4EC7, /* 209 */
3208: 0xCC73B34, /* 210 */
3209: 0x654276A3, /* 211 */
3210: 0x8D1BA871, /* 212 */
3211: 0x740A5216, /* 213 */
3212: 0xE0D01A23, /* 214 */
3213: 0x9ED161D6, /* 215 */
3214: 0x9F36A324, /* 216 */
3215: 0x993EBB7F, /* 217 */
3216: 0xFEB9491B, /* 218 */
3217: 0x365DDCDB, /* 219 */
3218: 0x810CFFC5, /* 220 */
3219: 0x71EC0382, /* 221 */
3220: 0x2249E7BF, /* 222 */
3221: 0x48817046, /* 223 */
3222: 0xF3A24A5B, /* 224 */
3223: 0x4288E4D9, /* 225 */
3224: 0xBF5C243, /* 226 */
3225: 0x257FE151, /* 227 */
3226: 0x95B64C0D, /* 228 */
3227: 0x4164F066, /* 229 */
3228: 0xAAF7DB08, /* 230 */
3229: 0x73B1119D, /* 231 */
3230: 0x8F9F7BB8, /* 232 */
3231: 0xD6844596, /* 233 */
3232: 0xF07A34A6, /* 234 */
3233: 0x53943D0A, /* 235 */
3234: 0xF9DD166D, /* 236 */
3235: 0x7A8957AF, /* 237 */
3236: 0xF8BA3CE5, /* 238 */
3237: 0x27C9621E, /* 239 */
3238: 0x5CDAE910, /* 240 */
3239: 0xC8518998, /* 241 */
3240: 0x941538FE, /* 242 */
3241: 0x136115D8, /* 243 */
3242: 0xABA8443C, /* 244 */
3243: 0x4D01F931, /* 245 */
3244: 0x34EDF760, /* 246 */
3245: 0xB45F266B, /* 247 */
3246: 0xD5D4DE14, /* 248 */
3247: 0x52D8AC35, /* 249 */
3248: 0x15CFD885, /* 250 */
3249: 0xCBC5CD21, /* 251 */
3250: 0x4CD76D4D, /* 252 */
3251: 0x7C80EF54, /* 253 */
3252: 0xBC92EE75, /* 254 */
3253: 0x1E56A1F6}/* 255 */
3254:
3255:
3256: };
3257:
3258:
3259:
3260:
3261: *-*-END-*-*
3262: sed 's/^ //' >testSBoxes.c <<\*-*-END-*-*
3263: /* This program generates and tests the standard S-boxes used by Snefru,
3264: the one way hash function. It uses the RAND table of random numbers.
3265:
3266:
3267: This is version 2.0, July 31, 1989.
3268:
3269:
3270:
3271: Copyright (c) Xerox Corporation 1989
3272: All rights reserved.
3273:
3274: License to copy and use this software is granted.
3275:
3276: License is also granted to make and use derivative works.
3277:
3278: Xerox Corporation makes no representations concerning either the
3279: merchantability of this software or the suitability of this software for any
3280: particular purpose. It is provided "as is" without express or implied
3281: warranty of any kind.
3282:
3283: These notices must be retained in any copies of any part of this software.
3284:
3285:
3286:
3287:
3288: #define inputFile 0 /* normally standard in */
3289: #define outputFile 1 /* normally standard out */
3290: #define errorFile 2 /* normally standard error */
3291:
3292:
3293: #define SBoxCount 8 /* number of S boxes in the set of standard S
3294: boxes */
3295:
3296:
3297:
3298:
3299: /* The random table is the first part of the random digits from the book:
3300: 'A Million Random Digits with 100,000 Normal Deviates", by the RAND
3301: Corporation, published by the Free Press, 1955. The formatting is similar
3302: to the book to allow easy inspection and verification. The random digits
3303: are also available on magnetic tape or diskettes from the RAND
3304: corporation.
3305:
3306: Send inquiries to: The RAND Corporation, Computer Information Systems, 1700
3307: Main St., Santa Monica California 90406; ATTN: Jackie McGee
3308:
3309: */
3310:
3311:
3312: /* The following two global variables are used only by 'randomDigit' */
3313:
3314: /* group location in the table of random digits */
3315: int locationInRANDtable = 0;
3316: /* location within a 5-digit group */
3317: int locationIn5DigitGroup = 0;
3318:
3319:
3320: #define sizeOfRANDtableIn5DigitGroups 4810
3321: char RANDtable[sizeOfRANDtableIn5DigitGroups][5] = {
3322: /* 0 */ "10097", "32533", "76520", "13586", "34673",
3323: "54876", "80959", "09117", "39292", "74945",
3324: /* 1 */ "37542", "04805", "64894", "74296", "24805",
3325: "24037", "20636", "10402", "00822", "91665",
3326: /* 2 */ "08422", "68953", "19645", "09303", "23209",
3327: "02560", "15953", "34764", "35080", "33606",
3328: /* 3 */ "99019", "02529", "09376", "70715", "38311",
3329: "31165", "88676", "74397", "04436", "27659",
3330: /* 4 */ "12807", "99970", "80157", "36147", "64032",
3331: "36653", "98951", "16877", "12171", "76833",
3332: /* 5 */ "66065", "74717", "34072", "76850", "36697",
3333: "36170", "65813", "39885", "11199", "29170",
3334: /* 6 */ "31060", "10805", "45571", "82406", "35303",
3335: "42614", "86799", "07439", "23403", "09732",
3336: /* 7 */ "85269", "77602", "02051", "65692", "68665",
3337: "74818", "73053", "85247", "18623", "88579",
3338: /* 8 */ "63573", "32135", "05325", "47048", "90553",
3339: "57548", "28468", "28709", "83491", "25624",
3340: /* 9 */ "73796", "45753", "03529", "64778", "35808",
3341: "34282", "60935", "20344", "35273", "88435",
3342: /* 10 */ "98520", "17767", "14905", "68607", "22109",
3343: "40558", "60970", "93433", "50500", "73998",
3344: /* 11 */ "11805", "05431", "39808", "27732", "50725",
3345: "68248", "29405", "24201", "52775", "67851",
3346: /* 12 */ "83452", "99634", "06288", "98083", "13746",
3347: "70078", "18475", "40610", "68711", "77817",
3348: /* 13 */ "88685", "40200", "86507", "58401", "36766",
3349: "67951", "90364", "76493", "29609", "11062",
3350: /* 14 */ "99594", "67348", "87517", "64969", "91826",
3351: "08928", "93785", "61368", "23478", "34113",
3352: /* 15 */ "65481", "17674", "17468", "50950", "58047",
3353: "76974", "73039", "57186", "40218", "16544",
3354: /* 16 */ "80124", "35635", "17727", "08015", "45318",
3355: "22374", "21115", "78253", "14385", "53763",
3356: /* 17 */ "74350", "99817", "77402", "77214", "43236",
3357: "00210", "45521", "64237", "96286", "02655",
3358: /* 18 */ "69916", "26803", "66252", "29148", "36936",
3359: "87203", "76621", "13990", "94400", "56418",
3360: /* 19 */ "09893", "20505", "14225", "68514", "46427",
3361: "56788", "96297", "78822", "54382", "14598",
3362: /* 20 */ "91499", "14523", "68479", "27686", "46162",
3363: "83554", "94750", "89923", "37089", "20048",
3364: /* 21 */ "80336", "94598", "26940", "36858", "70297",
3365: "34135", "53140", "33340", "42050", "82341",
3366: /* 22 */ "44104", "81949", "85157", "47954", "32979",
3367: "26575", "57600", "40881", "22222", "06413",
3368: /* 23 */ "12550", "73742", "11100", "02040", "12860",
3369: "74697", "96644", "89439", "28707", "25815",
3370: /* 24 */ "63606", "49329", "16505", "34484", "40219",
3371: "52563", "43651", "77082", "07207", "31790",
3372: /* 25 */ "61196", "90446", "26457", "47774", "51924",
3373: "33729", "65394", "59593", "42582", "60527",
3374: /* 26 */ "15474", "45266", "95270", "79953", "59367",
3375: "83848", "82396", "10118", "33211", "59466",
3376: /* 27 */ "94557", "28573", "67897", "54387", "54622",
3377: "44431", "91190", "42592", "92927", "45973",
3378: /* 28 */ "42481", "16213", "97344", "08721", "16868",
3379: "48767", "03071", "12059", "25701", "46670",
3380: /* 29 */ "23523", "78317", "73208", "89837", "68935",
3381: "91416", "26252", "29663", "05522", "82562",
3382: /* 30 */ "04493", "52494", "75246", "33824", "45862",
3383: "51025", "61962", "79335", "65337", "12472",
3384: /* 31 */ "00549", "97654", "64051", "88159", "96119",
3385: "63896", "54692", "82391", "23287", "29529",
3386: /* 32 */ "35963", "15307", "26898", "09354", "33351",
3387: "35462", "77974", "50024", "90103", "39333",
3388: /* 33 */ "59808", "08391", "45427", "26842", "83609",
3389: "49700", "13021", "24892", "78565", "20106",
3390: /* 34 */ "46058", "85236", "01390", "92286", "77281",
3391: "44077", "93910", "83647", "70617", "42941",
3392: /* 35 */ "32179", "00597", "87379", "25241", "05567",
3393: "07007", "86743", "17157", "85394", "11838",
3394: /* 36 */ "69234", "61406", "20117", "45204", "15956",
3395: "60000", "18743", "92423", "97118", "96338",
3396: /* 37 */ "19565", "41430", "01758", "75379", "40419",
3397: "21585", "66674", "36806", "84962", "85207",
3398: /* 38 */ "45155", "14938", "19476", "07246", "43667",
3399: "94543", "59047", "90033", "20826", "69541",
3400: /* 39 */ "94864", "31994", "36168", "10851", "34888",
3401: "81553", "01540", "35456", "05014", "51176",
3402: /* 40 */ "98086", "24826", "45240", "28404", "44999",
3403: "08896", "39094", "73407", "35441", "31880",
3404: /* 41 */ "33185", "16232", "41941", "50949", "89435",
3405: "48581", "88695", "41994", "37548", "73043",
3406: /* 42 */ "80951", "00406", "96382", "70774", "20151",
3407: "23387", "25016", "25298", "94624", "61171",
3408: /* 43 */ "79752", "49140", "71961", "28296", "69861",
3409: "02591", "74852", "20539", "00387", "59579",
3410: /* 44 */ "18633", "32537", "98145", "06571", "31010",
3411: "24674", "05455", "61427", "77938", "91936",
3412: /* 45 */ "74029", "43902", "77557", "32270", "97790",
3413: "17119", "52527", "58021", "80814", "51748",
3414: /* 46 */ "54178", "45611", "80993", "37143", "05335",
3415: "12969", "56127", "19255", "36040", "90324",
3416: /* 47 */ "11664", "49883", "52079", "84827", "59381",
3417: "71539", "09973", "33440", "88461", "23356",
3418: /* 48 */ "48324", "77928", "31249", "64710", "02295",
3419: "36870", "32307", "57546", "15020", "09994",
3420: /* 49 */ "69074", "94138", "87637", "91976", "35584",
3421: "04401", "10518", "21615", "01848", "76938",
3422: /* 50 */ "09188", "20097", "32825", "39527", "04220",
3423: "86304", "83389", "87374", "64278", "58044",
3424: /* 51 */ "90045", "85497", "51981", "50654", "94938",
3425: "81997", "91870", "76150", "68476", "64659",
3426: /* 52 */ "73189", "50207", "47677", "26269", "62290",
3427: "64464", "27124", "67018", "41361", "82760",
3428: /* 53 */ "75768", "76490", "20971", "87749", "90429",
3429: "12272", "95375", "05871", "93823", "43178",
3430: /* 54 */ "54016", "44056", "66281", "31003", "00682",
3431: "27398", "20714", "53295", "07706", "17813",
3432: /* 55 */ "08358", "69910", "78542", "42785", "13661",
3433: "58873", "04618", "97553", "31223", "08420",
3434: /* 56 */ "28306", "03264", "81333", "10591", "40510",
3435: "07893", "32604", "60475", "94119", "01840",
3436: /* 57 */ "53840", "86233", "81594", "13628", "51215",
3437: "90290", "28466", "68795", "77762", "20791",
3438: /* 58 */ "91757", "53741", "61613", "62269", "50263",
3439: "90212", "55781", "76514", "83483", "47055",
3440: /* 59 */ "89415", "92694", "00397", "58391", "12607",
3441: "17646", "48949", "72306", "94541", "37408",
3442: /* 60 */ "77513", "03820", "86864", "29901", "68414",
3443: "82774", "51908", "13980", "72893", "55507",
3444: /* 61 */ "19502", "37174", "69979", "20288", "55210",
3445: "29773", "74287", "75251", "65344", "67415",
3446: /* 62 */ "21818", "59313", "93278", "81757", "05686",
3447: "73156", "07082", "85046", "31853", "38452",
3448: /* 63 */ "51474", "66499", "68107", "23621", "94049",
3449: "91345", "42836", "09191", "08007", "45449",
3450: /* 64 */ "99559", "68331", "62535", "24170", "69777",
3451: "12830", "74819", "78142", "43860", "72834",
3452: /* 65 */ "33713", "48007", "93584", "72869", "51926",
3453: "64721", "58303", "29822", "93174", "93972",
3454: /* 66 */ "85274", "86893", "11303", "22970", "28834",
3455: "34137", "73515", "90400", "71148", "43643",
3456: /* 67 */ "84133", "89640", "44035", "52166", "73852",
3457: "70091", "61222", "60561", "62327", "18423",
3458: /* 68 */ "56732", "16234", "17395", "96131", "10123",
3459: "91622", "85496", "57560", "81604", "18880",
3460: /* 69 */ "65138", "56806", "87648", "85261", "34313",
3461: "65861", "45875", "21069", "85644", "47277",
3462: /* 70 */ "38001", "02176", "81719", "11711", "71602",
3463: "92937", "74219", "64049", "65584", "49698",
3464: /* 71 */ "37402", "96397", "01304", "77586", "56271",
3465: "10086", "47324", "62605", "40030", "37438",
3466: /* 72 */ "97125", "40348", "87083", "31417", "21815",
3467: "39250", "75237", "62047", "15501", "29578",
3468: /* 73 */ "21826", "41134", "47143", "34072", "64638",
3469: "85902", "49139", "06441", "03856", "54552",
3470: /* 74 */ "73135", "42742", "95719", "09035", "85794",
3471: "74296", "08789", "88156", "64691", "19202",
3472: /* 75 */ "07638", "77929", "03061", "18072", "96207",
3473: "44156", "23821", "99538", "04713", "66994",
3474: /* 76 */ "60528", "83441", "07954", "19814", "59175",
3475: "20695", "05533", "52139", "61212", "06455",
3476: /* 77 */ "83596", "35655", "06958", "92983", "05128",
3477: "09719", "77433", "53783", "92301", "50498",
3478: /* 78 */ "10850", "62746", "99599", "10507", "13499",
3479: "06319", "53075", "71839", "06410", "19362",
3480: /* 79 */ "39820", "98952", "43622", "63147", "64421",
3481: "80814", "43800", "09351", "31024", "73167",
3482: /* 80 */ "59580", "06478", "75569", "78800", "88835",
3483: "54486", "23768", "06156", "04111", "08408",
3484: /* 81 */ "38508", "07341", "23793", "48763", "90822",
3485: "97022", "17719", "04207", "95954", "49953",
3486: /* 82 */ "30692", "70668", "94688", "16127", "56196",
3487: "80091", "82067", "63400", "05462", "69200",
3488: /* 83 */ "65443", "95659", "18288", "27437", "49632",
3489: "24041", "08337", "65676", "96299", "90836",
3490: /* 84 */ "27267", "50264", "13192", "72294", "07477",
3491: "44606", "17985", "48911", "97341", "30358",
3492: /* 85 */ "91307", "06991", "19072", "24210", "36699",
3493: "53728", "28825", "35793", "28976", "66252",
3494: /* 86 */ "68434", "94688", "84473", "13622", "62126",
3495: "98408", "12843", "82590", "09815", "93146",
3496: /* 87 */ "48908", "15877", "54745", "24591", "35700",
3497: "04754", "83824", "52692", "54130", "55160",
3498: /* 88 */ "06913", "45197", "42672", "78601", "11883",
3499: "09528", "63011", "98901", "14974", "40344",
3500: /* 89 */ "10455", "16019", "14210", "33712", "91342",
3501: "37821", "88325", "80851", "43667", "70883",
3502: /* 90 */ "12883", "97343", "65027", "61184", "04285",
3503: "01392", "17974", "15077", "90712", "26769",
3504: /* 91 */ "21778", "30976", "38807", "36961", "31649",
3505: "42096", "63281", "02023", "08816", "47449",
3506: /* 92 */ "19523", "59515", "65122", "59659", "86283",
3507: "68258", "69572", "13798", "16435", "91529",
3508: /* 93 */ "67245", "52670", "35583", "16563", "79246",
3509: "86686", "76463", "34222", "26655", "90802",
3510: /* 94 */ "60584", "47377", "07500", "37992", "45134",
3511: "26529", "26760", "83637", "41326", "44344",
3512: /* 95 */ "53853", "41377", "36066", "94850", "58838",
3513: "73859", "49364", "73331", "96240", "43642",
3514: /* 96 */ "24637", "38736", "74384", "89342", "52623",
3515: "07992", "12369", "18601", "03742", "83873",
3516: /* 97 */ "83080", "12451", "38992", "22815", "07759",
3517: "51777", "97377", "27585", "51972", "37867",
3518: /* 98 */ "16444", "24334", "36151", "99073", "27493",
3519: "70939", "85130", "32552", "54846", "54759",
3520: /* 99 */ "60790", "18157", "57178", "65762", "11161",
3521: "78576", "45819", "52979", "65130", "04860",
3522: /* 100 */ "03991", "10461", "93716", "16894", "66083",
3523: "24653", "84609", "58232", "88618", "19161",
3524: /* 101 */ "38555", "95554", "32886", "59780", "08355",
3525: "60860", "29735", "47762", "71299", "23853",
3526: /* 102 */ "17546", "73704", "92052", "46215", "55121",
3527: "29281", "59076", "07936", "27954", "58909",
3528: /* 103 */ "32643", "52861", "95819", "06831", "00911",
3529: "98936", "76355", "93779", "80863", "00514",
3530: /* 104 */ "69572", "68777", "39510", "35905", "14060",
3531: "40619", "29549", "69616", "33564", "60780",
3532: /* 105 */ "24122", "66591", "27699", "06494", "14845",
3533: "46672", "61958", "77100", "90899", "75754",
3534: /* 106 */ "61196", "30231", "92962", "61773", "41839",
3535: "55382", "17267", "70943", "78038", "70267",
3536: /* 107 */ "30532", "21704", "10274", "12202", "39685",
3537: "23309", "10061", "68829", "55986", "66485",
3538: /* 108 */ "03788", "97599", "75867", "20717", "74416",
3539: "53166", "35208", "33374", "87539", "08823",
3540: /* 109 */ "48228", "63379", "85783", "47619", "53152",
3541: "67433", "35663", "52972", "16818", "60311",
3542: /* 110 */ "60365", "94653", "35075", "33949", "42614",
3543: "29297", "01918", "28316", "98953", "73231",
3544: /* 111 */ "83799", "42402", "56623", "34442", "34994",
3545: "41374", "70071", "14736", "09958", "18065",
3546: /* 112 */ "32960", "07405", "36409", "83232", "99385",
3547: "41600", "11133", "07586", "15917", "06253",
3548: /* 113 */ "19322", "53845", "57620", "52606", "66497",
3549: "68646", "78138", "66559", "19640", "99413",
3550: /* 114 */ "11220", "94747", "07399", "37408", "48509",
3551: "23929", "27482", "45476", "85244", "35159",
3552: /* 115 */ "31751", "57260", "68980", "05339", "15470",
3553: "48355", "88651", "22596", "03152", "19121",
3554: /* 116 */ "88492", "99382", "14454", "04504", "20094",
3555: "98977", "74843", "93413", "22109", "78508",
3556: /* 117 */ "30934", "47744", "07481", "83828", "73788",
3557: "06533", "28597", "20405", "94205", "20380",
3558: /* 118 */ "22888", "48893", "27499", "98748", "60530",
3559: "45128", "74022", "84617", "82037", "10268",
3560: /* 119 */ "78212", "16993", "35902", "91386", "44372",
3561: "15486", "65741", "14014", "87481", "37220",
3562: /* 120 */ "41849", "84547", "46850", "52326", "34677",
3563: "58300", "74910", "64345", "19325", "81549",
3564: /* 121 */ "46352", "33049", "69248", "93460", "45305",
3565: "07521", "61318", "31855", "14413", "70951",
3566: /* 122 */ "11087", "96294", "14013", "31792", "59747",
3567: "67277", "76503", "34513", "39663", "77544",
3568: /* 123 */ "52701", "08337", "56303", "87315", "16520",
3569: "69676", "11654", "99893", "02181", "68161",
3570: /* 124 */ "57275", "36898", "81304", "48585", "68652",
3571: "27376", "92852", "55866", "88448", "03584",
3572: /* 125 */ "20857", "73156", "70284", "24326", "79375",
3573: "95220", "01159", "63267", "10622", "48391",
3574: /* 126 */ "15633", "84924", "90415", "93614", "33521",
3575: "26665", "55823", "47641", "86225", "31704",
3576: /* 127 */ "92694", "48297", "39904", "02115", "59589",
3577: "49067", "66821", "41575", "49767", "04037",
3578: /* 128 */ "77613", "19019", "88152", "00080", "20554",
3579: "91409", "96277", "48257", "50816", "97616",
3580: /* 129 */ "38688", "32486", "45134", "63545", "59404",
3581: "72059", "43947", "51680", "43852", "59693",
3582: /* 130 */ "25163", "01889", "70014", "15021", "41290",
3583: "67312", "71857", "15957", "68971", "11403",
3584: /* 131 */ "65251", "07629", "37239", "33295", "05870",
3585: "01119", "92784", "26340", "18477", "65622",
3586: /* 132 */ "36815", "43625", "18637", "37509", "82444",
3587: "99005", "04921", "73701", "14707", "93997",
3588: /* 133 */ "64397", "11692", "05327", "82162", "20247",
3589: "81759", "45197", "25332", "83745", "22567",
3590: /* 134 */ "04515", "25624", "95096", "67946", "48460",
3591: "85558", "15191", "18782", "16930", "33361",
3592: /* 135 */ "83761", "60873", "43253", "84145", "60833",
3593: "25983", "01291", "41349", "20368", "07126",
3594: /* 136 */ "14387", "06345", "80854", "09279", "43529",
3595: "06318", "38384", "74761", "41196", "37480",
3596: /* 137 */ "51321", "92246", "80088", "77074", "88722",
3597: "56736", "66164", "49431", "66919", "31678",
3598: /* 138 */ "72472", "00008", "80890", "18002", "94813",
3599: "31900", "54155", "83436", "35352", "54131",
3600: /* 139 */ "05466", "55306", "93128", "18464", "74457",
3601: "90561", "72848", "11834", "79982", "68416",
3602: /* 140 */ "39528", "72484", "82474", "25593", "48545",
3603: "35247", "18619", "13674", "18611", "19241",
3604: /* 141 */ "81616", "18711", "53342", "44276", "75122",
3605: "11724", "74627", "73707", "58319", "15997",
3606: /* 142 */ "07586", "16120", "82641", "22820", "92904",
3607: "13141", "32392", "19763", "61199", "67940",
3608: /* 143 */ "90767", "04235", "13574", "17200", "69902",
3609: "63742", "78464", "22501", "18627", "90872",
3610: /* 144 */ "40188", "28193", "29593", "88627", "94972",
3611: "11598", "62095", "36787", "00441", "58997",
3612: /* 145 */ "34414", "82157", "86887", "55087", "19152",
3613: "00023", "12302", "80783", "32624", "68691",
3614: /* 146 */ "63439", "75363", "44989", "16822", "36024",
3615: "00867", "76378", "41605", "65961", "73488",
3616: /* 147 */ "67049", "09070", "93399", "45547", "94458",
3617: "74284", "05041", "49807", "20288", "34060",
3618: /* 148 */ "79495", "04146", "52162", "90286", "54158",
3619: "34243", "46978", "35482", "59362", "95938",
3620: /* 149 */ "91704", "30552", "04737", "21031", "75051",
3621: "93029", "47665", "64382", "99782", "93478",
3622: /* 150 */ "94015", "46874", "32444", "48277", "59820",
3623: "96163", "64654", "25843", "41145", "42820",
3624: /* 151 */ "74108", "88222", "88570", "74015", "25704",
3625: "91035", "01755", "14750", "48968", "38603",
3626: /* 152 */ "62880", "87873", "95160", "59221", "22304",
3627: "90314", "72877", "17334", "39283", "04149",
3628: /* 153 */ "11748", "12102", "80580", "41867", "17710",
3629: "59621", "06554", "07850", "73950", "79552",
3630: /* 154 */ "17944", "05600", "60478", "03343", "25852",
3631: "58905", "57216", "39618", "49856", "99326",
3632: /* 155 */ "66067", "42792", "95043", "52680", "46780",
3633: "56487", "09971", "59481", "37006", "22186",
3634: /* 156 */ "54244", "91030", "45547", "70818", "59849",
3635: "96169", "61459", "21647", "87417", "17198",
3636: /* 157 */ "30945", "57589", "31732", "57260", "47670",
3637: "07654", "46376", "25366", "94746", "49580",
3638: /* 158 */ "69170", "37403", "86995", "90307", "94304",
3639: "71803", "26825", "05511", "12459", "91314",
3640: /* 159 */ "08345", "88975", "35841", "85771", "08105",
3641: "59987", "87112", "21476", "14713", "71181",
3642: /* 160 */ "27767", "43584", "85301", "88977", "29490",
3643: "69714", "73035", "41207", "74699", "09310",
3644: /* 161 */ "13025", "14338", "54066", "15243", "47724",
3645: "66733", "47431", "43905", "31048", "56699",
3646: /* 162 */ "80217", "36292", "98525", "24335", "24432",
3647: "24896", "43277", "58874", "11466", "16082",
3648: /* 163 */ "10875", "62004", "90391", "61105", "57411",
3649: "06368", "53856", "30743", "08670", "84741",
3650: /* 164 */ "54127", "57326", "26629", "19087", "24472",
3651: "88779", "30540", "27886", "61732", "75454",
3652: /* 165 */ "60311", "42824", "37301", "42678", "45990",
3653: "43242", "17374", "52003", "70707", "70214",
3654: /* 166 */ "49739", "71484", "92003", "98086", "76668",
3655: "73209", "59202", "11973", "02902", "33250",
3656: /* 167 */ "78626", "51594", "16453", "94614", "39014",
3657: "97066", "83012", "09832", "25571", "77628",
3658: /* 168 */ "66692", "13986", "99837", "00582", "81232",
3659: "44987", "09504", "96412", "90193", "79568",
3660: /* 169 */ "44071", "28091", "07362", "97703", "76447",
3661: "42537", "98524", "97831", "65704", "09514",
3662: /* 170 */ "41468", "85149", "49554", "17994", "14924",
3663: "39650", "95294", "00556", "70481", "06905",
3664: /* 171 */ "94559", "37559", "49678", "53119", "70312",
3665: "05682", "66986", "34099", "74474", "20740",
3666: /* 172 */ "41615", "70360", "64114", "58660", "90850",
3667: "64618", "80620", "51790", "11436", "38072",
3668: /* 173 */ "50273", "93113", "41794", "86861", "24781",
3669: "89683", "55411", "85667", "77535", "99892",
3670: /* 174 */ "41396", "80504", "90670", "08289", "40902",
3671: "05069", "95083", "06783", "28102", "57816",
3672: /* 175 */ "25807", "24260", "71529", "78920", "72682",
3673: "07385", "90726", "57166", "98884", "08583",
3674: /* 176 */ "06170", "97965", "88302", "98041", "21443",
3675: "41808", "68984", "83620", "89747", "98882",
3676: /* 177 */ "60808", "54444", "74412", "81105", "01176",
3677: "28838", "36421", "16489", "18059", "51061",
3678: /* 178 */ "80940", "44893", "10408", "36222", "80582",
3679: "71944", "92638", "40333", "67054", "16067",
3680: /* 179 */ "19516", "90120", "46759", "71643", "13177",
3681: "55292", "21036", "82808", "77501", "97427",
3682: /* 180 */ "49386", "54480", "23604", "23554", "21785",
3683: "41101", "91178", "10174", "29420", "90438",
3684: /* 181 */ "06312", "88940", "15995", "69321", "47458",
3685: "64809", "98189", "81851", "29651", "84215",
3686: /* 182 */ "60942", "00307", "11897", "92674", "40405",
3687: "68032", "96717", "54244", "10701", "41393",
3688: /* 183 */ "92329", "98932", "78284", "46347", "71209",
3689: "92061", "39448", "93136", "25722", "08564",
3690: /* 184 */ "77936", "63574", "31384", "51924", "85561",
3691: "29671", "58137", "17820", "22751", "36518",
3692: /* 185 */ "38101", "77756", "11657", "13897", "95889",
3693: "57067", "47648", "13885", "70669", "93406",
3694: /* 186 */ "39641", "69457", "91339", "22502", "92613",
3695: "89719", "11947", "56203", "19324", "20504",
3696: /* 187 */ "84054", "40455", "99396", "63680", "67667",
3697: "60631", "69181", "96845", "38525", "11600",
3698: /* 188 */ "47468", "03577", "57649", "63266", "24700",
3699: "71594", "14004", "23153", "69249", "05747",
3700: /* 189 */ "43321", "31370", "28977", "23896", "76479",
3701: "68562", "62342", "07589", "08899", "05985",
3702: /* 190 */ "64281", "61826", "18555", "64937", "13173",
3703: "33365", "78851", "16499", "87064", "13075",
3704: /* 191 */ "66847", "70495", "32350", "02985", "86716",
3705: "38746", "26313", "77463", "55387", "72681",
3706: /* 192 */ "72461", "33230", "21529", "53424", "92581",
3707: "02262", "78438", "66276", "18396", "73538",
3708: /* 193 */ "21032", "91050", "13058", "16218", "12470",
3709: "56500", "15292", "76139", "59526", "52113",
3710: /* 194 */ "95362", "67011", "06651", "16136", "01016",
3711: "00857", "55018", "56374", "35824", "71708",
3712: /* 195 */ "49712", "97380", "10404", "55452", "34030",
3713: "60726", "75211", "10271", "36633", "68424",
3714: /* 196 */ "58275", "61764", "97586", "54716", "50259",
3715: "46345", "87195", "46092", "26787", "60939",
3716: /* 197 */ "89514", "11788", "68224", "23417", "73959",
3717: "76145", "30342", "40277", "11049", "72049",
3718: /* 198 */ "15472", "50669", "48139", "36732", "46874",
3719: "37088", "73465", "09819", "58869", "35220",
3720: /* 199 */ "12120", "86124", "51247", "44302", "60883",
3721: "52109", "21437", "36786", "49226", "77837",
3722: /* 200 */ "19612", "78430", "11661", "94770", "77603",
3723: "65669", "86868", "12665", "30012", "75989",
3724: /* 201 */ "39141", "77400", "28000", "64238", "73258",
3725: "71794", "31340", "26256", "66453", "37016",
3726: /* 202 */ "64756", "80457", "08747", "12836", "03469",
3727: "50678", "03274", "43423", "66677", "82556",
3728: /* 203 */ "92901", "51878", "56441", "22998", "29718",
3729: "38447", "06453", "25311", "07565", "53771",
3730: /* 204 */ "03551", "90070", "09483", "94050", "45938",
3731: "18135", "36908", "43321", "11073", "51803",
3732: /* 205 */ "98884", "66209", "06830", "53656", "14663",
3733: "56346", "71430", "04909", "19818", "05707",
3734: /* 206 */ "27369", "86882", "53473", "07541", "53633",
3735: "70863", "03748", "12822", "19360", "49088",
3736: /* 207 */ "59066", "75974", "63335", "20483", "43514",
3737: "37481", "58278", "26967", "49325", "43951",
3738: /* 208 */ "91647", "93783", "64169", "49022", "98588",
3739: "09495", "49829", "59068", "38831", "04838",
3740: /* 209 */ "83605", "92419", "39542", "07772", "71568",
3741: "75673", "35185", "89759", "44901", "74291",
3742: /* 210 */ "24895", "88530", "70774", "35439", "46758",
3743: "70472", "70207", "92675", "91623", "61275",
3744: /* 211 */ "35720", "26556", "95596", "20094", "73750",
3745: "85788", "34264", "01703", "46833", "65248",
3746: /* 212 */ "14141", "53410", "38649", "06343", "57256",
3747: "61342", "72709", "75318", "90379", "37562",
3748: /* 213 */ "27416", "75670", "92176", "72535", "93119",
3749: "56077", "06886", "18244", "92344", "31374",
3750: /* 214 */ "82071", "07429", "81007", "47749", "40744",
3751: "56974", "23336", "88821", "53841", "10536",
3752: /* 215 */ "21445", "82793", "24831", "93241", "14199",
3753: "76268", "70883", "68002", "03829", "17443",
3754: /* 216 */ "72513", "76400", "52225", "92348", "62308",
3755: "98481", "29744", "33165", "33141", "61020",
3756: /* 217 */ "71479", "45027", "76160", "57411", "13780",
3757: "13632", "52308", "77762", "88874", "33697",
3758: /* 218 */ "83210", "51466", "09088", "50395", "26743",
3759: "05306", "21706", "70001", "99439", "80767",
3760: /* 219 */ "68749", "95148", "94897", "78636", "96750",
3761: "09024", "94538", "91143", "96693", "61886",
3762: /* 220 */ "05184", "75763", "47075", "88158", "05313",
3763: "53439", "14908", "08830", "60096", "21551",
3764: /* 221 */ "13651", "62546", "96892", "25240", "47511",
3765: "58483", "87342", "78818", "07855", "39269",
3766: /* 222 */ "00566", "21220", "00292", "24069", "25072",
3767: "29519", "52548", "54091", "21282", "21296",
3768: /* 223 */ "50958", "17695", "58072", "68990", "60329",
3769: "95955", "71586", "63417", "35947", "67807",
3770: /* 224 */ "57621", "64547", "46850", "37981", "38527",
3771: "09037", "64756", "03324", "04986", "83666",
3772: /* 225 */ "09282", "25844", "79139", "78435", "35428",
3773: "43561", "69799", "63314", "12991", "93516",
3774: /* 226 */ "23394", "94206", "93432", "37836", "94919",
3775: "26846", "02555", "74410", "94915", "48199",
3776: /* 227 */ "05280", "37470", "93622", "04345", "15092",
3777: "19510", "18094", "16613", "78234", "50001",
3778: /* 228 */ "95491", "97976", "38306", "32192", "82639",
3779: "54624", "72434", "92606", "23191", "74693",
3780: /* 229 */ "78521", "00104", "18248", "75583", "90326",
3781: "50785", "54034", "66251", "35774", "14692",
3782: /* 230 */ "96345", "44579", "85932", "44053", "75704",
3783: "20840", "86583", "83944", "52456", "73766",
3784: /* 231 */ "77963", "31151", "32364", "91691", "47357",
3785: "40338", "23435", "24065", "08458", "95366",
3786: /* 232 */ "07520", "11294", "23238", "01748", "41690",
3787: "67328", "54814", "37777", "10057", "42332",
3788: /* 233 */ "38423", "02309", "70703", "85736", "46148",
3789: "14258", "29236", "12152", "05088", "65825",
3790: /* 234 */ "02463", "65533", "21199", "60555", "33928",
3791: "01817", "07396", "89215", "30722", "22102",
3792: /* 235 */ "15880", "92261", "17292", "88190", "61781",
3793: "48898", "92525", "21283", "88581", "60098",
3794: /* 236 */ "71926", "00819", "59144", "00224", "30570",
3795: "90194", "18329", "06999", "26857", "19238",
3796: /* 237 */ "64425", "28108", "16554", "16016", "00042",
3797: "83229", "10333", "36168", "65617", "94834",
3798: /* 238 */ "79782", "23924", "49440", "30432", "81077",
3799: "31543", "95216", "64865", "13658", "51081",
3800: /* 239 */ "35337", "74538", "44553", "64672", "90960",
3801: "41849", "93865", "44608", "93176", "34851",
3802: /* 240 */ "05249", "29329", "19715", "94082", "14738",
3803: "86667", "43708", "66354", "93692", "25527",
3804: /* 241 */ "56463", "99380", "38793", "85774", "19056",
3805: "13939", "46062", "27647", "66146", "63210",
3806: /* 242 */ "96296", "33121", "54196", "34108", "75814",
3807: "85986", "71171", "15102", "28992", "63165",
3808: /* 243 */ "98380", "36269", "60014", "07201", "62448",
3809: "46385", "42175", "88350", "46182", "49126",
3810: /* 244 */ "52567", "64350", "16315", "53969", "80395",
3811: "81114", "54358", "64578", "47269", "15747",
3812: /* 245 */ "78498", "90830", "25955", "99236", "43286",
3813: "91064", "99969", "95144", "64424", "77377",
3814: /* 246 */ "49553", "24241", "08150", "89535", "08703",
3815: "91041", "77323", "81079", "45127", "93686",
3816: /* 247 */ "32151", "07075", "83155", "10252", "73100",
3817: "88618", "23891", "87418", "45417", "20268",
3818: /* 248 */ "11314", "50363", "26860", "27799", "49416",
3819: "83534", "19187", "08059", "76677", "02110",
3820: /* 249 */ "12364", "71210", "87052", "50241", "90785",
3821: "97889", "81399", "58130", "64439", "05614",
3822: /* 250 */ "59467", "58309", "87834", "57213", "37510",
3823: "33689", "01259", "62486", "56320", "46265",
3824: /* 251 */ "73452", "17619", "56421", "40725", "23439",
3825: "41701", "93223", "41682", "45026", "47505",
3826: /* 252 */ "27635", "56293", "91700", "04391", "67317",
3827: "89604", "73020", "69853", "61517", "51207",
3828: /* 253 */ "86040", "02596", "01655", "09918", "45161",
3829: "00222", "54577", "74821", "47335", "08582",
3830: /* 254 */ "52403", "94255", "26351", "46527", "68224",
3831: "90183", "85057", "72310", "34963", "83462",
3832: /* 255 */ "49465", "46581", "61499", "04844", "94626",
3833: "02963", "41482", "83879", "44942", "63915",
3834: /* 256 */ "94365", "92560", "12363", "30246", "02086",
3835: "75036", "88620", "91088", "67691", "67762",
3836: /* 257 */ "34261", "08769", "91830", "23313", "18256",
3837: "28850", "37639", "92748", "57791", "71328",
3838: /* 258 */ "37110", "66538", "39318", "15626", "44324",
3839: "82827", "08782", "65960", "58167", "01305",
3840: /* 259 */ "83950", "45424", "72453", "19444", "68219",
3841: "64733", "94088", "62006", "89985", "36936",
3842: /* 260 */ "61630", "97966", "76537", "46467", "30942",
3843: "07479", "67971", "14558", "22458", "35148",
3844: /* 261 */ "01929", "17165", "12037", "74558", "16250",
3845: "71750", "55546", "29693", "94984", "37782",
3846: /* 262 */ "41659", "39098", "23982", "29899", "71594",
3847: "77979", "54477", "13764", "17315", "72893",
3848: /* 263 */ "32031", "39608", "75992", "73445", "01317",
3849: "50525", "87313", "45191", "30214", "19769",
3850: /* 264 */ "90043", "93478", "58044", "06949", "31176",
3851: "88370", "50274", "83987", "45316", "38551",
3852: /* 265 */ "79418", "14322", "91065", "07841", "36130",
3853: "86602", "10659", "40859", "00964", "71577",
3854: /* 266 */ "85447", "61079", "96910", "72906", "07361",
3855: "84338", "34114", "52096", "66715", "51091",
3856: /* 267 */ "86219", "81115", "49625", "48799", "89485",
3857: "24855", "13684", "68433", "70595", "70102",
3858: /* 268 */ "71712", "88559", "92476", "32903", "68009",
3859: "58417", "87962", "11787", "16644", "72964",
3860: /* 269 */ "29776", "63075", "13270", "84758", "49560",
3861: "10317", "28778", "23006", "31036", "84906",
3862: /* 270 */ "81488", "17340", "74154", "42801", "27917",
3863: "89792", "62604", "62234", "13124", "76471",
3864: /* 271 */ "51667", "37589", "87147", "24743", "48023",
3865: "06325", "79794", "35889", "13255", "04925",
3866: /* 272 */ "99004", "70322", "60832", "76636", "56907",
3867: "56534", "72615", "46288", "36788", "93196",
3868: /* 273 */ "68656", "66492", "35933", "52293", "47953",
3869: "95495", "95304", "50009", "83464", "28608",
3870: /* 274 */ "38074", "74083", "09337", "07965", "65047",
3871: "36871", "59015", "21769", "30398", "44855",
3872: /* 275 */ "01020", "80680", "59328", "08712", "48190",
3873: "45332", "27284", "31287", "66011", "09376",
3874: /* 276 */ "86379", "74508", "33579", "77114", "92955",
3875: "23085", "92824", "03054", "25242", "16322",
3876: /* 277 */ "48498", "09938", "44420", "13484", "52319",
3877: "58875", "02012", "88591", "52500", "95795",
3878: /* 278 */ "41800", "95363", "54142", "17482", "32705",
3879: "60564", "12505", "40954", "46174", "64130",
3880: /* 279 */ "63026", "96712", "79883", "39225", "52653",
3881: "69549", "36693", "59822", "22684", "31661",
3882: /* 280 */ "88298", "15489", "16030", "42480", "15372",
3883: "38781", "71995", "77438", "91161", "10192",
3884: /* 281 */ "07839", "62735", "99218", "25624", "02547",
3885: "27445", "69187", "55749", "32322", "15504",
3886: /* 282 */ "73298", "51108", "48717", "92926", "75705",
3887: "89787", "96114", "99902", "37749", "96305",
3888: /* 283 */ "12829", "70474", "00838", "50385", "91711",
3889: "80370", "56504", "56857", "80906", "09018",
3890: /* 284 */ "76569", "61072", "48568", "36491", "22587",
3891: "44363", "39592", "61546", "90181", "37348",
3892: /* 285 */ "41665", "41339", "62106", "44203", "06732",
3893: "76111", "79840", "67999", "32231", "76869",
3894: /* 286 */ "58652", "49983", "01669", "27464", "79553",
3895: "52855", "25988", "18087", "38052", "17529",
3896: /* 287 */ "13607", "00657", "76173", "43357", "77334",
3897: "24140", "53860", "02906", "89863", "44651",
3898: /* 288 */ "55715", "26203", "65933", "51087", "98234",
3899: "40625", "45545", "63563", "89148", "82581",
3900: /* 289 */ "04110", "66683", "99001", "09796", "47349",
3901: "65003", "66524", "81970", "71262", "14479",
3902: /* 290 */ "31300", "08681", "58068", "44115", "40064",
3903: "77879", "23965", "69019", "73985", "19453",
3904: /* 291 */ "26225", "97543", "37044", "07494", "85778",
3905: "35345", "61115", "92498", "49737", "64599",
3906: /* 292 */ "07158", "82763", "25072", "38478", "57782",
3907: "75291", "62155", "52056", "04786", "11585",
3908: /* 293 */ "71251", "25572", "79771", "93328", "66927",
3909: "54069", "58752", "26624", "50463", "77361",
3910: /* 294 */ "29991", "96526", "02820", "91659", "12818",
3911: "96356", "49499", "01507", "40223", "09171",
3912: /* 295 */ "83642", "21057", "02677", "09367", "38097",
3913: "16100", "19355", "06120", "15378", "56559",
3914: /* 296 */ "69167", "30235", "06767", "66323", "78294",
3915: "14916", "19124", "88044", "16673", "66102",
3916: /* 297 */ "86018", "29406", "75415", "22038", "27056",
3917: "26906", "25867", "14751", "92380", "30434",
3918: /* 298 */ "44114", "06026", "79553", "55091", "95385",
3919: "41212", "37882", "46864", "54717", "97038",
3920: /* 299 */ "53805", "64150", "70915", "63127", "63695",
3921: "41288", "38192", "72437", "75075", "18570",
3922: /* 300 */ "52065", "08853", "30104", "79937", "66913",
3923: "53200", "84570", "78079", "28970", "53859",
3924: /* 301 */ "37632", "80274", "35240", "32960", "74859",
3925: "07359", "55176", "03930", "38984", "35151",
3926: /* 302 */ "82576", "82805", "94031", "12779", "90879",
3927: "24109", "25367", "77861", "09541", "85739",
3928: /* 303 */ "69023", "64971", "99321", "07521", "95909",
3929: "43897", "71724", "92581", "05471", "64337",
3930: /* 304 */ "98949", "03606", "78236", "78985", "29212",
3931: "57369", "34857", "67757", "58019", "58872",
3932: /* 305 */ "96526", "28749", "56592", "37871", "72905",
3933: "70198", "57319", "54116", "47014", "18285",
3934: /* 306 */ "33692", "72111", "60958", "96848", "17893",
3935: "40993", "50445", "14186", "76877", "87867",
3936: /* 307 */ "50335", "09513", "44346", "26439", "55293",
3937: "06449", "44301", "63740", "40158", "72703",
3938: /* 308 */ "88321", "85062", "57345", "66231", "15409",
3939: "03451", "95261", "43561", "15673", "28956",
3940: /* 309 */ "90303", "62469", "82517", "43035", "36850",
3941: "15592", "64098", "59022", "31752", "04370",
3942: /* 310 */ "50486", "11885", "23085", "41712", "80692",
3943: "48492", "16495", "99721", "36912", "28267",
3944: /* 311 */ "27882", "16269", "64483", "11273", "02680",
3945: "01616", "46138", "54606", "14761", "05134",
3946: /* 312 */ "45144", "63213", "49666", "27441", "86989",
3947: "29884", "54334", "06740", "08368", "80051",
3948: /* 313 */ "81020", "17882", "74973", "74531", "94994",
3949: "24927", "64894", "22667", "20466", "82948",
3950: /* 314 */ "66831", "47427", "76033", "31197", "59817",
3951: "20064", "61135", "28556", "29695", "80179",
3952: /* 315 */ "74058", "18293", "09963", "35278", "13062",
3953: "83094", "23373", "90287", "33477", "48865",
3954: /* 316 */ "30348", "70174", "11468", "25994", "25343",
3955: "22317", "01587", "30682", "00001", "67814",
3956: /* 317 */ "59557", "23362", "13746", "82244", "42093",
3957: "24671", "79458", "93730", "45488", "60234",
3958: /* 318 */ "67098", "09899", "25775", "00332", "36636",
3959: "57594", "19958", "85564", "58977", "12247",
3960: /* 319 */ "60774", "66371", "69442", "20385", "14486",
3961: "91330", "50332", "46023", "75768", "59877",
3962: /* 320 */ "60081", "92936", "72302", "75064", "85727",
3963: "52987", "05750", "19384", "33684", "78859",
3964: /* 321 */ "80458", "69902", "34870", "88684", "49762",
3965: "40801", "86291", "18194", "90366", "82639",
3966: /* 322 */ "53844", "96326", "65728", "48563", "26027",
3967: "52692", "62406", "76294", "41848", "63010",
3968: /* 323 */ "69841", "29451", "36170", "21529", "16525",
3969: "64326", "22086", "24469", "57407", "96033",
3970: /* 324 */ "37771", "31002", "18311", "93285", "31948",
3971: "14331", "58335", "15977", "80336", "81667",
3972: /* 325 */ "27286", "24361", "61638", "57580", "95270",
3973: "46180", "76990", "53031", "94366", "02727",
3974: /* 326 */ "49944", "19278", "05756", "51875", "53445",
3975: "33342", "01965", "07937", "10054", "97712",
3976: /* 327 */ "87693", "58124", "46064", "39133", "77385",
3977: "09605", "65359", "70113", "90563", "86637",
3978: /* 328 */ "94282", "12025", "31926", "24541", "23854",
3979: "58407", "32131", "92845", "20714", "27898",
3980: /* 329 */ "26917", "50326", "35145", "50859", "72119",
3981: "95094", "29441", "42301", "62460", "75252",
3982: /* 330 */ "94267", "38422", "73047", "24200", "85349",
3983: "72049", "91723", "97802", "98496", "12734",
3984: /* 331 */ "73432", "10371", "57213", "53300", "80847",
3985: "46229", "07099", "72961", "13767", "65654",
3986: /* 332 */ "31102", "82119", "96946", "65919", "81083",
3987: "03819", "57888", "57908", "16849", "77111",
3988: /* 333 */ "41429", "92261", "45263", "01172", "55926",
3989: "78835", "27697", "48420", "58865", "41207",
3990: /* 334 */ "21406", "08582", "10785", "36233", "12237",
3991: "07866", "13706", "92551", "11021", "63813",
3992: /* 335 */ "71512", "65206", "37768", "94325", "14721",
3993: "20990", "54235", "71986", "05345", "56239",
3994: /* 336 */ "52028", "01419", "07215", "55067", "11669",
3995: "21738", "66605", "69621", "69827", "08537",
3996: /* 337 */ "18638", "60982", "28151", "98885", "76431",
3997: "25566", "03085", "23639", "30849", "63986",
3998: /* 338 */ "73287", "26201", "36174", "14106", "54102",
3999: "57041", "16141", "64174", "03591", "90024",
4000: /* 339 */ "73332", "31254", "17288", "59809", "25061",
4001: "51612", "47951", "16570", "43330", "79213",
4002: /* 340 */ "11354", "55585", "19646", "99246", "37564",
4003: "32660", "20632", "21124", "60597", "69315",
4004: /* 341 */ "31312", "57741", "85108", "21615", "24365",
4005: "27684", "16124", "33888", "14966", "35303",
4006: /* 342 */ "69921", "15795", "04020", "67672", "86816",
4007: "63027", "84470", "45605", "44887", "26222",
4008: /* 343 */ "79888", "58982", "22466", "98844", "48353",
4009: "60666", "58256", "31140", "93507", "69561",
4010: /* 344 */ "06256", "88526", "18655", "00865", "75247",
4011: "00264", "65957", "98261", "72706", "36396",
4012: /* 345 */ "46065", "85700", "32121", "99975", "73627",
4013: "78812", "89638", "86602", "96758", "65099",
4014: /* 346 */ "52777", "46792", "13790", "55240", "52002",
4015: "10313", "91933", "71231", "10053", "78416",
4016: /* 347 */ "54563", "96004", "42215", "30094", "45958",
4017: "48437", "49591", "50483", "13422", "69108",
4018: /* 348 */ "59952", "27896", "40450", "79327", "31962",
4019: "46456", "39260", "51479", "61882", "48181",
4020: /* 349 */ "50691", "64709", "32902", "10676", "12083",
4021: "35771", "79656", "56667", "76783", "03937",
4022: /* 350 */ "99859", "10362", "57411", "40986", "35045",
4023: "02838", "29255", "64230", "84418", "34988",
4024: /* 351 */ "77644", "39892", "77327", "74129", "53444",
4025: "35487", "95803", "38640", "20383", "55402",
4026: /* 352 */ "25793", "14213", "87082", "42837", "95030",
4027: "97198", "61608", "97723", "79390", "35290",
4028: /* 353 */ "34683", "81419", "87133", "70447", "53127",
4029: "97146", "28299", "56763", "12868", "01145",
4030: /* 354 */ "12147", "58158", "92124", "60934", "18414",
4031: "97510", "07056", "54488", "20719", "53743",
4032: /* 355 */ "91037", "44797", "52110", "08512", "18991",
4033: "20129", "31441", "51449", "14661", "71126",
4034: /* 356 */ "23180", "68124", "18807", "70997", "21913",
4035: "19594", "70355", "73637", "68266", "60775",
4036: /* 357 */ "43164", "52643", "96363", "77989", "79332",
4037: "39890", "65379", "20405", "52935", "43816",
4038: /* 358 */ "92740", "95319", "04538", "60660", "28982",
4039: "15328", "80475", "34690", "02293", "19646",
4040: /* 359 */ "46524", "96627", "33159", "42081", "08816",
4041: "74931", "20674", "08697", "66169", "46460",
4042: /* 360 */ "46326", "39923", "60625", "28386", "22919",
4043: "19415", "75766", "43668", "31626", "70301",
4044: /* 361 */ "67053", "03949", "70082", "02303", "48642",
4045: "38429", "94053", "38770", "68137", "68441",
4046: /* 362 */ "52928", "70244", "91954", "17401", "92693",
4047: "98342", "21451", "84988", "80487", "33807",
4048: /* 363 */ "73797", "49494", "41878", "76635", "83227",
4049: "76618", "11946", "13451", "87591", "78381",
4050: /* 364 */ "21407", "90038", "72638", "69692", "51599",
4051: "86413", "32019", "64856", "74730", "41531",
4052: /* 365 */ "11064", "01790", "58817", "86400", "66213",
4053: "92599", "70905", "78324", "54326", "43659",
4054: /* 366 */ "34206", "63132", "38837", "40210", "96346",
4055: "16967", "81619", "96503", "14881", "89405",
4056: /* 367 */ "32205", "49508", "98425", "02451", "35423",
4057: "56072", "36810", "30332", "85998", "49358",
4058: /* 368 */ "92748", "84147", "79835", "94867", "41224",
4059: "61794", "35066", "82220", "66684", "20096",
4060: /* 369 */ "02754", "41731", "37068", "32753", "91059",
4061: "13407", "05607", "69384", "53329", "95909",
4062: /* 370 */ "44968", "11397", "92973", "50014", "92997",
4063: "80968", "93761", "57598", "74703", "07768",
4064: /* 371 */ "37978", "73873", "33475", "09720", "97852",
4065: "98449", "48722", "84977", "11271", "11728",
4066: /* 372 */ "68318", "22312", "78792", "87508", "88466",
4067: "72976", "47099", "84126", "38595", "85124",
4068: /* 373 */ "64405", "90020", "07492", "52413", "95111",
4069: "34455", "86311", "68892", "01074", "60274",
4070: /* 374 */ "28136", "19328", "38161", "57475", "13771",
4071: "63562", "84207", "94121", "18901", "52768",
4072: /* 375 */ "33801", "82087", "86091", "59969", "90398",
4073: "56870", "55756", "78841", "98450", "54165",
4074: /* 376 */ "55106", "50343", "70519", "14567", "36780",
4075: "55450", "19606", "83749", "67562", "64765",
4076: /* 377 */ "38543", "16585", "86841", "73742", "08766",
4077: "39252", "75678", "75379", "78760", "37279",
4078: /* 378 */ "15280", "13558", "95916", "89759", "76686",
4079: "76467", "67147", "63110", "94008", "08037",
4080: /* 379 */ "35263", "53710", "16667", "79008", "11231",
4081: "29397", "67136", "18601", "64502", "90228",
4082: /* 380 */ "89109", "72849", "22711", "65547", "34542",
4083: "26686", "81678", "87765", "77654", "23664",
4084: /* 381 */ "96352", "14106", "32938", "28083", "18633",
4085: "80286", "65507", "46197", "52722", "75476",
4086: /* 382 */ "77816", "47204", "34876", "45963", "79262",
4087: "90181", "84041", "03745", "90041", "30780",
4088: /* 383 */ "27226", "92847", "85572", "15308", "80688",
4089: "05761", "82638", "13464", "23683", "81015",
4090: /* 384 */ "54214", "64175", "43701", "86845", "15569",
4091: "50687", "52679", "87696", "08285", "97444",
4092: /* 385 */ "47599", "94472", "64150", "87753", "68652",
4093: "60726", "26213", "17320", "64553", "81285",
4094: /* 386 */ "98126", "12158", "52095", "64833", "00492",
4095: "35817", "55571", "91300", "97812", "37507",
4096: /* 387 */ "04209", "53515", "64342", "21223", "16662",
4097: "43265", "68219", "03529", "43636", "68417",
4098: /* 388 */ "53640", "95326", "93381", "37113", "80751",
4099: "76469", "96677", "43054", "22937", "31954",
4100: /* 389 */ "13266", "34140", "27253", "02734", "99070",
4101: "60077", "57988", "93211", "92795", "83795",
4102: /* 390 */ "57477", "03941", "39007", "14619", "38320",
4103: "93449", "31336", "25279", "97030", "26245",
4104: /* 391 */ "47394", "39475", "90621", "23820", "29344",
4105: "94859", "91604", "14033", "41868", "14816",
4106: /* 392 */ "04075", "66644", "87803", "97815", "99552",
4107: "78666", "03942", "08175", "22345", "19983",
4108: /* 393 */ "76783", "99044", "20851", "84981", "59052",
4109: "77178", "72109", "76475", "21619", "73017",
4110: /* 394 */ "06812", "56633", "50612", "55289", "04671",
4111: "84419", "94072", "94446", "80603", "32188",
4112: /* 395 */ "93415", "23464", "43947", "43728", "74284",
4113: "67177", "57105", "31059", "10642", "13803",
4114: /* 396 */ "69602", "46961", "66567", "19359", "84676",
4115: "63918", "40650", "12923", "15974", "79732",
4116: /* 397 */ "20225", "92525", "71179", "04859", "91208",
4117: "60430", "05239", "61458", "24089", "68852",
4118: /* 398 */ "60171", "29603", "42535", "86365", "93905",
4119: "28237", "45317", "60718", "82001", "41679",
4120: /* 399 */ "20679", "56304", "70043", "87568", "21386",
4121: "59049", "78353", "48696", "77379", "55309",
4122: /* 400 */ "23780", "28391", "05940", "55583", "81256",
4123: "59418", "97521", "32846", "70761", "90115",
4124: /* 401 */ "45325", "05490", "65974", "11186", "15357",
4125: "03568", "00450", "96644", "58976", "36211",
4126: /* 402 */ "88240", "92457", "89200", "94696", "11370",
4127: "91157", "48487", "59501", "56983", "89795",
4128: /* 403 */ "42789", "69758", "79701", "29511", "55968",
4129: "41472", "89474", "84344", "80517", "07485",
4130: /* 404 */ "97523", "17264", "82840", "59556", "37119",
4131: "30985", "48866", "60605", "95719", "70417",
4132: /* 405 */ "59083", "95137", "76538", "44155", "67286",
4133: "57897", "28262", "04052", "00919", "86207",
4134: /* 406 */ "79932", "44236", "10089", "44373", "65670",
4135: "44285", "06903", "20834", "49701", "95735",
4136: /* 407 */ "21149", "03425", "17594", "31427", "14262",
4137: "32252", "68540", "39427", "44026", "47257",
4138: /* 408 */ "45055", "95091", "08367", "28381", "57375",
4139: "41562", "83883", "27715", "10122", "67745",
4140: /* 409 */ "46497", "28626", "87297", "36568", "39483",
4141: "11385", "63292", "92305", "78683", "06146",
4142: /* 410 */ "81905", "15038", "38338", "51206", "65749",
4143: "34119", "71516", "74068", "51094", "06665",
4144: /* 411 */ "91884", "66762", "11428", "70908", "21506",
4145: "00480", "94183", "78484", "66507", "75901",
4146: /* 412 */ "25728", "52539", "86806", "69944", "65036",
4147: "27882", "02530", "04918", "74351", "65737",
4148: /* 413 */ "89178", "08791", "39342", "94963", "22581",
4149: "56917", "17541", "83578", "75376", "65202",
4150: /* 414 */ "30935", "79270", "91986", "99286", "45236",
4151: "44720", "81915", "70881", "45886", "43213",
4152: /* 415 */ "49789", "97081", "16075", "20517", "69980",
4153: "25310", "91953", "01759", "67635", "88933",
4154: /* 416 */ "54558", "18395", "73375", "62251", "58871",
4155: "09870", "70538", "48936", "07757", "90374",
4156: /* 417 */ "56631", "88862", "30487", "38794", "36079",
4157: "32712", "11130", "55451", "25137", "38785",
4158: /* 418 */ "83558", "31960", "69473", "45950", "18225",
4159: "09871", "88502", "75179", "11551", "75664",
4160: /* 419 */ "74321", "67351", "27703", "83717", "18913",
4161: "42470", "08816", "37627", "14288", "62831",
4162: /* 420 */ "44047", "67612", "72738", "26995", "50933",
4163: "63758", "50003", "43693", "52661", "55852",
4164: /* 421 */ "52372", "59042", "37595", "04931", "73622",
4165: "68387", "86478", "40997", "05245", "75300",
4166: /* 422 */ "24902", "59609", "35653", "15970", "37681",
4167: "69365", "22236", "86374", "65550", "00343",
4168: /* 423 */ "98377", "35354", "65770", "15365", "41422",
4169: "71356", "16630", "40044", "19290", "66449",
4170: /* 424 */ "53629", "79452", "71674", "30260", "97303",
4171: "06487", "62789", "13005", "70152", "22501",
4172: /* 425 */ "49867", "89294", "59232", "31776", "54919",
4173: "99851", "05438", "01096", "72269", "50486",
4174: /* 426 */ "16719", "06144", "82041", "38332", "64452",
4175: "31840", "99287", "59928", "25503", "08407",
4176: /* 427 */ "46970", "45907", "99238", "74547", "19704",
4177: "72035", "26542", "54600", "79172", "58779",
4178: /* 428 */ "35747", "78956", "11478", "41195", "58135",
4179: "63856", "33037", "45753", "60159", "25193",
4180: /* 429 */ "71838", "07526", "07985", "60714", "88627",
4181: "75790", "38454", "96110", "39237", "19792",
4182: /* 430 */ "34534", "70169", "24805", "63215", "38175",
4183: "38784", "38855", "24826", "50917", "25147",
4184: /* 431 */ "17082", "26997", "32295", "10894", "21805",
4185: "65245", "85407", "37926", "69214", "38579",
4186: /* 432 */ "84721", "23544", "88548", "65626", "75517",
4187: "69737", "55626", "52175", "21697", "19453",
4188: /* 433 */ "16908", "82841", "24060", "40285", "19195",
4189: "80281", "89322", "15232", "70043", "60691",
4190: /* 434 */ "86370", "91949", "19017", "83846", "77869",
4191: "14321", "95102", "87073", "71467", "31305",
4192: /* 435 */ "64677", "80358", "52629", "79419", "22359",
4193: "87867", "48296", "50141", "46807", "82184",
4194: /* 436 */ "95812", "84665", "74511", "59914", "04146",
4195: "90417", "58508", "62875", "17630", "21868",
4196: /* 437 */ "09199", "30322", "33352", "43374", "25473",
4197: "04119", "63086", "14147", "14863", "38020",
4198: /* 438 */ "44757", "98628", "57916", "22199", "11865",
4199: "42911", "62651", "78290", "09392", "77294",
4200: /* 439 */ "63168", "21043", "17409", "13786", "27475",
4201: "75979", "89668", "43596", "74316", "84489",
4202: /* 440 */ "54941", "95992", "45445", "41059", "55142",
4203: "15214", "42903", "16799", "88254", "95984",
4204: /* 441 */ "48575", "77822", "21067", "57238", "35352",
4205: "96779", "89564", "23797", "99937", "46379",
4206: /* 442 */ "27119", "16060", "30302", "95327", "12849",
4207: "38111", "97090", "07598", "78473", "63079",
4208: /* 443 */ "18570", "72803", "70040", "91385", "96436",
4209: "96263", "17368", "56188", "85999", "50026",
4210: /* 444 */ "36050", "73736", "13351", "48321", "28357",
4211: "51718", "65636", "72903", "21584", "21060",
4212: /* 445 */ "39829", "15564", "04716", "14594", "22363",
4213: "97639", "65937", "17802", "31535", "42767",
4214: /* 446 */ "98761", "30987", "57657", "33398", "63053",
4215: "25926", "20944", "19306", "81727", "02695",
4216: /* 447 */ "97479", "79172", "72764", "66446", "78864",
4217: "12698", "15812", "97209", "38827", "91016",
4218: /* 448 */ "91281", "57875", "45228", "49211", "69755",
4219: "99224", "43999", "62879", "08879", "80015",
4220: /* 449 */ "74396", "57146", "64665", "31159", "06980",
4221: "79069", "37409", "75037", "69977", "85919",
4222: /* 450 */ "42826", "06974", "61063", "97640", "13433",
4223: "92528", "91311", "08440", "38840", "22362",
4224: /* 451 */ "93929", "01836", "36590", "75052", "89475",
4225: "15437", "65648", "99012", "70236", "12307",
4226: /* 452 */ "83585", "00414", "62851", "48787", "28447",
4227: "21702", "57033", "29633", "44760", "34165",
4228: /* 453 */ "27548", "37516", "24343", "63046", "02081",
4229: "20378", "19510", "42226", "97134", "68739",
4230: /* 454 */ "32982", "56455", "53129", "77693", "25022",
4231: "55534", "99375", "30086", "98001", "07432",
4232: /* 455 */ "67126", "76656", "29347", "28492", "43108",
4233: "64736", "32278", "84816", "80440", "30461",
4234: /* 456 */ "00818", "09136", "01952", "48442", "91058",
4235: "92590", "10443", "05195", "34009", "32141",
4236: /* 457 */ "62209", "43740", "54102", "76895", "98172",
4237: "31583", "04155", "66492", "58981", "16591",
4238: /* 458 */ "11331", "06838", "03818", "77063", "12523",
4239: "45570", "68970", "70055", "77751", "73743",
4240: /* 459 */ "71732", "04704", "61384", "57343", "66682",
4241: "44500", "89745", "10436", "67202", "36455",
4242: /* 460 */ "42467", "88801", "91280", "01056", "27534",
4243: "81619", "79004", "25824", "66362", "33280",
4244: /* 461 */ "20706", "31929", "57422", "18730", "96197",
4245: "22101", "47592", "02180", "18287", "82310",
4246: /* 462 */ "60430", "59627", "26471", "07794", "60475",
4247: "76713", "45427", "89654", "14370", "81674",
4248: /* 463 */ "41246", "98416", "08669", "48883", "77154",
4249: "09806", "94015", "60347", "20027", "08405",
4250: /* 464 */ "33150", "27368", "53375", "70171", "59431",
4251: "14534", "34018", "85665", "77797", "17944",
4252: /* 465 */ "49602", "74391", "48830", "55029", "10371",
4253: "94261", "16658", "68400", "44148", "28150",
4254: /* 466 */ "40364", "90913", "73151", "64463", "50058",
4255: "78191", "84439", "82478", "62398", "03113",
4256: /* 467 */ "17578", "12830", "06571", "95934", "09132",
4257: "25287", "78731", "80683", "67207", "76597",
4258: /* 468 */ "42096", "34934", "76609", "52553", "47508",
4259: "71561", "08038", "83011", "72577", "95790",
4260: /* 469 */ "40076", "20292", "32138", "61197", "95476",
4261: "23123", "26648", "13611", "48452", "39963",
4262: /* 470 */ "85857", "04855", "27029", "01542", "72443",
4263: "53688", "82635", "56264", "07977", "23090",
4264: /* 471 */ "93553", "65434", "12124", "91087", "87800",
4265: "95675", "99419", "44659", "30382", "55263",
4266: /* 472 */ "82514", "86800", "16781", "65977", "65946",
4267: "13033", "93895", "04056", "75895", "47878",
4268: /* 473 */ "91309", "51233", "81409", "46773", "69135",
4269: "56906", "84493", "34530", "84534", "38312",
4270: /* 474 */ "54574", "92933", "77341", "20839", "36126",
4271: "01143", "35356", "35459", "07959", "98335",
4272: /* 475 */ "53266", "36146", "78047", "50607", "22486",
4273: "63308", "08996", "96056", "39085", "26567",
4274: /* 476 */ "06779", "62663", "30523", "47881", "41279",
4275: "49864", "82248", "78333", "29466", "48151",
4276: /* 477 */ "41957", "93235", "53308", "22682", "90722",
4277: "54478", "07235", "34306", "15827", "20121",
4278: /* 478 */ "96837", "06283", "80172", "66109", "92592",
4279: "48238", "76428", "94546", "45430", "16288",
4280: /* 479 */ "74839", "00740", "25553", "83767", "35900",
4281: "05998", "07493", "46755", "11449", "88824",
4282: /* 480 */ "44906", "33143", "07454", "56652", "34755",
4283: "63992", "59674", "65131", "46358", "12799"
4284: };
4285:
4286:
4287:
4288: typedef unsigned long int sBox[256];
4289:
4290:
4291: /* The standard S boxes are defined in another file */
4292: extern sBox standardSBoxes[SBoxCount];
4293:
4294:
4295:
4296: /* The following routine is a simple error exit routine -- it prints a
4297: message and aborts */
4298: void errAbort (s)
4299: char *s;
4300: {
4301: int length;
4302:
4303: for (length = 0; s[length] != 0; length++);
4304: if (write (errorFile, s, length) != length) exit(2);
4305: if (write (errorFile, "\n", 1) != 1) exit(2);
4306: exit (1);
4307: };
4308:
4309:
4310:
4311: void swapBytesInSBox (anSBox, row1, row2, column)
4312: sBox anSBox;
4313: unsigned int row1, row2, column;
4314:
4315: /* Exchanges two bytes in a column in 'anSBox'. row1 and row2 are integers
4316: between 0 and 255 inclusive. 'column' is either 0, 1, 2 or 3 and refers
4317: to the byte position in a 32-bit word. 0 is the left-most byte. */
4318: {
4319: /* mask designates the bytes to be exchanged */
4320: unsigned long int mask;
4321: unsigned long int temp;
4322:
4323: mask = 0xFF000000;
4324:
4325: /* 'column' must be between 0 and 3 */
4326: if (column > 3)
4327: errAbort ("bad column passed to swapBytesInSBox");
4328:
4329: /* position the mask in the appropriate column */
4330: mask >>= (column * 8);
4331:
4332:
4333: /* Swap the bytes indicated by 'mask' */
4334: temp = anSBox[row1];
4335: anSBox[row1] = (anSBox[row1] & (~mask)) | (anSBox[row2] & mask);
4336: anSBox[row2] = (anSBox[row2] & (~mask)) | (temp & mask);
4337: }
4338:
4339:
4340: unsigned int randomDigit ()
4341: /* generate a random digit in the range from 0 to 9, inclusive. Generate the
4342: digit simply by getting the next random digit from the RAND table of
4343: random digits */
4344: {
4345: if (locationIn5DigitGroup == 5) {
4346: locationIn5DigitGroup = 0;
4347: locationInRANDtable++;
4348: };
4349: if (locationInRANDtable >= sizeOfRANDtableIn5DigitGroups)
4350: errAbort ("Error in randomDigit -- attempt to ask for too many random digits");
4351: return (RANDtable[locationInRANDtable][locationIn5DigitGroup++] - '0');
4352: };
4353:
4354:
4355: unsigned int randomInRange (low, high)
4356: unsigned int low, high;
4357:
4358: /* Returns a random integer in the range from low to high, inclusive */
4359: /* gets random digits from RANDtable */
4360: {
4361: unsigned int range; /* contains the actual range needed */
4362:
4363: /* the max possible random numbers given a certain number of digits */
4364: unsigned int maximum;
4365: unsigned int random; /* the random number composed by appending
4366: digits */
4367:
4368: range = (high - low) + 1;
4369: do {
4370: random = 0; /* initialize */
4371: maximum = 1; /* initialize */
4372: /* loop until random has as many digits as range */
4373: while (maximum < range) {
4374: maximum *= 10; /* 0-n = n+1 possible random numbers */
4375: /* add another digit to the low end */
4376: random = (random * 10) + randomDigit ();
4377: }
4378: }
4379: /* if random is not evenly mappable to range, try again */
4380: /* the operation (maximum/range) TRUNCATES the result to an unsigned
4381: int */
4382: while (random >= ((unsigned int) (maximum / range)) * range);
4383: /* map random to the range and add low to stay within (low,high) */
4384: return (low + (random % range));
4385: }
4386:
4387: void checkSBoxes ()
4388: /* computes the standard S boxes from the RAND table of random digits,
4389: then compares it with standardSBoxes -- they should be equal.
4390: Uses RANDtable as the source for the random digits. */
4391: {
4392: sBox SBoxFromRand[SBoxCount];
4393: int SBoxIndex;
4394:
4395: /* column is from the set {0, 1, 2, 3}. 0 is the leftmost byte */
4396: unsigned int column, row;
4397: unsigned long int longRow;
4398:
4399: for (SBoxIndex = 0; SBoxIndex < SBoxCount; SBoxIndex++) {
4400:
4401: /* Fill initial S box with a trivial permutation (0-255) */
4402: for (longRow = 0; longRow < 256; longRow++)
4403: SBoxFromRand[SBoxIndex][longRow] =
4404: longRow | (longRow << 8) | (longRow << 16) | (longRow << 24);
4405:
4406: for (column = 0; column < 4; column++) {
4407: for (row = 0; row < 255 /* 255 is correct */ ; row++)
4408: /* exchange random rows in the column.
4409: This ensures the column remains a permutation
4410: of (0-255) */
4411: swapBytesInSBox (SBoxFromRand[SBoxIndex],
4412: row, randomInRange (row, 255), column);
4413: }
4414: for (row = 0; row < 256; row++)
4415: if (SBoxFromRand[SBoxIndex][row] != standardSBoxes[SBoxIndex][row])
4416: errAbort ("Error -- can't verify S boxes");
4417:
4418: printf(" Verified SBox[%d]\n",SBoxIndex);
4419: }; /* End of for (SBoxIndex.... */
4420: };
4421:
4422:
4423:
4424: void main ()
4425:
4426: { int i;
4427:
4428:
4429: /* Test the standard S boxes to make sure they haven't been
4430: damaged. */
4431: /* Test to make sure each column is a permutation. */
4432: for (i = 0; i < SBoxCount; i++) {
4433: char testArray[256];
4434: int testShift = 0;
4435: int j;
4436:
4437: for (testShift = 0; testShift < 32; testShift += 8) {
4438: for (j = 0; j < 256; j++)
4439: testArray[j] = 0;
4440: for (j = 0; j < 256; j++)
4441: testArray[(standardSBoxes[i][j] >> testShift) & 0xff]++;
4442: for (j = 0; j < 256; j++)
4443: if (testArray[j] != 1)
4444: errAbort ("Table error -- the standard S box is corrupted");
4445: };
4446: };
4447:
4448: /* It looks okay. Now check things out some more */
4449:
4450: printf(" The standard S Boxes are permutations.\n");
4451:
4452: checkSBoxes ();
4453:
4454:
4455: exit (0);
4456: };
4457: *-*-END-*-*
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.