WizardsToolkit  1.0.7
twofish.c
Go to the documentation of this file.
00001 /*
00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00003 %                                                                             %
00004 %                                                                             %
00005 %                                                                             %
00006 %               TTTTT  W   W   OOO   FFFFF  IIIII  SSSSS  H   H               %
00007 %                 T    W   W  O   O  F        I    SS     H   H               %
00008 %                 T    W W W  O   O  FFF      I     SSS   HHHHH               %
00009 %                 T    WW WW  O   O  F        I       SS  H   H               %
00010 %                 T    W   W   OOO   F      IIIII  SSSSS  H   H               %
00011 %                                                                             %
00012 %                                                                             %
00013 %                    Wizard's Toolkit Twofish Cipher Methods                  %
00014 %                                                                             %
00015 %                               Software Design                               %
00016 %                                 John Cristy                                 %
00017 %                                 March 2003                                  %
00018 %                                                                             %
00019 %  Copyright 1999-2011 ImageMagick Studio, LLC, Wilmington, DE, U.S.A.  All   %
00020 %  rights reserved.                                                           %
00021 %                                                                             %
00022 %  ImageMagick Studio, LLC. has intellectual property rights relating to      %
00023 %  technology embodied in this product.  In particular, and without           %
00024 %  limitation, these intellectual property rights may include one or more of  %
00025 %  the U.S. patents or pending patent applications in the U.S. and other      %
00026 %  countries.                                                                 %
00027 %                                                                             %
00028 %  This product is distributed under licenses restricting its use, copying    %
00029 %  distribution, and decompilation.  No part of this product may be           %
00030 %  reproduced in any form by any means without prior written authorization of %
00031 %  ImageMagick Studio and its licensors, if any.                              %
00032 %                                                                             %
00033 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00034 %
00035 %
00036 */
00037 
00038 /*
00039   Include declarations.
00040 */
00041 #include "wizard/studio.h"
00042 #include "wizard/exception.h"
00043 #include "wizard/exception-private.h"
00044 #include "wizard/memory_.h"
00045 #include "wizard/twofish.h"
00046 
00047 /*
00048   Typedef declarations.
00049 */
00050 struct _TwofishInfo
00051 {
00052   unsigned int
00053     blocksize,
00054     k[32],
00055     sbox[4][256],
00056     w[8];
00057 
00058   time_t
00059     timestamp;
00060 
00061   size_t
00062     signature;
00063 };
00064 
00065 /*
00066   Define declarations.
00067 */
00068 #define G1(alpha) \
00069   (twofish_info->sbox[0][(alpha) & 0xFF]) ^ \
00070   (twofish_info->sbox[1][((alpha) >> 8) & 0xFF]) ^ \
00071   (twofish_info->sbox[2][((alpha) >> 16) & 0xFF]) ^ \
00072   (twofish_info->sbox[3][(alpha) >> 24])
00073 #define G2(beta) \
00074   (twofish_info->sbox[1][(beta) & 0xFF]) ^ \
00075   (twofish_info->sbox[2][((beta) >> 8) & 0xFF]) ^ \
00076   (twofish_info->sbox[3][((beta) >> 16) & 0xFF]) ^ \
00077   (twofish_info->sbox[0][(beta) >> 24])
00078 #define Read32Bits(value,p) \
00079 { \
00080   (value)=(*p++); \
00081   (value)|=(*p++) << 8; \
00082   (value)|=(*p++) << 16; \
00083   (value)|=(*p++) << 24; \
00084 }
00085 #define TwofishBlocksize 16
00086 #define Write32Bits(p,value) \
00087 { \
00088   *p++=(unsigned char) (value); \
00089   *p++=(unsigned char) ((value) >> 8); \
00090   *p++=(unsigned char) ((value) >> 16); \
00091   *p++=(unsigned char) ((value) >> 24); \
00092 }
00093 
00094 /*
00095 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00096 %                                                                             %
00097 %                                                                             %
00098 %                                                                             %
00099 %   A c q u i r e T w o f i s h I n f o                                       %
00100 %                                                                             %
00101 %                                                                             %
00102 %                                                                             %
00103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00104 %
00105 %  AcquireTwofishInfo() allocate the TwofishInfo structure.
00106 %
00107 %  The format of the AcquireTwofishInfo method is:
00108 %
00109 %      TwofishInfo *AcquireTwofishInfo(void)
00110 %
00111 */
00112 WizardExport TwofishInfo *AcquireTwofishInfo(void)
00113 {
00114   TwofishInfo
00115     *twofish_info;
00116 
00117   twofish_info=(TwofishInfo *) AcquireWizardMemory(sizeof(*twofish_info));
00118   if (twofish_info == (TwofishInfo *) NULL)
00119     ThrowWizardFatalError(CipherDomain,MemoryError);
00120   (void) ResetWizardMemory(twofish_info,0,sizeof(*twofish_info));
00121   twofish_info->blocksize=TwofishBlocksize;
00122   twofish_info->timestamp=time((time_t *) NULL);
00123   twofish_info->signature=WizardSignature;
00124   return(twofish_info);
00125 }
00126 
00127 /*
00128 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00129 %                                                                             %
00130 %                                                                             %
00131 %                                                                             %
00132 %   D e c i p h e r T w o f i s h B l o c k                                   %
00133 %                                                                             %
00134 %                                                                             %
00135 %                                                                             %
00136 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00137 %
00138 %  DecipherTwofishBlock() deciphers a single block of ciphertext to produce a
00139 %  block of plaintext.
00140 %
00141 %  The format of the DecipherTwofishBlock method is:
00142 %
00143 %     void DecipherTwofishBlock(TwofishInfo *twofish_info,
00144 %       const unsigned char *ciphertext,unsigned char plaintext)
00145 %
00146 %  A description of each parameter follows:
00147 %
00148 %    o twofish_info: The cipher context.
00149 %
00150 %    o ciphertext: The cipher text.
00151 %
00152 %    o plaintext: The plaint text.
00153 %
00154 */
00155 WizardExport void DecipherTwofishBlock(TwofishInfo *twofish_info,
00156   const unsigned char *ciphertext,unsigned char *plaintext)
00157 {
00158 #define DecipherRound(alpha,beta,gamma,delta,i) \
00159 { \
00160   rho=G1(alpha); sigma=G2(beta); rho+=sigma; sigma+=rho; \
00161   delta^=sigma+twofish_info->k[2*(i)+1]; delta=(delta >> 1)+(delta << 31); \
00162   gamma=(gamma << 1)+(gamma >> 31); gamma^=(rho+twofish_info->k[2*(i)]); \
00163 }
00164 
00165   register unsigned char
00166     *q;
00167 
00168   unsigned int
00169     alpha,
00170     beta,
00171     delta,
00172     gamma,
00173     rho,
00174     sigma;
00175 
00176   /*
00177     Exercise 16 deciphering rounds.
00178   */
00179   gamma=ciphertext[0] ^ (ciphertext[1] << 8) ^ (ciphertext[2] << 16) ^
00180     (ciphertext[3] << 24) ^ twofish_info->w[4];
00181   delta=ciphertext[4] ^ (ciphertext[5] << 8) ^ (ciphertext[6] << 16) ^
00182     (ciphertext[7] << 24) ^ twofish_info->w[5];
00183   alpha=ciphertext[8] ^ (ciphertext[9] << 8) ^ (ciphertext[10] << 16) ^
00184     (ciphertext[11] << 24) ^ twofish_info->w[6];
00185   beta=ciphertext[12] ^ (ciphertext[13] << 8) ^ (ciphertext[14] << 16) ^
00186     (ciphertext[15] << 24) ^ twofish_info->w[7];
00187   DecipherRound(gamma,delta,alpha,beta,15);
00188   DecipherRound(alpha,beta,gamma,delta,14);
00189   DecipherRound(gamma,delta,alpha,beta,13);
00190   DecipherRound(alpha,beta,gamma,delta,12);
00191   DecipherRound(gamma,delta,alpha,beta,11);
00192   DecipherRound(alpha,beta,gamma,delta,10);
00193   DecipherRound(gamma,delta,alpha,beta,9);
00194   DecipherRound(alpha,beta,gamma,delta,8);
00195   DecipherRound(gamma,delta,alpha,beta,7);
00196   DecipherRound(alpha,beta,gamma,delta,6);
00197   DecipherRound(gamma,delta,alpha,beta,5);
00198   DecipherRound(alpha,beta,gamma,delta,4);
00199   DecipherRound(gamma,delta,alpha,beta,3);
00200   DecipherRound(alpha,beta,gamma,delta,2);
00201   DecipherRound(gamma,delta,alpha,beta,1);
00202   DecipherRound(alpha,beta,gamma,delta,0);
00203   q=(unsigned char *) plaintext;
00204   alpha^=twofish_info->w[0];
00205   Write32Bits(q,alpha);
00206   beta^=twofish_info->w[1];
00207   Write32Bits(q,beta);
00208   gamma^=twofish_info->w[2];
00209   Write32Bits(q,gamma);
00210   delta^=twofish_info->w[3];
00211   Write32Bits(q,delta);
00212   /*
00213     Reset registers.
00214   */
00215   alpha=0;
00216   beta=0;
00217   gamma=0;
00218   delta=0;
00219   rho=0;
00220   sigma=0;
00221 }
00222 
00223 /*
00224 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00225 %                                                                             %
00226 %                                                                             %
00227 %                                                                             %
00228 %   D e s t r o y T w o f i s h I n f o                                       %
00229 %                                                                             %
00230 %                                                                             %
00231 %                                                                             %
00232 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00233 %
00234 %  DestroyTwofishInfo() zeros memory associated with the TwofishInfo structure.
00235 %
00236 %  The format of the DestroyTwofishInfo method is:
00237 %
00238 %      TwofishInfo *DestroyTwofishInfo(TwofishInfo *twofish_info)
00239 %
00240 %  A description of each parameter follows:
00241 %
00242 %    o twofish_info: The cipher context.
00243 %
00244 */
00245 WizardExport TwofishInfo *DestroyTwofishInfo(TwofishInfo *twofish_info)
00246 {
00247   (void) LogWizardEvent(TraceEvent,GetWizardModule(),"...");
00248   WizardAssert(CipherDomain,twofish_info != (TwofishInfo *) NULL);
00249   WizardAssert(CipherDomain,twofish_info->signature == WizardSignature);
00250   twofish_info->signature=(~WizardSignature);
00251   twofish_info=(TwofishInfo *) RelinquishWizardMemory(twofish_info);
00252   return(twofish_info);
00253 }
00254 
00255 /*
00256 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00257 %                                                                             %
00258 %                                                                             %
00259 %                                                                             %
00260 %   E n c i p h e r T w o f i s h B l o c k                                   %
00261 %                                                                             %
00262 %                                                                             %
00263 %                                                                             %
00264 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00265 %
00266 %  EncipherTwofishBlock() encipher a single block of plaintext to produce a
00267 %  block of ciphertext.
00268 %
00269 %  The format of the EncipherTwofishBlock method is:
00270 %
00271 %      void EncipherTwofishBlock(TwofishInfo *twofish_info,
00272 %        const unsigned char *plaintext,unsigned char *ciphertext)
00273 %
00274 %  A description of each parameter follows:
00275 %
00276 %    o twofish_info: The cipher context.
00277 %
00278 %    o plaintext: The plain text.
00279 %
00280 %    o ciphertext: The cipher text.
00281 %
00282 */
00283 WizardExport void EncipherTwofishBlock(TwofishInfo *twofish_info,
00284   const unsigned char *plaintext,unsigned char *ciphertext)
00285 {
00286 #define EncipherRound(alpha,beta,gamma,delta,i) \
00287 { \
00288   rho=G1(alpha); sigma=G2(beta); \
00289   rho+=sigma; sigma+=rho+twofish_info->k[2*(i)+1]; \
00290   gamma^=rho+twofish_info->k[2*(i)]; gamma=(gamma >> 1)+(gamma << 31); \
00291   delta=((delta << 1)+(delta >> 31)) ^ sigma; \
00292 }
00293 
00294   register unsigned char
00295     *q;
00296 
00297   unsigned int
00298     alpha,
00299     beta,
00300     gamma,
00301     delta,
00302     rho,
00303     sigma;
00304 
00305   /*
00306     Exercise 16 enciphering rounds.
00307   */
00308   alpha=plaintext[0] ^ (plaintext[1] << 8) ^ (plaintext[2] << 16) ^
00309     (plaintext[3] << 24) ^ twofish_info->w[0];
00310   beta=plaintext[4] ^ (plaintext[5] << 8) ^ (plaintext[6] << 16) ^
00311     (plaintext[7] << 24) ^ twofish_info->w[1];
00312   gamma=plaintext[8] ^ (plaintext[9] << 8) ^ (plaintext[10] << 16) ^
00313     (plaintext[11] << 24) ^ twofish_info->w[2];
00314   delta=plaintext[12] ^ (plaintext[13] << 8) ^ (plaintext[14] << 16) ^
00315     (plaintext[15] << 24) ^ twofish_info->w[3];
00316   EncipherRound(alpha,beta,gamma,delta,0);
00317   EncipherRound(gamma,delta,alpha,beta,1)
00318   EncipherRound(alpha,beta,gamma,delta,2);
00319   EncipherRound(gamma,delta,alpha,beta,3)
00320   EncipherRound(alpha,beta,gamma,delta,4);
00321   EncipherRound(gamma,delta,alpha,beta,5)
00322   EncipherRound(alpha,beta,gamma,delta,6);
00323   EncipherRound(gamma,delta,alpha,beta,7)
00324   EncipherRound(alpha,beta,gamma,delta,8);
00325   EncipherRound(gamma,delta,alpha,beta,9)
00326   EncipherRound(alpha,beta,gamma,delta,10);
00327   EncipherRound(gamma,delta,alpha,beta,11)
00328   EncipherRound(alpha,beta,gamma,delta,12);
00329   EncipherRound(gamma,delta,alpha,beta,13)
00330   EncipherRound(alpha,beta,gamma,delta,14);
00331   EncipherRound(gamma,delta,alpha,beta,15)
00332   q=(unsigned char *) ciphertext;
00333   gamma^=twofish_info->w[4];
00334   Write32Bits(q,gamma);
00335   delta^=twofish_info->w[5];
00336   Write32Bits(q,delta);
00337   alpha^=twofish_info->w[6];
00338   Write32Bits(q,alpha);
00339   beta^=twofish_info->w[7];
00340   Write32Bits(q,beta);
00341   /*
00342     Reset registers.
00343   */
00344   alpha=0;
00345   beta=0;
00346   gamma=0;
00347   delta=0;
00348   rho=0;
00349   sigma=0;
00350 }
00351 
00352 /*
00353 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00354 %                                                                             %
00355 %                                                                             %
00356 %                                                                             %
00357 %   G e t T w o s i z e B l o c k s i z e                                     %
00358 %                                                                             %
00359 %                                                                             %
00360 %                                                                             %
00361 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00362 %
00363 %  GetTwofishBlocksize() returns the Twofish blocksize.
00364 %
00365 %  The format of the GetTwofishBlocksize method is:
00366 %
00367 %      unsigned int *GetTwofishBlocksize(const TwofishInfo *twofish_info)
00368 %
00369 %  A description of each parameter follows:
00370 %
00371 %    o twofish_info: The twofish info.
00372 %
00373 */
00374 WizardExport unsigned int GetTwofishBlocksize(const TwofishInfo *twofish_info)
00375 {
00376   (void) LogWizardEvent(TraceEvent,GetWizardModule(),"...");
00377   WizardAssert(CipherDomain,twofish_info != (TwofishInfo *) NULL);
00378   WizardAssert(CipherDomain,twofish_info->signature == WizardSignature);
00379   return(twofish_info->blocksize);
00380 }
00381 
00382 /*
00383 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00384 %                                                                             %
00385 %                                                                             %
00386 %                                                                             %
00387 %   S e t T w o f i s h K e y                                                 %
00388 %                                                                             %
00389 %                                                                             %
00390 %                                                                             %
00391 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
00392 %
00393 %  SetTwofishKey() sets the key for the Twofish cipher.  The key length is
00394 %  specified in bits.  Valid values are 128, 192, or 256 requiring a key
00395 %  buffer length in bytes of 16, 24, and 32 respectively.
00396 %
00397 %  The format of the SetTwofishKey method is:
00398 %
00399 %      SetTwofishKey(TwofishInfo *twofish_info,const StringInfo *key)
00400 %
00401 %  A description of each parameter follows:
00402 %
00403 %    o twofish_info: The cipher context.
00404 %
00405 %    o key: The key.
00406 %
00407 */
00408 WizardExport void SetTwofishKey(TwofishInfo *twofish_info,const StringInfo *key)
00409 {
00410 #define K128(x,j,k,l,m,n) \
00411 { \
00412   rho=Q128(k,l,k,l,0); sigma=Q128(m,n,m,n,4); \
00413   sigma=(sigma << 8)+(sigma >> 24); rho+=sigma; sigma+=rho; \
00414   twofish_info->x[j]=rho; twofish_info->x[(j)+1]=(sigma << 9)+(sigma >> 23); \
00415 }
00416 #define K192(x,j,k,l,m,n) \
00417 { \
00418   rho=Q192(l,l,k,k,0); sigma=Q192(n,n,m,m,4); \
00419   sigma=(sigma << 8)+(sigma >> 24); rho+=sigma; sigma+=rho; \
00420   twofish_info->x[j]=rho; twofish_info->x[(j)+1]=(sigma << 9)+(sigma >> 23); \
00421 }
00422 #define K256(x,j,k,l,m,n) \
00423 { \
00424   rho=Q256(k,l,0); sigma=Q256(m,n,4); \
00425   sigma=(sigma << 8)+(sigma >> 24); rho+=sigma; sigma+=rho; \
00426   twofish_info->x[j]=rho; twofish_info->x[(j)+1]=(sigma << 9)+(sigma >> 23); \
00427 }
00428 #define MaximumTwofishKeyLength  32
00429 #define Q128(alpha,beta,gamma,delta,i) \
00430   mds[0][q0[alpha ^ crypt_key[(i)+8]] ^ crypt_key[i]] ^ \
00431   mds[1][q0[beta ^ crypt_key[(i)+9]] ^ crypt_key[(i)+1]] ^ \
00432   mds[2][q1[gamma ^ crypt_key[(i)+10]] ^ crypt_key[(i)+2]] ^ \
00433   mds[3][q1[delta ^ crypt_key[(i)+11]] ^ crypt_key[(i)+3]]
00434 #define Q192(alpha,beta,gamma,delta,i) \
00435   Q128(q0[alpha ^ crypt_key[(i)+16]],q1[beta ^ crypt_key[(i)+17]], \
00436     q0[gamma ^ crypt_key[(i)+18]],q1[delta ^ crypt_key[(i)+19]],i)
00437 #define Q256(alpha,beta,i) \
00438   Q192(q1[beta ^ crypt_key[(i)+24]],q1[alpha ^ crypt_key[(i)+25]], \
00439     q0[alpha ^ crypt_key[(i)+26]],q0[beta ^ crypt_key[(i)+27]],i)
00440 #define Sbox(alpha,beta,gamma,delta,i,w,x,y,z) \
00441 { \
00442   if (crypt_key[i] != 0) \
00443     { \
00444       xi=polynomial_to_exponent[crypt_key[i]-1]; \
00445       (alpha)^=exponent_to_polynomial[xi+(w)]; \
00446       (beta)^=exponent_to_polynomial[xi+(x)]; \
00447       (gamma)^=exponent_to_polynomial[xi+(y)]; \
00448       (delta)^=exponent_to_polynomial[xi+(z)]; \
00449    } \
00450 }
00451 
00452   static const unsigned char
00453     exponent_to_polynomial[492] =
00454     {
00455       0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D, 0x9A, 0x79,
00456       0xF2, 0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E, 0xDC, 0xF5,
00457       0xA7, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD, 0xD7, 0xE3,
00458       0x8B, 0x5B, 0xB6, 0x21, 0x42, 0x84, 0x45, 0x8A, 0x59, 0xB2, 0x29,
00459       0x52, 0xA4, 0x05, 0x0A, 0x14, 0x28, 0x50, 0xA0, 0x0D, 0x1A, 0x34,
00460       0x68, 0xD0, 0xED, 0x97, 0x63, 0xC6, 0xC1, 0xCF, 0xD3, 0xEB, 0x9B,
00461       0x7B, 0xF6, 0xA1, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xAD, 0x17, 0x2E,
00462       0x5C, 0xB8, 0x3D, 0x7A, 0xF4, 0xA5, 0x07, 0x0E, 0x1C, 0x38, 0x70,
00463       0xE0, 0x8D, 0x57, 0xAE, 0x11, 0x22, 0x44, 0x88, 0x5D, 0xBA, 0x39,
00464       0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51, 0xA2, 0x09, 0x12, 0x24, 0x48,
00465       0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66, 0xCC, 0xD5, 0xE7, 0x83,
00466       0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB, 0x1B, 0x36, 0x6C,
00467       0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19, 0x32, 0x64,
00468       0xC8, 0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x2D, 0x5A,
00469       0xB4, 0x25, 0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3, 0x2B, 0x56,
00470       0xAC, 0x15, 0x2A, 0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8, 0x9D, 0x77,
00471       0xEE, 0x91, 0x6F, 0xDE, 0xF1, 0xAF, 0x13, 0x26, 0x4C, 0x98, 0x7D,
00472       0xFA, 0xB9, 0x3F, 0x7E, 0xFC, 0xB5, 0x27, 0x4E, 0x9C, 0x75, 0xEA,
00473       0x99, 0x7F, 0xFE, 0xB1, 0x2F, 0x5E, 0xBC, 0x35, 0x6A, 0xD4, 0xE5,
00474       0x87, 0x43, 0x86, 0x41, 0x82, 0x49, 0x92, 0x69, 0xD2, 0xE9, 0x9F,
00475       0x73, 0xE6, 0x81, 0x4F, 0x9E, 0x71, 0xE2, 0x89, 0x5F, 0xBE, 0x31,
00476       0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB, 0xDB, 0xFB, 0xBB, 0x3B, 0x76,
00477       0xEC, 0x95, 0x67, 0xCE, 0xD1, 0xEF, 0x93, 0x6B, 0xD6, 0xE1, 0x8F,
00478       0x53, 0xA6, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D,
00479       0x9A, 0x79, 0xF2, 0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E,
00480       0xDC, 0xF5, 0xA7, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD,
00481       0xD7, 0xE3, 0x8B, 0x5B, 0xB6, 0x21, 0x42, 0x84, 0x45, 0x8A, 0x59,
00482       0xB2, 0x29, 0x52, 0xA4, 0x05, 0x0A, 0x14, 0x28, 0x50, 0xA0, 0x0D,
00483       0x1A, 0x34, 0x68, 0xD0, 0xED, 0x97, 0x63, 0xC6, 0xC1, 0xCF, 0xD3,
00484       0xEB, 0x9B, 0x7B, 0xF6, 0xA1, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xAD,
00485       0x17, 0x2E, 0x5C, 0xB8, 0x3D, 0x7A, 0xF4, 0xA5, 0x07, 0x0E, 0x1C,
00486       0x38, 0x70, 0xE0, 0x8D, 0x57, 0xAE, 0x11, 0x22, 0x44, 0x88, 0x5D,
00487       0xBA, 0x39, 0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51, 0xA2, 0x09, 0x12,
00488       0x24, 0x48, 0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66, 0xCC, 0xD5,
00489       0xE7, 0x83, 0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB, 0x1B,
00490       0x36, 0x6C, 0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19,
00491       0x32, 0x64, 0xC8, 0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0,
00492       0x2D, 0x5A, 0xB4, 0x25, 0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3,
00493       0x2B, 0x56, 0xAC, 0x15, 0x2A, 0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8,
00494       0x9D, 0x77, 0xEE, 0x91, 0x6F, 0xDE, 0xF1, 0xAF, 0x13, 0x26, 0x4C,
00495       0x98, 0x7D, 0xFA, 0xB9, 0x3F, 0x7E, 0xFC, 0xB5, 0x27, 0x4E, 0x9C,
00496       0x75, 0xEA, 0x99, 0x7F, 0xFE, 0xB1, 0x2F, 0x5E, 0xBC, 0x35, 0x6A,
00497       0xD4, 0xE5, 0x87, 0x43, 0x86, 0x41, 0x82, 0x49, 0x92, 0x69, 0xD2,
00498       0xE9, 0x9F, 0x73, 0xE6, 0x81, 0x4F, 0x9E, 0x71, 0xE2, 0x89, 0x5F,
00499       0xBE, 0x31, 0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB
00500     },
00501     polynomial_to_exponent[255] =
00502     {
00503       0x00, 0x01, 0x17, 0x02, 0x2E, 0x18, 0x53, 0x03, 0x6A, 0x2F, 0x93,
00504       0x19, 0x34, 0x54, 0x45, 0x04, 0x5C, 0x6B, 0xB6, 0x30, 0xA6, 0x94,
00505       0x4B, 0x1A, 0x8C, 0x35, 0x81, 0x55, 0xAA, 0x46, 0x0D, 0x05, 0x24,
00506       0x5D, 0x87, 0x6C, 0x9B, 0xB7, 0xC1, 0x31, 0x2B, 0xA7, 0xA3, 0x95,
00507       0x98, 0x4C, 0xCA, 0x1B, 0xE6, 0x8D, 0x73, 0x36, 0xCD, 0x82, 0x12,
00508       0x56, 0x62, 0xAB, 0xF0, 0x47, 0x4F, 0x0E, 0xBD, 0x06, 0xD4, 0x25,
00509       0xD2, 0x5E, 0x27, 0x88, 0x66, 0x6D, 0xD6, 0x9C, 0x79, 0xB8, 0x08,
00510       0xC2, 0xDF, 0x32, 0x68, 0x2C, 0xFD, 0xA8, 0x8A, 0xA4, 0x5A, 0x96,
00511       0x29, 0x99, 0x22, 0x4D, 0x60, 0xCB, 0xE4, 0x1C, 0x7B, 0xE7, 0x3B,
00512       0x8E, 0x9E, 0x74, 0xF4, 0x37, 0xD8, 0xCE, 0xF9, 0x83, 0x6F, 0x13,
00513       0xB2, 0x57, 0xE1, 0x63, 0xDC, 0xAC, 0xC4, 0xF1, 0xAF, 0x48, 0x0A,
00514       0x50, 0x42, 0x0F, 0xBA, 0xBE, 0xC7, 0x07, 0xDE, 0xD5, 0x78, 0x26,
00515       0x65, 0xD3, 0xD1, 0x5F, 0xE3, 0x28, 0x21, 0x89, 0x59, 0x67, 0xFC,
00516       0x6E, 0xB1, 0xD7, 0xF8, 0x9D, 0xF3, 0x7A, 0x3A, 0xB9, 0xC6, 0x09,
00517       0x41, 0xC3, 0xAE, 0xE0, 0xDB, 0x33, 0x44, 0x69, 0x92, 0x2D, 0x52,
00518       0xFE, 0x16, 0xA9, 0x0C, 0x8B, 0x80, 0xA5, 0x4A, 0x5B, 0xB5, 0x97,
00519       0xC9, 0x2A, 0xA2, 0x9A, 0xC0, 0x23, 0x86, 0x4E, 0xBC, 0x61, 0xEF,
00520       0xCC, 0x11, 0xE5, 0x72, 0x1D, 0x3D, 0x7C, 0xEB, 0xE8, 0xE9, 0x3C,
00521       0xEA, 0x8F, 0x7D, 0x9F, 0xEC, 0x75, 0x1E, 0xF5, 0x3E, 0x38, 0xF6,
00522       0xD9, 0x3F, 0xCF, 0x76, 0xFA, 0x1F, 0x84, 0xA0, 0x70, 0xED, 0x14,
00523       0x90, 0xB3, 0x7E, 0x58, 0xFB, 0xE2, 0x20, 0x64, 0xD0, 0xDD, 0x77,
00524       0xAD, 0xDA, 0xC5, 0x40, 0xF2, 0x39, 0xB0, 0xF7, 0x49, 0xB4, 0x0B,
00525       0x7F, 0x51, 0x15, 0x43, 0x91, 0x10, 0x71, 0xBB, 0xEE, 0xBF, 0x85,
00526       0xC8, 0xA1
00527     },
00528     q0[256] =
00529     {
00530        0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, 0x9A, 0x92, 0x80,
00531        0x78, 0xE4, 0xDD, 0xD1, 0x38, 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7,
00532        0xEC, 0x6C, 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, 0xF2,
00533        0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, 0x19, 0x5B, 0x3D, 0x59,
00534        0xF3, 0xAE, 0xA2, 0x82, 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B,
00535        0x7C, 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, 0xC0, 0x8C,
00536        0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, 0xBB, 0x4E, 0x89, 0x6B, 0x53,
00537        0x6A, 0xB4, 0xF1, 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66,
00538        0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, 0xFB, 0xC3, 0x8E,
00539        0xB5, 0xE9, 0xCF, 0xBF, 0xBA, 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9,
00540        0x62, 0x71, 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, 0xE5,
00541        0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, 0xA1, 0x1D, 0xAA, 0xED,
00542        0x06, 0x70, 0xB2, 0xD2, 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27,
00543        0x90, 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, 0x9E, 0x9C,
00544        0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, 0x91, 0x85, 0x49, 0xEE, 0x2D,
00545        0x4F, 0x8F, 0x3B, 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64,
00546        0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, 0xAC, 0x7F, 0xD5,
00547        0x1A, 0x4B, 0x0E, 0xA7, 0x5A, 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C,
00548        0x4C, 0x02, 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, 0x57,
00549        0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, 0x7E, 0x15, 0x22, 0x12,
00550        0x58, 0x07, 0x99, 0x34, 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB,
00551        0xF8, 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, 0xCA, 0x10,
00552        0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, 0x6F, 0x9D, 0x36, 0x42, 0x4A,
00553        0x5E, 0xC1, 0xE0
00554     },
00555     q1[256] =
00556     {
00557        0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, 0x4A, 0xD3, 0xE6,
00558        0x6B, 0x45, 0x7D, 0xE8, 0x4B, 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71,
00559        0xF1, 0xE1, 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, 0x5E,
00560        0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, 0x6D, 0xC1, 0xB1, 0x0E,
00561        0x80, 0x5D, 0xD2, 0xD5, 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C,
00562        0xA3, 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, 0x38, 0xB0,
00563        0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, 0x6C, 0x42, 0xF7, 0x10, 0x7C,
00564        0x28, 0x27, 0x8C, 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70,
00565        0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, 0xA6, 0x83, 0x20,
00566        0xFF, 0x9F, 0x77, 0xC3, 0xCC, 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7,
00567        0x2B, 0xE2, 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, 0xE4,
00568        0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, 0x66, 0x94, 0xA1, 0x1D,
00569        0x3D, 0xF0, 0xDE, 0xB3, 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53,
00570        0x3E, 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, 0x81, 0x88,
00571        0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, 0xC5, 0x39, 0x99, 0xCD, 0xAD,
00572        0x31, 0x8B, 0x01, 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48,
00573        0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, 0x8D, 0xE5, 0x98,
00574        0x57, 0x67, 0x7F, 0x05, 0x64, 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7,
00575        0x3C, 0xA5, 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, 0x29,
00576        0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, 0x6E, 0x47, 0xDF, 0x34,
00577        0x35, 0x6A, 0xCF, 0xDC, 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED,
00578        0xAB, 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, 0xD7, 0x61,
00579        0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, 0x16, 0x25, 0x86, 0x56, 0x55,
00580        0x09, 0xBE, 0x91
00581     },
00582     sbox[512] =
00583     {
00584       0xA9, 0x75, 0x67, 0xF3, 0xB3, 0xC6, 0xE8, 0xF4, 0x04, 0xDB, 0xFD,
00585       0x7B, 0xA3, 0xFB, 0x76, 0xC8, 0x9A, 0x4A, 0x92, 0xD3, 0x80, 0xE6,
00586       0x78, 0x6B, 0xE4, 0x45, 0xDD, 0x7D, 0xD1, 0xE8, 0x38, 0x4B, 0x0D,
00587       0xD6, 0xC6, 0x32, 0x35, 0xD8, 0x98, 0xFD, 0x18, 0x37, 0xF7, 0x71,
00588       0xEC, 0xF1, 0x6C, 0xE1, 0x43, 0x30, 0x75, 0x0F, 0x37, 0xF8, 0x26,
00589       0x1B, 0xFA, 0x87, 0x13, 0xFA, 0x94, 0x06, 0x48, 0x3F, 0xF2, 0x5E,
00590       0xD0, 0xBA, 0x8B, 0xAE, 0x30, 0x5B, 0x84, 0x8A, 0x54, 0x00, 0xDF,
00591       0xBC, 0x23, 0x9D, 0x19, 0x6D, 0x5B, 0xC1, 0x3D, 0xB1, 0x59, 0x0E,
00592       0xF3, 0x80, 0xAE, 0x5D, 0xA2, 0xD2, 0x82, 0xD5, 0x63, 0xA0, 0x01,
00593       0x84, 0x83, 0x07, 0x2E, 0x14, 0xD9, 0xB5, 0x51, 0x90, 0x9B, 0x2C,
00594       0x7C, 0xA3, 0xA6, 0xB2, 0xEB, 0x73, 0xA5, 0x4C, 0xBE, 0x54, 0x16,
00595       0x92, 0x0C, 0x74, 0xE3, 0x36, 0x61, 0x51, 0xC0, 0x38, 0x8C, 0xB0,
00596       0x3A, 0xBD, 0xF5, 0x5A, 0x73, 0xFC, 0x2C, 0x60, 0x25, 0x62, 0x0B,
00597       0x96, 0xBB, 0x6C, 0x4E, 0x42, 0x89, 0xF7, 0x6B, 0x10, 0x53, 0x7C,
00598       0x6A, 0x28, 0xB4, 0x27, 0xF1, 0x8C, 0xE1, 0x13, 0xE6, 0x95, 0xBD,
00599       0x9C, 0x45, 0xC7, 0xE2, 0x24, 0xF4, 0x46, 0xB6, 0x3B, 0x66, 0x70,
00600       0xCC, 0xCA, 0x95, 0xE3, 0x03, 0x85, 0x56, 0xCB, 0xD4, 0x11, 0x1C,
00601       0xD0, 0x1E, 0x93, 0xD7, 0xB8, 0xFB, 0xA6, 0xC3, 0x83, 0x8E, 0x20,
00602       0xB5, 0xFF, 0xE9, 0x9F, 0xCF, 0x77, 0xBF, 0xC3, 0xBA, 0xCC, 0xEA,
00603       0x03, 0x77, 0x6F, 0x39, 0x08, 0xAF, 0xBF, 0x33, 0x40, 0xC9, 0xE7,
00604       0x62, 0x2B, 0x71, 0xE2, 0x81, 0x79, 0x79, 0x0C, 0x09, 0xAA, 0xAD,
00605       0x82, 0x24, 0x41, 0xCD, 0x3A, 0xF9, 0xEA, 0xD8, 0xB9, 0xE5, 0xE4,
00606       0xC5, 0x9A, 0xB9, 0xA4, 0x4D, 0x97, 0x44, 0x7E, 0x08, 0xDA, 0x86,
00607       0x7A, 0xE7, 0x17, 0xA1, 0x66, 0x1D, 0x94, 0xAA, 0xA1, 0xED, 0x1D,
00608       0x06, 0x3D, 0x70, 0xF0, 0xB2, 0xDE, 0xD2, 0xB3, 0x41, 0x0B, 0x7B,
00609       0x72, 0xA0, 0xA7, 0x11, 0x1C, 0x31, 0xEF, 0xC2, 0xD1, 0x27, 0x53,
00610       0x90, 0x3E, 0x20, 0x8F, 0xF6, 0x33, 0x60, 0x26, 0xFF, 0x5F, 0x96,
00611       0xEC, 0x5C, 0x76, 0xB1, 0x2A, 0xAB, 0x49, 0x9E, 0x81, 0x9C, 0x88,
00612       0x52, 0xEE, 0x1B, 0x21, 0x5F, 0xC4, 0x93, 0x1A, 0x0A, 0xEB, 0xEF,
00613       0xD9, 0x91, 0xC5, 0x85, 0x39, 0x49, 0x99, 0xEE, 0xCD, 0x2D, 0xAD,
00614       0x4F, 0x31, 0x8F, 0x8B, 0x3B, 0x01, 0x47, 0x18, 0x87, 0x23, 0x6D,
00615       0xDD, 0x46, 0x1F, 0xD6, 0x4E, 0x3E, 0x2D, 0x69, 0xF9, 0x64, 0x48,
00616       0x2A, 0x4F, 0xCE, 0xF2, 0xCB, 0x65, 0x2F, 0x8E, 0xFC, 0x78, 0x97,
00617       0x5C, 0x05, 0x58, 0x7A, 0x19, 0xAC, 0x8D, 0x7F, 0xE5, 0xD5, 0x98,
00618       0x1A, 0x57, 0x4B, 0x67, 0x0E, 0x7F, 0xA7, 0x05, 0x5A, 0x64, 0x28,
00619       0xAF, 0x14, 0x63, 0x3F, 0xB6, 0x29, 0xFE, 0x88, 0xF5, 0x3C, 0xB7,
00620       0x4C, 0x3C, 0x02, 0xA5, 0xB8, 0xCE, 0xDA, 0xE9, 0xB0, 0x68, 0x17,
00621       0x44, 0x55, 0xE0, 0x1F, 0x4D, 0x8A, 0x43, 0x7D, 0x69, 0x57, 0x29,
00622       0xC7, 0x2E, 0x8D, 0xAC, 0x74, 0x15, 0xB7, 0x59, 0xC4, 0xA8, 0x9F,
00623       0x0A, 0x72, 0x9E, 0x7E, 0x6E, 0x15, 0x47, 0x22, 0xDF, 0x12, 0x34,
00624       0x58, 0x35, 0x07, 0x6A, 0x99, 0xCF, 0x34, 0xDC, 0x6E, 0x22, 0x50,
00625       0xC9, 0xDE, 0xC0, 0x68, 0x9B, 0x65, 0x89, 0xBC, 0xD4, 0xDB, 0xED,
00626       0xF8, 0xAB, 0xC8, 0x12, 0xA8, 0xA2, 0x2B, 0x0D, 0x40, 0x52, 0xDC,
00627       0xBB, 0xFE, 0x02, 0x32, 0x2F, 0xA4, 0xA9, 0xCA, 0xD7, 0x10, 0x61,
00628       0x21, 0x1E, 0xF0, 0xB4, 0xD3, 0x50, 0x5D, 0x04, 0x0F, 0xF6, 0x00,
00629       0xC2, 0x6F, 0x16, 0x9D, 0x25, 0x36, 0x86, 0x42, 0x56, 0x4A, 0x55,
00630       0x5E, 0x09, 0xC1, 0xBE, 0xE0, 0x91
00631     };
00632 
00633   static const unsigned int
00634     mds[4][256] =
00635     {
00636       { 0xBCBC3275U, 0xECEC21F3U, 0x202043C6U, 0xB3B3C9F4U, 0xDADA03DBU,
00637         0x02028B7BU, 0xE2E22BFBU, 0x9E9EFAC8U, 0xC9C9EC4AU, 0xD4D409D3U,
00638         0x18186BE6U, 0x1E1E9F6BU, 0x98980E45U, 0xB2B2387DU, 0xA6A6D2E8U,
00639         0x2626B74BU, 0x3C3C57D6U, 0x93938A32U, 0x8282EED8U, 0x525298FDU,
00640         0x7B7BD437U, 0xBBBB3771U, 0x5B5B97F1U, 0x474783E1U, 0x24243C30U,
00641         0x5151E20FU, 0xBABAC6F8U, 0x4A4AF31BU, 0xBFBF4887U, 0x0D0D70FAU,
00642         0xB0B0B306U, 0x7575DE3FU, 0xD2D2FD5EU, 0x7D7D20BAU, 0x666631AEU,
00643         0x3A3AA35BU, 0x59591C8AU, 0x00000000U, 0xCDCD93BCU, 0x1A1AE09DU,
00644         0xAEAE2C6DU, 0x7F7FABC1U, 0x2B2BC7B1U, 0xBEBEB90EU, 0xE0E0A080U,
00645         0x8A8A105DU, 0x3B3B52D2U, 0x6464BAD5U, 0xD8D888A0U, 0xE7E7A584U,
00646         0x5F5FE807U, 0x1B1B1114U, 0x2C2CC2B5U, 0xFCFCB490U, 0x3131272CU,
00647         0x808065A3U, 0x73732AB2U, 0x0C0C8173U, 0x79795F4CU, 0x6B6B4154U,
00648         0x4B4B0292U, 0x53536974U, 0x94948F36U, 0x83831F51U, 0x2A2A3638U,
00649         0xC4C49CB0U, 0x2222C8BDU, 0xD5D5F85AU, 0xBDBDC3FCU, 0x48487860U,
00650         0xFFFFCE62U, 0x4C4C0796U, 0x4141776CU, 0xC7C7E642U, 0xEBEB24F7U,
00651         0x1C1C1410U, 0x5D5D637CU, 0x36362228U, 0x6767C027U, 0xE9E9AF8CU,
00652         0x4444F913U, 0x1414EA95U, 0xF5F5BB9CU, 0xCFCF18C7U, 0x3F3F2D24U,
00653         0xC0C0E346U, 0x7272DB3BU, 0x54546C70U, 0x29294CCAU, 0xF0F035E3U,
00654         0x0808FE85U, 0xC6C617CBU, 0xF3F34F11U, 0x8C8CE4D0U, 0xA4A45993U,
00655         0xCACA96B8U, 0x68683BA6U, 0xB8B84D83U, 0x38382820U, 0xE5E52EFFU,
00656         0xADAD569FU, 0x0B0B8477U, 0xC8C81DC3U, 0x9999FFCCU, 0x5858ED03U,
00657         0x19199A6FU, 0x0E0E0A08U, 0x95957EBFU, 0x70705040U, 0xF7F730E7U,
00658         0x6E6ECF2BU, 0x1F1F6EE2U, 0xB5B53D79U, 0x09090F0CU, 0x616134AAU,
00659         0x57571682U, 0x9F9F0B41U, 0x9D9D803AU, 0x111164EAU, 0x2525CDB9U,
00660         0xAFAFDDE4U, 0x4545089AU, 0xDFDF8DA4U, 0xA3A35C97U, 0xEAEAD57EU,
00661         0x353558DAU, 0xEDEDD07AU, 0x4343FC17U, 0xF8F8CB66U, 0xFBFBB194U,
00662         0x3737D3A1U, 0xFAFA401DU, 0xC2C2683DU, 0xB4B4CCF0U, 0x32325DDEU,
00663         0x9C9C71B3U, 0x5656E70BU, 0xE3E3DA72U, 0x878760A7U, 0x15151B1CU,
00664         0xF9F93AEFU, 0x6363BFD1U, 0x3434A953U, 0x9A9A853EU, 0xB1B1428FU,
00665         0x7C7CD133U, 0x88889B26U, 0x3D3DA65FU, 0xA1A1D7ECU, 0xE4E4DF76U,
00666         0x8181942AU, 0x91910149U, 0x0F0FFB81U, 0xEEEEAA88U, 0x161661EEU,
00667         0xD7D77321U, 0x9797F5C4U, 0xA5A5A81AU, 0xFEFE3FEBU, 0x6D6DB5D9U,
00668         0x7878AEC5U, 0xC5C56D39U, 0x1D1DE599U, 0x7676A4CDU, 0x3E3EDCADU,
00669         0xCBCB6731U, 0xB6B6478BU, 0xEFEF5B01U, 0x12121E18U, 0x6060C523U,
00670         0x6A6AB0DDU, 0x4D4DF61FU, 0xCECEE94EU, 0xDEDE7C2DU, 0x55559DF9U,
00671         0x7E7E5A48U, 0x2121B24FU, 0x03037AF2U, 0xA0A02665U, 0x5E5E198EU,
00672         0x5A5A6678U, 0x65654B5CU, 0x62624E58U, 0xFDFD4519U, 0x0606F48DU,
00673         0x404086E5U, 0xF2F2BE98U, 0x3333AC57U, 0x17179067U, 0x05058E7FU,
00674         0xE8E85E05U, 0x4F4F7D64U, 0x89896AAFU, 0x10109563U, 0x74742FB6U,
00675         0x0A0A75FEU, 0x5C5C92F5U, 0x9B9B74B7U, 0x2D2D333CU, 0x3030D6A5U,
00676         0x2E2E49CEU, 0x494989E9U, 0x46467268U, 0x77775544U, 0xA8A8D8E0U,
00677         0x9696044DU, 0x2828BD43U, 0xA9A92969U, 0xD9D97929U, 0x8686912EU,
00678         0xD1D187ACU, 0xF4F44A15U, 0x8D8D1559U, 0xD6D682A8U, 0xB9B9BC0AU,
00679         0x42420D9EU, 0xF6F6C16EU, 0x2F2FB847U, 0xDDDD06DFU, 0x23233934U,
00680         0xCCCC6235U, 0xF1F1C46AU, 0xC1C112CFU, 0x8585EBDCU, 0x8F8F9E22U,
00681         0x7171A1C9U, 0x9090F0C0U, 0xAAAA539BU, 0x0101F189U, 0x8B8BE1D4U,
00682         0x4E4E8CEDU, 0x8E8E6FABU, 0xABABA212U, 0x6F6F3EA2U, 0xE6E6540DU,
00683         0xDBDBF252U, 0x92927BBBU, 0xB7B7B602U, 0x6969CA2FU, 0x3939D9A9U,
00684         0xD3D30CD7U, 0xA7A72361U, 0xA2A2AD1EU, 0xC3C399B4U, 0x6C6C4450U,
00685         0x07070504U, 0x04047FF6U, 0x272746C2U, 0xACACA716U, 0xD0D07625U,
00686         0x50501386U, 0xDCDCF756U, 0x84841A55U, 0xE1E15109U, 0x7A7A25BEU,
00687         0x1313EF91U
00688       },
00689       { 0xA9D93939U, 0x67901717U, 0xB3719C9CU, 0xE8D2A6A6U, 0x04050707U,
00690         0xFD985252U, 0xA3658080U, 0x76DFE4E4U, 0x9A084545U, 0x92024B4BU,
00691         0x80A0E0E0U, 0x78665A5AU, 0xE4DDAFAFU, 0xDDB06A6AU, 0xD1BF6363U,
00692         0x38362A2AU, 0x0D54E6E6U, 0xC6432020U, 0x3562CCCCU, 0x98BEF2F2U,
00693         0x181E1212U, 0xF724EBEBU, 0xECD7A1A1U, 0x6C774141U, 0x43BD2828U,
00694         0x7532BCBCU, 0x37D47B7BU, 0x269B8888U, 0xFA700D0DU, 0x13F94444U,
00695         0x94B1FBFBU, 0x485A7E7EU, 0xF27A0303U, 0xD0E48C8CU, 0x8B47B6B6U,
00696         0x303C2424U, 0x84A5E7E7U, 0x54416B6BU, 0xDF06DDDDU, 0x23C56060U,
00697         0x1945FDFDU, 0x5BA33A3AU, 0x3D68C2C2U, 0x59158D8DU, 0xF321ECECU,
00698         0xAE316666U, 0xA23E6F6FU, 0x82165757U, 0x63951010U, 0x015BEFEFU,
00699         0x834DB8B8U, 0x2E918686U, 0xD9B56D6DU, 0x511F8383U, 0x9B53AAAAU,
00700         0x7C635D5DU, 0xA63B6868U, 0xEB3FFEFEU, 0xA5D63030U, 0xBE257A7AU,
00701         0x16A7ACACU, 0x0C0F0909U, 0xE335F0F0U, 0x6123A7A7U, 0xC0F09090U,
00702         0x8CAFE9E9U, 0x3A809D9DU, 0xF5925C5CU, 0x73810C0CU, 0x2C273131U,
00703         0x2576D0D0U, 0x0BE75656U, 0xBB7B9292U, 0x4EE9CECEU, 0x89F10101U,
00704         0x6B9F1E1EU, 0x53A93434U, 0x6AC4F1F1U, 0xB499C3C3U, 0xF1975B5BU,
00705         0xE1834747U, 0xE66B1818U, 0xBDC82222U, 0x450E9898U, 0xE26E1F1FU,
00706         0xF4C9B3B3U, 0xB62F7474U, 0x66CBF8F8U, 0xCCFF9999U, 0x95EA1414U,
00707         0x03ED5858U, 0x56F7DCDCU, 0xD4E18B8BU, 0x1C1B1515U, 0x1EADA2A2U,
00708         0xD70CD3D3U, 0xFB2BE2E2U, 0xC31DC8C8U, 0x8E195E5EU, 0xB5C22C2CU,
00709         0xE9894949U, 0xCF12C1C1U, 0xBF7E9595U, 0xBA207D7DU, 0xEA641111U,
00710         0x77840B0BU, 0x396DC5C5U, 0xAF6A8989U, 0x33D17C7CU, 0xC9A17171U,
00711         0x62CEFFFFU, 0x7137BBBBU, 0x81FB0F0FU, 0x793DB5B5U, 0x0951E1E1U,
00712         0xADDC3E3EU, 0x242D3F3FU, 0xCDA47676U, 0xF99D5555U, 0xD8EE8282U,
00713         0xE5864040U, 0xC5AE7878U, 0xB9CD2525U, 0x4D049696U, 0x44557777U,
00714         0x080A0E0EU, 0x86135050U, 0xE730F7F7U, 0xA1D33737U, 0x1D40FAFAU,
00715         0xAA346161U, 0xED8C4E4EU, 0x06B3B0B0U, 0x706C5454U, 0xB22A7373U,
00716         0xD2523B3BU, 0x410B9F9FU, 0x7B8B0202U, 0xA088D8D8U, 0x114FF3F3U,
00717         0x3167CBCBU, 0xC2462727U, 0x27C06767U, 0x90B4FCFCU, 0x20283838U,
00718         0xF67F0404U, 0x60784848U, 0xFF2EE5E5U, 0x96074C4CU, 0x5C4B6565U,
00719         0xB1C72B2BU, 0xAB6F8E8EU, 0x9E0D4242U, 0x9CBBF5F5U, 0x52F2DBDBU,
00720         0x1BF34A4AU, 0x5FA63D3DU, 0x9359A4A4U, 0x0ABCB9B9U, 0xEF3AF9F9U,
00721         0x91EF1313U, 0x85FE0808U, 0x49019191U, 0xEE611616U, 0x2D7CDEDEU,
00722         0x4FB22121U, 0x8F42B1B1U, 0x3BDB7272U, 0x47B82F2FU, 0x8748BFBFU,
00723         0x6D2CAEAEU, 0x46E3C0C0U, 0xD6573C3CU, 0x3E859A9AU, 0x6929A9A9U,
00724         0x647D4F4FU, 0x2A948181U, 0xCE492E2EU, 0xCB17C6C6U, 0x2FCA6969U,
00725         0xFCC3BDBDU, 0x975CA3A3U, 0x055EE8E8U, 0x7AD0EDEDU, 0xAC87D1D1U,
00726         0x7F8E0505U, 0xD5BA6464U, 0x1AA8A5A5U, 0x4BB72626U, 0x0EB9BEBEU,
00727         0xA7608787U, 0x5AF8D5D5U, 0x28223636U, 0x14111B1BU, 0x3FDE7575U,
00728         0x2979D9D9U, 0x88AAEEEEU, 0x3C332D2DU, 0x4C5F7979U, 0x02B6B7B7U,
00729         0xB896CACAU, 0xDA583535U, 0xB09CC4C4U, 0x17FC4343U, 0x551A8484U,
00730         0x1FF64D4DU, 0x8A1C5959U, 0x7D38B2B2U, 0x57AC3333U, 0xC718CFCFU,
00731         0x8DF40606U, 0x74695353U, 0xB7749B9BU, 0xC4F59797U, 0x9F56ADADU,
00732         0x72DAE3E3U, 0x7ED5EAEAU, 0x154AF4F4U, 0x229E8F8FU, 0x12A2ABABU,
00733         0x584E6262U, 0x07E85F5FU, 0x99E51D1DU, 0x34392323U, 0x6EC1F6F6U,
00734         0x50446C6CU, 0xDE5D3232U, 0x68724646U, 0x6526A0A0U, 0xBC93CDCDU,
00735         0xDB03DADAU, 0xF8C6BABAU, 0xC8FA9E9EU, 0xA882D6D6U, 0x2BCF6E6EU,
00736         0x40507070U, 0xDCEB8585U, 0xFE750A0AU, 0x328A9393U, 0xA48DDFDFU,
00737         0xCA4C2929U, 0x10141C1CU, 0x2173D7D7U, 0xF0CCB4B4U, 0xD309D4D4U,
00738         0x5D108A8AU, 0x0FE25151U, 0x00000000U, 0x6F9A1919U, 0x9DE01A1AU,
00739         0x368F9494U, 0x42E6C7C7U, 0x4AECC9C9U, 0x5EFDD2D2U, 0xC1AB7F7FU,
00740         0xE0D8A8A8U
00741       },
00742       { 0xBC75BC32U, 0xECF3EC21U, 0x20C62043U, 0xB3F4B3C9U, 0xDADBDA03U,
00743         0x027B028BU, 0xE2FBE22BU, 0x9EC89EFAU, 0xC94AC9ECU, 0xD4D3D409U,
00744         0x18E6186BU, 0x1E6B1E9FU, 0x9845980EU, 0xB27DB238U, 0xA6E8A6D2U,
00745         0x264B26B7U, 0x3CD63C57U, 0x9332938AU, 0x82D882EEU, 0x52FD5298U,
00746         0x7B377BD4U, 0xBB71BB37U, 0x5BF15B97U, 0x47E14783U, 0x2430243CU,
00747         0x510F51E2U, 0xBAF8BAC6U, 0x4A1B4AF3U, 0xBF87BF48U, 0x0DFA0D70U,
00748         0xB006B0B3U, 0x753F75DEU, 0xD25ED2FDU, 0x7DBA7D20U, 0x66AE6631U,
00749         0x3A5B3AA3U, 0x598A591CU, 0x00000000U, 0xCDBCCD93U, 0x1A9D1AE0U,
00750         0xAE6DAE2CU, 0x7FC17FABU, 0x2BB12BC7U, 0xBE0EBEB9U, 0xE080E0A0U,
00751         0x8A5D8A10U, 0x3BD23B52U, 0x64D564BAU, 0xD8A0D888U, 0xE784E7A5U,
00752         0x5F075FE8U, 0x1B141B11U, 0x2CB52CC2U, 0xFC90FCB4U, 0x312C3127U,
00753         0x80A38065U, 0x73B2732AU, 0x0C730C81U, 0x794C795FU, 0x6B546B41U,
00754         0x4B924B02U, 0x53745369U, 0x9436948FU, 0x8351831FU, 0x2A382A36U,
00755         0xC4B0C49CU, 0x22BD22C8U, 0xD55AD5F8U, 0xBDFCBDC3U, 0x48604878U,
00756         0xFF62FFCEU, 0x4C964C07U, 0x416C4177U, 0xC742C7E6U, 0xEBF7EB24U,
00757         0x1C101C14U, 0x5D7C5D63U, 0x36283622U, 0x672767C0U, 0xE98CE9AFU,
00758         0x441344F9U, 0x149514EAU, 0xF59CF5BBU, 0xCFC7CF18U, 0x3F243F2DU,
00759         0xC046C0E3U, 0x723B72DBU, 0x5470546CU, 0x29CA294CU, 0xF0E3F035U,
00760         0x088508FEU, 0xC6CBC617U, 0xF311F34FU, 0x8CD08CE4U, 0xA493A459U,
00761         0xCAB8CA96U, 0x68A6683BU, 0xB883B84DU, 0x38203828U, 0xE5FFE52EU,
00762         0xAD9FAD56U, 0x0B770B84U, 0xC8C3C81DU, 0x99CC99FFU, 0x580358EDU,
00763         0x196F199AU, 0x0E080E0AU, 0x95BF957EU, 0x70407050U, 0xF7E7F730U,
00764         0x6E2B6ECFU, 0x1FE21F6EU, 0xB579B53DU, 0x090C090FU, 0x61AA6134U,
00765         0x57825716U, 0x9F419F0BU, 0x9D3A9D80U, 0x11EA1164U, 0x25B925CDU,
00766         0xAFE4AFDDU, 0x459A4508U, 0xDFA4DF8DU, 0xA397A35CU, 0xEA7EEAD5U,
00767         0x35DA3558U, 0xED7AEDD0U, 0x431743FCU, 0xF866F8CBU, 0xFB94FBB1U,
00768         0x37A137D3U, 0xFA1DFA40U, 0xC23DC268U, 0xB4F0B4CCU, 0x32DE325DU,
00769         0x9CB39C71U, 0x560B56E7U, 0xE372E3DAU, 0x87A78760U, 0x151C151BU,
00770         0xF9EFF93AU, 0x63D163BFU, 0x345334A9U, 0x9A3E9A85U, 0xB18FB142U,
00771         0x7C337CD1U, 0x8826889BU, 0x3D5F3DA6U, 0xA1ECA1D7U, 0xE476E4DFU,
00772         0x812A8194U, 0x91499101U, 0x0F810FFBU, 0xEE88EEAAU, 0x16EE1661U,
00773         0xD721D773U, 0x97C497F5U, 0xA51AA5A8U, 0xFEEBFE3FU, 0x6DD96DB5U,
00774         0x78C578AEU, 0xC539C56DU, 0x1D991DE5U, 0x76CD76A4U, 0x3EAD3EDCU,
00775         0xCB31CB67U, 0xB68BB647U, 0xEF01EF5BU, 0x1218121EU, 0x602360C5U,
00776         0x6ADD6AB0U, 0x4D1F4DF6U, 0xCE4ECEE9U, 0xDE2DDE7CU, 0x55F9559DU,
00777         0x7E487E5AU, 0x214F21B2U, 0x03F2037AU, 0xA065A026U, 0x5E8E5E19U,
00778         0x5A785A66U, 0x655C654BU, 0x6258624EU, 0xFD19FD45U, 0x068D06F4U,
00779         0x40E54086U, 0xF298F2BEU, 0x335733ACU, 0x17671790U, 0x057F058EU,
00780         0xE805E85EU, 0x4F644F7DU, 0x89AF896AU, 0x10631095U, 0x74B6742FU,
00781         0x0AFE0A75U, 0x5CF55C92U, 0x9BB79B74U, 0x2D3C2D33U, 0x30A530D6U,
00782         0x2ECE2E49U, 0x49E94989U, 0x46684672U, 0x77447755U, 0xA8E0A8D8U,
00783         0x964D9604U, 0x284328BDU, 0xA969A929U, 0xD929D979U, 0x862E8691U,
00784         0xD1ACD187U, 0xF415F44AU, 0x8D598D15U, 0xD6A8D682U, 0xB90AB9BCU,
00785         0x429E420DU, 0xF66EF6C1U, 0x2F472FB8U, 0xDDDFDD06U, 0x23342339U,
00786         0xCC35CC62U, 0xF16AF1C4U, 0xC1CFC112U, 0x85DC85EBU, 0x8F228F9EU,
00787         0x71C971A1U, 0x90C090F0U, 0xAA9BAA53U, 0x018901F1U, 0x8BD48BE1U,
00788         0x4EED4E8CU, 0x8EAB8E6FU, 0xAB12ABA2U, 0x6FA26F3EU, 0xE60DE654U,
00789         0xDB52DBF2U, 0x92BB927BU, 0xB702B7B6U, 0x692F69CAU, 0x39A939D9U,
00790         0xD3D7D30CU, 0xA761A723U, 0xA21EA2ADU, 0xC3B4C399U, 0x6C506C44U,
00791         0x07040705U, 0x04F6047FU, 0x27C22746U, 0xAC16ACA7U, 0xD025D076U,
00792         0x50865013U, 0xDC56DCF7U, 0x8455841AU, 0xE109E151U, 0x7ABE7A25U,
00793         0x139113EFU
00794       },
00795       { 0xD939A9D9U, 0x90176790U, 0x719CB371U, 0xD2A6E8D2U, 0x05070405U,
00796         0x9852FD98U, 0x6580A365U, 0xDFE476DFU, 0x08459A08U, 0x024B9202U,
00797         0xA0E080A0U, 0x665A7866U, 0xDDAFE4DDU, 0xB06ADDB0U, 0xBF63D1BFU,
00798         0x362A3836U, 0x54E60D54U, 0x4320C643U, 0x62CC3562U, 0xBEF298BEU,
00799         0x1E12181EU, 0x24EBF724U, 0xD7A1ECD7U, 0x77416C77U, 0xBD2843BDU,
00800         0x32BC7532U, 0xD47B37D4U, 0x9B88269BU, 0x700DFA70U, 0xF94413F9U,
00801         0xB1FB94B1U, 0x5A7E485AU, 0x7A03F27AU, 0xE48CD0E4U, 0x47B68B47U,
00802         0x3C24303CU, 0xA5E784A5U, 0x416B5441U, 0x06DDDF06U, 0xC56023C5U,
00803         0x45FD1945U, 0xA33A5BA3U, 0x68C23D68U, 0x158D5915U, 0x21ECF321U,
00804         0x3166AE31U, 0x3E6FA23EU, 0x16578216U, 0x95106395U, 0x5BEF015BU,
00805         0x4DB8834DU, 0x91862E91U, 0xB56DD9B5U, 0x1F83511FU, 0x53AA9B53U,
00806         0x635D7C63U, 0x3B68A63BU, 0x3FFEEB3FU, 0xD630A5D6U, 0x257ABE25U,
00807         0xA7AC16A7U, 0x0F090C0FU, 0x35F0E335U, 0x23A76123U, 0xF090C0F0U,
00808         0xAFE98CAFU, 0x809D3A80U, 0x925CF592U, 0x810C7381U, 0x27312C27U,
00809         0x76D02576U, 0xE7560BE7U, 0x7B92BB7BU, 0xE9CE4EE9U, 0xF10189F1U,
00810         0x9F1E6B9FU, 0xA93453A9U, 0xC4F16AC4U, 0x99C3B499U, 0x975BF197U,
00811         0x8347E183U, 0x6B18E66BU, 0xC822BDC8U, 0x0E98450EU, 0x6E1FE26EU,
00812         0xC9B3F4C9U, 0x2F74B62FU, 0xCBF866CBU, 0xFF99CCFFU, 0xEA1495EAU,
00813         0xED5803EDU, 0xF7DC56F7U, 0xE18BD4E1U, 0x1B151C1BU, 0xADA21EADU,
00814         0x0CD3D70CU, 0x2BE2FB2BU, 0x1DC8C31DU, 0x195E8E19U, 0xC22CB5C2U,
00815         0x8949E989U, 0x12C1CF12U, 0x7E95BF7EU, 0x207DBA20U, 0x6411EA64U,
00816         0x840B7784U, 0x6DC5396DU, 0x6A89AF6AU, 0xD17C33D1U, 0xA171C9A1U,
00817         0xCEFF62CEU, 0x37BB7137U, 0xFB0F81FBU, 0x3DB5793DU, 0x51E10951U,
00818         0xDC3EADDCU, 0x2D3F242DU, 0xA476CDA4U, 0x9D55F99DU, 0xEE82D8EEU,
00819         0x8640E586U, 0xAE78C5AEU, 0xCD25B9CDU, 0x04964D04U, 0x55774455U,
00820         0x0A0E080AU, 0x13508613U, 0x30F7E730U, 0xD337A1D3U, 0x40FA1D40U,
00821         0x3461AA34U, 0x8C4EED8CU, 0xB3B006B3U, 0x6C54706CU, 0x2A73B22AU,
00822         0x523BD252U, 0x0B9F410BU, 0x8B027B8BU, 0x88D8A088U, 0x4FF3114FU,
00823         0x67CB3167U, 0x4627C246U, 0xC06727C0U, 0xB4FC90B4U, 0x28382028U,
00824         0x7F04F67FU, 0x78486078U, 0x2EE5FF2EU, 0x074C9607U, 0x4B655C4BU,
00825         0xC72BB1C7U, 0x6F8EAB6FU, 0x0D429E0DU, 0xBBF59CBBU, 0xF2DB52F2U,
00826         0xF34A1BF3U, 0xA63D5FA6U, 0x59A49359U, 0xBCB90ABCU, 0x3AF9EF3AU,
00827         0xEF1391EFU, 0xFE0885FEU, 0x01914901U, 0x6116EE61U, 0x7CDE2D7CU,
00828         0xB2214FB2U, 0x42B18F42U, 0xDB723BDBU, 0xB82F47B8U, 0x48BF8748U,
00829         0x2CAE6D2CU, 0xE3C046E3U, 0x573CD657U, 0x859A3E85U, 0x29A96929U,
00830         0x7D4F647DU, 0x94812A94U, 0x492ECE49U, 0x17C6CB17U, 0xCA692FCAU,
00831         0xC3BDFCC3U, 0x5CA3975CU, 0x5EE8055EU, 0xD0ED7AD0U, 0x87D1AC87U,
00832         0x8E057F8EU, 0xBA64D5BAU, 0xA8A51AA8U, 0xB7264BB7U, 0xB9BE0EB9U,
00833         0x6087A760U, 0xF8D55AF8U, 0x22362822U, 0x111B1411U, 0xDE753FDEU,
00834         0x79D92979U, 0xAAEE88AAU, 0x332D3C33U, 0x5F794C5FU, 0xB6B702B6U,
00835         0x96CAB896U, 0x5835DA58U, 0x9CC4B09CU, 0xFC4317FCU, 0x1A84551AU,
00836         0xF64D1FF6U, 0x1C598A1CU, 0x38B27D38U, 0xAC3357ACU, 0x18CFC718U,
00837         0xF4068DF4U, 0x69537469U, 0x749BB774U, 0xF597C4F5U, 0x56AD9F56U,
00838         0xDAE372DAU, 0xD5EA7ED5U, 0x4AF4154AU, 0x9E8F229EU, 0xA2AB12A2U,
00839         0x4E62584EU, 0xE85F07E8U, 0xE51D99E5U, 0x39233439U, 0xC1F66EC1U,
00840         0x446C5044U, 0x5D32DE5DU, 0x72466872U, 0x26A06526U, 0x93CDBC93U,
00841         0x03DADB03U, 0xC6BAF8C6U, 0xFA9EC8FAU, 0x82D6A882U, 0xCF6E2BCFU,
00842         0x50704050U, 0xEB85DCEBU, 0x750AFE75U, 0x8A93328AU, 0x8DDFA48DU,
00843         0x4C29CA4CU, 0x141C1014U, 0x73D72173U, 0xCCB4F0CCU, 0x09D4D309U,
00844         0x108A5D10U, 0xE2510FE2U, 0x00000000U, 0x9A196F9AU, 0xE01A9DE0U,
00845         0x8F94368FU, 0xE6C742E6U, 0xECC94AECU, 0xFDD25EFDU, 0xAB7FC1ABU,
00846         0xD8A8E0D8U
00847       }
00848     };
00849 
00850   ssize_t
00851     j,
00852     k;
00853 
00854   register ssize_t
00855     i;
00856 
00857   register unsigned char
00858     *p;
00859 
00860   unsigned char
00861     crypt_key[32],
00862     s0,
00863     s1,
00864     s2,
00865     s3,
00866     s4,
00867     s5,
00868     s6,
00869     s7,
00870     s8,
00871     s9,
00872     s10,
00873     s11,
00874     s12,
00875     s13,
00876     s14,
00877     s15,
00878     xi;
00879 
00880   unsigned char
00881     *datum;
00882 
00883   unsigned int
00884     rho,
00885     sigma;
00886 
00887   /*
00888     Generate crypt key.
00889   */
00890   (void) LogWizardEvent(TraceEvent,GetWizardModule(),"...");
00891   WizardAssert(CipherDomain,twofish_info != (TwofishInfo *) NULL);
00892   WizardAssert(CipherDomain,twofish_info->signature == WizardSignature);
00893   WizardAssert(CipherDomain,key != (StringInfo *) NULL);
00894   (void) memset(crypt_key,0,sizeof(crypt_key));
00895   p=(unsigned char *) crypt_key;
00896   datum=GetStringInfoDatum(key);
00897   for (i=0; i < (ssize_t) Min(GetStringInfoLength(key),MaximumTwofishKeyLength); i++)
00898     p[i]=datum[i];
00899   if (i < MaximumTwofishKeyLength)
00900     p[i++]=1;
00901   while (i < MaximumTwofishKeyLength)
00902     p[i++]=0;
00903   s0=0;
00904   s1=0;
00905   s2=0;
00906   s3=0;
00907   s4=0;
00908   s5=0;
00909   s6=0;
00910   s7=0;
00911   s8=0;
00912   s9=0;
00913   s10=0;
00914   s11=0;
00915   s12=0;
00916   s13=0;
00917   s14=0;
00918   s15=0;
00919   Sbox(s0,s1,s2,s3,0,0x00,0x2D,0x01,0x2D);
00920   Sbox(s0,s1,s2,s3,1,0x2D,0xA4,0x44,0x8A);
00921   Sbox(s0,s1,s2,s3,2,0x8A,0xD5,0xBF,0xD1);
00922   Sbox(s0,s1,s2,s3,3,0xD1,0x7F,0x3D,0x99);
00923   Sbox(s0,s1,s2,s3,4,0x99,0x46,0x66,0x96);
00924   Sbox(s0,s1,s2,s3,5,0x96,0x3C,0x5B,0xED);
00925   Sbox(s0,s1,s2,s3,6,0xED,0x37,0x4F,0xE0);
00926   Sbox(s0,s1,s2,s3,7,0xE0,0xD0,0x8C,0x17);
00927   Sbox(s4,s5,s6,s7,8,0x00,0x2D,0x01,0x2D);
00928   Sbox(s4,s5,s6,s7,9,0x2D,0xA4,0x44,0x8A);
00929   Sbox(s4,s5,s6,s7,10,0x8A,0xD5,0xBF,0xD1);
00930   Sbox(s4,s5,s6,s7,11,0xD1,0x7F,0x3D,0x99);
00931   Sbox(s4,s5,s6,s7,12,0x99,0x46,0x66,0x96);
00932   Sbox(s4,s5,s6,s7,13,0x96,0x3C,0x5B,0xED);
00933   Sbox(s4,s5,s6,s7,14,0xED,0x37,0x4F,0xE0);
00934   Sbox(s4,s5,s6,s7,15,0xE0,0xD0,0x8C,0x17);
00935   if ((8*GetStringInfoLength(key)) >= 192)
00936     {
00937       /*
00938         192- or 256-bit key.
00939       */
00940       Sbox(s8,s9,s10,s11,16,0x00,0x2D,0x01,0x2D);
00941       Sbox(s8,s9,s10,s11,17,0x2D,0xA4,0x44,0x8A);
00942       Sbox(s8,s9,s10,s11,18,0x8A,0xD5,0xBF,0xD1);
00943       Sbox(s8,s9,s10,s11,19,0xD1,0x7F,0x3D,0x99);
00944       Sbox(s8,s9,s10,s11,20,0x99,0x46,0x66,0x96);
00945       Sbox(s8,s9,s10,s11,21,0x96,0x3C,0x5B,0xED);
00946       Sbox(s8,s9,s10,s11,22,0xED,0x37,0x4F,0xE0);
00947       Sbox(s8,s9,s10,s11,23,0xE0,0xD0,0x8C,0x17);
00948     }
00949   j=0;
00950   k=1;
00951   if ((8*GetStringInfoLength(key)) >= 256)
00952     {
00953       /*
00954         256-bit key.
00955       */
00956       Sbox(s12,s13,s14,s15,24,0x00,0x2D,0x01,0x2D);
00957       Sbox(s12,s13,s14,s15,25,0x2D,0xA4,0x44,0x8A);
00958       Sbox(s12,s13,s14,s15,26,0x8A,0xD5,0xBF,0xD1);
00959       Sbox(s12,s13,s14,s15,27,0xD1,0x7F,0x3D,0x99);
00960       Sbox(s12,s13,s14,s15,28,0x99,0x46,0x66,0x96);
00961       Sbox(s12,s13,s14,s15,29,0x96,0x3C,0x5B,0xED);
00962       Sbox(s12,s13,s14,s15,30,0xED,0x37,0x4F,0xE0);
00963       Sbox(s12,s13,s14,s15,31,0xE0,0xD0,0x8C,0x17);
00964       for (i=0; i < 256; i++)
00965       {
00966         twofish_info->sbox[0][i]=
00967           mds[0][q0[q0[q1[sbox[k] ^ s0] ^ s4] ^ s8] ^ s12];
00968         twofish_info->sbox[1][i]=
00969           mds[1][q0[q1[q1[sbox[j] ^ s1] ^ s5] ^ s9] ^ s13];
00970         twofish_info->sbox[2][i]=
00971           mds[2][q1[q0[q0[sbox[j] ^ s2] ^ s6] ^ s10] ^ s14];
00972         twofish_info->sbox[3][i]=
00973           mds[3][q1[q1[q0[sbox[k] ^ s3] ^ s7] ^ s11] ^ s15];
00974         j+=2;
00975         k+=2;
00976       }
00977       K256(w,0,0xA9,0x75,0x67,0xF3);
00978       K256(w,2,0xB3,0xC6,0xE8,0xF4);
00979       K256(w,4,0x04,0xDB,0xFD,0x7B);
00980       K256(w,6,0xA3,0xFB,0x76,0xC8);
00981       K256(k,0,0x9A,0x4A,0x92,0xD3);
00982       K256(k,2,0x80,0xE6,0x78,0x6B);
00983       K256(k,4,0xE4,0x45,0xDD,0x7D);
00984       K256(k,6,0xD1,0xE8,0x38,0x4B);
00985       K256(k,8,0x0D,0xD6,0xC6,0x32);
00986       K256(k,10,0x35,0xD8,0x98,0xFD);
00987       K256(k,12,0x18,0x37,0xF7,0x71);
00988       K256(k,14,0xEC,0xF1,0x6C,0xE1);
00989       K256(k,16,0x43,0x30,0x75,0x0F);
00990       K256(k,18,0x37,0xF8,0x26,0x1B);
00991       K256(k,20,0xFA,0x87,0x13,0xFA);
00992       K256(k,22,0x94,0x06,0x48,0x3F);
00993       K256(k,24,0xF2,0x5E,0xD0,0xBA);
00994       K256(k,26,0x8B,0xAE,0x30,0x5B);
00995       K256(k,28,0x84,0x8A,0x54,0x00);
00996       K256(k,30,0xDF,0xBC,0x23,0x9D);
00997     }
00998   else
00999     if ((8*GetStringInfoLength(key)) >= 192)
01000       {
01001         /*
01002           192-bit key.
01003         */
01004         for (i=0; i < 256; i++)
01005         {
01006           twofish_info->sbox[0][i]=mds[0][q0[q0[sbox[k] ^ s0] ^ s4] ^ s8];
01007           twofish_info->sbox[1][i]=mds[1][q0[q1[sbox[k] ^ s1] ^ s5] ^ s9];
01008           twofish_info->sbox[2][i]=mds[2][q1[q0[sbox[j] ^ s2] ^ s6] ^ s10];
01009           twofish_info->sbox[3][i]=mds[3][q1[q1[sbox[j] ^ s3] ^ s7] ^ s11];
01010           j+=2;
01011           k+=2;
01012         }
01013         K192(w,0,0xA9,0x75,0x67,0xF3);
01014         K192(w,2,0xB3,0xC6,0xE8,0xF4);
01015         K192(w,4,0x04,0xDB,0xFD,0x7B);
01016         K192(w,6,0xA3,0xFB,0x76,0xC8);
01017         K192(k,0,0x9A,0x4A,0x92,0xD3);
01018         K192(k,2,0x80,0xE6,0x78,0x6B);
01019         K192(k,4,0xE4,0x45,0xDD,0x7D);
01020         K192(k,6,0xD1,0xE8,0x38,0x4B);
01021         K192(k,8,0x0D,0xD6,0xC6,0x32);
01022         K192(k,10,0x35,0xD8,0x98,0xFD);
01023         K192(k,12,0x18,0x37,0xF7,0x71);
01024         K192(k,14,0xEC,0xF1,0x6C,0xE1);
01025         K192(k,16,0x43,0x30,0x75,0x0F);
01026         K192(k,18,0x37,0xF8,0x26,0x1B);
01027         K192(k,20,0xFA,0x87,0x13,0xFA);
01028         K192(k,22,0x94,0x06,0x48,0x3F);
01029         K192(k,24,0xF2,0x5E,0xD0,0xBA);
01030         K192(k,26,0x8B,0xAE,0x30,0x5B);
01031         K192(k,28,0x84,0x8A,0x54,0x00);
01032         K192(k,30,0xDF,0xBC,0x23,0x9D);
01033       }
01034     else
01035       {
01036         /*
01037           128-bit key.
01038         */
01039         for (i=0; i < 256; i++)
01040         {
01041           twofish_info->sbox[0][i]=mds[0][q0[sbox[j] ^ s0] ^ s4];
01042           twofish_info->sbox[1][i]=mds[1][q0[sbox[k] ^ s1] ^ s5];
01043           twofish_info->sbox[2][i]=mds[2][q1[sbox[j] ^ s2] ^ s6];
01044           twofish_info->sbox[3][i]=mds[3][q1[sbox[k] ^ s3] ^ s7];
01045           j+=2;
01046           k+=2;
01047         }
01048         K128(w,0,0xA9,0x75,0x67,0xF3);
01049         K128(w,2,0xB3,0xC6,0xE8,0xF4);
01050         K128(w,4,0x04,0xDB,0xFD,0x7B);
01051         K128(w,6,0xA3,0xFB,0x76,0xC8);
01052         K128(k,0,0x9A,0x4A,0x92,0xD3);
01053         K128(k,2,0x80,0xE6,0x78,0x6B);
01054         K128(k,4,0xE4,0x45,0xDD,0x7D);
01055         K128(k,6,0xD1,0xE8,0x38,0x4B);
01056         K128(k,8,0x0D,0xD6,0xC6,0x32);
01057         K128(k,10,0x35,0xD8,0x98,0xFD);
01058         K128(k,12,0x18,0x37,0xF7,0x71);
01059         K128(k,14,0xEC,0xF1,0x6C,0xE1);
01060         K128(k,16,0x43,0x30,0x75,0x0F);
01061         K128(k,18,0x37,0xF8,0x26,0x1B);
01062         K128(k,20,0xFA,0x87,0x13,0xFA);
01063         K128(k,22,0x94,0x06,0x48,0x3F);
01064         K128(k,24,0xF2,0x5E,0xD0,0xBA);
01065         K128(k,26,0x8B,0xAE,0x30,0x5B);
01066         K128(k,28,0x84,0x8A,0x54,0x00);
01067         K128(k,30,0xDF,0xBC,0x23,0x9D);
01068       }
01069   /*
01070     Reset registers.
01071   */
01072   (void) ResetWizardMemory(crypt_key,0,sizeof(crypt_key));
01073   rho=0;
01074   sigma=0;
01075   s0=0;
01076   s1=0;
01077   s2=0;
01078   s3=0;
01079   s4=0;
01080   s5=0;
01081   s6=0;
01082   s7=0;
01083   s8=0;
01084   s9=0;
01085   s10=0;
01086   s11=0;
01087   s12=0;
01088   s13=0;
01089   s14=0;
01090   s15=0;
01091   xi=0;
01092 }