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