sed 's/^ //' >README <<\*-*-END-*-* To compile: cc -o hash2.0 hash2.0.c standardSBoxes2.c To run: <inputFile hash2.0 The inputFile is read and a hash value computed from it. The hash value is then printed on standard out. options: You can increase the number of iterations to 4 by saying: <inputFile hash2.0 4 You can increase the size of the output to 256 bits by saying: <inputFile hash2.0 4 256 *-*-END-*-* sed 's/^ //' >hash2.0.c <<\*-*-END-*-* /* This is a reference implementation of Snefru. Snefru is a one-way hash function that provides authentication. It does not provide secrecy. Snefru is named after a Pharaoh of ancient Egypt. Copyright (c) Xerox Corporation 1989 All rights reserved. License to copy and use this software is granted provided that it is identified as the 'Xerox Secure Hash Function' in all material mentioning or referencing this software or this hash function. License is also granted to make and use derivative works provided that such works are identified as 'derived from the Xerox Secure Hash Function' in all material mentioning or referencing the derived work. Xerox Corporation makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this software. This is version 2.0, July 31, 1989. Version 2.0 is algorithmically different from versions 1.4 and 1.3. In particular, version 2.0 makes the following changes: 1.) The S-boxes in version 2.0 have been computed in accordance with a publicly known algorithm. 2.) The special case handling of inputs shorter than 64 bytes has been deleted. This special case code offered little performance advantage and increased the complexity of the algorithm. In addition, Coppersmith noticed a weakness that affected the 128-bit-input/128-bit-output version of Snefru (though not the 512-bit input/128-bit or 256-bit output version). 3.) The parameters p0, p1, and p2 have been eliminated. There are several reasons for this change. The principle reason is that they increase the complexity both of the code and the conceptual complexity of the hash function, and provide only modest improvement in security. 4.) Because the parameter mechanism was used to distinguish between inputs that differ only in the number of trailing 0 bits, a different mechanism has been adopted. This new mechanism simply counts the number of bits in the input, and then places this 64-bit bit-count into the rightmost 64-bits of the last block hashed. A slightly different method of applying the hash also been adopted. 5.) Several people requested a larger output (to provide greater security). Because this will not always be needed, the algorithm was modified to generate either 128 bits or 256 bits of output, depending on a command line option. Notice that 128 bits of output only provides 64 "real" bits of security (because of square root attacks) and similarly 256 bits of output provides only 128 "real" bits of security. Use of the higher security 256-bit output will slow down the algorithm by about 1/3 (32 bytes per application of Hash512 versus 48 bytes per application of Hash512). 6.) Other non-algorithmic changes have been made to the code, in keeping with various criticisms and comments. A 128 bit output should provide adequate security for most commercial applications (barring discovery of some unexpected weakness in the algorithm). Where higher security is desired, the 256-bit output size can be used. Version 1.4 differs from Version 1.3 only in the wording of the export notice. Version 1.3 forbids export entirely. Version 1.3 fixes a security bug in handling short files (64 bytes or less). Such files should use the length of the file as a parameter to the hash, to prevent two files of different lengths from producing the same hash value if one file is a prefix of another. This had been done for long files (greater than 64 bytes in length) but was overlooked for short files. In addition, Version 1.3 improves the way in which the parameter is mixed into the hash. In essence, the change mixes in the parameter one more time. Although a similar effect can be achieved by increasing the security parameter by 1 (e.g., from 2 to 3) this also increases the amount of computation required by 50%. Version 1.3 also makes some more changes in the notices that accompany the code. Version 1.2 makes no changes in the code. Only the notices that accompany the code have changed, and some changes in the comments. Version 1.1 added the routine 'convertBytes' to convert an array of 'char' into an array of unsigned long int. This conversion is a no-op on the SUN and many other computers, but will have an effect on the VAX and computers with 'backwards' byte ordering. It will also SLOW DOWN THE HASH FUNCTION, so it should be removed whenever possible if speed is an issue. This program reads from the standard input until EOF is reached (the first 'read' that does not return a full buffer of data). The data on the standard input is 'hashed' with a cryptographically secure one-way hash function (also known as a 'message digest', 'fingerprint', 'Manipulation Detection Code' or 'MDC'). The hash is then printed on the standard output. The input can be of any size. The output is either 128 bits printed as 32 characters in hex, or 256 bits printed as 64 characters in hex. The primary use of one-way hash functions is to determine if there have been any unauthorized, malicious, or accidental changes made to a file. For example, if an executable program file produces the hash '209884c4 2e89d967 5456ac0e 61269550', then any change to that program file will cause the hash to be changed. Thus, the tampering can be detected by comparing the current output value with the previously computed (and presumably correct) output value. Hash512 is the centrol routine in this program. It is used in this program in a linear fashion -- i.e., a sequential file is hashed down by repeated applications of Hash512. Changing a single bit in the file would then require completely re-computing the hash from the point of change onward. Hash512 can be used in a tree-structured fashion to authenticate a large table of data. This would imply that changing a single bit would not force a complete re-computation of the hash value, but would instead require only log n re-computations of Hash512 to 'patch up' the changes along the path from the root to the changed leaf entry. A tree-structured application also has the advantage that any single entry in the table can subsequently be authenticated by someone who knows only the 'authentication path' from the root of the tree to the leaf entry. These concepts are discussed more thoroughly in 'Secrecy, Authentication, and Public Key Systems' by Ralph C. Merkle, UMI Research Press, 1982 (see particularly Chapter 2, 'One Way Hash Functions'). The use of a tree-structured pattern of applications of a one-way hash function is covered by U.S. Patent #4,309,569, 'Method of Providing Digital Signatures' (contact Stanford University, Office of Technology Licensing). At the present time (July 31, 1989) the author knows of no method for 'breaking' this one-way function, (i.e., finding two input files that produce the same output value). The algorithm has undergone some review for security. Further review is expected. Use of this algorithm for production use is not recomended at this time. Note that we are specifically examining the security of Hash512 with a 512-bit input and a 128-bit output, and Hash512 with a 512-bit input and a 256-bit output. Use of other sizes is not recomended at this time. In particular, we recomend against the use of output sizes smaller than 128 bits, and recomend against the use of an input that is less than 2 (two) times the size of the output. When the input size equals the output size, Snefru suffers a serious degradation in security (an observation due to Coppersmith). If anyone using this program finds two different inputs that produce the same output, please contact Ralph C. Merkle via E-mail (merkle@xerox.com) or via normal mail at: Xerox PARC 3333 Coyote Hill Road Palo Alto, CA 94304 (415) 494-4000 See the paper 'A Software One Way Hash Function', by Ralph C. Merkle, for a more detailed explanation. The following test cases were taken directly from a terminal, and can be used to verify the correct functioning of an implementation of Snefru. The first input is simply a carriage return. The second input is '1', the third input is '12', etc. The test sequence is repeated with security parameter "4" and with the output size set to "256". % hash 13af7619 ab98d4b5 f5e0a9e6 b26b5452 % hash 1 578c83f8 8fe1f6a8 c119d2ba 3a9256c2 % hash 12 255468d4 b4bd985b 696a7313 6027fc80 % hash 123 f5339a52 9c4dafc5 34fe3f0d 7a66baf7 % hash 1234 2645ff86 9a6c0ec6 5c49c20d d9050165 % hash 12345 387d2929 8ed52ece 88e64f38 fe4fdb11 % hash 123456 f29f8915 d23a0e02 838cc2e2 75f5dfe7 % hash 1234567 4fb0f76e 9af16a2d 61844b9c e833e18f % hash 12345678 aacc56fc 85910fef e81fc697 6b061f4e % hash 123456789 e6997849 44ed68a1 c762ea1e 90c77967 % hash 4 256 6c504351 ce7f4b7a 93adb29a f9781ff9 2150f157 fee18661 eef511a3 fc83ddf % hash 4 256 1 65d657f8 85ad8b4a b35999cc 3ded8b82 7cf71fa4 25424750 35778910 d6c2e320 % hash 4 256 12 7636f3d1 af139cf9 58f46f99 66221282 a444732a 7de59da5 d3481c6b bd6e7092 % hash 4 256 123 cd3c7163 5b14c7c2 c24be864 4baab592 b8ab5b99 91ee5ee5 b3cf7a7f c6426ad7 % hash 4 256 1234 9ba783a1 290cb21e fe196a02 3286ece5 49394c75 1ddd607e 5d67c4dc 549c62eb % hash 4 256 12345 c9680da8 ef00d2f8 4459a8e9 b50ada71 c63cae6f dcb6f774 f6998783 30a4a1f4 % hash 4 256 123456 7656d389 f980bbe8 94152abe c6dc5f16 faf21c60 3b8f5098 861acf3c c059467b % hash 4 256 1234567 d96eb599 8377bb1d 74a02a2f ac9a85 3175250e 4796af36 36609747 372bba80 % hash 4 256 12345678 b7818f09 2118e98a 140af09a 6cca4e6f 1eba88e7 52c20174 653637c9 d628f33f % hash 4 256 123456789 c2242249 1187baaa 94725400 8dffd5b 38f01557 9f3f2390 50969991 fdc1a810 % Note that 'unsigned long int' MUST be 32 bits Implementor: Ralph C. Merkle */ #define inputFile 0 /* normally set up for standard in */ #define errorFile 2 /* normally set up for standard error */ /* WARNING: Changing the following parameter may affect security in non-obvious ways */ #define inputBlockSize 16 /* size in 32-bit words of an input block to the hash routine */ #define maxOutputBlockSize 8 /* size in 32-bit words of largest output block from the hash routine */ #define bufferSize 3072 /* MUST be 3 * 2**n, n > 5 */ #define bufferSizeInWords 768 /* MUST be bufferSize/4 */ #define maxSBoxCount 8 #define maxSBoxCountDiv2 4 /* has to equal maxSBoxCount/2, of course */ #define maxWordCount 16 /* maximum valid value for wordCount */ /* Note that the following variable should be set either to 4 or to 8. */ int outputBlockSize = 4; /* default to normal 4 32-bit word or 128 bit output size */ /* default to normal 48-byte chunk size. Must be inputBlockSize-outputBlockSize */ int chunkSize = 12; /* initialize the default value for the security parameter */ int securityLevel = 2; int shiftTable[4] = {16, 8, 16, 24}; typedef unsigned long int sBox[256]; /* The standard S boxes must be defined in another file */ extern sBox standardSBoxes[maxSBoxCount]; /* an array needed only for the fast version of HashN -- Hash512. It's safe to ignore this array if you don't need to understand the speeded up version. Note that the 32-bit word specified by 'rotatedRightStandardSBoxes[i][j][k]' is rotated right by i*8 bits */ sBox rotatedRightStandardSBoxes[4][maxSBoxCount]; /* The following routine is a simple error exit routine -- it prints a message and aborts */ void errAbort (s) char *s; { int length; for (length = 0; s[length] != 0; length++); if (write (errorFile, s, length) != length) exit (2); if (write (errorFile, "\n", 1) != 1) exit (2); exit (1); }; /* The following routine converts a byte array to an array of unsigned long int. It is primarily intended to eliminate the byte-ordering problem. VAXes order the bytes in a character array differently than SUN's do. Note that this routine will SLOW DOWN THE HASH FUNCTION */ void convertBytes (buffer, wordBuffer) char buffer[bufferSize]; unsigned long int wordBuffer[bufferSizeInWords]; { int i; unsigned long int t0, t1, t2, t3; /* buffer -- an input buffer of characters wordBuffer -- an output buffer of unsigned long int's */ for (i = 0; i < bufferSizeInWords; i++) { t0 = buffer[4 * i]; t1 = buffer[4 * i + 1]; t2 = buffer[4 * i + 2]; t3 = buffer[4 * i + 3]; t0 &= 0xff; t1 &= 0xff; t2 &= 0xff; t3 &= 0xff; wordBuffer[i] = (t0 << 24) | (t1 << 16) | (t2 << 8) | t3; }; }; void HashN (output, wordCount, input, localSecurityLevel) unsigned long int output[maxOutputBlockSize]; int wordCount; unsigned long int input[]; int localSecurityLevel; { /* Note that we are computing localSecurityLevel * wordCount * 4 rounds. */ unsigned long int mask; unsigned long int block[maxWordCount]; /* holds the array of data being hashed */ unsigned long int SBoxEntry; /* just a temporary */ int shift; int i; int index; int next, last; int byteInWord; mask = wordCount - 1; /* presumes wordCount is a power of 2 */ /* Test for various error conditions and logic problems */ if (localSecurityLevel * 2 > maxSBoxCount) errAbort ("Too few S-boxes"); if (wordCount > maxWordCount) errAbort ("Logic error, wordCount > maxWordCount"); if (wordCount != 16) errAbort ("Security warning, input size not equal to 512 bits"); /* note that this routine will fail spectacularly on 8 byte blocks, hence the following ban. */ if (wordCount < 4) errAbort (" wordCount too small"); if ((wordCount & mask) != 0) errAbort ("logic error, wordCount not a power of 2"); if (outputBlockSize > wordCount) errAbort ("logic error, outputBlockSize is too big"); if ((outputBlockSize != 4) & (outputBlockSize != 8)) errAbort ("Output size neither 128 nor 256 bits"); /* All the error condtions have now been checked -- everything should work smoothly */ /* initialize the block to be encrypted from the input */ for (i = 0; i < wordCount; i++) block[i] = input[i]; for (index = 0; index < localSecurityLevel; index++) { for (byteInWord = 0; byteInWord < 4; byteInWord++) { for (i = 0; i < wordCount; i++) { next = (i + 1) & mask; last = (i + mask) & mask; /* really last = (i-1) MOD wordCount */ SBoxEntry = standardSBoxes[2 * index + ((i / 2) & 1)][block[i] & 0xff]; block[next] ^= SBoxEntry; block[last] ^= SBoxEntry; }; /* Rotate right all 32-bit words in the entire block at once. */ shift = shiftTable[byteInWord]; for (i = 0; i < wordCount; i++) block[i] = (block[i] >> shift) | (block[i] << (32 - shift)); }; /* end of byteInWord going from 0 to 3 */ }; /* end of index going from 0 to localSecurityLevel-1 */ for (i = 0; i < outputBlockSize; i++) output[i] = input[i] ^ block[mask - i]; }; void Hash512 (output, input, localSecurityLevel) unsigned long int output[maxOutputBlockSize]; unsigned long int input[]; int localSecurityLevel; { /* This routine is a specialized version of HashN. It is optimized for speed, and assumes that the input is always 16 words long It hashes 512 bits, hence its name. */ /* You need not try to figure out this routine unless you wish to figure out a fast implementation of Snefru */ /* the following are two pointers to S-boxes */ unsigned long int *SBox0; unsigned long int *SBox1; /* the array 'block' is divided into 16 distinct variables */ unsigned long int block0, block1, block2, block3; unsigned long int block4, block5, block6, block7; unsigned long int block8, block9, block10, block11; unsigned long int block12, block13, block14, block15; unsigned long int SBoxEntry; /* just a temporary */ int index; if (inputBlockSize != 16) errAbort ("Hash512 called with inputBlockSize != 16"); if ((outputBlockSize != 4) & (outputBlockSize != 8)) errAbort ("Hash512 called with outputBlockSize != 4 or 8"); /* initialize the block to be encrypted from the input */ /* Note that in theory block<i> should be kept in register. Not all compilers can do this, even when there are enough registers -- this will degrade performance significantly. */ block0 = input[0]; block1 = input[1]; block2 = input[2]; block3 = input[3]; block4 = input[4]; block5 = input[5]; block6 = input[6]; block7 = input[7]; block8 = input[8]; block9 = input[9]; block10 = input[10]; block11 = input[11]; block12 = input[12]; block13 = input[13]; block14 = input[14]; block15 = input[15]; for (index = 0; index < 2 * localSecurityLevel; index += 2) { /* set up the base address for the two S-box pointers. */ SBox0 = rotatedRightStandardSBoxes[0][index]; SBox1 = SBox0 + 256; /* In the following unrolled code, the basic 'assembly language' block that is repeated is: 1 temp1 = shift(block<i>, shiftConstant) 2 temp2 = temp1 & 0x3fc 3 temp3 = SBox<0 or 1> + temp2 4 temp4 = *temp3 5 block<i-1> ^= temp4 6 block<i+1> ^= temp4 In step 1, we simply shift the ith 32-bit block to bring the 8-bit byte into the right position. Note that we will also build-in a left-shift by 2 bits at this stage, to eliminate the left shift required later because we are indexing into an array of 4-byte table entries. In step 2, we mask off the desired 8 bits. Note that 0x3fc is simply 0xff << 2. In step 3, we use a normal integer add to compute the actual address of the S-box entry. Note that one of two pointers is used, as appropriate. Temp3 then holds the actual byte address of the desired S-box entry. In step 4, we load the 4-byte S-box entry. In steps 5 and 6, we XOR the loaded S-box entry with both the previous and the next 32-bit entries in the 'block' array. Typical optimizing comilers might fail to put all the block<i> variables into registers. This can result in significant performance degradation. Also, most compilers will use a separate left-shift-by-2 after masking off the needed 8 bits, but the performance degradation caused by this oversight should be modest. */ SBoxEntry = SBox0[block0 & 0xff]; block1 ^= SBoxEntry; block15 ^= SBoxEntry; SBoxEntry = SBox0[block1 & 0xff]; block2 ^= SBoxEntry; block0 ^= SBoxEntry; SBoxEntry = SBox1[block2 & 0xff]; block3 ^= SBoxEntry; block1 ^= SBoxEntry; SBoxEntry = SBox1[block3 & 0xff]; block4 ^= SBoxEntry; block2 ^= SBoxEntry; SBoxEntry = SBox0[block4 & 0xff]; block5 ^= SBoxEntry; block3 ^= SBoxEntry; SBoxEntry = SBox0[block5 & 0xff]; block6 ^= SBoxEntry; block4 ^= SBoxEntry; SBoxEntry = SBox1[block6 & 0xff]; block7 ^= SBoxEntry; block5 ^= SBoxEntry; SBoxEntry = SBox1[block7 & 0xff]; block8 ^= SBoxEntry; block6 ^= SBoxEntry; SBoxEntry = SBox0[block8 & 0xff]; block9 ^= SBoxEntry; block7 ^= SBoxEntry; SBoxEntry = SBox0[block9 & 0xff]; block10 ^= SBoxEntry; block8 ^= SBoxEntry; SBoxEntry = SBox1[block10 & 0xff]; block11 ^= SBoxEntry; block9 ^= SBoxEntry; SBoxEntry = SBox1[block11 & 0xff]; block12 ^= SBoxEntry; block10 ^= SBoxEntry; SBoxEntry = SBox0[block12 & 0xff]; block13 ^= SBoxEntry; block11 ^= SBoxEntry; SBoxEntry = SBox0[block13 & 0xff]; block14 ^= SBoxEntry; block12 ^= SBoxEntry; SBoxEntry = SBox1[block14 & 0xff]; block15 ^= SBoxEntry; block13 ^= SBoxEntry; SBoxEntry = SBox1[block15 & 0xff]; block0 ^= SBoxEntry; block14 ^= SBoxEntry; /* SBox0 = rotatedRightStandardSBoxes[2][index]; */ SBox0 += 2 * maxSBoxCount * 256; SBox1 = SBox0 + 256; SBoxEntry = SBox0[(block0 >> 16) & 0xff]; block1 ^= SBoxEntry; block15 ^= SBoxEntry; SBoxEntry = SBox0[(block1 >> 16) & 0xff]; block2 ^= SBoxEntry; block0 ^= SBoxEntry; SBoxEntry = SBox1[(block2 >> 16) & 0xff]; block3 ^= SBoxEntry; block1 ^= SBoxEntry; SBoxEntry = SBox1[(block3 >> 16) & 0xff]; block4 ^= SBoxEntry; block2 ^= SBoxEntry; SBoxEntry = SBox0[(block4 >> 16) & 0xff]; block5 ^= SBoxEntry; block3 ^= SBoxEntry; SBoxEntry = SBox0[(block5 >> 16) & 0xff]; block6 ^= SBoxEntry; block4 ^= SBoxEntry; SBoxEntry = SBox1[(block6 >> 16) & 0xff]; block7 ^= SBoxEntry; block5 ^= SBoxEntry; SBoxEntry = SBox1[(block7 >> 16) & 0xff]; block8 ^= SBoxEntry; block6 ^= SBoxEntry; SBoxEntry = SBox0[(block8 >> 16) & 0xff]; block9 ^= SBoxEntry; block7 ^= SBoxEntry; SBoxEntry = SBox0[(block9 >> 16) & 0xff]; block10 ^= SBoxEntry; block8 ^= SBoxEntry; SBoxEntry = SBox1[(block10 >> 16) & 0xff]; block11 ^= SBoxEntry; block9 ^= SBoxEntry; SBoxEntry = SBox1[(block11 >> 16) & 0xff]; block12 ^= SBoxEntry; block10 ^= SBoxEntry; SBoxEntry = SBox0[(block12 >> 16) & 0xff]; block13 ^= SBoxEntry; block11 ^= SBoxEntry; SBoxEntry = SBox0[(block13 >> 16) & 0xff]; block14 ^= SBoxEntry; block12 ^= SBoxEntry; SBoxEntry = SBox1[(block14 >> 16) & 0xff]; block15 ^= SBoxEntry; block13 ^= SBoxEntry; SBoxEntry = SBox1[(block15 >> 16) & 0xff]; block0 ^= SBoxEntry; block14 ^= SBoxEntry; /* SBox0 = rotatedRightStandardSBoxes[1][index]; */ SBox0 -= maxSBoxCount * 256; SBox1 = SBox0 + 256; SBoxEntry = SBox0[block0 >> 24]; block1 ^= SBoxEntry; block15 ^= SBoxEntry; SBoxEntry = SBox0[block1 >> 24]; block2 ^= SBoxEntry; block0 ^= SBoxEntry; SBoxEntry = SBox1[block2 >> 24]; block3 ^= SBoxEntry; block1 ^= SBoxEntry; SBoxEntry = SBox1[block3 >> 24]; block4 ^= SBoxEntry; block2 ^= SBoxEntry; SBoxEntry = SBox0[block4 >> 24]; block5 ^= SBoxEntry; block3 ^= SBoxEntry; SBoxEntry = SBox0[block5 >> 24]; block6 ^= SBoxEntry; block4 ^= SBoxEntry; SBoxEntry = SBox1[block6 >> 24]; block7 ^= SBoxEntry; block5 ^= SBoxEntry; SBoxEntry = SBox1[block7 >> 24]; block8 ^= SBoxEntry; block6 ^= SBoxEntry; SBoxEntry = SBox0[block8 >> 24]; block9 ^= SBoxEntry; block7 ^= SBoxEntry; SBoxEntry = SBox0[block9 >> 24]; block10 ^= SBoxEntry; block8 ^= SBoxEntry; SBoxEntry = SBox1[block10 >> 24]; block11 ^= SBoxEntry; block9 ^= SBoxEntry; SBoxEntry = SBox1[block11 >> 24]; block12 ^= SBoxEntry; block10 ^= SBoxEntry; SBoxEntry = SBox0[block12 >> 24]; block13 ^= SBoxEntry; block11 ^= SBoxEntry; SBoxEntry = SBox0[block13 >> 24]; block14 ^= SBoxEntry; block12 ^= SBoxEntry; SBoxEntry = SBox1[block14 >> 24]; block15 ^= SBoxEntry; block13 ^= SBoxEntry; SBoxEntry = SBox1[block15 >> 24]; block0 ^= SBoxEntry; block14 ^= SBoxEntry; /* SBox0 = rotatedRightStandardSBoxes[3][index]; */ SBox0 += 2 * maxSBoxCount * 256; SBox1 = SBox0 + 256; SBoxEntry = SBox0[(block0 >> 8) & 0xff]; block1 ^= SBoxEntry; block15 ^= SBoxEntry; SBoxEntry = SBox0[(block1 >> 8) & 0xff]; block2 ^= SBoxEntry; block0 ^= SBoxEntry; SBoxEntry = SBox1[(block2 >> 8) & 0xff]; block3 ^= SBoxEntry; block1 ^= SBoxEntry; SBoxEntry = SBox1[(block3 >> 8) & 0xff]; block4 ^= SBoxEntry; block2 ^= SBoxEntry; SBoxEntry = SBox0[(block4 >> 8) & 0xff]; block5 ^= SBoxEntry; block3 ^= SBoxEntry; SBoxEntry = SBox0[(block5 >> 8) & 0xff]; block6 ^= SBoxEntry; block4 ^= SBoxEntry; SBoxEntry = SBox1[(block6 >> 8) & 0xff]; block7 ^= SBoxEntry; block5 ^= SBoxEntry; SBoxEntry = SBox1[(block7 >> 8) & 0xff]; block8 ^= SBoxEntry; block6 ^= SBoxEntry; SBoxEntry = SBox0[(block8 >> 8) & 0xff]; block9 ^= SBoxEntry; block7 ^= SBoxEntry; SBoxEntry = SBox0[(block9 >> 8) & 0xff]; block10 ^= SBoxEntry; block8 ^= SBoxEntry; SBoxEntry = SBox1[(block10 >> 8) & 0xff]; block11 ^= SBoxEntry; block9 ^= SBoxEntry; SBoxEntry = SBox1[(block11 >> 8) & 0xff]; block12 ^= SBoxEntry; block10 ^= SBoxEntry; SBoxEntry = SBox0[(block12 >> 8) & 0xff]; block13 ^= SBoxEntry; block11 ^= SBoxEntry; SBoxEntry = SBox0[(block13 >> 8) & 0xff]; block14 ^= SBoxEntry; block12 ^= SBoxEntry; SBoxEntry = SBox1[(block14 >> 8) & 0xff]; block15 ^= SBoxEntry; block13 ^= SBoxEntry; SBoxEntry = SBox1[(block15 >> 8) & 0xff]; block0 ^= SBoxEntry; block14 ^= SBoxEntry; }; /* end of index going from 0 to 2*localSecurityLevel-2 in steps of 2 */ output[0] = input[0] ^ block15; output[1] = input[1] ^ block14; output[2] = input[2] ^ block13; output[3] = input[3] ^ block12; /* generate an extra 128 bits if the output is 256 bits */ if (outputBlockSize == 8) { output[4] = input[4] ^ block11; output[5] = input[5] ^ block10; output[6] = input[6] ^ block9; output[7] = input[7] ^ block8; }; }; /* Hash512twice does exactly that. It hashes 512 bits using both Hash512 and HashN. The output of the two implementations is then compared, and if they differ an error message is issued. This insures that two different quite different C routines compute the same value, and is quite helpful in catching bugs, implementation errors, etc. It should be particularly helpful to the implementor trying to "tune" the hash function for speed, as it provides a constant check on correctness. */ void Hash512twice (output, input, localSecurityLevel) unsigned long int output[maxOutputBlockSize]; unsigned long int input[]; int localSecurityLevel; { unsigned long int out1[maxOutputBlockSize]; unsigned long int out2[maxOutputBlockSize]; int i; HashN (out1, inputBlockSize, input, localSecurityLevel); Hash512 (out2, input, localSecurityLevel); for (i = 0; i < outputBlockSize; i++) if (out1[i] != out2[i]) errAbort (" Hash512 and HashN differ"); for (i = 0; i < outputBlockSize; i++) output[i] = out1[i]; }; /* The main program reads the input, hashes it, and prints the result. Much of the logic in the main program is taken up with the trivia of buffer management, error checking, command-line parameter checking, self-tests, and the like. The actual use of the hash function occupies a modest portion of the overall program. The basic idea is simple. As an example, if H is the hash function that produces either 128-bit (or 256-bit) outputs, and if we pick an input string that is 3 "chunks" long then we are computing: output = H( H( H( H( 0 || chunk[0]) || chunk[1]) || chunk[2]) || bit-length) "bit-length" is a "chunk" sized field into which has been put the length of the input, in bits, right justified. Note that the size of a "chunk" is just the input size minus the output size. "0" is a vector of 0 bits of the same size (in bits) as the output of H (i.e., either 128 or 256 bits). "||" is the concatenation operator, and is used to concatenate the output field of the preceding computation of H with the next "chunk" of bits from the input. "chunk" is an array which holds the input string. The final element of the array is left justified and zero-filled on the right. */ void main (argc, argv) int argc; char *argv[]; { int i; char buffer[bufferSize]; int hitEOF = 0; /* 0 means we haven't hit EOF, 1 means we have */ unsigned long int wordBuffer[bufferSizeInWords]; unsigned long int hash[maxOutputBlockSize]; unsigned long int hashArray[inputBlockSize]; unsigned long int bitCount[2]; /* the 64-bit count of the number of bits in the input */ int byteCount; /* the count of the number of bytes we have in the buffer */ int dataLoc; /* the location of the next block of data we wish to hash down. Note this is the index into an array of 32-bit elements, not bytes */ /* self-test, to make sure everything is okay. */ /* First, test the standard S boxes to make sure they haven't been damaged. */ /* Test to make sure each column is a permutation. */ for (i = 0; i < maxSBoxCount; i++) { char testArray[256]; int testShift = 0; int j; for (testShift = 0; testShift < 32; testShift += 8) { for (j = 0; j < 256; j++) testArray[j] = 0; for (j = 0; j < 256; j++) testArray[(standardSBoxes[i][j] >> testShift) & 0xff]++; for (j = 0; j < 256; j++) if (testArray[j] != 1) errAbort ("Table error -- the standard S box is corrupted"); }; }; /* Okay, the standard S-box hasn't been damaged */ /* Set up the rotated array for the fast hash routine */ { int index; /* ranges over the S box indices */ int rotation; /* ranges over the four possible byte-rotations */ int i; /* ranges over the 256 possible S-box entries */ for (index = 0; index < maxSBoxCount; index++) for (rotation = 0; rotation < 4; rotation++) for (i = 0; i < 256; i++) rotatedRightStandardSBoxes[rotation][index][i] = (standardSBoxes[index][i] >> (rotation * 8)) | (standardSBoxes[index][i] << (32 - rotation * 8)); }; /* Now try hashing something. Note that we're testing both HashN and Hash512 here */ { unsigned long int testInput[inputBlockSize]; unsigned long int testOutput[maxOutputBlockSize]; int j; int k; /* Set output size to 256 bits -- just for this test routine */ outputBlockSize = maxOutputBlockSize; chunkSize = inputBlockSize - outputBlockSize; if (maxOutputBlockSize != 8) errAbort ("The output block size has changed, update the self-test"); if (inputBlockSize != 16) errAbort ("The input block size has changed, update the self-test"); if (maxSBoxCount != 8) errAbort ("Wrong number of S boxes, update the self-test"); for (i = 0; i < inputBlockSize; i++) testInput[i] = 0; /* zero the input */ k = 0; /* zero the pointer into the input buffer */ for (i = 0; i < 50; i++) { Hash512twice (testOutput, testInput, 4); /* Copy the output into a new slot in the input buffer */ for (j = 0; j < maxOutputBlockSize; j++) testInput[k+j] = testOutput[j]; k += maxOutputBlockSize; /* reset pointer into input buffer if it might overflow next time */ if ( (k+maxOutputBlockSize) > inputBlockSize) k=0; }; if ((testOutput[0] != 1967985403) || (testOutput[1] != 2688653266) || (testOutput[2] != 3911883902) || (testOutput[3] != 1117323144) || (testOutput[4] != 4238876879) || (testOutput[5] != 877649382) || (testOutput[6] != 1112396746) || (testOutput[7] != 324992866) ) errAbort ("Test hash of 64 bytes of 0 failed"); }; /* Okay, we can hash at least 50 64-byte values correctly. */ outputBlockSize = 4; /* default is 4 32-bit words, or 128 bits */ chunkSize = inputBlockSize - outputBlockSize; /* Check command line arguments */ if (argc == 3) { /* Two arguments -- generate the Large Economy Size Output of 256 bits */ outputBlockSize = 8; /* 8 32-bit words */ chunkSize = inputBlockSize - outputBlockSize; if ((argv[2][0] != '2') | (argv[2][1] != '5') | (argv[2][2] != '6')) errAbort ("usage: hash <security level> [256]"); argc--; }; if ((bufferSizeInWords % chunkSize) != 0) errAbort ("Buffer size is fouled up"); if (argc > 2) errAbort ("usage: hash [ <security level> [ <output size> ] ]"); else if (argc == 2) { securityLevel = 0; if (argv[1][0] == '2') securityLevel = 2; else if (argv[1][0] == '3') securityLevel = 3; else if (argv[1][0] == '4') securityLevel = 4; if ((argv[1][1] != 0) || (securityLevel == 0)) errAbort ("The security level can only be 2, 3, or 4 (4 is most secure)."); }; /* Apply the one-way hash function to the standard input */ bitCount[0] = 0; bitCount[1] = 0; byteCount = read (inputFile, buffer, bufferSize); if (byteCount < 0) errAbort ("Error on first read from standard input"); if (byteCount != bufferSize) hitEOF = 1; /* set EOF flag true if didn't fill buffer */ bitCount[1] += byteCount * 8; /* increment the total number of bits read */ /* bump the upper 32 bits when the lower 32-bits wraps around */ if (bitCount[1] < (byteCount * 8)) bitCount[0] += 1; /* zero out rest of buffer */ for (i = byteCount; i < bufferSize; i++) buffer[i] = 0; /* following conversion required for machines with byte-ordering unlike the SUN */ convertBytes (buffer, wordBuffer); dataLoc = 0; /* 4-byte-word location in data input buffer */ /* Now we hash it down with multiple applications of Hash512 */ for (i = 0; i < inputBlockSize; i++) hashArray[i] = 0; /* initialize hashArray */ /* Hash each chunk in the input (either 48 byte chunks or 32 byte chunks) -- and keep the result in hashArray. Note that the first 16 (32) bytes of hashArray holds the output of the previous hash computation. */ while (byteCount > 0) { if (dataLoc + chunkSize > bufferSize) errAbort ("logic error, buffer over run"); /* Get the next chunk */ for (i = 0; i < chunkSize; i++) hashArray[outputBlockSize + i] = wordBuffer[dataLoc + i]; /* and hash it in */ Hash512 (hashArray, hashArray, securityLevel); /* increment index to next 48-byte input chunk */ dataLoc += chunkSize; /* decrement the number of bytes left to process */ /* Yes, if byteCount was less than chunkSize this might make byteCount negative. It's ok, it's caught in the following "if" statement */ byteCount -= chunkSize * 4; /* Out of data -- read some more */ if (byteCount <= 0) { if (hitEOF == 1) byteCount = 0; else { if (byteCount != 0) errAbort ("Logic error near EOF"); byteCount = read (inputFile, buffer, bufferSize); if (byteCount < 0) errAbort ("Error while reading from input"); if (byteCount != bufferSize) hitEOF = 1; }; bitCount[1] += byteCount * 8; /* increment the bit-count */ /* bump the upper 32 bits when the lower 32-bits wraps around */ if (bitCount[1] < (byteCount * 8)) bitCount[0] += 1; /* zero out rest of buffer */ for (i = byteCount; i < bufferSize; i++) buffer[i] = 0; convertBytes (buffer, wordBuffer); dataLoc = 0; }; }; /* end of while */ /* Zero out the remainder of hashArray */ for (i = 0; i < chunkSize; i++) hashArray[outputBlockSize + i] = 0; /* Put the 64-bit bit-count into the final 64-bits of the block about to be hashed */ hashArray[inputBlockSize - 2] = bitCount[0]; /* upper 32 bits of count */ hashArray[inputBlockSize - 1] = bitCount[1]; /* lower 32 bits of count */ /* Final hash down. */ Hash512 (hash, hashArray, securityLevel); /* 'hash' now holds the hashed result, which is printed on standard output */ for (i = 0; i < outputBlockSize; i++) printf (" %x", hash[i]); printf ("\n"); exit (0); }; *-*-END-*-* sed 's/^ //' >hashComment <<\*-*-END-*-* Following are the hash totals computed for the files "hash2.0.c" and "standardSBoxes2.c". The user should be aware that any change in these files at all (e.g., addition of a blank at the end of any line, conversion of a tab into an equivalent number of spaces, etc) will result in a different value of the checksum. However, in a purely logical sense it does little good to verify the correctness of the contents of a file using as a test the checksum program which has just been copied from that very same file..... Despite this annoying circularity, I have included the checksum values. They at least serve as a guard against simple errors and clumsy efforts at subversion. Also, if the recipient should ever manage to receive a correct copy of the hash total program, then this correct version can be used to verify all further updates, changes, etc. hash2.0.c: a3878c2d c96c6f8e b4026ae2 9669f027 standardSBoxes2.c: 49b91919 1a896a dc976159 c6885587 *-*-END-*-* sed 's/^ //' >stdSBoxes2.c <<\*-*-END-*-* /* This is the standard S box used by the one-way hash function Snefru. See the paper 'A Software One Way Hash Function', by Ralph C. Merkle, for a more detailed explanation. Version 2.0 NOTE: This set of tables is different from Version 1.0. Version 2.0 is recomended, Version 1.0 should not be used. August 1, 1989 Copyright (c) Xerox Corporation 1989 All rights reserved. License to copy and use this software is granted provided that it is identified as the 'Tables For the Xerox Secure Hash Function' in all material mentioning or referencing this software. License is also granted to make and use derivative works provided that such works are identified as 'derived from the Tables For the Xerox Secure Hash Function' in all material mentioning or referencing the derived work. Xerox Corporation makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this software. Implementor: Ralph C. Merkle */ #define maxSBoxCount 8 long int standardSBoxes[maxSBoxCount][256] = { { /* Start of S Box 0 */ 0x64F9001B, /* 0 */ 0xFEDDCDF6, /* 1 */ 0x7C8FF1E2, /* 2 */ 0x11D71514, /* 3 */ 0x8B8C18D3, /* 4 */ 0xDDDF881E, /* 5 */ 0x6EAB5056, /* 6 */ 0x88CED8E1, /* 7 */ 0x49148959, /* 8 */ 0x69C56FD5, /* 9 */ 0xB7994F03, /* 10 */ 0xFBCEE3E, /* 11 */ 0x3C264940, /* 12 */ 0x21557E58, /* 13 */ 0xE14B3FC2, /* 14 */ 0x2E5CF591, /* 15 */ 0xDCEFF8CE, /* 16 */ 0x92A1648, /* 17 */ 0xBE812936, /* 18 */ 0xFF7B0C6A, /* 19 */ 0xD5251037, /* 20 */ 0xAFA448F1, /* 21 */ 0x7DAFC95A, /* 22 */ 0x1EA69C3F, /* 23 */ 0xA417ABE7, /* 24 */ 0x5890E423, /* 25 */ 0xB0CB70C0, /* 26 */ 0xC85025F7, /* 27 */ 0x244D97E3, /* 28 */ 0x1FF3595F, /* 29 */ 0xC4EC6396, /* 30 */ 0x59181E17, /* 31 */ 0xE635B477, /* 32 */ 0x354E7DBF, /* 33 */ 0x796F7753, /* 34 */ 0x66EB52CC, /* 35 */ 0x77C3F995, /* 36 */ 0x32E3A927, /* 37 */ 0x80CCAED6, /* 38 */ 0x4E2BE89D, /* 39 */ 0x375BBD28, /* 40 */ 0xAD1A3D05, /* 41 */ 0x2B1B42B3, /* 42 */ 0x16C44C71, /* 43 */ 0x4D54BFA8, /* 44 */ 0xE57DDC7A, /* 45 */ 0xEC6D8144, /* 46 */ 0x5A71046B, /* 47 */ 0xD8229650, /* 48 */ 0x87FC8F24, /* 49 */ 0xCBC60E09, /* 50 */ 0xB6390366, /* 51 */ 0xD9F76092, /* 52 */ 0xD393A70B, /* 53 */ 0x1D31A08A, /* 54 */ 0x9CD971C9, /* 55 */ 0x5C1EF445, /* 56 */ 0x86FAB694, /* 57 */ 0xFDB44165, /* 58 */ 0x8EAAFCBE, /* 59 */ 0x4BCAC6EB, /* 60 */ 0xFB7A94E5, /* 61 */ 0x5789D04E, /* 62 */ 0xFA13CF35, /* 63 */ 0x236B8DA9, /* 64 */ 0x4133F000, /* 65 */ 0x6224261C, /* 66 */ 0xF412F23B, /* 67 */ 0xE75E56A4, /* 68 */ 0x30022116, /* 69 */ 0xBAF17F1F, /* 70 */ 0xD09872F9, /* 71 */ 0xC1A3699C, /* 72 */ 0xF1E802AA, /* 73 */ 0xDD145DC, /* 74 */ 0x4FDCE093, /* 75 */ 0x8D8412F0, /* 76 */ 0x6CD0F376, /* 77 */ 0x3DE6B73D, /* 78 */ 0x84BA737F, /* 79 */ 0xB43A30F2, /* 80 */ 0x44569F69, /* 81 */ 0xE4EACA, /* 82 */ 0xB58DE3B0, /* 83 */ 0x959113C8, /* 84 */ 0xD62EFEE9, /* 85 */ 0x90861F83, /* 86 */ 0xCED69874, /* 87 */ 0x2F793CEE, /* 88 */ 0xE8571C30, /* 89 */ 0x483665D1, /* 90 */ 0xAB07B031, /* 91 */ 0x914C844F, /* 92 */ 0x15BF3BE8, /* 93 */ 0x2C3F2A9A, /* 94 */ 0x9EB95FD4, /* 95 */ 0x92E7472D, /* 96 */ 0x2297CC5B, /* 97 */ 0xEE5F2782, /* 98 */ 0x5377B562, /* 99 */ 0xDB8EBBCF, /* 100 */ 0xF961DEDD, /* 101 */ 0xC59B5C60, /* 102 */ 0x1BD3910D, /* 103 */ 0x26D206AD, /* 104 */ 0xB28514D8, /* 105 */ 0x5ECF6B52, /* 106 */ 0x7FEA78BB, /* 107 */ 0x504879AC, /* 108 */ 0xED34A884, /* 109 */ 0x36E51D3C, /* 110 */ 0x1753741D, /* 111 */ 0x8C47CAED, /* 112 */ 0x9D0A40EF, /* 113 */ 0x3145E221, /* 114 */ 0xDA27EB70, /* 115 */ 0xDF730BA3, /* 116 */ 0x183C8789, /* 117 */ 0x739AC0A6, /* 118 */ 0x9A58DFC6, /* 119 */ 0x54B134C1, /* 120 */ 0xAC3E242E, /* 121 */ 0xCC493902, /* 122 */ 0x7B2DDA99, /* 123 */ 0x8F15BC01, /* 124 */ 0x29FD38C7, /* 125 */ 0x27D5318F, /* 126 */ 0x604AAFF5, /* 127 */ 0xF29C6818, /* 128 */ 0xC38AA2EC, /* 129 */ 0x1019D4C3, /* 130 */ 0xA8FB936E, /* 131 */ 0x20ED7B39, /* 132 */ 0xB686119, /* 133 */ 0x89A0906F, /* 134 */ 0x1CC7829E, /* 135 */ 0x9952EF4B, /* 136 */ 0x850E9E8C, /* 137 */ 0xCD063A90, /* 138 */ 0x67002F8E, /* 139 */ 0xCFAC8CB7, /* 140 */ 0xEAA24B11, /* 141 */ 0x988B4E6C, /* 142 */ 0x46F066DF, /* 143 */ 0xCA7EEC08, /* 144 */ 0xC7BBA664, /* 145 */ 0x831D17BD, /* 146 */ 0x63F575E6, /* 147 */ 0x9764350E, /* 148 */ 0x47870D42, /* 149 */ 0x26CA4A2, /* 150 */ 0x8167D587, /* 151 */ 0x61B6ADAB, /* 152 */ 0xAA6564D2, /* 153 */ 0x70DA237B, /* 154 */ 0x25E1C74A, /* 155 */ 0xA1C901A0, /* 156 */ 0xEB0A5DA, /* 157 */ 0x7670F741, /* 158 */ 0x51C05AEA, /* 159 */ 0x933DFA32, /* 160 */ 0x759FF1A, /* 161 */ 0x56010AB8, /* 162 */ 0x5FDECB78, /* 163 */ 0x3F32EDF8, /* 164 */ 0xAEBEDBB9, /* 165 */ 0x39F8326D, /* 166 */ 0xD20858C5, /* 167 */ 0x9B638BE4, /* 168 */ 0xA572C80A, /* 169 */ 0x28E0A19F, /* 170 */ 0x432099FC, /* 171 */ 0x3A37C3CD, /* 172 */ 0xBF95C585, /* 173 */ 0xB392C12A, /* 174 */ 0x6AA707D7, /* 175 */ 0x52F66A61, /* 176 */ 0x12D483B1, /* 177 */ 0x96435B5E, /* 178 */ 0x3E75802B, /* 179 */ 0x3BA52B33, /* 180 */ 0xA99F51A5, /* 181 */ 0xBDA1E157, /* 182 */ 0x78C2E70C, /* 183 */ 0xFCAE7CE0, /* 184 */ 0xD1602267, /* 185 */ 0x2AFFAC4D, /* 186 */ 0x4A510947, /* 187 */ 0xAB2B83A, /* 188 */ 0x7A04E579, /* 189 */ 0x340DFD80, /* 190 */ 0xB916E922, /* 191 */ 0xE29D5E9B, /* 192 */ 0xF5624AF4, /* 193 */ 0x4CA9D9AF, /* 194 */ 0x6BBD2CFE, /* 195 */ 0xE3B7F620, /* 196 */ 0xC2746E07, /* 197 */ 0x5B42B9B6, /* 198 */ 0xA06919BC, /* 199 */ 0xF0F2C40F, /* 200 */ 0x72217AB5, /* 201 */ 0x14C19DF3, /* 202 */ 0xF3802DAE, /* 203 */ 0xE094BEB4, /* 204 */ 0xA2101AFF, /* 205 */ 0x529575D, /* 206 */ 0x55CDB27C, /* 207 */ 0xA33BDDB2, /* 208 */ 0x6528B37D, /* 209 */ 0x740C05DB, /* 210 */ 0xE96A62C4, /* 211 */ 0x40782846, /* 212 */ 0x6D30D706, /* 213 */ 0xBBF48E2C, /* 214 */ 0xBCE2D3DE, /* 215 */ 0x49E37FA, /* 216 */ 0x1B5E634, /* 217 */ 0x2D886D8D, /* 218 */ 0x7E5A2E7E, /* 219 */ 0xD7412013, /* 220 */ 0x6E90F97, /* 221 */ 0xE45D3EBA, /* 222 */ 0xB8AD3386, /* 223 */ 0x13051B25, /* 224 */ 0xC035354, /* 225 */ 0x71C89B75, /* 226 */ 0xC638FBD0, /* 227 */ 0x197F11A1, /* 228 */ 0xEF0F08FB, /* 229 */ 0xF8448651, /* 230 */ 0x38409563, /* 231 */ 0x452F4443, /* 232 */ 0x5D464D55, /* 233 */ 0x3D8764C, /* 234 */ 0xB1B8D638, /* 235 */ 0xA70BBA2F, /* 236 */ 0x94B3D210, /* 237 */ 0xEB6692A7, /* 238 */ 0xD409C2D9, /* 239 */ 0x68838526, /* 240 */ 0xA6DB8A15, /* 241 */ 0x751F6C98, /* 242 */ 0xDE769A88, /* 243 */ 0xC9EE4668, /* 244 */ 0x1A82A373, /* 245 */ 0x896AA49, /* 246 */ 0x42233681, /* 247 */ 0xF62C55CB, /* 248 */ 0x9F1C5404, /* 249 */ 0xF74FB15C, /* 250 */ 0xC06E4312, /* 251 */ 0x6FFE5D72, /* 252 */ 0x8AA8678B, /* 253 */ 0x337CD129, /* 254 */ 0x8211CEFD /* 255 */ /* End of S Box 0 */ }, { /* Start of S Box 1 */ 0x74A1D09, /* 0 */ 0x52A10E5A, /* 1 */ 0x9275A3F8, /* 2 */ 0x4B82506C, /* 3 */ 0x37DF7E1B, /* 4 */ 0x4C78B3C5, /* 5 */ 0xCEFAB1DA, /* 6 */ 0xF472267E, /* 7 */ 0xB63045F6, /* 8 */ 0xD66A1FC0, /* 9 */ 0x400298E3, /* 10 */ 0x27E60C94, /* 11 */ 0x87D2F1B8, /* 12 */ 0xDF9E56CC, /* 13 */ 0x45CD1803, /* 14 */ 0x1D35E098, /* 15 */ 0xCCE7C736, /* 16 */ 0x3483BF1, /* 17 */ 0x1F7307D7, /* 18 */ 0xC6E8F948, /* 19 */ 0xE613C111, /* 20 */ 0x3955C6FF, /* 21 */ 0x1170ED7C, /* 22 */ 0x8E95DA41, /* 23 */ 0x99C31BF4, /* 24 */ 0xA4DA8021, /* 25 */ 0x7B5F94FB, /* 26 */ 0xDD0DA51F, /* 27 */ 0x6562AA77, /* 28 */ 0x556BCB23, /* 29 */ 0xDB1BACC6, /* 30 */ 0x798040B9, /* 31 */ 0xBFE5378F, /* 32 */ 0x731D55E6, /* 33 */ 0xDAA5BFEE, /* 34 */ 0x389BBC60, /* 35 */ 0x1B33FBA4, /* 36 */ 0x9C567204, /* 37 */ 0x36C26C68, /* 38 */ 0x77EE9D69, /* 39 */ 0x8AEB3E88, /* 40 */ 0x2D50B5CE, /* 41 */ 0x9579E790, /* 42 */ 0x42B13CFC, /* 43 */ 0x33FBD32B, /* 44 */ 0xEE0503A7, /* 45 */ 0xB5862824, /* 46 */ 0x15E41EAD, /* 47 */ 0xC8412EF7, /* 48 */ 0x9D441275, /* 49 */ 0x2FCEC582, /* 50 */ 0x5FF483B7, /* 51 */ 0x8F3931DF, /* 52 */ 0x2E5D2A7B, /* 53 */ 0x49467BF9, /* 54 */ 0x653DEA9, /* 55 */ 0x2684CE35, /* 56 */ 0x7E655E5C, /* 57 */ 0xF12771D8, /* 58 */ 0xBB15CC67, /* 59 */ 0xAB097CA1, /* 60 */ 0x983DCF52, /* 61 */ 0x10DDF026, /* 62 */ 0x21267F57, /* 63 */ 0x2C58F6B4, /* 64 */ 0x31043265, /* 65 */ 0xBAB8C01, /* 66 */ 0xD5492099, /* 67 */ 0xACAAE619, /* 68 */ 0x944CE54A, /* 69 */ 0xF2D13D39, /* 70 */ 0xADD3FC32, /* 71 */ 0xCDA08A40, /* 72 */ 0xE2B0D451, /* 73 */ 0x9EFE08AE, /* 74 */ 0xB9D50FD2, /* 75 */ 0xEA5CD7FD, /* 76 */ 0xC9A749DD, /* 77 */ 0x13EA2253, /* 78 */ 0x832DEBAA, /* 79 */ 0x24BE640F, /* 80 */ 0xE03E926A, /* 81 */ 0x29E01CDE, /* 82 */ 0x8BF59F18, /* 83 */ 0xF9D00B6, /* 84 */ 0xE1238B46, /* 85 */ 0x1E7D8E34, /* 86 */ 0x93619ADB, /* 87 */ 0x76B32F9F, /* 88 */ 0xBD972CEC, /* 89 */ 0xE31FA976, /* 90 */ 0xA68FBB10, /* 91 */ 0xFB3BA49D, /* 92 */ 0x8587C41D, /* 93 */ 0xA5ADD1D0, /* 94 */ 0xF3CF84BF, /* 95 */ 0xD4E11150, /* 96 */ 0xD9FFA6BC, /* 97 */ 0xC3F6018C, /* 98 */ 0xAEF10572, /* 99 */ 0x74A64B2F, /* 100 */ 0xE7DC9559, /* 101 */ 0x2AAE35D5, /* 102 */ 0x5B6F587F, /* 103 */ 0xA9E353FE, /* 104 */ 0xCA4FB674, /* 105 */ 0x4BA24A8, /* 106 */ 0xE5C6875F, /* 107 */ 0xDCBC6266, /* 108 */ 0x6BC5C03F, /* 109 */ 0x661EEF02, /* 110 */ 0xED740BAB, /* 111 */ 0x58E34E4, /* 112 */ 0xB7E946CF, /* 113 */ 0x88698125, /* 114 */ 0x72EC48ED, /* 115 */ 0xB11073A3, /* 116 */ 0xA13485EB, /* 117 */ 0xA2A2429C, /* 118 */ 0xFA407547, /* 119 */ 0x50B76713, /* 120 */ 0x5418C37D, /* 121 */ 0x96192DA5, /* 122 */ 0x170BB04B, /* 123 */ 0x518A021E, /* 124 */ 0xB0AC13D1, /* 125 */ 0x963FA2A, /* 126 */ 0x4A6E10E1, /* 127 */ 0x58472BDC, /* 128 */ 0xF7F8D962, /* 129 */ 0x979139EA, /* 130 */ 0x8D856538, /* 131 */ 0xC0997042, /* 132 */ 0x48324D7A, /* 133 */ 0x447623CB, /* 134 */ 0x8CBBE364, /* 135 */ 0x6E0C6B0E, /* 136 */ 0xD36D63B0, /* 137 */ 0x3F244C84, /* 138 */ 0x3542C971, /* 139 */ 0x2B228DC1, /* 140 */ 0xCB0325BB, /* 141 */ 0xF8C0D6E9, /* 142 */ 0xDE11066B, /* 143 */ 0xA8649327, /* 144 */ 0xFC31F83E, /* 145 */ 0x7DD80406, /* 146 */ 0xF916DD61, /* 147 */ 0xD89F79D3, /* 148 */ 0x615144C2, /* 149 */ 0xEBB45D31, /* 150 */ 0x28002958, /* 151 */ 0x56890A37, /* 152 */ 0xF05B3808, /* 153 */ 0x123AE844, /* 154 */ 0x86839E16, /* 155 */ 0x914B0D83, /* 156 */ 0xC506B43C, /* 157 */ 0xCF3CBA5E, /* 158 */ 0x7C60F5C9, /* 159 */ 0x22DEB2A0, /* 160 */ 0x5D9C2715, /* 161 */ 0xC77BA0EF, /* 162 */ 0x4F45360B, /* 163 */ 0xC1017D8B, /* 164 */ 0xE45ADC29, /* 165 */ 0xA759909B, /* 166 */ 0x412CD293, /* 167 */ 0xD7D796B1, /* 168 */ 0xC8FF30, /* 169 */ 0x23A34A80, /* 170 */ 0x4EC15C91, /* 171 */ 0x714E78B5, /* 172 */ 0x47B9E42E, /* 173 */ 0x78F3EA4D, /* 174 */ 0x7F078F5B, /* 175 */ 0x346C593A, /* 176 */ 0xA3A87A1A, /* 177 */ 0x9BCBFE12, /* 178 */ 0x3D439963, /* 179 */ 0xB2EF6D8E, /* 180 */ 0xB8D46028, /* 181 */ 0x6C2FD5CA, /* 182 */ 0x62675256, /* 183 */ 0x1F2A2F3, /* 184 */ 0xBC96AE0A, /* 185 */ 0x709A8920, /* 186 */ 0xB4146E87, /* 187 */ 0x6308B9E2, /* 188 */ 0x64BDA7BA, /* 189 */ 0xAFED6892, /* 190 */ 0x6037F2A2, /* 191 */ 0xF52969E0, /* 192 */ 0xADB43A6, /* 193 */ 0x82811400, /* 194 */ 0x90D0BDF0, /* 195 */ 0x19C9549E, /* 196 */ 0x203F6A73, /* 197 */ 0x1ACCAF4F, /* 198 */ 0x89714E6D, /* 199 */ 0x164D4705, /* 200 */ 0x67665F07, /* 201 */ 0xEC206170, /* 202 */ 0xC2182B2, /* 203 */ 0xA02B9C81, /* 204 */ 0x53289722, /* 205 */ 0xF6A97686, /* 206 */ 0x140E4179, /* 207 */ 0x9F778849, /* 208 */ 0x9A88E15D, /* 209 */ 0x25CADB54, /* 210 */ 0xD157F36F, /* 211 */ 0x32A421C3, /* 212 */ 0xB368E98A, /* 213 */ 0x5A92CD0D, /* 214 */ 0x757AA8D4, /* 215 */ 0xC20AC278, /* 216 */ 0x8B551C7, /* 217 */ 0x849491E8, /* 218 */ 0x4DC75AD6, /* 219 */ 0x697C33BE, /* 220 */ 0xBAF0CA33, /* 221 */ 0x46125B4E, /* 222 */ 0x59D677B3, /* 223 */ 0x30D9C8F2, /* 224 */ 0xD0AF860C, /* 225 */ 0x1C7FD0FA, /* 226 */ 0xFE0FF72C, /* 227 */ 0x5C8D6F43, /* 228 */ 0x57FDEC3B, /* 229 */ 0x6AB6AD97, /* 230 */ 0xD22ADF89, /* 231 */ 0x18171785, /* 232 */ 0x2BFE22D, /* 233 */ 0x6DB80917, /* 234 */ 0x80B216AF, /* 235 */ 0xE85E4F9A, /* 236 */ 0x7A1C306E, /* 237 */ 0x6FC49BF5, /* 238 */ 0x3AF7A11C, /* 239 */ 0x81E215E7, /* 240 */ 0x68363FCD, /* 241 */ 0x3E9357C8, /* 242 */ 0xEF52FD55, /* 243 */ 0x3B8BAB4C, /* 244 */ 0x3C8CF495, /* 245 */ 0xBEFCEEBD, /* 246 */ 0xFD25B714, /* 247 */ 0xC498D83D, /* 248 */ 0xD2E1A8D, /* 249 */ 0xE9F966AC, /* 250 */ 0xE387445, /* 251 */ 0x435419E5, /* 252 */ 0x5E7EBEC4, /* 253 */ 0xAA90B8D9, /* 254 */ 0xFF1A3A96}, /* 255 */ { /* Start of S-box 2 */ 0x4A8FE4E3, /* 0 */ 0xF27D99CD, /* 1 */ 0xD04A40CA, /* 2 */ 0xCB5FF194, /* 3 */ 0x3668275A, /* 4 */ 0xFF4816BE, /* 5 */ 0xA78B394C, /* 6 */ 0x4C6BE9DB, /* 7 */ 0x4EEC38D2, /* 8 */ 0x4296EC80, /* 9 */ 0xCDCE96F8, /* 10 */ 0x888C2F38, /* 11 */ 0xE75508F5, /* 12 */ 0x7B916414, /* 13 */ 0x60AA14A, /* 14 */ 0xA214F327, /* 15 */ 0xBE608DAF, /* 16 */ 0x1EBBDEC2, /* 17 */ 0x61F98CE9, /* 18 */ 0xE92156FE, /* 19 */ 0x4F22D7A3, /* 20 */ 0x3F76A8D9, /* 21 */ 0x559A4B33, /* 22 */ 0x38AD2959, /* 23 */ 0xF3F17E9E, /* 24 */ 0x85E1BA91, /* 25 */ 0xE5EBA6FB, /* 26 */ 0x73DCD48C, /* 27 */ 0xF5C3FF78, /* 28 */ 0x481B6058, /* 29 */ 0x8A3297F7, /* 30 */ 0x8F1F3BF4, /* 31 */ 0x93785AB2, /* 32 */ 0x477A4A5B, /* 33 */ 0x6334EB5D, /* 34 */ 0x6D251B2E, /* 35 */ 0x74A9102D, /* 36 */ 0x7E38FFA, /* 37 */ 0x915C9C62, /* 38 */ 0xCCC275EA, /* 39 */ 0x6BE273EC, /* 40 */ 0x3EBDDD70, /* 41 */ 0xD895796C, /* 42 */ 0xDC54A91B, /* 43 */ 0xC9AFDF81, /* 44 */ 0x23633F73, /* 45 */ 0x275119B4, /* 46 */ 0xB19F6B67, /* 47 */ 0x50756E22, /* 48 */ 0x2BB152E2, /* 49 */ 0x76EA46A2, /* 50 */ 0xA353E232, /* 51 */ 0x2F596AD6, /* 52 */ 0xB1EDB0B, /* 53 */ 0x2D3D9A4, /* 54 */ 0x78B47843, /* 55 */ 0x64893E90, /* 56 */ 0x40F0CAAD, /* 57 */ 0xF68D3AD7, /* 58 */ 0x46FD1707, /* 59 */ 0x1C9C67EF, /* 60 */ 0xB5E086DE, /* 61 */ 0x96EE6CA6, /* 62 */ 0x9AA34774, /* 63 */ 0x1BA4F48A, /* 64 */ 0x8D01ABFD, /* 65 */ 0x183EE1F6, /* 66 */ 0x5FF8AA7A, /* 67 */ 0x17E4FAAE, /* 68 */ 0x303983B0, /* 69 */ 0x6C08668B, /* 70 */ 0xD4AC4382, /* 71 */ 0xE6C5849F, /* 72 */ 0x92FEFB53, /* 73 */ 0xC1CAC4CE, /* 74 */ 0x43501388, /* 75 */ 0x441118CF, /* 76 */ 0xEC4FB308, /* 77 */ 0x53A08E86, /* 78 */ 0x9E0FE0C5, /* 79 */ 0xF91C1525, /* 80 */ 0xAC45BE05, /* 81 */ 0xD7987CB5, /* 82 */ 0x49BA1487, /* 83 */ 0x57938940, /* 84 */ 0xD5877648, /* 85 */ 0xA958727F, /* 86 */ 0x58DFE3C3, /* 87 */ 0xF436CF77, /* 88 */ 0x399E4D11, /* 89 */ 0xF0A5BFA9, /* 90 */ 0xEF61A33B, /* 91 */ 0xA64CAC60, /* 92 */ 0x4A8D0BA, /* 93 */ 0x30DD572, /* 94 */ 0xB83D320F, /* 95 */ 0xCAB23045, /* 96 */ 0xE366F2F0, /* 97 */ 0x815D008D, /* 98 */ 0xC897A43A, /* 99 */ 0x1D352DF3, /* 100 */ 0xB9CC571D, /* 101 */ 0x8BF38744, /* 102 */ 0x72209092, /* 103 */ 0xEBA124EB, /* 104 */ 0xFB99CE5E, /* 105 */ 0x3BB94293, /* 106 */ 0x28DA549C, /* 107 */ 0xAAB8A228, /* 108 */ 0xA4197785, /* 109 */ 0x33C70296, /* 110 */ 0x25F6259B, /* 111 */ 0x5C85DA21, /* 112 */ 0xDF15BDEE, /* 113 */ 0x15B7C7E8, /* 114 */ 0xE2ABEF75, /* 115 */ 0xFCC19BC1, /* 116 */ 0x417FF868, /* 117 */ 0x14884434, /* 118 */ 0x62825179, /* 119 */ 0xC6D5C11C, /* 120 */ 0xE4705DC, /* 121 */ 0x22700DE0, /* 122 */ 0xD3D2AF18, /* 123 */ 0x9BE822A0, /* 124 */ 0x35B669F1, /* 125 */ 0xC42BB55C, /* 126 */ 0xA801252, /* 127 */ 0x115BF0FC, /* 128 */ 0x3CD7D856, /* 129 */ 0xB43F5F9D, /* 130 */ 0xC2306516, /* 131 */ 0xA1231C47, /* 132 */ 0xF149207E, /* 133 */ 0x5209A795, /* 134 */ 0x34B3CCD8, /* 135 */ 0x67AEFE54, /* 136 */ 0x2C83924E, /* 137 */ 0x6662CBAC, /* 138 */ 0x5EEDD161, /* 139 */ 0x84E681AA, /* 140 */ 0x5D57D26B, /* 141 */ 0xFA465CC4, /* 142 */ 0x7E3AC3A8, /* 143 */ 0xBF7C0CC6, /* 144 */ 0xE18A9AA1, /* 145 */ 0xC32F0A6F, /* 146 */ 0xB22CC00D, /* 147 */ 0x3D280369, /* 148 */ 0x994E554F, /* 149 */ 0x68F480D3, /* 150 */ 0xADCFF5E6, /* 151 */ 0x3A8EB265, /* 152 */ 0x83269831, /* 153 */ 0xBD568A09, /* 154 */ 0x4BC8AE6A, /* 155 */ 0x69F56D2B, /* 156 */ 0xF17EAC8, /* 157 */ 0x772EB6C7, /* 158 */ 0x9F41343C, /* 159 */ 0xAB1D0742, /* 160 */ 0x826A6F50, /* 161 */ 0xFEA2097C, /* 162 */ 0x1912C283, /* 163 */ 0xCE185899, /* 164 */ 0xE4444839, /* 165 */ 0x2D8635D5, /* 166 */ 0x65D0B1FF, /* 167 */ 0x865A7F17, /* 168 */ 0x326D9FB1, /* 169 */ 0x59E52820, /* 170 */ 0x90ADE1, /* 171 */ 0x753C7149, /* 172 */ 0x9DDD8B98, /* 173 */ 0xA5A691DA, /* 174 */ 0xD0382BB, /* 175 */ 0x8904C930, /* 176 */ 0x86CB000, /* 177 */ 0x6E69D3BD, /* 178 */ 0x24D4E7A7, /* 179 */ 0x5244FD0, /* 180 */ 0x101A5E0C, /* 181 */ 0x6A947DCB, /* 182 */ 0xE840F77B, /* 183 */ 0x7D0C5003, /* 184 */ 0x7C370F1F, /* 185 */ 0x805245ED, /* 186 */ 0xE05E3D3F, /* 187 */ 0x7906880E, /* 188 */ 0xBABFCD35, /* 189 */ 0x1A7EC697, /* 190 */ 0x8C052324, /* 191 */ 0xC6EC8DF, /* 192 */ 0xD129A589, /* 193 */ 0xC7A75B02, /* 194 */ 0x12D81DE7, /* 195 */ 0xD9BE2A66, /* 196 */ 0x1F4263AB, /* 197 */ 0xDE73FDB6, /* 198 */ 0x2A00680A, /* 199 */ 0x56649E36, /* 200 */ 0x3133ED55, /* 201 */ 0x90FA0BF2, /* 202 */ 0x2910A02A, /* 203 */ 0x949D9D46, /* 204 */ 0xA0D1DCDD, /* 205 */ 0xCFC9B7D4, /* 206 */ 0xD2677BE5, /* 207 */ 0x95CB36B3, /* 208 */ 0x13CD9410, /* 209 */ 0xDBF73313, /* 210 */ 0xB7C6E8C0, /* 211 */ 0xF781414B, /* 212 */ 0x510B016D, /* 213 */ 0xB0DE1157, /* 214 */ 0xD6B0F62C, /* 215 */ 0xBB074ECC, /* 216 */ 0x7F1395B7, /* 217 */ 0xEE792CF9, /* 218 */ 0xEA6FD63E, /* 219 */ 0x5BD6938E, /* 220 */ 0xAF02FC64, /* 221 */ 0xDAB57AB8, /* 222 */ 0x8EDB3784, /* 223 */ 0x8716318F, /* 224 */ 0x164D1A01, /* 225 */ 0x26F26141, /* 226 */ 0xB372E6B9, /* 227 */ 0xF8FC2B06, /* 228 */ 0x7AC00E04, /* 229 */ 0x3727B89A, /* 230 */ 0x97E9BCA5, /* 231 */ 0x9C2A742F, /* 232 */ 0xBC3B1F7D, /* 233 */ 0x7165B471, /* 234 */ 0x609B4C29, /* 235 */ 0x20925351, /* 236 */ 0x5AE72112, /* 237 */ 0x454BE5D1, /* 238 */ 0xC0FFB95F, /* 239 */ 0xDD0EF919, /* 240 */ 0x6F2D70C9, /* 241 */ 0x974C5BF, /* 242 */ 0x98AA6263, /* 243 */ 0x1D91E4D, /* 244 */ 0x2184BB6E, /* 245 */ 0x70C43C1E, /* 246 */ 0x4D435915, /* 247 */ 0xAE7B8523, /* 248 */ 0xB6FB06BC, /* 249 */ 0x5431EE76, /* 250 */ 0xFDBC5D26, /* 251 */ 0xED77493D, /* 252 */ 0xC5712EE4, /* 253 */ 0xA8380437, /* 254 */ 0x2EEF261A}, /* 255 */ { /* Start of S Box 3 */ 0x5A79392B, /* 0 */ 0xB8AF32C2, /* 1 */ 0x41F7720A, /* 2 */ 0x833A61EC, /* 3 */ 0x13DFEDAC, /* 4 */ 0xC4990BC4, /* 5 */ 0xDC0F54BC, /* 6 */ 0xFEDD5E88, /* 7 */ 0x80DA1881, /* 8 */ 0x4DEA1AFD, /* 9 */ 0xFD402CC6, /* 10 */ 0xAE67CC7A, /* 11 */ 0xC5238525, /* 12 */ 0x8EA01254, /* 13 */ 0xB56B9BD5, /* 14 */ 0x862FBD6D, /* 15 */ 0xAC8575D3, /* 16 */ 0x6FBA3714, /* 17 */ 0xDA7EBF46, /* 18 */ 0x59CD5238, /* 19 */ 0x8AC9DBFE, /* 20 */ 0x353729FC, /* 21 */ 0xE497D7F2, /* 22 */ 0xC3AB84E0, /* 23 */ 0xF05A114B, /* 24 */ 0x7B887A75, /* 25 */ 0xEDC603DD, /* 26 */ 0x5E6FE680, /* 27 */ 0x2C84B399, /* 28 */ 0x884EB1DA, /* 29 */ 0x1CB8C8BF, /* 30 */ 0xAA51098A, /* 31 */ 0xC862231C, /* 32 */ 0x8BAC2221, /* 33 */ 0x21B387E5, /* 34 */ 0x208A430D, /* 35 */ 0x2A3F0F8B, /* 36 */ 0xA5FF9CD2, /* 37 */ 0x6012A2EA, /* 38 */ 0x147A9EE7, /* 39 */ 0xF62A501D, /* 40 */ 0xB4B2E51A, /* 41 */ 0x3EF3484C, /* 42 */ 0xC0253C59, /* 43 */ 0x2B82B536, /* 44 */ 0xAA9696B, /* 45 */ 0xBE0C109B, /* 46 */ 0xC70B7929, /* 47 */ 0xCE3E8A19, /* 48 */ 0x2F66950E, /* 49 */ 0x459F1C2C, /* 50 */ 0xE68FB93D, /* 51 */ 0xA3C3FF3E, /* 52 */ 0x62B45C62, /* 53 */ 0x300991CB, /* 54 */ 0x1914C57, /* 55 */ 0x7F7BC06A, /* 56 */ 0x182831F5, /* 57 */ 0xE7B74BCA, /* 58 */ 0xFA50F6D0, /* 59 */ 0x523CAA61, /* 60 */ 0xE3A7CF05, /* 61 */ 0xE9E41311, /* 62 */ 0x280A21D1, /* 63 */ 0x6A4297E1, /* 64 */ 0xF24DC67E, /* 65 */ 0xFC3189E6, /* 66 */ 0xB72BF34F, /* 67 */ 0x4B1E67AF, /* 68 */ 0x543402CE, /* 69 */ 0x79A59867, /* 70 */ 0x648E02A, /* 71 */ 0xA3AC17, /* 72 */ 0xC6208D35, /* 73 */ 0x6E7F5F76, /* 74 */ 0xA45BB4BE, /* 75 */ 0xF168FA63, /* 76 */ 0x3F4125F3, /* 77 */ 0xF311406F, /* 78 */ 0x2706565, /* 79 */ 0xBFE58022, /* 80 */ 0xCFCFDD9, /* 81 */ 0x735A7F7, /* 82 */ 0x8F049092, /* 83 */ 0xD98EDC27, /* 84 */ 0xF5C5D55C, /* 85 */ 0xE0F201DB, /* 86 */ 0xDCAFC9A, /* 87 */ 0x7727FB79, /* 88 */ 0xAF43ABF4, /* 89 */ 0x26E938C1, /* 90 */ 0x401B26A6, /* 91 */ 0x900720FA, /* 92 */ 0x2752D97B, /* 93 */ 0xCFF1D1B3, /* 94 */ 0xA9D9E424, /* 95 */ 0x42DB99AB, /* 96 */ 0x6CF8BE5F, /* 97 */ 0xE82CEBE3, /* 98 */ 0x3AFB733B, /* 99 */ 0x6B734EB6, /* 100 */ 0x1036414A, /* 101 */ 0x975F667C, /* 102 */ 0x49D6377, /* 103 */ 0xBA587C60, /* 104 */ 0xB1D10483, /* 105 */ 0xDE1AEFCC, /* 106 */ 0x1129D055, /* 107 */ 0x72051E91, /* 108 */ 0x6946D623, /* 109 */ 0xF9E86EA7, /* 110 */ 0x48768C00, /* 111 */ 0xB0166C93, /* 112 */ 0x9956BBF0, /* 113 */ 0x1F1F6D84, /* 114 */ 0xFB15E18E, /* 115 */ 0x33B495D, /* 116 */ 0x56E3362E, /* 117 */ 0x4F44C53C, /* 118 */ 0x747CBA51, /* 119 */ 0x89D37872, /* 120 */ 0x5D9C331B, /* 121 */ 0xD2EF9FA8, /* 122 */ 0x254917F8, /* 123 */ 0x1B106F47, /* 124 */ 0x37D75553, /* 125 */ 0xB3F053B0, /* 126 */ 0x7DCCD8EF, /* 127 */ 0xD30EB802, /* 128 */ 0x5889F42D, /* 129 */ 0x610206D7, /* 130 */ 0x1A7D34A1, /* 131 */ 0x92D87DD8, /* 132 */ 0xE5F4A315, /* 133 */ 0xD1CF0E71, /* 134 */ 0xB22DFE45, /* 135 */ 0xB901E8EB, /* 136 */ 0xFC0CE5E, /* 137 */ 0x2EFA60C9, /* 138 */ 0x2DE74290, /* 139 */ 0x36D0C906, /* 140 */ 0x381C70E4, /* 141 */ 0x4C6DA5B5, /* 142 */ 0x3D81A682, /* 143 */ 0x7E381F34, /* 144 */ 0x396C4F52, /* 145 */ 0x95AD5901, /* 146 */ 0x1DB50C5A, /* 147 */ 0x29982E9E, /* 148 */ 0x1557689F, /* 149 */ 0x3471EE42, /* 150 */ 0xD7E2F7C0, /* 151 */ 0x8795A1E2, /* 152 */ 0xBC324D8D, /* 153 */ 0xE224C3C8, /* 154 */ 0x12837E39, /* 155 */ 0xCDEE3D74, /* 156 */ 0x7AD2143F, /* 157 */ 0xE13D40C, /* 158 */ 0x78BD4A68, /* 159 */ 0xA2EB194D, /* 160 */ 0xDB9451F9, /* 161 */ 0x859B71DC, /* 162 */ 0x5C4F5B89, /* 163 */ 0xCA14A8A4, /* 164 */ 0xEF92F003, /* 165 */ 0x16741D98, /* 166 */ 0x33AA4444, /* 167 */ 0x9E967FBB, /* 168 */ 0x92E3020, /* 169 */ 0xD86A35B8, /* 170 */ 0x8CC17B10, /* 171 */ 0xE1BF08AE, /* 172 */ 0x55693FC5, /* 173 */ 0x7680AD13, /* 174 */ 0x1E6546E8, /* 175 */ 0x23B6E7B9, /* 176 */ 0xEE77A4B2, /* 177 */ 0x8ED0533, /* 178 */ 0x44FD2895, /* 179 */ 0xB6393B69, /* 180 */ 0x5D6CACF, /* 181 */ 0x9819B209, /* 182 */ 0xECBBB72F, /* 183 */ 0x9A75779C, /* 184 */ 0xEAEC0749, /* 185 */ 0x94A65AEE, /* 186 */ 0xBDF52DC3, /* 187 */ 0xD6A25D04, /* 188 */ 0x82008E4E, /* 189 */ 0xA6DE160F, /* 190 */ 0x9B036AFB, /* 191 */ 0x228B3A66, /* 192 */ 0x5FB10A70, /* 193 */ 0xCC338B58, /* 194 */ 0x5378A9DF, /* 195 */ 0xC908BCA9, /* 196 */ 0x4959E25B, /* 197 */ 0x46909A97, /* 198 */ 0x66AE8F6E, /* 199 */ 0xDD0683E9, /* 200 */ 0x65F994B4, /* 201 */ 0x6426CDA5, /* 202 */ 0xC24B8840, /* 203 */ 0x32539DA0, /* 204 */ 0x63175650, /* 205 */ 0xD0C815FF, /* 206 */ 0x50CBC41E, /* 207 */ 0xF7C774A3, /* 208 */ 0x31B0C231, /* 209 */ 0x8D0D8116, /* 210 */ 0x24BEF16C, /* 211 */ 0xD555D256, /* 212 */ 0xDF47EA8C, /* 213 */ 0x6D21ECCD, /* 214 */ 0xA887A012, /* 215 */ 0x84542AED, /* 216 */ 0xA7B9C1BD, /* 217 */ 0x914C1BB1, /* 218 */ 0xA0D5B67D, /* 219 */ 0x438CE937, /* 220 */ 0x7030F873, /* 221 */ 0x71F6B0C7, /* 222 */ 0x574576BA, /* 223 */ 0xF8BC4541, /* 224 */ 0x9C61D348, /* 225 */ 0x1960579D, /* 226 */ 0x17C4DAAD, /* 227 */ 0x96A4CB0B, /* 228 */ 0xC193F2F6, /* 229 */ 0x756EAFA2, /* 230 */ 0x7C1D2F94, /* 231 */ 0xF4FE2B43, /* 232 */ 0xCB86E33A, /* 233 */ 0xEBD4C728, /* 234 */ 0x9D18AE64, /* 235 */ 0x9FE13E30, /* 236 */ 0x3CE0F5DE, /* 237 */ 0xABA1F985, /* 238 */ 0xADDC2718, /* 239 */ 0x68CE6278, /* 240 */ 0xD45E241F, /* 241 */ 0xA15C82B7, /* 242 */ 0x3B2293D4, /* 243 */ 0x739EDD32, /* 244 */ 0x674A6BF1, /* 245 */ 0x5B5D587F, /* 246 */ 0x4772DEAA, /* 247 */ 0x4A63968F, /* 248 */ 0xBE68686, /* 249 */ 0x513D6426, /* 250 */ 0x939A4787, /* 251 */ 0xBBA89296, /* 252 */ 0x4EC20007, /* 253 */ 0x818D0D08, /* 254 */ 0xFF64DFD6}, /* 255 */ { /* Start of S Box 4 */ 0xCB2297CB, /* 0 */ 0xDB48A144, /* 1 */ 0xA16CBE4B, /* 2 */ 0xBBEA1D6C, /* 3 */ 0x5AF6B6B7, /* 4 */ 0x8A8110B6, /* 5 */ 0xF9236EF9, /* 6 */ 0xC98F83E6, /* 7 */ 0xF9C65B8, /* 8 */ 0x252D4A89, /* 9 */ 0xA497F068, /* 10 */ 0xA5D7ED2D, /* 11 */ 0x94C22845, /* 12 */ 0x9DA1C8C4, /* 13 */ 0xE27C2E2E, /* 14 */ 0x6E8BA2B4, /* 15 */ 0xC3DD17FB, /* 16 */ 0x498CD482, /* 17 */ 0xDFE6A9F, /* 18 */ 0xB0705829, /* 19 */ 0x9A1E6DC1, /* 20 */ 0xF829717C, /* 21 */ 0x7BB8E3A, /* 22 */ 0xDA3C0B02, /* 23 */ 0x1AF82FC7, /* 24 */ 0x73B70955, /* 25 */ 0x7A04379C, /* 26 */ 0x5EE20A28, /* 27 */ 0x83712AE5, /* 28 */ 0xF4C47C6D, /* 29 */ 0xDF72BA56, /* 30 */ 0xD794858D, /* 31 */ 0x8C0CF709, /* 32 */ 0x18F0F390, /* 33 */ 0xB6C69B35, /* 34 */ 0xBF2F01DB, /* 35 */ 0x2FA74DCA, /* 36 */ 0xD0CD9127, /* 37 */ 0xBDE66CEC, /* 38 */ 0x3DEEBD46, /* 39 */ 0x57C88FC3, /* 40 */ 0xCEE1406F, /* 41 */ 0x66385A, /* 42 */ 0xF3C3444F, /* 43 */ 0x3A79D5D5, /* 44 */ 0x75751EB9, /* 45 */ 0x3E7F8185, /* 46 */ 0x521C2605, /* 47 */ 0xE1AAAB6E, /* 48 */ 0x38EBB80F, /* 49 */ 0xBEE7E904, /* 50 */ 0x61CB9647, /* 51 */ 0xEA54904E, /* 52 */ 0x5AE00E4, /* 53 */ 0x2D7AC65F, /* 54 */ 0x87751A1, /* 55 */ 0xDCD82915, /* 56 */ 0x921EE16, /* 57 */ 0xDD86D33B, /* 58 */ 0xD6BD491A, /* 59 */ 0x40FBADF0, /* 60 */ 0x4232CBD2, /* 61 */ 0x33808D10, /* 62 */ 0x39098C42, /* 63 */ 0x193F3199, /* 64 */ 0xBC1E47A, /* 65 */ 0x4A82B149, /* 66 */ 0x2B65A8A, /* 67 */ 0x104CDC8E, /* 68 */ 0x24A8F52C, /* 69 */ 0x685C6077, /* 70 */ 0xC79F95C9, /* 71 */ 0x1D11FE50, /* 72 */ 0xC08DAFCD, /* 73 */ 0x7B1A9A03, /* 74 */ 0x1C1F11D8, /* 75 */ 0x84250E7F, /* 76 */ 0x979DB248, /* 77 */ 0xEBDC0501, /* 78 */ 0xB9553395, /* 79 */ 0xE3C05EA8, /* 80 */ 0xB1E51C4C, /* 81 */ 0x13B0E681, /* 82 */ 0x3B407766, /* 83 */ 0x36DB3087, /* 84 */ 0xEE17C9FC, /* 85 */ 0x6C53ECF2, /* 86 */ 0xADCCC58F, /* 87 */ 0xC427660B, /* 88 */ 0xEFD5867D, /* 89 */ 0x9B6D54A5, /* 90 */ 0x6FF1AEFF, /* 91 */ 0x8E787952, /* 92 */ 0x9E2BFFE0, /* 93 */ 0x8761D034, /* 94 */ 0xE00BDBAD, /* 95 */ 0xAE99A8D3, /* 96 */ 0xCC03F6E2, /* 97 */ 0xFD0ED807, /* 98 */ 0xE508AE3, /* 99 */ 0xB74182AB, /* 100 */ 0x4349245D, /* 101 */ 0xD120A465, /* 102 */ 0xB246A641, /* 103 */ 0xAF3B7AB0, /* 104 */ 0x2A6488BB, /* 105 */ 0x4B3A0D1F, /* 106 */ 0xE7C7E58C, /* 107 */ 0x3FAFF2EB, /* 108 */ 0x90445FFD, /* 109 */ 0xCF38C393, /* 110 */ 0x995D07E7, /* 111 */ 0xF24F1B36, /* 112 */ 0x356F6891, /* 113 */ 0x6D6EBCBE, /* 114 */ 0x8DA9E262, /* 115 */ 0x50FD520E, /* 116 */ 0x5BCA9E1E, /* 117 */ 0x37472CF3, /* 118 */ 0x69075057, /* 119 */ 0x7EC5FDED, /* 120 */ 0xCAB892A, /* 121 */ 0xFB2412BA, /* 122 */ 0x1728DEBF, /* 123 */ 0xA000A988, /* 124 */ 0xD843CE79, /* 125 */ 0x42E20DD, /* 126 */ 0x4FE8F853, /* 127 */ 0x56659C3C, /* 128 */ 0x2739D119, /* 129 */ 0xA78A6120, /* 130 */ 0x80960375, /* 131 */ 0x70420611, /* 132 */ 0x85E09F78, /* 133 */ 0xABD17E96, /* 134 */ 0x1B513EAF, /* 135 */ 0x1E01EB63, /* 136 */ 0x26AD2133, /* 137 */ 0xA890C094, /* 138 */ 0x7613CF60, /* 139 */ 0x817E781B, /* 140 */ 0xA39113D7, /* 141 */ 0xE957FA58, /* 142 */ 0x4131B99E, /* 143 */ 0x28B1EFDA, /* 144 */ 0x66ACFBA7, /* 145 */ 0xFF68944A, /* 146 */ 0x77A44FD1, /* 147 */ 0x7F331522, /* 148 */ 0x59FFB3FA, /* 149 */ 0xA6DF935B, /* 150 */ 0xFA12D9DF, /* 151 */ 0xC6BF6F3F, /* 152 */ 0x89520CF6, /* 153 */ 0x659EDD6A, /* 154 */ 0x544DA739, /* 155 */ 0x8B052538, /* 156 */ 0x7C30EA21, /* 157 */ 0xC2345525, /* 158 */ 0x15927FB2, /* 159 */ 0x144A436B, /* 160 */ 0xBA107B8B, /* 161 */ 0x1219AC97, /* 162 */ 0x6730432, /* 163 */ 0x31831AB3, /* 164 */ 0xC55A5C24, /* 165 */ 0xAA0FCD3E, /* 166 */ 0xE5606BE8, /* 167 */ 0x5C88F19B, /* 168 */ 0x4C0841EE, /* 169 */ 0x1FE37267, /* 170 */ 0x11F9C4F4, /* 171 */ 0x9F1B9DAE, /* 172 */ 0x864E76D0, /* 173 */ 0xE637C731, /* 174 */ 0xD97D23A6, /* 175 */ 0x32F53D5C, /* 176 */ 0xB8161980, /* 177 */ 0x93FA0F84, /* 178 */ 0xCAEF0870, /* 179 */ 0x8874487E, /* 180 */ 0x98F2CC73, /* 181 */ 0x645FB5C6, /* 182 */ 0xCD853659, /* 183 */ 0x2062470D, /* 184 */ 0x16EDE8E9, /* 185 */ 0x6B06DAB5, /* 186 */ 0x78B43900, /* 187 */ 0xFC95B786, /* 188 */ 0x5D8E7DE1, /* 189 */ 0x465B5954, /* 190 */ 0xFE7BA014, /* 191 */ 0xF7D23F7B, /* 192 */ 0x92BC8B18, /* 193 */ 0x3593592, /* 194 */ 0x55CEF4F7, /* 195 */ 0x74B27317, /* 196 */ 0x79DE1FC2, /* 197 */ 0xC8A0BFBD, /* 198 */ 0x229398CC, /* 199 */ 0x62A602CE, /* 200 */ 0xBCB94661, /* 201 */ 0x5336D206, /* 202 */ 0xD2A375FE, /* 203 */ 0x6A6AB483, /* 204 */ 0x4702A5A4, /* 205 */ 0xA2E9D73D, /* 206 */ 0x23A2E0F1, /* 207 */ 0x9189140A, /* 208 */ 0x581D18DC, /* 209 */ 0xB39A922B, /* 210 */ 0x82356212, /* 211 */ 0xD5F432A9, /* 212 */ 0xD356C2A3, /* 213 */ 0x5F765B4D, /* 214 */ 0x450AFCC8, /* 215 */ 0x4415E137, /* 216 */ 0xE8ECDFBC, /* 217 */ 0xED0DE3EA, /* 218 */ 0x60D42B13, /* 219 */ 0xF13DF971, /* 220 */ 0x71FC5DA2, /* 221 */ 0xC1455340, /* 222 */ 0xF087742F, /* 223 */ 0xF55E5751, /* 224 */ 0x67B3C1F8, /* 225 */ 0xAC6B8774, /* 226 */ 0x7DCFAAAC, /* 227 */ 0x95983BC0, /* 228 */ 0x489BB0B1, /* 229 */ 0x2C184223, /* 230 */ 0x964B6726, /* 231 */ 0x2BD3271C, /* 232 */ 0x72266472, /* 233 */ 0xDED64530, /* 234 */ 0xA2AA343, /* 235 */ 0xD4F716A0, /* 236 */ 0xB4DAD6D9, /* 237 */ 0x2184345E, /* 238 */ 0x512C990C, /* 239 */ 0x29D92D08, /* 240 */ 0x2EBE709A, /* 241 */ 0x1144C69, /* 242 */ 0x34584B9D, /* 243 */ 0xE4634ED6, /* 244 */ 0xECC963CF, /* 245 */ 0x3C6984AA, /* 246 */ 0x4ED056EF, /* 247 */ 0x9CA56976, /* 248 */ 0x8F3E80D4, /* 249 */ 0xB5BAE7C5, /* 250 */ 0x30B5CAF5, /* 251 */ 0x63F33A64, /* 252 */ 0xA9E4BBDE, /* 253 */ 0xF6B82298, /* 254 */ 0x4D673C1D}, /* 255 */ { /* Start of S Box 5 */ 0x4B4F1121, /* 0 */ 0xBA183081, /* 1 */ 0xC784F41F, /* 2 */ 0xD17D0BAC, /* 3 */ 0x83D2267, /* 4 */ 0x37B1361E, /* 5 */ 0x3581AD05, /* 6 */ 0xFDA2F6BC, /* 7 */ 0x1E892CDD, /* 8 */ 0xB56D3C3A, /* 9 */ 0x32140E46, /* 10 */ 0x138D8AAB, /* 11 */ 0xE14773D4, /* 12 */ 0x5B0E71DF, /* 13 */ 0x5D1FE055, /* 14 */ 0x3FB991D3, /* 15 */ 0xF1F46C71, /* 16 */ 0xA325988C, /* 17 */ 0x10F66E80, /* 18 */ 0xB1006348, /* 19 */ 0x726A9F60, /* 20 */ 0x3B67F8BA, /* 21 */ 0x4E114EF4, /* 22 */ 0x5C52115, /* 23 */ 0x4C5CA11C, /* 24 */ 0x99E1EFD8, /* 25 */ 0x471B83B3, /* 26 */ 0xCBF7E524, /* 27 */ 0x43AD82F5, /* 28 */ 0x690CA93B, /* 29 */ 0xFAA61BB2, /* 30 */ 0x12A832B5, /* 31 */ 0xB734F943, /* 32 */ 0xBD22AEA7, /* 33 */ 0x88FEC626, /* 34 */ 0x5E80C3E7, /* 35 */ 0xBE3EAF5E, /* 36 */ 0x44617652, /* 37 */ 0xA5724475, /* 38 */ 0xBB3B9695, /* 39 */ 0x7F3FEE8F, /* 40 */ 0x964E7DEB, /* 41 */ 0x518C052D, /* 42 */ 0x2A0BBC2B, /* 43 */ 0xC2175F5C, /* 44 */ 0x9A7B3889, /* 45 */ 0xA70D8D0C, /* 46 */ 0xEACCDD29, /* 47 */ 0xCCCD6658, /* 48 */ 0x34BB25E6, /* 49 */ 0xB8391090, /* 50 */ 0xF651356F, /* 51 */ 0x52987C9E, /* 52 */ 0xC16C1CD, /* 53 */ 0x8E372D3C, /* 54 */ 0x2FC6EBBD, /* 55 */ 0x6E5DA3E3, /* 56 */ 0xB0E27239, /* 57 */ 0x5F685738, /* 58 */ 0x45411786, /* 59 */ 0x67F65F8, /* 60 */ 0x61778B40, /* 61 */ 0x81AB2E65, /* 62 */ 0x14C8F0F9, /* 63 */ 0xA6B7B4CE, /* 64 */ 0x4036EAEC, /* 65 */ 0xBF62B00A, /* 66 */ 0xECFD5E02, /* 67 */ 0x45449A6, /* 68 */ 0xB20AFD28, /* 69 */ 0x2166D273, /* 70 */ 0xD13A863, /* 71 */ 0x89508756, /* 72 */ 0xD51A7530, /* 73 */ 0x2D653F7A, /* 74 */ 0x3CDBDBC3, /* 75 */ 0x80C9DF4F, /* 76 */ 0x3D5812D9, /* 77 */ 0x53FBB1F3, /* 78 */ 0xC0F185C0, /* 79 */ 0x7A3C3D7E, /* 80 */ 0x68646410, /* 81 */ 0x857607A0, /* 82 */ 0x1D12622E, /* 83 */ 0x97F33466, /* 84 */ 0xDB4C9917, /* 85 */ 0x6469607C, /* 86 */ 0x566E043D, /* 87 */ 0x79EF1EDB, /* 88 */ 0x2C05898D, /* 89 */ 0xC9578E25, /* 90 */ 0xCD380101, /* 91 */ 0x46E04377, /* 92 */ 0x7D1CC7A9, /* 93 */ 0x6552B837, /* 94 */ 0x20192608, /* 95 */ 0xB97500C5, /* 96 */ 0xED296B44, /* 97 */ 0x368648B4, /* 98 */ 0x62995CD5, /* 99 */ 0x82731400, /* 100 */ 0xF9AEBD8B, /* 101 */ 0x3844C0C7, /* 102 */ 0x7C2DE794, /* 103 */ 0x33A1A770, /* 104 */ 0x8AE528C2, /* 105 */ 0x5A2BE812, /* 106 */ 0x1F8F4A07, /* 107 */ 0x2B5ED7CA, /* 108 */ 0x937EB564, /* 109 */ 0x6FDA7E11, /* 110 */ 0xE49B5D6C, /* 111 */ 0xB4B3244E, /* 112 */ 0x18AA53A4, /* 113 */ 0x3A061334, /* 114 */ 0x4D6067A3, /* 115 */ 0x83BA5868, /* 116 */ 0x9BDF4DFE, /* 117 */ 0x7449F261, /* 118 */ 0x709F8450, /* 119 */ 0xCAD133CB, /* 120 */ 0xDE941C3F, /* 121 */ 0xF52AE484, /* 122 */ 0x781D77ED, /* 123 */ 0x7E4395F0, /* 124 */ 0xAE103B59, /* 125 */ 0x922331BB, /* 126 */ 0x42CE50C8, /* 127 */ 0xE6F08153, /* 128 */ 0xE7D941D0, /* 129 */ 0x5028ED6B, /* 130 */ 0xB3D2C49B, /* 131 */ 0xAD4D9C3E, /* 132 */ 0xD201FB6E, /* 133 */ 0xA45BD5BE, /* 134 */ 0xFFCB7F4B, /* 135 */ 0x579D7806, /* 136 */ 0xF821BB5B, /* 137 */ 0x59D592AD, /* 138 */ 0xD0BE0C31, /* 139 */ 0xD4E3B676, /* 140 */ 0x107165A, /* 141 */ 0xFE939D2, /* 142 */ 0x49BCAAFD, /* 143 */ 0x55FFCFE5, /* 144 */ 0x2EC1F783, /* 145 */ 0xF39A09A5, /* 146 */ 0x3EB42772, /* 147 */ 0x19B55A5D, /* 148 */ 0x24A0679, /* 149 */ 0x8C83B3F7, /* 150 */ 0x8642BA1D, /* 151 */ 0xACACD9EA, /* 152 */ 0x87D352C4, /* 153 */ 0x60931F45, /* 154 */ 0xA05F97D7, /* 155 */ 0x1CECD42C, /* 156 */ 0xE2FCC87B, /* 157 */ 0xB60F94E2, /* 158 */ 0x67A34B0B, /* 159 */ 0xFCDD40C9, /* 160 */ 0xB150A27, /* 161 */ 0xD3EE9E04, /* 162 */ 0x582E29E9, /* 163 */ 0x4AC22B41, /* 164 */ 0x6AC4E1B8, /* 165 */ 0xBCCAA51A, /* 166 */ 0x237AF30E, /* 167 */ 0xEBC3B709, /* 168 */ 0xC4A59D19, /* 169 */ 0x284BC98A, /* 170 */ 0xE9D41A93, /* 171 */ 0x6BFA2018, /* 172 */ 0x73B2D651, /* 173 */ 0x11F9A2FA, /* 174 */ 0xCE09BFF1, /* 175 */ 0x41A470AA, /* 176 */ 0x25888F22, /* 177 */ 0x77E754E8, /* 178 */ 0xF7330D8E, /* 179 */ 0x158EAB16, /* 180 */ 0xC5D68842, /* 181 */ 0xC685A6F6, /* 182 */ 0xE5B82FDE, /* 183 */ 0x9EA3A96, /* 184 */ 0x6DDE1536, /* 185 */ 0x4FA919DA, /* 186 */ 0x26C0BE9F, /* 187 */ 0x9EED6F69, /* 188 */ 0xF05555F2, /* 189 */ 0xE06FC285, /* 190 */ 0x9CD76D23, /* 191 */ 0xAF452A92, /* 192 */ 0xEFC74CB7, /* 193 */ 0x9D6B4732, /* 194 */ 0x8BE408EE, /* 195 */ 0x22401D0D, /* 196 */ 0xEE6C459D, /* 197 */ 0x7587CB82, /* 198 */ 0xE8746862, /* 199 */ 0x5CBDDE87, /* 200 */ 0x98794278, /* 201 */ 0x31AFB94D, /* 202 */ 0xC11E0F2F, /* 203 */ 0x30E8FC2A, /* 204 */ 0xCF3261EF, /* 205 */ 0x1A3023E1, /* 206 */ 0xAA2F86CF, /* 207 */ 0xF202E24A, /* 208 */ 0x8D08DCFF, /* 209 */ 0x764837C6, /* 210 */ 0xA26374CC, /* 211 */ 0x9F7C3E88, /* 212 */ 0x949CC57D, /* 213 */ 0xDD26A07F, /* 214 */ 0xC39EFAB0, /* 215 */ 0xC8F879A1, /* 216 */ 0xDCE67BB9, /* 217 */ 0xF4B0A435, /* 218 */ 0x912C9AE0, /* 219 */ 0xD85603E4, /* 220 */ 0x953A9BBF, /* 221 */ 0xFB8290D6, /* 222 */ 0xAEBCD5F, /* 223 */ 0x16206A9A, /* 224 */ 0x6C787A14, /* 225 */ 0xD9A0F16A, /* 226 */ 0x29BF4F74, /* 227 */ 0x8F8BCE91, /* 228 */ 0xE5A9354, /* 229 */ 0xAB038CB1, /* 230 */ 0x1B8AD11B, /* 231 */ 0xE327FF49, /* 232 */ 0x53DA20, /* 233 */ 0x90CF51DC, /* 234 */ 0xDA92FE6D, /* 235 */ 0x390CA47, /* 236 */ 0xA8958097, /* 237 */ 0xA9DC5BAF, /* 238 */ 0x3931E3C1, /* 239 */ 0x840446B6, /* 240 */ 0x63D069FB, /* 241 */ 0xD7460299, /* 242 */ 0x7124ECD1, /* 243 */ 0x791E613, /* 244 */ 0x485918FC, /* 245 */ 0xD635D04C, /* 246 */ 0xDF96AC33, /* 247 */ 0x66F2D303, /* 248 */ 0x247056AE, /* 249 */ 0xA1A7B2A8, /* 250 */ 0x27D8CC9C, /* 251 */ 0x17B6E998, /* 252 */ 0x7BF5590F, /* 253 */ 0xFE97F557, /* 254 */ 0x5471D8A2}, /* 255 */ { /* Start of S Box 6 */ 0x83A327A1, /* 0 */ 0x9F379F51, /* 1 */ 0x40A7D007, /* 2 */ 0x11307423, /* 3 */ 0x224587C1, /* 4 */ 0xAC27D63B, /* 5 */ 0x3B7E64EA, /* 6 */ 0x2E1CBFA6, /* 7 */ 0x9996000, /* 8 */ 0x3BC0E2C, /* 9 */ 0xD4C4478A, /* 10 */ 0x4542E0AB, /* 11 */ 0xFEDA26D4, /* 12 */ 0xC1D10FCB, /* 13 */ 0x8252F596, /* 14 */ 0x4494EB5C, /* 15 */ 0xA362F314, /* 16 */ 0xF5BA81FD, /* 17 */ 0x75C3A376, /* 18 */ 0x4CA214CA, /* 19 */ 0xE164DEDD, /* 20 */ 0x5088FA97, /* 21 */ 0x4B0930E0, /* 22 */ 0x2FCFB7E8, /* 23 */ 0x33A6F4B2, /* 24 */ 0xC7E94211, /* 25 */ 0x2D66C774, /* 26 */ 0x43BE8BAE, /* 27 */ 0xC663D445, /* 28 */ 0x908EB130, /* 29 */ 0xF4E3BE15, /* 30 */ 0x63B9D566, /* 31 */ 0x529396B5, /* 32 */ 0x1E1BE743, /* 33 */ 0x4D5FF63F, /* 34 */ 0x985E4A83, /* 35 */ 0x71AB9DF7, /* 36 */ 0xC516C6F5, /* 37 */ 0x85C19AB4, /* 38 */ 0x1F4DAEE4, /* 39 */ 0xF2973431, /* 40 */ 0xB713DC5E, /* 41 */ 0x3F2E159A, /* 42 */ 0xC824DA16, /* 43 */ 0x6BF376A, /* 44 */ 0xB2FE23EC, /* 45 */ 0xE39B1C22, /* 46 */ 0xF1EECB5F, /* 47 */ 0x8E82D52, /* 48 */ 0x565686C2, /* 49 */ 0xAB0AEA93, /* 50 */ 0xFD47219F, /* 51 */ 0xEBDBABD7, /* 52 */ 0x2404A185, /* 53 */ 0x8C7312B9, /* 54 */ 0xA8F2D828, /* 55 */ 0xC8902DA, /* 56 */ 0x65B42B63, /* 57 */ 0xC0BBEF62, /* 58 */ 0x4E3E4CEF, /* 59 */ 0x788F8018, /* 60 */ 0xEE1EBAB7, /* 61 */ 0x93928F9D, /* 62 */ 0x683D2903, /* 63 */ 0xD3B60689, /* 64 */ 0xAFCB0DDC, /* 65 */ 0x88A4C47A, /* 66 */ 0xF6DD9C3D, /* 67 */ 0x7EA5FCA0, /* 68 */ 0x8A6D7244, /* 69 */ 0xBE11F120, /* 70 */ 0x4FF91B8, /* 71 */ 0x8D2DC8C0, /* 72 */ 0x27F97FDB, /* 73 */ 0x7F9E1F47, /* 74 */ 0x1734F0C7, /* 75 */ 0x26F3ED8E, /* 76 */ 0xDF8F2BF, /* 77 */ 0xB0833D9E, /* 78 */ 0xE420A4E5, /* 79 */ 0xA423CAE6, /* 80 */ 0x95616772, /* 81 */ 0x9AE6C049, /* 82 */ 0x75941F2, /* 83 */ 0xD8E12812, /* 84 */ 0xF6F4F, /* 85 */ 0x3C0D6B05, /* 86 */ 0x6CEF921C, /* 87 */ 0xB82BC264, /* 88 */ 0x396CB008, /* 89 */ 0x5D608A6F, /* 90 */ 0x6D7782C8, /* 91 */ 0x186550AA, /* 92 */ 0x6B6FEC09, /* 93 */ 0x28E70B13, /* 94 */ 0x57CE5688, /* 95 */ 0xECD3AF84, /* 96 */ 0x23335A95, /* 97 */ 0x91F40CD2, /* 98 */ 0x7B6A3B26, /* 99 */ 0xBD32B3B6, /* 100 */ 0x3754A6FB, /* 101 */ 0x8ED088F0, /* 102 */ 0xF867E87C, /* 103 */ 0x20851746, /* 104 */ 0x6410F9C6, /* 105 */ 0x35380442, /* 106 */ 0xC2CA10A7, /* 107 */ 0x1ADEA27F, /* 108 */ 0x76BDDD79, /* 109 */ 0x92742CF4, /* 110 */ 0xE98F7EE, /* 111 */ 0x164E931D, /* 112 */ 0xB9C835B3, /* 113 */ 0x69060A99, /* 114 */ 0xB44C531E, /* 115 */ 0xFA7B66FE, /* 116 */ 0xC98A5B53, /* 117 */ 0x7D95AAE9, /* 118 */ 0x302F467B, /* 119 */ 0x74B811DE, /* 120 */ 0xF3866ABD, /* 121 */ 0xB5B3D32D, /* 122 */ 0xFC3157A4, /* 123 */ 0xD251FE19, /* 124 */ 0xB5D8EAC, /* 125 */ 0xDA71FFD5, /* 126 */ 0x47EA05A3, /* 127 */ 0x5C6A9E1, /* 128 */ 0xCA0EE958, /* 129 */ 0x9939034D, /* 130 */ 0x25DC5EDF, /* 131 */ 0x79083CB1, /* 132 */ 0x86768450, /* 133 */ 0xCF757D6D, /* 134 */ 0x5972B6BC, /* 135 */ 0xA78D59C9, /* 136 */ 0xC4AD8D41, /* 137 */ 0x2A362AD3, /* 138 */ 0xD1179991, /* 139 */ 0x601407FF, /* 140 */ 0xDCF50917, /* 141 */ 0x587069D0, /* 142 */ 0xE0821ED6, /* 143 */ 0xDBB59427, /* 144 */ 0x73911A4B, /* 145 */ 0x7C904FC3, /* 146 */ 0x844AFB92, /* 147 */ 0x6F8C955D, /* 148 */ 0xE8C0C5BB, /* 149 */ 0xB67AB987, /* 150 */ 0xA529D96C, /* 151 */ 0xF91F7181, /* 152 */ 0x618B1B06, /* 153 */ 0xE718BB0C, /* 154 */ 0x8BD7615B, /* 155 */ 0xD5A93A59, /* 156 */ 0x54AEF81B, /* 157 */ 0x772136E3, /* 158 */ 0xCE44FD9C, /* 159 */ 0x10CDA57E, /* 160 */ 0x87D66E0B, /* 161 */ 0x3D798967, /* 162 */ 0x1B2C1804, /* 163 */ 0x3EDFBD68, /* 164 */ 0x15F6E62B, /* 165 */ 0xEF68B854, /* 166 */ 0x3896DB35, /* 167 */ 0x12B7B5E2, /* 168 */ 0xCB489029, /* 169 */ 0x9E4F98A5, /* 170 */ 0x62EB77A8, /* 171 */ 0x217C24A2, /* 172 */ 0x964152F6, /* 173 */ 0x49B2080A, /* 174 */ 0x53D23EE7, /* 175 */ 0x48FB6D69, /* 176 */ 0x1903D190, /* 177 */ 0x9449E494, /* 178 */ 0xBF6E7886, /* 179 */ 0xFB356CFA, /* 180 */ 0x3A261365, /* 181 */ 0x424BC1EB, /* 182 */ 0xA1192570, /* 183 */ 0x19CA782, /* 184 */ 0x9D3F7E0E, /* 185 */ 0x9C127575, /* 186 */ 0xEDF02039, /* 187 */ 0xAD57BCCE, /* 188 */ 0x5C153277, /* 189 */ 0x81A84540, /* 190 */ 0xBCAA7356, /* 191 */ 0xCCD59B60, /* 192 */ 0xA62A629B, /* 193 */ 0xA25CCD10, /* 194 */ 0x2B5B65CF, /* 195 */ 0x1C535832, /* 196 */ 0x55FD4E3A, /* 197 */ 0x31D9790D, /* 198 */ 0xF06BC37D, /* 199 */ 0x4AFC1D71, /* 200 */ 0xAEED5533, /* 201 */ 0xBA461634, /* 202 */ 0xBB694B78, /* 203 */ 0x5F3A5C73, /* 204 */ 0x6A3C764A, /* 205 */ 0x8FB0CCA9, /* 206 */ 0xF725684C, /* 207 */ 0x4FE5382F, /* 208 */ 0x1D0163AF, /* 209 */ 0x5AA07A8F, /* 210 */ 0xE205A8ED, /* 211 */ 0xC30BAD38, /* 212 */ 0xFF22CF1F, /* 213 */ 0x72432E2E, /* 214 */ 0x32C2518B, /* 215 */ 0x3487CE4E, /* 216 */ 0x7AE0AC02, /* 217 */ 0x709FA098, /* 218 */ 0xA3B395A, /* 219 */ 0x5B4043F8, /* 220 */ 0xA9E48C36, /* 221 */ 0x149A8521, /* 222 */ 0xD07DEE6B, /* 223 */ 0x46ACD2F3, /* 224 */ 0x8958DFFC, /* 225 */ 0xB3A1223C, /* 226 */ 0xB11D31C4, /* 227 */ 0xCD7F4D3E, /* 228 */ 0xF28E3AD, /* 229 */ 0xE5B100BE, /* 230 */ 0xAAC54824, /* 231 */ 0xE9C9D7BA, /* 232 */ 0x9BD47001, /* 233 */ 0x80F149B0, /* 234 */ 0x66022F0F, /* 235 */ 0x20C4048, /* 236 */ 0x6EFA192A, /* 237 */ 0x67073F8D, /* 238 */ 0x13EC7BF9, /* 239 */ 0x3655011A, /* 240 */ 0xE6AFE157, /* 241 */ 0xD9845F6E, /* 242 */ 0xDECC4425, /* 243 */ 0x511AE2CC, /* 244 */ 0xDF81B4D8, /* 245 */ 0xD7809E55, /* 246 */ 0xD6D883D9, /* 247 */ 0x2CC7978C, /* 248 */ 0x5E787CC5, /* 249 */ 0xDD0033D1, /* 250 */ 0xA050C937, /* 251 */ 0x97F75DCD, /* 252 */ 0x299DE580, /* 253 */ 0x41E2B261, /* 254 */ 0xEA5A54F1}, /* 255 */ { /* Start of S Box 7 */ 0x7E672590, /* 0 */ 0xBEA513BB, /* 1 */ 0x2C906FE6, /* 2 */ 0x86029C2B, /* 3 */ 0x55DC4F74, /* 4 */ 0x553398E, /* 5 */ 0x63E09647, /* 6 */ 0xCAFD0BAB, /* 7 */ 0x264C37DF, /* 8 */ 0x8272210F, /* 9 */ 0x67AFA669, /* 10 */ 0x12D98A5F, /* 11 */ 0x8CAB23C4, /* 12 */ 0x75C68BD1, /* 13 */ 0xC3370470, /* 14 */ 0x33F37F4E, /* 15 */ 0x283992FF, /* 16 */ 0xE73A3A67, /* 17 */ 0x1032F283, /* 18 */ 0xF5AD9FC2, /* 19 */ 0x963F0C5D, /* 20 */ 0x664FBC45, /* 21 */ 0x202BA41C, /* 22 */ 0xC7C02D80, /* 23 */ 0x54731E84, /* 24 */ 0x8A1085F5, /* 25 */ 0x601D80FB, /* 26 */ 0x2F968E55, /* 27 */ 0x35E96812, /* 28 */ 0xE45A8F78, /* 29 */ 0xBD7DE662, /* 30 */ 0x3B6E6EAD, /* 31 */ 0x8097C5EF, /* 32 */ 0x70B6781, /* 33 */ 0xB1E508F3, /* 34 */ 0x24E4FAE3, /* 35 */ 0xB81A7805, /* 36 */ 0xEC0FC918, /* 37 */ 0x43C8774B, /* 38 */ 0x9B2512A9, /* 39 */ 0x2B05AD04, /* 40 */ 0x32C2536F, /* 41 */ 0xEDF236E0, /* 42 */ 0x8BC4B0CF, /* 43 */ 0xBACEB837, /* 44 */ 0x4535B289, /* 45 */ 0xD0E94C3, /* 46 */ 0xA5A371D0, /* 47 */ 0xAD695A58, /* 48 */ 0x39E3437D, /* 49 */ 0x9186BFFC, /* 50 */ 0x21038C3B, /* 51 */ 0xAA9DFF9, /* 52 */ 0x5D1F06CE, /* 53 */ 0x62DEF8A4, /* 54 */ 0xF740A2B4, /* 55 */ 0xA2575868, /* 56 */ 0x682683C1, /* 57 */ 0xDBB30FAC, /* 58 */ 0x61FE1928, /* 59 */ 0x468A6511, /* 60 */ 0xC61CD5F4, /* 61 */ 0xE54D9800, /* 62 */ 0x6B98D7F7, /* 63 */ 0x8418B6A5, /* 64 */ 0x5F09A5D2, /* 65 */ 0x90B4E80B, /* 66 */ 0x49B2C852, /* 67 */ 0x69F11C77, /* 68 */ 0x17412B7E, /* 69 */ 0x7F6FC0ED, /* 70 */ 0x56838DCC, /* 71 */ 0x6E9546A2, /* 72 */ 0xD0758619, /* 73 */ 0x87B9B9A, /* 74 */ 0xD231A01D, /* 75 */ 0xAF46D415, /* 76 */ 0x97060FD, /* 77 */ 0xD920F657, /* 78 */ 0x882D3F9F, /* 79 */ 0x3AE7C3C9, /* 80 */ 0xE8A00D9B, /* 81 */ 0x4FE67EBE, /* 82 */ 0x2EF80EB2, /* 83 */ 0xC1916B0C, /* 84 */ 0xF4DFFEA0, /* 85 */ 0xB97EB3EB, /* 86 */ 0xFDFF84DD, /* 87 */ 0xFF8B14F1, /* 88 */ 0xE96B0572, /* 89 */ 0xF64B508C, /* 90 */ 0xAE220A6E, /* 91 */ 0x4423AE5A, /* 92 */ 0xC2BECE5E, /* 93 */ 0xDE27567C, /* 94 */ 0xFC935C63, /* 95 */ 0x47075573, /* 96 */ 0xE65B27F0, /* 97 */ 0xE121FD22, /* 98 */ 0xF2668753, /* 99 */ 0x2DEBF5D7, /* 100 */ 0x8347E08D, /* 101 */ 0xAC5EDA03, /* 102 */ 0x2A7CEBE9, /* 103 */ 0x3FE8D92E, /* 104 */ 0x23542FE4, /* 105 */ 0x1FA7BD50, /* 106 */ 0xCF9B4102, /* 107 */ 0x9D0DBA39, /* 108 */ 0x9CB8902A, /* 109 */ 0xA7249D8B, /* 110 */ 0xF6D667A, /* 111 */ 0x5EBFA9EC, /* 112 */ 0x6A594DF2, /* 113 */ 0x79600938, /* 114 */ 0x23B7591, /* 115 */ 0xEA2C79C8, /* 116 */ 0xC99D07EA, /* 117 */ 0x64CB5EE1, /* 118 */ 0x1A9CAB3D, /* 119 */ 0x76DB9527, /* 120 */ 0xC08E012F, /* 121 */ 0x3DFB481A, /* 122 */ 0x872F22E7, /* 123 */ 0x2948D15C, /* 124 */ 0xA4782C79, /* 125 */ 0x6F50D232, /* 126 */ 0x78F0728A, /* 127 */ 0x5A87AAB1, /* 128 */ 0xC4E2C19C, /* 129 */ 0xEE767387, /* 130 */ 0x1B2A1864, /* 131 */ 0x7B8D10D3, /* 132 */ 0xD1713161, /* 133 */ 0xEEAC456, /* 134 */ 0xD8799E06, /* 135 */ 0xB645B548, /* 136 */ 0x4043CB65, /* 137 */ 0xA874FB29, /* 138 */ 0x4B12D030, /* 139 */ 0x7D687413, /* 140 */ 0x18EF9A1F, /* 141 */ 0xD7631D4C, /* 142 */ 0x5829C7DA, /* 143 */ 0xCDFA30FA, /* 144 */ 0xC5084BB0, /* 145 */ 0x92CD20E2, /* 146 */ 0xD4C16940, /* 147 */ 0x3283EC0, /* 148 */ 0xA917813F, /* 149 */ 0x9A587D01, /* 150 */ 0x70041F8F, /* 151 */ 0xDC6AB1DC, /* 152 */ 0xDDAEE3D5, /* 153 */ 0x31829742, /* 154 */ 0x198C022D, /* 155 */ 0x1C9EAFCB, /* 156 */ 0x5BBC6C49, /* 157 */ 0xD3D3293A, /* 158 */ 0x16D50007, /* 159 */ 0x4BB8820, /* 160 */ 0x3C5C2A41, /* 161 */ 0x37EE7AF8, /* 162 */ 0x8EB04025, /* 163 */ 0x9313ECBA, /* 164 */ 0xBFFC4799, /* 165 */ 0x8955A744, /* 166 */ 0xEF85D633, /* 167 */ 0x504499A7, /* 168 */ 0xA6CA6A86, /* 169 */ 0xBB3D3297, /* 170 */ 0xB34A8236, /* 171 */ 0x6DCCBE4F, /* 172 */ 0x6143394, /* 173 */ 0xCE19FC7B, /* 174 */ 0xCCC3C6C6, /* 175 */ 0xE36254AE, /* 176 */ 0x77B7EDA1, /* 177 */ 0xA133DD9E, /* 178 */ 0xEBF9356A, /* 179 */ 0x513CCF88, /* 180 */ 0xE2A1B417, /* 181 */ 0x972EE5BD, /* 182 */ 0x853824CD, /* 183 */ 0x5752F4EE, /* 184 */ 0x6C1142E8, /* 185 */ 0x3EA4F309, /* 186 */ 0xB2B5934A, /* 187 */ 0xDFD628AA, /* 188 */ 0x59ACEA3E, /* 189 */ 0xA01EB92C, /* 190 */ 0x389964BC, /* 191 */ 0xDA305DD4, /* 192 */ 0x19A59B7, /* 193 */ 0x11D2CA93, /* 194 */ 0xFAA6D3B9, /* 195 */ 0x4E772ECA, /* 196 */ 0x72651776, /* 197 */ 0xFB4E5B0E, /* 198 */ 0xA38F91A8, /* 199 */ 0x1D0663B5, /* 200 */ 0x30F4F192, /* 201 */ 0xB50051B6, /* 202 */ 0xB716CCB3, /* 203 */ 0x4ABD1B59, /* 204 */ 0x146C5F26, /* 205 */ 0xF134E2DE, /* 206 */ 0xF67C6C, /* 207 */ 0xB0E1B795, /* 208 */ 0x98AA4EC7, /* 209 */ 0xCC73B34, /* 210 */ 0x654276A3, /* 211 */ 0x8D1BA871, /* 212 */ 0x740A5216, /* 213 */ 0xE0D01A23, /* 214 */ 0x9ED161D6, /* 215 */ 0x9F36A324, /* 216 */ 0x993EBB7F, /* 217 */ 0xFEB9491B, /* 218 */ 0x365DDCDB, /* 219 */ 0x810CFFC5, /* 220 */ 0x71EC0382, /* 221 */ 0x2249E7BF, /* 222 */ 0x48817046, /* 223 */ 0xF3A24A5B, /* 224 */ 0x4288E4D9, /* 225 */ 0xBF5C243, /* 226 */ 0x257FE151, /* 227 */ 0x95B64C0D, /* 228 */ 0x4164F066, /* 229 */ 0xAAF7DB08, /* 230 */ 0x73B1119D, /* 231 */ 0x8F9F7BB8, /* 232 */ 0xD6844596, /* 233 */ 0xF07A34A6, /* 234 */ 0x53943D0A, /* 235 */ 0xF9DD166D, /* 236 */ 0x7A8957AF, /* 237 */ 0xF8BA3CE5, /* 238 */ 0x27C9621E, /* 239 */ 0x5CDAE910, /* 240 */ 0xC8518998, /* 241 */ 0x941538FE, /* 242 */ 0x136115D8, /* 243 */ 0xABA8443C, /* 244 */ 0x4D01F931, /* 245 */ 0x34EDF760, /* 246 */ 0xB45F266B, /* 247 */ 0xD5D4DE14, /* 248 */ 0x52D8AC35, /* 249 */ 0x15CFD885, /* 250 */ 0xCBC5CD21, /* 251 */ 0x4CD76D4D, /* 252 */ 0x7C80EF54, /* 253 */ 0xBC92EE75, /* 254 */ 0x1E56A1F6}/* 255 */ }; *-*-END-*-* sed 's/^ //' >testSBoxes.c <<\*-*-END-*-* /* This program generates and tests the standard S-boxes used by Snefru, the one way hash function. It uses the RAND table of random numbers. This is version 2.0, July 31, 1989. Copyright (c) Xerox Corporation 1989 All rights reserved. License to copy and use this software is granted. License is also granted to make and use derivative works. Xerox Corporation makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind. These notices must be retained in any copies of any part of this software. #define inputFile 0 /* normally standard in */ #define outputFile 1 /* normally standard out */ #define errorFile 2 /* normally standard error */ #define SBoxCount 8 /* number of S boxes in the set of standard S boxes */ /* The random table is the first part of the random digits from the book: 'A Million Random Digits with 100,000 Normal Deviates", by the RAND Corporation, published by the Free Press, 1955. The formatting is similar to the book to allow easy inspection and verification. The random digits are also available on magnetic tape or diskettes from the RAND corporation. Send inquiries to: The RAND Corporation, Computer Information Systems, 1700 Main St., Santa Monica California 90406; ATTN: Jackie McGee */ /* The following two global variables are used only by 'randomDigit' */ /* group location in the table of random digits */ int locationInRANDtable = 0; /* location within a 5-digit group */ int locationIn5DigitGroup = 0; #define sizeOfRANDtableIn5DigitGroups 4810 char RANDtable[sizeOfRANDtableIn5DigitGroups][5] = { /* 0 */ "10097", "32533", "76520", "13586", "34673", "54876", "80959", "09117", "39292", "74945", /* 1 */ "37542", "04805", "64894", "74296", "24805", "24037", "20636", "10402", "00822", "91665", /* 2 */ "08422", "68953", "19645", "09303", "23209", "02560", "15953", "34764", "35080", "33606", /* 3 */ "99019", "02529", "09376", "70715", "38311", "31165", "88676", "74397", "04436", "27659", /* 4 */ "12807", "99970", "80157", "36147", "64032", "36653", "98951", "16877", "12171", "76833", /* 5 */ "66065", "74717", "34072", "76850", "36697", "36170", "65813", "39885", "11199", "29170", /* 6 */ "31060", "10805", "45571", "82406", "35303", "42614", "86799", "07439", "23403", "09732", /* 7 */ "85269", "77602", "02051", "65692", "68665", "74818", "73053", "85247", "18623", "88579", /* 8 */ "63573", "32135", "05325", "47048", "90553", "57548", "28468", "28709", "83491", "25624", /* 9 */ "73796", "45753", "03529", "64778", "35808", "34282", "60935", "20344", "35273", "88435", /* 10 */ "98520", "17767", "14905", "68607", "22109", "40558", "60970", "93433", "50500", "73998", /* 11 */ "11805", "05431", "39808", "27732", "50725", "68248", "29405", "24201", "52775", "67851", /* 12 */ "83452", "99634", "06288", "98083", "13746", "70078", "18475", "40610", "68711", "77817", /* 13 */ "88685", "40200", "86507", "58401", "36766", "67951", "90364", "76493", "29609", "11062", /* 14 */ "99594", "67348", "87517", "64969", "91826", "08928", "93785", "61368", "23478", "34113", /* 15 */ "65481", "17674", "17468", "50950", "58047", "76974", "73039", "57186", "40218", "16544", /* 16 */ "80124", "35635", "17727", "08015", "45318", "22374", "21115", "78253", "14385", "53763", /* 17 */ "74350", "99817", "77402", "77214", "43236", "00210", "45521", "64237", "96286", "02655", /* 18 */ "69916", "26803", "66252", "29148", "36936", "87203", "76621", "13990", "94400", "56418", /* 19 */ "09893", "20505", "14225", "68514", "46427", "56788", "96297", "78822", "54382", "14598", /* 20 */ "91499", "14523", "68479", "27686", "46162", "83554", "94750", "89923", "37089", "20048", /* 21 */ "80336", "94598", "26940", "36858", "70297", "34135", "53140", "33340", "42050", "82341", /* 22 */ "44104", "81949", "85157", "47954", "32979", "26575", "57600", "40881", "22222", "06413", /* 23 */ "12550", "73742", "11100", "02040", "12860", "74697", "96644", "89439", "28707", "25815", /* 24 */ "63606", "49329", "16505", "34484", "40219", "52563", "43651", "77082", "07207", "31790", /* 25 */ "61196", "90446", "26457", "47774", "51924", "33729", "65394", "59593", "42582", "60527", /* 26 */ "15474", "45266", "95270", "79953", "59367", "83848", "82396", "10118", "33211", "59466", /* 27 */ "94557", "28573", "67897", "54387", "54622", "44431", "91190", "42592", "92927", "45973", /* 28 */ "42481", "16213", "97344", "08721", "16868", "48767", "03071", "12059", "25701", "46670", /* 29 */ "23523", "78317", "73208", "89837", "68935", "91416", "26252", "29663", "05522", "82562", /* 30 */ "04493", "52494", "75246", "33824", "45862", "51025", "61962", "79335", "65337", "12472", /* 31 */ "00549", "97654", "64051", "88159", "96119", "63896", "54692", "82391", "23287", "29529", /* 32 */ "35963", "15307", "26898", "09354", "33351", "35462", "77974", "50024", "90103", "39333", /* 33 */ "59808", "08391", "45427", "26842", "83609", "49700", "13021", "24892", "78565", "20106", /* 34 */ "46058", "85236", "01390", "92286", "77281", "44077", "93910", "83647", "70617", "42941", /* 35 */ "32179", "00597", "87379", "25241", "05567", "07007", "86743", "17157", "85394", "11838", /* 36 */ "69234", "61406", "20117", "45204", "15956", "60000", "18743", "92423", "97118", "96338", /* 37 */ "19565", "41430", "01758", "75379", "40419", "21585", "66674", "36806", "84962", "85207", /* 38 */ "45155", "14938", "19476", "07246", "43667", "94543", "59047", "90033", "20826", "69541", /* 39 */ "94864", "31994", "36168", "10851", "34888", "81553", "01540", "35456", "05014", "51176", /* 40 */ "98086", "24826", "45240", "28404", "44999", "08896", "39094", "73407", "35441", "31880", /* 41 */ "33185", "16232", "41941", "50949", "89435", "48581", "88695", "41994", "37548", "73043", /* 42 */ "80951", "00406", "96382", "70774", "20151", "23387", "25016", "25298", "94624", "61171", /* 43 */ "79752", "49140", "71961", "28296", "69861", "02591", "74852", "20539", "00387", "59579", /* 44 */ "18633", "32537", "98145", "06571", "31010", "24674", "05455", "61427", "77938", "91936", /* 45 */ "74029", "43902", "77557", "32270", "97790", "17119", "52527", "58021", "80814", "51748", /* 46 */ "54178", "45611", "80993", "37143", "05335", "12969", "56127", "19255", "36040", "90324", /* 47 */ "11664", "49883", "52079", "84827", "59381", "71539", "09973", "33440", "88461", "23356", /* 48 */ "48324", "77928", "31249", "64710", "02295", "36870", "32307", "57546", "15020", "09994", /* 49 */ "69074", "94138", "87637", "91976", "35584", "04401", "10518", "21615", "01848", "76938", /* 50 */ "09188", "20097", "32825", "39527", "04220", "86304", "83389", "87374", "64278", "58044", /* 51 */ "90045", "85497", "51981", "50654", "94938", "81997", "91870", "76150", "68476", "64659", /* 52 */ "73189", "50207", "47677", "26269", "62290", "64464", "27124", "67018", "41361", "82760", /* 53 */ "75768", "76490", "20971", "87749", "90429", "12272", "95375", "05871", "93823", "43178", /* 54 */ "54016", "44056", "66281", "31003", "00682", "27398", "20714", "53295", "07706", "17813", /* 55 */ "08358", "69910", "78542", "42785", "13661", "58873", "04618", "97553", "31223", "08420", /* 56 */ "28306", "03264", "81333", "10591", "40510", "07893", "32604", "60475", "94119", "01840", /* 57 */ "53840", "86233", "81594", "13628", "51215", "90290", "28466", "68795", "77762", "20791", /* 58 */ "91757", "53741", "61613", "62269", "50263", "90212", "55781", "76514", "83483", "47055", /* 59 */ "89415", "92694", "00397", "58391", "12607", "17646", "48949", "72306", "94541", "37408", /* 60 */ "77513", "03820", "86864", "29901", "68414", "82774", "51908", "13980", "72893", "55507", /* 61 */ "19502", "37174", "69979", "20288", "55210", "29773", "74287", "75251", "65344", "67415", /* 62 */ "21818", "59313", "93278", "81757", "05686", "73156", "07082", "85046", "31853", "38452", /* 63 */ "51474", "66499", "68107", "23621", "94049", "91345", "42836", "09191", "08007", "45449", /* 64 */ "99559", "68331", "62535", "24170", "69777", "12830", "74819", "78142", "43860", "72834", /* 65 */ "33713", "48007", "93584", "72869", "51926", "64721", "58303", "29822", "93174", "93972", /* 66 */ "85274", "86893", "11303", "22970", "28834", "34137", "73515", "90400", "71148", "43643", /* 67 */ "84133", "89640", "44035", "52166", "73852", "70091", "61222", "60561", "62327", "18423", /* 68 */ "56732", "16234", "17395", "96131", "10123", "91622", "85496", "57560", "81604", "18880", /* 69 */ "65138", "56806", "87648", "85261", "34313", "65861", "45875", "21069", "85644", "47277", /* 70 */ "38001", "02176", "81719", "11711", "71602", "92937", "74219", "64049", "65584", "49698", /* 71 */ "37402", "96397", "01304", "77586", "56271", "10086", "47324", "62605", "40030", "37438", /* 72 */ "97125", "40348", "87083", "31417", "21815", "39250", "75237", "62047", "15501", "29578", /* 73 */ "21826", "41134", "47143", "34072", "64638", "85902", "49139", "06441", "03856", "54552", /* 74 */ "73135", "42742", "95719", "09035", "85794", "74296", "08789", "88156", "64691", "19202", /* 75 */ "07638", "77929", "03061", "18072", "96207", "44156", "23821", "99538", "04713", "66994", /* 76 */ "60528", "83441", "07954", "19814", "59175", "20695", "05533", "52139", "61212", "06455", /* 77 */ "83596", "35655", "06958", "92983", "05128", "09719", "77433", "53783", "92301", "50498", /* 78 */ "10850", "62746", "99599", "10507", "13499", "06319", "53075", "71839", "06410", "19362", /* 79 */ "39820", "98952", "43622", "63147", "64421", "80814", "43800", "09351", "31024", "73167", /* 80 */ "59580", "06478", "75569", "78800", "88835", "54486", "23768", "06156", "04111", "08408", /* 81 */ "38508", "07341", "23793", "48763", "90822", "97022", "17719", "04207", "95954", "49953", /* 82 */ "30692", "70668", "94688", "16127", "56196", "80091", "82067", "63400", "05462", "69200", /* 83 */ "65443", "95659", "18288", "27437", "49632", "24041", "08337", "65676", "96299", "90836", /* 84 */ "27267", "50264", "13192", "72294", "07477", "44606", "17985", "48911", "97341", "30358", /* 85 */ "91307", "06991", "19072", "24210", "36699", "53728", "28825", "35793", "28976", "66252", /* 86 */ "68434", "94688", "84473", "13622", "62126", "98408", "12843", "82590", "09815", "93146", /* 87 */ "48908", "15877", "54745", "24591", "35700", "04754", "83824", "52692", "54130", "55160", /* 88 */ "06913", "45197", "42672", "78601", "11883", "09528", "63011", "98901", "14974", "40344", /* 89 */ "10455", "16019", "14210", "33712", "91342", "37821", "88325", "80851", "43667", "70883", /* 90 */ "12883", "97343", "65027", "61184", "04285", "01392", "17974", "15077", "90712", "26769", /* 91 */ "21778", "30976", "38807", "36961", "31649", "42096", "63281", "02023", "08816", "47449", /* 92 */ "19523", "59515", "65122", "59659", "86283", "68258", "69572", "13798", "16435", "91529", /* 93 */ "67245", "52670", "35583", "16563", "79246", "86686", "76463", "34222", "26655", "90802", /* 94 */ "60584", "47377", "07500", "37992", "45134", "26529", "26760", "83637", "41326", "44344", /* 95 */ "53853", "41377", "36066", "94850", "58838", "73859", "49364", "73331", "96240", "43642", /* 96 */ "24637", "38736", "74384", "89342", "52623", "07992", "12369", "18601", "03742", "83873", /* 97 */ "83080", "12451", "38992", "22815", "07759", "51777", "97377", "27585", "51972", "37867", /* 98 */ "16444", "24334", "36151", "99073", "27493", "70939", "85130", "32552", "54846", "54759", /* 99 */ "60790", "18157", "57178", "65762", "11161", "78576", "45819", "52979", "65130", "04860", /* 100 */ "03991", "10461", "93716", "16894", "66083", "24653", "84609", "58232", "88618", "19161", /* 101 */ "38555", "95554", "32886", "59780", "08355", "60860", "29735", "47762", "71299", "23853", /* 102 */ "17546", "73704", "92052", "46215", "55121", "29281", "59076", "07936", "27954", "58909", /* 103 */ "32643", "52861", "95819", "06831", "00911", "98936", "76355", "93779", "80863", "00514", /* 104 */ "69572", "68777", "39510", "35905", "14060", "40619", "29549", "69616", "33564", "60780", /* 105 */ "24122", "66591", "27699", "06494", "14845", "46672", "61958", "77100", "90899", "75754", /* 106 */ "61196", "30231", "92962", "61773", "41839", "55382", "17267", "70943", "78038", "70267", /* 107 */ "30532", "21704", "10274", "12202", "39685", "23309", "10061", "68829", "55986", "66485", /* 108 */ "03788", "97599", "75867", "20717", "74416", "53166", "35208", "33374", "87539", "08823", /* 109 */ "48228", "63379", "85783", "47619", "53152", "67433", "35663", "52972", "16818", "60311", /* 110 */ "60365", "94653", "35075", "33949", "42614", "29297", "01918", "28316", "98953", "73231", /* 111 */ "83799", "42402", "56623", "34442", "34994", "41374", "70071", "14736", "09958", "18065", /* 112 */ "32960", "07405", "36409", "83232", "99385", "41600", "11133", "07586", "15917", "06253", /* 113 */ "19322", "53845", "57620", "52606", "66497", "68646", "78138", "66559", "19640", "99413", /* 114 */ "11220", "94747", "07399", "37408", "48509", "23929", "27482", "45476", "85244", "35159", /* 115 */ "31751", "57260", "68980", "05339", "15470", "48355", "88651", "22596", "03152", "19121", /* 116 */ "88492", "99382", "14454", "04504", "20094", "98977", "74843", "93413", "22109", "78508", /* 117 */ "30934", "47744", "07481", "83828", "73788", "06533", "28597", "20405", "94205", "20380", /* 118 */ "22888", "48893", "27499", "98748", "60530", "45128", "74022", "84617", "82037", "10268", /* 119 */ "78212", "16993", "35902", "91386", "44372", "15486", "65741", "14014", "87481", "37220", /* 120 */ "41849", "84547", "46850", "52326", "34677", "58300", "74910", "64345", "19325", "81549", /* 121 */ "46352", "33049", "69248", "93460", "45305", "07521", "61318", "31855", "14413", "70951", /* 122 */ "11087", "96294", "14013", "31792", "59747", "67277", "76503", "34513", "39663", "77544", /* 123 */ "52701", "08337", "56303", "87315", "16520", "69676", "11654", "99893", "02181", "68161", /* 124 */ "57275", "36898", "81304", "48585", "68652", "27376", "92852", "55866", "88448", "03584", /* 125 */ "20857", "73156", "70284", "24326", "79375", "95220", "01159", "63267", "10622", "48391", /* 126 */ "15633", "84924", "90415", "93614", "33521", "26665", "55823", "47641", "86225", "31704", /* 127 */ "92694", "48297", "39904", "02115", "59589", "49067", "66821", "41575", "49767", "04037", /* 128 */ "77613", "19019", "88152", "00080", "20554", "91409", "96277", "48257", "50816", "97616", /* 129 */ "38688", "32486", "45134", "63545", "59404", "72059", "43947", "51680", "43852", "59693", /* 130 */ "25163", "01889", "70014", "15021", "41290", "67312", "71857", "15957", "68971", "11403", /* 131 */ "65251", "07629", "37239", "33295", "05870", "01119", "92784", "26340", "18477", "65622", /* 132 */ "36815", "43625", "18637", "37509", "82444", "99005", "04921", "73701", "14707", "93997", /* 133 */ "64397", "11692", "05327", "82162", "20247", "81759", "45197", "25332", "83745", "22567", /* 134 */ "04515", "25624", "95096", "67946", "48460", "85558", "15191", "18782", "16930", "33361", /* 135 */ "83761", "60873", "43253", "84145", "60833", "25983", "01291", "41349", "20368", "07126", /* 136 */ "14387", "06345", "80854", "09279", "43529", "06318", "38384", "74761", "41196", "37480", /* 137 */ "51321", "92246", "80088", "77074", "88722", "56736", "66164", "49431", "66919", "31678", /* 138 */ "72472", "00008", "80890", "18002", "94813", "31900", "54155", "83436", "35352", "54131", /* 139 */ "05466", "55306", "93128", "18464", "74457", "90561", "72848", "11834", "79982", "68416", /* 140 */ "39528", "72484", "82474", "25593", "48545", "35247", "18619", "13674", "18611", "19241", /* 141 */ "81616", "18711", "53342", "44276", "75122", "11724", "74627", "73707", "58319", "15997", /* 142 */ "07586", "16120", "82641", "22820", "92904", "13141", "32392", "19763", "61199", "67940", /* 143 */ "90767", "04235", "13574", "17200", "69902", "63742", "78464", "22501", "18627", "90872", /* 144 */ "40188", "28193", "29593", "88627", "94972", "11598", "62095", "36787", "00441", "58997", /* 145 */ "34414", "82157", "86887", "55087", "19152", "00023", "12302", "80783", "32624", "68691", /* 146 */ "63439", "75363", "44989", "16822", "36024", "00867", "76378", "41605", "65961", "73488", /* 147 */ "67049", "09070", "93399", "45547", "94458", "74284", "05041", "49807", "20288", "34060", /* 148 */ "79495", "04146", "52162", "90286", "54158", "34243", "46978", "35482", "59362", "95938", /* 149 */ "91704", "30552", "04737", "21031", "75051", "93029", "47665", "64382", "99782", "93478", /* 150 */ "94015", "46874", "32444", "48277", "59820", "96163", "64654", "25843", "41145", "42820", /* 151 */ "74108", "88222", "88570", "74015", "25704", "91035", "01755", "14750", "48968", "38603", /* 152 */ "62880", "87873", "95160", "59221", "22304", "90314", "72877", "17334", "39283", "04149", /* 153 */ "11748", "12102", "80580", "41867", "17710", "59621", "06554", "07850", "73950", "79552", /* 154 */ "17944", "05600", "60478", "03343", "25852", "58905", "57216", "39618", "49856", "99326", /* 155 */ "66067", "42792", "95043", "52680", "46780", "56487", "09971", "59481", "37006", "22186", /* 156 */ "54244", "91030", "45547", "70818", "59849", "96169", "61459", "21647", "87417", "17198", /* 157 */ "30945", "57589", "31732", "57260", "47670", "07654", "46376", "25366", "94746", "49580", /* 158 */ "69170", "37403", "86995", "90307", "94304", "71803", "26825", "05511", "12459", "91314", /* 159 */ "08345", "88975", "35841", "85771", "08105", "59987", "87112", "21476", "14713", "71181", /* 160 */ "27767", "43584", "85301", "88977", "29490", "69714", "73035", "41207", "74699", "09310", /* 161 */ "13025", "14338", "54066", "15243", "47724", "66733", "47431", "43905", "31048", "56699", /* 162 */ "80217", "36292", "98525", "24335", "24432", "24896", "43277", "58874", "11466", "16082", /* 163 */ "10875", "62004", "90391", "61105", "57411", "06368", "53856", "30743", "08670", "84741", /* 164 */ "54127", "57326", "26629", "19087", "24472", "88779", "30540", "27886", "61732", "75454", /* 165 */ "60311", "42824", "37301", "42678", "45990", "43242", "17374", "52003", "70707", "70214", /* 166 */ "49739", "71484", "92003", "98086", "76668", "73209", "59202", "11973", "02902", "33250", /* 167 */ "78626", "51594", "16453", "94614", "39014", "97066", "83012", "09832", "25571", "77628", /* 168 */ "66692", "13986", "99837", "00582", "81232", "44987", "09504", "96412", "90193", "79568", /* 169 */ "44071", "28091", "07362", "97703", "76447", "42537", "98524", "97831", "65704", "09514", /* 170 */ "41468", "85149", "49554", "17994", "14924", "39650", "95294", "00556", "70481", "06905", /* 171 */ "94559", "37559", "49678", "53119", "70312", "05682", "66986", "34099", "74474", "20740", /* 172 */ "41615", "70360", "64114", "58660", "90850", "64618", "80620", "51790", "11436", "38072", /* 173 */ "50273", "93113", "41794", "86861", "24781", "89683", "55411", "85667", "77535", "99892", /* 174 */ "41396", "80504", "90670", "08289", "40902", "05069", "95083", "06783", "28102", "57816", /* 175 */ "25807", "24260", "71529", "78920", "72682", "07385", "90726", "57166", "98884", "08583", /* 176 */ "06170", "97965", "88302", "98041", "21443", "41808", "68984", "83620", "89747", "98882", /* 177 */ "60808", "54444", "74412", "81105", "01176", "28838", "36421", "16489", "18059", "51061", /* 178 */ "80940", "44893", "10408", "36222", "80582", "71944", "92638", "40333", "67054", "16067", /* 179 */ "19516", "90120", "46759", "71643", "13177", "55292", "21036", "82808", "77501", "97427", /* 180 */ "49386", "54480", "23604", "23554", "21785", "41101", "91178", "10174", "29420", "90438", /* 181 */ "06312", "88940", "15995", "69321", "47458", "64809", "98189", "81851", "29651", "84215", /* 182 */ "60942", "00307", "11897", "92674", "40405", "68032", "96717", "54244", "10701", "41393", /* 183 */ "92329", "98932", "78284", "46347", "71209", "92061", "39448", "93136", "25722", "08564", /* 184 */ "77936", "63574", "31384", "51924", "85561", "29671", "58137", "17820", "22751", "36518", /* 185 */ "38101", "77756", "11657", "13897", "95889", "57067", "47648", "13885", "70669", "93406", /* 186 */ "39641", "69457", "91339", "22502", "92613", "89719", "11947", "56203", "19324", "20504", /* 187 */ "84054", "40455", "99396", "63680", "67667", "60631", "69181", "96845", "38525", "11600", /* 188 */ "47468", "03577", "57649", "63266", "24700", "71594", "14004", "23153", "69249", "05747", /* 189 */ "43321", "31370", "28977", "23896", "76479", "68562", "62342", "07589", "08899", "05985", /* 190 */ "64281", "61826", "18555", "64937", "13173", "33365", "78851", "16499", "87064", "13075", /* 191 */ "66847", "70495", "32350", "02985", "86716", "38746", "26313", "77463", "55387", "72681", /* 192 */ "72461", "33230", "21529", "53424", "92581", "02262", "78438", "66276", "18396", "73538", /* 193 */ "21032", "91050", "13058", "16218", "12470", "56500", "15292", "76139", "59526", "52113", /* 194 */ "95362", "67011", "06651", "16136", "01016", "00857", "55018", "56374", "35824", "71708", /* 195 */ "49712", "97380", "10404", "55452", "34030", "60726", "75211", "10271", "36633", "68424", /* 196 */ "58275", "61764", "97586", "54716", "50259", "46345", "87195", "46092", "26787", "60939", /* 197 */ "89514", "11788", "68224", "23417", "73959", "76145", "30342", "40277", "11049", "72049", /* 198 */ "15472", "50669", "48139", "36732", "46874", "37088", "73465", "09819", "58869", "35220", /* 199 */ "12120", "86124", "51247", "44302", "60883", "52109", "21437", "36786", "49226", "77837", /* 200 */ "19612", "78430", "11661", "94770", "77603", "65669", "86868", "12665", "30012", "75989", /* 201 */ "39141", "77400", "28000", "64238", "73258", "71794", "31340", "26256", "66453", "37016", /* 202 */ "64756", "80457", "08747", "12836", "03469", "50678", "03274", "43423", "66677", "82556", /* 203 */ "92901", "51878", "56441", "22998", "29718", "38447", "06453", "25311", "07565", "53771", /* 204 */ "03551", "90070", "09483", "94050", "45938", "18135", "36908", "43321", "11073", "51803", /* 205 */ "98884", "66209", "06830", "53656", "14663", "56346", "71430", "04909", "19818", "05707", /* 206 */ "27369", "86882", "53473", "07541", "53633", "70863", "03748", "12822", "19360", "49088", /* 207 */ "59066", "75974", "63335", "20483", "43514", "37481", "58278", "26967", "49325", "43951", /* 208 */ "91647", "93783", "64169", "49022", "98588", "09495", "49829", "59068", "38831", "04838", /* 209 */ "83605", "92419", "39542", "07772", "71568", "75673", "35185", "89759", "44901", "74291", /* 210 */ "24895", "88530", "70774", "35439", "46758", "70472", "70207", "92675", "91623", "61275", /* 211 */ "35720", "26556", "95596", "20094", "73750", "85788", "34264", "01703", "46833", "65248", /* 212 */ "14141", "53410", "38649", "06343", "57256", "61342", "72709", "75318", "90379", "37562", /* 213 */ "27416", "75670", "92176", "72535", "93119", "56077", "06886", "18244", "92344", "31374", /* 214 */ "82071", "07429", "81007", "47749", "40744", "56974", "23336", "88821", "53841", "10536", /* 215 */ "21445", "82793", "24831", "93241", "14199", "76268", "70883", "68002", "03829", "17443", /* 216 */ "72513", "76400", "52225", "92348", "62308", "98481", "29744", "33165", "33141", "61020", /* 217 */ "71479", "45027", "76160", "57411", "13780", "13632", "52308", "77762", "88874", "33697", /* 218 */ "83210", "51466", "09088", "50395", "26743", "05306", "21706", "70001", "99439", "80767", /* 219 */ "68749", "95148", "94897", "78636", "96750", "09024", "94538", "91143", "96693", "61886", /* 220 */ "05184", "75763", "47075", "88158", "05313", "53439", "14908", "08830", "60096", "21551", /* 221 */ "13651", "62546", "96892", "25240", "47511", "58483", "87342", "78818", "07855", "39269", /* 222 */ "00566", "21220", "00292", "24069", "25072", "29519", "52548", "54091", "21282", "21296", /* 223 */ "50958", "17695", "58072", "68990", "60329", "95955", "71586", "63417", "35947", "67807", /* 224 */ "57621", "64547", "46850", "37981", "38527", "09037", "64756", "03324", "04986", "83666", /* 225 */ "09282", "25844", "79139", "78435", "35428", "43561", "69799", "63314", "12991", "93516", /* 226 */ "23394", "94206", "93432", "37836", "94919", "26846", "02555", "74410", "94915", "48199", /* 227 */ "05280", "37470", "93622", "04345", "15092", "19510", "18094", "16613", "78234", "50001", /* 228 */ "95491", "97976", "38306", "32192", "82639", "54624", "72434", "92606", "23191", "74693", /* 229 */ "78521", "00104", "18248", "75583", "90326", "50785", "54034", "66251", "35774", "14692", /* 230 */ "96345", "44579", "85932", "44053", "75704", "20840", "86583", "83944", "52456", "73766", /* 231 */ "77963", "31151", "32364", "91691", "47357", "40338", "23435", "24065", "08458", "95366", /* 232 */ "07520", "11294", "23238", "01748", "41690", "67328", "54814", "37777", "10057", "42332", /* 233 */ "38423", "02309", "70703", "85736", "46148", "14258", "29236", "12152", "05088", "65825", /* 234 */ "02463", "65533", "21199", "60555", "33928", "01817", "07396", "89215", "30722", "22102", /* 235 */ "15880", "92261", "17292", "88190", "61781", "48898", "92525", "21283", "88581", "60098", /* 236 */ "71926", "00819", "59144", "00224", "30570", "90194", "18329", "06999", "26857", "19238", /* 237 */ "64425", "28108", "16554", "16016", "00042", "83229", "10333", "36168", "65617", "94834", /* 238 */ "79782", "23924", "49440", "30432", "81077", "31543", "95216", "64865", "13658", "51081", /* 239 */ "35337", "74538", "44553", "64672", "90960", "41849", "93865", "44608", "93176", "34851", /* 240 */ "05249", "29329", "19715", "94082", "14738", "86667", "43708", "66354", "93692", "25527", /* 241 */ "56463", "99380", "38793", "85774", "19056", "13939", "46062", "27647", "66146", "63210", /* 242 */ "96296", "33121", "54196", "34108", "75814", "85986", "71171", "15102", "28992", "63165", /* 243 */ "98380", "36269", "60014", "07201", "62448", "46385", "42175", "88350", "46182", "49126", /* 244 */ "52567", "64350", "16315", "53969", "80395", "81114", "54358", "64578", "47269", "15747", /* 245 */ "78498", "90830", "25955", "99236", "43286", "91064", "99969", "95144", "64424", "77377", /* 246 */ "49553", "24241", "08150", "89535", "08703", "91041", "77323", "81079", "45127", "93686", /* 247 */ "32151", "07075", "83155", "10252", "73100", "88618", "23891", "87418", "45417", "20268", /* 248 */ "11314", "50363", "26860", "27799", "49416", "83534", "19187", "08059", "76677", "02110", /* 249 */ "12364", "71210", "87052", "50241", "90785", "97889", "81399", "58130", "64439", "05614", /* 250 */ "59467", "58309", "87834", "57213", "37510", "33689", "01259", "62486", "56320", "46265", /* 251 */ "73452", "17619", "56421", "40725", "23439", "41701", "93223", "41682", "45026", "47505", /* 252 */ "27635", "56293", "91700", "04391", "67317", "89604", "73020", "69853", "61517", "51207", /* 253 */ "86040", "02596", "01655", "09918", "45161", "00222", "54577", "74821", "47335", "08582", /* 254 */ "52403", "94255", "26351", "46527", "68224", "90183", "85057", "72310", "34963", "83462", /* 255 */ "49465", "46581", "61499", "04844", "94626", "02963", "41482", "83879", "44942", "63915", /* 256 */ "94365", "92560", "12363", "30246", "02086", "75036", "88620", "91088", "67691", "67762", /* 257 */ "34261", "08769", "91830", "23313", "18256", "28850", "37639", "92748", "57791", "71328", /* 258 */ "37110", "66538", "39318", "15626", "44324", "82827", "08782", "65960", "58167", "01305", /* 259 */ "83950", "45424", "72453", "19444", "68219", "64733", "94088", "62006", "89985", "36936", /* 260 */ "61630", "97966", "76537", "46467", "30942", "07479", "67971", "14558", "22458", "35148", /* 261 */ "01929", "17165", "12037", "74558", "16250", "71750", "55546", "29693", "94984", "37782", /* 262 */ "41659", "39098", "23982", "29899", "71594", "77979", "54477", "13764", "17315", "72893", /* 263 */ "32031", "39608", "75992", "73445", "01317", "50525", "87313", "45191", "30214", "19769", /* 264 */ "90043", "93478", "58044", "06949", "31176", "88370", "50274", "83987", "45316", "38551", /* 265 */ "79418", "14322", "91065", "07841", "36130", "86602", "10659", "40859", "00964", "71577", /* 266 */ "85447", "61079", "96910", "72906", "07361", "84338", "34114", "52096", "66715", "51091", /* 267 */ "86219", "81115", "49625", "48799", "89485", "24855", "13684", "68433", "70595", "70102", /* 268 */ "71712", "88559", "92476", "32903", "68009", "58417", "87962", "11787", "16644", "72964", /* 269 */ "29776", "63075", "13270", "84758", "49560", "10317", "28778", "23006", "31036", "84906", /* 270 */ "81488", "17340", "74154", "42801", "27917", "89792", "62604", "62234", "13124", "76471", /* 271 */ "51667", "37589", "87147", "24743", "48023", "06325", "79794", "35889", "13255", "04925", /* 272 */ "99004", "70322", "60832", "76636", "56907", "56534", "72615", "46288", "36788", "93196", /* 273 */ "68656", "66492", "35933", "52293", "47953", "95495", "95304", "50009", "83464", "28608", /* 274 */ "38074", "74083", "09337", "07965", "65047", "36871", "59015", "21769", "30398", "44855", /* 275 */ "01020", "80680", "59328", "08712", "48190", "45332", "27284", "31287", "66011", "09376", /* 276 */ "86379", "74508", "33579", "77114", "92955", "23085", "92824", "03054", "25242", "16322", /* 277 */ "48498", "09938", "44420", "13484", "52319", "58875", "02012", "88591", "52500", "95795", /* 278 */ "41800", "95363", "54142", "17482", "32705", "60564", "12505", "40954", "46174", "64130", /* 279 */ "63026", "96712", "79883", "39225", "52653", "69549", "36693", "59822", "22684", "31661", /* 280 */ "88298", "15489", "16030", "42480", "15372", "38781", "71995", "77438", "91161", "10192", /* 281 */ "07839", "62735", "99218", "25624", "02547", "27445", "69187", "55749", "32322", "15504", /* 282 */ "73298", "51108", "48717", "92926", "75705", "89787", "96114", "99902", "37749", "96305", /* 283 */ "12829", "70474", "00838", "50385", "91711", "80370", "56504", "56857", "80906", "09018", /* 284 */ "76569", "61072", "48568", "36491", "22587", "44363", "39592", "61546", "90181", "37348", /* 285 */ "41665", "41339", "62106", "44203", "06732", "76111", "79840", "67999", "32231", "76869", /* 286 */ "58652", "49983", "01669", "27464", "79553", "52855", "25988", "18087", "38052", "17529", /* 287 */ "13607", "00657", "76173", "43357", "77334", "24140", "53860", "02906", "89863", "44651", /* 288 */ "55715", "26203", "65933", "51087", "98234", "40625", "45545", "63563", "89148", "82581", /* 289 */ "04110", "66683", "99001", "09796", "47349", "65003", "66524", "81970", "71262", "14479", /* 290 */ "31300", "08681", "58068", "44115", "40064", "77879", "23965", "69019", "73985", "19453", /* 291 */ "26225", "97543", "37044", "07494", "85778", "35345", "61115", "92498", "49737", "64599", /* 292 */ "07158", "82763", "25072", "38478", "57782", "75291", "62155", "52056", "04786", "11585", /* 293 */ "71251", "25572", "79771", "93328", "66927", "54069", "58752", "26624", "50463", "77361", /* 294 */ "29991", "96526", "02820", "91659", "12818", "96356", "49499", "01507", "40223", "09171", /* 295 */ "83642", "21057", "02677", "09367", "38097", "16100", "19355", "06120", "15378", "56559", /* 296 */ "69167", "30235", "06767", "66323", "78294", "14916", "19124", "88044", "16673", "66102", /* 297 */ "86018", "29406", "75415", "22038", "27056", "26906", "25867", "14751", "92380", "30434", /* 298 */ "44114", "06026", "79553", "55091", "95385", "41212", "37882", "46864", "54717", "97038", /* 299 */ "53805", "64150", "70915", "63127", "63695", "41288", "38192", "72437", "75075", "18570", /* 300 */ "52065", "08853", "30104", "79937", "66913", "53200", "84570", "78079", "28970", "53859", /* 301 */ "37632", "80274", "35240", "32960", "74859", "07359", "55176", "03930", "38984", "35151", /* 302 */ "82576", "82805", "94031", "12779", "90879", "24109", "25367", "77861", "09541", "85739", /* 303 */ "69023", "64971", "99321", "07521", "95909", "43897", "71724", "92581", "05471", "64337", /* 304 */ "98949", "03606", "78236", "78985", "29212", "57369", "34857", "67757", "58019", "58872", /* 305 */ "96526", "28749", "56592", "37871", "72905", "70198", "57319", "54116", "47014", "18285", /* 306 */ "33692", "72111", "60958", "96848", "17893", "40993", "50445", "14186", "76877", "87867", /* 307 */ "50335", "09513", "44346", "26439", "55293", "06449", "44301", "63740", "40158", "72703", /* 308 */ "88321", "85062", "57345", "66231", "15409", "03451", "95261", "43561", "15673", "28956", /* 309 */ "90303", "62469", "82517", "43035", "36850", "15592", "64098", "59022", "31752", "04370", /* 310 */ "50486", "11885", "23085", "41712", "80692", "48492", "16495", "99721", "36912", "28267", /* 311 */ "27882", "16269", "64483", "11273", "02680", "01616", "46138", "54606", "14761", "05134", /* 312 */ "45144", "63213", "49666", "27441", "86989", "29884", "54334", "06740", "08368", "80051", /* 313 */ "81020", "17882", "74973", "74531", "94994", "24927", "64894", "22667", "20466", "82948", /* 314 */ "66831", "47427", "76033", "31197", "59817", "20064", "61135", "28556", "29695", "80179", /* 315 */ "74058", "18293", "09963", "35278", "13062", "83094", "23373", "90287", "33477", "48865", /* 316 */ "30348", "70174", "11468", "25994", "25343", "22317", "01587", "30682", "00001", "67814", /* 317 */ "59557", "23362", "13746", "82244", "42093", "24671", "79458", "93730", "45488", "60234", /* 318 */ "67098", "09899", "25775", "00332", "36636", "57594", "19958", "85564", "58977", "12247", /* 319 */ "60774", "66371", "69442", "20385", "14486", "91330", "50332", "46023", "75768", "59877", /* 320 */ "60081", "92936", "72302", "75064", "85727", "52987", "05750", "19384", "33684", "78859", /* 321 */ "80458", "69902", "34870", "88684", "49762", "40801", "86291", "18194", "90366", "82639", /* 322 */ "53844", "96326", "65728", "48563", "26027", "52692", "62406", "76294", "41848", "63010", /* 323 */ "69841", "29451", "36170", "21529", "16525", "64326", "22086", "24469", "57407", "96033", /* 324 */ "37771", "31002", "18311", "93285", "31948", "14331", "58335", "15977", "80336", "81667", /* 325 */ "27286", "24361", "61638", "57580", "95270", "46180", "76990", "53031", "94366", "02727", /* 326 */ "49944", "19278", "05756", "51875", "53445", "33342", "01965", "07937", "10054", "97712", /* 327 */ "87693", "58124", "46064", "39133", "77385", "09605", "65359", "70113", "90563", "86637", /* 328 */ "94282", "12025", "31926", "24541", "23854", "58407", "32131", "92845", "20714", "27898", /* 329 */ "26917", "50326", "35145", "50859", "72119", "95094", "29441", "42301", "62460", "75252", /* 330 */ "94267", "38422", "73047", "24200", "85349", "72049", "91723", "97802", "98496", "12734", /* 331 */ "73432", "10371", "57213", "53300", "80847", "46229", "07099", "72961", "13767", "65654", /* 332 */ "31102", "82119", "96946", "65919", "81083", "03819", "57888", "57908", "16849", "77111", /* 333 */ "41429", "92261", "45263", "01172", "55926", "78835", "27697", "48420", "58865", "41207", /* 334 */ "21406", "08582", "10785", "36233", "12237", "07866", "13706", "92551", "11021", "63813", /* 335 */ "71512", "65206", "37768", "94325", "14721", "20990", "54235", "71986", "05345", "56239", /* 336 */ "52028", "01419", "07215", "55067", "11669", "21738", "66605", "69621", "69827", "08537", /* 337 */ "18638", "60982", "28151", "98885", "76431", "25566", "03085", "23639", "30849", "63986", /* 338 */ "73287", "26201", "36174", "14106", "54102", "57041", "16141", "64174", "03591", "90024", /* 339 */ "73332", "31254", "17288", "59809", "25061", "51612", "47951", "16570", "43330", "79213", /* 340 */ "11354", "55585", "19646", "99246", "37564", "32660", "20632", "21124", "60597", "69315", /* 341 */ "31312", "57741", "85108", "21615", "24365", "27684", "16124", "33888", "14966", "35303", /* 342 */ "69921", "15795", "04020", "67672", "86816", "63027", "84470", "45605", "44887", "26222", /* 343 */ "79888", "58982", "22466", "98844", "48353", "60666", "58256", "31140", "93507", "69561", /* 344 */ "06256", "88526", "18655", "00865", "75247", "00264", "65957", "98261", "72706", "36396", /* 345 */ "46065", "85700", "32121", "99975", "73627", "78812", "89638", "86602", "96758", "65099", /* 346 */ "52777", "46792", "13790", "55240", "52002", "10313", "91933", "71231", "10053", "78416", /* 347 */ "54563", "96004", "42215", "30094", "45958", "48437", "49591", "50483", "13422", "69108", /* 348 */ "59952", "27896", "40450", "79327", "31962", "46456", "39260", "51479", "61882", "48181", /* 349 */ "50691", "64709", "32902", "10676", "12083", "35771", "79656", "56667", "76783", "03937", /* 350 */ "99859", "10362", "57411", "40986", "35045", "02838", "29255", "64230", "84418", "34988", /* 351 */ "77644", "39892", "77327", "74129", "53444", "35487", "95803", "38640", "20383", "55402", /* 352 */ "25793", "14213", "87082", "42837", "95030", "97198", "61608", "97723", "79390", "35290", /* 353 */ "34683", "81419", "87133", "70447", "53127", "97146", "28299", "56763", "12868", "01145", /* 354 */ "12147", "58158", "92124", "60934", "18414", "97510", "07056", "54488", "20719", "53743", /* 355 */ "91037", "44797", "52110", "08512", "18991", "20129", "31441", "51449", "14661", "71126", /* 356 */ "23180", "68124", "18807", "70997", "21913", "19594", "70355", "73637", "68266", "60775", /* 357 */ "43164", "52643", "96363", "77989", "79332", "39890", "65379", "20405", "52935", "43816", /* 358 */ "92740", "95319", "04538", "60660", "28982", "15328", "80475", "34690", "02293", "19646", /* 359 */ "46524", "96627", "33159", "42081", "08816", "74931", "20674", "08697", "66169", "46460", /* 360 */ "46326", "39923", "60625", "28386", "22919", "19415", "75766", "43668", "31626", "70301", /* 361 */ "67053", "03949", "70082", "02303", "48642", "38429", "94053", "38770", "68137", "68441", /* 362 */ "52928", "70244", "91954", "17401", "92693", "98342", "21451", "84988", "80487", "33807", /* 363 */ "73797", "49494", "41878", "76635", "83227", "76618", "11946", "13451", "87591", "78381", /* 364 */ "21407", "90038", "72638", "69692", "51599", "86413", "32019", "64856", "74730", "41531", /* 365 */ "11064", "01790", "58817", "86400", "66213", "92599", "70905", "78324", "54326", "43659", /* 366 */ "34206", "63132", "38837", "40210", "96346", "16967", "81619", "96503", "14881", "89405", /* 367 */ "32205", "49508", "98425", "02451", "35423", "56072", "36810", "30332", "85998", "49358", /* 368 */ "92748", "84147", "79835", "94867", "41224", "61794", "35066", "82220", "66684", "20096", /* 369 */ "02754", "41731", "37068", "32753", "91059", "13407", "05607", "69384", "53329", "95909", /* 370 */ "44968", "11397", "92973", "50014", "92997", "80968", "93761", "57598", "74703", "07768", /* 371 */ "37978", "73873", "33475", "09720", "97852", "98449", "48722", "84977", "11271", "11728", /* 372 */ "68318", "22312", "78792", "87508", "88466", "72976", "47099", "84126", "38595", "85124", /* 373 */ "64405", "90020", "07492", "52413", "95111", "34455", "86311", "68892", "01074", "60274", /* 374 */ "28136", "19328", "38161", "57475", "13771", "63562", "84207", "94121", "18901", "52768", /* 375 */ "33801", "82087", "86091", "59969", "90398", "56870", "55756", "78841", "98450", "54165", /* 376 */ "55106", "50343", "70519", "14567", "36780", "55450", "19606", "83749", "67562", "64765", /* 377 */ "38543", "16585", "86841", "73742", "08766", "39252", "75678", "75379", "78760", "37279", /* 378 */ "15280", "13558", "95916", "89759", "76686", "76467", "67147", "63110", "94008", "08037", /* 379 */ "35263", "53710", "16667", "79008", "11231", "29397", "67136", "18601", "64502", "90228", /* 380 */ "89109", "72849", "22711", "65547", "34542", "26686", "81678", "87765", "77654", "23664", /* 381 */ "96352", "14106", "32938", "28083", "18633", "80286", "65507", "46197", "52722", "75476", /* 382 */ "77816", "47204", "34876", "45963", "79262", "90181", "84041", "03745", "90041", "30780", /* 383 */ "27226", "92847", "85572", "15308", "80688", "05761", "82638", "13464", "23683", "81015", /* 384 */ "54214", "64175", "43701", "86845", "15569", "50687", "52679", "87696", "08285", "97444", /* 385 */ "47599", "94472", "64150", "87753", "68652", "60726", "26213", "17320", "64553", "81285", /* 386 */ "98126", "12158", "52095", "64833", "00492", "35817", "55571", "91300", "97812", "37507", /* 387 */ "04209", "53515", "64342", "21223", "16662", "43265", "68219", "03529", "43636", "68417", /* 388 */ "53640", "95326", "93381", "37113", "80751", "76469", "96677", "43054", "22937", "31954", /* 389 */ "13266", "34140", "27253", "02734", "99070", "60077", "57988", "93211", "92795", "83795", /* 390 */ "57477", "03941", "39007", "14619", "38320", "93449", "31336", "25279", "97030", "26245", /* 391 */ "47394", "39475", "90621", "23820", "29344", "94859", "91604", "14033", "41868", "14816", /* 392 */ "04075", "66644", "87803", "97815", "99552", "78666", "03942", "08175", "22345", "19983", /* 393 */ "76783", "99044", "20851", "84981", "59052", "77178", "72109", "76475", "21619", "73017", /* 394 */ "06812", "56633", "50612", "55289", "04671", "84419", "94072", "94446", "80603", "32188", /* 395 */ "93415", "23464", "43947", "43728", "74284", "67177", "57105", "31059", "10642", "13803", /* 396 */ "69602", "46961", "66567", "19359", "84676", "63918", "40650", "12923", "15974", "79732", /* 397 */ "20225", "92525", "71179", "04859", "91208", "60430", "05239", "61458", "24089", "68852", /* 398 */ "60171", "29603", "42535", "86365", "93905", "28237", "45317", "60718", "82001", "41679", /* 399 */ "20679", "56304", "70043", "87568", "21386", "59049", "78353", "48696", "77379", "55309", /* 400 */ "23780", "28391", "05940", "55583", "81256", "59418", "97521", "32846", "70761", "90115", /* 401 */ "45325", "05490", "65974", "11186", "15357", "03568", "00450", "96644", "58976", "36211", /* 402 */ "88240", "92457", "89200", "94696", "11370", "91157", "48487", "59501", "56983", "89795", /* 403 */ "42789", "69758", "79701", "29511", "55968", "41472", "89474", "84344", "80517", "07485", /* 404 */ "97523", "17264", "82840", "59556", "37119", "30985", "48866", "60605", "95719", "70417", /* 405 */ "59083", "95137", "76538", "44155", "67286", "57897", "28262", "04052", "00919", "86207", /* 406 */ "79932", "44236", "10089", "44373", "65670", "44285", "06903", "20834", "49701", "95735", /* 407 */ "21149", "03425", "17594", "31427", "14262", "32252", "68540", "39427", "44026", "47257", /* 408 */ "45055", "95091", "08367", "28381", "57375", "41562", "83883", "27715", "10122", "67745", /* 409 */ "46497", "28626", "87297", "36568", "39483", "11385", "63292", "92305", "78683", "06146", /* 410 */ "81905", "15038", "38338", "51206", "65749", "34119", "71516", "74068", "51094", "06665", /* 411 */ "91884", "66762", "11428", "70908", "21506", "00480", "94183", "78484", "66507", "75901", /* 412 */ "25728", "52539", "86806", "69944", "65036", "27882", "02530", "04918", "74351", "65737", /* 413 */ "89178", "08791", "39342", "94963", "22581", "56917", "17541", "83578", "75376", "65202", /* 414 */ "30935", "79270", "91986", "99286", "45236", "44720", "81915", "70881", "45886", "43213", /* 415 */ "49789", "97081", "16075", "20517", "69980", "25310", "91953", "01759", "67635", "88933", /* 416 */ "54558", "18395", "73375", "62251", "58871", "09870", "70538", "48936", "07757", "90374", /* 417 */ "56631", "88862", "30487", "38794", "36079", "32712", "11130", "55451", "25137", "38785", /* 418 */ "83558", "31960", "69473", "45950", "18225", "09871", "88502", "75179", "11551", "75664", /* 419 */ "74321", "67351", "27703", "83717", "18913", "42470", "08816", "37627", "14288", "62831", /* 420 */ "44047", "67612", "72738", "26995", "50933", "63758", "50003", "43693", "52661", "55852", /* 421 */ "52372", "59042", "37595", "04931", "73622", "68387", "86478", "40997", "05245", "75300", /* 422 */ "24902", "59609", "35653", "15970", "37681", "69365", "22236", "86374", "65550", "00343", /* 423 */ "98377", "35354", "65770", "15365", "41422", "71356", "16630", "40044", "19290", "66449", /* 424 */ "53629", "79452", "71674", "30260", "97303", "06487", "62789", "13005", "70152", "22501", /* 425 */ "49867", "89294", "59232", "31776", "54919", "99851", "05438", "01096", "72269", "50486", /* 426 */ "16719", "06144", "82041", "38332", "64452", "31840", "99287", "59928", "25503", "08407", /* 427 */ "46970", "45907", "99238", "74547", "19704", "72035", "26542", "54600", "79172", "58779", /* 428 */ "35747", "78956", "11478", "41195", "58135", "63856", "33037", "45753", "60159", "25193", /* 429 */ "71838", "07526", "07985", "60714", "88627", "75790", "38454", "96110", "39237", "19792", /* 430 */ "34534", "70169", "24805", "63215", "38175", "38784", "38855", "24826", "50917", "25147", /* 431 */ "17082", "26997", "32295", "10894", "21805", "65245", "85407", "37926", "69214", "38579", /* 432 */ "84721", "23544", "88548", "65626", "75517", "69737", "55626", "52175", "21697", "19453", /* 433 */ "16908", "82841", "24060", "40285", "19195", "80281", "89322", "15232", "70043", "60691", /* 434 */ "86370", "91949", "19017", "83846", "77869", "14321", "95102", "87073", "71467", "31305", /* 435 */ "64677", "80358", "52629", "79419", "22359", "87867", "48296", "50141", "46807", "82184", /* 436 */ "95812", "84665", "74511", "59914", "04146", "90417", "58508", "62875", "17630", "21868", /* 437 */ "09199", "30322", "33352", "43374", "25473", "04119", "63086", "14147", "14863", "38020", /* 438 */ "44757", "98628", "57916", "22199", "11865", "42911", "62651", "78290", "09392", "77294", /* 439 */ "63168", "21043", "17409", "13786", "27475", "75979", "89668", "43596", "74316", "84489", /* 440 */ "54941", "95992", "45445", "41059", "55142", "15214", "42903", "16799", "88254", "95984", /* 441 */ "48575", "77822", "21067", "57238", "35352", "96779", "89564", "23797", "99937", "46379", /* 442 */ "27119", "16060", "30302", "95327", "12849", "38111", "97090", "07598", "78473", "63079", /* 443 */ "18570", "72803", "70040", "91385", "96436", "96263", "17368", "56188", "85999", "50026", /* 444 */ "36050", "73736", "13351", "48321", "28357", "51718", "65636", "72903", "21584", "21060", /* 445 */ "39829", "15564", "04716", "14594", "22363", "97639", "65937", "17802", "31535", "42767", /* 446 */ "98761", "30987", "57657", "33398", "63053", "25926", "20944", "19306", "81727", "02695", /* 447 */ "97479", "79172", "72764", "66446", "78864", "12698", "15812", "97209", "38827", "91016", /* 448 */ "91281", "57875", "45228", "49211", "69755", "99224", "43999", "62879", "08879", "80015", /* 449 */ "74396", "57146", "64665", "31159", "06980", "79069", "37409", "75037", "69977", "85919", /* 450 */ "42826", "06974", "61063", "97640", "13433", "92528", "91311", "08440", "38840", "22362", /* 451 */ "93929", "01836", "36590", "75052", "89475", "15437", "65648", "99012", "70236", "12307", /* 452 */ "83585", "00414", "62851", "48787", "28447", "21702", "57033", "29633", "44760", "34165", /* 453 */ "27548", "37516", "24343", "63046", "02081", "20378", "19510", "42226", "97134", "68739", /* 454 */ "32982", "56455", "53129", "77693", "25022", "55534", "99375", "30086", "98001", "07432", /* 455 */ "67126", "76656", "29347", "28492", "43108", "64736", "32278", "84816", "80440", "30461", /* 456 */ "00818", "09136", "01952", "48442", "91058", "92590", "10443", "05195", "34009", "32141", /* 457 */ "62209", "43740", "54102", "76895", "98172", "31583", "04155", "66492", "58981", "16591", /* 458 */ "11331", "06838", "03818", "77063", "12523", "45570", "68970", "70055", "77751", "73743", /* 459 */ "71732", "04704", "61384", "57343", "66682", "44500", "89745", "10436", "67202", "36455", /* 460 */ "42467", "88801", "91280", "01056", "27534", "81619", "79004", "25824", "66362", "33280", /* 461 */ "20706", "31929", "57422", "18730", "96197", "22101", "47592", "02180", "18287", "82310", /* 462 */ "60430", "59627", "26471", "07794", "60475", "76713", "45427", "89654", "14370", "81674", /* 463 */ "41246", "98416", "08669", "48883", "77154", "09806", "94015", "60347", "20027", "08405", /* 464 */ "33150", "27368", "53375", "70171", "59431", "14534", "34018", "85665", "77797", "17944", /* 465 */ "49602", "74391", "48830", "55029", "10371", "94261", "16658", "68400", "44148", "28150", /* 466 */ "40364", "90913", "73151", "64463", "50058", "78191", "84439", "82478", "62398", "03113", /* 467 */ "17578", "12830", "06571", "95934", "09132", "25287", "78731", "80683", "67207", "76597", /* 468 */ "42096", "34934", "76609", "52553", "47508", "71561", "08038", "83011", "72577", "95790", /* 469 */ "40076", "20292", "32138", "61197", "95476", "23123", "26648", "13611", "48452", "39963", /* 470 */ "85857", "04855", "27029", "01542", "72443", "53688", "82635", "56264", "07977", "23090", /* 471 */ "93553", "65434", "12124", "91087", "87800", "95675", "99419", "44659", "30382", "55263", /* 472 */ "82514", "86800", "16781", "65977", "65946", "13033", "93895", "04056", "75895", "47878", /* 473 */ "91309", "51233", "81409", "46773", "69135", "56906", "84493", "34530", "84534", "38312", /* 474 */ "54574", "92933", "77341", "20839", "36126", "01143", "35356", "35459", "07959", "98335", /* 475 */ "53266", "36146", "78047", "50607", "22486", "63308", "08996", "96056", "39085", "26567", /* 476 */ "06779", "62663", "30523", "47881", "41279", "49864", "82248", "78333", "29466", "48151", /* 477 */ "41957", "93235", "53308", "22682", "90722", "54478", "07235", "34306", "15827", "20121", /* 478 */ "96837", "06283", "80172", "66109", "92592", "48238", "76428", "94546", "45430", "16288", /* 479 */ "74839", "00740", "25553", "83767", "35900", "05998", "07493", "46755", "11449", "88824", /* 480 */ "44906", "33143", "07454", "56652", "34755", "63992", "59674", "65131", "46358", "12799" }; typedef unsigned long int sBox[256]; /* The standard S boxes are defined in another file */ extern sBox standardSBoxes[SBoxCount]; /* The following routine is a simple error exit routine -- it prints a message and aborts */ void errAbort (s) char *s; { int length; for (length = 0; s[length] != 0; length++); if (write (errorFile, s, length) != length) exit(2); if (write (errorFile, "\n", 1) != 1) exit(2); exit (1); }; void swapBytesInSBox (anSBox, row1, row2, column) sBox anSBox; unsigned int row1, row2, column; /* Exchanges two bytes in a column in 'anSBox'. row1 and row2 are integers between 0 and 255 inclusive. 'column' is either 0, 1, 2 or 3 and refers to the byte position in a 32-bit word. 0 is the left-most byte. */ { /* mask designates the bytes to be exchanged */ unsigned long int mask; unsigned long int temp; mask = 0xFF000000; /* 'column' must be between 0 and 3 */ if (column > 3) errAbort ("bad column passed to swapBytesInSBox"); /* position the mask in the appropriate column */ mask >>= (column * 8); /* Swap the bytes indicated by 'mask' */ temp = anSBox[row1]; anSBox[row1] = (anSBox[row1] & (~mask)) | (anSBox[row2] & mask); anSBox[row2] = (anSBox[row2] & (~mask)) | (temp & mask); } unsigned int randomDigit () /* generate a random digit in the range from 0 to 9, inclusive. Generate the digit simply by getting the next random digit from the RAND table of random digits */ { if (locationIn5DigitGroup == 5) { locationIn5DigitGroup = 0; locationInRANDtable++; }; if (locationInRANDtable >= sizeOfRANDtableIn5DigitGroups) errAbort ("Error in randomDigit -- attempt to ask for too many random digits"); return (RANDtable[locationInRANDtable][locationIn5DigitGroup++] - '0'); }; unsigned int randomInRange (low, high) unsigned int low, high; /* Returns a random integer in the range from low to high, inclusive */ /* gets random digits from RANDtable */ { unsigned int range; /* contains the actual range needed */ /* the max possible random numbers given a certain number of digits */ unsigned int maximum; unsigned int random; /* the random number composed by appending digits */ range = (high - low) + 1; do { random = 0; /* initialize */ maximum = 1; /* initialize */ /* loop until random has as many digits as range */ while (maximum < range) { maximum *= 10; /* 0-n = n+1 possible random numbers */ /* add another digit to the low end */ random = (random * 10) + randomDigit (); } } /* if random is not evenly mappable to range, try again */ /* the operation (maximum/range) TRUNCATES the result to an unsigned int */ while (random >= ((unsigned int) (maximum / range)) * range); /* map random to the range and add low to stay within (low,high) */ return (low + (random % range)); } void checkSBoxes () /* computes the standard S boxes from the RAND table of random digits, then compares it with standardSBoxes -- they should be equal. Uses RANDtable as the source for the random digits. */ { sBox SBoxFromRand[SBoxCount]; int SBoxIndex; /* column is from the set {0, 1, 2, 3}. 0 is the leftmost byte */ unsigned int column, row; unsigned long int longRow; for (SBoxIndex = 0; SBoxIndex < SBoxCount; SBoxIndex++) { /* Fill initial S box with a trivial permutation (0-255) */ for (longRow = 0; longRow < 256; longRow++) SBoxFromRand[SBoxIndex][longRow] = longRow | (longRow << 8) | (longRow << 16) | (longRow << 24); for (column = 0; column < 4; column++) { for (row = 0; row < 255 /* 255 is correct */ ; row++) /* exchange random rows in the column. This ensures the column remains a permutation of (0-255) */ swapBytesInSBox (SBoxFromRand[SBoxIndex], row, randomInRange (row, 255), column); } for (row = 0; row < 256; row++) if (SBoxFromRand[SBoxIndex][row] != standardSBoxes[SBoxIndex][row]) errAbort ("Error -- can't verify S boxes"); printf(" Verified SBox[%d]\n",SBoxIndex); }; /* End of for (SBoxIndex.... */ }; void main () { int i; /* Test the standard S boxes to make sure they haven't been damaged. */ /* Test to make sure each column is a permutation. */ for (i = 0; i < SBoxCount; i++) { char testArray[256]; int testShift = 0; int j; for (testShift = 0; testShift < 32; testShift += 8) { for (j = 0; j < 256; j++) testArray[j] = 0; for (j = 0; j < 256; j++) testArray[(standardSBoxes[i][j] >> testShift) & 0xff]++; for (j = 0; j < 256; j++) if (testArray[j] != 1) errAbort ("Table error -- the standard S box is corrupted"); }; }; /* It looks okay. Now check things out some more */ printf(" The standard S Boxes are permutations.\n"); checkSBoxes (); exit (0); }; *-*-END-*-*