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