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