00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "polarssl/config.h"
00033
00034 #if defined(POLARSSL_BLOWFISH_C)
00035
00036 #include "polarssl/blowfish.h"
00037
00038 #if !defined(POLARSSL_BLOWFISH_ALT)
00039
00040
00041
00042
00043 #ifndef GET_UINT32_BE
00044 #define GET_UINT32_BE(n,b,i) \
00045 { \
00046 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
00047 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
00048 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
00049 | ( (uint32_t) (b)[(i) + 3] ); \
00050 }
00051 #endif
00052
00053 #ifndef PUT_UINT32_BE
00054 #define PUT_UINT32_BE(n,b,i) \
00055 { \
00056 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
00057 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
00058 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
00059 (b)[(i) + 3] = (unsigned char) ( (n) ); \
00060 }
00061 #endif
00062
00063 static const uint32_t P[BLOWFISH_ROUNDS + 2] = {
00064 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
00065 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
00066 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
00067 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
00068 0x9216D5D9L, 0x8979FB1BL
00069 };
00070
00071
00072 static const uint32_t S[4][256];
00073
00074 static uint32_t F(blowfish_context *ctx, uint32_t x)
00075 {
00076 unsigned short a, b, c, d;
00077 uint32_t y;
00078
00079 d = (unsigned short)(x & 0xFF);
00080 x >>= 8;
00081 c = (unsigned short)(x & 0xFF);
00082 x >>= 8;
00083 b = (unsigned short)(x & 0xFF);
00084 x >>= 8;
00085 a = (unsigned short)(x & 0xFF);
00086 y = ctx->S[0][a] + ctx->S[1][b];
00087 y = y ^ ctx->S[2][c];
00088 y = y + ctx->S[3][d];
00089
00090 return y;
00091 }
00092
00093 static void blowfish_enc(blowfish_context *ctx, uint32_t *xl, uint32_t *xr)
00094 {
00095 uint32_t Xl, Xr, temp;
00096 short i;
00097
00098 Xl = *xl;
00099 Xr = *xr;
00100
00101 for (i = 0; i < BLOWFISH_ROUNDS; ++i)
00102 {
00103 Xl = Xl ^ ctx->P[i];
00104 Xr = F(ctx, Xl) ^ Xr;
00105
00106 temp = Xl;
00107 Xl = Xr;
00108 Xr = temp;
00109 }
00110
00111 temp = Xl;
00112 Xl = Xr;
00113 Xr = temp;
00114
00115 Xr = Xr ^ ctx->P[BLOWFISH_ROUNDS];
00116 Xl = Xl ^ ctx->P[BLOWFISH_ROUNDS + 1];
00117
00118 *xl = Xl;
00119 *xr = Xr;
00120 }
00121
00122 static void blowfish_dec(blowfish_context *ctx, uint32_t *xl, uint32_t *xr)
00123 {
00124 uint32_t Xl, Xr, temp;
00125 short i;
00126
00127 Xl = *xl;
00128 Xr = *xr;
00129
00130 for (i = BLOWFISH_ROUNDS + 1; i > 1; --i)
00131 {
00132 Xl = Xl ^ ctx->P[i];
00133 Xr = F(ctx, Xl) ^ Xr;
00134
00135 temp = Xl;
00136 Xl = Xr;
00137 Xr = temp;
00138 }
00139
00140 temp = Xl;
00141 Xl = Xr;
00142 Xr = temp;
00143
00144 Xr = Xr ^ ctx->P[1];
00145 Xl = Xl ^ ctx->P[0];
00146
00147 *xl = Xl;
00148 *xr = Xr;
00149 }
00150
00151
00152
00153
00154 int blowfish_setkey( blowfish_context *ctx, const unsigned char *key, unsigned int keysize )
00155 {
00156 unsigned int i, j, k;
00157 uint32_t data, datal, datar;
00158
00159 if( keysize < BLOWFISH_MIN_KEY || keysize > BLOWFISH_MAX_KEY ||
00160 ( keysize % 8 ) )
00161 {
00162 return POLARSSL_ERR_BLOWFISH_INVALID_KEY_LENGTH;
00163 }
00164
00165 keysize >>= 3;
00166
00167 for( i = 0; i < 4; i++ )
00168 {
00169 for( j = 0; j < 256; j++ )
00170 ctx->S[i][j] = S[i][j];
00171 }
00172
00173 j = 0;
00174 for( i = 0; i < BLOWFISH_ROUNDS + 2; ++i )
00175 {
00176 data = 0x00000000;
00177 for( k = 0; k < 4; ++k )
00178 {
00179 data = ( data << 8 ) | key[j++];
00180 if( j >= keysize )
00181 j = 0;
00182 }
00183 ctx->P[i] = P[i] ^ data;
00184 }
00185
00186 datal = 0x00000000;
00187 datar = 0x00000000;
00188
00189 for( i = 0; i < BLOWFISH_ROUNDS + 2; i += 2 )
00190 {
00191 blowfish_enc( ctx, &datal, &datar );
00192 ctx->P[i] = datal;
00193 ctx->P[i + 1] = datar;
00194 }
00195
00196 for( i = 0; i < 4; i++ )
00197 {
00198 for( j = 0; j < 256; j += 2 )
00199 {
00200 blowfish_enc( ctx, &datal, &datar );
00201 ctx->S[i][j] = datal;
00202 ctx->S[i][j + 1] = datar;
00203 }
00204 }
00205 return( 0 );
00206 }
00207
00208
00209
00210
00211 int blowfish_crypt_ecb( blowfish_context *ctx,
00212 int mode,
00213 const unsigned char input[BLOWFISH_BLOCKSIZE],
00214 unsigned char output[BLOWFISH_BLOCKSIZE] )
00215 {
00216 uint32_t X0, X1;
00217
00218 GET_UINT32_BE( X0, input, 0 );
00219 GET_UINT32_BE( X1, input, 4 );
00220
00221 if( mode == BLOWFISH_DECRYPT )
00222 {
00223 blowfish_dec(ctx, &X0, &X1);
00224 }
00225 else
00226 {
00227 blowfish_enc(ctx, &X0, &X1);
00228 }
00229
00230 PUT_UINT32_BE( X0, output, 0 );
00231 PUT_UINT32_BE( X1, output, 4 );
00232
00233 return( 0 );
00234 }
00235
00236 #if defined(POLARSSL_CIPHER_MODE_CBC)
00237
00238
00239
00240 int blowfish_crypt_cbc( blowfish_context *ctx,
00241 int mode,
00242 size_t length,
00243 unsigned char iv[BLOWFISH_BLOCKSIZE],
00244 const unsigned char *input,
00245 unsigned char *output )
00246 {
00247 int i;
00248 unsigned char temp[BLOWFISH_BLOCKSIZE];
00249
00250 if( length % BLOWFISH_BLOCKSIZE )
00251 return( POLARSSL_ERR_BLOWFISH_INVALID_INPUT_LENGTH );
00252
00253 if( mode == BLOWFISH_DECRYPT )
00254 {
00255 while( length > 0 )
00256 {
00257 memcpy( temp, input, BLOWFISH_BLOCKSIZE );
00258 blowfish_crypt_ecb( ctx, mode, input, output );
00259
00260 for( i = 0; i < BLOWFISH_BLOCKSIZE;i++ )
00261 output[i] = (unsigned char)( output[i] ^ iv[i] );
00262
00263 memcpy( iv, temp, BLOWFISH_BLOCKSIZE );
00264
00265 input += BLOWFISH_BLOCKSIZE;
00266 output += BLOWFISH_BLOCKSIZE;
00267 length -= BLOWFISH_BLOCKSIZE;
00268 }
00269 }
00270 else
00271 {
00272 while( length > 0 )
00273 {
00274 for( i = 0; i < BLOWFISH_BLOCKSIZE; i++ )
00275 output[i] = (unsigned char)( input[i] ^ iv[i] );
00276
00277 blowfish_crypt_ecb( ctx, mode, output, output );
00278 memcpy( iv, output, BLOWFISH_BLOCKSIZE );
00279
00280 input += BLOWFISH_BLOCKSIZE;
00281 output += BLOWFISH_BLOCKSIZE;
00282 length -= BLOWFISH_BLOCKSIZE;
00283 }
00284 }
00285
00286 return( 0 );
00287 }
00288 #endif
00289
00290 #if defined(POLARSSL_CIPHER_MODE_CFB)
00291
00292
00293
00294 int blowfish_crypt_cfb64( blowfish_context *ctx,
00295 int mode,
00296 size_t length,
00297 size_t *iv_off,
00298 unsigned char iv[BLOWFISH_BLOCKSIZE],
00299 const unsigned char *input,
00300 unsigned char *output )
00301 {
00302 int c;
00303 size_t n = *iv_off;
00304
00305 if( mode == BLOWFISH_DECRYPT )
00306 {
00307 while( length-- )
00308 {
00309 if( n == 0 )
00310 blowfish_crypt_ecb( ctx, BLOWFISH_ENCRYPT, iv, iv );
00311
00312 c = *input++;
00313 *output++ = (unsigned char)( c ^ iv[n] );
00314 iv[n] = (unsigned char) c;
00315
00316 n = (n + 1) % BLOWFISH_BLOCKSIZE;
00317 }
00318 }
00319 else
00320 {
00321 while( length-- )
00322 {
00323 if( n == 0 )
00324 blowfish_crypt_ecb( ctx, BLOWFISH_ENCRYPT, iv, iv );
00325
00326 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
00327
00328 n = (n + 1) % BLOWFISH_BLOCKSIZE;
00329 }
00330 }
00331
00332 *iv_off = n;
00333
00334 return( 0 );
00335 }
00336 #endif
00337
00338 #if defined(POLARSSL_CIPHER_MODE_CTR)
00339
00340
00341
00342 int blowfish_crypt_ctr( blowfish_context *ctx,
00343 size_t length,
00344 size_t *nc_off,
00345 unsigned char nonce_counter[BLOWFISH_BLOCKSIZE],
00346 unsigned char stream_block[BLOWFISH_BLOCKSIZE],
00347 const unsigned char *input,
00348 unsigned char *output )
00349 {
00350 int c, i;
00351 size_t n = *nc_off;
00352
00353 while( length-- )
00354 {
00355 if( n == 0 ) {
00356 blowfish_crypt_ecb( ctx, BLOWFISH_ENCRYPT, nonce_counter, stream_block );
00357
00358 for( i = BLOWFISH_BLOCKSIZE; i > 0; i-- )
00359 if( ++nonce_counter[i - 1] != 0 )
00360 break;
00361 }
00362 c = *input++;
00363 *output++ = (unsigned char)( c ^ stream_block[n] );
00364
00365 n = (n + 1) % BLOWFISH_BLOCKSIZE;
00366 }
00367
00368 *nc_off = n;
00369
00370 return( 0 );
00371 }
00372 #endif
00373
00374 static const uint32_t S[4][256] = {
00375 { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
00376 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
00377 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
00378 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
00379 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
00380 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
00381 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
00382 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
00383 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
00384 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
00385 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
00386 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
00387 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
00388 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
00389 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
00390 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
00391 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
00392 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
00393 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
00394 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
00395 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
00396 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
00397 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
00398 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
00399 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
00400 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
00401 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
00402 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
00403 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
00404 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
00405 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
00406 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
00407 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
00408 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
00409 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
00410 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
00411 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
00412 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
00413 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
00414 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
00415 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
00416 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
00417 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
00418 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
00419 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
00420 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
00421 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
00422 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
00423 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
00424 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
00425 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
00426 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
00427 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
00428 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
00429 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
00430 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
00431 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
00432 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
00433 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
00434 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
00435 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
00436 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
00437 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
00438 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL },
00439 { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
00440 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
00441 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
00442 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
00443 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
00444 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
00445 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
00446 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
00447 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
00448 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
00449 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
00450 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
00451 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
00452 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
00453 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
00454 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
00455 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
00456 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
00457 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
00458 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
00459 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
00460 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
00461 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
00462 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
00463 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
00464 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
00465 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
00466 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
00467 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
00468 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
00469 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
00470 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
00471 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
00472 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
00473 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
00474 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
00475 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
00476 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
00477 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
00478 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
00479 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
00480 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
00481 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
00482 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
00483 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
00484 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
00485 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
00486 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
00487 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
00488 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
00489 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
00490 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
00491 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
00492 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
00493 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
00494 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
00495 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
00496 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
00497 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
00498 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
00499 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
00500 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
00501 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
00502 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L },
00503 { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
00504 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
00505 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
00506 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
00507 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
00508 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
00509 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
00510 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
00511 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
00512 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
00513 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
00514 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
00515 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
00516 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
00517 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
00518 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
00519 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
00520 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
00521 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
00522 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
00523 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
00524 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
00525 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
00526 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
00527 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
00528 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
00529 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
00530 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
00531 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
00532 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
00533 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
00534 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
00535 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
00536 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
00537 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
00538 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
00539 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
00540 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
00541 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
00542 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
00543 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
00544 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
00545 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
00546 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
00547 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
00548 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
00549 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
00550 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
00551 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
00552 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
00553 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
00554 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
00555 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
00556 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
00557 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
00558 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
00559 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
00560 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
00561 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
00562 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
00563 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
00564 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
00565 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
00566 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L },
00567 { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
00568 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
00569 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
00570 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
00571 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
00572 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
00573 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
00574 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
00575 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
00576 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
00577 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
00578 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
00579 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
00580 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
00581 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
00582 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
00583 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
00584 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
00585 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
00586 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
00587 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
00588 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
00589 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
00590 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
00591 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
00592 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
00593 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
00594 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
00595 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
00596 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
00597 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
00598 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
00599 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
00600 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
00601 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
00602 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
00603 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
00604 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
00605 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
00606 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
00607 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
00608 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
00609 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
00610 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
00611 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
00612 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
00613 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
00614 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
00615 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
00616 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
00617 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
00618 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
00619 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
00620 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
00621 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
00622 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
00623 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
00624 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
00625 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
00626 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
00627 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
00628 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
00629 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
00630 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L }
00631 };
00632
00633 #endif
00634 #endif