blob: f4e7964dfaea9628b40b6f536fb7f0f3cb5d7348 [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
Daniel Kingbd920622016-05-15 19:56:20 -030056#if defined(MBEDTLS_CHACHA20_C)
57#include "mbedtls/chacha20.h"
58#endif
59
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020060#if defined(MBEDTLS_GCM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000061#include "mbedtls/gcm.h"
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +020062#endif
63
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020064#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000065#include "mbedtls/ccm.h"
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +020066#endif
67
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020068#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
Manuel Pégourié-Gonnard0c851ee2015-02-10 12:47:52 +000069#include <string.h>
70#endif
71
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020072#if defined(MBEDTLS_PLATFORM_C)
Manuel Pégourié-Gonnard7f809972015-03-09 17:05:11 +000073#include "mbedtls/platform.h"
Paul Bakker6e339b52013-07-03 13:37:05 +020074#else
Rich Evans00ab4702015-02-06 13:43:58 +000075#include <stdlib.h>
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +020076#define mbedtls_calloc calloc
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020077#define mbedtls_free free
Paul Bakker6e339b52013-07-03 13:37:05 +020078#endif
79
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020080#if defined(MBEDTLS_GCM_C)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020081/* shared by all GCM ciphers */
82static void *gcm_ctx_alloc( void )
83{
Manuel Pégourié-Gonnard96fb6852015-06-23 11:39:01 +020084 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_gcm_context ) );
85
86 if( ctx != NULL )
87 mbedtls_gcm_init( (mbedtls_gcm_context *) ctx );
88
89 return( ctx );
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020090}
91
92static void gcm_ctx_free( void *ctx )
93{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020094 mbedtls_gcm_free( ctx );
95 mbedtls_free( ctx );
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020096}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020097#endif /* MBEDTLS_GCM_C */
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +020098
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +020099#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200100/* shared by all CCM ciphers */
101static void *ccm_ctx_alloc( void )
102{
Manuel Pégourié-Gonnard96fb6852015-06-23 11:39:01 +0200103 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ccm_context ) );
104
105 if( ctx != NULL )
106 mbedtls_ccm_init( (mbedtls_ccm_context *) ctx );
107
108 return( ctx );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200109}
110
111static void ccm_ctx_free( void *ctx )
112{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200113 mbedtls_ccm_free( ctx );
114 mbedtls_free( ctx );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200115}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200116#endif /* MBEDTLS_CCM_C */
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200117
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200118#if defined(MBEDTLS_AES_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +0000119
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200120static int aes_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200121 const unsigned char *input, unsigned char *output )
122{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200123 return mbedtls_aes_crypt_ecb( (mbedtls_aes_context *) ctx, operation, input, output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200124}
125
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200126#if defined(MBEDTLS_CIPHER_MODE_CBC)
127static int aes_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000128 unsigned char *iv, const unsigned char *input, unsigned char *output )
129{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200130 return mbedtls_aes_crypt_cbc( (mbedtls_aes_context *) ctx, operation, length, iv, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200131 output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000132}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200133#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000134
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200135#if defined(MBEDTLS_CIPHER_MODE_CFB)
136static int aes_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200137 size_t length, size_t *iv_off, unsigned char *iv,
138 const unsigned char *input, unsigned char *output )
Paul Bakker343a8702011-06-09 14:27:58 +0000139{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200140 return mbedtls_aes_crypt_cfb128( (mbedtls_aes_context *) ctx, operation, length, iv_off, iv,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200141 input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000142}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200143#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000144
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200145#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200146static int aes_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
147 unsigned char *nonce_counter, unsigned char *stream_block,
Paul Bakker343a8702011-06-09 14:27:58 +0000148 const unsigned char *input, unsigned char *output )
149{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200150 return mbedtls_aes_crypt_ctr( (mbedtls_aes_context *) ctx, length, nc_off, nonce_counter,
Paul Bakker343a8702011-06-09 14:27:58 +0000151 stream_block, input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000152}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200153#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000154
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200155static int aes_setkey_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200156 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000157{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200158 return mbedtls_aes_setkey_dec( (mbedtls_aes_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000159}
160
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200161static int aes_setkey_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200162 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000163{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200164 return mbedtls_aes_setkey_enc( (mbedtls_aes_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000165}
166
167static void * aes_ctx_alloc( void )
168{
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200169 mbedtls_aes_context *aes = mbedtls_calloc( 1, sizeof( mbedtls_aes_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200170
171 if( aes == NULL )
172 return( NULL );
173
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200174 mbedtls_aes_init( aes );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200175
176 return( aes );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000177}
178
179static void aes_ctx_free( void *ctx )
180{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200181 mbedtls_aes_free( (mbedtls_aes_context *) ctx );
182 mbedtls_free( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000183}
184
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200185static const mbedtls_cipher_base_t aes_info = {
186 MBEDTLS_CIPHER_ID_AES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200187 aes_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200188#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker343a8702011-06-09 14:27:58 +0000189 aes_crypt_cbc_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_CFB)
Paul Bakker343a8702011-06-09 14:27:58 +0000192 aes_crypt_cfb128_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_CTR)
Paul Bakker343a8702011-06-09 14:27:58 +0000195 aes_crypt_ctr_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100196#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200197#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +0200198 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100199#endif
Paul Bakker343a8702011-06-09 14:27:58 +0000200 aes_setkey_enc_wrap,
201 aes_setkey_dec_wrap,
202 aes_ctx_alloc,
203 aes_ctx_free
204};
205
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200206static const mbedtls_cipher_info_t aes_128_ecb_info = {
207 MBEDTLS_CIPHER_AES_128_ECB,
208 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200209 128,
210 "AES-128-ECB",
211 16,
212 0,
213 16,
214 &aes_info
215};
216
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200217static const mbedtls_cipher_info_t aes_192_ecb_info = {
218 MBEDTLS_CIPHER_AES_192_ECB,
219 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200220 192,
221 "AES-192-ECB",
222 16,
223 0,
224 16,
225 &aes_info
226};
227
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200228static const mbedtls_cipher_info_t aes_256_ecb_info = {
229 MBEDTLS_CIPHER_AES_256_ECB,
230 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200231 256,
232 "AES-256-ECB",
233 16,
234 0,
235 16,
236 &aes_info
237};
238
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200239#if defined(MBEDTLS_CIPHER_MODE_CBC)
240static const mbedtls_cipher_info_t aes_128_cbc_info = {
241 MBEDTLS_CIPHER_AES_128_CBC,
242 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000243 128,
244 "AES-128-CBC",
245 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200246 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000247 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000248 &aes_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000249};
250
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200251static const mbedtls_cipher_info_t aes_192_cbc_info = {
252 MBEDTLS_CIPHER_AES_192_CBC,
253 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000254 192,
255 "AES-192-CBC",
256 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200257 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000258 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000259 &aes_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000260};
261
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200262static const mbedtls_cipher_info_t aes_256_cbc_info = {
263 MBEDTLS_CIPHER_AES_256_CBC,
264 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000265 256,
266 "AES-256-CBC",
267 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200268 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000269 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000270 &aes_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000271};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200272#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +0000273
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200274#if defined(MBEDTLS_CIPHER_MODE_CFB)
275static const mbedtls_cipher_info_t aes_128_cfb128_info = {
276 MBEDTLS_CIPHER_AES_128_CFB128,
277 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000278 128,
279 "AES-128-CFB128",
280 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200281 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000282 16,
283 &aes_info
284};
285
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200286static const mbedtls_cipher_info_t aes_192_cfb128_info = {
287 MBEDTLS_CIPHER_AES_192_CFB128,
288 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000289 192,
290 "AES-192-CFB128",
291 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200292 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000293 16,
294 &aes_info
295};
296
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200297static const mbedtls_cipher_info_t aes_256_cfb128_info = {
298 MBEDTLS_CIPHER_AES_256_CFB128,
299 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000300 256,
301 "AES-256-CFB128",
302 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200303 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000304 16,
305 &aes_info
306};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200307#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000308
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200309#if defined(MBEDTLS_CIPHER_MODE_CTR)
310static const mbedtls_cipher_info_t aes_128_ctr_info = {
311 MBEDTLS_CIPHER_AES_128_CTR,
312 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000313 128,
314 "AES-128-CTR",
315 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200316 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000317 16,
318 &aes_info
319};
320
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200321static const mbedtls_cipher_info_t aes_192_ctr_info = {
322 MBEDTLS_CIPHER_AES_192_CTR,
323 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000324 192,
325 "AES-192-CTR",
326 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200327 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000328 16,
329 &aes_info
330};
331
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200332static const mbedtls_cipher_info_t aes_256_ctr_info = {
333 MBEDTLS_CIPHER_AES_256_CTR,
334 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000335 256,
336 "AES-256-CTR",
337 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200338 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000339 16,
340 &aes_info
341};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200342#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000343
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200344#if defined(MBEDTLS_GCM_C)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200345static int gcm_aes_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200346 unsigned int key_bitlen )
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200347{
Manuel Pégourié-Gonnardc34e8dd2015-04-28 21:42:17 +0200348 return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200349 key, key_bitlen );
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200350}
351
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200352static const mbedtls_cipher_base_t gcm_aes_info = {
353 MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200354 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200355#if defined(MBEDTLS_CIPHER_MODE_CBC)
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_CFB)
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_CTR)
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200362 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100363#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200364#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Paul Bakker5e0efa72013-09-08 23:04:04 +0200365 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100366#endif
Paul Bakker43aff2a2013-09-09 00:10:27 +0200367 gcm_aes_setkey_wrap,
368 gcm_aes_setkey_wrap,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200369 gcm_ctx_alloc,
370 gcm_ctx_free,
371};
372
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200373static const mbedtls_cipher_info_t aes_128_gcm_info = {
374 MBEDTLS_CIPHER_AES_128_GCM,
375 MBEDTLS_MODE_GCM,
Paul Bakker68884e32013-01-07 18:20:04 +0100376 128,
377 "AES-128-GCM",
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200378 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200379 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Paul Bakker68884e32013-01-07 18:20:04 +0100380 16,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200381 &gcm_aes_info
Paul Bakker68884e32013-01-07 18:20:04 +0100382};
383
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200384static const mbedtls_cipher_info_t aes_192_gcm_info = {
385 MBEDTLS_CIPHER_AES_192_GCM,
386 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard83f3fc02013-09-04 12:07:24 +0200387 192,
388 "AES-192-GCM",
389 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200390 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard83f3fc02013-09-04 12:07:24 +0200391 16,
392 &gcm_aes_info
393};
394
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200395static const mbedtls_cipher_info_t aes_256_gcm_info = {
396 MBEDTLS_CIPHER_AES_256_GCM,
397 MBEDTLS_MODE_GCM,
Paul Bakker68884e32013-01-07 18:20:04 +0100398 256,
399 "AES-256-GCM",
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200400 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200401 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Paul Bakker68884e32013-01-07 18:20:04 +0100402 16,
Manuel Pégourié-Gonnard07f8fa52013-08-30 18:34:08 +0200403 &gcm_aes_info
Paul Bakker68884e32013-01-07 18:20:04 +0100404};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200405#endif /* MBEDTLS_GCM_C */
Paul Bakker68884e32013-01-07 18:20:04 +0100406
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200407#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200408static int ccm_aes_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200409 unsigned int key_bitlen )
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200410{
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200411 return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200412 key, key_bitlen );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200413}
414
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200415static const mbedtls_cipher_base_t ccm_aes_info = {
416 MBEDTLS_CIPHER_ID_AES,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200417 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200418#if defined(MBEDTLS_CIPHER_MODE_CBC)
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_CFB)
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_CTR)
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é-Gonnard2cf5a7c2015-04-08 12:49:31 +0200427#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200428 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100429#endif
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200430 ccm_aes_setkey_wrap,
431 ccm_aes_setkey_wrap,
432 ccm_ctx_alloc,
433 ccm_ctx_free,
434};
435
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200436static const mbedtls_cipher_info_t aes_128_ccm_info = {
437 MBEDTLS_CIPHER_AES_128_CCM,
438 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200439 128,
440 "AES-128-CCM",
441 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200442 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200443 16,
444 &ccm_aes_info
445};
446
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200447static const mbedtls_cipher_info_t aes_192_ccm_info = {
448 MBEDTLS_CIPHER_AES_192_CCM,
449 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200450 192,
451 "AES-192-CCM",
452 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200453 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200454 16,
455 &ccm_aes_info
456};
457
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200458static const mbedtls_cipher_info_t aes_256_ccm_info = {
459 MBEDTLS_CIPHER_AES_256_CCM,
460 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200461 256,
462 "AES-256-CCM",
463 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200464 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200465 16,
466 &ccm_aes_info
467};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200468#endif /* MBEDTLS_CCM_C */
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200469
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200470#endif /* MBEDTLS_AES_C */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000471
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200472#if defined(MBEDTLS_CAMELLIA_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +0000473
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200474static int camellia_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200475 const unsigned char *input, unsigned char *output )
476{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200477 return mbedtls_camellia_crypt_ecb( (mbedtls_camellia_context *) ctx, operation, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200478 output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200479}
480
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200481#if defined(MBEDTLS_CIPHER_MODE_CBC)
482static int camellia_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200483 size_t length, unsigned char *iv,
484 const unsigned char *input, unsigned char *output )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000485{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200486 return mbedtls_camellia_crypt_cbc( (mbedtls_camellia_context *) ctx, operation, length, iv,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200487 input, output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000488}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200489#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000490
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200491#if defined(MBEDTLS_CIPHER_MODE_CFB)
492static int camellia_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200493 size_t length, size_t *iv_off, unsigned char *iv,
494 const unsigned char *input, unsigned char *output )
Paul Bakker343a8702011-06-09 14:27:58 +0000495{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200496 return mbedtls_camellia_crypt_cfb128( (mbedtls_camellia_context *) ctx, operation, length,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200497 iv_off, iv, input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000498}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200499#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000500
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200501#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200502static int camellia_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
503 unsigned char *nonce_counter, unsigned char *stream_block,
Paul Bakker343a8702011-06-09 14:27:58 +0000504 const unsigned char *input, unsigned char *output )
505{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200506 return mbedtls_camellia_crypt_ctr( (mbedtls_camellia_context *) ctx, length, nc_off,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200507 nonce_counter, stream_block, input, output );
Paul Bakker343a8702011-06-09 14:27:58 +0000508}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200509#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000510
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200511static int camellia_setkey_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200512 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000513{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200514 return mbedtls_camellia_setkey_dec( (mbedtls_camellia_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000515}
516
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200517static int camellia_setkey_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200518 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000519{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200520 return mbedtls_camellia_setkey_enc( (mbedtls_camellia_context *) ctx, key, key_bitlen );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000521}
522
523static void * camellia_ctx_alloc( void )
524{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200525 mbedtls_camellia_context *ctx;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200526 ctx = mbedtls_calloc( 1, sizeof( mbedtls_camellia_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200527
528 if( ctx == NULL )
529 return( NULL );
530
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200531 mbedtls_camellia_init( ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200532
533 return( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000534}
535
536static void camellia_ctx_free( void *ctx )
537{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200538 mbedtls_camellia_free( (mbedtls_camellia_context *) ctx );
539 mbedtls_free( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000540}
541
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200542static const mbedtls_cipher_base_t camellia_info = {
543 MBEDTLS_CIPHER_ID_CAMELLIA,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200544 camellia_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200545#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker343a8702011-06-09 14:27:58 +0000546 camellia_crypt_cbc_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_CFB)
Paul Bakker343a8702011-06-09 14:27:58 +0000549 camellia_crypt_cfb128_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_CTR)
Paul Bakker343a8702011-06-09 14:27:58 +0000552 camellia_crypt_ctr_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100553#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200554#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +0200555 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100556#endif
Paul Bakker343a8702011-06-09 14:27:58 +0000557 camellia_setkey_enc_wrap,
558 camellia_setkey_dec_wrap,
559 camellia_ctx_alloc,
560 camellia_ctx_free
561};
562
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200563static const mbedtls_cipher_info_t camellia_128_ecb_info = {
564 MBEDTLS_CIPHER_CAMELLIA_128_ECB,
565 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200566 128,
567 "CAMELLIA-128-ECB",
568 16,
569 0,
570 16,
571 &camellia_info
572};
573
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200574static const mbedtls_cipher_info_t camellia_192_ecb_info = {
575 MBEDTLS_CIPHER_CAMELLIA_192_ECB,
576 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200577 192,
578 "CAMELLIA-192-ECB",
579 16,
580 0,
581 16,
582 &camellia_info
583};
584
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200585static const mbedtls_cipher_info_t camellia_256_ecb_info = {
586 MBEDTLS_CIPHER_CAMELLIA_256_ECB,
587 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200588 256,
589 "CAMELLIA-256-ECB",
590 16,
591 0,
592 16,
593 &camellia_info
594};
595
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200596#if defined(MBEDTLS_CIPHER_MODE_CBC)
597static const mbedtls_cipher_info_t camellia_128_cbc_info = {
598 MBEDTLS_CIPHER_CAMELLIA_128_CBC,
599 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000600 128,
601 "CAMELLIA-128-CBC",
602 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200603 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000604 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000605 &camellia_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000606};
607
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200608static const mbedtls_cipher_info_t camellia_192_cbc_info = {
609 MBEDTLS_CIPHER_CAMELLIA_192_CBC,
610 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000611 192,
612 "CAMELLIA-192-CBC",
613 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200614 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000615 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000616 &camellia_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000617};
618
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200619static const mbedtls_cipher_info_t camellia_256_cbc_info = {
620 MBEDTLS_CIPHER_CAMELLIA_256_CBC,
621 MBEDTLS_MODE_CBC,
Paul Bakker23986e52011-04-24 08:57:21 +0000622 256,
623 "CAMELLIA-256-CBC",
624 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200625 0,
Paul Bakker23986e52011-04-24 08:57:21 +0000626 16,
Paul Bakker343a8702011-06-09 14:27:58 +0000627 &camellia_info
Paul Bakker8123e9d2011-01-06 15:37:30 +0000628};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200629#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +0000630
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200631#if defined(MBEDTLS_CIPHER_MODE_CFB)
632static const mbedtls_cipher_info_t camellia_128_cfb128_info = {
633 MBEDTLS_CIPHER_CAMELLIA_128_CFB128,
634 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000635 128,
636 "CAMELLIA-128-CFB128",
637 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200638 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000639 16,
640 &camellia_info
641};
642
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200643static const mbedtls_cipher_info_t camellia_192_cfb128_info = {
644 MBEDTLS_CIPHER_CAMELLIA_192_CFB128,
645 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000646 192,
647 "CAMELLIA-192-CFB128",
648 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200649 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000650 16,
651 &camellia_info
652};
653
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200654static const mbedtls_cipher_info_t camellia_256_cfb128_info = {
655 MBEDTLS_CIPHER_CAMELLIA_256_CFB128,
656 MBEDTLS_MODE_CFB,
Paul Bakker343a8702011-06-09 14:27:58 +0000657 256,
658 "CAMELLIA-256-CFB128",
659 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200660 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000661 16,
662 &camellia_info
663};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200664#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker343a8702011-06-09 14:27:58 +0000665
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200666#if defined(MBEDTLS_CIPHER_MODE_CTR)
667static const mbedtls_cipher_info_t camellia_128_ctr_info = {
668 MBEDTLS_CIPHER_CAMELLIA_128_CTR,
669 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000670 128,
671 "CAMELLIA-128-CTR",
672 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200673 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000674 16,
675 &camellia_info
676};
677
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200678static const mbedtls_cipher_info_t camellia_192_ctr_info = {
679 MBEDTLS_CIPHER_CAMELLIA_192_CTR,
680 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000681 192,
682 "CAMELLIA-192-CTR",
683 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200684 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000685 16,
686 &camellia_info
687};
688
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200689static const mbedtls_cipher_info_t camellia_256_ctr_info = {
690 MBEDTLS_CIPHER_CAMELLIA_256_CTR,
691 MBEDTLS_MODE_CTR,
Paul Bakker343a8702011-06-09 14:27:58 +0000692 256,
693 "CAMELLIA-256-CTR",
694 16,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200695 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000696 16,
697 &camellia_info
698};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200699#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker343a8702011-06-09 14:27:58 +0000700
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200701#if defined(MBEDTLS_GCM_C)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200702static int gcm_camellia_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200703 unsigned int key_bitlen )
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200704{
Manuel Pégourié-Gonnardc34e8dd2015-04-28 21:42:17 +0200705 return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200706 key, key_bitlen );
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200707}
708
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200709static const mbedtls_cipher_base_t gcm_camellia_info = {
710 MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200711 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200712#if defined(MBEDTLS_CIPHER_MODE_CBC)
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_CFB)
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_CTR)
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é-Gonnard2cf5a7c2015-04-08 12:49:31 +0200721#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200722 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100723#endif
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200724 gcm_camellia_setkey_wrap,
725 gcm_camellia_setkey_wrap,
726 gcm_ctx_alloc,
727 gcm_ctx_free,
728};
729
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200730static const mbedtls_cipher_info_t camellia_128_gcm_info = {
731 MBEDTLS_CIPHER_CAMELLIA_128_GCM,
732 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200733 128,
734 "CAMELLIA-128-GCM",
735 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200736 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200737 16,
738 &gcm_camellia_info
739};
740
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200741static const mbedtls_cipher_info_t camellia_192_gcm_info = {
742 MBEDTLS_CIPHER_CAMELLIA_192_GCM,
743 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200744 192,
745 "CAMELLIA-192-GCM",
746 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200747 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200748 16,
749 &gcm_camellia_info
750};
751
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200752static const mbedtls_cipher_info_t camellia_256_gcm_info = {
753 MBEDTLS_CIPHER_CAMELLIA_256_GCM,
754 MBEDTLS_MODE_GCM,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200755 256,
756 "CAMELLIA-256-GCM",
757 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200758 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200759 16,
760 &gcm_camellia_info
761};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200762#endif /* MBEDTLS_GCM_C */
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +0200763
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200764#if defined(MBEDTLS_CCM_C)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200765static int ccm_camellia_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200766 unsigned int key_bitlen )
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200767{
Manuel Pégourié-Gonnard6963ff02015-04-28 18:02:54 +0200768 return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200769 key, key_bitlen );
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200770}
771
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200772static const mbedtls_cipher_base_t ccm_camellia_info = {
773 MBEDTLS_CIPHER_ID_CAMELLIA,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200774 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200775#if defined(MBEDTLS_CIPHER_MODE_CBC)
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_CFB)
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_CTR)
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é-Gonnard2cf5a7c2015-04-08 12:49:31 +0200784#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200785 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100786#endif
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200787 ccm_camellia_setkey_wrap,
788 ccm_camellia_setkey_wrap,
789 ccm_ctx_alloc,
790 ccm_ctx_free,
791};
792
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200793static const mbedtls_cipher_info_t camellia_128_ccm_info = {
794 MBEDTLS_CIPHER_CAMELLIA_128_CCM,
795 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200796 128,
797 "CAMELLIA-128-CCM",
798 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200799 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200800 16,
801 &ccm_camellia_info
802};
803
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200804static const mbedtls_cipher_info_t camellia_192_ccm_info = {
805 MBEDTLS_CIPHER_CAMELLIA_192_CCM,
806 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200807 192,
808 "CAMELLIA-192-CCM",
809 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200810 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200811 16,
812 &ccm_camellia_info
813};
814
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200815static const mbedtls_cipher_info_t camellia_256_ccm_info = {
816 MBEDTLS_CIPHER_CAMELLIA_256_CCM,
817 MBEDTLS_MODE_CCM,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200818 256,
819 "CAMELLIA-256-CCM",
820 12,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200821 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200822 16,
823 &ccm_camellia_info
824};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200825#endif /* MBEDTLS_CCM_C */
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +0200826
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200827#endif /* MBEDTLS_CAMELLIA_C */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000828
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200829#if defined(MBEDTLS_DES_C)
Paul Bakker8123e9d2011-01-06 15:37:30 +0000830
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200831static int des_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200832 const unsigned char *input, unsigned char *output )
833{
834 ((void) operation);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200835 return mbedtls_des_crypt_ecb( (mbedtls_des_context *) ctx, input, output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200836}
837
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200838static int des3_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200839 const unsigned char *input, unsigned char *output )
840{
841 ((void) operation);
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200842 return mbedtls_des3_crypt_ecb( (mbedtls_des3_context *) ctx, input, output );
Paul Bakker5e0efa72013-09-08 23:04:04 +0200843}
844
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200845#if defined(MBEDTLS_CIPHER_MODE_CBC)
846static int des_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000847 unsigned char *iv, const unsigned char *input, unsigned char *output )
848{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200849 return mbedtls_des_crypt_cbc( (mbedtls_des_context *) ctx, operation, length, iv, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200850 output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000851}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200852#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000853
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200854#if defined(MBEDTLS_CIPHER_MODE_CBC)
855static int des3_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
Paul Bakker8123e9d2011-01-06 15:37:30 +0000856 unsigned char *iv, const unsigned char *input, unsigned char *output )
857{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200858 return mbedtls_des3_crypt_cbc( (mbedtls_des3_context *) ctx, operation, length, iv, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200859 output );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000860}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200861#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker8123e9d2011-01-06 15:37:30 +0000862
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200863static int des_setkey_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200864 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000865{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200866 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000867
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200868 return mbedtls_des_setkey_dec( (mbedtls_des_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000869}
870
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200871static int des_setkey_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200872 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000873{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200874 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000875
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200876 return mbedtls_des_setkey_enc( (mbedtls_des_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000877}
878
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200879static int des3_set2key_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200880 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000881{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200882 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000883
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200884 return mbedtls_des3_set2key_dec( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000885}
886
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200887static int des3_set2key_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200888 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000889{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200890 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000891
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200892 return mbedtls_des3_set2key_enc( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000893}
894
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200895static int des3_set3key_dec_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200896 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000897{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200898 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000899
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200900 return mbedtls_des3_set3key_dec( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000901}
902
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +0200903static int des3_set3key_enc_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200904 unsigned int key_bitlen )
Paul Bakker8123e9d2011-01-06 15:37:30 +0000905{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +0200906 ((void) key_bitlen);
Paul Bakkerd61e7d92011-01-18 16:17:47 +0000907
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200908 return mbedtls_des3_set3key_enc( (mbedtls_des3_context *) ctx, key );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000909}
910
911static void * des_ctx_alloc( void )
912{
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200913 mbedtls_des_context *des = mbedtls_calloc( 1, sizeof( mbedtls_des_context ) );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000914
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200915 if( des == NULL )
916 return( NULL );
917
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200918 mbedtls_des_init( des );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200919
920 return( des );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000921}
922
923static void des_ctx_free( void *ctx )
924{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200925 mbedtls_des_free( (mbedtls_des_context *) ctx );
926 mbedtls_free( ctx );
Paul Bakker34617722014-06-13 17:20:13 +0200927}
928
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200929static void * des3_ctx_alloc( void )
930{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200931 mbedtls_des3_context *des3;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +0200932 des3 = mbedtls_calloc( 1, sizeof( mbedtls_des3_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200933
934 if( des3 == NULL )
935 return( NULL );
936
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200937 mbedtls_des3_init( des3 );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +0200938
939 return( des3 );
940}
941
Paul Bakker34617722014-06-13 17:20:13 +0200942static void des3_ctx_free( void *ctx )
943{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200944 mbedtls_des3_free( (mbedtls_des3_context *) ctx );
945 mbedtls_free( ctx );
Paul Bakker8123e9d2011-01-06 15:37:30 +0000946}
947
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200948static const mbedtls_cipher_base_t des_info = {
949 MBEDTLS_CIPHER_ID_DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200950 des_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200951#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker23986e52011-04-24 08:57:21 +0000952 des_crypt_cbc_wrap,
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_CFB)
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_CTR)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +0200958 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100959#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200960#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +0200961 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +0100962#endif
Paul Bakker23986e52011-04-24 08:57:21 +0000963 des_setkey_enc_wrap,
964 des_setkey_dec_wrap,
965 des_ctx_alloc,
966 des_ctx_free
Paul Bakker8123e9d2011-01-06 15:37:30 +0000967};
968
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200969static const mbedtls_cipher_info_t des_ecb_info = {
970 MBEDTLS_CIPHER_DES_ECB,
971 MBEDTLS_MODE_ECB,
972 MBEDTLS_KEY_LENGTH_DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200973 "DES-ECB",
974 8,
975 0,
976 8,
977 &des_info
978};
979
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200980#if defined(MBEDTLS_CIPHER_MODE_CBC)
981static const mbedtls_cipher_info_t des_cbc_info = {
982 MBEDTLS_CIPHER_DES_CBC,
983 MBEDTLS_MODE_CBC,
984 MBEDTLS_KEY_LENGTH_DES,
Paul Bakker343a8702011-06-09 14:27:58 +0000985 "DES-CBC",
986 8,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +0200987 0,
Paul Bakker343a8702011-06-09 14:27:58 +0000988 8,
989 &des_info
990};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200991#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +0000992
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200993static const mbedtls_cipher_base_t des_ede_info = {
994 MBEDTLS_CIPHER_ID_DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +0200995 des3_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +0200996#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker23986e52011-04-24 08:57:21 +0000997 des3_crypt_cbc_wrap,
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_CFB)
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_CTR)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +02001003 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001004#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001005#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001006 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001007#endif
Paul Bakker23986e52011-04-24 08:57:21 +00001008 des3_set2key_enc_wrap,
1009 des3_set2key_dec_wrap,
1010 des3_ctx_alloc,
Paul Bakker34617722014-06-13 17:20:13 +02001011 des3_ctx_free
Paul Bakker8123e9d2011-01-06 15:37:30 +00001012};
1013
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001014static const mbedtls_cipher_info_t des_ede_ecb_info = {
1015 MBEDTLS_CIPHER_DES_EDE_ECB,
1016 MBEDTLS_MODE_ECB,
1017 MBEDTLS_KEY_LENGTH_DES_EDE,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001018 "DES-EDE-ECB",
1019 8,
1020 0,
1021 8,
1022 &des_ede_info
1023};
1024
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001025#if defined(MBEDTLS_CIPHER_MODE_CBC)
1026static const mbedtls_cipher_info_t des_ede_cbc_info = {
1027 MBEDTLS_CIPHER_DES_EDE_CBC,
1028 MBEDTLS_MODE_CBC,
1029 MBEDTLS_KEY_LENGTH_DES_EDE,
Paul Bakker343a8702011-06-09 14:27:58 +00001030 "DES-EDE-CBC",
Paul Bakker0e342352013-06-24 19:33:02 +02001031 8,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001032 0,
Paul Bakker0e342352013-06-24 19:33:02 +02001033 8,
Paul Bakker343a8702011-06-09 14:27:58 +00001034 &des_ede_info
1035};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001036#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker343a8702011-06-09 14:27:58 +00001037
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001038static const mbedtls_cipher_base_t des_ede3_info = {
Manuel Pégourié-Gonnard9d515832015-06-02 10:00:04 +01001039 MBEDTLS_CIPHER_ID_3DES,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001040 des3_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001041#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker343a8702011-06-09 14:27:58 +00001042 des3_crypt_cbc_wrap,
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_CFB)
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_CTR)
Manuel Pégourié-Gonnardb9126162014-06-13 15:06:59 +02001048 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001049#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001050#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001051 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001052#endif
Paul Bakker343a8702011-06-09 14:27:58 +00001053 des3_set3key_enc_wrap,
1054 des3_set3key_dec_wrap,
1055 des3_ctx_alloc,
Paul Bakker34617722014-06-13 17:20:13 +02001056 des3_ctx_free
Paul Bakker343a8702011-06-09 14:27:58 +00001057};
1058
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001059static const mbedtls_cipher_info_t des_ede3_ecb_info = {
1060 MBEDTLS_CIPHER_DES_EDE3_ECB,
1061 MBEDTLS_MODE_ECB,
1062 MBEDTLS_KEY_LENGTH_DES_EDE3,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001063 "DES-EDE3-ECB",
1064 8,
1065 0,
1066 8,
1067 &des_ede3_info
1068};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001069#if defined(MBEDTLS_CIPHER_MODE_CBC)
1070static const mbedtls_cipher_info_t des_ede3_cbc_info = {
1071 MBEDTLS_CIPHER_DES_EDE3_CBC,
1072 MBEDTLS_MODE_CBC,
1073 MBEDTLS_KEY_LENGTH_DES_EDE3,
Paul Bakker23986e52011-04-24 08:57:21 +00001074 "DES-EDE3-CBC",
1075 8,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001076 0,
Paul Bakker23986e52011-04-24 08:57:21 +00001077 8,
Paul Bakker343a8702011-06-09 14:27:58 +00001078 &des_ede3_info
Paul Bakker8123e9d2011-01-06 15:37:30 +00001079};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001080#endif /* MBEDTLS_CIPHER_MODE_CBC */
1081#endif /* MBEDTLS_DES_C */
Paul Bakker8123e9d2011-01-06 15:37:30 +00001082
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001083#if defined(MBEDTLS_BLOWFISH_C)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001084
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001085static int blowfish_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001086 const unsigned char *input, unsigned char *output )
1087{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001088 return mbedtls_blowfish_crypt_ecb( (mbedtls_blowfish_context *) ctx, operation, input,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001089 output );
Paul Bakker5e0efa72013-09-08 23:04:04 +02001090}
1091
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001092#if defined(MBEDTLS_CIPHER_MODE_CBC)
1093static int blowfish_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001094 size_t length, unsigned char *iv, const unsigned char *input,
1095 unsigned char *output )
Paul Bakker6132d0a2012-07-04 17:10:40 +00001096{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001097 return mbedtls_blowfish_crypt_cbc( (mbedtls_blowfish_context *) ctx, operation, length, iv,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001098 input, output );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001099}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001100#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001101
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001102#if defined(MBEDTLS_CIPHER_MODE_CFB)
1103static int blowfish_crypt_cfb64_wrap( void *ctx, mbedtls_operation_t operation,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001104 size_t length, size_t *iv_off, unsigned char *iv,
1105 const unsigned char *input, unsigned char *output )
Paul Bakker6132d0a2012-07-04 17:10:40 +00001106{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001107 return mbedtls_blowfish_crypt_cfb64( (mbedtls_blowfish_context *) ctx, operation, length,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001108 iv_off, iv, input, output );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001109}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001110#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001111
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001112#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001113static int blowfish_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
1114 unsigned char *nonce_counter, unsigned char *stream_block,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001115 const unsigned char *input, unsigned char *output )
1116{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001117 return mbedtls_blowfish_crypt_ctr( (mbedtls_blowfish_context *) ctx, length, nc_off,
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001118 nonce_counter, stream_block, input, output );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001119}
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001120#endif /* MBEDTLS_CIPHER_MODE_CTR */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001121
Paul Bakkerb9e4e2c2014-05-01 14:18:25 +02001122static int blowfish_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001123 unsigned int key_bitlen )
Paul Bakker6132d0a2012-07-04 17:10:40 +00001124{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001125 return mbedtls_blowfish_setkey( (mbedtls_blowfish_context *) ctx, key, key_bitlen );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001126}
1127
1128static void * blowfish_ctx_alloc( void )
1129{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001130 mbedtls_blowfish_context *ctx;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001131 ctx = mbedtls_calloc( 1, sizeof( mbedtls_blowfish_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001132
1133 if( ctx == NULL )
1134 return( NULL );
1135
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001136 mbedtls_blowfish_init( ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001137
1138 return( ctx );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001139}
1140
1141static void blowfish_ctx_free( void *ctx )
1142{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001143 mbedtls_blowfish_free( (mbedtls_blowfish_context *) ctx );
1144 mbedtls_free( ctx );
Paul Bakker6132d0a2012-07-04 17:10:40 +00001145}
1146
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001147static const mbedtls_cipher_base_t blowfish_info = {
1148 MBEDTLS_CIPHER_ID_BLOWFISH,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001149 blowfish_crypt_ecb_wrap,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001150#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001151 blowfish_crypt_cbc_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_CFB)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001154 blowfish_crypt_cfb64_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_CTR)
Paul Bakker6132d0a2012-07-04 17:10:40 +00001157 blowfish_crypt_ctr_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001158#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001159#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001160 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001161#endif
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001162 blowfish_setkey_wrap,
1163 blowfish_setkey_wrap,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001164 blowfish_ctx_alloc,
1165 blowfish_ctx_free
1166};
1167
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001168static const mbedtls_cipher_info_t blowfish_ecb_info = {
1169 MBEDTLS_CIPHER_BLOWFISH_ECB,
1170 MBEDTLS_MODE_ECB,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001171 128,
1172 "BLOWFISH-ECB",
1173 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001174 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker5e0efa72013-09-08 23:04:04 +02001175 8,
1176 &blowfish_info
1177};
1178
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001179#if defined(MBEDTLS_CIPHER_MODE_CBC)
1180static const mbedtls_cipher_info_t blowfish_cbc_info = {
1181 MBEDTLS_CIPHER_BLOWFISH_CBC,
1182 MBEDTLS_MODE_CBC,
Paul Bakkerbfe671f2013-04-07 22:35:44 +02001183 128,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001184 "BLOWFISH-CBC",
1185 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001186 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001187 8,
1188 &blowfish_info
1189};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001190#endif /* MBEDTLS_CIPHER_MODE_CBC */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001191
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001192#if defined(MBEDTLS_CIPHER_MODE_CFB)
1193static const mbedtls_cipher_info_t blowfish_cfb64_info = {
1194 MBEDTLS_CIPHER_BLOWFISH_CFB64,
1195 MBEDTLS_MODE_CFB,
Paul Bakkerbfe671f2013-04-07 22:35:44 +02001196 128,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001197 "BLOWFISH-CFB64",
1198 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001199 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001200 8,
1201 &blowfish_info
1202};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001203#endif /* MBEDTLS_CIPHER_MODE_CFB */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001204
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001205#if defined(MBEDTLS_CIPHER_MODE_CTR)
1206static const mbedtls_cipher_info_t blowfish_ctr_info = {
1207 MBEDTLS_CIPHER_BLOWFISH_CTR,
1208 MBEDTLS_MODE_CTR,
Paul Bakkerbfe671f2013-04-07 22:35:44 +02001209 128,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001210 "BLOWFISH-CTR",
1211 8,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001212 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
Paul Bakker6132d0a2012-07-04 17:10:40 +00001213 8,
1214 &blowfish_info
1215};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001216#endif /* MBEDTLS_CIPHER_MODE_CTR */
1217#endif /* MBEDTLS_BLOWFISH_C */
Paul Bakker6132d0a2012-07-04 17:10:40 +00001218
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001219#if defined(MBEDTLS_ARC4_C)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001220static int arc4_crypt_stream_wrap( void *ctx, size_t length,
1221 const unsigned char *input,
1222 unsigned char *output )
Paul Bakker68884e32013-01-07 18:20:04 +01001223{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001224 return( mbedtls_arc4_crypt( (mbedtls_arc4_context *) ctx, length, input, output ) );
Paul Bakker68884e32013-01-07 18:20:04 +01001225}
1226
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001227static int arc4_setkey_wrap( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001228 unsigned int key_bitlen )
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001229{
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001230 /* we get key_bitlen in bits, arc4 expects it in bytes */
1231 if( key_bitlen % 8 != 0 )
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001232 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
Manuel Pégourié-Gonnardce411252013-09-04 12:28:37 +02001233
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001234 mbedtls_arc4_setup( (mbedtls_arc4_context *) ctx, key, key_bitlen / 8 );
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001235 return( 0 );
1236}
1237
1238static void * arc4_ctx_alloc( void )
1239{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001240 mbedtls_arc4_context *ctx;
Manuel Pégourié-Gonnard7551cb92015-05-26 16:04:06 +02001241 ctx = mbedtls_calloc( 1, sizeof( mbedtls_arc4_context ) );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001242
1243 if( ctx == NULL )
1244 return( NULL );
1245
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001246 mbedtls_arc4_init( ctx );
Paul Bakkerc7ea99a2014-06-18 11:12:03 +02001247
1248 return( ctx );
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001249}
Paul Bakker68884e32013-01-07 18:20:04 +01001250
1251static void arc4_ctx_free( void *ctx )
1252{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001253 mbedtls_arc4_free( (mbedtls_arc4_context *) ctx );
1254 mbedtls_free( ctx );
Paul Bakker68884e32013-01-07 18:20:04 +01001255}
1256
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001257static const mbedtls_cipher_base_t arc4_base_info = {
1258 MBEDTLS_CIPHER_ID_ARC4,
Paul Bakker68884e32013-01-07 18:20:04 +01001259 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001260#if defined(MBEDTLS_CIPHER_MODE_CBC)
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_CFB)
Paul Bakker68884e32013-01-07 18:20:04 +01001264 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_CTR)
Paul Bakker5e0efa72013-09-08 23:04:04 +02001267 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001268#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001269#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001270 arc4_crypt_stream_wrap,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001271#endif
Manuel Pégourié-Gonnard37e230c2013-08-28 13:50:42 +02001272 arc4_setkey_wrap,
1273 arc4_setkey_wrap,
Paul Bakker68884e32013-01-07 18:20:04 +01001274 arc4_ctx_alloc,
1275 arc4_ctx_free
1276};
1277
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001278static const mbedtls_cipher_info_t arc4_128_info = {
1279 MBEDTLS_CIPHER_ARC4_128,
1280 MBEDTLS_MODE_STREAM,
Paul Bakker68884e32013-01-07 18:20:04 +01001281 128,
1282 "ARC4-128",
1283 0,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001284 0,
Paul Bakker68884e32013-01-07 18:20:04 +01001285 1,
1286 &arc4_base_info
1287};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001288#endif /* MBEDTLS_ARC4_C */
Paul Bakker68884e32013-01-07 18:20:04 +01001289
Daniel Kingbd920622016-05-15 19:56:20 -03001290#if defined(MBEDTLS_CHACHA20_C)
1291
1292static int chacha20_setkey_wrap( void *ctx, const unsigned char *key,
1293 unsigned int key_bitlen )
1294{
1295 if( key_bitlen != 256U )
1296 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
1297
1298 if ( 0 != mbedtls_chacha20_setkey( (mbedtls_chacha20_context*)ctx, key ) )
1299 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
1300
1301 return( 0 );
1302}
1303
1304static void * chacha20_ctx_alloc( void )
1305{
1306 mbedtls_chacha20_context *ctx;
1307 ctx = mbedtls_calloc( 1, sizeof( mbedtls_chacha20_context ) );
1308
1309 if( ctx == NULL )
1310 return( NULL );
1311
1312 mbedtls_chacha20_init( ctx );
1313
1314 return( ctx );
1315}
1316
1317static void chacha20_ctx_free( void *ctx )
1318{
1319 mbedtls_chacha20_free( (mbedtls_chacha20_context *) ctx );
1320 mbedtls_free( ctx );
1321}
1322
1323static const mbedtls_cipher_base_t chacha20_base_info = {
1324 MBEDTLS_CIPHER_ID_CHACHA20,
1325 NULL,
1326#if defined(MBEDTLS_CIPHER_MODE_CBC)
1327 NULL,
1328#endif
1329#if defined(MBEDTLS_CIPHER_MODE_CFB)
1330 NULL,
1331#endif
1332#if defined(MBEDTLS_CIPHER_MODE_CTR)
1333 NULL,
1334#endif
1335#if defined(MBEDTLS_CIPHER_MODE_STREAM)
1336 NULL,
1337#endif
1338 chacha20_setkey_wrap,
1339 chacha20_setkey_wrap,
1340 chacha20_ctx_alloc,
1341 chacha20_ctx_free
1342};
1343static const mbedtls_cipher_info_t chacha20_info = {
1344 MBEDTLS_CIPHER_CHACHA20,
1345 MBEDTLS_MODE_NONE,
1346 256,
1347 "CHACHA20",
1348 12,
1349 0,
1350 64,
1351 &chacha20_base_info
1352};
1353#endif /* MBEDTLS_CHACHA20_C */
1354
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001355#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001356static int null_crypt_stream( void *ctx, size_t length,
1357 const unsigned char *input,
1358 unsigned char *output )
1359{
1360 ((void) ctx);
1361 memmove( output, input, length );
1362 return( 0 );
1363}
1364
1365static int null_setkey( void *ctx, const unsigned char *key,
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001366 unsigned int key_bitlen )
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001367{
1368 ((void) ctx);
1369 ((void) key);
Manuel Pégourié-Gonnard898e0aa2015-06-18 15:28:12 +02001370 ((void) key_bitlen);
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001371
1372 return( 0 );
1373}
1374
Paul Bakkerfab5c822012-02-06 16:45:10 +00001375static void * null_ctx_alloc( void )
1376{
Manuel Pégourié-Gonnard86bbc7f2014-07-12 02:14:41 +02001377 return( (void *) 1 );
Paul Bakkerfab5c822012-02-06 16:45:10 +00001378}
1379
Paul Bakkerfab5c822012-02-06 16:45:10 +00001380static void null_ctx_free( void *ctx )
1381{
1382 ((void) ctx);
1383}
1384
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001385static const mbedtls_cipher_base_t null_base_info = {
1386 MBEDTLS_CIPHER_ID_NULL,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001387 NULL,
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001388#if defined(MBEDTLS_CIPHER_MODE_CBC)
Paul Bakkerfab5c822012-02-06 16:45:10 +00001389 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001390#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001391#if defined(MBEDTLS_CIPHER_MODE_CFB)
Paul Bakkerfab5c822012-02-06 16:45:10 +00001392 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001393#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001394#if defined(MBEDTLS_CIPHER_MODE_CTR)
Paul Bakker5e0efa72013-09-08 23:04:04 +02001395 NULL,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001396#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001397#if defined(MBEDTLS_CIPHER_MODE_STREAM)
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001398 null_crypt_stream,
Manuel Pégourié-Gonnardb8ca7232014-12-02 10:09:10 +01001399#endif
Manuel Pégourié-Gonnardb5e85882013-08-28 16:36:14 +02001400 null_setkey,
1401 null_setkey,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001402 null_ctx_alloc,
1403 null_ctx_free
1404};
1405
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001406static const mbedtls_cipher_info_t null_cipher_info = {
1407 MBEDTLS_CIPHER_NULL,
1408 MBEDTLS_MODE_STREAM,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001409 0,
1410 "NULL",
Paul Bakker68884e32013-01-07 18:20:04 +01001411 0,
Manuel Pégourié-Gonnarda235b5b2013-09-03 13:25:52 +02001412 0,
Paul Bakkerfab5c822012-02-06 16:45:10 +00001413 1,
1414 &null_base_info
1415};
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001416#endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */
Paul Bakkerfab5c822012-02-06 16:45:10 +00001417
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001418const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] =
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001419{
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001420#if defined(MBEDTLS_AES_C)
1421 { MBEDTLS_CIPHER_AES_128_ECB, &aes_128_ecb_info },
1422 { MBEDTLS_CIPHER_AES_192_ECB, &aes_192_ecb_info },
1423 { MBEDTLS_CIPHER_AES_256_ECB, &aes_256_ecb_info },
1424#if defined(MBEDTLS_CIPHER_MODE_CBC)
1425 { MBEDTLS_CIPHER_AES_128_CBC, &aes_128_cbc_info },
1426 { MBEDTLS_CIPHER_AES_192_CBC, &aes_192_cbc_info },
1427 { MBEDTLS_CIPHER_AES_256_CBC, &aes_256_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001428#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001429#if defined(MBEDTLS_CIPHER_MODE_CFB)
1430 { MBEDTLS_CIPHER_AES_128_CFB128, &aes_128_cfb128_info },
1431 { MBEDTLS_CIPHER_AES_192_CFB128, &aes_192_cfb128_info },
1432 { MBEDTLS_CIPHER_AES_256_CFB128, &aes_256_cfb128_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001433#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001434#if defined(MBEDTLS_CIPHER_MODE_CTR)
1435 { MBEDTLS_CIPHER_AES_128_CTR, &aes_128_ctr_info },
1436 { MBEDTLS_CIPHER_AES_192_CTR, &aes_192_ctr_info },
1437 { MBEDTLS_CIPHER_AES_256_CTR, &aes_256_ctr_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001438#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001439#if defined(MBEDTLS_GCM_C)
1440 { MBEDTLS_CIPHER_AES_128_GCM, &aes_128_gcm_info },
1441 { MBEDTLS_CIPHER_AES_192_GCM, &aes_192_gcm_info },
1442 { MBEDTLS_CIPHER_AES_256_GCM, &aes_256_gcm_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001443#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001444#if defined(MBEDTLS_CCM_C)
1445 { MBEDTLS_CIPHER_AES_128_CCM, &aes_128_ccm_info },
1446 { MBEDTLS_CIPHER_AES_192_CCM, &aes_192_ccm_info },
1447 { MBEDTLS_CIPHER_AES_256_CCM, &aes_256_ccm_info },
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +02001448#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001449#endif /* MBEDTLS_AES_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001450
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001451#if defined(MBEDTLS_ARC4_C)
1452 { MBEDTLS_CIPHER_ARC4_128, &arc4_128_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001453#endif
1454
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001455#if defined(MBEDTLS_BLOWFISH_C)
1456 { MBEDTLS_CIPHER_BLOWFISH_ECB, &blowfish_ecb_info },
1457#if defined(MBEDTLS_CIPHER_MODE_CBC)
1458 { MBEDTLS_CIPHER_BLOWFISH_CBC, &blowfish_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001459#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001460#if defined(MBEDTLS_CIPHER_MODE_CFB)
1461 { MBEDTLS_CIPHER_BLOWFISH_CFB64, &blowfish_cfb64_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001462#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001463#if defined(MBEDTLS_CIPHER_MODE_CTR)
1464 { MBEDTLS_CIPHER_BLOWFISH_CTR, &blowfish_ctr_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001465#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001466#endif /* MBEDTLS_BLOWFISH_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001467
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001468#if defined(MBEDTLS_CAMELLIA_C)
1469 { MBEDTLS_CIPHER_CAMELLIA_128_ECB, &camellia_128_ecb_info },
1470 { MBEDTLS_CIPHER_CAMELLIA_192_ECB, &camellia_192_ecb_info },
1471 { MBEDTLS_CIPHER_CAMELLIA_256_ECB, &camellia_256_ecb_info },
1472#if defined(MBEDTLS_CIPHER_MODE_CBC)
1473 { MBEDTLS_CIPHER_CAMELLIA_128_CBC, &camellia_128_cbc_info },
1474 { MBEDTLS_CIPHER_CAMELLIA_192_CBC, &camellia_192_cbc_info },
1475 { MBEDTLS_CIPHER_CAMELLIA_256_CBC, &camellia_256_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001476#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001477#if defined(MBEDTLS_CIPHER_MODE_CFB)
1478 { MBEDTLS_CIPHER_CAMELLIA_128_CFB128, &camellia_128_cfb128_info },
1479 { MBEDTLS_CIPHER_CAMELLIA_192_CFB128, &camellia_192_cfb128_info },
1480 { MBEDTLS_CIPHER_CAMELLIA_256_CFB128, &camellia_256_cfb128_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001481#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001482#if defined(MBEDTLS_CIPHER_MODE_CTR)
1483 { MBEDTLS_CIPHER_CAMELLIA_128_CTR, &camellia_128_ctr_info },
1484 { MBEDTLS_CIPHER_CAMELLIA_192_CTR, &camellia_192_ctr_info },
1485 { MBEDTLS_CIPHER_CAMELLIA_256_CTR, &camellia_256_ctr_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001486#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001487#if defined(MBEDTLS_GCM_C)
1488 { MBEDTLS_CIPHER_CAMELLIA_128_GCM, &camellia_128_gcm_info },
1489 { MBEDTLS_CIPHER_CAMELLIA_192_GCM, &camellia_192_gcm_info },
1490 { MBEDTLS_CIPHER_CAMELLIA_256_GCM, &camellia_256_gcm_info },
Manuel Pégourié-Gonnard87181d12013-10-24 14:02:40 +02001491#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001492#if defined(MBEDTLS_CCM_C)
1493 { MBEDTLS_CIPHER_CAMELLIA_128_CCM, &camellia_128_ccm_info },
1494 { MBEDTLS_CIPHER_CAMELLIA_192_CCM, &camellia_192_ccm_info },
1495 { MBEDTLS_CIPHER_CAMELLIA_256_CCM, &camellia_256_ccm_info },
Manuel Pégourié-Gonnard41936952014-05-13 13:18:17 +02001496#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001497#endif /* MBEDTLS_CAMELLIA_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001498
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001499#if defined(MBEDTLS_DES_C)
1500 { MBEDTLS_CIPHER_DES_ECB, &des_ecb_info },
1501 { MBEDTLS_CIPHER_DES_EDE_ECB, &des_ede_ecb_info },
1502 { MBEDTLS_CIPHER_DES_EDE3_ECB, &des_ede3_ecb_info },
1503#if defined(MBEDTLS_CIPHER_MODE_CBC)
1504 { MBEDTLS_CIPHER_DES_CBC, &des_cbc_info },
1505 { MBEDTLS_CIPHER_DES_EDE_CBC, &des_ede_cbc_info },
1506 { MBEDTLS_CIPHER_DES_EDE3_CBC, &des_ede3_cbc_info },
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001507#endif
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001508#endif /* MBEDTLS_DES_C */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001509
Daniel Kingbd920622016-05-15 19:56:20 -03001510#if defined(MBEDTLS_CHACHA20_C)
1511 { MBEDTLS_CIPHER_CHACHA20, &chacha20_info },
1512#endif
1513
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001514#if defined(MBEDTLS_CIPHER_NULL_CIPHER)
1515 { MBEDTLS_CIPHER_NULL, &null_cipher_info },
1516#endif /* MBEDTLS_CIPHER_NULL_CIPHER */
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001517
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001518 { MBEDTLS_CIPHER_NONE, NULL }
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001519};
1520
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001521#define NUM_CIPHERS sizeof mbedtls_cipher_definitions / sizeof mbedtls_cipher_definitions[0]
1522int mbedtls_cipher_supported[NUM_CIPHERS];
Manuel Pégourié-Gonnarddace82f2013-09-18 15:12:07 +02001523
Manuel Pégourié-Gonnard2cf5a7c2015-04-08 12:49:31 +02001524#endif /* MBEDTLS_CIPHER_C */