MagickCore 7.0.10
twofish.c
Go to the documentation of this file.
1/*
2%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3% %
4% %
5% %
6% TTTTT W W OOO FFFFF IIIII SSSSS H H %
7% T W W O O F I SS H H %
8% T W W W O O FFF I SSS HHHHH %
9% T WW WW O O F I SS H H %
10% T W W OOO F IIIII SSSSS H H %
11% %
12% %
13% Wizard's Toolkit Twofish Cipher Methods %
14% %
15% Software Design %
16% Cristy %
17% March 2003 %
18% %
19% Copyright @ 1999 ImageMagick Studio, LLC, Wilmington, DE, U.S.A. All %
20% rights reserved. %
21% %
22% You may not use this file except in compliance with the License. You may %
23% obtain a copy of the License at %
24% %
25% https://imagemagick.org/script/license.php %
26% %
27% Unless required by applicable law or agreed to in writing, software %
28% distributed under the License is distributed on an "AS IS" BASIS, %
29% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %
30% See the License for the specific language governing permissions and %
31% limitations under the License. %
32% %
33%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
34%
35%
36*/
37
38/*
39 Include declarations.
40*/
41#include "wizard/studio.h"
42#include "wizard/exception.h"
44#include "wizard/memory_.h"
45#include "wizard/twofish.h"
46
47/*
48 Typedef declarations.
49*/
51{
52 unsigned int
54 k[32],
55 sbox[4][256],
56 w[8];
57
58 time_t
60
61 size_t
63};
64
65/*
66 Define declarations.
67*/
68#define G1(alpha) \
69 (twofish_info->sbox[0][(alpha) & 0xFF]) ^ \
70 (twofish_info->sbox[1][((alpha) >> 8) & 0xFF]) ^ \
71 (twofish_info->sbox[2][((alpha) >> 16) & 0xFF]) ^ \
72 (twofish_info->sbox[3][(alpha) >> 24])
73#define G2(beta) \
74 (twofish_info->sbox[1][(beta) & 0xFF]) ^ \
75 (twofish_info->sbox[2][((beta) >> 8) & 0xFF]) ^ \
76 (twofish_info->sbox[3][((beta) >> 16) & 0xFF]) ^ \
77 (twofish_info->sbox[0][(beta) >> 24])
78#define Read32Bits(value,p) \
79{ \
80 (value)=(*p++); \
81 (value)|=(*p++) << 8; \
82 (value)|=(*p++) << 16; \
83 (value)|=(*p++) << 24; \
84}
85#define TwofishBlocksize 16
86#define Write32Bits(p,value) \
87{ \
88 *p++=(unsigned char) (value); \
89 *p++=(unsigned char) ((value) >> 8); \
90 *p++=(unsigned char) ((value) >> 16); \
91 *p++=(unsigned char) ((value) >> 24); \
92}
93
94/*
95%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
96% %
97% %
98% %
99% A c q u i r e T w o f i s h I n f o %
100% %
101% %
102% %
103%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
104%
105% AcquireTwofishInfo() allocate the TwofishInfo structure.
106%
107% The format of the AcquireTwofishInfo method is:
108%
109% TwofishInfo *AcquireTwofishInfo(void)
110%
111*/
113{
115 *twofish_info;
116
117 twofish_info=(TwofishInfo *) AcquireWizardMemory(sizeof(*twofish_info));
118 if (twofish_info == (TwofishInfo *) NULL)
120 (void) memset(twofish_info,0,sizeof(*twofish_info));
121 twofish_info->blocksize=TwofishBlocksize;
122 twofish_info->timestamp=time((time_t *) NULL);
123 twofish_info->signature=WizardSignature;
124 return(twofish_info);
125}
126
127/*
128%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
129% %
130% %
131% %
132% D e c i p h e r T w o f i s h B l o c k %
133% %
134% %
135% %
136%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
137%
138% DecipherTwofishBlock() deciphers a single block of ciphertext to produce a
139% block of plaintext.
140%
141% The format of the DecipherTwofishBlock method is:
142%
143% void DecipherTwofishBlock(TwofishInfo *twofish_info,
144% const unsigned char *ciphertext,unsigned char plaintext)
145%
146% A description of each parameter follows:
147%
148% o twofish_info: The cipher context.
149%
150% o ciphertext: The cipher text.
151%
152% o plaintext: The plaint text.
153%
154*/
156 const unsigned char *ciphertext,unsigned char *plaintext)
157{
158#define DecipherRound(alpha,beta,gamma,delta,i) \
159{ \
160 rho=G1(alpha); sigma=G2(beta); rho+=sigma; sigma+=rho; \
161 delta^=sigma+twofish_info->k[2*(i)+1]; delta=(delta >> 1)+(delta << 31); \
162 gamma=(gamma << 1)+(gamma >> 31); gamma^=(rho+twofish_info->k[2*(i)]); \
163}
164
165 unsigned char
166 *q;
167
168 unsigned int
169 alpha,
170 beta,
171 delta,
172 gamma,
173 rho,
174 sigma;
175
176 /*
177 Exercise 16 deciphering rounds.
178 */
179 gamma=ciphertext[0] ^ (ciphertext[1] << 8) ^ (ciphertext[2] << 16) ^
180 (ciphertext[3] << 24) ^ twofish_info->w[4];
181 delta=ciphertext[4] ^ (ciphertext[5] << 8) ^ (ciphertext[6] << 16) ^
182 (ciphertext[7] << 24) ^ twofish_info->w[5];
183 alpha=ciphertext[8] ^ (ciphertext[9] << 8) ^ (ciphertext[10] << 16) ^
184 (ciphertext[11] << 24) ^ twofish_info->w[6];
185 beta=ciphertext[12] ^ (ciphertext[13] << 8) ^ (ciphertext[14] << 16) ^
186 (ciphertext[15] << 24) ^ twofish_info->w[7];
187 DecipherRound(gamma,delta,alpha,beta,15);
188 DecipherRound(alpha,beta,gamma,delta,14);
189 DecipherRound(gamma,delta,alpha,beta,13);
190 DecipherRound(alpha,beta,gamma,delta,12);
191 DecipherRound(gamma,delta,alpha,beta,11);
192 DecipherRound(alpha,beta,gamma,delta,10);
193 DecipherRound(gamma,delta,alpha,beta,9);
194 DecipherRound(alpha,beta,gamma,delta,8);
195 DecipherRound(gamma,delta,alpha,beta,7);
196 DecipherRound(alpha,beta,gamma,delta,6);
197 DecipherRound(gamma,delta,alpha,beta,5);
198 DecipherRound(alpha,beta,gamma,delta,4);
199 DecipherRound(gamma,delta,alpha,beta,3);
200 DecipherRound(alpha,beta,gamma,delta,2);
201 DecipherRound(gamma,delta,alpha,beta,1);
202 DecipherRound(alpha,beta,gamma,delta,0);
203 q=(unsigned char *) plaintext;
204 alpha^=twofish_info->w[0];
205 Write32Bits(q,alpha);
206 beta^=twofish_info->w[1];
207 Write32Bits(q,beta);
208 gamma^=twofish_info->w[2];
209 Write32Bits(q,gamma);
210 delta^=twofish_info->w[3];
211 Write32Bits(q,delta);
212 /*
213 Reset registers.
214 */
215 alpha=0;
216 beta=0;
217 gamma=0;
218 delta=0;
219 rho=0;
220 sigma=0;
221}
222
223/*
224%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
225% %
226% %
227% %
228% D e s t r o y T w o f i s h I n f o %
229% %
230% %
231% %
232%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
233%
234% DestroyTwofishInfo() zeros memory associated with the TwofishInfo structure.
235%
236% The format of the DestroyTwofishInfo method is:
237%
238% TwofishInfo *DestroyTwofishInfo(TwofishInfo *twofish_info)
239%
240% A description of each parameter follows:
241%
242% o twofish_info: The cipher context.
243%
244*/
246{
248 WizardAssert(CipherDomain,twofish_info != (TwofishInfo *) NULL);
250 twofish_info->signature=(~WizardSignature);
251 twofish_info=(TwofishInfo *) RelinquishWizardMemory(twofish_info);
252 return(twofish_info);
253}
254
255/*
256%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
257% %
258% %
259% %
260% E n c i p h e r T w o f i s h B l o c k %
261% %
262% %
263% %
264%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
265%
266% EncipherTwofishBlock() encipher a single block of plaintext to produce a
267% block of ciphertext.
268%
269% The format of the EncipherTwofishBlock method is:
270%
271% void EncipherTwofishBlock(TwofishInfo *twofish_info,
272% const unsigned char *plaintext,unsigned char *ciphertext)
273%
274% A description of each parameter follows:
275%
276% o twofish_info: The cipher context.
277%
278% o plaintext: The plain text.
279%
280% o ciphertext: The cipher text.
281%
282*/
284 const unsigned char *plaintext,unsigned char *ciphertext)
285{
286#define EncipherRound(alpha,beta,gamma,delta,i) \
287{ \
288 rho=G1(alpha); sigma=G2(beta); \
289 rho+=sigma; sigma+=rho+twofish_info->k[2*(i)+1]; \
290 gamma^=rho+twofish_info->k[2*(i)]; gamma=(gamma >> 1)+(gamma << 31); \
291 delta=((delta << 1)+(delta >> 31)) ^ sigma; \
292}
293
294 unsigned char
295 *q;
296
297 unsigned int
298 alpha,
299 beta,
300 gamma,
301 delta,
302 rho,
303 sigma;
304
305 /*
306 Exercise 16 enciphering rounds.
307 */
308 alpha=plaintext[0] ^ (plaintext[1] << 8) ^ (plaintext[2] << 16) ^
309 (plaintext[3] << 24) ^ twofish_info->w[0];
310 beta=plaintext[4] ^ (plaintext[5] << 8) ^ (plaintext[6] << 16) ^
311 (plaintext[7] << 24) ^ twofish_info->w[1];
312 gamma=plaintext[8] ^ (plaintext[9] << 8) ^ (plaintext[10] << 16) ^
313 (plaintext[11] << 24) ^ twofish_info->w[2];
314 delta=plaintext[12] ^ (plaintext[13] << 8) ^ (plaintext[14] << 16) ^
315 (plaintext[15] << 24) ^ twofish_info->w[3];
316 EncipherRound(alpha,beta,gamma,delta,0);
317 EncipherRound(gamma,delta,alpha,beta,1)
318 EncipherRound(alpha,beta,gamma,delta,2);
319 EncipherRound(gamma,delta,alpha,beta,3)
320 EncipherRound(alpha,beta,gamma,delta,4);
321 EncipherRound(gamma,delta,alpha,beta,5)
322 EncipherRound(alpha,beta,gamma,delta,6);
323 EncipherRound(gamma,delta,alpha,beta,7)
324 EncipherRound(alpha,beta,gamma,delta,8);
325 EncipherRound(gamma,delta,alpha,beta,9)
326 EncipherRound(alpha,beta,gamma,delta,10);
327 EncipherRound(gamma,delta,alpha,beta,11)
328 EncipherRound(alpha,beta,gamma,delta,12);
329 EncipherRound(gamma,delta,alpha,beta,13)
330 EncipherRound(alpha,beta,gamma,delta,14);
331 EncipherRound(gamma,delta,alpha,beta,15)
332 q=(unsigned char *) ciphertext;
333 gamma^=twofish_info->w[4];
334 Write32Bits(q,gamma);
335 delta^=twofish_info->w[5];
336 Write32Bits(q,delta);
337 alpha^=twofish_info->w[6];
338 Write32Bits(q,alpha);
339 beta^=twofish_info->w[7];
340 Write32Bits(q,beta);
341 /*
342 Reset registers.
343 */
344 alpha=0;
345 beta=0;
346 gamma=0;
347 delta=0;
348 rho=0;
349 sigma=0;
350}
351
352/*
353%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
354% %
355% %
356% %
357% G e t T w o s i z e B l o c k s i z e %
358% %
359% %
360% %
361%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
362%
363% GetTwofishBlocksize() returns the Twofish blocksize.
364%
365% The format of the GetTwofishBlocksize method is:
366%
367% unsigned int *GetTwofishBlocksize(const TwofishInfo *twofish_info)
368%
369% A description of each parameter follows:
370%
371% o twofish_info: The twofish info.
372%
373*/
374WizardExport unsigned int GetTwofishBlocksize(const TwofishInfo *twofish_info)
375{
377 WizardAssert(CipherDomain,twofish_info != (TwofishInfo *) NULL);
379 return(twofish_info->blocksize);
380}
381
382/*
383%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
384% %
385% %
386% %
387% S e t T w o f i s h K e y %
388% %
389% %
390% %
391%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
392%
393% SetTwofishKey() sets the key for the Twofish cipher. The key length is
394% specified in bits. Valid values are 128, 192, or 256 requiring a key
395% buffer length in bytes of 16, 24, and 32 respectively.
396%
397% The format of the SetTwofishKey method is:
398%
399% SetTwofishKey(TwofishInfo *twofish_info,const StringInfo *key)
400%
401% A description of each parameter follows:
402%
403% o twofish_info: The cipher context.
404%
405% o key: The key.
406%
407*/
408WizardExport void SetTwofishKey(TwofishInfo *twofish_info,const StringInfo *key)
409{
410#define K128(x,j,k,l,m,n) \
411{ \
412 rho=Q128(k,l,k,l,0); sigma=Q128(m,n,m,n,4); \
413 sigma=(sigma << 8)+(sigma >> 24); rho+=sigma; sigma+=rho; \
414 twofish_info->x[j]=rho; twofish_info->x[(j)+1]=(sigma << 9)+(sigma >> 23); \
415}
416#define K192(x,j,k,l,m,n) \
417{ \
418 rho=Q192(l,l,k,k,0); sigma=Q192(n,n,m,m,4); \
419 sigma=(sigma << 8)+(sigma >> 24); rho+=sigma; sigma+=rho; \
420 twofish_info->x[j]=rho; twofish_info->x[(j)+1]=(sigma << 9)+(sigma >> 23); \
421}
422#define K256(x,j,k,l,m,n) \
423{ \
424 rho=Q256(k,l,0); sigma=Q256(m,n,4); \
425 sigma=(sigma << 8)+(sigma >> 24); rho+=sigma; sigma+=rho; \
426 twofish_info->x[j]=rho; twofish_info->x[(j)+1]=(sigma << 9)+(sigma >> 23); \
427}
428#define MaximumTwofishKeyLength 32
429#define Q128(alpha,beta,gamma,delta,i) \
430 mds[0][q0[alpha ^ crypt_key[(i)+8]] ^ crypt_key[i]] ^ \
431 mds[1][q0[beta ^ crypt_key[(i)+9]] ^ crypt_key[(i)+1]] ^ \
432 mds[2][q1[gamma ^ crypt_key[(i)+10]] ^ crypt_key[(i)+2]] ^ \
433 mds[3][q1[delta ^ crypt_key[(i)+11]] ^ crypt_key[(i)+3]]
434#define Q192(alpha,beta,gamma,delta,i) \
435 Q128(q0[alpha ^ crypt_key[(i)+16]],q1[beta ^ crypt_key[(i)+17]], \
436 q0[gamma ^ crypt_key[(i)+18]],q1[delta ^ crypt_key[(i)+19]],i)
437#define Q256(alpha,beta,i) \
438 Q192(q1[beta ^ crypt_key[(i)+24]],q1[alpha ^ crypt_key[(i)+25]], \
439 q0[alpha ^ crypt_key[(i)+26]],q0[beta ^ crypt_key[(i)+27]],i)
440#define Sbox(alpha,beta,gamma,delta,i,w,x,y,z) \
441{ \
442 if (crypt_key[i] != 0) \
443 { \
444 xi=polynomial_to_exponent[crypt_key[i]-1]; \
445 (alpha)^=exponent_to_polynomial[xi+(w)]; \
446 (beta)^=exponent_to_polynomial[xi+(x)]; \
447 (gamma)^=exponent_to_polynomial[xi+(y)]; \
448 (delta)^=exponent_to_polynomial[xi+(z)]; \
449 } \
450}
451
452 static const unsigned char
453 exponent_to_polynomial[492] =
454 {
455 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D, 0x9A, 0x79,
456 0xF2, 0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E, 0xDC, 0xF5,
457 0xA7, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD, 0xD7, 0xE3,
458 0x8B, 0x5B, 0xB6, 0x21, 0x42, 0x84, 0x45, 0x8A, 0x59, 0xB2, 0x29,
459 0x52, 0xA4, 0x05, 0x0A, 0x14, 0x28, 0x50, 0xA0, 0x0D, 0x1A, 0x34,
460 0x68, 0xD0, 0xED, 0x97, 0x63, 0xC6, 0xC1, 0xCF, 0xD3, 0xEB, 0x9B,
461 0x7B, 0xF6, 0xA1, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xAD, 0x17, 0x2E,
462 0x5C, 0xB8, 0x3D, 0x7A, 0xF4, 0xA5, 0x07, 0x0E, 0x1C, 0x38, 0x70,
463 0xE0, 0x8D, 0x57, 0xAE, 0x11, 0x22, 0x44, 0x88, 0x5D, 0xBA, 0x39,
464 0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51, 0xA2, 0x09, 0x12, 0x24, 0x48,
465 0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66, 0xCC, 0xD5, 0xE7, 0x83,
466 0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB, 0x1B, 0x36, 0x6C,
467 0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19, 0x32, 0x64,
468 0xC8, 0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0, 0x2D, 0x5A,
469 0xB4, 0x25, 0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3, 0x2B, 0x56,
470 0xAC, 0x15, 0x2A, 0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8, 0x9D, 0x77,
471 0xEE, 0x91, 0x6F, 0xDE, 0xF1, 0xAF, 0x13, 0x26, 0x4C, 0x98, 0x7D,
472 0xFA, 0xB9, 0x3F, 0x7E, 0xFC, 0xB5, 0x27, 0x4E, 0x9C, 0x75, 0xEA,
473 0x99, 0x7F, 0xFE, 0xB1, 0x2F, 0x5E, 0xBC, 0x35, 0x6A, 0xD4, 0xE5,
474 0x87, 0x43, 0x86, 0x41, 0x82, 0x49, 0x92, 0x69, 0xD2, 0xE9, 0x9F,
475 0x73, 0xE6, 0x81, 0x4F, 0x9E, 0x71, 0xE2, 0x89, 0x5F, 0xBE, 0x31,
476 0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB, 0xDB, 0xFB, 0xBB, 0x3B, 0x76,
477 0xEC, 0x95, 0x67, 0xCE, 0xD1, 0xEF, 0x93, 0x6B, 0xD6, 0xE1, 0x8F,
478 0x53, 0xA6, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x4D,
479 0x9A, 0x79, 0xF2, 0xA9, 0x1F, 0x3E, 0x7C, 0xF8, 0xBD, 0x37, 0x6E,
480 0xDC, 0xF5, 0xA7, 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0xC0, 0xCD,
481 0xD7, 0xE3, 0x8B, 0x5B, 0xB6, 0x21, 0x42, 0x84, 0x45, 0x8A, 0x59,
482 0xB2, 0x29, 0x52, 0xA4, 0x05, 0x0A, 0x14, 0x28, 0x50, 0xA0, 0x0D,
483 0x1A, 0x34, 0x68, 0xD0, 0xED, 0x97, 0x63, 0xC6, 0xC1, 0xCF, 0xD3,
484 0xEB, 0x9B, 0x7B, 0xF6, 0xA1, 0x0F, 0x1E, 0x3C, 0x78, 0xF0, 0xAD,
485 0x17, 0x2E, 0x5C, 0xB8, 0x3D, 0x7A, 0xF4, 0xA5, 0x07, 0x0E, 0x1C,
486 0x38, 0x70, 0xE0, 0x8D, 0x57, 0xAE, 0x11, 0x22, 0x44, 0x88, 0x5D,
487 0xBA, 0x39, 0x72, 0xE4, 0x85, 0x47, 0x8E, 0x51, 0xA2, 0x09, 0x12,
488 0x24, 0x48, 0x90, 0x6D, 0xDA, 0xF9, 0xBF, 0x33, 0x66, 0xCC, 0xD5,
489 0xE7, 0x83, 0x4B, 0x96, 0x61, 0xC2, 0xC9, 0xDF, 0xF3, 0xAB, 0x1B,
490 0x36, 0x6C, 0xD8, 0xFD, 0xB7, 0x23, 0x46, 0x8C, 0x55, 0xAA, 0x19,
491 0x32, 0x64, 0xC8, 0xDD, 0xF7, 0xA3, 0x0B, 0x16, 0x2C, 0x58, 0xB0,
492 0x2D, 0x5A, 0xB4, 0x25, 0x4A, 0x94, 0x65, 0xCA, 0xD9, 0xFF, 0xB3,
493 0x2B, 0x56, 0xAC, 0x15, 0x2A, 0x54, 0xA8, 0x1D, 0x3A, 0x74, 0xE8,
494 0x9D, 0x77, 0xEE, 0x91, 0x6F, 0xDE, 0xF1, 0xAF, 0x13, 0x26, 0x4C,
495 0x98, 0x7D, 0xFA, 0xB9, 0x3F, 0x7E, 0xFC, 0xB5, 0x27, 0x4E, 0x9C,
496 0x75, 0xEA, 0x99, 0x7F, 0xFE, 0xB1, 0x2F, 0x5E, 0xBC, 0x35, 0x6A,
497 0xD4, 0xE5, 0x87, 0x43, 0x86, 0x41, 0x82, 0x49, 0x92, 0x69, 0xD2,
498 0xE9, 0x9F, 0x73, 0xE6, 0x81, 0x4F, 0x9E, 0x71, 0xE2, 0x89, 0x5F,
499 0xBE, 0x31, 0x62, 0xC4, 0xC5, 0xC7, 0xC3, 0xCB
500 },
501 polynomial_to_exponent[255] =
502 {
503 0x00, 0x01, 0x17, 0x02, 0x2E, 0x18, 0x53, 0x03, 0x6A, 0x2F, 0x93,
504 0x19, 0x34, 0x54, 0x45, 0x04, 0x5C, 0x6B, 0xB6, 0x30, 0xA6, 0x94,
505 0x4B, 0x1A, 0x8C, 0x35, 0x81, 0x55, 0xAA, 0x46, 0x0D, 0x05, 0x24,
506 0x5D, 0x87, 0x6C, 0x9B, 0xB7, 0xC1, 0x31, 0x2B, 0xA7, 0xA3, 0x95,
507 0x98, 0x4C, 0xCA, 0x1B, 0xE6, 0x8D, 0x73, 0x36, 0xCD, 0x82, 0x12,
508 0x56, 0x62, 0xAB, 0xF0, 0x47, 0x4F, 0x0E, 0xBD, 0x06, 0xD4, 0x25,
509 0xD2, 0x5E, 0x27, 0x88, 0x66, 0x6D, 0xD6, 0x9C, 0x79, 0xB8, 0x08,
510 0xC2, 0xDF, 0x32, 0x68, 0x2C, 0xFD, 0xA8, 0x8A, 0xA4, 0x5A, 0x96,
511 0x29, 0x99, 0x22, 0x4D, 0x60, 0xCB, 0xE4, 0x1C, 0x7B, 0xE7, 0x3B,
512 0x8E, 0x9E, 0x74, 0xF4, 0x37, 0xD8, 0xCE, 0xF9, 0x83, 0x6F, 0x13,
513 0xB2, 0x57, 0xE1, 0x63, 0xDC, 0xAC, 0xC4, 0xF1, 0xAF, 0x48, 0x0A,
514 0x50, 0x42, 0x0F, 0xBA, 0xBE, 0xC7, 0x07, 0xDE, 0xD5, 0x78, 0x26,
515 0x65, 0xD3, 0xD1, 0x5F, 0xE3, 0x28, 0x21, 0x89, 0x59, 0x67, 0xFC,
516 0x6E, 0xB1, 0xD7, 0xF8, 0x9D, 0xF3, 0x7A, 0x3A, 0xB9, 0xC6, 0x09,
517 0x41, 0xC3, 0xAE, 0xE0, 0xDB, 0x33, 0x44, 0x69, 0x92, 0x2D, 0x52,
518 0xFE, 0x16, 0xA9, 0x0C, 0x8B, 0x80, 0xA5, 0x4A, 0x5B, 0xB5, 0x97,
519 0xC9, 0x2A, 0xA2, 0x9A, 0xC0, 0x23, 0x86, 0x4E, 0xBC, 0x61, 0xEF,
520 0xCC, 0x11, 0xE5, 0x72, 0x1D, 0x3D, 0x7C, 0xEB, 0xE8, 0xE9, 0x3C,
521 0xEA, 0x8F, 0x7D, 0x9F, 0xEC, 0x75, 0x1E, 0xF5, 0x3E, 0x38, 0xF6,
522 0xD9, 0x3F, 0xCF, 0x76, 0xFA, 0x1F, 0x84, 0xA0, 0x70, 0xED, 0x14,
523 0x90, 0xB3, 0x7E, 0x58, 0xFB, 0xE2, 0x20, 0x64, 0xD0, 0xDD, 0x77,
524 0xAD, 0xDA, 0xC5, 0x40, 0xF2, 0x39, 0xB0, 0xF7, 0x49, 0xB4, 0x0B,
525 0x7F, 0x51, 0x15, 0x43, 0x91, 0x10, 0x71, 0xBB, 0xEE, 0xBF, 0x85,
526 0xC8, 0xA1
527 },
528 q0[256] =
529 {
530 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, 0x9A, 0x92, 0x80,
531 0x78, 0xE4, 0xDD, 0xD1, 0x38, 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7,
532 0xEC, 0x6C, 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, 0xF2,
533 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, 0x19, 0x5B, 0x3D, 0x59,
534 0xF3, 0xAE, 0xA2, 0x82, 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B,
535 0x7C, 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, 0xC0, 0x8C,
536 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, 0xBB, 0x4E, 0x89, 0x6B, 0x53,
537 0x6A, 0xB4, 0xF1, 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66,
538 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, 0xFB, 0xC3, 0x8E,
539 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9,
540 0x62, 0x71, 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, 0xE5,
541 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, 0xA1, 0x1D, 0xAA, 0xED,
542 0x06, 0x70, 0xB2, 0xD2, 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27,
543 0x90, 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, 0x9E, 0x9C,
544 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, 0x91, 0x85, 0x49, 0xEE, 0x2D,
545 0x4F, 0x8F, 0x3B, 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64,
546 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, 0xAC, 0x7F, 0xD5,
547 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C,
548 0x4C, 0x02, 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, 0x57,
549 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, 0x7E, 0x15, 0x22, 0x12,
550 0x58, 0x07, 0x99, 0x34, 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB,
551 0xF8, 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, 0xCA, 0x10,
552 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, 0x6F, 0x9D, 0x36, 0x42, 0x4A,
553 0x5E, 0xC1, 0xE0
554 },
555 q1[256] =
556 {
557 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, 0x4A, 0xD3, 0xE6,
558 0x6B, 0x45, 0x7D, 0xE8, 0x4B, 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71,
559 0xF1, 0xE1, 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, 0x5E,
560 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, 0x6D, 0xC1, 0xB1, 0x0E,
561 0x80, 0x5D, 0xD2, 0xD5, 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C,
562 0xA3, 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, 0x38, 0xB0,
563 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, 0x6C, 0x42, 0xF7, 0x10, 0x7C,
564 0x28, 0x27, 0x8C, 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70,
565 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, 0xA6, 0x83, 0x20,
566 0xFF, 0x9F, 0x77, 0xC3, 0xCC, 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7,
567 0x2B, 0xE2, 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, 0xE4,
568 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, 0x66, 0x94, 0xA1, 0x1D,
569 0x3D, 0xF0, 0xDE, 0xB3, 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53,
570 0x3E, 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, 0x81, 0x88,
571 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, 0xC5, 0x39, 0x99, 0xCD, 0xAD,
572 0x31, 0x8B, 0x01, 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48,
573 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, 0x8D, 0xE5, 0x98,
574 0x57, 0x67, 0x7F, 0x05, 0x64, 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7,
575 0x3C, 0xA5, 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, 0x29,
576 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, 0x6E, 0x47, 0xDF, 0x34,
577 0x35, 0x6A, 0xCF, 0xDC, 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED,
578 0xAB, 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, 0xD7, 0x61,
579 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, 0x16, 0x25, 0x86, 0x56, 0x55,
580 0x09, 0xBE, 0x91
581 },
582 sbox[512] =
583 {
584 0xA9, 0x75, 0x67, 0xF3, 0xB3, 0xC6, 0xE8, 0xF4, 0x04, 0xDB, 0xFD,
585 0x7B, 0xA3, 0xFB, 0x76, 0xC8, 0x9A, 0x4A, 0x92, 0xD3, 0x80, 0xE6,
586 0x78, 0x6B, 0xE4, 0x45, 0xDD, 0x7D, 0xD1, 0xE8, 0x38, 0x4B, 0x0D,
587 0xD6, 0xC6, 0x32, 0x35, 0xD8, 0x98, 0xFD, 0x18, 0x37, 0xF7, 0x71,
588 0xEC, 0xF1, 0x6C, 0xE1, 0x43, 0x30, 0x75, 0x0F, 0x37, 0xF8, 0x26,
589 0x1B, 0xFA, 0x87, 0x13, 0xFA, 0x94, 0x06, 0x48, 0x3F, 0xF2, 0x5E,
590 0xD0, 0xBA, 0x8B, 0xAE, 0x30, 0x5B, 0x84, 0x8A, 0x54, 0x00, 0xDF,
591 0xBC, 0x23, 0x9D, 0x19, 0x6D, 0x5B, 0xC1, 0x3D, 0xB1, 0x59, 0x0E,
592 0xF3, 0x80, 0xAE, 0x5D, 0xA2, 0xD2, 0x82, 0xD5, 0x63, 0xA0, 0x01,
593 0x84, 0x83, 0x07, 0x2E, 0x14, 0xD9, 0xB5, 0x51, 0x90, 0x9B, 0x2C,
594 0x7C, 0xA3, 0xA6, 0xB2, 0xEB, 0x73, 0xA5, 0x4C, 0xBE, 0x54, 0x16,
595 0x92, 0x0C, 0x74, 0xE3, 0x36, 0x61, 0x51, 0xC0, 0x38, 0x8C, 0xB0,
596 0x3A, 0xBD, 0xF5, 0x5A, 0x73, 0xFC, 0x2C, 0x60, 0x25, 0x62, 0x0B,
597 0x96, 0xBB, 0x6C, 0x4E, 0x42, 0x89, 0xF7, 0x6B, 0x10, 0x53, 0x7C,
598 0x6A, 0x28, 0xB4, 0x27, 0xF1, 0x8C, 0xE1, 0x13, 0xE6, 0x95, 0xBD,
599 0x9C, 0x45, 0xC7, 0xE2, 0x24, 0xF4, 0x46, 0xB6, 0x3B, 0x66, 0x70,
600 0xCC, 0xCA, 0x95, 0xE3, 0x03, 0x85, 0x56, 0xCB, 0xD4, 0x11, 0x1C,
601 0xD0, 0x1E, 0x93, 0xD7, 0xB8, 0xFB, 0xA6, 0xC3, 0x83, 0x8E, 0x20,
602 0xB5, 0xFF, 0xE9, 0x9F, 0xCF, 0x77, 0xBF, 0xC3, 0xBA, 0xCC, 0xEA,
603 0x03, 0x77, 0x6F, 0x39, 0x08, 0xAF, 0xBF, 0x33, 0x40, 0xC9, 0xE7,
604 0x62, 0x2B, 0x71, 0xE2, 0x81, 0x79, 0x79, 0x0C, 0x09, 0xAA, 0xAD,
605 0x82, 0x24, 0x41, 0xCD, 0x3A, 0xF9, 0xEA, 0xD8, 0xB9, 0xE5, 0xE4,
606 0xC5, 0x9A, 0xB9, 0xA4, 0x4D, 0x97, 0x44, 0x7E, 0x08, 0xDA, 0x86,
607 0x7A, 0xE7, 0x17, 0xA1, 0x66, 0x1D, 0x94, 0xAA, 0xA1, 0xED, 0x1D,
608 0x06, 0x3D, 0x70, 0xF0, 0xB2, 0xDE, 0xD2, 0xB3, 0x41, 0x0B, 0x7B,
609 0x72, 0xA0, 0xA7, 0x11, 0x1C, 0x31, 0xEF, 0xC2, 0xD1, 0x27, 0x53,
610 0x90, 0x3E, 0x20, 0x8F, 0xF6, 0x33, 0x60, 0x26, 0xFF, 0x5F, 0x96,
611 0xEC, 0x5C, 0x76, 0xB1, 0x2A, 0xAB, 0x49, 0x9E, 0x81, 0x9C, 0x88,
612 0x52, 0xEE, 0x1B, 0x21, 0x5F, 0xC4, 0x93, 0x1A, 0x0A, 0xEB, 0xEF,
613 0xD9, 0x91, 0xC5, 0x85, 0x39, 0x49, 0x99, 0xEE, 0xCD, 0x2D, 0xAD,
614 0x4F, 0x31, 0x8F, 0x8B, 0x3B, 0x01, 0x47, 0x18, 0x87, 0x23, 0x6D,
615 0xDD, 0x46, 0x1F, 0xD6, 0x4E, 0x3E, 0x2D, 0x69, 0xF9, 0x64, 0x48,
616 0x2A, 0x4F, 0xCE, 0xF2, 0xCB, 0x65, 0x2F, 0x8E, 0xFC, 0x78, 0x97,
617 0x5C, 0x05, 0x58, 0x7A, 0x19, 0xAC, 0x8D, 0x7F, 0xE5, 0xD5, 0x98,
618 0x1A, 0x57, 0x4B, 0x67, 0x0E, 0x7F, 0xA7, 0x05, 0x5A, 0x64, 0x28,
619 0xAF, 0x14, 0x63, 0x3F, 0xB6, 0x29, 0xFE, 0x88, 0xF5, 0x3C, 0xB7,
620 0x4C, 0x3C, 0x02, 0xA5, 0xB8, 0xCE, 0xDA, 0xE9, 0xB0, 0x68, 0x17,
621 0x44, 0x55, 0xE0, 0x1F, 0x4D, 0x8A, 0x43, 0x7D, 0x69, 0x57, 0x29,
622 0xC7, 0x2E, 0x8D, 0xAC, 0x74, 0x15, 0xB7, 0x59, 0xC4, 0xA8, 0x9F,
623 0x0A, 0x72, 0x9E, 0x7E, 0x6E, 0x15, 0x47, 0x22, 0xDF, 0x12, 0x34,
624 0x58, 0x35, 0x07, 0x6A, 0x99, 0xCF, 0x34, 0xDC, 0x6E, 0x22, 0x50,
625 0xC9, 0xDE, 0xC0, 0x68, 0x9B, 0x65, 0x89, 0xBC, 0xD4, 0xDB, 0xED,
626 0xF8, 0xAB, 0xC8, 0x12, 0xA8, 0xA2, 0x2B, 0x0D, 0x40, 0x52, 0xDC,
627 0xBB, 0xFE, 0x02, 0x32, 0x2F, 0xA4, 0xA9, 0xCA, 0xD7, 0x10, 0x61,
628 0x21, 0x1E, 0xF0, 0xB4, 0xD3, 0x50, 0x5D, 0x04, 0x0F, 0xF6, 0x00,
629 0xC2, 0x6F, 0x16, 0x9D, 0x25, 0x36, 0x86, 0x42, 0x56, 0x4A, 0x55,
630 0x5E, 0x09, 0xC1, 0xBE, 0xE0, 0x91
631 };
632
633 static const unsigned int
634 mds[4][256] =
635 {
636 { 0xBCBC3275U, 0xECEC21F3U, 0x202043C6U, 0xB3B3C9F4U, 0xDADA03DBU,
637 0x02028B7BU, 0xE2E22BFBU, 0x9E9EFAC8U, 0xC9C9EC4AU, 0xD4D409D3U,
638 0x18186BE6U, 0x1E1E9F6BU, 0x98980E45U, 0xB2B2387DU, 0xA6A6D2E8U,
639 0x2626B74BU, 0x3C3C57D6U, 0x93938A32U, 0x8282EED8U, 0x525298FDU,
640 0x7B7BD437U, 0xBBBB3771U, 0x5B5B97F1U, 0x474783E1U, 0x24243C30U,
641 0x5151E20FU, 0xBABAC6F8U, 0x4A4AF31BU, 0xBFBF4887U, 0x0D0D70FAU,
642 0xB0B0B306U, 0x7575DE3FU, 0xD2D2FD5EU, 0x7D7D20BAU, 0x666631AEU,
643 0x3A3AA35BU, 0x59591C8AU, 0x00000000U, 0xCDCD93BCU, 0x1A1AE09DU,
644 0xAEAE2C6DU, 0x7F7FABC1U, 0x2B2BC7B1U, 0xBEBEB90EU, 0xE0E0A080U,
645 0x8A8A105DU, 0x3B3B52D2U, 0x6464BAD5U, 0xD8D888A0U, 0xE7E7A584U,
646 0x5F5FE807U, 0x1B1B1114U, 0x2C2CC2B5U, 0xFCFCB490U, 0x3131272CU,
647 0x808065A3U, 0x73732AB2U, 0x0C0C8173U, 0x79795F4CU, 0x6B6B4154U,
648 0x4B4B0292U, 0x53536974U, 0x94948F36U, 0x83831F51U, 0x2A2A3638U,
649 0xC4C49CB0U, 0x2222C8BDU, 0xD5D5F85AU, 0xBDBDC3FCU, 0x48487860U,
650 0xFFFFCE62U, 0x4C4C0796U, 0x4141776CU, 0xC7C7E642U, 0xEBEB24F7U,
651 0x1C1C1410U, 0x5D5D637CU, 0x36362228U, 0x6767C027U, 0xE9E9AF8CU,
652 0x4444F913U, 0x1414EA95U, 0xF5F5BB9CU, 0xCFCF18C7U, 0x3F3F2D24U,
653 0xC0C0E346U, 0x7272DB3BU, 0x54546C70U, 0x29294CCAU, 0xF0F035E3U,
654 0x0808FE85U, 0xC6C617CBU, 0xF3F34F11U, 0x8C8CE4D0U, 0xA4A45993U,
655 0xCACA96B8U, 0x68683BA6U, 0xB8B84D83U, 0x38382820U, 0xE5E52EFFU,
656 0xADAD569FU, 0x0B0B8477U, 0xC8C81DC3U, 0x9999FFCCU, 0x5858ED03U,
657 0x19199A6FU, 0x0E0E0A08U, 0x95957EBFU, 0x70705040U, 0xF7F730E7U,
658 0x6E6ECF2BU, 0x1F1F6EE2U, 0xB5B53D79U, 0x09090F0CU, 0x616134AAU,
659 0x57571682U, 0x9F9F0B41U, 0x9D9D803AU, 0x111164EAU, 0x2525CDB9U,
660 0xAFAFDDE4U, 0x4545089AU, 0xDFDF8DA4U, 0xA3A35C97U, 0xEAEAD57EU,
661 0x353558DAU, 0xEDEDD07AU, 0x4343FC17U, 0xF8F8CB66U, 0xFBFBB194U,
662 0x3737D3A1U, 0xFAFA401DU, 0xC2C2683DU, 0xB4B4CCF0U, 0x32325DDEU,
663 0x9C9C71B3U, 0x5656E70BU, 0xE3E3DA72U, 0x878760A7U, 0x15151B1CU,
664 0xF9F93AEFU, 0x6363BFD1U, 0x3434A953U, 0x9A9A853EU, 0xB1B1428FU,
665 0x7C7CD133U, 0x88889B26U, 0x3D3DA65FU, 0xA1A1D7ECU, 0xE4E4DF76U,
666 0x8181942AU, 0x91910149U, 0x0F0FFB81U, 0xEEEEAA88U, 0x161661EEU,
667 0xD7D77321U, 0x9797F5C4U, 0xA5A5A81AU, 0xFEFE3FEBU, 0x6D6DB5D9U,
668 0x7878AEC5U, 0xC5C56D39U, 0x1D1DE599U, 0x7676A4CDU, 0x3E3EDCADU,
669 0xCBCB6731U, 0xB6B6478BU, 0xEFEF5B01U, 0x12121E18U, 0x6060C523U,
670 0x6A6AB0DDU, 0x4D4DF61FU, 0xCECEE94EU, 0xDEDE7C2DU, 0x55559DF9U,
671 0x7E7E5A48U, 0x2121B24FU, 0x03037AF2U, 0xA0A02665U, 0x5E5E198EU,
672 0x5A5A6678U, 0x65654B5CU, 0x62624E58U, 0xFDFD4519U, 0x0606F48DU,
673 0x404086E5U, 0xF2F2BE98U, 0x3333AC57U, 0x17179067U, 0x05058E7FU,
674 0xE8E85E05U, 0x4F4F7D64U, 0x89896AAFU, 0x10109563U, 0x74742FB6U,
675 0x0A0A75FEU, 0x5C5C92F5U, 0x9B9B74B7U, 0x2D2D333CU, 0x3030D6A5U,
676 0x2E2E49CEU, 0x494989E9U, 0x46467268U, 0x77775544U, 0xA8A8D8E0U,
677 0x9696044DU, 0x2828BD43U, 0xA9A92969U, 0xD9D97929U, 0x8686912EU,
678 0xD1D187ACU, 0xF4F44A15U, 0x8D8D1559U, 0xD6D682A8U, 0xB9B9BC0AU,
679 0x42420D9EU, 0xF6F6C16EU, 0x2F2FB847U, 0xDDDD06DFU, 0x23233934U,
680 0xCCCC6235U, 0xF1F1C46AU, 0xC1C112CFU, 0x8585EBDCU, 0x8F8F9E22U,
681 0x7171A1C9U, 0x9090F0C0U, 0xAAAA539BU, 0x0101F189U, 0x8B8BE1D4U,
682 0x4E4E8CEDU, 0x8E8E6FABU, 0xABABA212U, 0x6F6F3EA2U, 0xE6E6540DU,
683 0xDBDBF252U, 0x92927BBBU, 0xB7B7B602U, 0x6969CA2FU, 0x3939D9A9U,
684 0xD3D30CD7U, 0xA7A72361U, 0xA2A2AD1EU, 0xC3C399B4U, 0x6C6C4450U,
685 0x07070504U, 0x04047FF6U, 0x272746C2U, 0xACACA716U, 0xD0D07625U,
686 0x50501386U, 0xDCDCF756U, 0x84841A55U, 0xE1E15109U, 0x7A7A25BEU,
687 0x1313EF91U
688 },
689 { 0xA9D93939U, 0x67901717U, 0xB3719C9CU, 0xE8D2A6A6U, 0x04050707U,
690 0xFD985252U, 0xA3658080U, 0x76DFE4E4U, 0x9A084545U, 0x92024B4BU,
691 0x80A0E0E0U, 0x78665A5AU, 0xE4DDAFAFU, 0xDDB06A6AU, 0xD1BF6363U,
692 0x38362A2AU, 0x0D54E6E6U, 0xC6432020U, 0x3562CCCCU, 0x98BEF2F2U,
693 0x181E1212U, 0xF724EBEBU, 0xECD7A1A1U, 0x6C774141U, 0x43BD2828U,
694 0x7532BCBCU, 0x37D47B7BU, 0x269B8888U, 0xFA700D0DU, 0x13F94444U,
695 0x94B1FBFBU, 0x485A7E7EU, 0xF27A0303U, 0xD0E48C8CU, 0x8B47B6B6U,
696 0x303C2424U, 0x84A5E7E7U, 0x54416B6BU, 0xDF06DDDDU, 0x23C56060U,
697 0x1945FDFDU, 0x5BA33A3AU, 0x3D68C2C2U, 0x59158D8DU, 0xF321ECECU,
698 0xAE316666U, 0xA23E6F6FU, 0x82165757U, 0x63951010U, 0x015BEFEFU,
699 0x834DB8B8U, 0x2E918686U, 0xD9B56D6DU, 0x511F8383U, 0x9B53AAAAU,
700 0x7C635D5DU, 0xA63B6868U, 0xEB3FFEFEU, 0xA5D63030U, 0xBE257A7AU,
701 0x16A7ACACU, 0x0C0F0909U, 0xE335F0F0U, 0x6123A7A7U, 0xC0F09090U,
702 0x8CAFE9E9U, 0x3A809D9DU, 0xF5925C5CU, 0x73810C0CU, 0x2C273131U,
703 0x2576D0D0U, 0x0BE75656U, 0xBB7B9292U, 0x4EE9CECEU, 0x89F10101U,
704 0x6B9F1E1EU, 0x53A93434U, 0x6AC4F1F1U, 0xB499C3C3U, 0xF1975B5BU,
705 0xE1834747U, 0xE66B1818U, 0xBDC82222U, 0x450E9898U, 0xE26E1F1FU,
706 0xF4C9B3B3U, 0xB62F7474U, 0x66CBF8F8U, 0xCCFF9999U, 0x95EA1414U,
707 0x03ED5858U, 0x56F7DCDCU, 0xD4E18B8BU, 0x1C1B1515U, 0x1EADA2A2U,
708 0xD70CD3D3U, 0xFB2BE2E2U, 0xC31DC8C8U, 0x8E195E5EU, 0xB5C22C2CU,
709 0xE9894949U, 0xCF12C1C1U, 0xBF7E9595U, 0xBA207D7DU, 0xEA641111U,
710 0x77840B0BU, 0x396DC5C5U, 0xAF6A8989U, 0x33D17C7CU, 0xC9A17171U,
711 0x62CEFFFFU, 0x7137BBBBU, 0x81FB0F0FU, 0x793DB5B5U, 0x0951E1E1U,
712 0xADDC3E3EU, 0x242D3F3FU, 0xCDA47676U, 0xF99D5555U, 0xD8EE8282U,
713 0xE5864040U, 0xC5AE7878U, 0xB9CD2525U, 0x4D049696U, 0x44557777U,
714 0x080A0E0EU, 0x86135050U, 0xE730F7F7U, 0xA1D33737U, 0x1D40FAFAU,
715 0xAA346161U, 0xED8C4E4EU, 0x06B3B0B0U, 0x706C5454U, 0xB22A7373U,
716 0xD2523B3BU, 0x410B9F9FU, 0x7B8B0202U, 0xA088D8D8U, 0x114FF3F3U,
717 0x3167CBCBU, 0xC2462727U, 0x27C06767U, 0x90B4FCFCU, 0x20283838U,
718 0xF67F0404U, 0x60784848U, 0xFF2EE5E5U, 0x96074C4CU, 0x5C4B6565U,
719 0xB1C72B2BU, 0xAB6F8E8EU, 0x9E0D4242U, 0x9CBBF5F5U, 0x52F2DBDBU,
720 0x1BF34A4AU, 0x5FA63D3DU, 0x9359A4A4U, 0x0ABCB9B9U, 0xEF3AF9F9U,
721 0x91EF1313U, 0x85FE0808U, 0x49019191U, 0xEE611616U, 0x2D7CDEDEU,
722 0x4FB22121U, 0x8F42B1B1U, 0x3BDB7272U, 0x47B82F2FU, 0x8748BFBFU,
723 0x6D2CAEAEU, 0x46E3C0C0U, 0xD6573C3CU, 0x3E859A9AU, 0x6929A9A9U,
724 0x647D4F4FU, 0x2A948181U, 0xCE492E2EU, 0xCB17C6C6U, 0x2FCA6969U,
725 0xFCC3BDBDU, 0x975CA3A3U, 0x055EE8E8U, 0x7AD0EDEDU, 0xAC87D1D1U,
726 0x7F8E0505U, 0xD5BA6464U, 0x1AA8A5A5U, 0x4BB72626U, 0x0EB9BEBEU,
727 0xA7608787U, 0x5AF8D5D5U, 0x28223636U, 0x14111B1BU, 0x3FDE7575U,
728 0x2979D9D9U, 0x88AAEEEEU, 0x3C332D2DU, 0x4C5F7979U, 0x02B6B7B7U,
729 0xB896CACAU, 0xDA583535U, 0xB09CC4C4U, 0x17FC4343U, 0x551A8484U,
730 0x1FF64D4DU, 0x8A1C5959U, 0x7D38B2B2U, 0x57AC3333U, 0xC718CFCFU,
731 0x8DF40606U, 0x74695353U, 0xB7749B9BU, 0xC4F59797U, 0x9F56ADADU,
732 0x72DAE3E3U, 0x7ED5EAEAU, 0x154AF4F4U, 0x229E8F8FU, 0x12A2ABABU,
733 0x584E6262U, 0x07E85F5FU, 0x99E51D1DU, 0x34392323U, 0x6EC1F6F6U,
734 0x50446C6CU, 0xDE5D3232U, 0x68724646U, 0x6526A0A0U, 0xBC93CDCDU,
735 0xDB03DADAU, 0xF8C6BABAU, 0xC8FA9E9EU, 0xA882D6D6U, 0x2BCF6E6EU,
736 0x40507070U, 0xDCEB8585U, 0xFE750A0AU, 0x328A9393U, 0xA48DDFDFU,
737 0xCA4C2929U, 0x10141C1CU, 0x2173D7D7U, 0xF0CCB4B4U, 0xD309D4D4U,
738 0x5D108A8AU, 0x0FE25151U, 0x00000000U, 0x6F9A1919U, 0x9DE01A1AU,
739 0x368F9494U, 0x42E6C7C7U, 0x4AECC9C9U, 0x5EFDD2D2U, 0xC1AB7F7FU,
740 0xE0D8A8A8U
741 },
742 { 0xBC75BC32U, 0xECF3EC21U, 0x20C62043U, 0xB3F4B3C9U, 0xDADBDA03U,
743 0x027B028BU, 0xE2FBE22BU, 0x9EC89EFAU, 0xC94AC9ECU, 0xD4D3D409U,
744 0x18E6186BU, 0x1E6B1E9FU, 0x9845980EU, 0xB27DB238U, 0xA6E8A6D2U,
745 0x264B26B7U, 0x3CD63C57U, 0x9332938AU, 0x82D882EEU, 0x52FD5298U,
746 0x7B377BD4U, 0xBB71BB37U, 0x5BF15B97U, 0x47E14783U, 0x2430243CU,
747 0x510F51E2U, 0xBAF8BAC6U, 0x4A1B4AF3U, 0xBF87BF48U, 0x0DFA0D70U,
748 0xB006B0B3U, 0x753F75DEU, 0xD25ED2FDU, 0x7DBA7D20U, 0x66AE6631U,
749 0x3A5B3AA3U, 0x598A591CU, 0x00000000U, 0xCDBCCD93U, 0x1A9D1AE0U,
750 0xAE6DAE2CU, 0x7FC17FABU, 0x2BB12BC7U, 0xBE0EBEB9U, 0xE080E0A0U,
751 0x8A5D8A10U, 0x3BD23B52U, 0x64D564BAU, 0xD8A0D888U, 0xE784E7A5U,
752 0x5F075FE8U, 0x1B141B11U, 0x2CB52CC2U, 0xFC90FCB4U, 0x312C3127U,
753 0x80A38065U, 0x73B2732AU, 0x0C730C81U, 0x794C795FU, 0x6B546B41U,
754 0x4B924B02U, 0x53745369U, 0x9436948FU, 0x8351831FU, 0x2A382A36U,
755 0xC4B0C49CU, 0x22BD22C8U, 0xD55AD5F8U, 0xBDFCBDC3U, 0x48604878U,
756 0xFF62FFCEU, 0x4C964C07U, 0x416C4177U, 0xC742C7E6U, 0xEBF7EB24U,
757 0x1C101C14U, 0x5D7C5D63U, 0x36283622U, 0x672767C0U, 0xE98CE9AFU,
758 0x441344F9U, 0x149514EAU, 0xF59CF5BBU, 0xCFC7CF18U, 0x3F243F2DU,
759 0xC046C0E3U, 0x723B72DBU, 0x5470546CU, 0x29CA294CU, 0xF0E3F035U,
760 0x088508FEU, 0xC6CBC617U, 0xF311F34FU, 0x8CD08CE4U, 0xA493A459U,
761 0xCAB8CA96U, 0x68A6683BU, 0xB883B84DU, 0x38203828U, 0xE5FFE52EU,
762 0xAD9FAD56U, 0x0B770B84U, 0xC8C3C81DU, 0x99CC99FFU, 0x580358EDU,
763 0x196F199AU, 0x0E080E0AU, 0x95BF957EU, 0x70407050U, 0xF7E7F730U,
764 0x6E2B6ECFU, 0x1FE21F6EU, 0xB579B53DU, 0x090C090FU, 0x61AA6134U,
765 0x57825716U, 0x9F419F0BU, 0x9D3A9D80U, 0x11EA1164U, 0x25B925CDU,
766 0xAFE4AFDDU, 0x459A4508U, 0xDFA4DF8DU, 0xA397A35CU, 0xEA7EEAD5U,
767 0x35DA3558U, 0xED7AEDD0U, 0x431743FCU, 0xF866F8CBU, 0xFB94FBB1U,
768 0x37A137D3U, 0xFA1DFA40U, 0xC23DC268U, 0xB4F0B4CCU, 0x32DE325DU,
769 0x9CB39C71U, 0x560B56E7U, 0xE372E3DAU, 0x87A78760U, 0x151C151BU,
770 0xF9EFF93AU, 0x63D163BFU, 0x345334A9U, 0x9A3E9A85U, 0xB18FB142U,
771 0x7C337CD1U, 0x8826889BU, 0x3D5F3DA6U, 0xA1ECA1D7U, 0xE476E4DFU,
772 0x812A8194U, 0x91499101U, 0x0F810FFBU, 0xEE88EEAAU, 0x16EE1661U,
773 0xD721D773U, 0x97C497F5U, 0xA51AA5A8U, 0xFEEBFE3FU, 0x6DD96DB5U,
774 0x78C578AEU, 0xC539C56DU, 0x1D991DE5U, 0x76CD76A4U, 0x3EAD3EDCU,
775 0xCB31CB67U, 0xB68BB647U, 0xEF01EF5BU, 0x1218121EU, 0x602360C5U,
776 0x6ADD6AB0U, 0x4D1F4DF6U, 0xCE4ECEE9U, 0xDE2DDE7CU, 0x55F9559DU,
777 0x7E487E5AU, 0x214F21B2U, 0x03F2037AU, 0xA065A026U, 0x5E8E5E19U,
778 0x5A785A66U, 0x655C654BU, 0x6258624EU, 0xFD19FD45U, 0x068D06F4U,
779 0x40E54086U, 0xF298F2BEU, 0x335733ACU, 0x17671790U, 0x057F058EU,
780 0xE805E85EU, 0x4F644F7DU, 0x89AF896AU, 0x10631095U, 0x74B6742FU,
781 0x0AFE0A75U, 0x5CF55C92U, 0x9BB79B74U, 0x2D3C2D33U, 0x30A530D6U,
782 0x2ECE2E49U, 0x49E94989U, 0x46684672U, 0x77447755U, 0xA8E0A8D8U,
783 0x964D9604U, 0x284328BDU, 0xA969A929U, 0xD929D979U, 0x862E8691U,
784 0xD1ACD187U, 0xF415F44AU, 0x8D598D15U, 0xD6A8D682U, 0xB90AB9BCU,
785 0x429E420DU, 0xF66EF6C1U, 0x2F472FB8U, 0xDDDFDD06U, 0x23342339U,
786 0xCC35CC62U, 0xF16AF1C4U, 0xC1CFC112U, 0x85DC85EBU, 0x8F228F9EU,
787 0x71C971A1U, 0x90C090F0U, 0xAA9BAA53U, 0x018901F1U, 0x8BD48BE1U,
788 0x4EED4E8CU, 0x8EAB8E6FU, 0xAB12ABA2U, 0x6FA26F3EU, 0xE60DE654U,
789 0xDB52DBF2U, 0x92BB927BU, 0xB702B7B6U, 0x692F69CAU, 0x39A939D9U,
790 0xD3D7D30CU, 0xA761A723U, 0xA21EA2ADU, 0xC3B4C399U, 0x6C506C44U,
791 0x07040705U, 0x04F6047FU, 0x27C22746U, 0xAC16ACA7U, 0xD025D076U,
792 0x50865013U, 0xDC56DCF7U, 0x8455841AU, 0xE109E151U, 0x7ABE7A25U,
793 0x139113EFU
794 },
795 { 0xD939A9D9U, 0x90176790U, 0x719CB371U, 0xD2A6E8D2U, 0x05070405U,
796 0x9852FD98U, 0x6580A365U, 0xDFE476DFU, 0x08459A08U, 0x024B9202U,
797 0xA0E080A0U, 0x665A7866U, 0xDDAFE4DDU, 0xB06ADDB0U, 0xBF63D1BFU,
798 0x362A3836U, 0x54E60D54U, 0x4320C643U, 0x62CC3562U, 0xBEF298BEU,
799 0x1E12181EU, 0x24EBF724U, 0xD7A1ECD7U, 0x77416C77U, 0xBD2843BDU,
800 0x32BC7532U, 0xD47B37D4U, 0x9B88269BU, 0x700DFA70U, 0xF94413F9U,
801 0xB1FB94B1U, 0x5A7E485AU, 0x7A03F27AU, 0xE48CD0E4U, 0x47B68B47U,
802 0x3C24303CU, 0xA5E784A5U, 0x416B5441U, 0x06DDDF06U, 0xC56023C5U,
803 0x45FD1945U, 0xA33A5BA3U, 0x68C23D68U, 0x158D5915U, 0x21ECF321U,
804 0x3166AE31U, 0x3E6FA23EU, 0x16578216U, 0x95106395U, 0x5BEF015BU,
805 0x4DB8834DU, 0x91862E91U, 0xB56DD9B5U, 0x1F83511FU, 0x53AA9B53U,
806 0x635D7C63U, 0x3B68A63BU, 0x3FFEEB3FU, 0xD630A5D6U, 0x257ABE25U,
807 0xA7AC16A7U, 0x0F090C0FU, 0x35F0E335U, 0x23A76123U, 0xF090C0F0U,
808 0xAFE98CAFU, 0x809D3A80U, 0x925CF592U, 0x810C7381U, 0x27312C27U,
809 0x76D02576U, 0xE7560BE7U, 0x7B92BB7BU, 0xE9CE4EE9U, 0xF10189F1U,
810 0x9F1E6B9FU, 0xA93453A9U, 0xC4F16AC4U, 0x99C3B499U, 0x975BF197U,
811 0x8347E183U, 0x6B18E66BU, 0xC822BDC8U, 0x0E98450EU, 0x6E1FE26EU,
812 0xC9B3F4C9U, 0x2F74B62FU, 0xCBF866CBU, 0xFF99CCFFU, 0xEA1495EAU,
813 0xED5803EDU, 0xF7DC56F7U, 0xE18BD4E1U, 0x1B151C1BU, 0xADA21EADU,
814 0x0CD3D70CU, 0x2BE2FB2BU, 0x1DC8C31DU, 0x195E8E19U, 0xC22CB5C2U,
815 0x8949E989U, 0x12C1CF12U, 0x7E95BF7EU, 0x207DBA20U, 0x6411EA64U,
816 0x840B7784U, 0x6DC5396DU, 0x6A89AF6AU, 0xD17C33D1U, 0xA171C9A1U,
817 0xCEFF62CEU, 0x37BB7137U, 0xFB0F81FBU, 0x3DB5793DU, 0x51E10951U,
818 0xDC3EADDCU, 0x2D3F242DU, 0xA476CDA4U, 0x9D55F99DU, 0xEE82D8EEU,
819 0x8640E586U, 0xAE78C5AEU, 0xCD25B9CDU, 0x04964D04U, 0x55774455U,
820 0x0A0E080AU, 0x13508613U, 0x30F7E730U, 0xD337A1D3U, 0x40FA1D40U,
821 0x3461AA34U, 0x8C4EED8CU, 0xB3B006B3U, 0x6C54706CU, 0x2A73B22AU,
822 0x523BD252U, 0x0B9F410BU, 0x8B027B8BU, 0x88D8A088U, 0x4FF3114FU,
823 0x67CB3167U, 0x4627C246U, 0xC06727C0U, 0xB4FC90B4U, 0x28382028U,
824 0x7F04F67FU, 0x78486078U, 0x2EE5FF2EU, 0x074C9607U, 0x4B655C4BU,
825 0xC72BB1C7U, 0x6F8EAB6FU, 0x0D429E0DU, 0xBBF59CBBU, 0xF2DB52F2U,
826 0xF34A1BF3U, 0xA63D5FA6U, 0x59A49359U, 0xBCB90ABCU, 0x3AF9EF3AU,
827 0xEF1391EFU, 0xFE0885FEU, 0x01914901U, 0x6116EE61U, 0x7CDE2D7CU,
828 0xB2214FB2U, 0x42B18F42U, 0xDB723BDBU, 0xB82F47B8U, 0x48BF8748U,
829 0x2CAE6D2CU, 0xE3C046E3U, 0x573CD657U, 0x859A3E85U, 0x29A96929U,
830 0x7D4F647DU, 0x94812A94U, 0x492ECE49U, 0x17C6CB17U, 0xCA692FCAU,
831 0xC3BDFCC3U, 0x5CA3975CU, 0x5EE8055EU, 0xD0ED7AD0U, 0x87D1AC87U,
832 0x8E057F8EU, 0xBA64D5BAU, 0xA8A51AA8U, 0xB7264BB7U, 0xB9BE0EB9U,
833 0x6087A760U, 0xF8D55AF8U, 0x22362822U, 0x111B1411U, 0xDE753FDEU,
834 0x79D92979U, 0xAAEE88AAU, 0x332D3C33U, 0x5F794C5FU, 0xB6B702B6U,
835 0x96CAB896U, 0x5835DA58U, 0x9CC4B09CU, 0xFC4317FCU, 0x1A84551AU,
836 0xF64D1FF6U, 0x1C598A1CU, 0x38B27D38U, 0xAC3357ACU, 0x18CFC718U,
837 0xF4068DF4U, 0x69537469U, 0x749BB774U, 0xF597C4F5U, 0x56AD9F56U,
838 0xDAE372DAU, 0xD5EA7ED5U, 0x4AF4154AU, 0x9E8F229EU, 0xA2AB12A2U,
839 0x4E62584EU, 0xE85F07E8U, 0xE51D99E5U, 0x39233439U, 0xC1F66EC1U,
840 0x446C5044U, 0x5D32DE5DU, 0x72466872U, 0x26A06526U, 0x93CDBC93U,
841 0x03DADB03U, 0xC6BAF8C6U, 0xFA9EC8FAU, 0x82D6A882U, 0xCF6E2BCFU,
842 0x50704050U, 0xEB85DCEBU, 0x750AFE75U, 0x8A93328AU, 0x8DDFA48DU,
843 0x4C29CA4CU, 0x141C1014U, 0x73D72173U, 0xCCB4F0CCU, 0x09D4D309U,
844 0x108A5D10U, 0xE2510FE2U, 0x00000000U, 0x9A196F9AU, 0xE01A9DE0U,
845 0x8F94368FU, 0xE6C742E6U, 0xECC94AECU, 0xFDD25EFDU, 0xAB7FC1ABU,
846 0xD8A8E0D8U
847 }
848 };
849
850 ssize_t
851 j,
852 k;
853
854 ssize_t
855 i;
856
857 unsigned char
858 *p;
859
860 unsigned char
861 crypt_key[32],
862 s0,
863 s1,
864 s2,
865 s3,
866 s4,
867 s5,
868 s6,
869 s7,
870 s8,
871 s9,
872 s10,
873 s11,
874 s12,
875 s13,
876 s14,
877 s15,
878 xi;
879
880 unsigned char
881 *datum;
882
883 unsigned int
884 rho,
885 sigma;
886
887 /*
888 Generate crypt key.
889 */
891 WizardAssert(CipherDomain,twofish_info != (TwofishInfo *) NULL);
893 WizardAssert(CipherDomain,key != (StringInfo *) NULL);
894 (void) memset(crypt_key,0,sizeof(crypt_key));
895 p=(unsigned char *) crypt_key;
896 datum=GetStringInfoDatum(key);
897 for (i=0; i < (ssize_t) Min(GetStringInfoLength(key),MaximumTwofishKeyLength); i++)
898 p[i]=datum[i];
900 p[i++]=1;
901 while (i < MaximumTwofishKeyLength)
902 p[i++]=0;
903 s0=0;
904 s1=0;
905 s2=0;
906 s3=0;
907 s4=0;
908 s5=0;
909 s6=0;
910 s7=0;
911 s8=0;
912 s9=0;
913 s10=0;
914 s11=0;
915 s12=0;
916 s13=0;
917 s14=0;
918 s15=0;
919 Sbox(s0,s1,s2,s3,0,0x00,0x2D,0x01,0x2D);
920 Sbox(s0,s1,s2,s3,1,0x2D,0xA4,0x44,0x8A);
921 Sbox(s0,s1,s2,s3,2,0x8A,0xD5,0xBF,0xD1);
922 Sbox(s0,s1,s2,s3,3,0xD1,0x7F,0x3D,0x99);
923 Sbox(s0,s1,s2,s3,4,0x99,0x46,0x66,0x96);
924 Sbox(s0,s1,s2,s3,5,0x96,0x3C,0x5B,0xED);
925 Sbox(s0,s1,s2,s3,6,0xED,0x37,0x4F,0xE0);
926 Sbox(s0,s1,s2,s3,7,0xE0,0xD0,0x8C,0x17);
927 Sbox(s4,s5,s6,s7,8,0x00,0x2D,0x01,0x2D);
928 Sbox(s4,s5,s6,s7,9,0x2D,0xA4,0x44,0x8A);
929 Sbox(s4,s5,s6,s7,10,0x8A,0xD5,0xBF,0xD1);
930 Sbox(s4,s5,s6,s7,11,0xD1,0x7F,0x3D,0x99);
931 Sbox(s4,s5,s6,s7,12,0x99,0x46,0x66,0x96);
932 Sbox(s4,s5,s6,s7,13,0x96,0x3C,0x5B,0xED);
933 Sbox(s4,s5,s6,s7,14,0xED,0x37,0x4F,0xE0);
934 Sbox(s4,s5,s6,s7,15,0xE0,0xD0,0x8C,0x17);
935 if ((8*GetStringInfoLength(key)) >= 192)
936 {
937 /*
938 192- or 256-bit key.
939 */
940 Sbox(s8,s9,s10,s11,16,0x00,0x2D,0x01,0x2D);
941 Sbox(s8,s9,s10,s11,17,0x2D,0xA4,0x44,0x8A);
942 Sbox(s8,s9,s10,s11,18,0x8A,0xD5,0xBF,0xD1);
943 Sbox(s8,s9,s10,s11,19,0xD1,0x7F,0x3D,0x99);
944 Sbox(s8,s9,s10,s11,20,0x99,0x46,0x66,0x96);
945 Sbox(s8,s9,s10,s11,21,0x96,0x3C,0x5B,0xED);
946 Sbox(s8,s9,s10,s11,22,0xED,0x37,0x4F,0xE0);
947 Sbox(s8,s9,s10,s11,23,0xE0,0xD0,0x8C,0x17);
948 }
949 j=0;
950 k=1;
951 if ((8*GetStringInfoLength(key)) >= 256)
952 {
953 /*
954 256-bit key.
955 */
956 Sbox(s12,s13,s14,s15,24,0x00,0x2D,0x01,0x2D);
957 Sbox(s12,s13,s14,s15,25,0x2D,0xA4,0x44,0x8A);
958 Sbox(s12,s13,s14,s15,26,0x8A,0xD5,0xBF,0xD1);
959 Sbox(s12,s13,s14,s15,27,0xD1,0x7F,0x3D,0x99);
960 Sbox(s12,s13,s14,s15,28,0x99,0x46,0x66,0x96);
961 Sbox(s12,s13,s14,s15,29,0x96,0x3C,0x5B,0xED);
962 Sbox(s12,s13,s14,s15,30,0xED,0x37,0x4F,0xE0);
963 Sbox(s12,s13,s14,s15,31,0xE0,0xD0,0x8C,0x17);
964 for (i=0; i < 256; i++)
965 {
966 twofish_info->sbox[0][i]=
967 mds[0][q0[q0[q1[sbox[k] ^ s0] ^ s4] ^ s8] ^ s12];
968 twofish_info->sbox[1][i]=
969 mds[1][q0[q1[q1[sbox[j] ^ s1] ^ s5] ^ s9] ^ s13];
970 twofish_info->sbox[2][i]=
971 mds[2][q1[q0[q0[sbox[j] ^ s2] ^ s6] ^ s10] ^ s14];
972 twofish_info->sbox[3][i]=
973 mds[3][q1[q1[q0[sbox[k] ^ s3] ^ s7] ^ s11] ^ s15];
974 j+=2;
975 k+=2;
976 }
977 K256(w,0,0xA9,0x75,0x67,0xF3);
978 K256(w,2,0xB3,0xC6,0xE8,0xF4);
979 K256(w,4,0x04,0xDB,0xFD,0x7B);
980 K256(w,6,0xA3,0xFB,0x76,0xC8);
981 K256(k,0,0x9A,0x4A,0x92,0xD3);
982 K256(k,2,0x80,0xE6,0x78,0x6B);
983 K256(k,4,0xE4,0x45,0xDD,0x7D);
984 K256(k,6,0xD1,0xE8,0x38,0x4B);
985 K256(k,8,0x0D,0xD6,0xC6,0x32);
986 K256(k,10,0x35,0xD8,0x98,0xFD);
987 K256(k,12,0x18,0x37,0xF7,0x71);
988 K256(k,14,0xEC,0xF1,0x6C,0xE1);
989 K256(k,16,0x43,0x30,0x75,0x0F);
990 K256(k,18,0x37,0xF8,0x26,0x1B);
991 K256(k,20,0xFA,0x87,0x13,0xFA);
992 K256(k,22,0x94,0x06,0x48,0x3F);
993 K256(k,24,0xF2,0x5E,0xD0,0xBA);
994 K256(k,26,0x8B,0xAE,0x30,0x5B);
995 K256(k,28,0x84,0x8A,0x54,0x00);
996 K256(k,30,0xDF,0xBC,0x23,0x9D);
997 }
998 else
999 if ((8*GetStringInfoLength(key)) >= 192)
1000 {
1001 /*
1002 192-bit key.
1003 */
1004 for (i=0; i < 256; i++)
1005 {
1006 twofish_info->sbox[0][i]=mds[0][q0[q0[sbox[k] ^ s0] ^ s4] ^ s8];
1007 twofish_info->sbox[1][i]=mds[1][q0[q1[sbox[k] ^ s1] ^ s5] ^ s9];
1008 twofish_info->sbox[2][i]=mds[2][q1[q0[sbox[j] ^ s2] ^ s6] ^ s10];
1009 twofish_info->sbox[3][i]=mds[3][q1[q1[sbox[j] ^ s3] ^ s7] ^ s11];
1010 j+=2;
1011 k+=2;
1012 }
1013 K192(w,0,0xA9,0x75,0x67,0xF3);
1014 K192(w,2,0xB3,0xC6,0xE8,0xF4);
1015 K192(w,4,0x04,0xDB,0xFD,0x7B);
1016 K192(w,6,0xA3,0xFB,0x76,0xC8);
1017 K192(k,0,0x9A,0x4A,0x92,0xD3);
1018 K192(k,2,0x80,0xE6,0x78,0x6B);
1019 K192(k,4,0xE4,0x45,0xDD,0x7D);
1020 K192(k,6,0xD1,0xE8,0x38,0x4B);
1021 K192(k,8,0x0D,0xD6,0xC6,0x32);
1022 K192(k,10,0x35,0xD8,0x98,0xFD);
1023 K192(k,12,0x18,0x37,0xF7,0x71);
1024 K192(k,14,0xEC,0xF1,0x6C,0xE1);
1025 K192(k,16,0x43,0x30,0x75,0x0F);
1026 K192(k,18,0x37,0xF8,0x26,0x1B);
1027 K192(k,20,0xFA,0x87,0x13,0xFA);
1028 K192(k,22,0x94,0x06,0x48,0x3F);
1029 K192(k,24,0xF2,0x5E,0xD0,0xBA);
1030 K192(k,26,0x8B,0xAE,0x30,0x5B);
1031 K192(k,28,0x84,0x8A,0x54,0x00);
1032 K192(k,30,0xDF,0xBC,0x23,0x9D);
1033 }
1034 else
1035 {
1036 /*
1037 128-bit key.
1038 */
1039 for (i=0; i < 256; i++)
1040 {
1041 twofish_info->sbox[0][i]=mds[0][q0[sbox[j] ^ s0] ^ s4];
1042 twofish_info->sbox[1][i]=mds[1][q0[sbox[k] ^ s1] ^ s5];
1043 twofish_info->sbox[2][i]=mds[2][q1[sbox[j] ^ s2] ^ s6];
1044 twofish_info->sbox[3][i]=mds[3][q1[sbox[k] ^ s3] ^ s7];
1045 j+=2;
1046 k+=2;
1047 }
1048 K128(w,0,0xA9,0x75,0x67,0xF3);
1049 K128(w,2,0xB3,0xC6,0xE8,0xF4);
1050 K128(w,4,0x04,0xDB,0xFD,0x7B);
1051 K128(w,6,0xA3,0xFB,0x76,0xC8);
1052 K128(k,0,0x9A,0x4A,0x92,0xD3);
1053 K128(k,2,0x80,0xE6,0x78,0x6B);
1054 K128(k,4,0xE4,0x45,0xDD,0x7D);
1055 K128(k,6,0xD1,0xE8,0x38,0x4B);
1056 K128(k,8,0x0D,0xD6,0xC6,0x32);
1057 K128(k,10,0x35,0xD8,0x98,0xFD);
1058 K128(k,12,0x18,0x37,0xF7,0x71);
1059 K128(k,14,0xEC,0xF1,0x6C,0xE1);
1060 K128(k,16,0x43,0x30,0x75,0x0F);
1061 K128(k,18,0x37,0xF8,0x26,0x1B);
1062 K128(k,20,0xFA,0x87,0x13,0xFA);
1063 K128(k,22,0x94,0x06,0x48,0x3F);
1064 K128(k,24,0xF2,0x5E,0xD0,0xBA);
1065 K128(k,26,0x8B,0xAE,0x30,0x5B);
1066 K128(k,28,0x84,0x8A,0x54,0x00);
1067 K128(k,30,0xDF,0xBC,0x23,0x9D);
1068 }
1069 /*
1070 Reset registers.
1071 */
1072 (void) ResetWizardMemory(crypt_key,0,sizeof(crypt_key));
1073 rho=0;
1074 sigma=0;
1075 s0=0;
1076 s1=0;
1077 s2=0;
1078 s3=0;
1079 s4=0;
1080 s5=0;
1081 s6=0;
1082 s7=0;
1083 s8=0;
1084 s9=0;
1085 s10=0;
1086 s11=0;
1087 s12=0;
1088 s13=0;
1089 s14=0;
1090 s15=0;
1091 xi=0;
1092}
#define WizardAssert(domain, predicate)
#define ThrowWizardFatalError(domain, error)
@ CipherDomain
Definition exception.h:34
@ MemoryError
Definition exception.h:49
WizardBooleanType LogWizardEvent(const LogEventType type, const char *module, const char *function, const size_t line, const char *format,...)
Definition log.c:1390
@ TraceEvent
Definition log.h:39
#define GetWizardModule()
Definition log.h:30
WizardExport void * AcquireWizardMemory(const size_t size)
Definition memory.c:586
WizardExport void * RelinquishWizardMemory(void *memory)
Definition memory.c:1039
WizardExport void * ResetWizardMemory(void *memory, int c, const size_t size)
Definition memory.c:1114
#define WizardExport
#define WizardSignature
WizardExport size_t GetStringInfoLength(const StringInfo *string_info)
Definition string.c:1280
WizardExport unsigned char * GetStringInfoDatum(const StringInfo *string_info)
Definition string.c:1251
unsigned int w[8]
Definition twofish.c:56
unsigned int k[32]
Definition twofish.c:54
size_t signature
Definition twofish.c:62
time_t timestamp
Definition twofish.c:59
unsigned int sbox[4][256]
Definition twofish.c:55
unsigned int blocksize
Definition twofish.c:53
#define Min(x, y)
Definition studio.h:307
WizardExport void EncipherTwofishBlock(TwofishInfo *twofish_info, const unsigned char *plaintext, unsigned char *ciphertext)
Definition twofish.c:283
#define Write32Bits(p, value)
Definition twofish.c:86
#define K192(x, j, k, l, m, n)
WizardExport TwofishInfo * DestroyTwofishInfo(TwofishInfo *twofish_info)
Definition twofish.c:245
#define K256(x, j, k, l, m, n)
#define MaximumTwofishKeyLength
#define Sbox(alpha, beta, gamma, delta, i, w, x, y, z)
#define TwofishBlocksize
Definition twofish.c:85
WizardExport void DecipherTwofishBlock(TwofishInfo *twofish_info, const unsigned char *ciphertext, unsigned char *plaintext)
Definition twofish.c:155
WizardExport unsigned int GetTwofishBlocksize(const TwofishInfo *twofish_info)
Definition twofish.c:374
WizardExport TwofishInfo * AcquireTwofishInfo(void)
Definition twofish.c:112
#define EncipherRound(alpha, beta, gamma, delta, i)
#define K128(x, j, k, l, m, n)
WizardExport void SetTwofishKey(TwofishInfo *twofish_info, const StringInfo *key)
Definition twofish.c:408
#define DecipherRound(alpha, beta, gamma, delta, i)