mbedtls ported to mbed-classic

Fork of mbedtls by Christopher Haster

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