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