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