4 * \brief Generic cipher wrapper for mbed TLS
6 * \author Adriaan de Jong <dejong@fox-it.com>
8 * Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
9 * SPDX-License-Identifier: Apache-2.0
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
15 * http://www.apache.org/licenses/LICENSE-2.0
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.
23 * This file is part of mbed TLS (https://tls.mbed.org)
26 #if !defined(MBEDTLS_CONFIG_FILE)
27 #include "mbedtls/config.h"
29 #include MBEDTLS_CONFIG_FILE
32 #if defined(MBEDTLS_CIPHER_C)
34 #include "mbedtls/cipher_internal.h"
36 #if defined(MBEDTLS_CHACHAPOLY_C)
37 #include "mbedtls/chachapoly.h"
40 #if defined(MBEDTLS_AES_C)
41 #include "mbedtls/aes.h"
44 #if defined(MBEDTLS_ARC4_C)
45 #include "mbedtls/arc4.h"
48 #if defined(MBEDTLS_CAMELLIA_C)
49 #include "mbedtls/camellia.h"
52 #if defined(MBEDTLS_ARIA_C)
53 #include "mbedtls/aria.h"
56 #if defined(MBEDTLS_DES_C)
57 #include "mbedtls/des.h"
60 #if defined(MBEDTLS_BLOWFISH_C)
61 #include "mbedtls/blowfish.h"
64 #if defined(MBEDTLS_CHACHA20_C)
65 #include "mbedtls/chacha20.h"
68 #if defined(MBEDTLS_GCM_C)
69 #include "mbedtls/gcm.h"
72 #if defined(MBEDTLS_CCM_C)
73 #include "mbedtls/ccm.h"
76 #if defined(MBEDTLS_NIST_KW_C)
77 #include "mbedtls/nist_kw.h"
80 #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
84 #if defined(MBEDTLS_PLATFORM_C)
85 #include "mbedtls/platform.h"
88 #define mbedtls_calloc calloc
89 #define mbedtls_free free
92 #if defined(MBEDTLS_GCM_C)
93 /* shared by all GCM ciphers */
94 static void *gcm_ctx_alloc( void )
96 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_gcm_context ) );
99 mbedtls_gcm_init( (mbedtls_gcm_context *) ctx );
104 static void gcm_ctx_free( void *ctx )
106 mbedtls_gcm_free( ctx );
109 #endif /* MBEDTLS_GCM_C */
111 #if defined(MBEDTLS_CCM_C)
112 /* shared by all CCM ciphers */
113 static void *ccm_ctx_alloc( void )
115 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_ccm_context ) );
118 mbedtls_ccm_init( (mbedtls_ccm_context *) ctx );
123 static void ccm_ctx_free( void *ctx )
125 mbedtls_ccm_free( ctx );
128 #endif /* MBEDTLS_CCM_C */
130 #if defined(MBEDTLS_AES_C)
132 static int aes_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
133 const unsigned char *input, unsigned char *output )
135 return mbedtls_aes_crypt_ecb( (mbedtls_aes_context *) ctx, operation, input, output );
138 #if defined(MBEDTLS_CIPHER_MODE_CBC)
139 static int aes_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
140 unsigned char *iv, const unsigned char *input, unsigned char *output )
142 return mbedtls_aes_crypt_cbc( (mbedtls_aes_context *) ctx, operation, length, iv, input,
145 #endif /* MBEDTLS_CIPHER_MODE_CBC */
147 #if defined(MBEDTLS_CIPHER_MODE_CFB)
148 static int aes_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
149 size_t length, size_t *iv_off, unsigned char *iv,
150 const unsigned char *input, unsigned char *output )
152 return mbedtls_aes_crypt_cfb128( (mbedtls_aes_context *) ctx, operation, length, iv_off, iv,
155 #endif /* MBEDTLS_CIPHER_MODE_CFB */
157 #if defined(MBEDTLS_CIPHER_MODE_OFB)
158 static int aes_crypt_ofb_wrap( void *ctx, size_t length, size_t *iv_off,
159 unsigned char *iv, const unsigned char *input, unsigned char *output )
161 return mbedtls_aes_crypt_ofb( (mbedtls_aes_context *) ctx, length, iv_off,
164 #endif /* MBEDTLS_CIPHER_MODE_OFB */
166 #if defined(MBEDTLS_CIPHER_MODE_CTR)
167 static int aes_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
168 unsigned char *nonce_counter, unsigned char *stream_block,
169 const unsigned char *input, unsigned char *output )
171 return mbedtls_aes_crypt_ctr( (mbedtls_aes_context *) ctx, length, nc_off, nonce_counter,
172 stream_block, input, output );
174 #endif /* MBEDTLS_CIPHER_MODE_CTR */
176 #if defined(MBEDTLS_CIPHER_MODE_XTS)
177 static int aes_crypt_xts_wrap( void *ctx, mbedtls_operation_t operation,
179 const unsigned char data_unit[16],
180 const unsigned char *input,
181 unsigned char *output )
183 mbedtls_aes_xts_context *xts_ctx = ctx;
188 case MBEDTLS_ENCRYPT:
189 mode = MBEDTLS_AES_ENCRYPT;
191 case MBEDTLS_DECRYPT:
192 mode = MBEDTLS_AES_DECRYPT;
195 return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
198 return mbedtls_aes_crypt_xts( xts_ctx, mode, length,
199 data_unit, input, output );
201 #endif /* MBEDTLS_CIPHER_MODE_XTS */
203 static int aes_setkey_dec_wrap( void *ctx, const unsigned char *key,
204 unsigned int key_bitlen )
206 return mbedtls_aes_setkey_dec( (mbedtls_aes_context *) ctx, key, key_bitlen );
209 static int aes_setkey_enc_wrap( void *ctx, const unsigned char *key,
210 unsigned int key_bitlen )
212 return mbedtls_aes_setkey_enc( (mbedtls_aes_context *) ctx, key, key_bitlen );
215 static void * aes_ctx_alloc( void )
217 mbedtls_aes_context *aes = mbedtls_calloc( 1, sizeof( mbedtls_aes_context ) );
222 mbedtls_aes_init( aes );
227 static void aes_ctx_free( void *ctx )
229 mbedtls_aes_free( (mbedtls_aes_context *) ctx );
233 static const mbedtls_cipher_base_t aes_info = {
234 MBEDTLS_CIPHER_ID_AES,
236 #if defined(MBEDTLS_CIPHER_MODE_CBC)
239 #if defined(MBEDTLS_CIPHER_MODE_CFB)
240 aes_crypt_cfb128_wrap,
242 #if defined(MBEDTLS_CIPHER_MODE_OFB)
245 #if defined(MBEDTLS_CIPHER_MODE_CTR)
248 #if defined(MBEDTLS_CIPHER_MODE_XTS)
251 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
260 static const mbedtls_cipher_info_t aes_128_ecb_info = {
261 MBEDTLS_CIPHER_AES_128_ECB,
271 static const mbedtls_cipher_info_t aes_192_ecb_info = {
272 MBEDTLS_CIPHER_AES_192_ECB,
282 static const mbedtls_cipher_info_t aes_256_ecb_info = {
283 MBEDTLS_CIPHER_AES_256_ECB,
293 #if defined(MBEDTLS_CIPHER_MODE_CBC)
294 static const mbedtls_cipher_info_t aes_128_cbc_info = {
295 MBEDTLS_CIPHER_AES_128_CBC,
305 static const mbedtls_cipher_info_t aes_192_cbc_info = {
306 MBEDTLS_CIPHER_AES_192_CBC,
316 static const mbedtls_cipher_info_t aes_256_cbc_info = {
317 MBEDTLS_CIPHER_AES_256_CBC,
326 #endif /* MBEDTLS_CIPHER_MODE_CBC */
328 #if defined(MBEDTLS_CIPHER_MODE_CFB)
329 static const mbedtls_cipher_info_t aes_128_cfb128_info = {
330 MBEDTLS_CIPHER_AES_128_CFB128,
340 static const mbedtls_cipher_info_t aes_192_cfb128_info = {
341 MBEDTLS_CIPHER_AES_192_CFB128,
351 static const mbedtls_cipher_info_t aes_256_cfb128_info = {
352 MBEDTLS_CIPHER_AES_256_CFB128,
361 #endif /* MBEDTLS_CIPHER_MODE_CFB */
363 #if defined(MBEDTLS_CIPHER_MODE_OFB)
364 static const mbedtls_cipher_info_t aes_128_ofb_info = {
365 MBEDTLS_CIPHER_AES_128_OFB,
375 static const mbedtls_cipher_info_t aes_192_ofb_info = {
376 MBEDTLS_CIPHER_AES_192_OFB,
386 static const mbedtls_cipher_info_t aes_256_ofb_info = {
387 MBEDTLS_CIPHER_AES_256_OFB,
396 #endif /* MBEDTLS_CIPHER_MODE_OFB */
398 #if defined(MBEDTLS_CIPHER_MODE_CTR)
399 static const mbedtls_cipher_info_t aes_128_ctr_info = {
400 MBEDTLS_CIPHER_AES_128_CTR,
410 static const mbedtls_cipher_info_t aes_192_ctr_info = {
411 MBEDTLS_CIPHER_AES_192_CTR,
421 static const mbedtls_cipher_info_t aes_256_ctr_info = {
422 MBEDTLS_CIPHER_AES_256_CTR,
431 #endif /* MBEDTLS_CIPHER_MODE_CTR */
433 #if defined(MBEDTLS_CIPHER_MODE_XTS)
434 static int xts_aes_setkey_enc_wrap( void *ctx, const unsigned char *key,
435 unsigned int key_bitlen )
437 mbedtls_aes_xts_context *xts_ctx = ctx;
438 return( mbedtls_aes_xts_setkey_enc( xts_ctx, key, key_bitlen ) );
441 static int xts_aes_setkey_dec_wrap( void *ctx, const unsigned char *key,
442 unsigned int key_bitlen )
444 mbedtls_aes_xts_context *xts_ctx = ctx;
445 return( mbedtls_aes_xts_setkey_dec( xts_ctx, key, key_bitlen ) );
448 static void *xts_aes_ctx_alloc( void )
450 mbedtls_aes_xts_context *xts_ctx = mbedtls_calloc( 1, sizeof( *xts_ctx ) );
452 if( xts_ctx != NULL )
453 mbedtls_aes_xts_init( xts_ctx );
458 static void xts_aes_ctx_free( void *ctx )
460 mbedtls_aes_xts_context *xts_ctx = ctx;
462 if( xts_ctx == NULL )
465 mbedtls_aes_xts_free( xts_ctx );
466 mbedtls_free( xts_ctx );
469 static const mbedtls_cipher_base_t xts_aes_info = {
470 MBEDTLS_CIPHER_ID_AES,
472 #if defined(MBEDTLS_CIPHER_MODE_CBC)
475 #if defined(MBEDTLS_CIPHER_MODE_CFB)
478 #if defined(MBEDTLS_CIPHER_MODE_OFB)
481 #if defined(MBEDTLS_CIPHER_MODE_CTR)
484 #if defined(MBEDTLS_CIPHER_MODE_XTS)
487 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
490 xts_aes_setkey_enc_wrap,
491 xts_aes_setkey_dec_wrap,
496 static const mbedtls_cipher_info_t aes_128_xts_info = {
497 MBEDTLS_CIPHER_AES_128_XTS,
507 static const mbedtls_cipher_info_t aes_256_xts_info = {
508 MBEDTLS_CIPHER_AES_256_XTS,
517 #endif /* MBEDTLS_CIPHER_MODE_XTS */
519 #if defined(MBEDTLS_GCM_C)
520 static int gcm_aes_setkey_wrap( void *ctx, const unsigned char *key,
521 unsigned int key_bitlen )
523 return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
527 static const mbedtls_cipher_base_t gcm_aes_info = {
528 MBEDTLS_CIPHER_ID_AES,
530 #if defined(MBEDTLS_CIPHER_MODE_CBC)
533 #if defined(MBEDTLS_CIPHER_MODE_CFB)
536 #if defined(MBEDTLS_CIPHER_MODE_OFB)
539 #if defined(MBEDTLS_CIPHER_MODE_CTR)
542 #if defined(MBEDTLS_CIPHER_MODE_XTS)
545 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
554 static const mbedtls_cipher_info_t aes_128_gcm_info = {
555 MBEDTLS_CIPHER_AES_128_GCM,
560 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
565 static const mbedtls_cipher_info_t aes_192_gcm_info = {
566 MBEDTLS_CIPHER_AES_192_GCM,
571 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
576 static const mbedtls_cipher_info_t aes_256_gcm_info = {
577 MBEDTLS_CIPHER_AES_256_GCM,
582 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
586 #endif /* MBEDTLS_GCM_C */
588 #if defined(MBEDTLS_CCM_C)
589 static int ccm_aes_setkey_wrap( void *ctx, const unsigned char *key,
590 unsigned int key_bitlen )
592 return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
596 static const mbedtls_cipher_base_t ccm_aes_info = {
597 MBEDTLS_CIPHER_ID_AES,
599 #if defined(MBEDTLS_CIPHER_MODE_CBC)
602 #if defined(MBEDTLS_CIPHER_MODE_CFB)
605 #if defined(MBEDTLS_CIPHER_MODE_OFB)
608 #if defined(MBEDTLS_CIPHER_MODE_CTR)
611 #if defined(MBEDTLS_CIPHER_MODE_XTS)
614 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
623 static const mbedtls_cipher_info_t aes_128_ccm_info = {
624 MBEDTLS_CIPHER_AES_128_CCM,
629 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
634 static const mbedtls_cipher_info_t aes_192_ccm_info = {
635 MBEDTLS_CIPHER_AES_192_CCM,
640 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
645 static const mbedtls_cipher_info_t aes_256_ccm_info = {
646 MBEDTLS_CIPHER_AES_256_CCM,
651 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
655 #endif /* MBEDTLS_CCM_C */
657 #endif /* MBEDTLS_AES_C */
659 #if defined(MBEDTLS_CAMELLIA_C)
661 static int camellia_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
662 const unsigned char *input, unsigned char *output )
664 return mbedtls_camellia_crypt_ecb( (mbedtls_camellia_context *) ctx, operation, input,
668 #if defined(MBEDTLS_CIPHER_MODE_CBC)
669 static int camellia_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
670 size_t length, unsigned char *iv,
671 const unsigned char *input, unsigned char *output )
673 return mbedtls_camellia_crypt_cbc( (mbedtls_camellia_context *) ctx, operation, length, iv,
676 #endif /* MBEDTLS_CIPHER_MODE_CBC */
678 #if defined(MBEDTLS_CIPHER_MODE_CFB)
679 static int camellia_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
680 size_t length, size_t *iv_off, unsigned char *iv,
681 const unsigned char *input, unsigned char *output )
683 return mbedtls_camellia_crypt_cfb128( (mbedtls_camellia_context *) ctx, operation, length,
684 iv_off, iv, input, output );
686 #endif /* MBEDTLS_CIPHER_MODE_CFB */
688 #if defined(MBEDTLS_CIPHER_MODE_CTR)
689 static int camellia_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
690 unsigned char *nonce_counter, unsigned char *stream_block,
691 const unsigned char *input, unsigned char *output )
693 return mbedtls_camellia_crypt_ctr( (mbedtls_camellia_context *) ctx, length, nc_off,
694 nonce_counter, stream_block, input, output );
696 #endif /* MBEDTLS_CIPHER_MODE_CTR */
698 static int camellia_setkey_dec_wrap( void *ctx, const unsigned char *key,
699 unsigned int key_bitlen )
701 return mbedtls_camellia_setkey_dec( (mbedtls_camellia_context *) ctx, key, key_bitlen );
704 static int camellia_setkey_enc_wrap( void *ctx, const unsigned char *key,
705 unsigned int key_bitlen )
707 return mbedtls_camellia_setkey_enc( (mbedtls_camellia_context *) ctx, key, key_bitlen );
710 static void * camellia_ctx_alloc( void )
712 mbedtls_camellia_context *ctx;
713 ctx = mbedtls_calloc( 1, sizeof( mbedtls_camellia_context ) );
718 mbedtls_camellia_init( ctx );
723 static void camellia_ctx_free( void *ctx )
725 mbedtls_camellia_free( (mbedtls_camellia_context *) ctx );
729 static const mbedtls_cipher_base_t camellia_info = {
730 MBEDTLS_CIPHER_ID_CAMELLIA,
731 camellia_crypt_ecb_wrap,
732 #if defined(MBEDTLS_CIPHER_MODE_CBC)
733 camellia_crypt_cbc_wrap,
735 #if defined(MBEDTLS_CIPHER_MODE_CFB)
736 camellia_crypt_cfb128_wrap,
738 #if defined(MBEDTLS_CIPHER_MODE_OFB)
741 #if defined(MBEDTLS_CIPHER_MODE_CTR)
742 camellia_crypt_ctr_wrap,
744 #if defined(MBEDTLS_CIPHER_MODE_XTS)
747 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
750 camellia_setkey_enc_wrap,
751 camellia_setkey_dec_wrap,
756 static const mbedtls_cipher_info_t camellia_128_ecb_info = {
757 MBEDTLS_CIPHER_CAMELLIA_128_ECB,
767 static const mbedtls_cipher_info_t camellia_192_ecb_info = {
768 MBEDTLS_CIPHER_CAMELLIA_192_ECB,
778 static const mbedtls_cipher_info_t camellia_256_ecb_info = {
779 MBEDTLS_CIPHER_CAMELLIA_256_ECB,
789 #if defined(MBEDTLS_CIPHER_MODE_CBC)
790 static const mbedtls_cipher_info_t camellia_128_cbc_info = {
791 MBEDTLS_CIPHER_CAMELLIA_128_CBC,
801 static const mbedtls_cipher_info_t camellia_192_cbc_info = {
802 MBEDTLS_CIPHER_CAMELLIA_192_CBC,
812 static const mbedtls_cipher_info_t camellia_256_cbc_info = {
813 MBEDTLS_CIPHER_CAMELLIA_256_CBC,
822 #endif /* MBEDTLS_CIPHER_MODE_CBC */
824 #if defined(MBEDTLS_CIPHER_MODE_CFB)
825 static const mbedtls_cipher_info_t camellia_128_cfb128_info = {
826 MBEDTLS_CIPHER_CAMELLIA_128_CFB128,
829 "CAMELLIA-128-CFB128",
836 static const mbedtls_cipher_info_t camellia_192_cfb128_info = {
837 MBEDTLS_CIPHER_CAMELLIA_192_CFB128,
840 "CAMELLIA-192-CFB128",
847 static const mbedtls_cipher_info_t camellia_256_cfb128_info = {
848 MBEDTLS_CIPHER_CAMELLIA_256_CFB128,
851 "CAMELLIA-256-CFB128",
857 #endif /* MBEDTLS_CIPHER_MODE_CFB */
859 #if defined(MBEDTLS_CIPHER_MODE_CTR)
860 static const mbedtls_cipher_info_t camellia_128_ctr_info = {
861 MBEDTLS_CIPHER_CAMELLIA_128_CTR,
871 static const mbedtls_cipher_info_t camellia_192_ctr_info = {
872 MBEDTLS_CIPHER_CAMELLIA_192_CTR,
882 static const mbedtls_cipher_info_t camellia_256_ctr_info = {
883 MBEDTLS_CIPHER_CAMELLIA_256_CTR,
892 #endif /* MBEDTLS_CIPHER_MODE_CTR */
894 #if defined(MBEDTLS_GCM_C)
895 static int gcm_camellia_setkey_wrap( void *ctx, const unsigned char *key,
896 unsigned int key_bitlen )
898 return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
902 static const mbedtls_cipher_base_t gcm_camellia_info = {
903 MBEDTLS_CIPHER_ID_CAMELLIA,
905 #if defined(MBEDTLS_CIPHER_MODE_CBC)
908 #if defined(MBEDTLS_CIPHER_MODE_CFB)
911 #if defined(MBEDTLS_CIPHER_MODE_OFB)
914 #if defined(MBEDTLS_CIPHER_MODE_CTR)
917 #if defined(MBEDTLS_CIPHER_MODE_XTS)
920 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
923 gcm_camellia_setkey_wrap,
924 gcm_camellia_setkey_wrap,
929 static const mbedtls_cipher_info_t camellia_128_gcm_info = {
930 MBEDTLS_CIPHER_CAMELLIA_128_GCM,
935 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
940 static const mbedtls_cipher_info_t camellia_192_gcm_info = {
941 MBEDTLS_CIPHER_CAMELLIA_192_GCM,
946 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
951 static const mbedtls_cipher_info_t camellia_256_gcm_info = {
952 MBEDTLS_CIPHER_CAMELLIA_256_GCM,
957 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
961 #endif /* MBEDTLS_GCM_C */
963 #if defined(MBEDTLS_CCM_C)
964 static int ccm_camellia_setkey_wrap( void *ctx, const unsigned char *key,
965 unsigned int key_bitlen )
967 return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
971 static const mbedtls_cipher_base_t ccm_camellia_info = {
972 MBEDTLS_CIPHER_ID_CAMELLIA,
974 #if defined(MBEDTLS_CIPHER_MODE_CBC)
977 #if defined(MBEDTLS_CIPHER_MODE_CFB)
980 #if defined(MBEDTLS_CIPHER_MODE_OFB)
983 #if defined(MBEDTLS_CIPHER_MODE_CTR)
986 #if defined(MBEDTLS_CIPHER_MODE_XTS)
989 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
992 ccm_camellia_setkey_wrap,
993 ccm_camellia_setkey_wrap,
998 static const mbedtls_cipher_info_t camellia_128_ccm_info = {
999 MBEDTLS_CIPHER_CAMELLIA_128_CCM,
1004 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
1009 static const mbedtls_cipher_info_t camellia_192_ccm_info = {
1010 MBEDTLS_CIPHER_CAMELLIA_192_CCM,
1015 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
1020 static const mbedtls_cipher_info_t camellia_256_ccm_info = {
1021 MBEDTLS_CIPHER_CAMELLIA_256_CCM,
1026 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
1030 #endif /* MBEDTLS_CCM_C */
1032 #endif /* MBEDTLS_CAMELLIA_C */
1034 #if defined(MBEDTLS_ARIA_C)
1036 static int aria_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
1037 const unsigned char *input, unsigned char *output )
1040 return mbedtls_aria_crypt_ecb( (mbedtls_aria_context *) ctx, input,
1044 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1045 static int aria_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
1046 size_t length, unsigned char *iv,
1047 const unsigned char *input, unsigned char *output )
1049 return mbedtls_aria_crypt_cbc( (mbedtls_aria_context *) ctx, operation, length, iv,
1052 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1054 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1055 static int aria_crypt_cfb128_wrap( void *ctx, mbedtls_operation_t operation,
1056 size_t length, size_t *iv_off, unsigned char *iv,
1057 const unsigned char *input, unsigned char *output )
1059 return mbedtls_aria_crypt_cfb128( (mbedtls_aria_context *) ctx, operation, length,
1060 iv_off, iv, input, output );
1062 #endif /* MBEDTLS_CIPHER_MODE_CFB */
1064 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1065 static int aria_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
1066 unsigned char *nonce_counter, unsigned char *stream_block,
1067 const unsigned char *input, unsigned char *output )
1069 return mbedtls_aria_crypt_ctr( (mbedtls_aria_context *) ctx, length, nc_off,
1070 nonce_counter, stream_block, input, output );
1072 #endif /* MBEDTLS_CIPHER_MODE_CTR */
1074 static int aria_setkey_dec_wrap( void *ctx, const unsigned char *key,
1075 unsigned int key_bitlen )
1077 return mbedtls_aria_setkey_dec( (mbedtls_aria_context *) ctx, key, key_bitlen );
1080 static int aria_setkey_enc_wrap( void *ctx, const unsigned char *key,
1081 unsigned int key_bitlen )
1083 return mbedtls_aria_setkey_enc( (mbedtls_aria_context *) ctx, key, key_bitlen );
1086 static void * aria_ctx_alloc( void )
1088 mbedtls_aria_context *ctx;
1089 ctx = mbedtls_calloc( 1, sizeof( mbedtls_aria_context ) );
1094 mbedtls_aria_init( ctx );
1099 static void aria_ctx_free( void *ctx )
1101 mbedtls_aria_free( (mbedtls_aria_context *) ctx );
1102 mbedtls_free( ctx );
1105 static const mbedtls_cipher_base_t aria_info = {
1106 MBEDTLS_CIPHER_ID_ARIA,
1107 aria_crypt_ecb_wrap,
1108 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1109 aria_crypt_cbc_wrap,
1111 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1112 aria_crypt_cfb128_wrap,
1114 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1117 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1118 aria_crypt_ctr_wrap,
1120 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1123 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
1126 aria_setkey_enc_wrap,
1127 aria_setkey_dec_wrap,
1132 static const mbedtls_cipher_info_t aria_128_ecb_info = {
1133 MBEDTLS_CIPHER_ARIA_128_ECB,
1143 static const mbedtls_cipher_info_t aria_192_ecb_info = {
1144 MBEDTLS_CIPHER_ARIA_192_ECB,
1154 static const mbedtls_cipher_info_t aria_256_ecb_info = {
1155 MBEDTLS_CIPHER_ARIA_256_ECB,
1165 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1166 static const mbedtls_cipher_info_t aria_128_cbc_info = {
1167 MBEDTLS_CIPHER_ARIA_128_CBC,
1177 static const mbedtls_cipher_info_t aria_192_cbc_info = {
1178 MBEDTLS_CIPHER_ARIA_192_CBC,
1188 static const mbedtls_cipher_info_t aria_256_cbc_info = {
1189 MBEDTLS_CIPHER_ARIA_256_CBC,
1198 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1200 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1201 static const mbedtls_cipher_info_t aria_128_cfb128_info = {
1202 MBEDTLS_CIPHER_ARIA_128_CFB128,
1212 static const mbedtls_cipher_info_t aria_192_cfb128_info = {
1213 MBEDTLS_CIPHER_ARIA_192_CFB128,
1223 static const mbedtls_cipher_info_t aria_256_cfb128_info = {
1224 MBEDTLS_CIPHER_ARIA_256_CFB128,
1233 #endif /* MBEDTLS_CIPHER_MODE_CFB */
1235 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1236 static const mbedtls_cipher_info_t aria_128_ctr_info = {
1237 MBEDTLS_CIPHER_ARIA_128_CTR,
1247 static const mbedtls_cipher_info_t aria_192_ctr_info = {
1248 MBEDTLS_CIPHER_ARIA_192_CTR,
1258 static const mbedtls_cipher_info_t aria_256_ctr_info = {
1259 MBEDTLS_CIPHER_ARIA_256_CTR,
1268 #endif /* MBEDTLS_CIPHER_MODE_CTR */
1270 #if defined(MBEDTLS_GCM_C)
1271 static int gcm_aria_setkey_wrap( void *ctx, const unsigned char *key,
1272 unsigned int key_bitlen )
1274 return mbedtls_gcm_setkey( (mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_ARIA,
1278 static const mbedtls_cipher_base_t gcm_aria_info = {
1279 MBEDTLS_CIPHER_ID_ARIA,
1281 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1284 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1287 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1290 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1293 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1296 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
1299 gcm_aria_setkey_wrap,
1300 gcm_aria_setkey_wrap,
1305 static const mbedtls_cipher_info_t aria_128_gcm_info = {
1306 MBEDTLS_CIPHER_ARIA_128_GCM,
1311 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
1316 static const mbedtls_cipher_info_t aria_192_gcm_info = {
1317 MBEDTLS_CIPHER_ARIA_192_GCM,
1322 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
1327 static const mbedtls_cipher_info_t aria_256_gcm_info = {
1328 MBEDTLS_CIPHER_ARIA_256_GCM,
1333 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
1337 #endif /* MBEDTLS_GCM_C */
1339 #if defined(MBEDTLS_CCM_C)
1340 static int ccm_aria_setkey_wrap( void *ctx, const unsigned char *key,
1341 unsigned int key_bitlen )
1343 return mbedtls_ccm_setkey( (mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_ARIA,
1347 static const mbedtls_cipher_base_t ccm_aria_info = {
1348 MBEDTLS_CIPHER_ID_ARIA,
1350 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1353 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1356 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1359 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1362 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1365 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
1368 ccm_aria_setkey_wrap,
1369 ccm_aria_setkey_wrap,
1374 static const mbedtls_cipher_info_t aria_128_ccm_info = {
1375 MBEDTLS_CIPHER_ARIA_128_CCM,
1380 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
1385 static const mbedtls_cipher_info_t aria_192_ccm_info = {
1386 MBEDTLS_CIPHER_ARIA_192_CCM,
1391 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
1396 static const mbedtls_cipher_info_t aria_256_ccm_info = {
1397 MBEDTLS_CIPHER_ARIA_256_CCM,
1402 MBEDTLS_CIPHER_VARIABLE_IV_LEN,
1406 #endif /* MBEDTLS_CCM_C */
1408 #endif /* MBEDTLS_ARIA_C */
1410 #if defined(MBEDTLS_DES_C)
1412 static int des_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
1413 const unsigned char *input, unsigned char *output )
1416 return mbedtls_des_crypt_ecb( (mbedtls_des_context *) ctx, input, output );
1419 static int des3_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
1420 const unsigned char *input, unsigned char *output )
1423 return mbedtls_des3_crypt_ecb( (mbedtls_des3_context *) ctx, input, output );
1426 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1427 static int des_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
1428 unsigned char *iv, const unsigned char *input, unsigned char *output )
1430 return mbedtls_des_crypt_cbc( (mbedtls_des_context *) ctx, operation, length, iv, input,
1433 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1435 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1436 static int des3_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation, size_t length,
1437 unsigned char *iv, const unsigned char *input, unsigned char *output )
1439 return mbedtls_des3_crypt_cbc( (mbedtls_des3_context *) ctx, operation, length, iv, input,
1442 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1444 static int des_setkey_dec_wrap( void *ctx, const unsigned char *key,
1445 unsigned int key_bitlen )
1447 ((void) key_bitlen);
1449 return mbedtls_des_setkey_dec( (mbedtls_des_context *) ctx, key );
1452 static int des_setkey_enc_wrap( void *ctx, const unsigned char *key,
1453 unsigned int key_bitlen )
1455 ((void) key_bitlen);
1457 return mbedtls_des_setkey_enc( (mbedtls_des_context *) ctx, key );
1460 static int des3_set2key_dec_wrap( void *ctx, const unsigned char *key,
1461 unsigned int key_bitlen )
1463 ((void) key_bitlen);
1465 return mbedtls_des3_set2key_dec( (mbedtls_des3_context *) ctx, key );
1468 static int des3_set2key_enc_wrap( void *ctx, const unsigned char *key,
1469 unsigned int key_bitlen )
1471 ((void) key_bitlen);
1473 return mbedtls_des3_set2key_enc( (mbedtls_des3_context *) ctx, key );
1476 static int des3_set3key_dec_wrap( void *ctx, const unsigned char *key,
1477 unsigned int key_bitlen )
1479 ((void) key_bitlen);
1481 return mbedtls_des3_set3key_dec( (mbedtls_des3_context *) ctx, key );
1484 static int des3_set3key_enc_wrap( void *ctx, const unsigned char *key,
1485 unsigned int key_bitlen )
1487 ((void) key_bitlen);
1489 return mbedtls_des3_set3key_enc( (mbedtls_des3_context *) ctx, key );
1492 static void * des_ctx_alloc( void )
1494 mbedtls_des_context *des = mbedtls_calloc( 1, sizeof( mbedtls_des_context ) );
1499 mbedtls_des_init( des );
1504 static void des_ctx_free( void *ctx )
1506 mbedtls_des_free( (mbedtls_des_context *) ctx );
1507 mbedtls_free( ctx );
1510 static void * des3_ctx_alloc( void )
1512 mbedtls_des3_context *des3;
1513 des3 = mbedtls_calloc( 1, sizeof( mbedtls_des3_context ) );
1518 mbedtls_des3_init( des3 );
1523 static void des3_ctx_free( void *ctx )
1525 mbedtls_des3_free( (mbedtls_des3_context *) ctx );
1526 mbedtls_free( ctx );
1529 static const mbedtls_cipher_base_t des_info = {
1530 MBEDTLS_CIPHER_ID_DES,
1532 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1535 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1538 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1541 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1544 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1547 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
1550 des_setkey_enc_wrap,
1551 des_setkey_dec_wrap,
1556 static const mbedtls_cipher_info_t des_ecb_info = {
1557 MBEDTLS_CIPHER_DES_ECB,
1559 MBEDTLS_KEY_LENGTH_DES,
1567 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1568 static const mbedtls_cipher_info_t des_cbc_info = {
1569 MBEDTLS_CIPHER_DES_CBC,
1571 MBEDTLS_KEY_LENGTH_DES,
1578 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1580 static const mbedtls_cipher_base_t des_ede_info = {
1581 MBEDTLS_CIPHER_ID_DES,
1582 des3_crypt_ecb_wrap,
1583 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1584 des3_crypt_cbc_wrap,
1586 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1589 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1592 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1595 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1598 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
1601 des3_set2key_enc_wrap,
1602 des3_set2key_dec_wrap,
1607 static const mbedtls_cipher_info_t des_ede_ecb_info = {
1608 MBEDTLS_CIPHER_DES_EDE_ECB,
1610 MBEDTLS_KEY_LENGTH_DES_EDE,
1618 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1619 static const mbedtls_cipher_info_t des_ede_cbc_info = {
1620 MBEDTLS_CIPHER_DES_EDE_CBC,
1622 MBEDTLS_KEY_LENGTH_DES_EDE,
1629 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1631 static const mbedtls_cipher_base_t des_ede3_info = {
1632 MBEDTLS_CIPHER_ID_3DES,
1633 des3_crypt_ecb_wrap,
1634 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1635 des3_crypt_cbc_wrap,
1637 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1640 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1643 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1646 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1649 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
1652 des3_set3key_enc_wrap,
1653 des3_set3key_dec_wrap,
1658 static const mbedtls_cipher_info_t des_ede3_ecb_info = {
1659 MBEDTLS_CIPHER_DES_EDE3_ECB,
1661 MBEDTLS_KEY_LENGTH_DES_EDE3,
1668 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1669 static const mbedtls_cipher_info_t des_ede3_cbc_info = {
1670 MBEDTLS_CIPHER_DES_EDE3_CBC,
1672 MBEDTLS_KEY_LENGTH_DES_EDE3,
1679 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1680 #endif /* MBEDTLS_DES_C */
1682 #if defined(MBEDTLS_BLOWFISH_C)
1684 static int blowfish_crypt_ecb_wrap( void *ctx, mbedtls_operation_t operation,
1685 const unsigned char *input, unsigned char *output )
1687 return mbedtls_blowfish_crypt_ecb( (mbedtls_blowfish_context *) ctx, operation, input,
1691 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1692 static int blowfish_crypt_cbc_wrap( void *ctx, mbedtls_operation_t operation,
1693 size_t length, unsigned char *iv, const unsigned char *input,
1694 unsigned char *output )
1696 return mbedtls_blowfish_crypt_cbc( (mbedtls_blowfish_context *) ctx, operation, length, iv,
1699 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1701 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1702 static int blowfish_crypt_cfb64_wrap( void *ctx, mbedtls_operation_t operation,
1703 size_t length, size_t *iv_off, unsigned char *iv,
1704 const unsigned char *input, unsigned char *output )
1706 return mbedtls_blowfish_crypt_cfb64( (mbedtls_blowfish_context *) ctx, operation, length,
1707 iv_off, iv, input, output );
1709 #endif /* MBEDTLS_CIPHER_MODE_CFB */
1711 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1712 static int blowfish_crypt_ctr_wrap( void *ctx, size_t length, size_t *nc_off,
1713 unsigned char *nonce_counter, unsigned char *stream_block,
1714 const unsigned char *input, unsigned char *output )
1716 return mbedtls_blowfish_crypt_ctr( (mbedtls_blowfish_context *) ctx, length, nc_off,
1717 nonce_counter, stream_block, input, output );
1719 #endif /* MBEDTLS_CIPHER_MODE_CTR */
1721 static int blowfish_setkey_wrap( void *ctx, const unsigned char *key,
1722 unsigned int key_bitlen )
1724 return mbedtls_blowfish_setkey( (mbedtls_blowfish_context *) ctx, key, key_bitlen );
1727 static void * blowfish_ctx_alloc( void )
1729 mbedtls_blowfish_context *ctx;
1730 ctx = mbedtls_calloc( 1, sizeof( mbedtls_blowfish_context ) );
1735 mbedtls_blowfish_init( ctx );
1740 static void blowfish_ctx_free( void *ctx )
1742 mbedtls_blowfish_free( (mbedtls_blowfish_context *) ctx );
1743 mbedtls_free( ctx );
1746 static const mbedtls_cipher_base_t blowfish_info = {
1747 MBEDTLS_CIPHER_ID_BLOWFISH,
1748 blowfish_crypt_ecb_wrap,
1749 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1750 blowfish_crypt_cbc_wrap,
1752 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1753 blowfish_crypt_cfb64_wrap,
1755 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1758 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1759 blowfish_crypt_ctr_wrap,
1761 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1764 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
1767 blowfish_setkey_wrap,
1768 blowfish_setkey_wrap,
1773 static const mbedtls_cipher_info_t blowfish_ecb_info = {
1774 MBEDTLS_CIPHER_BLOWFISH_ECB,
1779 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
1784 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1785 static const mbedtls_cipher_info_t blowfish_cbc_info = {
1786 MBEDTLS_CIPHER_BLOWFISH_CBC,
1791 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
1795 #endif /* MBEDTLS_CIPHER_MODE_CBC */
1797 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1798 static const mbedtls_cipher_info_t blowfish_cfb64_info = {
1799 MBEDTLS_CIPHER_BLOWFISH_CFB64,
1804 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
1808 #endif /* MBEDTLS_CIPHER_MODE_CFB */
1810 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1811 static const mbedtls_cipher_info_t blowfish_ctr_info = {
1812 MBEDTLS_CIPHER_BLOWFISH_CTR,
1817 MBEDTLS_CIPHER_VARIABLE_KEY_LEN,
1821 #endif /* MBEDTLS_CIPHER_MODE_CTR */
1822 #endif /* MBEDTLS_BLOWFISH_C */
1824 #if defined(MBEDTLS_ARC4_C)
1825 static int arc4_crypt_stream_wrap( void *ctx, size_t length,
1826 const unsigned char *input,
1827 unsigned char *output )
1829 return( mbedtls_arc4_crypt( (mbedtls_arc4_context *) ctx, length, input, output ) );
1832 static int arc4_setkey_wrap( void *ctx, const unsigned char *key,
1833 unsigned int key_bitlen )
1835 /* we get key_bitlen in bits, arc4 expects it in bytes */
1836 if( key_bitlen % 8 != 0 )
1837 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
1839 mbedtls_arc4_setup( (mbedtls_arc4_context *) ctx, key, key_bitlen / 8 );
1843 static void * arc4_ctx_alloc( void )
1845 mbedtls_arc4_context *ctx;
1846 ctx = mbedtls_calloc( 1, sizeof( mbedtls_arc4_context ) );
1851 mbedtls_arc4_init( ctx );
1856 static void arc4_ctx_free( void *ctx )
1858 mbedtls_arc4_free( (mbedtls_arc4_context *) ctx );
1859 mbedtls_free( ctx );
1862 static const mbedtls_cipher_base_t arc4_base_info = {
1863 MBEDTLS_CIPHER_ID_ARC4,
1865 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1868 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1871 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1874 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1877 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1880 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
1881 arc4_crypt_stream_wrap,
1889 static const mbedtls_cipher_info_t arc4_128_info = {
1890 MBEDTLS_CIPHER_ARC4_128,
1891 MBEDTLS_MODE_STREAM,
1899 #endif /* MBEDTLS_ARC4_C */
1901 #if defined(MBEDTLS_CHACHA20_C)
1903 static int chacha20_setkey_wrap( void *ctx, const unsigned char *key,
1904 unsigned int key_bitlen )
1906 if( key_bitlen != 256U )
1907 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
1909 if ( 0 != mbedtls_chacha20_setkey( (mbedtls_chacha20_context*)ctx, key ) )
1910 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
1915 static int chacha20_stream_wrap( void *ctx, size_t length,
1916 const unsigned char *input,
1917 unsigned char *output )
1921 ret = mbedtls_chacha20_update( ctx, length, input, output );
1922 if( ret == MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA )
1923 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
1928 static void * chacha20_ctx_alloc( void )
1930 mbedtls_chacha20_context *ctx;
1931 ctx = mbedtls_calloc( 1, sizeof( mbedtls_chacha20_context ) );
1936 mbedtls_chacha20_init( ctx );
1941 static void chacha20_ctx_free( void *ctx )
1943 mbedtls_chacha20_free( (mbedtls_chacha20_context *) ctx );
1944 mbedtls_free( ctx );
1947 static const mbedtls_cipher_base_t chacha20_base_info = {
1948 MBEDTLS_CIPHER_ID_CHACHA20,
1950 #if defined(MBEDTLS_CIPHER_MODE_CBC)
1953 #if defined(MBEDTLS_CIPHER_MODE_CFB)
1956 #if defined(MBEDTLS_CIPHER_MODE_OFB)
1959 #if defined(MBEDTLS_CIPHER_MODE_CTR)
1962 #if defined(MBEDTLS_CIPHER_MODE_XTS)
1965 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
1966 chacha20_stream_wrap,
1968 chacha20_setkey_wrap,
1969 chacha20_setkey_wrap,
1973 static const mbedtls_cipher_info_t chacha20_info = {
1974 MBEDTLS_CIPHER_CHACHA20,
1975 MBEDTLS_MODE_STREAM,
1983 #endif /* MBEDTLS_CHACHA20_C */
1985 #if defined(MBEDTLS_CHACHAPOLY_C)
1987 static int chachapoly_setkey_wrap( void *ctx,
1988 const unsigned char *key,
1989 unsigned int key_bitlen )
1991 if( key_bitlen != 256U )
1992 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
1994 if ( 0 != mbedtls_chachapoly_setkey( (mbedtls_chachapoly_context*)ctx, key ) )
1995 return( MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA );
2000 static void * chachapoly_ctx_alloc( void )
2002 mbedtls_chachapoly_context *ctx;
2003 ctx = mbedtls_calloc( 1, sizeof( mbedtls_chachapoly_context ) );
2008 mbedtls_chachapoly_init( ctx );
2013 static void chachapoly_ctx_free( void *ctx )
2015 mbedtls_chachapoly_free( (mbedtls_chachapoly_context *) ctx );
2016 mbedtls_free( ctx );
2019 static const mbedtls_cipher_base_t chachapoly_base_info = {
2020 MBEDTLS_CIPHER_ID_CHACHA20,
2022 #if defined(MBEDTLS_CIPHER_MODE_CBC)
2025 #if defined(MBEDTLS_CIPHER_MODE_CFB)
2028 #if defined(MBEDTLS_CIPHER_MODE_OFB)
2031 #if defined(MBEDTLS_CIPHER_MODE_CTR)
2034 #if defined(MBEDTLS_CIPHER_MODE_XTS)
2037 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
2040 chachapoly_setkey_wrap,
2041 chachapoly_setkey_wrap,
2042 chachapoly_ctx_alloc,
2045 static const mbedtls_cipher_info_t chachapoly_info = {
2046 MBEDTLS_CIPHER_CHACHA20_POLY1305,
2047 MBEDTLS_MODE_CHACHAPOLY,
2049 "CHACHA20-POLY1305",
2053 &chachapoly_base_info
2055 #endif /* MBEDTLS_CHACHAPOLY_C */
2057 #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
2058 static int null_crypt_stream( void *ctx, size_t length,
2059 const unsigned char *input,
2060 unsigned char *output )
2063 memmove( output, input, length );
2067 static int null_setkey( void *ctx, const unsigned char *key,
2068 unsigned int key_bitlen )
2072 ((void) key_bitlen);
2077 static void * null_ctx_alloc( void )
2079 return( (void *) 1 );
2082 static void null_ctx_free( void *ctx )
2087 static const mbedtls_cipher_base_t null_base_info = {
2088 MBEDTLS_CIPHER_ID_NULL,
2090 #if defined(MBEDTLS_CIPHER_MODE_CBC)
2093 #if defined(MBEDTLS_CIPHER_MODE_CFB)
2096 #if defined(MBEDTLS_CIPHER_MODE_OFB)
2099 #if defined(MBEDTLS_CIPHER_MODE_CTR)
2102 #if defined(MBEDTLS_CIPHER_MODE_XTS)
2105 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
2114 static const mbedtls_cipher_info_t null_cipher_info = {
2115 MBEDTLS_CIPHER_NULL,
2116 MBEDTLS_MODE_STREAM,
2124 #endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */
2126 #if defined(MBEDTLS_NIST_KW_C)
2127 static void *kw_ctx_alloc( void )
2129 void *ctx = mbedtls_calloc( 1, sizeof( mbedtls_nist_kw_context ) );
2132 mbedtls_nist_kw_init( (mbedtls_nist_kw_context *) ctx );
2137 static void kw_ctx_free( void *ctx )
2139 mbedtls_nist_kw_free( ctx );
2140 mbedtls_free( ctx );
2143 static int kw_aes_setkey_wrap( void *ctx, const unsigned char *key,
2144 unsigned int key_bitlen )
2146 return mbedtls_nist_kw_setkey( (mbedtls_nist_kw_context *) ctx,
2147 MBEDTLS_CIPHER_ID_AES, key, key_bitlen, 1 );
2150 static int kw_aes_setkey_unwrap( void *ctx, const unsigned char *key,
2151 unsigned int key_bitlen )
2153 return mbedtls_nist_kw_setkey( (mbedtls_nist_kw_context *) ctx,
2154 MBEDTLS_CIPHER_ID_AES, key, key_bitlen, 0 );
2157 static const mbedtls_cipher_base_t kw_aes_info = {
2158 MBEDTLS_CIPHER_ID_AES,
2160 #if defined(MBEDTLS_CIPHER_MODE_CBC)
2163 #if defined(MBEDTLS_CIPHER_MODE_CFB)
2166 #if defined(MBEDTLS_CIPHER_MODE_OFB)
2169 #if defined(MBEDTLS_CIPHER_MODE_CTR)
2172 #if defined(MBEDTLS_CIPHER_MODE_XTS)
2175 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
2179 kw_aes_setkey_unwrap,
2184 static const mbedtls_cipher_info_t aes_128_nist_kw_info = {
2185 MBEDTLS_CIPHER_AES_128_KW,
2195 static const mbedtls_cipher_info_t aes_192_nist_kw_info = {
2196 MBEDTLS_CIPHER_AES_192_KW,
2206 static const mbedtls_cipher_info_t aes_256_nist_kw_info = {
2207 MBEDTLS_CIPHER_AES_256_KW,
2217 static const mbedtls_cipher_info_t aes_128_nist_kwp_info = {
2218 MBEDTLS_CIPHER_AES_128_KWP,
2228 static const mbedtls_cipher_info_t aes_192_nist_kwp_info = {
2229 MBEDTLS_CIPHER_AES_192_KWP,
2239 static const mbedtls_cipher_info_t aes_256_nist_kwp_info = {
2240 MBEDTLS_CIPHER_AES_256_KWP,
2249 #endif /* MBEDTLS_NIST_KW_C */
2251 const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] =
2253 #if defined(MBEDTLS_AES_C)
2254 { MBEDTLS_CIPHER_AES_128_ECB, &aes_128_ecb_info },
2255 { MBEDTLS_CIPHER_AES_192_ECB, &aes_192_ecb_info },
2256 { MBEDTLS_CIPHER_AES_256_ECB, &aes_256_ecb_info },
2257 #if defined(MBEDTLS_CIPHER_MODE_CBC)
2258 { MBEDTLS_CIPHER_AES_128_CBC, &aes_128_cbc_info },
2259 { MBEDTLS_CIPHER_AES_192_CBC, &aes_192_cbc_info },
2260 { MBEDTLS_CIPHER_AES_256_CBC, &aes_256_cbc_info },
2262 #if defined(MBEDTLS_CIPHER_MODE_CFB)
2263 { MBEDTLS_CIPHER_AES_128_CFB128, &aes_128_cfb128_info },
2264 { MBEDTLS_CIPHER_AES_192_CFB128, &aes_192_cfb128_info },
2265 { MBEDTLS_CIPHER_AES_256_CFB128, &aes_256_cfb128_info },
2267 #if defined(MBEDTLS_CIPHER_MODE_OFB)
2268 { MBEDTLS_CIPHER_AES_128_OFB, &aes_128_ofb_info },
2269 { MBEDTLS_CIPHER_AES_192_OFB, &aes_192_ofb_info },
2270 { MBEDTLS_CIPHER_AES_256_OFB, &aes_256_ofb_info },
2272 #if defined(MBEDTLS_CIPHER_MODE_CTR)
2273 { MBEDTLS_CIPHER_AES_128_CTR, &aes_128_ctr_info },
2274 { MBEDTLS_CIPHER_AES_192_CTR, &aes_192_ctr_info },
2275 { MBEDTLS_CIPHER_AES_256_CTR, &aes_256_ctr_info },
2277 #if defined(MBEDTLS_CIPHER_MODE_XTS)
2278 { MBEDTLS_CIPHER_AES_128_XTS, &aes_128_xts_info },
2279 { MBEDTLS_CIPHER_AES_256_XTS, &aes_256_xts_info },
2281 #if defined(MBEDTLS_GCM_C)
2282 { MBEDTLS_CIPHER_AES_128_GCM, &aes_128_gcm_info },
2283 { MBEDTLS_CIPHER_AES_192_GCM, &aes_192_gcm_info },
2284 { MBEDTLS_CIPHER_AES_256_GCM, &aes_256_gcm_info },
2286 #if defined(MBEDTLS_CCM_C)
2287 { MBEDTLS_CIPHER_AES_128_CCM, &aes_128_ccm_info },
2288 { MBEDTLS_CIPHER_AES_192_CCM, &aes_192_ccm_info },
2289 { MBEDTLS_CIPHER_AES_256_CCM, &aes_256_ccm_info },
2291 #endif /* MBEDTLS_AES_C */
2293 #if defined(MBEDTLS_ARC4_C)
2294 { MBEDTLS_CIPHER_ARC4_128, &arc4_128_info },
2297 #if defined(MBEDTLS_BLOWFISH_C)
2298 { MBEDTLS_CIPHER_BLOWFISH_ECB, &blowfish_ecb_info },
2299 #if defined(MBEDTLS_CIPHER_MODE_CBC)
2300 { MBEDTLS_CIPHER_BLOWFISH_CBC, &blowfish_cbc_info },
2302 #if defined(MBEDTLS_CIPHER_MODE_CFB)
2303 { MBEDTLS_CIPHER_BLOWFISH_CFB64, &blowfish_cfb64_info },
2305 #if defined(MBEDTLS_CIPHER_MODE_CTR)
2306 { MBEDTLS_CIPHER_BLOWFISH_CTR, &blowfish_ctr_info },
2308 #endif /* MBEDTLS_BLOWFISH_C */
2310 #if defined(MBEDTLS_CAMELLIA_C)
2311 { MBEDTLS_CIPHER_CAMELLIA_128_ECB, &camellia_128_ecb_info },
2312 { MBEDTLS_CIPHER_CAMELLIA_192_ECB, &camellia_192_ecb_info },
2313 { MBEDTLS_CIPHER_CAMELLIA_256_ECB, &camellia_256_ecb_info },
2314 #if defined(MBEDTLS_CIPHER_MODE_CBC)
2315 { MBEDTLS_CIPHER_CAMELLIA_128_CBC, &camellia_128_cbc_info },
2316 { MBEDTLS_CIPHER_CAMELLIA_192_CBC, &camellia_192_cbc_info },
2317 { MBEDTLS_CIPHER_CAMELLIA_256_CBC, &camellia_256_cbc_info },
2319 #if defined(MBEDTLS_CIPHER_MODE_CFB)
2320 { MBEDTLS_CIPHER_CAMELLIA_128_CFB128, &camellia_128_cfb128_info },
2321 { MBEDTLS_CIPHER_CAMELLIA_192_CFB128, &camellia_192_cfb128_info },
2322 { MBEDTLS_CIPHER_CAMELLIA_256_CFB128, &camellia_256_cfb128_info },
2324 #if defined(MBEDTLS_CIPHER_MODE_CTR)
2325 { MBEDTLS_CIPHER_CAMELLIA_128_CTR, &camellia_128_ctr_info },
2326 { MBEDTLS_CIPHER_CAMELLIA_192_CTR, &camellia_192_ctr_info },
2327 { MBEDTLS_CIPHER_CAMELLIA_256_CTR, &camellia_256_ctr_info },
2329 #if defined(MBEDTLS_GCM_C)
2330 { MBEDTLS_CIPHER_CAMELLIA_128_GCM, &camellia_128_gcm_info },
2331 { MBEDTLS_CIPHER_CAMELLIA_192_GCM, &camellia_192_gcm_info },
2332 { MBEDTLS_CIPHER_CAMELLIA_256_GCM, &camellia_256_gcm_info },
2334 #if defined(MBEDTLS_CCM_C)
2335 { MBEDTLS_CIPHER_CAMELLIA_128_CCM, &camellia_128_ccm_info },
2336 { MBEDTLS_CIPHER_CAMELLIA_192_CCM, &camellia_192_ccm_info },
2337 { MBEDTLS_CIPHER_CAMELLIA_256_CCM, &camellia_256_ccm_info },
2339 #endif /* MBEDTLS_CAMELLIA_C */
2341 #if defined(MBEDTLS_ARIA_C)
2342 { MBEDTLS_CIPHER_ARIA_128_ECB, &aria_128_ecb_info },
2343 { MBEDTLS_CIPHER_ARIA_192_ECB, &aria_192_ecb_info },
2344 { MBEDTLS_CIPHER_ARIA_256_ECB, &aria_256_ecb_info },
2345 #if defined(MBEDTLS_CIPHER_MODE_CBC)
2346 { MBEDTLS_CIPHER_ARIA_128_CBC, &aria_128_cbc_info },
2347 { MBEDTLS_CIPHER_ARIA_192_CBC, &aria_192_cbc_info },
2348 { MBEDTLS_CIPHER_ARIA_256_CBC, &aria_256_cbc_info },
2350 #if defined(MBEDTLS_CIPHER_MODE_CFB)
2351 { MBEDTLS_CIPHER_ARIA_128_CFB128, &aria_128_cfb128_info },
2352 { MBEDTLS_CIPHER_ARIA_192_CFB128, &aria_192_cfb128_info },
2353 { MBEDTLS_CIPHER_ARIA_256_CFB128, &aria_256_cfb128_info },
2355 #if defined(MBEDTLS_CIPHER_MODE_CTR)
2356 { MBEDTLS_CIPHER_ARIA_128_CTR, &aria_128_ctr_info },
2357 { MBEDTLS_CIPHER_ARIA_192_CTR, &aria_192_ctr_info },
2358 { MBEDTLS_CIPHER_ARIA_256_CTR, &aria_256_ctr_info },
2360 #if defined(MBEDTLS_GCM_C)
2361 { MBEDTLS_CIPHER_ARIA_128_GCM, &aria_128_gcm_info },
2362 { MBEDTLS_CIPHER_ARIA_192_GCM, &aria_192_gcm_info },
2363 { MBEDTLS_CIPHER_ARIA_256_GCM, &aria_256_gcm_info },
2365 #if defined(MBEDTLS_CCM_C)
2366 { MBEDTLS_CIPHER_ARIA_128_CCM, &aria_128_ccm_info },
2367 { MBEDTLS_CIPHER_ARIA_192_CCM, &aria_192_ccm_info },
2368 { MBEDTLS_CIPHER_ARIA_256_CCM, &aria_256_ccm_info },
2370 #endif /* MBEDTLS_ARIA_C */
2372 #if defined(MBEDTLS_DES_C)
2373 { MBEDTLS_CIPHER_DES_ECB, &des_ecb_info },
2374 { MBEDTLS_CIPHER_DES_EDE_ECB, &des_ede_ecb_info },
2375 { MBEDTLS_CIPHER_DES_EDE3_ECB, &des_ede3_ecb_info },
2376 #if defined(MBEDTLS_CIPHER_MODE_CBC)
2377 { MBEDTLS_CIPHER_DES_CBC, &des_cbc_info },
2378 { MBEDTLS_CIPHER_DES_EDE_CBC, &des_ede_cbc_info },
2379 { MBEDTLS_CIPHER_DES_EDE3_CBC, &des_ede3_cbc_info },
2381 #endif /* MBEDTLS_DES_C */
2383 #if defined(MBEDTLS_CHACHA20_C)
2384 { MBEDTLS_CIPHER_CHACHA20, &chacha20_info },
2387 #if defined(MBEDTLS_CHACHAPOLY_C)
2388 { MBEDTLS_CIPHER_CHACHA20_POLY1305, &chachapoly_info },
2391 #if defined(MBEDTLS_NIST_KW_C)
2392 { MBEDTLS_CIPHER_AES_128_KW, &aes_128_nist_kw_info },
2393 { MBEDTLS_CIPHER_AES_192_KW, &aes_192_nist_kw_info },
2394 { MBEDTLS_CIPHER_AES_256_KW, &aes_256_nist_kw_info },
2395 { MBEDTLS_CIPHER_AES_128_KWP, &aes_128_nist_kwp_info },
2396 { MBEDTLS_CIPHER_AES_192_KWP, &aes_192_nist_kwp_info },
2397 { MBEDTLS_CIPHER_AES_256_KWP, &aes_256_nist_kwp_info },
2400 #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
2401 { MBEDTLS_CIPHER_NULL, &null_cipher_info },
2402 #endif /* MBEDTLS_CIPHER_NULL_CIPHER */
2404 { MBEDTLS_CIPHER_NONE, NULL }
2407 #define NUM_CIPHERS ( sizeof(mbedtls_cipher_definitions) / \
2408 sizeof(mbedtls_cipher_definitions[0]) )
2409 int mbedtls_cipher_supported[NUM_CIPHERS];
2411 #endif /* MBEDTLS_CIPHER_C */