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