Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers blowfish.c Source File

blowfish.c

00001 /*
00002  *  Blowfish implementation
00003  *
00004  *  Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
00005  *  SPDX-License-Identifier: Apache-2.0
00006  *
00007  *  Licensed under the Apache License, Version 2.0 (the "License"); you may
00008  *  not use this file except in compliance with the License.
00009  *  You may obtain a copy of the License at
00010  *
00011  *  http://www.apache.org/licenses/LICENSE-2.0
00012  *
00013  *  Unless required by applicable law or agreed to in writing, software
00014  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
00015  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00016  *  See the License for the specific language governing permissions and
00017  *  limitations under the License.
00018  *
00019  *  This file is part of mbed TLS (https://tls.mbed.org)
00020  */
00021 /*
00022  *  The Blowfish block cipher was designed by Bruce Schneier in 1993.
00023  *  http://www.schneier.com/blowfish.html
00024  *  http://en.wikipedia.org/wiki/Blowfish_%28cipher%29
00025  *
00026  */
00027 
00028 #if !defined(MBEDTLS_CONFIG_FILE)
00029 #include "mbedtls/config.h"
00030 #else
00031 #include MBEDTLS_CONFIG_FILE
00032 #endif
00033 
00034 #if defined(MBEDTLS_BLOWFISH_C)
00035 
00036 #include "mbedtls/blowfish.h"
00037 #include "mbedtls/platform_util.h"
00038 
00039 #include <string.h>
00040 
00041 #if !defined(MBEDTLS_BLOWFISH_ALT)
00042 
00043 /* Parameter validation macros */
00044 #define BLOWFISH_VALIDATE_RET( cond )                                       \
00045     MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA )
00046 #define BLOWFISH_VALIDATE( cond )                                           \
00047     MBEDTLS_INTERNAL_VALIDATE( cond )
00048 
00049 /*
00050  * 32-bit integer manipulation macros (big endian)
00051  */
00052 #ifndef GET_UINT32_BE
00053 #define GET_UINT32_BE(n,b,i)                            \
00054 {                                                       \
00055     (n) = ( (uint32_t) (b)[(i)    ] << 24 )             \
00056         | ( (uint32_t) (b)[(i) + 1] << 16 )             \
00057         | ( (uint32_t) (b)[(i) + 2] <<  8 )             \
00058         | ( (uint32_t) (b)[(i) + 3]       );            \
00059 }
00060 #endif
00061 
00062 #ifndef PUT_UINT32_BE
00063 #define PUT_UINT32_BE(n,b,i)                            \
00064 {                                                       \
00065     (b)[(i)    ] = (unsigned char) ( (n) >> 24 );       \
00066     (b)[(i) + 1] = (unsigned char) ( (n) >> 16 );       \
00067     (b)[(i) + 2] = (unsigned char) ( (n) >>  8 );       \
00068     (b)[(i) + 3] = (unsigned char) ( (n)       );       \
00069 }
00070 #endif
00071 
00072 static const uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2] = {
00073         0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
00074         0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
00075         0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
00076         0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
00077         0x9216D5D9L, 0x8979FB1BL
00078 };
00079 
00080 /* declarations of data at the end of this file */
00081 static const uint32_t S[4][256];
00082 
00083 static uint32_t F( mbedtls_blowfish_context *ctx, uint32_t x )
00084 {
00085    unsigned short a, b, c, d;
00086    uint32_t  y;
00087 
00088    d = (unsigned short)(x & 0xFF);
00089    x >>= 8;
00090    c = (unsigned short)(x & 0xFF);
00091    x >>= 8;
00092    b = (unsigned short)(x & 0xFF);
00093    x >>= 8;
00094    a = (unsigned short)(x & 0xFF);
00095    y = ctx->S [0][a] + ctx->S [1][b];
00096    y = y ^ ctx->S [2][c];
00097    y = y + ctx->S [3][d];
00098 
00099    return( y );
00100 }
00101 
00102 static void blowfish_enc( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr )
00103 {
00104     uint32_t  Xl, Xr, temp;
00105     short i;
00106 
00107     Xl = *xl;
00108     Xr = *xr;
00109 
00110     for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS; ++i )
00111     {
00112         Xl = Xl ^ ctx->P [i];
00113         Xr = F( ctx, Xl ) ^ Xr;
00114 
00115         temp = Xl;
00116         Xl = Xr;
00117         Xr = temp;
00118     }
00119 
00120     temp = Xl;
00121     Xl = Xr;
00122     Xr = temp;
00123 
00124     Xr = Xr ^ ctx->P [MBEDTLS_BLOWFISH_ROUNDS];
00125     Xl = Xl ^ ctx->P [MBEDTLS_BLOWFISH_ROUNDS + 1];
00126 
00127     *xl = Xl;
00128     *xr = Xr;
00129 }
00130 
00131 static void blowfish_dec( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr )
00132 {
00133     uint32_t  Xl, Xr, temp;
00134     short i;
00135 
00136     Xl = *xl;
00137     Xr = *xr;
00138 
00139     for( i = MBEDTLS_BLOWFISH_ROUNDS + 1; i > 1; --i )
00140     {
00141         Xl = Xl ^ ctx->P [i];
00142         Xr = F( ctx, Xl ) ^ Xr;
00143 
00144         temp = Xl;
00145         Xl = Xr;
00146         Xr = temp;
00147     }
00148 
00149     temp = Xl;
00150     Xl = Xr;
00151     Xr = temp;
00152 
00153     Xr = Xr ^ ctx->P [1];
00154     Xl = Xl ^ ctx->P [0];
00155 
00156     *xl = Xl;
00157     *xr = Xr;
00158 }
00159 
00160 void mbedtls_blowfish_init( mbedtls_blowfish_context *ctx )
00161 {
00162     BLOWFISH_VALIDATE( ctx != NULL );
00163     memset( ctx, 0, sizeof( mbedtls_blowfish_context ) );
00164 }
00165 
00166 void mbedtls_blowfish_free( mbedtls_blowfish_context *ctx )
00167 {
00168     if( ctx == NULL )
00169         return;
00170 
00171     mbedtls_platform_zeroize( ctx, sizeof( mbedtls_blowfish_context ) );
00172 }
00173 
00174 /*
00175  * Blowfish key schedule
00176  */
00177 int mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx,
00178                              const unsigned char *key,
00179                              unsigned int keybits )
00180 {
00181     unsigned int i, j, k;
00182     uint32_t data, datal, datar;
00183     BLOWFISH_VALIDATE_RET( ctx != NULL );
00184     BLOWFISH_VALIDATE_RET( key != NULL );
00185 
00186     if( keybits < MBEDTLS_BLOWFISH_MIN_KEY_BITS    ||
00187         keybits > MBEDTLS_BLOWFISH_MAX_KEY_BITS    ||
00188         keybits % 8 != 0 )
00189     {
00190         return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA );
00191     }
00192 
00193     keybits >>= 3;
00194 
00195     for( i = 0; i < 4; i++ )
00196     {
00197         for( j = 0; j < 256; j++ )
00198             ctx->S [i][j] = S[i][j];
00199     }
00200 
00201     j = 0;
00202     for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; ++i )
00203     {
00204         data = 0x00000000;
00205         for( k = 0; k < 4; ++k )
00206         {
00207             data = ( data << 8 ) | key[j++];
00208             if( j >= keybits )
00209                 j = 0;
00210         }
00211         ctx->P [i] = P[i] ^ data;
00212     }
00213 
00214     datal = 0x00000000;
00215     datar = 0x00000000;
00216 
00217     for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; i += 2 )
00218     {
00219         blowfish_enc( ctx, &datal, &datar );
00220         ctx->P [i] = datal;
00221         ctx->P [i + 1] = datar;
00222     }
00223 
00224     for( i = 0; i < 4; i++ )
00225     {
00226        for( j = 0; j < 256; j += 2 )
00227        {
00228             blowfish_enc( ctx, &datal, &datar );
00229             ctx->S [i][j] = datal;
00230             ctx->S [i][j + 1] = datar;
00231         }
00232     }
00233     return( 0 );
00234 }
00235 
00236 /*
00237  * Blowfish-ECB block encryption/decryption
00238  */
00239 int mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx,
00240                     int mode,
00241                     const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE],
00242                     unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] )
00243 {
00244     uint32_t X0, X1;
00245     BLOWFISH_VALIDATE_RET( ctx != NULL );
00246     BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT ||
00247                            mode == MBEDTLS_BLOWFISH_DECRYPT );
00248     BLOWFISH_VALIDATE_RET( input  != NULL );
00249     BLOWFISH_VALIDATE_RET( output != NULL );
00250 
00251     GET_UINT32_BE( X0, input,  0 );
00252     GET_UINT32_BE( X1, input,  4 );
00253 
00254     if( mode == MBEDTLS_BLOWFISH_DECRYPT )
00255     {
00256         blowfish_dec( ctx, &X0, &X1 );
00257     }
00258     else /* MBEDTLS_BLOWFISH_ENCRYPT */
00259     {
00260         blowfish_enc( ctx, &X0, &X1 );
00261     }
00262 
00263     PUT_UINT32_BE( X0, output,  0 );
00264     PUT_UINT32_BE( X1, output,  4 );
00265 
00266     return( 0 );
00267 }
00268 
00269 #if defined(MBEDTLS_CIPHER_MODE_CBC)
00270 /*
00271  * Blowfish-CBC buffer encryption/decryption
00272  */
00273 int mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx,
00274                     int mode,
00275                     size_t length,
00276                     unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE],
00277                     const unsigned char *input,
00278                     unsigned char *output )
00279 {
00280     int i;
00281     unsigned char temp[MBEDTLS_BLOWFISH_BLOCKSIZE];
00282     BLOWFISH_VALIDATE_RET( ctx != NULL );
00283     BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT ||
00284                            mode == MBEDTLS_BLOWFISH_DECRYPT );
00285     BLOWFISH_VALIDATE_RET( iv != NULL );
00286     BLOWFISH_VALIDATE_RET( length == 0 || input  != NULL );
00287     BLOWFISH_VALIDATE_RET( length == 0 || output != NULL );
00288 
00289     if( length % MBEDTLS_BLOWFISH_BLOCKSIZE )
00290         return( MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH );
00291 
00292     if( mode == MBEDTLS_BLOWFISH_DECRYPT )
00293     {
00294         while( length > 0 )
00295         {
00296             memcpy( temp, input, MBEDTLS_BLOWFISH_BLOCKSIZE );
00297             mbedtls_blowfish_crypt_ecb( ctx, mode, input, output );
00298 
00299             for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE;i++ )
00300                 output[i] = (unsigned char)( output[i] ^ iv[i] );
00301 
00302             memcpy( iv, temp, MBEDTLS_BLOWFISH_BLOCKSIZE );
00303 
00304             input  += MBEDTLS_BLOWFISH_BLOCKSIZE;
00305             output += MBEDTLS_BLOWFISH_BLOCKSIZE;
00306             length -= MBEDTLS_BLOWFISH_BLOCKSIZE;
00307         }
00308     }
00309     else
00310     {
00311         while( length > 0 )
00312         {
00313             for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE; i++ )
00314                 output[i] = (unsigned char)( input[i] ^ iv[i] );
00315 
00316             mbedtls_blowfish_crypt_ecb( ctx, mode, output, output );
00317             memcpy( iv, output, MBEDTLS_BLOWFISH_BLOCKSIZE );
00318 
00319             input  += MBEDTLS_BLOWFISH_BLOCKSIZE;
00320             output += MBEDTLS_BLOWFISH_BLOCKSIZE;
00321             length -= MBEDTLS_BLOWFISH_BLOCKSIZE;
00322         }
00323     }
00324 
00325     return( 0 );
00326 }
00327 #endif /* MBEDTLS_CIPHER_MODE_CBC */
00328 
00329 #if defined(MBEDTLS_CIPHER_MODE_CFB)
00330 /*
00331  * Blowfish CFB buffer encryption/decryption
00332  */
00333 int mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx,
00334                        int mode,
00335                        size_t length,
00336                        size_t *iv_off,
00337                        unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE],
00338                        const unsigned char *input,
00339                        unsigned char *output )
00340 {
00341     int c;
00342     size_t n;
00343 
00344     BLOWFISH_VALIDATE_RET( ctx != NULL );
00345     BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT ||
00346                            mode == MBEDTLS_BLOWFISH_DECRYPT );
00347     BLOWFISH_VALIDATE_RET( iv     != NULL );
00348     BLOWFISH_VALIDATE_RET( iv_off != NULL );
00349     BLOWFISH_VALIDATE_RET( length == 0 || input  != NULL );
00350     BLOWFISH_VALIDATE_RET( length == 0 || output != NULL );
00351 
00352     n = *iv_off;
00353     if( n >= 8 )
00354         return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA );
00355 
00356     if( mode == MBEDTLS_BLOWFISH_DECRYPT )
00357     {
00358         while( length-- )
00359         {
00360             if( n == 0 )
00361                 mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv );
00362 
00363             c = *input++;
00364             *output++ = (unsigned char)( c ^ iv[n] );
00365             iv[n] = (unsigned char) c;
00366 
00367             n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;
00368         }
00369     }
00370     else
00371     {
00372         while( length-- )
00373         {
00374             if( n == 0 )
00375                 mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv );
00376 
00377             iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
00378 
00379             n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;
00380         }
00381     }
00382 
00383     *iv_off = n;
00384 
00385     return( 0 );
00386 }
00387 #endif /*MBEDTLS_CIPHER_MODE_CFB */
00388 
00389 #if defined(MBEDTLS_CIPHER_MODE_CTR)
00390 /*
00391  * Blowfish CTR buffer encryption/decryption
00392  */
00393 int mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx,
00394                        size_t length,
00395                        size_t *nc_off,
00396                        unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE],
00397                        unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE],
00398                        const unsigned char *input,
00399                        unsigned char *output )
00400 {
00401     int c, i;
00402     size_t n;
00403     BLOWFISH_VALIDATE_RET( ctx != NULL );
00404     BLOWFISH_VALIDATE_RET( nonce_counter != NULL );
00405     BLOWFISH_VALIDATE_RET( stream_block  != NULL );
00406     BLOWFISH_VALIDATE_RET( nc_off != NULL );
00407     BLOWFISH_VALIDATE_RET( length == 0 || input  != NULL );
00408     BLOWFISH_VALIDATE_RET( length == 0 || output != NULL );
00409 
00410     n = *nc_off;
00411     if( n >= 8 )
00412         return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA );
00413 
00414     while( length-- )
00415     {
00416         if( n == 0 ) {
00417             mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, nonce_counter,
00418                                 stream_block );
00419 
00420             for( i = MBEDTLS_BLOWFISH_BLOCKSIZE; i > 0; i-- )
00421                 if( ++nonce_counter[i - 1] != 0 )
00422                     break;
00423         }
00424         c = *input++;
00425         *output++ = (unsigned char)( c ^ stream_block[n] );
00426 
00427         n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;
00428     }
00429 
00430     *nc_off = n;
00431 
00432     return( 0 );
00433 }
00434 #endif /* MBEDTLS_CIPHER_MODE_CTR */
00435 
00436 static const uint32_t S[4][256] = {
00437     {   0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
00438         0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
00439         0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
00440         0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
00441         0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
00442         0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
00443         0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
00444         0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
00445         0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
00446         0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
00447         0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
00448         0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
00449         0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
00450         0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
00451         0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
00452         0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
00453         0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
00454         0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
00455         0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
00456         0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
00457         0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
00458         0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
00459         0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
00460         0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
00461         0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
00462         0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
00463         0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
00464         0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
00465         0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
00466         0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
00467         0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
00468         0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
00469         0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
00470         0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
00471         0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
00472         0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
00473         0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
00474         0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
00475         0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
00476         0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
00477         0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
00478         0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
00479         0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
00480         0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
00481         0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
00482         0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
00483         0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
00484         0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
00485         0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
00486         0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
00487         0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
00488         0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
00489         0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
00490         0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
00491         0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
00492         0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
00493         0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
00494         0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
00495         0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
00496         0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
00497         0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
00498         0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
00499         0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
00500         0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL   },
00501     {   0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
00502         0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
00503         0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
00504         0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
00505         0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
00506         0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
00507         0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
00508         0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
00509         0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
00510         0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
00511         0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
00512         0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
00513         0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
00514         0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
00515         0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
00516         0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
00517         0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
00518         0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
00519         0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
00520         0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
00521         0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
00522         0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
00523         0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
00524         0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
00525         0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
00526         0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
00527         0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
00528         0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
00529         0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
00530         0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
00531         0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
00532         0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
00533         0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
00534         0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
00535         0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
00536         0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
00537         0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
00538         0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
00539         0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
00540         0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
00541         0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
00542         0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
00543         0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
00544         0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
00545         0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
00546         0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
00547         0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
00548         0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
00549         0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
00550         0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
00551         0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
00552         0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
00553         0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
00554         0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
00555         0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
00556         0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
00557         0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
00558         0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
00559         0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
00560         0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
00561         0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
00562         0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
00563         0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
00564         0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L   },
00565     {   0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
00566         0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
00567         0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
00568         0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
00569         0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
00570         0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
00571         0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
00572         0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
00573         0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
00574         0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
00575         0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
00576         0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
00577         0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
00578         0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
00579         0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
00580         0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
00581         0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
00582         0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
00583         0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
00584         0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
00585         0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
00586         0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
00587         0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
00588         0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
00589         0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
00590         0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
00591         0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
00592         0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
00593         0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
00594         0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
00595         0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
00596         0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
00597         0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
00598         0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
00599         0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
00600         0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
00601         0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
00602         0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
00603         0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
00604         0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
00605         0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
00606         0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
00607         0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
00608         0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
00609         0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
00610         0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
00611         0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
00612         0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
00613         0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
00614         0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
00615         0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
00616         0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
00617         0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
00618         0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
00619         0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
00620         0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
00621         0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
00622         0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
00623         0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
00624         0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
00625         0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
00626         0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
00627         0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
00628         0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L  },
00629     {   0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
00630         0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
00631         0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
00632         0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
00633         0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
00634         0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
00635         0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
00636         0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
00637         0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
00638         0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
00639         0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
00640         0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
00641         0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
00642         0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
00643         0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
00644         0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
00645         0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
00646         0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
00647         0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
00648         0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
00649         0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
00650         0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
00651         0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
00652         0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
00653         0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
00654         0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
00655         0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
00656         0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
00657         0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
00658         0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
00659         0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
00660         0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
00661         0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
00662         0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
00663         0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
00664         0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
00665         0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
00666         0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
00667         0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
00668         0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
00669         0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
00670         0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
00671         0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
00672         0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
00673         0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
00674         0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
00675         0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
00676         0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
00677         0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
00678         0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
00679         0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
00680         0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
00681         0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
00682         0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
00683         0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
00684         0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
00685         0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
00686         0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
00687         0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
00688         0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
00689         0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
00690         0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
00691         0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
00692         0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L  }
00693 };
00694 
00695 #endif /* !MBEDTLS_BLOWFISH_ALT */
00696 #endif /* MBEDTLS_BLOWFISH_C */