PolarSSL v1.2.5
blowfish.c
Go to the documentation of this file.
1 /*
2  * Blowfish implementation
3  *
4  * Copyright (C) 2012-2012, Brainspark B.V.
5  *
6  * This file is part of PolarSSL (http://www.polarssl.org)
7  * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
8  *
9  * All rights reserved.
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License along
22  * with this program; if not, write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24  */
25 /*
26  * The Blowfish block cipher was designed by Bruce Schneier in 1993.
27  * http://www.schneier.com/blowfish.html
28  * http://en.wikipedia.org/wiki/Blowfish_%28cipher%29
29  *
30  */
31 
32 #include "polarssl/config.h"
33 
34 #if defined(POLARSSL_BLOWFISH_C)
35 
36 #include "polarssl/blowfish.h"
37 
38 /*
39  * 32-bit integer manipulation macros (big endian)
40  */
41 #ifndef GET_UINT32_BE
42 #define GET_UINT32_BE(n,b,i) \
43 { \
44  (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
45  | ( (uint32_t) (b)[(i) + 1] << 16 ) \
46  | ( (uint32_t) (b)[(i) + 2] << 8 ) \
47  | ( (uint32_t) (b)[(i) + 3] ); \
48 }
49 #endif
50 
51 #ifndef PUT_UINT32_BE
52 #define PUT_UINT32_BE(n,b,i) \
53 { \
54  (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
55  (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
56  (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
57  (b)[(i) + 3] = (unsigned char) ( (n) ); \
58 }
59 #endif
60 
61 static const uint32_t P[BLOWFISH_ROUNDS + 2] = {
62  0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
63  0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
64  0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
65  0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
66  0x9216D5D9L, 0x8979FB1BL
67 };
68 
69 /* declarations of data at the end of this file */
70 static const uint32_t S[4][256];
71 
72 static uint32_t F(blowfish_context *ctx, uint32_t x)
73 {
74  unsigned short a, b, c, d;
75  uint32_t y;
76 
77  d = (unsigned short)(x & 0xFF);
78  x >>= 8;
79  c = (unsigned short)(x & 0xFF);
80  x >>= 8;
81  b = (unsigned short)(x & 0xFF);
82  x >>= 8;
83  a = (unsigned short)(x & 0xFF);
84  y = ctx->S[0][a] + ctx->S[1][b];
85  y = y ^ ctx->S[2][c];
86  y = y + ctx->S[3][d];
87 
88  return y;
89 }
90 
91 static void blowfish_enc(blowfish_context *ctx, uint32_t *xl, uint32_t *xr)
92 {
93  uint32_t Xl, Xr, temp;
94  short i;
95 
96  Xl = *xl;
97  Xr = *xr;
98 
99  for (i = 0; i < BLOWFISH_ROUNDS; ++i)
100  {
101  Xl = Xl ^ ctx->P[i];
102  Xr = F(ctx, Xl) ^ Xr;
103 
104  temp = Xl;
105  Xl = Xr;
106  Xr = temp;
107  }
108 
109  temp = Xl;
110  Xl = Xr;
111  Xr = temp;
112 
113  Xr = Xr ^ ctx->P[BLOWFISH_ROUNDS];
114  Xl = Xl ^ ctx->P[BLOWFISH_ROUNDS + 1];
115 
116  *xl = Xl;
117  *xr = Xr;
118 }
119 
120 static void blowfish_dec(blowfish_context *ctx, uint32_t *xl, uint32_t *xr)
121 {
122  uint32_t Xl, Xr, temp;
123  short i;
124 
125  Xl = *xl;
126  Xr = *xr;
127 
128  for (i = BLOWFISH_ROUNDS + 1; i > 1; --i)
129  {
130  Xl = Xl ^ ctx->P[i];
131  Xr = F(ctx, Xl) ^ Xr;
132 
133  temp = Xl;
134  Xl = Xr;
135  Xr = temp;
136  }
137 
138  temp = Xl;
139  Xl = Xr;
140  Xr = temp;
141 
142  Xr = Xr ^ ctx->P[1];
143  Xl = Xl ^ ctx->P[0];
144 
145  *xl = Xl;
146  *xr = Xr;
147 }
148 
149 /*
150  * Blowfish key schedule
151  */
152 int blowfish_setkey( blowfish_context *ctx, const unsigned char *key, unsigned int keysize )
153 {
154  unsigned int i, j, k;
155  uint32_t data, datal, datar;
156 
157  if( keysize < BLOWFISH_MIN_KEY || keysize > BLOWFISH_MAX_KEY ||
158  ( keysize % 8 ) )
159  {
161  }
162 
163  keysize >>= 3;
164 
165  for( i = 0; i < 4; i++ )
166  {
167  for( j = 0; j < 256; j++ )
168  ctx->S[i][j] = S[i][j];
169  }
170 
171  j = 0;
172  for( i = 0; i < BLOWFISH_ROUNDS + 2; ++i )
173  {
174  data = 0x00000000;
175  for( k = 0; k < 4; ++k )
176  {
177  data = ( data << 8 ) | key[j++];
178  if( j >= keysize )
179  j = 0;
180  }
181  ctx->P[i] = P[i] ^ data;
182  }
183 
184  datal = 0x00000000;
185  datar = 0x00000000;
186 
187  for( i = 0; i < BLOWFISH_ROUNDS + 2; i += 2 )
188  {
189  blowfish_enc( ctx, &datal, &datar );
190  ctx->P[i] = datal;
191  ctx->P[i + 1] = datar;
192  }
193 
194  for( i = 0; i < 4; i++ )
195  {
196  for( j = 0; j < 256; j += 2 )
197  {
198  blowfish_enc( ctx, &datal, &datar );
199  ctx->S[i][j] = datal;
200  ctx->S[i][j + 1] = datar;
201  }
202  }
203  return( 0 );
204 }
205 
206 /*
207  * Blowfish-ECB block encryption/decryption
208  */
210  int mode,
211  const unsigned char input[BLOWFISH_BLOCKSIZE],
212  unsigned char output[BLOWFISH_BLOCKSIZE] )
213 {
214  uint32_t X0, X1;
215 
216  GET_UINT32_BE( X0, input, 0 );
217  GET_UINT32_BE( X1, input, 4 );
218 
219  if( mode == BLOWFISH_DECRYPT )
220  {
221  blowfish_dec(ctx, &X0, &X1);
222  }
223  else /* BLOWFISH_ENCRYPT */
224  {
225  blowfish_enc(ctx, &X0, &X1);
226  }
227 
228  PUT_UINT32_BE( X0, output, 0 );
229  PUT_UINT32_BE( X1, output, 4 );
230 
231  return( 0 );
232 }
233 
234 /*
235  * Blowfish-CBC buffer encryption/decryption
236  */
238  int mode,
239  size_t length,
240  unsigned char iv[BLOWFISH_BLOCKSIZE],
241  const unsigned char *input,
242  unsigned char *output )
243 {
244  int i;
245  unsigned char temp[BLOWFISH_BLOCKSIZE];
246 
247  if( length % BLOWFISH_BLOCKSIZE )
249 
250  if( mode == BLOWFISH_DECRYPT )
251  {
252  while( length > 0 )
253  {
254  memcpy( temp, input, BLOWFISH_BLOCKSIZE );
255  blowfish_crypt_ecb( ctx, mode, input, output );
256 
257  for( i = 0; i < BLOWFISH_BLOCKSIZE;i++ )
258  output[i] = (unsigned char)( output[i] ^ iv[i] );
259 
260  memcpy( iv, temp, BLOWFISH_BLOCKSIZE );
261 
262  input += BLOWFISH_BLOCKSIZE;
263  output += BLOWFISH_BLOCKSIZE;
264  length -= BLOWFISH_BLOCKSIZE;
265  }
266  }
267  else
268  {
269  while( length > 0 )
270  {
271  for( i = 0; i < BLOWFISH_BLOCKSIZE; i++ )
272  output[i] = (unsigned char)( input[i] ^ iv[i] );
273 
274  blowfish_crypt_ecb( ctx, mode, output, output );
275  memcpy( iv, output, BLOWFISH_BLOCKSIZE );
276 
277  input += BLOWFISH_BLOCKSIZE;
278  output += BLOWFISH_BLOCKSIZE;
279  length -= BLOWFISH_BLOCKSIZE;
280  }
281  }
282 
283  return( 0 );
284 }
285 
286 #if defined(POLARSSL_CIPHER_MODE_CFB)
287 /*
288  * Blowfish CFB buffer encryption/decryption
289  */
291  int mode,
292  size_t length,
293  size_t *iv_off,
294  unsigned char iv[BLOWFISH_BLOCKSIZE],
295  const unsigned char *input,
296  unsigned char *output )
297 {
298  int c;
299  size_t n = *iv_off;
300 
301  if( mode == BLOWFISH_DECRYPT )
302  {
303  while( length-- )
304  {
305  if( n == 0 )
306  blowfish_crypt_ecb( ctx, BLOWFISH_ENCRYPT, iv, iv );
307 
308  c = *input++;
309  *output++ = (unsigned char)( c ^ iv[n] );
310  iv[n] = (unsigned char) c;
311 
312  n = (n + 1) % BLOWFISH_BLOCKSIZE;
313  }
314  }
315  else
316  {
317  while( length-- )
318  {
319  if( n == 0 )
320  blowfish_crypt_ecb( ctx, BLOWFISH_ENCRYPT, iv, iv );
321 
322  iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
323 
324  n = (n + 1) % BLOWFISH_BLOCKSIZE;
325  }
326  }
327 
328  *iv_off = n;
329 
330  return( 0 );
331 }
332 #endif /*POLARSSL_CIPHER_MODE_CFB */
333 
334 #if defined(POLARSSL_CIPHER_MODE_CTR)
335 /*
336  * Blowfish CTR buffer encryption/decryption
337  */
339  size_t length,
340  size_t *nc_off,
341  unsigned char nonce_counter[BLOWFISH_BLOCKSIZE],
342  unsigned char stream_block[BLOWFISH_BLOCKSIZE],
343  const unsigned char *input,
344  unsigned char *output )
345 {
346  int c, i;
347  size_t n = *nc_off;
348 
349  while( length-- )
350  {
351  if( n == 0 ) {
352  blowfish_crypt_ecb( ctx, BLOWFISH_ENCRYPT, nonce_counter, stream_block );
353 
354  for( i = BLOWFISH_BLOCKSIZE; i > 0; i-- )
355  if( ++nonce_counter[i - 1] != 0 )
356  break;
357  }
358  c = *input++;
359  *output++ = (unsigned char)( c ^ stream_block[n] );
360 
361  n = (n + 1) % BLOWFISH_BLOCKSIZE;
362  }
363 
364  *nc_off = n;
365 
366  return( 0 );
367 }
368 #endif /* POLARSSL_CIPHER_MODE_CTR */
369 
370 static const uint32_t S[4][256] = {
371  { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
372  0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
373  0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
374  0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
375  0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
376  0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
377  0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
378  0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
379  0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
380  0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
381  0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
382  0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
383  0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
384  0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
385  0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
386  0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
387  0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
388  0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
389  0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
390  0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
391  0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
392  0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
393  0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
394  0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
395  0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
396  0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
397  0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
398  0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
399  0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
400  0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
401  0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
402  0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
403  0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
404  0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
405  0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
406  0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
407  0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
408  0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
409  0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
410  0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
411  0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
412  0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
413  0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
414  0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
415  0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
416  0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
417  0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
418  0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
419  0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
420  0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
421  0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
422  0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
423  0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
424  0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
425  0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
426  0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
427  0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
428  0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
429  0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
430  0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
431  0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
432  0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
433  0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
434  0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL },
435  { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
436  0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
437  0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
438  0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
439  0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
440  0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
441  0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
442  0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
443  0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
444  0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
445  0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
446  0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
447  0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
448  0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
449  0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
450  0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
451  0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
452  0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
453  0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
454  0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
455  0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
456  0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
457  0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
458  0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
459  0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
460  0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
461  0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
462  0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
463  0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
464  0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
465  0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
466  0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
467  0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
468  0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
469  0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
470  0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
471  0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
472  0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
473  0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
474  0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
475  0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
476  0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
477  0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
478  0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
479  0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
480  0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
481  0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
482  0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
483  0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
484  0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
485  0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
486  0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
487  0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
488  0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
489  0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
490  0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
491  0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
492  0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
493  0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
494  0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
495  0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
496  0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
497  0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
498  0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L },
499  { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
500  0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
501  0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
502  0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
503  0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
504  0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
505  0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
506  0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
507  0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
508  0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
509  0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
510  0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
511  0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
512  0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
513  0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
514  0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
515  0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
516  0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
517  0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
518  0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
519  0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
520  0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
521  0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
522  0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
523  0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
524  0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
525  0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
526  0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
527  0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
528  0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
529  0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
530  0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
531  0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
532  0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
533  0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
534  0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
535  0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
536  0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
537  0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
538  0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
539  0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
540  0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
541  0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
542  0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
543  0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
544  0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
545  0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
546  0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
547  0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
548  0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
549  0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
550  0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
551  0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
552  0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
553  0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
554  0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
555  0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
556  0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
557  0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
558  0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
559  0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
560  0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
561  0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
562  0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L },
563  { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
564  0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
565  0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
566  0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
567  0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
568  0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
569  0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
570  0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
571  0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
572  0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
573  0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
574  0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
575  0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
576  0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
577  0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
578  0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
579  0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
580  0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
581  0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
582  0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
583  0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
584  0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
585  0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
586  0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
587  0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
588  0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
589  0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
590  0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
591  0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
592  0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
593  0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
594  0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
595  0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
596  0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
597  0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
598  0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
599  0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
600  0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
601  0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
602  0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
603  0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
604  0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
605  0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
606  0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
607  0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
608  0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
609  0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
610  0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
611  0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
612  0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
613  0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
614  0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
615  0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
616  0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
617  0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
618  0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
619  0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
620  0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
621  0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
622  0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
623  0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
624  0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
625  0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
626  0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L }
627 };
628 
629 #endif /* POLARSSL_BLOWFISH_C */