blob: 7c9b1a65a530a880bf68478893f52c057c243dfc [file] [log] [blame]
Paul Bakkera9379c02012-07-04 11:02:11 +00001/*
2 * Blowfish implementation
3 *
Manuel Pégourié-Gonnard6fb81872015-07-27 11:11:48 +02004 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02005 * SPDX-License-Identifier: Apache-2.0
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License"); you may
8 * not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
15 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
Paul Bakkera9379c02012-07-04 11:02:11 +000018 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000019 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakkera9379c02012-07-04 11:02:11 +000020 */
21/*
22 * The Blowfish block cipher was designed by Bruce Schneier in 1993.
23 * http://www.schneier.com/blowfish.html
24 * http://en.wikipedia.org/wiki/Blowfish_%28cipher%29
25 *
26 */
27
Gilles Peskinedb09ef62020-06-03 01:43:33 +020028#include "common.h"
Paul Bakkera9379c02012-07-04 11:02:11 +000029
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020030#if defined(MBEDTLS_BLOWFISH_C)
Paul Bakkera9379c02012-07-04 11:02:11 +000031
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000032#include "mbedtls/blowfish.h"
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -050033#include "mbedtls/platform_util.h"
Paul Bakkera9379c02012-07-04 11:02:11 +000034
Rich Evans00ab4702015-02-06 13:43:58 +000035#include <string.h>
36
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020037#if !defined(MBEDTLS_BLOWFISH_ALT)
Paul Bakker90995b52013-06-24 19:20:35 +020038
Andrzej Kurekc470b6b2019-01-31 08:20:20 -050039/* Parameter validation macros */
40#define BLOWFISH_VALIDATE_RET( cond ) \
41 MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA )
42#define BLOWFISH_VALIDATE( cond ) \
43 MBEDTLS_INTERNAL_VALIDATE( cond )
44
Paul Bakkera9379c02012-07-04 11:02:11 +000045/*
46 * 32-bit integer manipulation macros (big endian)
47 */
Paul Bakker5c2364c2012-10-01 14:41:15 +000048#ifndef GET_UINT32_BE
49#define GET_UINT32_BE(n,b,i) \
Paul Bakkera9379c02012-07-04 11:02:11 +000050{ \
Paul Bakker5c2364c2012-10-01 14:41:15 +000051 (n) = ( (uint32_t) (b)[(i) ] << 24 ) \
52 | ( (uint32_t) (b)[(i) + 1] << 16 ) \
53 | ( (uint32_t) (b)[(i) + 2] << 8 ) \
54 | ( (uint32_t) (b)[(i) + 3] ); \
Paul Bakkera9379c02012-07-04 11:02:11 +000055}
56#endif
57
Paul Bakker5c2364c2012-10-01 14:41:15 +000058#ifndef PUT_UINT32_BE
59#define PUT_UINT32_BE(n,b,i) \
Paul Bakkera9379c02012-07-04 11:02:11 +000060{ \
61 (b)[(i) ] = (unsigned char) ( (n) >> 24 ); \
62 (b)[(i) + 1] = (unsigned char) ( (n) >> 16 ); \
63 (b)[(i) + 2] = (unsigned char) ( (n) >> 8 ); \
64 (b)[(i) + 3] = (unsigned char) ( (n) ); \
65}
66#endif
67
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020068static const uint32_t P[MBEDTLS_BLOWFISH_ROUNDS + 2] = {
Paul Bakkerd6f17b42012-10-01 20:58:19 +000069 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L,
70 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L,
71 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL,
72 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L,
73 0x9216D5D9L, 0x8979FB1BL
74};
75
Paul Bakkera9379c02012-07-04 11:02:11 +000076/* declarations of data at the end of this file */
Paul Bakker5c2364c2012-10-01 14:41:15 +000077static const uint32_t S[4][256];
Paul Bakkera9379c02012-07-04 11:02:11 +000078
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020079static uint32_t F( mbedtls_blowfish_context *ctx, uint32_t x )
Paul Bakkera9379c02012-07-04 11:02:11 +000080{
81 unsigned short a, b, c, d;
Paul Bakker5c2364c2012-10-01 14:41:15 +000082 uint32_t y;
Paul Bakkera9379c02012-07-04 11:02:11 +000083
84 d = (unsigned short)(x & 0xFF);
85 x >>= 8;
86 c = (unsigned short)(x & 0xFF);
87 x >>= 8;
88 b = (unsigned short)(x & 0xFF);
89 x >>= 8;
90 a = (unsigned short)(x & 0xFF);
91 y = ctx->S[0][a] + ctx->S[1][b];
92 y = y ^ ctx->S[2][c];
93 y = y + ctx->S[3][d];
94
Paul Bakkerd8bb8262014-06-17 14:06:49 +020095 return( y );
Paul Bakkera9379c02012-07-04 11:02:11 +000096}
97
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020098static void blowfish_enc( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr )
Paul Bakkera9379c02012-07-04 11:02:11 +000099{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000100 uint32_t Xl, Xr, temp;
Paul Bakkera9379c02012-07-04 11:02:11 +0000101 short i;
102
103 Xl = *xl;
104 Xr = *xr;
105
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200106 for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS; ++i )
Paul Bakkera9379c02012-07-04 11:02:11 +0000107 {
108 Xl = Xl ^ ctx->P[i];
Paul Bakker66d5d072014-06-17 16:39:18 +0200109 Xr = F( ctx, Xl ) ^ Xr;
Paul Bakkera9379c02012-07-04 11:02:11 +0000110
111 temp = Xl;
112 Xl = Xr;
113 Xr = temp;
114 }
115
116 temp = Xl;
117 Xl = Xr;
118 Xr = temp;
119
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200120 Xr = Xr ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS];
121 Xl = Xl ^ ctx->P[MBEDTLS_BLOWFISH_ROUNDS + 1];
Paul Bakkera9379c02012-07-04 11:02:11 +0000122
123 *xl = Xl;
124 *xr = Xr;
125}
126
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200127static void blowfish_dec( mbedtls_blowfish_context *ctx, uint32_t *xl, uint32_t *xr )
Paul Bakkera9379c02012-07-04 11:02:11 +0000128{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000129 uint32_t Xl, Xr, temp;
Paul Bakkera9379c02012-07-04 11:02:11 +0000130 short i;
131
132 Xl = *xl;
133 Xr = *xr;
134
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200135 for( i = MBEDTLS_BLOWFISH_ROUNDS + 1; i > 1; --i )
Paul Bakkera9379c02012-07-04 11:02:11 +0000136 {
137 Xl = Xl ^ ctx->P[i];
Paul Bakker66d5d072014-06-17 16:39:18 +0200138 Xr = F( ctx, Xl ) ^ Xr;
Paul Bakkera9379c02012-07-04 11:02:11 +0000139
140 temp = Xl;
141 Xl = Xr;
142 Xr = temp;
143 }
144
145 temp = Xl;
146 Xl = Xr;
147 Xr = temp;
148
149 Xr = Xr ^ ctx->P[1];
150 Xl = Xl ^ ctx->P[0];
151
152 *xl = Xl;
153 *xr = Xr;
154}
155
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200156void mbedtls_blowfish_init( mbedtls_blowfish_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200157{
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500158 BLOWFISH_VALIDATE( ctx != NULL );
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200159 memset( ctx, 0, sizeof( mbedtls_blowfish_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200160}
161
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200162void mbedtls_blowfish_free( mbedtls_blowfish_context *ctx )
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200163{
164 if( ctx == NULL )
165 return;
166
Andres Amaya Garcia1f6301b2018-04-17 09:51:09 -0500167 mbedtls_platform_zeroize( ctx, sizeof( mbedtls_blowfish_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200168}
169
Paul Bakkera9379c02012-07-04 11:02:11 +0000170/*
171 * Blowfish key schedule
172 */
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500173int mbedtls_blowfish_setkey( mbedtls_blowfish_context *ctx,
174 const unsigned char *key,
175 unsigned int keybits )
Paul Bakkera9379c02012-07-04 11:02:11 +0000176{
177 unsigned int i, j, k;
Paul Bakker5c2364c2012-10-01 14:41:15 +0000178 uint32_t data, datal, datar;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500179 BLOWFISH_VALIDATE_RET( ctx != NULL );
180 BLOWFISH_VALIDATE_RET( key != NULL );
Paul Bakkera9379c02012-07-04 11:02:11 +0000181
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500182 if( keybits < MBEDTLS_BLOWFISH_MIN_KEY_BITS ||
183 keybits > MBEDTLS_BLOWFISH_MAX_KEY_BITS ||
184 keybits % 8 != 0 )
Paul Bakkera9379c02012-07-04 11:02:11 +0000185 {
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500186 return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA );
Paul Bakkera9379c02012-07-04 11:02:11 +0000187 }
188
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200189 keybits >>= 3;
Paul Bakkera9379c02012-07-04 11:02:11 +0000190
Paul Bakker9af723c2014-05-01 13:03:14 +0200191 for( i = 0; i < 4; i++ )
Paul Bakkera9379c02012-07-04 11:02:11 +0000192 {
193 for( j = 0; j < 256; j++ )
194 ctx->S[i][j] = S[i][j];
195 }
196
197 j = 0;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200198 for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; ++i )
Paul Bakkera9379c02012-07-04 11:02:11 +0000199 {
200 data = 0x00000000;
201 for( k = 0; k < 4; ++k )
202 {
203 data = ( data << 8 ) | key[j++];
Manuel Pégourié-Gonnardb8186a52015-06-18 14:58:58 +0200204 if( j >= keybits )
Paul Bakkera9379c02012-07-04 11:02:11 +0000205 j = 0;
206 }
207 ctx->P[i] = P[i] ^ data;
208 }
209
210 datal = 0x00000000;
211 datar = 0x00000000;
212
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200213 for( i = 0; i < MBEDTLS_BLOWFISH_ROUNDS + 2; i += 2 )
Paul Bakkera9379c02012-07-04 11:02:11 +0000214 {
215 blowfish_enc( ctx, &datal, &datar );
216 ctx->P[i] = datal;
217 ctx->P[i + 1] = datar;
218 }
219
220 for( i = 0; i < 4; i++ )
221 {
222 for( j = 0; j < 256; j += 2 )
223 {
224 blowfish_enc( ctx, &datal, &datar );
225 ctx->S[i][j] = datal;
226 ctx->S[i][j + 1] = datar;
227 }
228 }
229 return( 0 );
230}
231
232/*
233 * Blowfish-ECB block encryption/decryption
234 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200235int mbedtls_blowfish_crypt_ecb( mbedtls_blowfish_context *ctx,
Paul Bakkera9379c02012-07-04 11:02:11 +0000236 int mode,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200237 const unsigned char input[MBEDTLS_BLOWFISH_BLOCKSIZE],
238 unsigned char output[MBEDTLS_BLOWFISH_BLOCKSIZE] )
Paul Bakkera9379c02012-07-04 11:02:11 +0000239{
Paul Bakker5c2364c2012-10-01 14:41:15 +0000240 uint32_t X0, X1;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500241 BLOWFISH_VALIDATE_RET( ctx != NULL );
242 BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT ||
243 mode == MBEDTLS_BLOWFISH_DECRYPT );
244 BLOWFISH_VALIDATE_RET( input != NULL );
245 BLOWFISH_VALIDATE_RET( output != NULL );
Paul Bakkera9379c02012-07-04 11:02:11 +0000246
Paul Bakker9af723c2014-05-01 13:03:14 +0200247 GET_UINT32_BE( X0, input, 0 );
248 GET_UINT32_BE( X1, input, 4 );
Paul Bakkera9379c02012-07-04 11:02:11 +0000249
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200250 if( mode == MBEDTLS_BLOWFISH_DECRYPT )
Paul Bakkera9379c02012-07-04 11:02:11 +0000251 {
Paul Bakker66d5d072014-06-17 16:39:18 +0200252 blowfish_dec( ctx, &X0, &X1 );
Paul Bakkera9379c02012-07-04 11:02:11 +0000253 }
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200254 else /* MBEDTLS_BLOWFISH_ENCRYPT */
Paul Bakkera9379c02012-07-04 11:02:11 +0000255 {
Paul Bakker66d5d072014-06-17 16:39:18 +0200256 blowfish_enc( ctx, &X0, &X1 );
Paul Bakkera9379c02012-07-04 11:02:11 +0000257 }
258
Paul Bakker5c2364c2012-10-01 14:41:15 +0000259 PUT_UINT32_BE( X0, output, 0 );
260 PUT_UINT32_BE( X1, output, 4 );
Paul Bakkera9379c02012-07-04 11:02:11 +0000261
262 return( 0 );
263}
264
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200265#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkera9379c02012-07-04 11:02:11 +0000266/*
267 * Blowfish-CBC buffer encryption/decryption
268 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269int mbedtls_blowfish_crypt_cbc( mbedtls_blowfish_context *ctx,
Paul Bakkera9379c02012-07-04 11:02:11 +0000270 int mode,
271 size_t length,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200272 unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE],
Paul Bakkera9379c02012-07-04 11:02:11 +0000273 const unsigned char *input,
274 unsigned char *output )
275{
276 int i;
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200277 unsigned char temp[MBEDTLS_BLOWFISH_BLOCKSIZE];
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500278 BLOWFISH_VALIDATE_RET( ctx != NULL );
279 BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT ||
280 mode == MBEDTLS_BLOWFISH_DECRYPT );
281 BLOWFISH_VALIDATE_RET( iv != NULL );
282 BLOWFISH_VALIDATE_RET( length == 0 || input != NULL );
283 BLOWFISH_VALIDATE_RET( length == 0 || output != NULL );
Paul Bakkera9379c02012-07-04 11:02:11 +0000284
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200285 if( length % MBEDTLS_BLOWFISH_BLOCKSIZE )
286 return( MBEDTLS_ERR_BLOWFISH_INVALID_INPUT_LENGTH );
Paul Bakkera9379c02012-07-04 11:02:11 +0000287
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200288 if( mode == MBEDTLS_BLOWFISH_DECRYPT )
Paul Bakkera9379c02012-07-04 11:02:11 +0000289 {
290 while( length > 0 )
291 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200292 memcpy( temp, input, MBEDTLS_BLOWFISH_BLOCKSIZE );
293 mbedtls_blowfish_crypt_ecb( ctx, mode, input, output );
Paul Bakkera9379c02012-07-04 11:02:11 +0000294
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200295 for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE;i++ )
Paul Bakkera9379c02012-07-04 11:02:11 +0000296 output[i] = (unsigned char)( output[i] ^ iv[i] );
297
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200298 memcpy( iv, temp, MBEDTLS_BLOWFISH_BLOCKSIZE );
Paul Bakkera9379c02012-07-04 11:02:11 +0000299
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200300 input += MBEDTLS_BLOWFISH_BLOCKSIZE;
301 output += MBEDTLS_BLOWFISH_BLOCKSIZE;
302 length -= MBEDTLS_BLOWFISH_BLOCKSIZE;
Paul Bakkera9379c02012-07-04 11:02:11 +0000303 }
304 }
305 else
306 {
307 while( length > 0 )
308 {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309 for( i = 0; i < MBEDTLS_BLOWFISH_BLOCKSIZE; i++ )
Paul Bakkera9379c02012-07-04 11:02:11 +0000310 output[i] = (unsigned char)( input[i] ^ iv[i] );
311
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200312 mbedtls_blowfish_crypt_ecb( ctx, mode, output, output );
313 memcpy( iv, output, MBEDTLS_BLOWFISH_BLOCKSIZE );
Paul Bakkera9379c02012-07-04 11:02:11 +0000314
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200315 input += MBEDTLS_BLOWFISH_BLOCKSIZE;
316 output += MBEDTLS_BLOWFISH_BLOCKSIZE;
317 length -= MBEDTLS_BLOWFISH_BLOCKSIZE;
Paul Bakkera9379c02012-07-04 11:02:11 +0000318 }
319 }
320
321 return( 0 );
322}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200323#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakkera9379c02012-07-04 11:02:11 +0000324
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200325#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakkera9379c02012-07-04 11:02:11 +0000326/*
327 * Blowfish CFB buffer encryption/decryption
328 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329int mbedtls_blowfish_crypt_cfb64( mbedtls_blowfish_context *ctx,
Paul Bakkera9379c02012-07-04 11:02:11 +0000330 int mode,
331 size_t length,
332 size_t *iv_off,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200333 unsigned char iv[MBEDTLS_BLOWFISH_BLOCKSIZE],
Paul Bakkera9379c02012-07-04 11:02:11 +0000334 const unsigned char *input,
335 unsigned char *output )
336{
337 int c;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500338 size_t n;
339
340 BLOWFISH_VALIDATE_RET( ctx != NULL );
341 BLOWFISH_VALIDATE_RET( mode == MBEDTLS_BLOWFISH_ENCRYPT ||
342 mode == MBEDTLS_BLOWFISH_DECRYPT );
343 BLOWFISH_VALIDATE_RET( iv != NULL );
344 BLOWFISH_VALIDATE_RET( iv_off != NULL );
345 BLOWFISH_VALIDATE_RET( length == 0 || input != NULL );
346 BLOWFISH_VALIDATE_RET( length == 0 || output != NULL );
347
348 n = *iv_off;
349 if( n >= 8 )
350 return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA );
Paul Bakkera9379c02012-07-04 11:02:11 +0000351
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200352 if( mode == MBEDTLS_BLOWFISH_DECRYPT )
Paul Bakkera9379c02012-07-04 11:02:11 +0000353 {
354 while( length-- )
355 {
356 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200357 mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv );
Paul Bakkera9379c02012-07-04 11:02:11 +0000358
359 c = *input++;
360 *output++ = (unsigned char)( c ^ iv[n] );
361 iv[n] = (unsigned char) c;
362
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200363 n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;
Paul Bakkera9379c02012-07-04 11:02:11 +0000364 }
365 }
366 else
367 {
368 while( length-- )
369 {
370 if( n == 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200371 mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, iv, iv );
Paul Bakkera9379c02012-07-04 11:02:11 +0000372
373 iv[n] = *output++ = (unsigned char)( iv[n] ^ *input++ );
374
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;
Paul Bakkera9379c02012-07-04 11:02:11 +0000376 }
377 }
378
379 *iv_off = n;
380
381 return( 0 );
382}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200383#endif /*MBEDTLS_CIPHER_MODE_CFB */
Paul Bakkera9379c02012-07-04 11:02:11 +0000384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200385#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkera9379c02012-07-04 11:02:11 +0000386/*
387 * Blowfish CTR buffer encryption/decryption
388 */
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200389int mbedtls_blowfish_crypt_ctr( mbedtls_blowfish_context *ctx,
Paul Bakkera9379c02012-07-04 11:02:11 +0000390 size_t length,
391 size_t *nc_off,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200392 unsigned char nonce_counter[MBEDTLS_BLOWFISH_BLOCKSIZE],
393 unsigned char stream_block[MBEDTLS_BLOWFISH_BLOCKSIZE],
Paul Bakkera9379c02012-07-04 11:02:11 +0000394 const unsigned char *input,
395 unsigned char *output )
396{
397 int c, i;
Andrzej Kurekc470b6b2019-01-31 08:20:20 -0500398 size_t n;
399 BLOWFISH_VALIDATE_RET( ctx != NULL );
400 BLOWFISH_VALIDATE_RET( nonce_counter != NULL );
401 BLOWFISH_VALIDATE_RET( stream_block != NULL );
402 BLOWFISH_VALIDATE_RET( nc_off != NULL );
403 BLOWFISH_VALIDATE_RET( length == 0 || input != NULL );
404 BLOWFISH_VALIDATE_RET( length == 0 || output != NULL );
405
406 n = *nc_off;
407 if( n >= 8 )
408 return( MBEDTLS_ERR_BLOWFISH_BAD_INPUT_DATA );
Paul Bakkera9379c02012-07-04 11:02:11 +0000409
410 while( length-- )
411 {
412 if( n == 0 ) {
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200413 mbedtls_blowfish_crypt_ecb( ctx, MBEDTLS_BLOWFISH_ENCRYPT, nonce_counter,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200414 stream_block );
Paul Bakkera9379c02012-07-04 11:02:11 +0000415
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200416 for( i = MBEDTLS_BLOWFISH_BLOCKSIZE; i > 0; i-- )
Paul Bakkera9379c02012-07-04 11:02:11 +0000417 if( ++nonce_counter[i - 1] != 0 )
418 break;
419 }
420 c = *input++;
421 *output++ = (unsigned char)( c ^ stream_block[n] );
422
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200423 n = ( n + 1 ) % MBEDTLS_BLOWFISH_BLOCKSIZE;
Paul Bakkera9379c02012-07-04 11:02:11 +0000424 }
425
426 *nc_off = n;
427
428 return( 0 );
429}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200430#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakkera9379c02012-07-04 11:02:11 +0000431
Paul Bakker5c2364c2012-10-01 14:41:15 +0000432static const uint32_t S[4][256] = {
Paul Bakkera9379c02012-07-04 11:02:11 +0000433 { 0xD1310BA6L, 0x98DFB5ACL, 0x2FFD72DBL, 0xD01ADFB7L,
434 0xB8E1AFEDL, 0x6A267E96L, 0xBA7C9045L, 0xF12C7F99L,
435 0x24A19947L, 0xB3916CF7L, 0x0801F2E2L, 0x858EFC16L,
436 0x636920D8L, 0x71574E69L, 0xA458FEA3L, 0xF4933D7EL,
437 0x0D95748FL, 0x728EB658L, 0x718BCD58L, 0x82154AEEL,
438 0x7B54A41DL, 0xC25A59B5L, 0x9C30D539L, 0x2AF26013L,
439 0xC5D1B023L, 0x286085F0L, 0xCA417918L, 0xB8DB38EFL,
440 0x8E79DCB0L, 0x603A180EL, 0x6C9E0E8BL, 0xB01E8A3EL,
441 0xD71577C1L, 0xBD314B27L, 0x78AF2FDAL, 0x55605C60L,
442 0xE65525F3L, 0xAA55AB94L, 0x57489862L, 0x63E81440L,
443 0x55CA396AL, 0x2AAB10B6L, 0xB4CC5C34L, 0x1141E8CEL,
444 0xA15486AFL, 0x7C72E993L, 0xB3EE1411L, 0x636FBC2AL,
445 0x2BA9C55DL, 0x741831F6L, 0xCE5C3E16L, 0x9B87931EL,
446 0xAFD6BA33L, 0x6C24CF5CL, 0x7A325381L, 0x28958677L,
447 0x3B8F4898L, 0x6B4BB9AFL, 0xC4BFE81BL, 0x66282193L,
448 0x61D809CCL, 0xFB21A991L, 0x487CAC60L, 0x5DEC8032L,
449 0xEF845D5DL, 0xE98575B1L, 0xDC262302L, 0xEB651B88L,
450 0x23893E81L, 0xD396ACC5L, 0x0F6D6FF3L, 0x83F44239L,
451 0x2E0B4482L, 0xA4842004L, 0x69C8F04AL, 0x9E1F9B5EL,
452 0x21C66842L, 0xF6E96C9AL, 0x670C9C61L, 0xABD388F0L,
453 0x6A51A0D2L, 0xD8542F68L, 0x960FA728L, 0xAB5133A3L,
454 0x6EEF0B6CL, 0x137A3BE4L, 0xBA3BF050L, 0x7EFB2A98L,
455 0xA1F1651DL, 0x39AF0176L, 0x66CA593EL, 0x82430E88L,
456 0x8CEE8619L, 0x456F9FB4L, 0x7D84A5C3L, 0x3B8B5EBEL,
457 0xE06F75D8L, 0x85C12073L, 0x401A449FL, 0x56C16AA6L,
458 0x4ED3AA62L, 0x363F7706L, 0x1BFEDF72L, 0x429B023DL,
459 0x37D0D724L, 0xD00A1248L, 0xDB0FEAD3L, 0x49F1C09BL,
460 0x075372C9L, 0x80991B7BL, 0x25D479D8L, 0xF6E8DEF7L,
461 0xE3FE501AL, 0xB6794C3BL, 0x976CE0BDL, 0x04C006BAL,
462 0xC1A94FB6L, 0x409F60C4L, 0x5E5C9EC2L, 0x196A2463L,
463 0x68FB6FAFL, 0x3E6C53B5L, 0x1339B2EBL, 0x3B52EC6FL,
464 0x6DFC511FL, 0x9B30952CL, 0xCC814544L, 0xAF5EBD09L,
465 0xBEE3D004L, 0xDE334AFDL, 0x660F2807L, 0x192E4BB3L,
466 0xC0CBA857L, 0x45C8740FL, 0xD20B5F39L, 0xB9D3FBDBL,
467 0x5579C0BDL, 0x1A60320AL, 0xD6A100C6L, 0x402C7279L,
468 0x679F25FEL, 0xFB1FA3CCL, 0x8EA5E9F8L, 0xDB3222F8L,
469 0x3C7516DFL, 0xFD616B15L, 0x2F501EC8L, 0xAD0552ABL,
470 0x323DB5FAL, 0xFD238760L, 0x53317B48L, 0x3E00DF82L,
471 0x9E5C57BBL, 0xCA6F8CA0L, 0x1A87562EL, 0xDF1769DBL,
472 0xD542A8F6L, 0x287EFFC3L, 0xAC6732C6L, 0x8C4F5573L,
473 0x695B27B0L, 0xBBCA58C8L, 0xE1FFA35DL, 0xB8F011A0L,
474 0x10FA3D98L, 0xFD2183B8L, 0x4AFCB56CL, 0x2DD1D35BL,
475 0x9A53E479L, 0xB6F84565L, 0xD28E49BCL, 0x4BFB9790L,
476 0xE1DDF2DAL, 0xA4CB7E33L, 0x62FB1341L, 0xCEE4C6E8L,
477 0xEF20CADAL, 0x36774C01L, 0xD07E9EFEL, 0x2BF11FB4L,
478 0x95DBDA4DL, 0xAE909198L, 0xEAAD8E71L, 0x6B93D5A0L,
479 0xD08ED1D0L, 0xAFC725E0L, 0x8E3C5B2FL, 0x8E7594B7L,
480 0x8FF6E2FBL, 0xF2122B64L, 0x8888B812L, 0x900DF01CL,
481 0x4FAD5EA0L, 0x688FC31CL, 0xD1CFF191L, 0xB3A8C1ADL,
482 0x2F2F2218L, 0xBE0E1777L, 0xEA752DFEL, 0x8B021FA1L,
483 0xE5A0CC0FL, 0xB56F74E8L, 0x18ACF3D6L, 0xCE89E299L,
484 0xB4A84FE0L, 0xFD13E0B7L, 0x7CC43B81L, 0xD2ADA8D9L,
485 0x165FA266L, 0x80957705L, 0x93CC7314L, 0x211A1477L,
486 0xE6AD2065L, 0x77B5FA86L, 0xC75442F5L, 0xFB9D35CFL,
487 0xEBCDAF0CL, 0x7B3E89A0L, 0xD6411BD3L, 0xAE1E7E49L,
488 0x00250E2DL, 0x2071B35EL, 0x226800BBL, 0x57B8E0AFL,
489 0x2464369BL, 0xF009B91EL, 0x5563911DL, 0x59DFA6AAL,
490 0x78C14389L, 0xD95A537FL, 0x207D5BA2L, 0x02E5B9C5L,
491 0x83260376L, 0x6295CFA9L, 0x11C81968L, 0x4E734A41L,
492 0xB3472DCAL, 0x7B14A94AL, 0x1B510052L, 0x9A532915L,
493 0xD60F573FL, 0xBC9BC6E4L, 0x2B60A476L, 0x81E67400L,
494 0x08BA6FB5L, 0x571BE91FL, 0xF296EC6BL, 0x2A0DD915L,
495 0xB6636521L, 0xE7B9F9B6L, 0xFF34052EL, 0xC5855664L,
496 0x53B02D5DL, 0xA99F8FA1L, 0x08BA4799L, 0x6E85076AL },
497 { 0x4B7A70E9L, 0xB5B32944L, 0xDB75092EL, 0xC4192623L,
498 0xAD6EA6B0L, 0x49A7DF7DL, 0x9CEE60B8L, 0x8FEDB266L,
499 0xECAA8C71L, 0x699A17FFL, 0x5664526CL, 0xC2B19EE1L,
500 0x193602A5L, 0x75094C29L, 0xA0591340L, 0xE4183A3EL,
501 0x3F54989AL, 0x5B429D65L, 0x6B8FE4D6L, 0x99F73FD6L,
502 0xA1D29C07L, 0xEFE830F5L, 0x4D2D38E6L, 0xF0255DC1L,
503 0x4CDD2086L, 0x8470EB26L, 0x6382E9C6L, 0x021ECC5EL,
504 0x09686B3FL, 0x3EBAEFC9L, 0x3C971814L, 0x6B6A70A1L,
505 0x687F3584L, 0x52A0E286L, 0xB79C5305L, 0xAA500737L,
506 0x3E07841CL, 0x7FDEAE5CL, 0x8E7D44ECL, 0x5716F2B8L,
507 0xB03ADA37L, 0xF0500C0DL, 0xF01C1F04L, 0x0200B3FFL,
508 0xAE0CF51AL, 0x3CB574B2L, 0x25837A58L, 0xDC0921BDL,
509 0xD19113F9L, 0x7CA92FF6L, 0x94324773L, 0x22F54701L,
510 0x3AE5E581L, 0x37C2DADCL, 0xC8B57634L, 0x9AF3DDA7L,
511 0xA9446146L, 0x0FD0030EL, 0xECC8C73EL, 0xA4751E41L,
512 0xE238CD99L, 0x3BEA0E2FL, 0x3280BBA1L, 0x183EB331L,
513 0x4E548B38L, 0x4F6DB908L, 0x6F420D03L, 0xF60A04BFL,
514 0x2CB81290L, 0x24977C79L, 0x5679B072L, 0xBCAF89AFL,
515 0xDE9A771FL, 0xD9930810L, 0xB38BAE12L, 0xDCCF3F2EL,
516 0x5512721FL, 0x2E6B7124L, 0x501ADDE6L, 0x9F84CD87L,
517 0x7A584718L, 0x7408DA17L, 0xBC9F9ABCL, 0xE94B7D8CL,
518 0xEC7AEC3AL, 0xDB851DFAL, 0x63094366L, 0xC464C3D2L,
519 0xEF1C1847L, 0x3215D908L, 0xDD433B37L, 0x24C2BA16L,
520 0x12A14D43L, 0x2A65C451L, 0x50940002L, 0x133AE4DDL,
521 0x71DFF89EL, 0x10314E55L, 0x81AC77D6L, 0x5F11199BL,
522 0x043556F1L, 0xD7A3C76BL, 0x3C11183BL, 0x5924A509L,
523 0xF28FE6EDL, 0x97F1FBFAL, 0x9EBABF2CL, 0x1E153C6EL,
524 0x86E34570L, 0xEAE96FB1L, 0x860E5E0AL, 0x5A3E2AB3L,
525 0x771FE71CL, 0x4E3D06FAL, 0x2965DCB9L, 0x99E71D0FL,
526 0x803E89D6L, 0x5266C825L, 0x2E4CC978L, 0x9C10B36AL,
527 0xC6150EBAL, 0x94E2EA78L, 0xA5FC3C53L, 0x1E0A2DF4L,
528 0xF2F74EA7L, 0x361D2B3DL, 0x1939260FL, 0x19C27960L,
529 0x5223A708L, 0xF71312B6L, 0xEBADFE6EL, 0xEAC31F66L,
530 0xE3BC4595L, 0xA67BC883L, 0xB17F37D1L, 0x018CFF28L,
531 0xC332DDEFL, 0xBE6C5AA5L, 0x65582185L, 0x68AB9802L,
532 0xEECEA50FL, 0xDB2F953BL, 0x2AEF7DADL, 0x5B6E2F84L,
533 0x1521B628L, 0x29076170L, 0xECDD4775L, 0x619F1510L,
534 0x13CCA830L, 0xEB61BD96L, 0x0334FE1EL, 0xAA0363CFL,
535 0xB5735C90L, 0x4C70A239L, 0xD59E9E0BL, 0xCBAADE14L,
536 0xEECC86BCL, 0x60622CA7L, 0x9CAB5CABL, 0xB2F3846EL,
537 0x648B1EAFL, 0x19BDF0CAL, 0xA02369B9L, 0x655ABB50L,
538 0x40685A32L, 0x3C2AB4B3L, 0x319EE9D5L, 0xC021B8F7L,
539 0x9B540B19L, 0x875FA099L, 0x95F7997EL, 0x623D7DA8L,
540 0xF837889AL, 0x97E32D77L, 0x11ED935FL, 0x16681281L,
541 0x0E358829L, 0xC7E61FD6L, 0x96DEDFA1L, 0x7858BA99L,
542 0x57F584A5L, 0x1B227263L, 0x9B83C3FFL, 0x1AC24696L,
543 0xCDB30AEBL, 0x532E3054L, 0x8FD948E4L, 0x6DBC3128L,
544 0x58EBF2EFL, 0x34C6FFEAL, 0xFE28ED61L, 0xEE7C3C73L,
545 0x5D4A14D9L, 0xE864B7E3L, 0x42105D14L, 0x203E13E0L,
546 0x45EEE2B6L, 0xA3AAABEAL, 0xDB6C4F15L, 0xFACB4FD0L,
547 0xC742F442L, 0xEF6ABBB5L, 0x654F3B1DL, 0x41CD2105L,
548 0xD81E799EL, 0x86854DC7L, 0xE44B476AL, 0x3D816250L,
549 0xCF62A1F2L, 0x5B8D2646L, 0xFC8883A0L, 0xC1C7B6A3L,
550 0x7F1524C3L, 0x69CB7492L, 0x47848A0BL, 0x5692B285L,
551 0x095BBF00L, 0xAD19489DL, 0x1462B174L, 0x23820E00L,
552 0x58428D2AL, 0x0C55F5EAL, 0x1DADF43EL, 0x233F7061L,
553 0x3372F092L, 0x8D937E41L, 0xD65FECF1L, 0x6C223BDBL,
554 0x7CDE3759L, 0xCBEE7460L, 0x4085F2A7L, 0xCE77326EL,
555 0xA6078084L, 0x19F8509EL, 0xE8EFD855L, 0x61D99735L,
556 0xA969A7AAL, 0xC50C06C2L, 0x5A04ABFCL, 0x800BCADCL,
557 0x9E447A2EL, 0xC3453484L, 0xFDD56705L, 0x0E1E9EC9L,
558 0xDB73DBD3L, 0x105588CDL, 0x675FDA79L, 0xE3674340L,
559 0xC5C43465L, 0x713E38D8L, 0x3D28F89EL, 0xF16DFF20L,
560 0x153E21E7L, 0x8FB03D4AL, 0xE6E39F2BL, 0xDB83ADF7L },
561 { 0xE93D5A68L, 0x948140F7L, 0xF64C261CL, 0x94692934L,
562 0x411520F7L, 0x7602D4F7L, 0xBCF46B2EL, 0xD4A20068L,
563 0xD4082471L, 0x3320F46AL, 0x43B7D4B7L, 0x500061AFL,
564 0x1E39F62EL, 0x97244546L, 0x14214F74L, 0xBF8B8840L,
565 0x4D95FC1DL, 0x96B591AFL, 0x70F4DDD3L, 0x66A02F45L,
566 0xBFBC09ECL, 0x03BD9785L, 0x7FAC6DD0L, 0x31CB8504L,
567 0x96EB27B3L, 0x55FD3941L, 0xDA2547E6L, 0xABCA0A9AL,
568 0x28507825L, 0x530429F4L, 0x0A2C86DAL, 0xE9B66DFBL,
569 0x68DC1462L, 0xD7486900L, 0x680EC0A4L, 0x27A18DEEL,
570 0x4F3FFEA2L, 0xE887AD8CL, 0xB58CE006L, 0x7AF4D6B6L,
571 0xAACE1E7CL, 0xD3375FECL, 0xCE78A399L, 0x406B2A42L,
572 0x20FE9E35L, 0xD9F385B9L, 0xEE39D7ABL, 0x3B124E8BL,
573 0x1DC9FAF7L, 0x4B6D1856L, 0x26A36631L, 0xEAE397B2L,
574 0x3A6EFA74L, 0xDD5B4332L, 0x6841E7F7L, 0xCA7820FBL,
575 0xFB0AF54EL, 0xD8FEB397L, 0x454056ACL, 0xBA489527L,
576 0x55533A3AL, 0x20838D87L, 0xFE6BA9B7L, 0xD096954BL,
577 0x55A867BCL, 0xA1159A58L, 0xCCA92963L, 0x99E1DB33L,
578 0xA62A4A56L, 0x3F3125F9L, 0x5EF47E1CL, 0x9029317CL,
579 0xFDF8E802L, 0x04272F70L, 0x80BB155CL, 0x05282CE3L,
580 0x95C11548L, 0xE4C66D22L, 0x48C1133FL, 0xC70F86DCL,
581 0x07F9C9EEL, 0x41041F0FL, 0x404779A4L, 0x5D886E17L,
582 0x325F51EBL, 0xD59BC0D1L, 0xF2BCC18FL, 0x41113564L,
583 0x257B7834L, 0x602A9C60L, 0xDFF8E8A3L, 0x1F636C1BL,
584 0x0E12B4C2L, 0x02E1329EL, 0xAF664FD1L, 0xCAD18115L,
585 0x6B2395E0L, 0x333E92E1L, 0x3B240B62L, 0xEEBEB922L,
586 0x85B2A20EL, 0xE6BA0D99L, 0xDE720C8CL, 0x2DA2F728L,
587 0xD0127845L, 0x95B794FDL, 0x647D0862L, 0xE7CCF5F0L,
588 0x5449A36FL, 0x877D48FAL, 0xC39DFD27L, 0xF33E8D1EL,
589 0x0A476341L, 0x992EFF74L, 0x3A6F6EABL, 0xF4F8FD37L,
590 0xA812DC60L, 0xA1EBDDF8L, 0x991BE14CL, 0xDB6E6B0DL,
591 0xC67B5510L, 0x6D672C37L, 0x2765D43BL, 0xDCD0E804L,
592 0xF1290DC7L, 0xCC00FFA3L, 0xB5390F92L, 0x690FED0BL,
593 0x667B9FFBL, 0xCEDB7D9CL, 0xA091CF0BL, 0xD9155EA3L,
594 0xBB132F88L, 0x515BAD24L, 0x7B9479BFL, 0x763BD6EBL,
595 0x37392EB3L, 0xCC115979L, 0x8026E297L, 0xF42E312DL,
596 0x6842ADA7L, 0xC66A2B3BL, 0x12754CCCL, 0x782EF11CL,
597 0x6A124237L, 0xB79251E7L, 0x06A1BBE6L, 0x4BFB6350L,
598 0x1A6B1018L, 0x11CAEDFAL, 0x3D25BDD8L, 0xE2E1C3C9L,
599 0x44421659L, 0x0A121386L, 0xD90CEC6EL, 0xD5ABEA2AL,
600 0x64AF674EL, 0xDA86A85FL, 0xBEBFE988L, 0x64E4C3FEL,
601 0x9DBC8057L, 0xF0F7C086L, 0x60787BF8L, 0x6003604DL,
602 0xD1FD8346L, 0xF6381FB0L, 0x7745AE04L, 0xD736FCCCL,
603 0x83426B33L, 0xF01EAB71L, 0xB0804187L, 0x3C005E5FL,
604 0x77A057BEL, 0xBDE8AE24L, 0x55464299L, 0xBF582E61L,
605 0x4E58F48FL, 0xF2DDFDA2L, 0xF474EF38L, 0x8789BDC2L,
606 0x5366F9C3L, 0xC8B38E74L, 0xB475F255L, 0x46FCD9B9L,
607 0x7AEB2661L, 0x8B1DDF84L, 0x846A0E79L, 0x915F95E2L,
608 0x466E598EL, 0x20B45770L, 0x8CD55591L, 0xC902DE4CL,
609 0xB90BACE1L, 0xBB8205D0L, 0x11A86248L, 0x7574A99EL,
610 0xB77F19B6L, 0xE0A9DC09L, 0x662D09A1L, 0xC4324633L,
611 0xE85A1F02L, 0x09F0BE8CL, 0x4A99A025L, 0x1D6EFE10L,
612 0x1AB93D1DL, 0x0BA5A4DFL, 0xA186F20FL, 0x2868F169L,
613 0xDCB7DA83L, 0x573906FEL, 0xA1E2CE9BL, 0x4FCD7F52L,
614 0x50115E01L, 0xA70683FAL, 0xA002B5C4L, 0x0DE6D027L,
615 0x9AF88C27L, 0x773F8641L, 0xC3604C06L, 0x61A806B5L,
616 0xF0177A28L, 0xC0F586E0L, 0x006058AAL, 0x30DC7D62L,
617 0x11E69ED7L, 0x2338EA63L, 0x53C2DD94L, 0xC2C21634L,
618 0xBBCBEE56L, 0x90BCB6DEL, 0xEBFC7DA1L, 0xCE591D76L,
619 0x6F05E409L, 0x4B7C0188L, 0x39720A3DL, 0x7C927C24L,
620 0x86E3725FL, 0x724D9DB9L, 0x1AC15BB4L, 0xD39EB8FCL,
621 0xED545578L, 0x08FCA5B5L, 0xD83D7CD3L, 0x4DAD0FC4L,
622 0x1E50EF5EL, 0xB161E6F8L, 0xA28514D9L, 0x6C51133CL,
623 0x6FD5C7E7L, 0x56E14EC4L, 0x362ABFCEL, 0xDDC6C837L,
624 0xD79A3234L, 0x92638212L, 0x670EFA8EL, 0x406000E0L },
625 { 0x3A39CE37L, 0xD3FAF5CFL, 0xABC27737L, 0x5AC52D1BL,
626 0x5CB0679EL, 0x4FA33742L, 0xD3822740L, 0x99BC9BBEL,
627 0xD5118E9DL, 0xBF0F7315L, 0xD62D1C7EL, 0xC700C47BL,
628 0xB78C1B6BL, 0x21A19045L, 0xB26EB1BEL, 0x6A366EB4L,
629 0x5748AB2FL, 0xBC946E79L, 0xC6A376D2L, 0x6549C2C8L,
630 0x530FF8EEL, 0x468DDE7DL, 0xD5730A1DL, 0x4CD04DC6L,
631 0x2939BBDBL, 0xA9BA4650L, 0xAC9526E8L, 0xBE5EE304L,
632 0xA1FAD5F0L, 0x6A2D519AL, 0x63EF8CE2L, 0x9A86EE22L,
633 0xC089C2B8L, 0x43242EF6L, 0xA51E03AAL, 0x9CF2D0A4L,
634 0x83C061BAL, 0x9BE96A4DL, 0x8FE51550L, 0xBA645BD6L,
635 0x2826A2F9L, 0xA73A3AE1L, 0x4BA99586L, 0xEF5562E9L,
636 0xC72FEFD3L, 0xF752F7DAL, 0x3F046F69L, 0x77FA0A59L,
637 0x80E4A915L, 0x87B08601L, 0x9B09E6ADL, 0x3B3EE593L,
638 0xE990FD5AL, 0x9E34D797L, 0x2CF0B7D9L, 0x022B8B51L,
639 0x96D5AC3AL, 0x017DA67DL, 0xD1CF3ED6L, 0x7C7D2D28L,
640 0x1F9F25CFL, 0xADF2B89BL, 0x5AD6B472L, 0x5A88F54CL,
641 0xE029AC71L, 0xE019A5E6L, 0x47B0ACFDL, 0xED93FA9BL,
642 0xE8D3C48DL, 0x283B57CCL, 0xF8D56629L, 0x79132E28L,
643 0x785F0191L, 0xED756055L, 0xF7960E44L, 0xE3D35E8CL,
644 0x15056DD4L, 0x88F46DBAL, 0x03A16125L, 0x0564F0BDL,
645 0xC3EB9E15L, 0x3C9057A2L, 0x97271AECL, 0xA93A072AL,
646 0x1B3F6D9BL, 0x1E6321F5L, 0xF59C66FBL, 0x26DCF319L,
647 0x7533D928L, 0xB155FDF5L, 0x03563482L, 0x8ABA3CBBL,
648 0x28517711L, 0xC20AD9F8L, 0xABCC5167L, 0xCCAD925FL,
649 0x4DE81751L, 0x3830DC8EL, 0x379D5862L, 0x9320F991L,
650 0xEA7A90C2L, 0xFB3E7BCEL, 0x5121CE64L, 0x774FBE32L,
651 0xA8B6E37EL, 0xC3293D46L, 0x48DE5369L, 0x6413E680L,
652 0xA2AE0810L, 0xDD6DB224L, 0x69852DFDL, 0x09072166L,
653 0xB39A460AL, 0x6445C0DDL, 0x586CDECFL, 0x1C20C8AEL,
654 0x5BBEF7DDL, 0x1B588D40L, 0xCCD2017FL, 0x6BB4E3BBL,
655 0xDDA26A7EL, 0x3A59FF45L, 0x3E350A44L, 0xBCB4CDD5L,
656 0x72EACEA8L, 0xFA6484BBL, 0x8D6612AEL, 0xBF3C6F47L,
657 0xD29BE463L, 0x542F5D9EL, 0xAEC2771BL, 0xF64E6370L,
658 0x740E0D8DL, 0xE75B1357L, 0xF8721671L, 0xAF537D5DL,
659 0x4040CB08L, 0x4EB4E2CCL, 0x34D2466AL, 0x0115AF84L,
660 0xE1B00428L, 0x95983A1DL, 0x06B89FB4L, 0xCE6EA048L,
661 0x6F3F3B82L, 0x3520AB82L, 0x011A1D4BL, 0x277227F8L,
662 0x611560B1L, 0xE7933FDCL, 0xBB3A792BL, 0x344525BDL,
663 0xA08839E1L, 0x51CE794BL, 0x2F32C9B7L, 0xA01FBAC9L,
664 0xE01CC87EL, 0xBCC7D1F6L, 0xCF0111C3L, 0xA1E8AAC7L,
665 0x1A908749L, 0xD44FBD9AL, 0xD0DADECBL, 0xD50ADA38L,
666 0x0339C32AL, 0xC6913667L, 0x8DF9317CL, 0xE0B12B4FL,
667 0xF79E59B7L, 0x43F5BB3AL, 0xF2D519FFL, 0x27D9459CL,
668 0xBF97222CL, 0x15E6FC2AL, 0x0F91FC71L, 0x9B941525L,
669 0xFAE59361L, 0xCEB69CEBL, 0xC2A86459L, 0x12BAA8D1L,
670 0xB6C1075EL, 0xE3056A0CL, 0x10D25065L, 0xCB03A442L,
671 0xE0EC6E0EL, 0x1698DB3BL, 0x4C98A0BEL, 0x3278E964L,
672 0x9F1F9532L, 0xE0D392DFL, 0xD3A0342BL, 0x8971F21EL,
673 0x1B0A7441L, 0x4BA3348CL, 0xC5BE7120L, 0xC37632D8L,
674 0xDF359F8DL, 0x9B992F2EL, 0xE60B6F47L, 0x0FE3F11DL,
675 0xE54CDA54L, 0x1EDAD891L, 0xCE6279CFL, 0xCD3E7E6FL,
676 0x1618B166L, 0xFD2C1D05L, 0x848FD2C5L, 0xF6FB2299L,
677 0xF523F357L, 0xA6327623L, 0x93A83531L, 0x56CCCD02L,
678 0xACF08162L, 0x5A75EBB5L, 0x6E163697L, 0x88D273CCL,
679 0xDE966292L, 0x81B949D0L, 0x4C50901BL, 0x71C65614L,
680 0xE6C6C7BDL, 0x327A140AL, 0x45E1D006L, 0xC3F27B9AL,
681 0xC9AA53FDL, 0x62A80F00L, 0xBB25BFE2L, 0x35BDD2F6L,
682 0x71126905L, 0xB2040222L, 0xB6CBCF7CL, 0xCD769C2BL,
683 0x53113EC0L, 0x1640E3D3L, 0x38ABBD60L, 0x2547ADF0L,
684 0xBA38209CL, 0xF746CE76L, 0x77AFA1C5L, 0x20756060L,
685 0x85CBFE4EL, 0x8AE88DD8L, 0x7AAAF9B0L, 0x4CF9AA7EL,
686 0x1948C25CL, 0x02FB8A8CL, 0x01C36AE4L, 0xD6EBE1F9L,
687 0x90D4F869L, 0xA65CDEA0L, 0x3F09252DL, 0xC208E69FL,
688 0xB74E6132L, 0xCE77E25BL, 0x578FDFE3L, 0x3AC372E6L }
689};
690
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200691#endif /* !MBEDTLS_BLOWFISH_ALT */
692#endif /* MBEDTLS_BLOWFISH_C */