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