blob: c795234bcc2186ba9c9774236084b0c87d2e6a60 [file] [log] [blame]
Paul Bakker8123e9d2011-01-06 15:37:30 +00001/**
Paul Bakkerfae35f02013-03-13 10:33:51 +01002 * \file cipher_wrap.c
Paul Bakker9af723c2014-05-01 13:03:14 +02003 *
Manuel Pégourié-Gonnardb4fe3cb2015-01-22 16:11:05 +00004 * \brief Generic cipher wrapper for mbed TLS
Paul Bakker8123e9d2011-01-06 15:37:30 +00005 *
6 * \author Adriaan de Jong <dejong@fox-it.com>
7 *
Manuel Pégourié-Gonnarda658a402015-01-23 09:45:19 +00008 * Copyright (C) 2006-2014, ARM Limited, All Rights Reserved
Paul Bakker8123e9d2011-01-06 15:37:30 +00009 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000010 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker8123e9d2011-01-06 15:37:30 +000011 *
Paul Bakker8123e9d2011-01-06 15:37:30 +000012 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License along
23 * with this program; if not, write to the Free Software Foundation, Inc.,
24 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 */
26
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020027#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000028#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020029#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020030#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020031#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +000032
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020033#if defined(MBEDTLS_CIPHER_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +000034
Manuel Pégourié-Gonnard50518f42015-05-26 11:04:15 +020035#include "mbedtls/cipher_internal.h"
Paul Bakkerf6543712012-03-05 14:01:29 +000036
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020037#if defined(MBEDTLS_AES_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000038#include "mbedtls/aes.h"
Paul Bakkerf6543712012-03-05 14:01:29 +000039#endif
40
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020041#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000042#include "mbedtls/arc4.h"
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +020043#endif
44
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020045#if defined(MBEDTLS_CAMELLIA_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000046#include "mbedtls/camellia.h"
Paul Bakkerf6543712012-03-05 14:01:29 +000047#endif
48
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020049#if defined(MBEDTLS_DES_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000050#include "mbedtls/des.h"
Paul Bakker02f61692012-03-15 10:54:25 +000051#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +000052
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020053#if defined(MBEDTLS_BLOWFISH_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000054#include "mbedtls/blowfish.h"
Paul Bakker6132d0a2012-07-04 17:10:40 +000055#endif
56
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020057#if defined(MBEDTLS_GCM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000058#include "mbedtls/gcm.h"
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +020059#endif
60
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020061#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000062#include "mbedtls/ccm.h"
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +020063#endif
64
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020065#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
Manuel Pégourié-Gonnard0c851ee2015-02-10 12:47:52 +000066#include <string.h>
67#endif
68
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020069#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000070#include "mbedtls/platform.h"
Paul Bakker6e339b52013-07-03 13:37:05 +020071#else
Rich Evans00ab4702015-02-06 13:43:58 +000072#include <stdlib.h>
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020073#define mbedtls_calloc calloc
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020074#define mbedtls_free free
Paul Bakker6e339b52013-07-03 13:37:05 +020075#endif
76
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020077#if defined(MBEDTLS_GCM_C)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020078/* shared by all GCM ciphers */
79static void *gcm_ctx_alloc( void )
80{
Manuel Pégourié-Gonnard96fb6852015-06-23 11:39:01 +020081 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_gcm_context ) );
82
83 if( ctx != NULL )
84 mbedtls_gcm_init( (mbedtls_gcm_context *) ctx );
85
86 return( ctx );
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020087}
88
89static void gcm_ctx_free( void *ctx )
90{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020091 mbedtls_gcm_free( ctx );
92 mbedtls_free( ctx );
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020093}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020094#endif /* MBEDTLS_GCM_C */
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020095
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020096#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +020097/* shared by all CCM ciphers */
98static void *ccm_ctx_alloc( void )
99{
Manuel Pégourié-Gonnard96fb6852015-06-23 11:39:01 +0200100 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ccm_context ) );
101
102 if( ctx != NULL )
103 mbedtls_ccm_init( (mbedtls_ccm_context *) ctx );
104
105 return( ctx );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200106}
107
108static void ccm_ctx_free( void *ctx )
109{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200110 mbedtls_ccm_free( ctx );
111 mbedtls_free( ctx );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200112}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200113#endif /* MBEDTLS_CCM_C */
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200114
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200115#if defined(MBEDTLS_AES_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +0000116
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200117static int aes_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200118 const unsigned char *input, unsigned char *output )
119{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200120 return mbedtls_aes_crypt_ecb( (mbedtls_aes_context *) ctx, operation, input, output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200121}
122
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200123#if defined(MBEDTLS_CIPHER_MODE_CBC)
124static int aes_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000125 unsigned char *iv, const unsigned char *input, unsigned char *output )
126{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200127 return mbedtls_aes_crypt_cbc( (mbedtls_aes_context *) ctx, operation, length, iv, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200128 output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000129}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200130#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000131
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200132#if defined(MBEDTLS_CIPHER_MODE_CFB)
133static int aes_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200134 size_t length, size_t *iv_off, unsigned char *iv,
135 const unsigned char *input, unsigned char *output )
Paul Bakker343a8702011-06-09 14:27:58 +0000136{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200137 return mbedtls_aes_crypt_cfb128( (mbedtls_aes_context *) ctx, operation, length, iv_off, iv,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200138 input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000139}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200140#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000141
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200142#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200143static int aes_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
144 unsigned char *nonce_counter, unsigned char *stream_block,
Paul Bakker343a8702011-06-09 14:27:58 +0000145 const unsigned char *input, unsigned char *output )
146{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200147 return mbedtls_aes_crypt_ctr( (mbedtls_aes_context *) ctx, length, nc_off, nonce_counter,
Paul Bakker343a8702011-06-09 14:27:58 +0000148 stream_block, input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000149}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200150#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000151
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200152static int aes_setkey_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200153 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000154{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200155 return mbedtls_aes_setkey_dec( (mbedtls_aes_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000156}
157
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200158static int aes_setkey_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200159 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000160{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200161 return mbedtls_aes_setkey_enc( (mbedtls_aes_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000162}
163
164static void * aes_ctx_alloc( void )
165{
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200166 mbedtls_aes_context *aes = mbedtls_calloc( 1, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200167
168 if( aes == NULL )
169 return( NULL );
170
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200171 mbedtls_aes_init( aes );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200172
173 return( aes );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000174}
175
176static void aes_ctx_free( void *ctx )
177{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200178 mbedtls_aes_free( (mbedtls_aes_context *) ctx );
179 mbedtls_free( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000180}
181
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200182static const mbedtls_cipher_base_t aes_info = {
183 MBEDTLS_CIPHER_ID_AES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200184 aes_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200185#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker343a8702011-06-09 14:27:58 +0000186 aes_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100187#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200188#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker343a8702011-06-09 14:27:58 +0000189 aes_crypt_cfb128_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100190#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200191#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker343a8702011-06-09 14:27:58 +0000192 aes_crypt_ctr_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100193#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200194#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +0200195 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100196#endif
Paul Bakker343a8702011-06-09 14:27:58 +0000197 aes_setkey_enc_wrap,
198 aes_setkey_dec_wrap,
199 aes_ctx_alloc,
200 aes_ctx_free
201};
202
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200203static const mbedtls_cipher_info_t aes_128_ecb_info = {
204 MBEDTLS_CIPHER_AES_128_ECB,
205 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200206 128,
207 "AES-128-ECB",
208 16,
209 0,
210 16,
211 &aes_info
212};
213
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200214static const mbedtls_cipher_info_t aes_192_ecb_info = {
215 MBEDTLS_CIPHER_AES_192_ECB,
216 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200217 192,
218 "AES-192-ECB",
219 16,
220 0,
221 16,
222 &aes_info
223};
224
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200225static const mbedtls_cipher_info_t aes_256_ecb_info = {
226 MBEDTLS_CIPHER_AES_256_ECB,
227 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200228 256,
229 "AES-256-ECB",
230 16,
231 0,
232 16,
233 &aes_info
234};
235
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200236#if defined(MBEDTLS_CIPHER_MODE_CBC)
237static const mbedtls_cipher_info_t aes_128_cbc_info = {
238 MBEDTLS_CIPHER_AES_128_CBC,
239 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000240 128,
241 "AES-128-CBC",
242 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200243 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000244 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000245 &aes_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000246};
247
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200248static const mbedtls_cipher_info_t aes_192_cbc_info = {
249 MBEDTLS_CIPHER_AES_192_CBC,
250 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000251 192,
252 "AES-192-CBC",
253 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200254 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000255 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000256 &aes_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000257};
258
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200259static const mbedtls_cipher_info_t aes_256_cbc_info = {
260 MBEDTLS_CIPHER_AES_256_CBC,
261 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000262 256,
263 "AES-256-CBC",
264 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200265 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000266 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000267 &aes_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000268};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200269#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +0000270
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200271#if defined(MBEDTLS_CIPHER_MODE_CFB)
272static const mbedtls_cipher_info_t aes_128_cfb128_info = {
273 MBEDTLS_CIPHER_AES_128_CFB128,
274 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000275 128,
276 "AES-128-CFB128",
277 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200278 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000279 16,
280 &aes_info
281};
282
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200283static const mbedtls_cipher_info_t aes_192_cfb128_info = {
284 MBEDTLS_CIPHER_AES_192_CFB128,
285 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000286 192,
287 "AES-192-CFB128",
288 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200289 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000290 16,
291 &aes_info
292};
293
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200294static const mbedtls_cipher_info_t aes_256_cfb128_info = {
295 MBEDTLS_CIPHER_AES_256_CFB128,
296 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000297 256,
298 "AES-256-CFB128",
299 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200300 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000301 16,
302 &aes_info
303};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200304#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000305
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200306#if defined(MBEDTLS_CIPHER_MODE_CTR)
307static const mbedtls_cipher_info_t aes_128_ctr_info = {
308 MBEDTLS_CIPHER_AES_128_CTR,
309 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000310 128,
311 "AES-128-CTR",
312 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200313 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000314 16,
315 &aes_info
316};
317
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200318static const mbedtls_cipher_info_t aes_192_ctr_info = {
319 MBEDTLS_CIPHER_AES_192_CTR,
320 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000321 192,
322 "AES-192-CTR",
323 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200324 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000325 16,
326 &aes_info
327};
328
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200329static const mbedtls_cipher_info_t aes_256_ctr_info = {
330 MBEDTLS_CIPHER_AES_256_CTR,
331 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000332 256,
333 "AES-256-CTR",
334 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200335 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000336 16,
337 &aes_info
338};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200339#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000340
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200341#if defined(MBEDTLS_GCM_C)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200342static int gcm_aes_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200343 unsigned int key_bitlen )
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200344{
Manuel Pégourié-Gonnardc34e8dd2015-04-28 21:42:17 +0200345 return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200346 key, key_bitlen );
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200347}
348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200349static const mbedtls_cipher_base_t gcm_aes_info = {
350 MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200351 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200352#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200353 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100354#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200355#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200356 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100357#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200358#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200359 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100360#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200361#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Paul Bakker5e0efa72013-09-08 23:04:04 +0200362 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100363#endif
Paul Bakker43aff2a2013-09-09 00:10:27 +0200364 gcm_aes_setkey_wrap,
365 gcm_aes_setkey_wrap,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200366 gcm_ctx_alloc,
367 gcm_ctx_free,
368};
369
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200370static const mbedtls_cipher_info_t aes_128_gcm_info = {
371 MBEDTLS_CIPHER_AES_128_GCM,
372 MBEDTLS_MODE_GCM,
Paul Bakker68884e32013-01-07 18:20:04 +0100373 128,
374 "AES-128-GCM",
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200375 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200376 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Paul Bakker68884e32013-01-07 18:20:04 +0100377 16,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200378 &gcm_aes_info
Paul Bakker68884e32013-01-07 18:20:04 +0100379};
380
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200381static const mbedtls_cipher_info_t aes_192_gcm_info = {
382 MBEDTLS_CIPHER_AES_192_GCM,
383 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard83f3fc02013-09-04 12:07:24 +0200384 192,
385 "AES-192-GCM",
386 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200387 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard83f3fc02013-09-04 12:07:24 +0200388 16,
389 &gcm_aes_info
390};
391
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200392static const mbedtls_cipher_info_t aes_256_gcm_info = {
393 MBEDTLS_CIPHER_AES_256_GCM,
394 MBEDTLS_MODE_GCM,
Paul Bakker68884e32013-01-07 18:20:04 +0100395 256,
396 "AES-256-GCM",
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200397 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200398 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Paul Bakker68884e32013-01-07 18:20:04 +0100399 16,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200400 &gcm_aes_info
Paul Bakker68884e32013-01-07 18:20:04 +0100401};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200402#endif /* MBEDTLS_GCM_C */
Paul Bakker68884e32013-01-07 18:20:04 +0100403
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200404#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200405static int ccm_aes_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200406 unsigned int key_bitlen )
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200407{
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200408 return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200409 key, key_bitlen );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200410}
411
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200412static const mbedtls_cipher_base_t ccm_aes_info = {
413 MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200414 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200415#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200416 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100417#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200418#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200419 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100420#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200421#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200422 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100423#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200424#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200425 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100426#endif
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200427 ccm_aes_setkey_wrap,
428 ccm_aes_setkey_wrap,
429 ccm_ctx_alloc,
430 ccm_ctx_free,
431};
432
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200433static const mbedtls_cipher_info_t aes_128_ccm_info = {
434 MBEDTLS_CIPHER_AES_128_CCM,
435 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200436 128,
437 "AES-128-CCM",
438 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200439 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200440 16,
441 &ccm_aes_info
442};
443
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200444static const mbedtls_cipher_info_t aes_192_ccm_info = {
445 MBEDTLS_CIPHER_AES_192_CCM,
446 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200447 192,
448 "AES-192-CCM",
449 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200450 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200451 16,
452 &ccm_aes_info
453};
454
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200455static const mbedtls_cipher_info_t aes_256_ccm_info = {
456 MBEDTLS_CIPHER_AES_256_CCM,
457 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200458 256,
459 "AES-256-CCM",
460 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200461 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200462 16,
463 &ccm_aes_info
464};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200465#endif /* MBEDTLS_CCM_C */
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200466
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200467#endif /* MBEDTLS_AES_C */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000468
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200469#if defined(MBEDTLS_CAMELLIA_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +0000470
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200471static int camellia_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200472 const unsigned char *input, unsigned char *output )
473{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200474 return mbedtls_camellia_crypt_ecb( (mbedtls_camellia_context *) ctx, operation, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200475 output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200476}
477
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200478#if defined(MBEDTLS_CIPHER_MODE_CBC)
479static int camellia_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200480 size_t length, unsigned char *iv,
481 const unsigned char *input, unsigned char *output )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000482{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200483 return mbedtls_camellia_crypt_cbc( (mbedtls_camellia_context *) ctx, operation, length, iv,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200484 input, output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000485}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200486#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000487
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200488#if defined(MBEDTLS_CIPHER_MODE_CFB)
489static int camellia_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200490 size_t length, size_t *iv_off, unsigned char *iv,
491 const unsigned char *input, unsigned char *output )
Paul Bakker343a8702011-06-09 14:27:58 +0000492{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200493 return mbedtls_camellia_crypt_cfb128( (mbedtls_camellia_context *) ctx, operation, length,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200494 iv_off, iv, input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000495}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200496#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000497
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200498#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200499static int camellia_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
500 unsigned char *nonce_counter, unsigned char *stream_block,
Paul Bakker343a8702011-06-09 14:27:58 +0000501 const unsigned char *input, unsigned char *output )
502{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200503 return mbedtls_camellia_crypt_ctr( (mbedtls_camellia_context *) ctx, length, nc_off,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200504 nonce_counter, stream_block, input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000505}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200506#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000507
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200508static int camellia_setkey_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200509 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000510{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200511 return mbedtls_camellia_setkey_dec( (mbedtls_camellia_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000512}
513
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200514static int camellia_setkey_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200515 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000516{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200517 return mbedtls_camellia_setkey_enc( (mbedtls_camellia_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000518}
519
520static void * camellia_ctx_alloc( void )
521{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200522 mbedtls_camellia_context *ctx;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200523 ctx = mbedtls_calloc( 1, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200524
525 if( ctx == NULL )
526 return( NULL );
527
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200528 mbedtls_camellia_init( ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200529
530 return( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000531}
532
533static void camellia_ctx_free( void *ctx )
534{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200535 mbedtls_camellia_free( (mbedtls_camellia_context *) ctx );
536 mbedtls_free( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000537}
538
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200539static const mbedtls_cipher_base_t camellia_info = {
540 MBEDTLS_CIPHER_ID_CAMELLIA,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200541 camellia_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200542#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker343a8702011-06-09 14:27:58 +0000543 camellia_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100544#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200545#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker343a8702011-06-09 14:27:58 +0000546 camellia_crypt_cfb128_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100547#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200548#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker343a8702011-06-09 14:27:58 +0000549 camellia_crypt_ctr_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100550#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200551#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +0200552 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100553#endif
Paul Bakker343a8702011-06-09 14:27:58 +0000554 camellia_setkey_enc_wrap,
555 camellia_setkey_dec_wrap,
556 camellia_ctx_alloc,
557 camellia_ctx_free
558};
559
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200560static const mbedtls_cipher_info_t camellia_128_ecb_info = {
561 MBEDTLS_CIPHER_CAMELLIA_128_ECB,
562 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200563 128,
564 "CAMELLIA-128-ECB",
565 16,
566 0,
567 16,
568 &camellia_info
569};
570
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200571static const mbedtls_cipher_info_t camellia_192_ecb_info = {
572 MBEDTLS_CIPHER_CAMELLIA_192_ECB,
573 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200574 192,
575 "CAMELLIA-192-ECB",
576 16,
577 0,
578 16,
579 &camellia_info
580};
581
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200582static const mbedtls_cipher_info_t camellia_256_ecb_info = {
583 MBEDTLS_CIPHER_CAMELLIA_256_ECB,
584 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200585 256,
586 "CAMELLIA-256-ECB",
587 16,
588 0,
589 16,
590 &camellia_info
591};
592
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200593#if defined(MBEDTLS_CIPHER_MODE_CBC)
594static const mbedtls_cipher_info_t camellia_128_cbc_info = {
595 MBEDTLS_CIPHER_CAMELLIA_128_CBC,
596 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000597 128,
598 "CAMELLIA-128-CBC",
599 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200600 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000601 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000602 &camellia_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000603};
604
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200605static const mbedtls_cipher_info_t camellia_192_cbc_info = {
606 MBEDTLS_CIPHER_CAMELLIA_192_CBC,
607 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000608 192,
609 "CAMELLIA-192-CBC",
610 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200611 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000612 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000613 &camellia_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000614};
615
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200616static const mbedtls_cipher_info_t camellia_256_cbc_info = {
617 MBEDTLS_CIPHER_CAMELLIA_256_CBC,
618 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000619 256,
620 "CAMELLIA-256-CBC",
621 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200622 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000623 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000624 &camellia_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000625};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200626#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +0000627
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200628#if defined(MBEDTLS_CIPHER_MODE_CFB)
629static const mbedtls_cipher_info_t camellia_128_cfb128_info = {
630 MBEDTLS_CIPHER_CAMELLIA_128_CFB128,
631 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000632 128,
633 "CAMELLIA-128-CFB128",
634 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200635 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000636 16,
637 &camellia_info
638};
639
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200640static const mbedtls_cipher_info_t camellia_192_cfb128_info = {
641 MBEDTLS_CIPHER_CAMELLIA_192_CFB128,
642 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000643 192,
644 "CAMELLIA-192-CFB128",
645 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200646 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000647 16,
648 &camellia_info
649};
650
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200651static const mbedtls_cipher_info_t camellia_256_cfb128_info = {
652 MBEDTLS_CIPHER_CAMELLIA_256_CFB128,
653 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000654 256,
655 "CAMELLIA-256-CFB128",
656 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200657 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000658 16,
659 &camellia_info
660};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200661#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000662
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200663#if defined(MBEDTLS_CIPHER_MODE_CTR)
664static const mbedtls_cipher_info_t camellia_128_ctr_info = {
665 MBEDTLS_CIPHER_CAMELLIA_128_CTR,
666 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000667 128,
668 "CAMELLIA-128-CTR",
669 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200670 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000671 16,
672 &camellia_info
673};
674
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200675static const mbedtls_cipher_info_t camellia_192_ctr_info = {
676 MBEDTLS_CIPHER_CAMELLIA_192_CTR,
677 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000678 192,
679 "CAMELLIA-192-CTR",
680 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200681 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000682 16,
683 &camellia_info
684};
685
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200686static const mbedtls_cipher_info_t camellia_256_ctr_info = {
687 MBEDTLS_CIPHER_CAMELLIA_256_CTR,
688 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000689 256,
690 "CAMELLIA-256-CTR",
691 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200692 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000693 16,
694 &camellia_info
695};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200696#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000697
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200698#if defined(MBEDTLS_GCM_C)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200699static int gcm_camellia_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200700 unsigned int key_bitlen )
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200701{
Manuel Pégourié-Gonnardc34e8dd2015-04-28 21:42:17 +0200702 return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200703 key, key_bitlen );
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200704}
705
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200706static const mbedtls_cipher_base_t gcm_camellia_info = {
707 MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200708 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200709#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200710 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100711#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200713 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100714#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200715#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200716 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100717#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200718#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200719 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100720#endif
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200721 gcm_camellia_setkey_wrap,
722 gcm_camellia_setkey_wrap,
723 gcm_ctx_alloc,
724 gcm_ctx_free,
725};
726
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200727static const mbedtls_cipher_info_t camellia_128_gcm_info = {
728 MBEDTLS_CIPHER_CAMELLIA_128_GCM,
729 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200730 128,
731 "CAMELLIA-128-GCM",
732 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200733 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200734 16,
735 &gcm_camellia_info
736};
737
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200738static const mbedtls_cipher_info_t camellia_192_gcm_info = {
739 MBEDTLS_CIPHER_CAMELLIA_192_GCM,
740 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200741 192,
742 "CAMELLIA-192-GCM",
743 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200744 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200745 16,
746 &gcm_camellia_info
747};
748
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200749static const mbedtls_cipher_info_t camellia_256_gcm_info = {
750 MBEDTLS_CIPHER_CAMELLIA_256_GCM,
751 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200752 256,
753 "CAMELLIA-256-GCM",
754 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200755 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200756 16,
757 &gcm_camellia_info
758};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200759#endif /* MBEDTLS_GCM_C */
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200760
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200761#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200762static int ccm_camellia_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200763 unsigned int key_bitlen )
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200764{
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200765 return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200766 key, key_bitlen );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200767}
768
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200769static const mbedtls_cipher_base_t ccm_camellia_info = {
770 MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200771 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200772#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200773 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100774#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200775#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200776 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100777#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200778#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200779 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100780#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200781#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200782 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100783#endif
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200784 ccm_camellia_setkey_wrap,
785 ccm_camellia_setkey_wrap,
786 ccm_ctx_alloc,
787 ccm_ctx_free,
788};
789
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200790static const mbedtls_cipher_info_t camellia_128_ccm_info = {
791 MBEDTLS_CIPHER_CAMELLIA_128_CCM,
792 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200793 128,
794 "CAMELLIA-128-CCM",
795 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200796 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200797 16,
798 &ccm_camellia_info
799};
800
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200801static const mbedtls_cipher_info_t camellia_192_ccm_info = {
802 MBEDTLS_CIPHER_CAMELLIA_192_CCM,
803 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200804 192,
805 "CAMELLIA-192-CCM",
806 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200807 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200808 16,
809 &ccm_camellia_info
810};
811
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200812static const mbedtls_cipher_info_t camellia_256_ccm_info = {
813 MBEDTLS_CIPHER_CAMELLIA_256_CCM,
814 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200815 256,
816 "CAMELLIA-256-CCM",
817 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200818 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200819 16,
820 &ccm_camellia_info
821};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200822#endif /* MBEDTLS_CCM_C */
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200823
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200824#endif /* MBEDTLS_CAMELLIA_C */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000825
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200826#if defined(MBEDTLS_DES_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +0000827
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200828static int des_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200829 const unsigned char *input, unsigned char *output )
830{
831 ((void) operation);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200832 return mbedtls_des_crypt_ecb( (mbedtls_des_context *) ctx, input, output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200833}
834
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200835static int des3_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200836 const unsigned char *input, unsigned char *output )
837{
838 ((void) operation);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200839 return mbedtls_des3_crypt_ecb( (mbedtls_des3_context *) ctx, input, output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200840}
841
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200842#if defined(MBEDTLS_CIPHER_MODE_CBC)
843static int des_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000844 unsigned char *iv, const unsigned char *input, unsigned char *output )
845{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200846 return mbedtls_des_crypt_cbc( (mbedtls_des_context *) ctx, operation, length, iv, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200847 output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000848}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200849#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000850
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200851#if defined(MBEDTLS_CIPHER_MODE_CBC)
852static int des3_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000853 unsigned char *iv, const unsigned char *input, unsigned char *output )
854{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200855 return mbedtls_des3_crypt_cbc( (mbedtls_des3_context *) ctx, operation, length, iv, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200856 output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000857}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200858#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000859
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200860static int des_setkey_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200861 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000862{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200863 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000864
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200865 return mbedtls_des_setkey_dec( (mbedtls_des_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000866}
867
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200868static int des_setkey_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200869 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000870{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200871 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000872
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200873 return mbedtls_des_setkey_enc( (mbedtls_des_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000874}
875
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200876static int des3_set2key_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200877 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000878{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200879 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000880
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200881 return mbedtls_des3_set2key_dec( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000882}
883
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200884static int des3_set2key_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200885 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000886{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200887 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000888
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200889 return mbedtls_des3_set2key_enc( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000890}
891
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200892static int des3_set3key_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200893 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000894{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200895 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000896
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200897 return mbedtls_des3_set3key_dec( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000898}
899
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200900static int des3_set3key_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200901 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000902{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200903 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000904
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200905 return mbedtls_des3_set3key_enc( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000906}
907
908static void * des_ctx_alloc( void )
909{
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200910 mbedtls_des_context *des = mbedtls_calloc( 1, sizeof( mbedtls_des_context ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000911
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200912 if( des == NULL )
913 return( NULL );
914
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200915 mbedtls_des_init( des );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200916
917 return( des );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000918}
919
920static void des_ctx_free( void *ctx )
921{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200922 mbedtls_des_free( (mbedtls_des_context *) ctx );
923 mbedtls_free( ctx );
Paul Bakker34617722014-06-13 17:20:13 +0200924}
925
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200926static void * des3_ctx_alloc( void )
927{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200928 mbedtls_des3_context *des3;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200929 des3 = mbedtls_calloc( 1, sizeof( mbedtls_des3_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200930
931 if( des3 == NULL )
932 return( NULL );
933
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200934 mbedtls_des3_init( des3 );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200935
936 return( des3 );
937}
938
Paul Bakker34617722014-06-13 17:20:13 +0200939static void des3_ctx_free( void *ctx )
940{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200941 mbedtls_des3_free( (mbedtls_des3_context *) ctx );
942 mbedtls_free( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000943}
944
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200945static const mbedtls_cipher_base_t des_info = {
946 MBEDTLS_CIPHER_ID_DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200947 des_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200948#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker23986e52011-04-24 08:57:21 +0000949 des_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100950#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200951#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +0200952 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100953#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200954#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +0200955 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100956#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200957#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +0200958 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100959#endif
Paul Bakker23986e52011-04-24 08:57:21 +0000960 des_setkey_enc_wrap,
961 des_setkey_dec_wrap,
962 des_ctx_alloc,
963 des_ctx_free
Paul Bakker8123e9d2011-01-06 15:37:30 +0000964};
965
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200966static const mbedtls_cipher_info_t des_ecb_info = {
967 MBEDTLS_CIPHER_DES_ECB,
968 MBEDTLS_MODE_ECB,
969 MBEDTLS_KEY_LENGTH_DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200970 "DES-ECB",
971 8,
972 0,
973 8,
974 &des_info
975};
976
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200977#if defined(MBEDTLS_CIPHER_MODE_CBC)
978static const mbedtls_cipher_info_t des_cbc_info = {
979 MBEDTLS_CIPHER_DES_CBC,
980 MBEDTLS_MODE_CBC,
981 MBEDTLS_KEY_LENGTH_DES,
Paul Bakker343a8702011-06-09 14:27:58 +0000982 "DES-CBC",
983 8,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200984 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000985 8,
986 &des_info
987};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200988#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +0000989
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200990static const mbedtls_cipher_base_t des_ede_info = {
991 MBEDTLS_CIPHER_ID_DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200992 des3_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker23986e52011-04-24 08:57:21 +0000994 des3_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100995#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200996#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +0200997 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100998#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200999#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +02001000 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001001#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001002#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001003 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001004#endif
Paul Bakker23986e52011-04-24 08:57:21 +00001005 des3_set2key_enc_wrap,
1006 des3_set2key_dec_wrap,
1007 des3_ctx_alloc,
Paul Bakker34617722014-06-13 17:20:13 +02001008 des3_ctx_free
Paul Bakker8123e9d2011-01-06 15:37:30 +00001009};
1010
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001011static const mbedtls_cipher_info_t des_ede_ecb_info = {
1012 MBEDTLS_CIPHER_DES_EDE_ECB,
1013 MBEDTLS_MODE_ECB,
1014 MBEDTLS_KEY_LENGTH_DES_EDE,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001015 "DES-EDE-ECB",
1016 8,
1017 0,
1018 8,
1019 &des_ede_info
1020};
1021
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001022#if defined(MBEDTLS_CIPHER_MODE_CBC)
1023static const mbedtls_cipher_info_t des_ede_cbc_info = {
1024 MBEDTLS_CIPHER_DES_EDE_CBC,
1025 MBEDTLS_MODE_CBC,
1026 MBEDTLS_KEY_LENGTH_DES_EDE,
Paul Bakker343a8702011-06-09 14:27:58 +00001027 "DES-EDE-CBC",
Paul Bakker0e342352013-06-24 19:33:02 +02001028 8,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001029 0,
Paul Bakker0e342352013-06-24 19:33:02 +02001030 8,
Paul Bakker343a8702011-06-09 14:27:58 +00001031 &des_ede_info
1032};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001033#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +00001034
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001035static const mbedtls_cipher_base_t des_ede3_info = {
Manuel Pégourié-Gonnard9d515832015-06-02 10:00:04 +01001036 MBEDTLS_CIPHER_ID_3DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001037 des3_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001038#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker343a8702011-06-09 14:27:58 +00001039 des3_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001040#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +02001042 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001043#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001044#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +02001045 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001046#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001047#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001048 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001049#endif
Paul Bakker343a8702011-06-09 14:27:58 +00001050 des3_set3key_enc_wrap,
1051 des3_set3key_dec_wrap,
1052 des3_ctx_alloc,
Paul Bakker34617722014-06-13 17:20:13 +02001053 des3_ctx_free
Paul Bakker343a8702011-06-09 14:27:58 +00001054};
1055
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001056static const mbedtls_cipher_info_t des_ede3_ecb_info = {
1057 MBEDTLS_CIPHER_DES_EDE3_ECB,
1058 MBEDTLS_MODE_ECB,
1059 MBEDTLS_KEY_LENGTH_DES_EDE3,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001060 "DES-EDE3-ECB",
1061 8,
1062 0,
1063 8,
1064 &des_ede3_info
1065};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001066#if defined(MBEDTLS_CIPHER_MODE_CBC)
1067static const mbedtls_cipher_info_t des_ede3_cbc_info = {
1068 MBEDTLS_CIPHER_DES_EDE3_CBC,
1069 MBEDTLS_MODE_CBC,
1070 MBEDTLS_KEY_LENGTH_DES_EDE3,
Paul Bakker23986e52011-04-24 08:57:21 +00001071 "DES-EDE3-CBC",
1072 8,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001073 0,
Paul Bakker23986e52011-04-24 08:57:21 +00001074 8,
Paul Bakker343a8702011-06-09 14:27:58 +00001075 &des_ede3_info
Paul Bakker8123e9d2011-01-06 15:37:30 +00001076};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001077#endif /* MBEDTLS_CIPHER_MODE_CBC */
1078#endif /* MBEDTLS_DES_C */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001079
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001080#if defined(MBEDTLS_BLOWFISH_C)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001081
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001082static int blowfish_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001083 const unsigned char *input, unsigned char *output )
1084{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001085 return mbedtls_blowfish_crypt_ecb( (mbedtls_blowfish_context *) ctx, operation, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001086 output );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001087}
1088
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001089#if defined(MBEDTLS_CIPHER_MODE_CBC)
1090static int blowfish_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001091 size_t length, unsigned char *iv, const unsigned char *input,
1092 unsigned char *output )
Paul Bakker6132d0a2012-07-04 17:10:40 +00001093{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001094 return mbedtls_blowfish_crypt_cbc( (mbedtls_blowfish_context *) ctx, operation, length, iv,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001095 input, output );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001096}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001097#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001098
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001099#if defined(MBEDTLS_CIPHER_MODE_CFB)
1100static int blowfish_crypt_cfb64_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001101 size_t length, size_t *iv_off, unsigned char *iv,
1102 const unsigned char *input, unsigned char *output )
Paul Bakker6132d0a2012-07-04 17:10:40 +00001103{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001104 return mbedtls_blowfish_crypt_cfb64( (mbedtls_blowfish_context *) ctx, operation, length,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001105 iv_off, iv, input, output );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001106}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001107#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001108
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001109#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001110static int blowfish_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
1111 unsigned char *nonce_counter, unsigned char *stream_block,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001112 const unsigned char *input, unsigned char *output )
1113{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001114 return mbedtls_blowfish_crypt_ctr( (mbedtls_blowfish_context *) ctx, length, nc_off,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001115 nonce_counter, stream_block, input, output );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001116}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001117#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001118
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001119static int blowfish_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001120 unsigned int key_bitlen )
Paul Bakker6132d0a2012-07-04 17:10:40 +00001121{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001122 return mbedtls_blowfish_setkey( (mbedtls_blowfish_context *) ctx, key, key_bitlen );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001123}
1124
1125static void * blowfish_ctx_alloc( void )
1126{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001127 mbedtls_blowfish_context *ctx;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001128 ctx = mbedtls_calloc( 1, sizeof( mbedtls_blowfish_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001129
1130 if( ctx == NULL )
1131 return( NULL );
1132
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001133 mbedtls_blowfish_init( ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001134
1135 return( ctx );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001136}
1137
1138static void blowfish_ctx_free( void *ctx )
1139{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001140 mbedtls_blowfish_free( (mbedtls_blowfish_context *) ctx );
1141 mbedtls_free( ctx );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001142}
1143
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001144static const mbedtls_cipher_base_t blowfish_info = {
1145 MBEDTLS_CIPHER_ID_BLOWFISH,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001146 blowfish_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001147#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001148 blowfish_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001149#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001150#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001151 blowfish_crypt_cfb64_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001152#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001153#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001154 blowfish_crypt_ctr_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001155#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001156#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001157 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001158#endif
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001159 blowfish_setkey_wrap,
1160 blowfish_setkey_wrap,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001161 blowfish_ctx_alloc,
1162 blowfish_ctx_free
1163};
1164
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001165static const mbedtls_cipher_info_t blowfish_ecb_info = {
1166 MBEDTLS_CIPHER_BLOWFISH_ECB,
1167 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001168 128,
1169 "BLOWFISH-ECB",
1170 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001171 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001172 8,
1173 &blowfish_info
1174};
1175
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001176#if defined(MBEDTLS_CIPHER_MODE_CBC)
1177static const mbedtls_cipher_info_t blowfish_cbc_info = {
1178 MBEDTLS_CIPHER_BLOWFISH_CBC,
1179 MBEDTLS_MODE_CBC,
Paul Bakkerbfe671f2013-04-07 22:35:44 +02001180 128,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001181 "BLOWFISH-CBC",
1182 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001183 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001184 8,
1185 &blowfish_info
1186};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001187#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001188
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001189#if defined(MBEDTLS_CIPHER_MODE_CFB)
1190static const mbedtls_cipher_info_t blowfish_cfb64_info = {
1191 MBEDTLS_CIPHER_BLOWFISH_CFB64,
1192 MBEDTLS_MODE_CFB,
Paul Bakkerbfe671f2013-04-07 22:35:44 +02001193 128,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001194 "BLOWFISH-CFB64",
1195 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001196 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001197 8,
1198 &blowfish_info
1199};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001200#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001201
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001202#if defined(MBEDTLS_CIPHER_MODE_CTR)
1203static const mbedtls_cipher_info_t blowfish_ctr_info = {
1204 MBEDTLS_CIPHER_BLOWFISH_CTR,
1205 MBEDTLS_MODE_CTR,
Paul Bakkerbfe671f2013-04-07 22:35:44 +02001206 128,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001207 "BLOWFISH-CTR",
1208 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001209 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001210 8,
1211 &blowfish_info
1212};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001213#endif /* MBEDTLS_CIPHER_MODE_CTR */
1214#endif /* MBEDTLS_BLOWFISH_C */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001215
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001216#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001217static int arc4_crypt_stream_wrap( void *ctx, size_t length,
1218 const unsigned char *input,
1219 unsigned char *output )
Paul Bakker68884e32013-01-07 18:20:04 +01001220{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001221 return( mbedtls_arc4_crypt( (mbedtls_arc4_context *) ctx, length, input, output ) );
Paul Bakker68884e32013-01-07 18:20:04 +01001222}
1223
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001224static int arc4_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001225 unsigned int key_bitlen )
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001226{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001227 /* we get key_bitlen in bits, arc4 expects it in bytes */
1228 if( key_bitlen % 8 != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001229 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardce411252013-09-04 12:28:37 +02001230
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001231 mbedtls_arc4_setup( (mbedtls_arc4_context *) ctx, key, key_bitlen / 8 );
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001232 return( 0 );
1233}
1234
1235static void * arc4_ctx_alloc( void )
1236{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001237 mbedtls_arc4_context *ctx;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001238 ctx = mbedtls_calloc( 1, sizeof( mbedtls_arc4_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001239
1240 if( ctx == NULL )
1241 return( NULL );
1242
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001243 mbedtls_arc4_init( ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001244
1245 return( ctx );
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001246}
Paul Bakker68884e32013-01-07 18:20:04 +01001247
1248static void arc4_ctx_free( void *ctx )
1249{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001250 mbedtls_arc4_free( (mbedtls_arc4_context *) ctx );
1251 mbedtls_free( ctx );
Paul Bakker68884e32013-01-07 18:20:04 +01001252}
1253
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001254static const mbedtls_cipher_base_t arc4_base_info = {
1255 MBEDTLS_CIPHER_ID_ARC4,
Paul Bakker68884e32013-01-07 18:20:04 +01001256 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001257#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker68884e32013-01-07 18:20:04 +01001258 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001259#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001260#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker68884e32013-01-07 18:20:04 +01001261 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001262#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001263#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker5e0efa72013-09-08 23:04:04 +02001264 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001265#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001266#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001267 arc4_crypt_stream_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001268#endif
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001269 arc4_setkey_wrap,
1270 arc4_setkey_wrap,
Paul Bakker68884e32013-01-07 18:20:04 +01001271 arc4_ctx_alloc,
1272 arc4_ctx_free
1273};
1274
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001275static const mbedtls_cipher_info_t arc4_128_info = {
1276 MBEDTLS_CIPHER_ARC4_128,
1277 MBEDTLS_MODE_STREAM,
Paul Bakker68884e32013-01-07 18:20:04 +01001278 128,
1279 "ARC4-128",
1280 0,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001281 0,
Paul Bakker68884e32013-01-07 18:20:04 +01001282 1,
1283 &arc4_base_info
1284};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001285#endif /* MBEDTLS_ARC4_C */
Paul Bakker68884e32013-01-07 18:20:04 +01001286
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001287#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001288static int null_crypt_stream( void *ctx, size_t length,
1289 const unsigned char *input,
1290 unsigned char *output )
1291{
1292 ((void) ctx);
1293 memmove( output, input, length );
1294 return( 0 );
1295}
1296
1297static int null_setkey( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001298 unsigned int key_bitlen )
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001299{
1300 ((void) ctx);
1301 ((void) key);
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001302 ((void) key_bitlen);
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001303
1304 return( 0 );
1305}
1306
Paul Bakkerfab5c822012-02-06 16:45:10 +00001307static void * null_ctx_alloc( void )
1308{
Manuel Pégourié-Gonnard86bbc7f2014-07-12 02:14:41 +02001309 return( (void *) 1 );
Paul Bakkerfab5c822012-02-06 16:45:10 +00001310}
1311
Paul Bakkerfab5c822012-02-06 16:45:10 +00001312static void null_ctx_free( void *ctx )
1313{
1314 ((void) ctx);
1315}
1316
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001317static const mbedtls_cipher_base_t null_base_info = {
1318 MBEDTLS_CIPHER_ID_NULL,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001319 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001320#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerfab5c822012-02-06 16:45:10 +00001321 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001322#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001323#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakkerfab5c822012-02-06 16:45:10 +00001324 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001325#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001326#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker5e0efa72013-09-08 23:04:04 +02001327 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001328#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001329#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001330 null_crypt_stream,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001331#endif
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001332 null_setkey,
1333 null_setkey,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001334 null_ctx_alloc,
1335 null_ctx_free
1336};
1337
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001338static const mbedtls_cipher_info_t null_cipher_info = {
1339 MBEDTLS_CIPHER_NULL,
1340 MBEDTLS_MODE_STREAM,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001341 0,
1342 "NULL",
Paul Bakker68884e32013-01-07 18:20:04 +01001343 0,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001344 0,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001345 1,
1346 &null_base_info
1347};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001348#endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */
Paul Bakkerfab5c822012-02-06 16:45:10 +00001349
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001350const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] =
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001351{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001352#if defined(MBEDTLS_AES_C)
1353 { MBEDTLS_CIPHER_AES_128_ECB, &aes_128_ecb_info },
1354 { MBEDTLS_CIPHER_AES_192_ECB, &aes_192_ecb_info },
1355 { MBEDTLS_CIPHER_AES_256_ECB, &aes_256_ecb_info },
1356#if defined(MBEDTLS_CIPHER_MODE_CBC)
1357 { MBEDTLS_CIPHER_AES_128_CBC, &aes_128_cbc_info },
1358 { MBEDTLS_CIPHER_AES_192_CBC, &aes_192_cbc_info },
1359 { MBEDTLS_CIPHER_AES_256_CBC, &aes_256_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001360#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001361#if defined(MBEDTLS_CIPHER_MODE_CFB)
1362 { MBEDTLS_CIPHER_AES_128_CFB128, &aes_128_cfb128_info },
1363 { MBEDTLS_CIPHER_AES_192_CFB128, &aes_192_cfb128_info },
1364 { MBEDTLS_CIPHER_AES_256_CFB128, &aes_256_cfb128_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001365#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001366#if defined(MBEDTLS_CIPHER_MODE_CTR)
1367 { MBEDTLS_CIPHER_AES_128_CTR, &aes_128_ctr_info },
1368 { MBEDTLS_CIPHER_AES_192_CTR, &aes_192_ctr_info },
1369 { MBEDTLS_CIPHER_AES_256_CTR, &aes_256_ctr_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001370#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001371#if defined(MBEDTLS_GCM_C)
1372 { MBEDTLS_CIPHER_AES_128_GCM, &aes_128_gcm_info },
1373 { MBEDTLS_CIPHER_AES_192_GCM, &aes_192_gcm_info },
1374 { MBEDTLS_CIPHER_AES_256_GCM, &aes_256_gcm_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001375#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001376#if defined(MBEDTLS_CCM_C)
1377 { MBEDTLS_CIPHER_AES_128_CCM, &aes_128_ccm_info },
1378 { MBEDTLS_CIPHER_AES_192_CCM, &aes_192_ccm_info },
1379 { MBEDTLS_CIPHER_AES_256_CCM, &aes_256_ccm_info },
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +02001380#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001381#endif /* MBEDTLS_AES_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001382
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001383#if defined(MBEDTLS_ARC4_C)
1384 { MBEDTLS_CIPHER_ARC4_128, &arc4_128_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001385#endif
1386
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001387#if defined(MBEDTLS_BLOWFISH_C)
1388 { MBEDTLS_CIPHER_BLOWFISH_ECB, &blowfish_ecb_info },
1389#if defined(MBEDTLS_CIPHER_MODE_CBC)
1390 { MBEDTLS_CIPHER_BLOWFISH_CBC, &blowfish_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001391#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001392#if defined(MBEDTLS_CIPHER_MODE_CFB)
1393 { MBEDTLS_CIPHER_BLOWFISH_CFB64, &blowfish_cfb64_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001394#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001395#if defined(MBEDTLS_CIPHER_MODE_CTR)
1396 { MBEDTLS_CIPHER_BLOWFISH_CTR, &blowfish_ctr_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001397#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001398#endif /* MBEDTLS_BLOWFISH_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001399
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001400#if defined(MBEDTLS_CAMELLIA_C)
1401 { MBEDTLS_CIPHER_CAMELLIA_128_ECB, &camellia_128_ecb_info },
1402 { MBEDTLS_CIPHER_CAMELLIA_192_ECB, &camellia_192_ecb_info },
1403 { MBEDTLS_CIPHER_CAMELLIA_256_ECB, &camellia_256_ecb_info },
1404#if defined(MBEDTLS_CIPHER_MODE_CBC)
1405 { MBEDTLS_CIPHER_CAMELLIA_128_CBC, &camellia_128_cbc_info },
1406 { MBEDTLS_CIPHER_CAMELLIA_192_CBC, &camellia_192_cbc_info },
1407 { MBEDTLS_CIPHER_CAMELLIA_256_CBC, &camellia_256_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001408#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001409#if defined(MBEDTLS_CIPHER_MODE_CFB)
1410 { MBEDTLS_CIPHER_CAMELLIA_128_CFB128, &camellia_128_cfb128_info },
1411 { MBEDTLS_CIPHER_CAMELLIA_192_CFB128, &camellia_192_cfb128_info },
1412 { MBEDTLS_CIPHER_CAMELLIA_256_CFB128, &camellia_256_cfb128_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001413#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001414#if defined(MBEDTLS_CIPHER_MODE_CTR)
1415 { MBEDTLS_CIPHER_CAMELLIA_128_CTR, &camellia_128_ctr_info },
1416 { MBEDTLS_CIPHER_CAMELLIA_192_CTR, &camellia_192_ctr_info },
1417 { MBEDTLS_CIPHER_CAMELLIA_256_CTR, &camellia_256_ctr_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001418#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001419#if defined(MBEDTLS_GCM_C)
1420 { MBEDTLS_CIPHER_CAMELLIA_128_GCM, &camellia_128_gcm_info },
1421 { MBEDTLS_CIPHER_CAMELLIA_192_GCM, &camellia_192_gcm_info },
1422 { MBEDTLS_CIPHER_CAMELLIA_256_GCM, &camellia_256_gcm_info },
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +02001423#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001424#if defined(MBEDTLS_CCM_C)
1425 { MBEDTLS_CIPHER_CAMELLIA_128_CCM, &camellia_128_ccm_info },
1426 { MBEDTLS_CIPHER_CAMELLIA_192_CCM, &camellia_192_ccm_info },
1427 { MBEDTLS_CIPHER_CAMELLIA_256_CCM, &camellia_256_ccm_info },
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +02001428#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001429#endif /* MBEDTLS_CAMELLIA_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001430
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001431#if defined(MBEDTLS_DES_C)
1432 { MBEDTLS_CIPHER_DES_ECB, &des_ecb_info },
1433 { MBEDTLS_CIPHER_DES_EDE_ECB, &des_ede_ecb_info },
1434 { MBEDTLS_CIPHER_DES_EDE3_ECB, &des_ede3_ecb_info },
1435#if defined(MBEDTLS_CIPHER_MODE_CBC)
1436 { MBEDTLS_CIPHER_DES_CBC, &des_cbc_info },
1437 { MBEDTLS_CIPHER_DES_EDE_CBC, &des_ede_cbc_info },
1438 { MBEDTLS_CIPHER_DES_EDE3_CBC, &des_ede3_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001439#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001440#endif /* MBEDTLS_DES_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001441
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001442#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
1443 { MBEDTLS_CIPHER_NULL, &null_cipher_info },
1444#endif /* MBEDTLS_CIPHER_NULL_CIPHER */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001445
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001446 { MBEDTLS_CIPHER_NONE, NULL }
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001447};
1448
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001449#define NUM_CIPHERS sizeof mbedtls_cipher_definitions / sizeof mbedtls_cipher_definitions[0]
1450int mbedtls_cipher_supported[NUM_CIPHERS];
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001451
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001452#endif /* MBEDTLS_CIPHER_C */