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