blob: 826d8fcd2e4b754d7ebe4e4d26b12e2d65f49e60 [file] [log] [blame]
Paul Bakker8123e9d2011-01-06 15:37:30 +00001/**
2 * \file cipher.c
3 *
4 * \brief Generic cipher wrapper for PolarSSL
5 *
6 * \author Adriaan de Jong <dejong@fox-it.com>
7 *
Paul Bakker68884e32013-01-07 18:20:04 +01008 * Copyright (C) 2006-2013, Brainspark B.V.
Paul Bakker8123e9d2011-01-06 15:37:30 +00009 *
10 * This file is part of PolarSSL (http://www.polarssl.org)
11 * Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org>
12 *
13 * All rights reserved.
14 *
15 * This program is free software; you can redistribute it and/or modify
16 * it under the terms of the GNU General Public License as published by
17 * the Free Software Foundation; either version 2 of the License, or
18 * (at your option) any later version.
19 *
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
24 *
25 * You should have received a copy of the GNU General Public License along
26 * with this program; if not, write to the Free Software Foundation, Inc.,
27 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 */
29
30#include "polarssl/config.h"
31
32#if defined(POLARSSL_CIPHER_C)
33
34#include "polarssl/cipher.h"
35#include "polarssl/cipher_wrap.h"
36
Paul Bakker8123e9d2011-01-06 15:37:30 +000037#include <stdlib.h>
38
Paul Bakkeraf5c85f2011-04-18 03:47:52 +000039#if defined _MSC_VER && !defined strcasecmp
40#define strcasecmp _stricmp
41#endif
42
Paul Bakker72f62662011-01-16 21:27:44 +000043static const int supported_ciphers[] = {
44
45#if defined(POLARSSL_AES_C)
46 POLARSSL_CIPHER_AES_128_CBC,
47 POLARSSL_CIPHER_AES_192_CBC,
48 POLARSSL_CIPHER_AES_256_CBC,
Paul Bakker343a8702011-06-09 14:27:58 +000049
50#if defined(POLARSSL_CIPHER_MODE_CFB)
51 POLARSSL_CIPHER_AES_128_CFB128,
52 POLARSSL_CIPHER_AES_192_CFB128,
53 POLARSSL_CIPHER_AES_256_CFB128,
54#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */
55
56#if defined(POLARSSL_CIPHER_MODE_CTR)
57 POLARSSL_CIPHER_AES_128_CTR,
58 POLARSSL_CIPHER_AES_192_CTR,
59 POLARSSL_CIPHER_AES_256_CTR,
60#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */
61
Paul Bakker72f62662011-01-16 21:27:44 +000062#endif /* defined(POLARSSL_AES_C) */
63
64#if defined(POLARSSL_CAMELLIA_C)
65 POLARSSL_CIPHER_CAMELLIA_128_CBC,
66 POLARSSL_CIPHER_CAMELLIA_192_CBC,
67 POLARSSL_CIPHER_CAMELLIA_256_CBC,
Paul Bakker343a8702011-06-09 14:27:58 +000068
69#if defined(POLARSSL_CIPHER_MODE_CFB)
70 POLARSSL_CIPHER_CAMELLIA_128_CFB128,
71 POLARSSL_CIPHER_CAMELLIA_192_CFB128,
72 POLARSSL_CIPHER_CAMELLIA_256_CFB128,
73#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */
74
75#if defined(POLARSSL_CIPHER_MODE_CTR)
76 POLARSSL_CIPHER_CAMELLIA_128_CTR,
77 POLARSSL_CIPHER_CAMELLIA_192_CTR,
78 POLARSSL_CIPHER_CAMELLIA_256_CTR,
79#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */
80
Paul Bakker72f62662011-01-16 21:27:44 +000081#endif /* defined(POLARSSL_CAMELLIA_C) */
82
83#if defined(POLARSSL_DES_C)
84 POLARSSL_CIPHER_DES_CBC,
85 POLARSSL_CIPHER_DES_EDE_CBC,
86 POLARSSL_CIPHER_DES_EDE3_CBC,
87#endif /* defined(POLARSSL_DES_C) */
88
Paul Bakker6132d0a2012-07-04 17:10:40 +000089#if defined(POLARSSL_BLOWFISH_C)
90 POLARSSL_CIPHER_BLOWFISH_CBC,
91
92#if defined(POLARSSL_CIPHER_MODE_CFB)
93 POLARSSL_CIPHER_BLOWFISH_CFB64,
94#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */
95
96#if defined(POLARSSL_CIPHER_MODE_CTR)
97 POLARSSL_CIPHER_BLOWFISH_CTR,
98#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */
99
100#endif /* defined(POLARSSL_BLOWFISH_C) */
101
Paul Bakkerfab5c822012-02-06 16:45:10 +0000102#if defined(POLARSSL_CIPHER_NULL_CIPHER)
103 POLARSSL_CIPHER_NULL,
104#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
105
Paul Bakker72f62662011-01-16 21:27:44 +0000106 0
107};
108
109const int *cipher_list( void )
110{
111 return supported_ciphers;
112}
113
Paul Bakkerec1b9842012-01-14 18:24:43 +0000114const cipher_info_t *cipher_info_from_type( const cipher_type_t cipher_type )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000115{
116 /* Find static cipher information */
117 switch ( cipher_type )
118 {
119#if defined(POLARSSL_AES_C)
120 case POLARSSL_CIPHER_AES_128_CBC:
121 return &aes_128_cbc_info;
122 case POLARSSL_CIPHER_AES_192_CBC:
123 return &aes_192_cbc_info;
124 case POLARSSL_CIPHER_AES_256_CBC:
125 return &aes_256_cbc_info;
Paul Bakker343a8702011-06-09 14:27:58 +0000126
127#if defined(POLARSSL_CIPHER_MODE_CFB)
128 case POLARSSL_CIPHER_AES_128_CFB128:
129 return &aes_128_cfb128_info;
130 case POLARSSL_CIPHER_AES_192_CFB128:
131 return &aes_192_cfb128_info;
132 case POLARSSL_CIPHER_AES_256_CFB128:
133 return &aes_256_cfb128_info;
134#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */
135
136#if defined(POLARSSL_CIPHER_MODE_CTR)
137 case POLARSSL_CIPHER_AES_128_CTR:
138 return &aes_128_ctr_info;
139 case POLARSSL_CIPHER_AES_192_CTR:
140 return &aes_192_ctr_info;
141 case POLARSSL_CIPHER_AES_256_CTR:
142 return &aes_256_ctr_info;
143#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */
144
Paul Bakker68884e32013-01-07 18:20:04 +0100145#if defined(POLARSSL_GCM_C)
146 case POLARSSL_CIPHER_AES_128_GCM:
147 return &aes_128_gcm_info;
148 case POLARSSL_CIPHER_AES_256_GCM:
149 return &aes_256_gcm_info;
150#endif /* defined(POLARSSL_GCM_C) */
151
Paul Bakker8123e9d2011-01-06 15:37:30 +0000152#endif
153
154#if defined(POLARSSL_CAMELLIA_C)
155 case POLARSSL_CIPHER_CAMELLIA_128_CBC:
156 return &camellia_128_cbc_info;
157 case POLARSSL_CIPHER_CAMELLIA_192_CBC:
158 return &camellia_192_cbc_info;
159 case POLARSSL_CIPHER_CAMELLIA_256_CBC:
160 return &camellia_256_cbc_info;
Paul Bakker343a8702011-06-09 14:27:58 +0000161
162#if defined(POLARSSL_CIPHER_MODE_CFB)
163 case POLARSSL_CIPHER_CAMELLIA_128_CFB128:
164 return &camellia_128_cfb128_info;
165 case POLARSSL_CIPHER_CAMELLIA_192_CFB128:
166 return &camellia_192_cfb128_info;
167 case POLARSSL_CIPHER_CAMELLIA_256_CFB128:
168 return &camellia_256_cfb128_info;
169#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */
170
171#if defined(POLARSSL_CIPHER_MODE_CTR)
172 case POLARSSL_CIPHER_CAMELLIA_128_CTR:
173 return &camellia_128_ctr_info;
174 case POLARSSL_CIPHER_CAMELLIA_192_CTR:
175 return &camellia_192_ctr_info;
176 case POLARSSL_CIPHER_CAMELLIA_256_CTR:
177 return &camellia_256_ctr_info;
178#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */
179
Paul Bakker8123e9d2011-01-06 15:37:30 +0000180#endif
181
182#if defined(POLARSSL_DES_C)
183 case POLARSSL_CIPHER_DES_CBC:
184 return &des_cbc_info;
185 case POLARSSL_CIPHER_DES_EDE_CBC:
186 return &des_ede_cbc_info;
187 case POLARSSL_CIPHER_DES_EDE3_CBC:
188 return &des_ede3_cbc_info;
189#endif
190
Paul Bakker68884e32013-01-07 18:20:04 +0100191#if defined(POLARSSL_ARC4_C)
192 case POLARSSL_CIPHER_ARC4_128:
193 return &arc4_128_info;
194#endif
195
Paul Bakker6132d0a2012-07-04 17:10:40 +0000196#if defined(POLARSSL_BLOWFISH_C)
197 case POLARSSL_CIPHER_BLOWFISH_CBC:
198 return &blowfish_cbc_info;
199
200#if defined(POLARSSL_CIPHER_MODE_CFB)
201 case POLARSSL_CIPHER_BLOWFISH_CFB64:
202 return &blowfish_cfb64_info;
203#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */
204
205#if defined(POLARSSL_CIPHER_MODE_CTR)
206 case POLARSSL_CIPHER_BLOWFISH_CTR:
207 return &blowfish_ctr_info;
208#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */
209
210#endif
211
Paul Bakkerfab5c822012-02-06 16:45:10 +0000212#if defined(POLARSSL_CIPHER_NULL_CIPHER)
213 case POLARSSL_CIPHER_NULL:
214 return &null_cipher_info;
215#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
216
Paul Bakker8123e9d2011-01-06 15:37:30 +0000217 default:
218 return NULL;
219 }
220}
221
222const cipher_info_t *cipher_info_from_string( const char *cipher_name )
223{
224 if( NULL == cipher_name )
225 return NULL;
226
Paul Bakker343a8702011-06-09 14:27:58 +0000227 /* Get the appropriate cipher information */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000228#if defined(POLARSSL_CAMELLIA_C)
229 if( !strcasecmp( "CAMELLIA-128-CBC", cipher_name ) )
230 return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_128_CBC );
231 if( !strcasecmp( "CAMELLIA-192-CBC", cipher_name ) )
232 return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_192_CBC );
233 if( !strcasecmp( "CAMELLIA-256-CBC", cipher_name ) )
234 return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_256_CBC );
Paul Bakker343a8702011-06-09 14:27:58 +0000235
236#if defined(POLARSSL_CIPHER_MODE_CFB)
237 if( !strcasecmp( "CAMELLIA-128-CFB128", cipher_name ) )
238 return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_128_CFB128 );
239 if( !strcasecmp( "CAMELLIA-192-CFB128", cipher_name ) )
240 return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_192_CFB128 );
241 if( !strcasecmp( "CAMELLIA-256-CFB128", cipher_name ) )
242 return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_256_CFB128 );
243#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */
244
245#if defined(POLARSSL_CIPHER_MODE_CTR)
246 if( !strcasecmp( "CAMELLIA-128-CTR", cipher_name ) )
247 return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_128_CTR );
248 if( !strcasecmp( "CAMELLIA-192-CTR", cipher_name ) )
249 return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_192_CTR );
250 if( !strcasecmp( "CAMELLIA-256-CTR", cipher_name ) )
251 return cipher_info_from_type( POLARSSL_CIPHER_CAMELLIA_256_CTR );
252#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000253#endif
Paul Bakker343a8702011-06-09 14:27:58 +0000254
Paul Bakker8123e9d2011-01-06 15:37:30 +0000255#if defined(POLARSSL_AES_C)
256 if( !strcasecmp( "AES-128-CBC", cipher_name ) )
257 return cipher_info_from_type( POLARSSL_CIPHER_AES_128_CBC );
258 if( !strcasecmp( "AES-192-CBC", cipher_name ) )
259 return cipher_info_from_type( POLARSSL_CIPHER_AES_192_CBC );
260 if( !strcasecmp( "AES-256-CBC", cipher_name ) )
261 return cipher_info_from_type( POLARSSL_CIPHER_AES_256_CBC );
Paul Bakker343a8702011-06-09 14:27:58 +0000262
263#if defined(POLARSSL_CIPHER_MODE_CFB)
264 if( !strcasecmp( "AES-128-CFB128", cipher_name ) )
265 return cipher_info_from_type( POLARSSL_CIPHER_AES_128_CFB128 );
266 if( !strcasecmp( "AES-192-CFB128", cipher_name ) )
267 return cipher_info_from_type( POLARSSL_CIPHER_AES_192_CFB128 );
268 if( !strcasecmp( "AES-256-CFB128", cipher_name ) )
269 return cipher_info_from_type( POLARSSL_CIPHER_AES_256_CFB128 );
270#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */
271
272#if defined(POLARSSL_CIPHER_MODE_CTR)
273 if( !strcasecmp( "AES-128-CTR", cipher_name ) )
274 return cipher_info_from_type( POLARSSL_CIPHER_AES_128_CTR );
275 if( !strcasecmp( "AES-192-CTR", cipher_name ) )
276 return cipher_info_from_type( POLARSSL_CIPHER_AES_192_CTR );
277 if( !strcasecmp( "AES-256-CTR", cipher_name ) )
278 return cipher_info_from_type( POLARSSL_CIPHER_AES_256_CTR );
279#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000280#endif
Paul Bakker343a8702011-06-09 14:27:58 +0000281
Paul Bakker8123e9d2011-01-06 15:37:30 +0000282#if defined(POLARSSL_DES_C)
283 if( !strcasecmp( "DES-CBC", cipher_name ) )
284 return cipher_info_from_type( POLARSSL_CIPHER_DES_CBC );
285 if( !strcasecmp( "DES-EDE-CBC", cipher_name ) )
286 return cipher_info_from_type( POLARSSL_CIPHER_DES_EDE_CBC );
287 if( !strcasecmp( "DES-EDE3-CBC", cipher_name ) )
288 return cipher_info_from_type( POLARSSL_CIPHER_DES_EDE3_CBC );
289#endif
Paul Bakkerfab5c822012-02-06 16:45:10 +0000290
Paul Bakker6132d0a2012-07-04 17:10:40 +0000291#if defined(POLARSSL_BLOWFISH_C)
292 if( !strcasecmp( "BLOWFISH-CBC", cipher_name ) )
293 return cipher_info_from_type( POLARSSL_CIPHER_BLOWFISH_CBC );
294
295#if defined(POLARSSL_CIPHER_MODE_CFB)
296 if( !strcasecmp( "BLOWFISH-CFB64", cipher_name ) )
297 return cipher_info_from_type( POLARSSL_CIPHER_BLOWFISH_CFB64 );
298#endif /* defined(POLARSSL_CIPHER_MODE_CFB) */
299
300#if defined(POLARSSL_CIPHER_MODE_CTR)
301 if( !strcasecmp( "BLOWFISH-CTR", cipher_name ) )
302 return cipher_info_from_type( POLARSSL_CIPHER_BLOWFISH_CTR );
303#endif /* defined(POLARSSL_CIPHER_MODE_CTR) */
304#endif
305
Paul Bakkerfab5c822012-02-06 16:45:10 +0000306#if defined(POLARSSL_CIPHER_NULL_CIPHER)
307 if( !strcasecmp( "NULL", cipher_name ) )
308 return cipher_info_from_type( POLARSSL_CIPHER_NULL );
309#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
310
Paul Bakker8123e9d2011-01-06 15:37:30 +0000311 return NULL;
312}
313
314int cipher_init_ctx( cipher_context_t *ctx, const cipher_info_t *cipher_info )
315{
316 if( NULL == cipher_info || NULL == ctx )
Paul Bakkerff61a782011-06-09 15:42:02 +0000317 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000318
Paul Bakker279432a2012-04-26 10:09:35 +0000319 memset( ctx, 0, sizeof( cipher_context_t ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000320
Paul Bakker343a8702011-06-09 14:27:58 +0000321 if( NULL == ( ctx->cipher_ctx = cipher_info->base->ctx_alloc_func() ) )
Paul Bakkerff61a782011-06-09 15:42:02 +0000322 return POLARSSL_ERR_CIPHER_ALLOC_FAILED;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000323
324 ctx->cipher_info = cipher_info;
325
Manuel Pégourié-Gonnardac56a1a2013-07-25 12:31:10 +0200326 /*
327 * Ignore possible errors caused by a cipher mode that doesn't use padding
328 */
Paul Bakker48e93c82013-08-14 12:21:18 +0200329#if defined(POLARSSL_CIPHER_PADDING_PKCS7)
Manuel Pégourié-Gonnardac56a1a2013-07-25 12:31:10 +0200330 (void) cipher_set_padding_mode( ctx, POLARSSL_PADDING_PKCS7 );
Paul Bakker48e93c82013-08-14 12:21:18 +0200331#else
332 (void) cipher_set_padding_mode( ctx, POLARSSL_PADDING_NONE );
333#endif
Manuel Pégourié-Gonnardac56a1a2013-07-25 12:31:10 +0200334
Paul Bakker8123e9d2011-01-06 15:37:30 +0000335 return 0;
336}
337
338int cipher_free_ctx( cipher_context_t *ctx )
339{
340 if( ctx == NULL || ctx->cipher_info == NULL )
Paul Bakkerff61a782011-06-09 15:42:02 +0000341 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000342
Paul Bakker343a8702011-06-09 14:27:58 +0000343 ctx->cipher_info->base->ctx_free_func( ctx->cipher_ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000344
345 return 0;
346}
347
348int cipher_setkey( cipher_context_t *ctx, const unsigned char *key,
349 int key_length, const operation_t operation )
350{
351 if( NULL == ctx || NULL == ctx->cipher_info )
Paul Bakkerff61a782011-06-09 15:42:02 +0000352 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000353
354 ctx->key_length = key_length;
355 ctx->operation = operation;
356
Paul Bakkerfab5c822012-02-06 16:45:10 +0000357#if defined(POLARSSL_CIPHER_NULL_CIPHER)
358 if( ctx->cipher_info->mode == POLARSSL_MODE_NULL )
359 return 0;
360#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
361
Paul Bakker343a8702011-06-09 14:27:58 +0000362 /*
Paul Bakker6132d0a2012-07-04 17:10:40 +0000363 * For CFB and CTR mode always use the encryption key schedule
Paul Bakker343a8702011-06-09 14:27:58 +0000364 */
365 if( POLARSSL_ENCRYPT == operation ||
Paul Bakker6132d0a2012-07-04 17:10:40 +0000366 POLARSSL_MODE_CFB == ctx->cipher_info->mode ||
Paul Bakker343a8702011-06-09 14:27:58 +0000367 POLARSSL_MODE_CTR == ctx->cipher_info->mode )
368 {
369 return ctx->cipher_info->base->setkey_enc_func( ctx->cipher_ctx, key,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000370 ctx->key_length );
Paul Bakker343a8702011-06-09 14:27:58 +0000371 }
Paul Bakker8123e9d2011-01-06 15:37:30 +0000372
Paul Bakker343a8702011-06-09 14:27:58 +0000373 if( POLARSSL_DECRYPT == operation )
374 return ctx->cipher_info->base->setkey_dec_func( ctx->cipher_ctx, key,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000375 ctx->key_length );
376
Paul Bakkerff61a782011-06-09 15:42:02 +0000377 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000378}
379
380int cipher_reset( cipher_context_t *ctx, const unsigned char *iv )
381{
382 if( NULL == ctx || NULL == ctx->cipher_info || NULL == iv )
Paul Bakkerff61a782011-06-09 15:42:02 +0000383 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000384
385 ctx->unprocessed_len = 0;
386
387 memcpy( ctx->iv, iv, cipher_get_iv_size( ctx ) );
388
389 return 0;
390}
391
Paul Bakker23986e52011-04-24 08:57:21 +0000392int cipher_update( cipher_context_t *ctx, const unsigned char *input, size_t ilen,
393 unsigned char *output, size_t *olen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000394{
Paul Bakkerff61a782011-06-09 15:42:02 +0000395 int ret;
Paul Bakker23986e52011-04-24 08:57:21 +0000396 size_t copy_len = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000397
Paul Bakker68884e32013-01-07 18:20:04 +0100398 *olen = 0;
399
400 if( NULL == ctx || NULL == ctx->cipher_info || NULL == olen )
Paul Bakkera885d682011-01-20 16:35:05 +0000401 {
Paul Bakkerff61a782011-06-09 15:42:02 +0000402 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
Paul Bakkera885d682011-01-20 16:35:05 +0000403 }
Paul Bakker8123e9d2011-01-06 15:37:30 +0000404
Paul Bakker68884e32013-01-07 18:20:04 +0100405 if( input == output &&
406 ( ctx->unprocessed_len != 0 || ilen % cipher_get_block_size( ctx ) ) )
407 {
408 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
409 }
Paul Bakker8123e9d2011-01-06 15:37:30 +0000410
Paul Bakkerfab5c822012-02-06 16:45:10 +0000411#if defined(POLARSSL_CIPHER_NULL_CIPHER)
412 if( ctx->cipher_info->mode == POLARSSL_MODE_NULL )
413 {
Paul Bakkerfab5c822012-02-06 16:45:10 +0000414 *olen = ilen;
Paul Bakker68884e32013-01-07 18:20:04 +0100415
416 if( output == input )
417 return( 0 );
418
419 memcpy( output, input, ilen );
Paul Bakkerfab5c822012-02-06 16:45:10 +0000420 return 0;
421 }
422#endif /* defined(POLARSSL_CIPHER_NULL_CIPHER) */
423
Paul Bakker8123e9d2011-01-06 15:37:30 +0000424 if( ctx->cipher_info->mode == POLARSSL_MODE_CBC )
425 {
426 /*
427 * If there is not enough data for a full block, cache it.
428 */
429 if( ( ctx->operation == POLARSSL_DECRYPT &&
430 ilen + ctx->unprocessed_len <= cipher_get_block_size( ctx ) ) ||
431 ( ctx->operation == POLARSSL_ENCRYPT &&
432 ilen + ctx->unprocessed_len < cipher_get_block_size( ctx ) ) )
433 {
434 memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input,
435 ilen );
436
437 ctx->unprocessed_len += ilen;
438 return 0;
439 }
440
441 /*
442 * Process cached data first
443 */
444 if( ctx->unprocessed_len != 0 )
445 {
446 copy_len = cipher_get_block_size( ctx ) - ctx->unprocessed_len;
447
448 memcpy( &( ctx->unprocessed_data[ctx->unprocessed_len] ), input,
449 copy_len );
450
Paul Bakkerff61a782011-06-09 15:42:02 +0000451 if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000452 ctx->operation, cipher_get_block_size( ctx ), ctx->iv,
Paul Bakkerff61a782011-06-09 15:42:02 +0000453 ctx->unprocessed_data, output ) ) )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000454 {
Paul Bakkerff61a782011-06-09 15:42:02 +0000455 return ret;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000456 }
457
458 *olen += cipher_get_block_size( ctx );
459 output += cipher_get_block_size( ctx );
460 ctx->unprocessed_len = 0;
461
462 input += copy_len;
463 ilen -= copy_len;
464 }
465
466 /*
467 * Cache final, incomplete block
468 */
469 if( 0 != ilen )
470 {
471 copy_len = ilen % cipher_get_block_size( ctx );
472 if( copy_len == 0 && ctx->operation == POLARSSL_DECRYPT )
473 copy_len = cipher_get_block_size(ctx);
474
475 memcpy( ctx->unprocessed_data, &( input[ilen - copy_len] ),
476 copy_len );
477
478 ctx->unprocessed_len += copy_len;
479 ilen -= copy_len;
480 }
481
482 /*
483 * Process remaining full blocks
484 */
485 if( ilen )
486 {
Paul Bakkerff61a782011-06-09 15:42:02 +0000487 if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx,
488 ctx->operation, ilen, ctx->iv, input, output ) ) )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000489 {
Paul Bakkerff61a782011-06-09 15:42:02 +0000490 return ret;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000491 }
492 *olen += ilen;
493 }
494
495 return 0;
496 }
497
Paul Bakker68884e32013-01-07 18:20:04 +0100498#if defined(POLARSSL_CIPHER_MODE_CFB)
Paul Bakker6132d0a2012-07-04 17:10:40 +0000499 if( ctx->cipher_info->mode == POLARSSL_MODE_CFB )
Paul Bakker343a8702011-06-09 14:27:58 +0000500 {
Paul Bakker6132d0a2012-07-04 17:10:40 +0000501 if( 0 != ( ret = ctx->cipher_info->base->cfb_func( ctx->cipher_ctx,
Paul Bakker343a8702011-06-09 14:27:58 +0000502 ctx->operation, ilen, &ctx->unprocessed_len, ctx->iv,
Paul Bakkerff61a782011-06-09 15:42:02 +0000503 input, output ) ) )
Paul Bakker343a8702011-06-09 14:27:58 +0000504 {
Paul Bakkerff61a782011-06-09 15:42:02 +0000505 return ret;
Paul Bakker343a8702011-06-09 14:27:58 +0000506 }
507
508 *olen = ilen;
509
510 return 0;
511 }
Paul Bakker68884e32013-01-07 18:20:04 +0100512#endif
Paul Bakker343a8702011-06-09 14:27:58 +0000513
Paul Bakker68884e32013-01-07 18:20:04 +0100514#if defined(POLARSSL_CIPHER_MODE_CTR)
Paul Bakker343a8702011-06-09 14:27:58 +0000515 if( ctx->cipher_info->mode == POLARSSL_MODE_CTR )
516 {
Paul Bakkerff61a782011-06-09 15:42:02 +0000517 if( 0 != ( ret = ctx->cipher_info->base->ctr_func( ctx->cipher_ctx,
Paul Bakker343a8702011-06-09 14:27:58 +0000518 ilen, &ctx->unprocessed_len, ctx->iv,
Paul Bakkerff61a782011-06-09 15:42:02 +0000519 ctx->unprocessed_data, input, output ) ) )
Paul Bakker343a8702011-06-09 14:27:58 +0000520 {
Paul Bakkerff61a782011-06-09 15:42:02 +0000521 return ret;
Paul Bakker343a8702011-06-09 14:27:58 +0000522 }
523
524 *olen = ilen;
525
526 return 0;
527 }
Paul Bakker68884e32013-01-07 18:20:04 +0100528#endif
Paul Bakker343a8702011-06-09 14:27:58 +0000529
Paul Bakkerff61a782011-06-09 15:42:02 +0000530 return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000531}
532
Paul Bakker48e93c82013-08-14 12:21:18 +0200533#if defined(POLARSSL_CIPHER_PADDING_PKCS7)
Manuel Pégourié-Gonnard679f9e92013-07-26 12:46:02 +0200534/*
535 * PKCS7 (and PKCS5) padding: fill with ll bytes, with ll = padding_len
536 */
Paul Bakker23986e52011-04-24 08:57:21 +0000537static void add_pkcs_padding( unsigned char *output, size_t output_len,
538 size_t data_len )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000539{
Paul Bakker23986e52011-04-24 08:57:21 +0000540 size_t padding_len = output_len - data_len;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000541 unsigned char i = 0;
542
543 for( i = 0; i < padding_len; i++ )
Paul Bakker23986e52011-04-24 08:57:21 +0000544 output[data_len + i] = (unsigned char) padding_len;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000545}
546
Manuel Pégourié-Gonnardac56a1a2013-07-25 12:31:10 +0200547static int get_pkcs_padding( unsigned char *input, size_t input_len,
548 size_t *data_len )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000549{
Paul Bakkerec1b9842012-01-14 18:24:43 +0000550 unsigned int i, padding_len = 0;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000551
Paul Bakkera885d682011-01-20 16:35:05 +0000552 if( NULL == input || NULL == data_len )
Paul Bakkerff61a782011-06-09 15:42:02 +0000553 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000554
555 padding_len = input[input_len - 1];
556
Manuel Pégourié-Gonnardb7d24bc2013-07-26 10:58:48 +0200557 if( padding_len > input_len || padding_len == 0 )
Paul Bakkerff61a782011-06-09 15:42:02 +0000558 return POLARSSL_ERR_CIPHER_INVALID_PADDING;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000559
Paul Bakkera885d682011-01-20 16:35:05 +0000560 for( i = input_len - padding_len; i < input_len; i++ )
561 if( input[i] != padding_len )
Paul Bakkerff61a782011-06-09 15:42:02 +0000562 return POLARSSL_ERR_CIPHER_INVALID_PADDING;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000563
564 *data_len = input_len - padding_len;
565
566 return 0;
567}
Paul Bakker48e93c82013-08-14 12:21:18 +0200568#endif /* POLARSSL_CIPHER_PADDING_PKCS7 */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000569
Paul Bakker48e93c82013-08-14 12:21:18 +0200570#if defined(POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS)
Manuel Pégourié-Gonnard679f9e92013-07-26 12:46:02 +0200571/*
572 * One and zeros padding: fill with 80 00 ... 00
573 */
574static void add_one_and_zeros_padding( unsigned char *output,
575 size_t output_len, size_t data_len )
576{
577 size_t padding_len = output_len - data_len;
578 unsigned char i = 0;
579
580 output[data_len] = 0x80;
581 for( i = 1; i < padding_len; i++ )
582 output[data_len + i] = 0x00;
583}
584
585static int get_one_and_zeros_padding( unsigned char *input, size_t input_len,
586 size_t *data_len )
587{
588 unsigned char *p = input + input_len - 1;
589
590 if( NULL == input || NULL == data_len )
591 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
592
593 while( *p == 0x00 && p > input )
594 --p;
595
596 if( *p != 0x80 )
597 return POLARSSL_ERR_CIPHER_INVALID_PADDING;
598
599 *data_len = p - input;
600
601 return 0;
602}
Paul Bakker48e93c82013-08-14 12:21:18 +0200603#endif /* POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS */
Manuel Pégourié-Gonnard679f9e92013-07-26 12:46:02 +0200604
Paul Bakker48e93c82013-08-14 12:21:18 +0200605#if defined(POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN)
Manuel Pégourié-Gonnard8d4291b2013-07-26 14:55:18 +0200606/*
607 * Zeros and len padding: fill with 00 ... 00 ll, where ll is padding length
608 */
609static void add_zeros_and_len_padding( unsigned char *output,
610 size_t output_len, size_t data_len )
611{
612 size_t padding_len = output_len - data_len;
613 unsigned char i = 0;
614
615 for( i = 1; i < padding_len; i++ )
616 output[data_len + i - 1] = 0x00;
617 output[output_len - 1] = (unsigned char) padding_len;
618}
619
620static int get_zeros_and_len_padding( unsigned char *input, size_t input_len,
621 size_t *data_len )
622{
623 unsigned int i, padding_len = 0;
624
625 if( NULL == input || NULL == data_len )
626 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
627
628 padding_len = input[input_len - 1];
629
630 if( padding_len > input_len || padding_len == 0 )
631 return POLARSSL_ERR_CIPHER_INVALID_PADDING;
632
633 for( i = input_len - padding_len; i < input_len - 1; i++ )
634 if( input[i] != 0x00 )
635 return POLARSSL_ERR_CIPHER_INVALID_PADDING;
636
637 *data_len = input_len - padding_len;
638
639 return 0;
640}
Paul Bakker48e93c82013-08-14 12:21:18 +0200641#endif /* POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN */
Manuel Pégourié-Gonnard8d4291b2013-07-26 14:55:18 +0200642
Paul Bakker48e93c82013-08-14 12:21:18 +0200643#if defined(POLARSSL_CIPHER_PADDING_ZEROS)
Manuel Pégourié-Gonnard0e7d2c02013-07-26 16:05:14 +0200644/*
645 * Zero padding: fill with 00 ... 00
646 */
647static void add_zeros_padding( unsigned char *output,
648 size_t output_len, size_t data_len )
649{
650 unsigned char i;
651
652 for( i = data_len; i < output_len; i++ )
653 output[i] = 0x00;
654}
655
656static int get_zeros_padding( unsigned char *input, size_t input_len,
657 size_t *data_len )
658{
659 unsigned char *p = input + input_len - 1;
660 if( NULL == input || NULL == data_len )
661 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
662
663 while( *p == 0x00 && p > input )
664 --p;
665
666 *data_len = *p == 0x00 ? 0 : p - input + 1;
667
668 return 0;
669}
Paul Bakker48e93c82013-08-14 12:21:18 +0200670#endif /* POLARSSL_CIPHER_PADDING_ZEROS */
Manuel Pégourié-Gonnard0e7d2c02013-07-26 16:05:14 +0200671
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200672/*
673 * No padding: don't pad :)
674 *
675 * There is no add_padding function (check for NULL in cipher_finish)
676 * but a trivial get_padding function
677 */
678static int get_no_padding( unsigned char *input, size_t input_len,
679 size_t *data_len )
680{
681 if( NULL == input || NULL == data_len )
682 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
683
684 *data_len = input_len;
685
686 return 0;
687}
688
Paul Bakker23986e52011-04-24 08:57:21 +0000689int cipher_finish( cipher_context_t *ctx, unsigned char *output, size_t *olen)
Paul Bakker8123e9d2011-01-06 15:37:30 +0000690{
Paul Bakkerff61a782011-06-09 15:42:02 +0000691 int ret = 0;
692
Paul Bakker8123e9d2011-01-06 15:37:30 +0000693 if( NULL == ctx || NULL == ctx->cipher_info || NULL == olen )
Paul Bakkerff61a782011-06-09 15:42:02 +0000694 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000695
696 *olen = 0;
697
Paul Bakker6132d0a2012-07-04 17:10:40 +0000698 if( POLARSSL_MODE_CFB == ctx->cipher_info->mode ||
Paul Bakkerfab5c822012-02-06 16:45:10 +0000699 POLARSSL_MODE_CTR == ctx->cipher_info->mode ||
700 POLARSSL_MODE_NULL == ctx->cipher_info->mode )
Paul Bakker343a8702011-06-09 14:27:58 +0000701 {
702 return 0;
703 }
704
Paul Bakker8123e9d2011-01-06 15:37:30 +0000705 if( POLARSSL_MODE_CBC == ctx->cipher_info->mode )
706 {
707 if( POLARSSL_ENCRYPT == ctx->operation )
708 {
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200709 /* check for 'no padding' mode */
710 if( NULL == ctx->add_padding )
711 {
712 if( 0 != ctx->unprocessed_len )
713 return POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED;
714
715 return 0;
716 }
717
Manuel Pégourié-Gonnardac56a1a2013-07-25 12:31:10 +0200718 ctx->add_padding( ctx->unprocessed_data, cipher_get_iv_size( ctx ),
Paul Bakker8123e9d2011-01-06 15:37:30 +0000719 ctx->unprocessed_len );
720 }
721 else if ( cipher_get_block_size( ctx ) != ctx->unprocessed_len )
722 {
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200723 /*
724 * For decrypt operations, expect a full block,
725 * or an empty block if no padding
726 */
727 if( NULL == ctx->add_padding && 0 == ctx->unprocessed_len )
728 return 0;
729
Paul Bakkerff61a782011-06-09 15:42:02 +0000730 return POLARSSL_ERR_CIPHER_FULL_BLOCK_EXPECTED;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000731 }
732
733 /* cipher block */
Paul Bakkerff61a782011-06-09 15:42:02 +0000734 if( 0 != ( ret = ctx->cipher_info->base->cbc_func( ctx->cipher_ctx,
735 ctx->operation, cipher_get_block_size( ctx ), ctx->iv,
736 ctx->unprocessed_data, output ) ) )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000737 {
Paul Bakkerff61a782011-06-09 15:42:02 +0000738 return ret;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000739 }
740
741 /* Set output size for decryption */
742 if( POLARSSL_DECRYPT == ctx->operation )
Manuel Pégourié-Gonnardac56a1a2013-07-25 12:31:10 +0200743 return ctx->get_padding( output, cipher_get_block_size( ctx ),
744 olen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000745
746 /* Set output size for encryption */
747 *olen = cipher_get_block_size( ctx );
748 return 0;
749 }
750
Paul Bakkerff61a782011-06-09 15:42:02 +0000751 return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE;
Paul Bakker8123e9d2011-01-06 15:37:30 +0000752}
753
Manuel Pégourié-Gonnardac56a1a2013-07-25 12:31:10 +0200754int cipher_set_padding_mode( cipher_context_t *ctx, cipher_padding_t mode )
755{
756 if( NULL == ctx ||
757 POLARSSL_MODE_CBC != ctx->cipher_info->mode )
758 {
759 return POLARSSL_ERR_CIPHER_BAD_INPUT_DATA;
760 }
761
Paul Bakker1a45d912013-08-14 12:04:26 +0200762 switch( mode )
Manuel Pégourié-Gonnardac56a1a2013-07-25 12:31:10 +0200763 {
Paul Bakker48e93c82013-08-14 12:21:18 +0200764#if defined(POLARSSL_CIPHER_PADDING_PKCS7)
Paul Bakker1a45d912013-08-14 12:04:26 +0200765 case POLARSSL_PADDING_PKCS7:
Manuel Pégourié-Gonnardac56a1a2013-07-25 12:31:10 +0200766 ctx->add_padding = add_pkcs_padding;
767 ctx->get_padding = get_pkcs_padding;
Paul Bakker1a45d912013-08-14 12:04:26 +0200768 break;
Paul Bakker48e93c82013-08-14 12:21:18 +0200769#endif
770#if defined(POLARSSL_CIPHER_PADDING_ONE_AND_ZEROS)
Paul Bakker1a45d912013-08-14 12:04:26 +0200771 case POLARSSL_PADDING_ONE_AND_ZEROS:
Manuel Pégourié-Gonnard679f9e92013-07-26 12:46:02 +0200772 ctx->add_padding = add_one_and_zeros_padding;
773 ctx->get_padding = get_one_and_zeros_padding;
Paul Bakker1a45d912013-08-14 12:04:26 +0200774 break;
Paul Bakker48e93c82013-08-14 12:21:18 +0200775#endif
776#if defined(POLARSSL_CIPHER_PADDING_ZEROS_AND_LEN)
Paul Bakker1a45d912013-08-14 12:04:26 +0200777 case POLARSSL_PADDING_ZEROS_AND_LEN:
Manuel Pégourié-Gonnard8d4291b2013-07-26 14:55:18 +0200778 ctx->add_padding = add_zeros_and_len_padding;
779 ctx->get_padding = get_zeros_and_len_padding;
Paul Bakker1a45d912013-08-14 12:04:26 +0200780 break;
Paul Bakker48e93c82013-08-14 12:21:18 +0200781#endif
782#if defined(POLARSSL_CIPHER_PADDING_ZEROS)
Paul Bakker1a45d912013-08-14 12:04:26 +0200783 case POLARSSL_PADDING_ZEROS:
Manuel Pégourié-Gonnard0e7d2c02013-07-26 16:05:14 +0200784 ctx->add_padding = add_zeros_padding;
785 ctx->get_padding = get_zeros_padding;
Paul Bakker1a45d912013-08-14 12:04:26 +0200786 break;
Paul Bakker48e93c82013-08-14 12:21:18 +0200787#endif
Paul Bakker1a45d912013-08-14 12:04:26 +0200788 case POLARSSL_PADDING_NONE:
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200789 ctx->add_padding = NULL;
790 ctx->get_padding = get_no_padding;
Paul Bakker1a45d912013-08-14 12:04:26 +0200791 break;
792
793 default:
Paul Bakker48e93c82013-08-14 12:21:18 +0200794 return POLARSSL_ERR_CIPHER_FEATURE_UNAVAILABLE;
Manuel Pégourié-Gonnardebdc4132013-07-26 16:50:44 +0200795 }
796
Paul Bakker1a45d912013-08-14 12:04:26 +0200797 return 0;
Manuel Pégourié-Gonnardac56a1a2013-07-25 12:31:10 +0200798}
799
Paul Bakker8123e9d2011-01-06 15:37:30 +0000800#if defined(POLARSSL_SELF_TEST)
801
802#include <stdio.h>
803
804#define ASSERT(x) if (!(x)) { \
805 printf( "failed with %i at %s\n", value, (#x) ); \
806 return( 1 ); \
807}
808/*
809 * Checkup routine
810 */
811
812int cipher_self_test( int verbose )
813{
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000814 ((void) verbose);
815
Paul Bakker8123e9d2011-01-06 15:37:30 +0000816 return( 0 );
817}
818
819#endif
820
821#endif