mbed TLS library

Dependents:   HTTPClient-SSL WS_SERVER

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