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