blob: dc76af8ff4c19145dd833b97eef2c3668b4065a1 [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é-Gonnard6fb81872015-07-27 11:11:48 +02008 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
Manuel Pégourié-Gonnard37ff1402015-09-04 14:21:07 +02009 * SPDX-License-Identifier: Apache-2.0
10 *
11 * Licensed under the Apache License, Version 2.0 (the "License"); you may
12 * not use this file except in compliance with the License.
13 * You may obtain a copy of the License at
14 *
15 * http://www.apache.org/licenses/LICENSE-2.0
16 *
17 * Unless required by applicable law or agreed to in writing, software
18 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
19 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
20 * See the License for the specific language governing permissions and
21 * limitations under the License.
Paul Bakker8123e9d2011-01-06 15:37:30 +000022 *
Manuel Pégourié-Gonnardfe446432015-03-06 13:17:10 +000023 * This file is part of mbed TLS (https://tls.mbed.org)
Paul Bakker8123e9d2011-01-06 15:37:30 +000024 */
25
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020026#if !defined(MBEDTLS_CONFIG_FILE)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000027#include "mbedtls/config.h"
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020028#else
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020029#include MBEDTLS_CONFIG_FILE
Manuel Pégourié-Gonnardcef4ad22014-04-29 12:39:06 +020030#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +000031
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020032#if defined(MBEDTLS_CIPHER_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +000033
Manuel Pégourié-Gonnard50518f42015-05-26 11:04:15 +020034#include "mbedtls/cipher_internal.h"
Paul Bakkerf6543712012-03-05 14:01:29 +000035
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020036#if defined(MBEDTLS_AES_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000037#include "mbedtls/aes.h"
Paul Bakkerf6543712012-03-05 14:01:29 +000038#endif
39
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020040#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000041#include "mbedtls/arc4.h"
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +020042#endif
43
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020044#if defined(MBEDTLS_CAMELLIA_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000045#include "mbedtls/camellia.h"
Paul Bakkerf6543712012-03-05 14:01:29 +000046#endif
47
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020048#if defined(MBEDTLS_DES_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000049#include "mbedtls/des.h"
Paul Bakker02f61692012-03-15 10:54:25 +000050#endif
Paul Bakker8123e9d2011-01-06 15:37:30 +000051
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020052#if defined(MBEDTLS_BLOWFISH_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000053#include "mbedtls/blowfish.h"
Paul Bakker6132d0a2012-07-04 17:10:40 +000054#endif
55
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020056#if defined(MBEDTLS_GCM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000057#include "mbedtls/gcm.h"
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +020058#endif
59
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020060#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000061#include "mbedtls/ccm.h"
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +020062#endif
63
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020064#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
Manuel Pégourié-Gonnard0c851ee2015-02-10 12:47:52 +000065#include <string.h>
66#endif
67
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020068#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000069#include "mbedtls/platform.h"
Paul Bakker6e339b52013-07-03 13:37:05 +020070#else
Rich Evans00ab4702015-02-06 13:43:58 +000071#include <stdlib.h>
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020072#define mbedtls_calloc calloc
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020073#define mbedtls_free free
Paul Bakker6e339b52013-07-03 13:37:05 +020074#endif
75
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020076#if defined(MBEDTLS_GCM_C)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020077/* shared by all GCM ciphers */
78static void *gcm_ctx_alloc( void )
79{
Manuel Pégourié-Gonnard96fb6852015-06-23 11:39:01 +020080 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_gcm_context ) );
81
82 if( ctx != NULL )
83 mbedtls_gcm_init( (mbedtls_gcm_context *) ctx );
84
85 return( ctx );
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020086}
87
88static void gcm_ctx_free( void *ctx )
89{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020090 mbedtls_gcm_free( ctx );
91 mbedtls_free( ctx );
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020092}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020093#endif /* MBEDTLS_GCM_C */
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020094
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020095#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +020096/* shared by all CCM ciphers */
97static void *ccm_ctx_alloc( void )
98{
Manuel Pégourié-Gonnard96fb6852015-06-23 11:39:01 +020099 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ccm_context ) );
100
101 if( ctx != NULL )
102 mbedtls_ccm_init( (mbedtls_ccm_context *) ctx );
103
104 return( ctx );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200105}
106
107static void ccm_ctx_free( void *ctx )
108{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200109 mbedtls_ccm_free( ctx );
110 mbedtls_free( ctx );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200111}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200112#endif /* MBEDTLS_CCM_C */
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200113
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200114#if defined(MBEDTLS_AES_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +0000115
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200116static int aes_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200117 const unsigned char *input, unsigned char *output )
118{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200119 return mbedtls_aes_crypt_ecb( (mbedtls_aes_context *) ctx, operation, input, output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200120}
121
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200122#if defined(MBEDTLS_CIPHER_MODE_CBC)
123static int aes_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000124 unsigned char *iv, const unsigned char *input, unsigned char *output )
125{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200126 return mbedtls_aes_crypt_cbc( (mbedtls_aes_context *) ctx, operation, length, iv, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200127 output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000128}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200129#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000130
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200131#if defined(MBEDTLS_CIPHER_MODE_CFB)
132static int aes_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200133 size_t length, size_t *iv_off, unsigned char *iv,
134 const unsigned char *input, unsigned char *output )
Paul Bakker343a8702011-06-09 14:27:58 +0000135{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200136 return mbedtls_aes_crypt_cfb128( (mbedtls_aes_context *) ctx, operation, length, iv_off, iv,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200137 input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000138}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200139#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000140
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200141#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200142static int aes_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
143 unsigned char *nonce_counter, unsigned char *stream_block,
Paul Bakker343a8702011-06-09 14:27:58 +0000144 const unsigned char *input, unsigned char *output )
145{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200146 return mbedtls_aes_crypt_ctr( (mbedtls_aes_context *) ctx, length, nc_off, nonce_counter,
Paul Bakker343a8702011-06-09 14:27:58 +0000147 stream_block, input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000148}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200149#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000150
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200151static int aes_setkey_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200152 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000153{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200154 return mbedtls_aes_setkey_dec( (mbedtls_aes_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000155}
156
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200157static int aes_setkey_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200158 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000159{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200160 return mbedtls_aes_setkey_enc( (mbedtls_aes_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000161}
162
163static void * aes_ctx_alloc( void )
164{
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200165 mbedtls_aes_context *aes = mbedtls_calloc( 1, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200166
167 if( aes == NULL )
168 return( NULL );
169
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200170 mbedtls_aes_init( aes );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200171
172 return( aes );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000173}
174
175static void aes_ctx_free( void *ctx )
176{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200177 mbedtls_aes_free( (mbedtls_aes_context *) ctx );
178 mbedtls_free( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000179}
180
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200181static const mbedtls_cipher_base_t aes_info = {
182 MBEDTLS_CIPHER_ID_AES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200183 aes_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200184#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker343a8702011-06-09 14:27:58 +0000185 aes_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100186#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200187#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker343a8702011-06-09 14:27:58 +0000188 aes_crypt_cfb128_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100189#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200190#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker343a8702011-06-09 14:27:58 +0000191 aes_crypt_ctr_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100192#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200193#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +0200194 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100195#endif
Paul Bakker343a8702011-06-09 14:27:58 +0000196 aes_setkey_enc_wrap,
197 aes_setkey_dec_wrap,
198 aes_ctx_alloc,
199 aes_ctx_free
200};
201
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200202static const mbedtls_cipher_info_t aes_128_ecb_info = {
203 MBEDTLS_CIPHER_AES_128_ECB,
204 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200205 128,
206 "AES-128-ECB",
207 16,
208 0,
209 16,
210 &aes_info
211};
212
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200213static const mbedtls_cipher_info_t aes_192_ecb_info = {
214 MBEDTLS_CIPHER_AES_192_ECB,
215 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200216 192,
217 "AES-192-ECB",
218 16,
219 0,
220 16,
221 &aes_info
222};
223
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200224static const mbedtls_cipher_info_t aes_256_ecb_info = {
225 MBEDTLS_CIPHER_AES_256_ECB,
226 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200227 256,
228 "AES-256-ECB",
229 16,
230 0,
231 16,
232 &aes_info
233};
234
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200235#if defined(MBEDTLS_CIPHER_MODE_CBC)
236static const mbedtls_cipher_info_t aes_128_cbc_info = {
237 MBEDTLS_CIPHER_AES_128_CBC,
238 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000239 128,
240 "AES-128-CBC",
241 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200242 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000243 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000244 &aes_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000245};
246
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200247static const mbedtls_cipher_info_t aes_192_cbc_info = {
248 MBEDTLS_CIPHER_AES_192_CBC,
249 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000250 192,
251 "AES-192-CBC",
252 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200253 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000254 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000255 &aes_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000256};
257
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200258static const mbedtls_cipher_info_t aes_256_cbc_info = {
259 MBEDTLS_CIPHER_AES_256_CBC,
260 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000261 256,
262 "AES-256-CBC",
263 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200264 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000265 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000266 &aes_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000267};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200268#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +0000269
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200270#if defined(MBEDTLS_CIPHER_MODE_CFB)
271static const mbedtls_cipher_info_t aes_128_cfb128_info = {
272 MBEDTLS_CIPHER_AES_128_CFB128,
273 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000274 128,
275 "AES-128-CFB128",
276 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200277 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000278 16,
279 &aes_info
280};
281
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200282static const mbedtls_cipher_info_t aes_192_cfb128_info = {
283 MBEDTLS_CIPHER_AES_192_CFB128,
284 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000285 192,
286 "AES-192-CFB128",
287 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200288 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000289 16,
290 &aes_info
291};
292
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200293static const mbedtls_cipher_info_t aes_256_cfb128_info = {
294 MBEDTLS_CIPHER_AES_256_CFB128,
295 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000296 256,
297 "AES-256-CFB128",
298 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200299 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000300 16,
301 &aes_info
302};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200303#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000304
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200305#if defined(MBEDTLS_CIPHER_MODE_CTR)
306static const mbedtls_cipher_info_t aes_128_ctr_info = {
307 MBEDTLS_CIPHER_AES_128_CTR,
308 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000309 128,
310 "AES-128-CTR",
311 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200312 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000313 16,
314 &aes_info
315};
316
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200317static const mbedtls_cipher_info_t aes_192_ctr_info = {
318 MBEDTLS_CIPHER_AES_192_CTR,
319 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000320 192,
321 "AES-192-CTR",
322 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200323 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000324 16,
325 &aes_info
326};
327
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200328static const mbedtls_cipher_info_t aes_256_ctr_info = {
329 MBEDTLS_CIPHER_AES_256_CTR,
330 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000331 256,
332 "AES-256-CTR",
333 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200334 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000335 16,
336 &aes_info
337};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200338#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000339
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200340#if defined(MBEDTLS_GCM_C)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200341static int gcm_aes_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200342 unsigned int key_bitlen )
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200343{
Manuel Pégourié-Gonnardc34e8dd2015-04-28 21:42:17 +0200344 return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200345 key, key_bitlen );
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200346}
347
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200348static const mbedtls_cipher_base_t gcm_aes_info = {
349 MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200350 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200351#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200352 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100353#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200354#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200355 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100356#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200357#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200358 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100359#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200360#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Paul Bakker5e0efa72013-09-08 23:04:04 +0200361 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100362#endif
Paul Bakker43aff2a2013-09-09 00:10:27 +0200363 gcm_aes_setkey_wrap,
364 gcm_aes_setkey_wrap,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200365 gcm_ctx_alloc,
366 gcm_ctx_free,
367};
368
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200369static const mbedtls_cipher_info_t aes_128_gcm_info = {
370 MBEDTLS_CIPHER_AES_128_GCM,
371 MBEDTLS_MODE_GCM,
Paul Bakker68884e32013-01-07 18:20:04 +0100372 128,
373 "AES-128-GCM",
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200374 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200375 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Paul Bakker68884e32013-01-07 18:20:04 +0100376 16,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200377 &gcm_aes_info
Paul Bakker68884e32013-01-07 18:20:04 +0100378};
379
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200380static const mbedtls_cipher_info_t aes_192_gcm_info = {
381 MBEDTLS_CIPHER_AES_192_GCM,
382 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard83f3fc02013-09-04 12:07:24 +0200383 192,
384 "AES-192-GCM",
385 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200386 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard83f3fc02013-09-04 12:07:24 +0200387 16,
388 &gcm_aes_info
389};
390
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200391static const mbedtls_cipher_info_t aes_256_gcm_info = {
392 MBEDTLS_CIPHER_AES_256_GCM,
393 MBEDTLS_MODE_GCM,
Paul Bakker68884e32013-01-07 18:20:04 +0100394 256,
395 "AES-256-GCM",
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200396 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200397 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Paul Bakker68884e32013-01-07 18:20:04 +0100398 16,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200399 &gcm_aes_info
Paul Bakker68884e32013-01-07 18:20:04 +0100400};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200401#endif /* MBEDTLS_GCM_C */
Paul Bakker68884e32013-01-07 18:20:04 +0100402
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200403#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200404static int ccm_aes_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200405 unsigned int key_bitlen )
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200406{
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200407 return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200408 key, key_bitlen );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200409}
410
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200411static const mbedtls_cipher_base_t ccm_aes_info = {
412 MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200413 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200414#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200415 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100416#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200417#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200418 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100419#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200420#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200421 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100422#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200423#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200424 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100425#endif
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200426 ccm_aes_setkey_wrap,
427 ccm_aes_setkey_wrap,
428 ccm_ctx_alloc,
429 ccm_ctx_free,
430};
431
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200432static const mbedtls_cipher_info_t aes_128_ccm_info = {
433 MBEDTLS_CIPHER_AES_128_CCM,
434 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200435 128,
436 "AES-128-CCM",
437 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200438 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200439 16,
440 &ccm_aes_info
441};
442
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200443static const mbedtls_cipher_info_t aes_192_ccm_info = {
444 MBEDTLS_CIPHER_AES_192_CCM,
445 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200446 192,
447 "AES-192-CCM",
448 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200449 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200450 16,
451 &ccm_aes_info
452};
453
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200454static const mbedtls_cipher_info_t aes_256_ccm_info = {
455 MBEDTLS_CIPHER_AES_256_CCM,
456 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200457 256,
458 "AES-256-CCM",
459 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200460 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200461 16,
462 &ccm_aes_info
463};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200464#endif /* MBEDTLS_CCM_C */
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200465
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200466#endif /* MBEDTLS_AES_C */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200468#if defined(MBEDTLS_CAMELLIA_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +0000469
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200470static int camellia_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200471 const unsigned char *input, unsigned char *output )
472{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200473 return mbedtls_camellia_crypt_ecb( (mbedtls_camellia_context *) ctx, operation, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200474 output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200475}
476
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200477#if defined(MBEDTLS_CIPHER_MODE_CBC)
478static int camellia_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200479 size_t length, unsigned char *iv,
480 const unsigned char *input, unsigned char *output )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000481{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200482 return mbedtls_camellia_crypt_cbc( (mbedtls_camellia_context *) ctx, operation, length, iv,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200483 input, output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000484}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200485#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000486
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200487#if defined(MBEDTLS_CIPHER_MODE_CFB)
488static int camellia_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200489 size_t length, size_t *iv_off, unsigned char *iv,
490 const unsigned char *input, unsigned char *output )
Paul Bakker343a8702011-06-09 14:27:58 +0000491{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200492 return mbedtls_camellia_crypt_cfb128( (mbedtls_camellia_context *) ctx, operation, length,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200493 iv_off, iv, input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000494}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200495#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000496
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200497#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200498static int camellia_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
499 unsigned char *nonce_counter, unsigned char *stream_block,
Paul Bakker343a8702011-06-09 14:27:58 +0000500 const unsigned char *input, unsigned char *output )
501{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200502 return mbedtls_camellia_crypt_ctr( (mbedtls_camellia_context *) ctx, length, nc_off,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200503 nonce_counter, stream_block, input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000504}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200505#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000506
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200507static int camellia_setkey_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200508 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000509{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200510 return mbedtls_camellia_setkey_dec( (mbedtls_camellia_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000511}
512
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200513static int camellia_setkey_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200514 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000515{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200516 return mbedtls_camellia_setkey_enc( (mbedtls_camellia_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000517}
518
519static void * camellia_ctx_alloc( void )
520{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200521 mbedtls_camellia_context *ctx;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200522 ctx = mbedtls_calloc( 1, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200523
524 if( ctx == NULL )
525 return( NULL );
526
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200527 mbedtls_camellia_init( ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200528
529 return( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000530}
531
532static void camellia_ctx_free( void *ctx )
533{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200534 mbedtls_camellia_free( (mbedtls_camellia_context *) ctx );
535 mbedtls_free( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000536}
537
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200538static const mbedtls_cipher_base_t camellia_info = {
539 MBEDTLS_CIPHER_ID_CAMELLIA,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200540 camellia_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200541#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker343a8702011-06-09 14:27:58 +0000542 camellia_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100543#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200544#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker343a8702011-06-09 14:27:58 +0000545 camellia_crypt_cfb128_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100546#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200547#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker343a8702011-06-09 14:27:58 +0000548 camellia_crypt_ctr_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100549#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200550#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +0200551 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100552#endif
Paul Bakker343a8702011-06-09 14:27:58 +0000553 camellia_setkey_enc_wrap,
554 camellia_setkey_dec_wrap,
555 camellia_ctx_alloc,
556 camellia_ctx_free
557};
558
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200559static const mbedtls_cipher_info_t camellia_128_ecb_info = {
560 MBEDTLS_CIPHER_CAMELLIA_128_ECB,
561 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200562 128,
563 "CAMELLIA-128-ECB",
564 16,
565 0,
566 16,
567 &camellia_info
568};
569
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200570static const mbedtls_cipher_info_t camellia_192_ecb_info = {
571 MBEDTLS_CIPHER_CAMELLIA_192_ECB,
572 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200573 192,
574 "CAMELLIA-192-ECB",
575 16,
576 0,
577 16,
578 &camellia_info
579};
580
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200581static const mbedtls_cipher_info_t camellia_256_ecb_info = {
582 MBEDTLS_CIPHER_CAMELLIA_256_ECB,
583 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200584 256,
585 "CAMELLIA-256-ECB",
586 16,
587 0,
588 16,
589 &camellia_info
590};
591
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200592#if defined(MBEDTLS_CIPHER_MODE_CBC)
593static const mbedtls_cipher_info_t camellia_128_cbc_info = {
594 MBEDTLS_CIPHER_CAMELLIA_128_CBC,
595 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000596 128,
597 "CAMELLIA-128-CBC",
598 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200599 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000600 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000601 &camellia_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000602};
603
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200604static const mbedtls_cipher_info_t camellia_192_cbc_info = {
605 MBEDTLS_CIPHER_CAMELLIA_192_CBC,
606 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000607 192,
608 "CAMELLIA-192-CBC",
609 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200610 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000611 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000612 &camellia_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000613};
614
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200615static const mbedtls_cipher_info_t camellia_256_cbc_info = {
616 MBEDTLS_CIPHER_CAMELLIA_256_CBC,
617 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000618 256,
619 "CAMELLIA-256-CBC",
620 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200621 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000622 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000623 &camellia_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000624};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200625#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +0000626
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200627#if defined(MBEDTLS_CIPHER_MODE_CFB)
628static const mbedtls_cipher_info_t camellia_128_cfb128_info = {
629 MBEDTLS_CIPHER_CAMELLIA_128_CFB128,
630 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000631 128,
632 "CAMELLIA-128-CFB128",
633 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200634 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000635 16,
636 &camellia_info
637};
638
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200639static const mbedtls_cipher_info_t camellia_192_cfb128_info = {
640 MBEDTLS_CIPHER_CAMELLIA_192_CFB128,
641 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000642 192,
643 "CAMELLIA-192-CFB128",
644 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200645 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000646 16,
647 &camellia_info
648};
649
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200650static const mbedtls_cipher_info_t camellia_256_cfb128_info = {
651 MBEDTLS_CIPHER_CAMELLIA_256_CFB128,
652 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000653 256,
654 "CAMELLIA-256-CFB128",
655 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200656 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000657 16,
658 &camellia_info
659};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200660#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000661
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200662#if defined(MBEDTLS_CIPHER_MODE_CTR)
663static const mbedtls_cipher_info_t camellia_128_ctr_info = {
664 MBEDTLS_CIPHER_CAMELLIA_128_CTR,
665 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000666 128,
667 "CAMELLIA-128-CTR",
668 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200669 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000670 16,
671 &camellia_info
672};
673
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200674static const mbedtls_cipher_info_t camellia_192_ctr_info = {
675 MBEDTLS_CIPHER_CAMELLIA_192_CTR,
676 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000677 192,
678 "CAMELLIA-192-CTR",
679 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200680 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000681 16,
682 &camellia_info
683};
684
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200685static const mbedtls_cipher_info_t camellia_256_ctr_info = {
686 MBEDTLS_CIPHER_CAMELLIA_256_CTR,
687 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000688 256,
689 "CAMELLIA-256-CTR",
690 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200691 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000692 16,
693 &camellia_info
694};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200695#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000696
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200697#if defined(MBEDTLS_GCM_C)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200698static int gcm_camellia_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200699 unsigned int key_bitlen )
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200700{
Manuel Pégourié-Gonnardc34e8dd2015-04-28 21:42:17 +0200701 return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200702 key, key_bitlen );
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200703}
704
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200705static const mbedtls_cipher_base_t gcm_camellia_info = {
706 MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200707 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200708#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200709 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100710#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200711#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200712 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100713#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200714#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200715 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100716#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200717#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200718 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100719#endif
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200720 gcm_camellia_setkey_wrap,
721 gcm_camellia_setkey_wrap,
722 gcm_ctx_alloc,
723 gcm_ctx_free,
724};
725
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200726static const mbedtls_cipher_info_t camellia_128_gcm_info = {
727 MBEDTLS_CIPHER_CAMELLIA_128_GCM,
728 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200729 128,
730 "CAMELLIA-128-GCM",
731 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200732 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200733 16,
734 &gcm_camellia_info
735};
736
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200737static const mbedtls_cipher_info_t camellia_192_gcm_info = {
738 MBEDTLS_CIPHER_CAMELLIA_192_GCM,
739 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200740 192,
741 "CAMELLIA-192-GCM",
742 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200743 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200744 16,
745 &gcm_camellia_info
746};
747
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200748static const mbedtls_cipher_info_t camellia_256_gcm_info = {
749 MBEDTLS_CIPHER_CAMELLIA_256_GCM,
750 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200751 256,
752 "CAMELLIA-256-GCM",
753 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200754 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200755 16,
756 &gcm_camellia_info
757};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200758#endif /* MBEDTLS_GCM_C */
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200759
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200760#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200761static int ccm_camellia_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200762 unsigned int key_bitlen )
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200763{
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200764 return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200765 key, key_bitlen );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200766}
767
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200768static const mbedtls_cipher_base_t ccm_camellia_info = {
769 MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200770 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200771#if defined(MBEDTLS_CIPHER_MODE_CBC)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200772 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100773#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200774#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200775 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100776#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200777#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200778 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100779#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200780#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200781 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100782#endif
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200783 ccm_camellia_setkey_wrap,
784 ccm_camellia_setkey_wrap,
785 ccm_ctx_alloc,
786 ccm_ctx_free,
787};
788
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200789static const mbedtls_cipher_info_t camellia_128_ccm_info = {
790 MBEDTLS_CIPHER_CAMELLIA_128_CCM,
791 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200792 128,
793 "CAMELLIA-128-CCM",
794 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200795 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200796 16,
797 &ccm_camellia_info
798};
799
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200800static const mbedtls_cipher_info_t camellia_192_ccm_info = {
801 MBEDTLS_CIPHER_CAMELLIA_192_CCM,
802 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200803 192,
804 "CAMELLIA-192-CCM",
805 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200806 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200807 16,
808 &ccm_camellia_info
809};
810
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200811static const mbedtls_cipher_info_t camellia_256_ccm_info = {
812 MBEDTLS_CIPHER_CAMELLIA_256_CCM,
813 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200814 256,
815 "CAMELLIA-256-CCM",
816 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200817 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200818 16,
819 &ccm_camellia_info
820};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200821#endif /* MBEDTLS_CCM_C */
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200822
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200823#endif /* MBEDTLS_CAMELLIA_C */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000824
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200825#if defined(MBEDTLS_DES_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +0000826
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200827static int des_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200828 const unsigned char *input, unsigned char *output )
829{
830 ((void) operation);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200831 return mbedtls_des_crypt_ecb( (mbedtls_des_context *) ctx, input, output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200832}
833
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200834static int des3_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200835 const unsigned char *input, unsigned char *output )
836{
837 ((void) operation);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200838 return mbedtls_des3_crypt_ecb( (mbedtls_des3_context *) ctx, input, output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200839}
840
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200841#if defined(MBEDTLS_CIPHER_MODE_CBC)
842static int des_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000843 unsigned char *iv, const unsigned char *input, unsigned char *output )
844{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200845 return mbedtls_des_crypt_cbc( (mbedtls_des_context *) ctx, operation, length, iv, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200846 output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000847}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200848#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000849
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200850#if defined(MBEDTLS_CIPHER_MODE_CBC)
851static int des3_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000852 unsigned char *iv, const unsigned char *input, unsigned char *output )
853{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200854 return mbedtls_des3_crypt_cbc( (mbedtls_des3_context *) ctx, operation, length, iv, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200855 output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000856}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200857#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000858
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200859static int des_setkey_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200860 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000861{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200862 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000863
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200864 return mbedtls_des_setkey_dec( (mbedtls_des_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000865}
866
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200867static int des_setkey_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200868 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000869{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200870 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000871
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200872 return mbedtls_des_setkey_enc( (mbedtls_des_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000873}
874
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200875static int des3_set2key_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200876 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000877{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200878 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000879
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200880 return mbedtls_des3_set2key_dec( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000881}
882
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200883static int des3_set2key_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200884 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000885{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200886 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000887
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200888 return mbedtls_des3_set2key_enc( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000889}
890
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200891static int des3_set3key_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200892 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000893{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200894 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000895
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200896 return mbedtls_des3_set3key_dec( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000897}
898
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200899static int des3_set3key_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200900 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000901{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200902 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000903
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200904 return mbedtls_des3_set3key_enc( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000905}
906
907static void * des_ctx_alloc( void )
908{
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200909 mbedtls_des_context *des = mbedtls_calloc( 1, sizeof( mbedtls_des_context ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000910
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200911 if( des == NULL )
912 return( NULL );
913
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200914 mbedtls_des_init( des );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200915
916 return( des );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000917}
918
919static void des_ctx_free( void *ctx )
920{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200921 mbedtls_des_free( (mbedtls_des_context *) ctx );
922 mbedtls_free( ctx );
Paul Bakker34617722014-06-13 17:20:13 +0200923}
924
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200925static void * des3_ctx_alloc( void )
926{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200927 mbedtls_des3_context *des3;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200928 des3 = mbedtls_calloc( 1, sizeof( mbedtls_des3_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200929
930 if( des3 == NULL )
931 return( NULL );
932
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200933 mbedtls_des3_init( des3 );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200934
935 return( des3 );
936}
937
Paul Bakker34617722014-06-13 17:20:13 +0200938static void des3_ctx_free( void *ctx )
939{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200940 mbedtls_des3_free( (mbedtls_des3_context *) ctx );
941 mbedtls_free( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000942}
943
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200944static const mbedtls_cipher_base_t des_info = {
945 MBEDTLS_CIPHER_ID_DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200946 des_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200947#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker23986e52011-04-24 08:57:21 +0000948 des_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100949#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200950#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +0200951 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100952#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200953#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +0200954 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100955#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200956#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +0200957 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100958#endif
Paul Bakker23986e52011-04-24 08:57:21 +0000959 des_setkey_enc_wrap,
960 des_setkey_dec_wrap,
961 des_ctx_alloc,
962 des_ctx_free
Paul Bakker8123e9d2011-01-06 15:37:30 +0000963};
964
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200965static const mbedtls_cipher_info_t des_ecb_info = {
966 MBEDTLS_CIPHER_DES_ECB,
967 MBEDTLS_MODE_ECB,
968 MBEDTLS_KEY_LENGTH_DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200969 "DES-ECB",
970 8,
971 0,
972 8,
973 &des_info
974};
975
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200976#if defined(MBEDTLS_CIPHER_MODE_CBC)
977static const mbedtls_cipher_info_t des_cbc_info = {
978 MBEDTLS_CIPHER_DES_CBC,
979 MBEDTLS_MODE_CBC,
980 MBEDTLS_KEY_LENGTH_DES,
Paul Bakker343a8702011-06-09 14:27:58 +0000981 "DES-CBC",
982 8,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200983 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000984 8,
985 &des_info
986};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200987#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +0000988
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200989static const mbedtls_cipher_base_t des_ede_info = {
990 MBEDTLS_CIPHER_ID_DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200991 des3_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200992#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker23986e52011-04-24 08:57:21 +0000993 des3_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100994#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200995#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +0200996 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100997#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200998#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +0200999 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001000#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001001#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001002 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001003#endif
Paul Bakker23986e52011-04-24 08:57:21 +00001004 des3_set2key_enc_wrap,
1005 des3_set2key_dec_wrap,
1006 des3_ctx_alloc,
Paul Bakker34617722014-06-13 17:20:13 +02001007 des3_ctx_free
Paul Bakker8123e9d2011-01-06 15:37:30 +00001008};
1009
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001010static const mbedtls_cipher_info_t des_ede_ecb_info = {
1011 MBEDTLS_CIPHER_DES_EDE_ECB,
1012 MBEDTLS_MODE_ECB,
1013 MBEDTLS_KEY_LENGTH_DES_EDE,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001014 "DES-EDE-ECB",
1015 8,
1016 0,
1017 8,
1018 &des_ede_info
1019};
1020
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001021#if defined(MBEDTLS_CIPHER_MODE_CBC)
1022static const mbedtls_cipher_info_t des_ede_cbc_info = {
1023 MBEDTLS_CIPHER_DES_EDE_CBC,
1024 MBEDTLS_MODE_CBC,
1025 MBEDTLS_KEY_LENGTH_DES_EDE,
Paul Bakker343a8702011-06-09 14:27:58 +00001026 "DES-EDE-CBC",
Paul Bakker0e342352013-06-24 19:33:02 +02001027 8,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001028 0,
Paul Bakker0e342352013-06-24 19:33:02 +02001029 8,
Paul Bakker343a8702011-06-09 14:27:58 +00001030 &des_ede_info
1031};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001032#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +00001033
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001034static const mbedtls_cipher_base_t des_ede3_info = {
Manuel Pégourié-Gonnard9d515832015-06-02 10:00:04 +01001035 MBEDTLS_CIPHER_ID_3DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001036 des3_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001037#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker343a8702011-06-09 14:27:58 +00001038 des3_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001039#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001040#if defined(MBEDTLS_CIPHER_MODE_CFB)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +02001041 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001042#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001043#if defined(MBEDTLS_CIPHER_MODE_CTR)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +02001044 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001045#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001046#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001047 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001048#endif
Paul Bakker343a8702011-06-09 14:27:58 +00001049 des3_set3key_enc_wrap,
1050 des3_set3key_dec_wrap,
1051 des3_ctx_alloc,
Paul Bakker34617722014-06-13 17:20:13 +02001052 des3_ctx_free
Paul Bakker343a8702011-06-09 14:27:58 +00001053};
1054
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001055static const mbedtls_cipher_info_t des_ede3_ecb_info = {
1056 MBEDTLS_CIPHER_DES_EDE3_ECB,
1057 MBEDTLS_MODE_ECB,
1058 MBEDTLS_KEY_LENGTH_DES_EDE3,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001059 "DES-EDE3-ECB",
1060 8,
1061 0,
1062 8,
1063 &des_ede3_info
1064};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001065#if defined(MBEDTLS_CIPHER_MODE_CBC)
1066static const mbedtls_cipher_info_t des_ede3_cbc_info = {
1067 MBEDTLS_CIPHER_DES_EDE3_CBC,
1068 MBEDTLS_MODE_CBC,
1069 MBEDTLS_KEY_LENGTH_DES_EDE3,
Paul Bakker23986e52011-04-24 08:57:21 +00001070 "DES-EDE3-CBC",
1071 8,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001072 0,
Paul Bakker23986e52011-04-24 08:57:21 +00001073 8,
Paul Bakker343a8702011-06-09 14:27:58 +00001074 &des_ede3_info
Paul Bakker8123e9d2011-01-06 15:37:30 +00001075};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001076#endif /* MBEDTLS_CIPHER_MODE_CBC */
1077#endif /* MBEDTLS_DES_C */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001078
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001079#if defined(MBEDTLS_BLOWFISH_C)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001080
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001081static int blowfish_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001082 const unsigned char *input, unsigned char *output )
1083{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001084 return mbedtls_blowfish_crypt_ecb( (mbedtls_blowfish_context *) ctx, operation, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001085 output );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001086}
1087
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001088#if defined(MBEDTLS_CIPHER_MODE_CBC)
1089static int blowfish_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001090 size_t length, unsigned char *iv, const unsigned char *input,
1091 unsigned char *output )
Paul Bakker6132d0a2012-07-04 17:10:40 +00001092{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001093 return mbedtls_blowfish_crypt_cbc( (mbedtls_blowfish_context *) ctx, operation, length, iv,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001094 input, output );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001095}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001096#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001097
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001098#if defined(MBEDTLS_CIPHER_MODE_CFB)
1099static int blowfish_crypt_cfb64_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001100 size_t length, size_t *iv_off, unsigned char *iv,
1101 const unsigned char *input, unsigned char *output )
Paul Bakker6132d0a2012-07-04 17:10:40 +00001102{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001103 return mbedtls_blowfish_crypt_cfb64( (mbedtls_blowfish_context *) ctx, operation, length,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001104 iv_off, iv, input, output );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001105}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001106#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001107
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001108#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001109static int blowfish_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
1110 unsigned char *nonce_counter, unsigned char *stream_block,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001111 const unsigned char *input, unsigned char *output )
1112{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001113 return mbedtls_blowfish_crypt_ctr( (mbedtls_blowfish_context *) ctx, length, nc_off,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001114 nonce_counter, stream_block, input, output );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001115}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001116#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001117
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001118static int blowfish_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001119 unsigned int key_bitlen )
Paul Bakker6132d0a2012-07-04 17:10:40 +00001120{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001121 return mbedtls_blowfish_setkey( (mbedtls_blowfish_context *) ctx, key, key_bitlen );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001122}
1123
1124static void * blowfish_ctx_alloc( void )
1125{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001126 mbedtls_blowfish_context *ctx;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001127 ctx = mbedtls_calloc( 1, sizeof( mbedtls_blowfish_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001128
1129 if( ctx == NULL )
1130 return( NULL );
1131
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001132 mbedtls_blowfish_init( ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001133
1134 return( ctx );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001135}
1136
1137static void blowfish_ctx_free( void *ctx )
1138{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001139 mbedtls_blowfish_free( (mbedtls_blowfish_context *) ctx );
1140 mbedtls_free( ctx );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001141}
1142
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001143static const mbedtls_cipher_base_t blowfish_info = {
1144 MBEDTLS_CIPHER_ID_BLOWFISH,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001145 blowfish_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001146#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001147 blowfish_crypt_cbc_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001148#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001149#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001150 blowfish_crypt_cfb64_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001151#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001152#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001153 blowfish_crypt_ctr_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001154#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001155#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001156 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001157#endif
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001158 blowfish_setkey_wrap,
1159 blowfish_setkey_wrap,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001160 blowfish_ctx_alloc,
1161 blowfish_ctx_free
1162};
1163
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001164static const mbedtls_cipher_info_t blowfish_ecb_info = {
1165 MBEDTLS_CIPHER_BLOWFISH_ECB,
1166 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001167 128,
1168 "BLOWFISH-ECB",
1169 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001170 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001171 8,
1172 &blowfish_info
1173};
1174
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001175#if defined(MBEDTLS_CIPHER_MODE_CBC)
1176static const mbedtls_cipher_info_t blowfish_cbc_info = {
1177 MBEDTLS_CIPHER_BLOWFISH_CBC,
1178 MBEDTLS_MODE_CBC,
Paul Bakkerbfe671f2013-04-07 22:35:44 +02001179 128,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001180 "BLOWFISH-CBC",
1181 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001182 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001183 8,
1184 &blowfish_info
1185};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001186#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001187
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001188#if defined(MBEDTLS_CIPHER_MODE_CFB)
1189static const mbedtls_cipher_info_t blowfish_cfb64_info = {
1190 MBEDTLS_CIPHER_BLOWFISH_CFB64,
1191 MBEDTLS_MODE_CFB,
Paul Bakkerbfe671f2013-04-07 22:35:44 +02001192 128,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001193 "BLOWFISH-CFB64",
1194 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001195 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001196 8,
1197 &blowfish_info
1198};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001199#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001200
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001201#if defined(MBEDTLS_CIPHER_MODE_CTR)
1202static const mbedtls_cipher_info_t blowfish_ctr_info = {
1203 MBEDTLS_CIPHER_BLOWFISH_CTR,
1204 MBEDTLS_MODE_CTR,
Paul Bakkerbfe671f2013-04-07 22:35:44 +02001205 128,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001206 "BLOWFISH-CTR",
1207 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001208 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001209 8,
1210 &blowfish_info
1211};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001212#endif /* MBEDTLS_CIPHER_MODE_CTR */
1213#endif /* MBEDTLS_BLOWFISH_C */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001214
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001215#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001216static int arc4_crypt_stream_wrap( void *ctx, size_t length,
1217 const unsigned char *input,
1218 unsigned char *output )
Paul Bakker68884e32013-01-07 18:20:04 +01001219{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001220 return( mbedtls_arc4_crypt( (mbedtls_arc4_context *) ctx, length, input, output ) );
Paul Bakker68884e32013-01-07 18:20:04 +01001221}
1222
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001223static int arc4_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001224 unsigned int key_bitlen )
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001225{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001226 /* we get key_bitlen in bits, arc4 expects it in bytes */
1227 if( key_bitlen % 8 != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001228 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardce411252013-09-04 12:28:37 +02001229
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001230 mbedtls_arc4_setup( (mbedtls_arc4_context *) ctx, key, key_bitlen / 8 );
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001231 return( 0 );
1232}
1233
1234static void * arc4_ctx_alloc( void )
1235{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001236 mbedtls_arc4_context *ctx;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001237 ctx = mbedtls_calloc( 1, sizeof( mbedtls_arc4_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001238
1239 if( ctx == NULL )
1240 return( NULL );
1241
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001242 mbedtls_arc4_init( ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001243
1244 return( ctx );
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001245}
Paul Bakker68884e32013-01-07 18:20:04 +01001246
1247static void arc4_ctx_free( void *ctx )
1248{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001249 mbedtls_arc4_free( (mbedtls_arc4_context *) ctx );
1250 mbedtls_free( ctx );
Paul Bakker68884e32013-01-07 18:20:04 +01001251}
1252
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001253static const mbedtls_cipher_base_t arc4_base_info = {
1254 MBEDTLS_CIPHER_ID_ARC4,
Paul Bakker68884e32013-01-07 18:20:04 +01001255 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001256#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker68884e32013-01-07 18:20:04 +01001257 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001258#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001259#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakker68884e32013-01-07 18:20:04 +01001260 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001261#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001262#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker5e0efa72013-09-08 23:04:04 +02001263 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001264#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001265#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001266 arc4_crypt_stream_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001267#endif
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001268 arc4_setkey_wrap,
1269 arc4_setkey_wrap,
Paul Bakker68884e32013-01-07 18:20:04 +01001270 arc4_ctx_alloc,
1271 arc4_ctx_free
1272};
1273
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001274static const mbedtls_cipher_info_t arc4_128_info = {
1275 MBEDTLS_CIPHER_ARC4_128,
1276 MBEDTLS_MODE_STREAM,
Paul Bakker68884e32013-01-07 18:20:04 +01001277 128,
1278 "ARC4-128",
1279 0,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001280 0,
Paul Bakker68884e32013-01-07 18:20:04 +01001281 1,
1282 &arc4_base_info
1283};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001284#endif /* MBEDTLS_ARC4_C */
Paul Bakker68884e32013-01-07 18:20:04 +01001285
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001286#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001287static int null_crypt_stream( void *ctx, size_t length,
1288 const unsigned char *input,
1289 unsigned char *output )
1290{
1291 ((void) ctx);
1292 memmove( output, input, length );
1293 return( 0 );
1294}
1295
1296static int null_setkey( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001297 unsigned int key_bitlen )
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001298{
1299 ((void) ctx);
1300 ((void) key);
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001301 ((void) key_bitlen);
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001302
1303 return( 0 );
1304}
1305
Paul Bakkerfab5c822012-02-06 16:45:10 +00001306static void * null_ctx_alloc( void )
1307{
Manuel Pégourié-Gonnard86bbc7f2014-07-12 02:14:41 +02001308 return( (void *) 1 );
Paul Bakkerfab5c822012-02-06 16:45:10 +00001309}
1310
Paul Bakkerfab5c822012-02-06 16:45:10 +00001311static void null_ctx_free( void *ctx )
1312{
1313 ((void) ctx);
1314}
1315
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001316static const mbedtls_cipher_base_t null_base_info = {
1317 MBEDTLS_CIPHER_ID_NULL,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001318 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001319#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerfab5c822012-02-06 16:45:10 +00001320 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001321#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001322#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakkerfab5c822012-02-06 16:45:10 +00001323 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001324#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001325#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker5e0efa72013-09-08 23:04:04 +02001326 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001327#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001328#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001329 null_crypt_stream,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001330#endif
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001331 null_setkey,
1332 null_setkey,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001333 null_ctx_alloc,
1334 null_ctx_free
1335};
1336
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001337static const mbedtls_cipher_info_t null_cipher_info = {
1338 MBEDTLS_CIPHER_NULL,
1339 MBEDTLS_MODE_STREAM,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001340 0,
1341 "NULL",
Paul Bakker68884e32013-01-07 18:20:04 +01001342 0,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001343 0,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001344 1,
1345 &null_base_info
1346};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001347#endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */
Paul Bakkerfab5c822012-02-06 16:45:10 +00001348
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001349const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] =
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001350{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001351#if defined(MBEDTLS_AES_C)
1352 { MBEDTLS_CIPHER_AES_128_ECB, &aes_128_ecb_info },
1353 { MBEDTLS_CIPHER_AES_192_ECB, &aes_192_ecb_info },
1354 { MBEDTLS_CIPHER_AES_256_ECB, &aes_256_ecb_info },
1355#if defined(MBEDTLS_CIPHER_MODE_CBC)
1356 { MBEDTLS_CIPHER_AES_128_CBC, &aes_128_cbc_info },
1357 { MBEDTLS_CIPHER_AES_192_CBC, &aes_192_cbc_info },
1358 { MBEDTLS_CIPHER_AES_256_CBC, &aes_256_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001359#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001360#if defined(MBEDTLS_CIPHER_MODE_CFB)
1361 { MBEDTLS_CIPHER_AES_128_CFB128, &aes_128_cfb128_info },
1362 { MBEDTLS_CIPHER_AES_192_CFB128, &aes_192_cfb128_info },
1363 { MBEDTLS_CIPHER_AES_256_CFB128, &aes_256_cfb128_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001364#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001365#if defined(MBEDTLS_CIPHER_MODE_CTR)
1366 { MBEDTLS_CIPHER_AES_128_CTR, &aes_128_ctr_info },
1367 { MBEDTLS_CIPHER_AES_192_CTR, &aes_192_ctr_info },
1368 { MBEDTLS_CIPHER_AES_256_CTR, &aes_256_ctr_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001369#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001370#if defined(MBEDTLS_GCM_C)
1371 { MBEDTLS_CIPHER_AES_128_GCM, &aes_128_gcm_info },
1372 { MBEDTLS_CIPHER_AES_192_GCM, &aes_192_gcm_info },
1373 { MBEDTLS_CIPHER_AES_256_GCM, &aes_256_gcm_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001374#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001375#if defined(MBEDTLS_CCM_C)
1376 { MBEDTLS_CIPHER_AES_128_CCM, &aes_128_ccm_info },
1377 { MBEDTLS_CIPHER_AES_192_CCM, &aes_192_ccm_info },
1378 { MBEDTLS_CIPHER_AES_256_CCM, &aes_256_ccm_info },
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +02001379#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001380#endif /* MBEDTLS_AES_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001381
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001382#if defined(MBEDTLS_ARC4_C)
1383 { MBEDTLS_CIPHER_ARC4_128, &arc4_128_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001384#endif
1385
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001386#if defined(MBEDTLS_BLOWFISH_C)
1387 { MBEDTLS_CIPHER_BLOWFISH_ECB, &blowfish_ecb_info },
1388#if defined(MBEDTLS_CIPHER_MODE_CBC)
1389 { MBEDTLS_CIPHER_BLOWFISH_CBC, &blowfish_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001390#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001391#if defined(MBEDTLS_CIPHER_MODE_CFB)
1392 { MBEDTLS_CIPHER_BLOWFISH_CFB64, &blowfish_cfb64_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001393#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001394#if defined(MBEDTLS_CIPHER_MODE_CTR)
1395 { MBEDTLS_CIPHER_BLOWFISH_CTR, &blowfish_ctr_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001396#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001397#endif /* MBEDTLS_BLOWFISH_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001398
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001399#if defined(MBEDTLS_CAMELLIA_C)
1400 { MBEDTLS_CIPHER_CAMELLIA_128_ECB, &camellia_128_ecb_info },
1401 { MBEDTLS_CIPHER_CAMELLIA_192_ECB, &camellia_192_ecb_info },
1402 { MBEDTLS_CIPHER_CAMELLIA_256_ECB, &camellia_256_ecb_info },
1403#if defined(MBEDTLS_CIPHER_MODE_CBC)
1404 { MBEDTLS_CIPHER_CAMELLIA_128_CBC, &camellia_128_cbc_info },
1405 { MBEDTLS_CIPHER_CAMELLIA_192_CBC, &camellia_192_cbc_info },
1406 { MBEDTLS_CIPHER_CAMELLIA_256_CBC, &camellia_256_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001407#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001408#if defined(MBEDTLS_CIPHER_MODE_CFB)
1409 { MBEDTLS_CIPHER_CAMELLIA_128_CFB128, &camellia_128_cfb128_info },
1410 { MBEDTLS_CIPHER_CAMELLIA_192_CFB128, &camellia_192_cfb128_info },
1411 { MBEDTLS_CIPHER_CAMELLIA_256_CFB128, &camellia_256_cfb128_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001412#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001413#if defined(MBEDTLS_CIPHER_MODE_CTR)
1414 { MBEDTLS_CIPHER_CAMELLIA_128_CTR, &camellia_128_ctr_info },
1415 { MBEDTLS_CIPHER_CAMELLIA_192_CTR, &camellia_192_ctr_info },
1416 { MBEDTLS_CIPHER_CAMELLIA_256_CTR, &camellia_256_ctr_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001417#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001418#if defined(MBEDTLS_GCM_C)
1419 { MBEDTLS_CIPHER_CAMELLIA_128_GCM, &camellia_128_gcm_info },
1420 { MBEDTLS_CIPHER_CAMELLIA_192_GCM, &camellia_192_gcm_info },
1421 { MBEDTLS_CIPHER_CAMELLIA_256_GCM, &camellia_256_gcm_info },
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +02001422#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001423#if defined(MBEDTLS_CCM_C)
1424 { MBEDTLS_CIPHER_CAMELLIA_128_CCM, &camellia_128_ccm_info },
1425 { MBEDTLS_CIPHER_CAMELLIA_192_CCM, &camellia_192_ccm_info },
1426 { MBEDTLS_CIPHER_CAMELLIA_256_CCM, &camellia_256_ccm_info },
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +02001427#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001428#endif /* MBEDTLS_CAMELLIA_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001429
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001430#if defined(MBEDTLS_DES_C)
1431 { MBEDTLS_CIPHER_DES_ECB, &des_ecb_info },
1432 { MBEDTLS_CIPHER_DES_EDE_ECB, &des_ede_ecb_info },
1433 { MBEDTLS_CIPHER_DES_EDE3_ECB, &des_ede3_ecb_info },
1434#if defined(MBEDTLS_CIPHER_MODE_CBC)
1435 { MBEDTLS_CIPHER_DES_CBC, &des_cbc_info },
1436 { MBEDTLS_CIPHER_DES_EDE_CBC, &des_ede_cbc_info },
1437 { MBEDTLS_CIPHER_DES_EDE3_CBC, &des_ede3_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001438#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001439#endif /* MBEDTLS_DES_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001440
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001441#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
1442 { MBEDTLS_CIPHER_NULL, &null_cipher_info },
1443#endif /* MBEDTLS_CIPHER_NULL_CIPHER */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001444
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001445 { MBEDTLS_CIPHER_NONE, NULL }
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001446};
1447
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001448#define NUM_CIPHERS sizeof mbedtls_cipher_definitions / sizeof mbedtls_cipher_definitions[0]
1449int mbedtls_cipher_supported[NUM_CIPHERS];
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001450
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001451#endif /* MBEDTLS_CIPHER_C */