|
WizardsToolkit
1.0.7
|
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 }