quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

cipher_wrap.c (67649B)


      1 /**
      2  * \file cipher_wrap.c
      3  *
      4  * \brief Generic cipher wrapper for Mbed TLS
      5  *
      6  * \author Adriaan de Jong <dejong@fox-it.com>
      7  *
      8  *  Copyright The Mbed TLS Contributors
      9  *  SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
     10  */
     11 
     12 #include "common.h"
     13 
     14 #if defined(MBEDTLS_CIPHER_C)
     15 
     16 #include "cipher_wrap.h"
     17 #include "mbedtls/error.h"
     18 
     19 #if defined(MBEDTLS_CHACHAPOLY_C)
     20 #include "mbedtls/chachapoly.h"
     21 #endif
     22 
     23 #if defined(MBEDTLS_AES_C)
     24 #include "mbedtls/aes.h"
     25 #endif
     26 
     27 #if defined(MBEDTLS_CAMELLIA_C)
     28 #include "mbedtls/camellia.h"
     29 #endif
     30 
     31 #if defined(MBEDTLS_ARIA_C)
     32 #include "mbedtls/aria.h"
     33 #endif
     34 
     35 #if defined(MBEDTLS_DES_C)
     36 #include "mbedtls/des.h"
     37 #endif
     38 
     39 #if defined(MBEDTLS_CHACHA20_C)
     40 #include "mbedtls/chacha20.h"
     41 #endif
     42 
     43 #if defined(MBEDTLS_GCM_C)
     44 #include "mbedtls/gcm.h"
     45 #endif
     46 
     47 #if defined(MBEDTLS_CCM_C)
     48 #include "mbedtls/ccm.h"
     49 #endif
     50 
     51 #if defined(MBEDTLS_NIST_KW_C)
     52 #include "mbedtls/nist_kw.h"
     53 #endif
     54 
     55 #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
     56 #include <string.h>
     57 #endif
     58 
     59 #include "mbedtls/platform.h"
     60 
     61 enum mbedtls_cipher_base_index {
     62 #if defined(MBEDTLS_AES_C)
     63     MBEDTLS_CIPHER_BASE_INDEX_AES,
     64 #endif
     65 #if defined(MBEDTLS_ARIA_C)
     66     MBEDTLS_CIPHER_BASE_INDEX_ARIA,
     67 #endif
     68 #if defined(MBEDTLS_CAMELLIA_C)
     69     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA,
     70 #endif
     71 #if defined(MBEDTLS_CIPHER_HAVE_CCM_AES_VIA_LEGACY_OR_USE_PSA)
     72     MBEDTLS_CIPHER_BASE_INDEX_CCM_AES,
     73 #endif
     74 #if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_ARIA_C)
     75     MBEDTLS_CIPHER_BASE_INDEX_CCM_ARIA,
     76 #endif
     77 #if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_CAMELLIA_C)
     78     MBEDTLS_CIPHER_BASE_INDEX_CCM_CAMELLIA,
     79 #endif
     80 #if defined(MBEDTLS_CHACHA20_C)
     81     MBEDTLS_CIPHER_BASE_INDEX_CHACHA20_BASE,
     82 #endif
     83 #if defined(MBEDTLS_CHACHAPOLY_C)
     84     MBEDTLS_CIPHER_BASE_INDEX_CHACHAPOLY_BASE,
     85 #endif
     86 #if defined(MBEDTLS_DES_C)
     87     MBEDTLS_CIPHER_BASE_INDEX_DES_EDE3,
     88 #endif
     89 #if defined(MBEDTLS_DES_C)
     90     MBEDTLS_CIPHER_BASE_INDEX_DES_EDE,
     91 #endif
     92 #if defined(MBEDTLS_DES_C)
     93     MBEDTLS_CIPHER_BASE_INDEX_DES,
     94 #endif
     95 #if defined(MBEDTLS_CIPHER_HAVE_GCM_AES_VIA_LEGACY_OR_USE_PSA)
     96     MBEDTLS_CIPHER_BASE_INDEX_GCM_AES,
     97 #endif
     98 #if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_ARIA_C)
     99     MBEDTLS_CIPHER_BASE_INDEX_GCM_ARIA,
    100 #endif
    101 #if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_CAMELLIA_C)
    102     MBEDTLS_CIPHER_BASE_INDEX_GCM_CAMELLIA,
    103 #endif
    104 #if defined(MBEDTLS_NIST_KW_C)
    105     MBEDTLS_CIPHER_BASE_INDEX_KW_AES,
    106 #endif
    107 #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
    108     MBEDTLS_CIPHER_BASE_INDEX_NULL_BASE,
    109 #endif
    110 #if defined(MBEDTLS_CIPHER_MODE_XTS) && defined(MBEDTLS_AES_C)
    111     MBEDTLS_CIPHER_BASE_INDEX_XTS_AES,
    112 #endif
    113     /* Prevent compile failure due to empty enum */
    114     MBEDTLS_CIPHER_BASE_PREVENT_EMPTY_ENUM
    115 };
    116 
    117 #if defined(MBEDTLS_GCM_C) && \
    118     (defined(MBEDTLS_CIPHER_HAVE_GCM_AES_VIA_LEGACY_OR_USE_PSA) || \
    119     defined(MBEDTLS_ARIA_C) || defined(MBEDTLS_CAMELLIA_C))
    120 /* shared by all GCM ciphers */
    121 static void *gcm_ctx_alloc(void)
    122 {
    123     void *ctx = mbedtls_calloc(1, sizeof(mbedtls_gcm_context));
    124 
    125     if (ctx != NULL) {
    126         mbedtls_gcm_init((mbedtls_gcm_context *) ctx);
    127     }
    128 
    129     return ctx;
    130 }
    131 
    132 static void gcm_ctx_free(void *ctx)
    133 {
    134     mbedtls_gcm_free(ctx);
    135     mbedtls_free(ctx);
    136 }
    137 #endif /* MBEDTLS_GCM_C */
    138 
    139 #if defined(MBEDTLS_CCM_C) && \
    140     (defined(MBEDTLS_CIPHER_HAVE_CCM_AES_VIA_LEGACY_OR_USE_PSA) || \
    141     defined(MBEDTLS_ARIA_C) || defined(MBEDTLS_CAMELLIA_C))
    142 /* shared by all CCM ciphers */
    143 static void *ccm_ctx_alloc(void)
    144 {
    145     void *ctx = mbedtls_calloc(1, sizeof(mbedtls_ccm_context));
    146 
    147     if (ctx != NULL) {
    148         mbedtls_ccm_init((mbedtls_ccm_context *) ctx);
    149     }
    150 
    151     return ctx;
    152 }
    153 
    154 static void ccm_ctx_free(void *ctx)
    155 {
    156     mbedtls_ccm_free(ctx);
    157     mbedtls_free(ctx);
    158 }
    159 #endif /* MBEDTLS_CCM_C */
    160 
    161 #if defined(MBEDTLS_AES_C)
    162 
    163 static int aes_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation,
    164                               const unsigned char *input, unsigned char *output)
    165 {
    166     return mbedtls_aes_crypt_ecb((mbedtls_aes_context *) ctx, operation, input, output);
    167 }
    168 
    169 #if defined(MBEDTLS_CIPHER_MODE_CBC)
    170 static int aes_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation, size_t length,
    171                               unsigned char *iv, const unsigned char *input, unsigned char *output)
    172 {
    173     return mbedtls_aes_crypt_cbc((mbedtls_aes_context *) ctx, operation, length, iv, input,
    174                                  output);
    175 }
    176 #endif /* MBEDTLS_CIPHER_MODE_CBC */
    177 
    178 #if defined(MBEDTLS_CIPHER_MODE_CFB)
    179 static int aes_crypt_cfb128_wrap(void *ctx, mbedtls_operation_t operation,
    180                                  size_t length, size_t *iv_off, unsigned char *iv,
    181                                  const unsigned char *input, unsigned char *output)
    182 {
    183     return mbedtls_aes_crypt_cfb128((mbedtls_aes_context *) ctx, operation, length, iv_off, iv,
    184                                     input, output);
    185 }
    186 #endif /* MBEDTLS_CIPHER_MODE_CFB */
    187 
    188 #if defined(MBEDTLS_CIPHER_MODE_OFB)
    189 static int aes_crypt_ofb_wrap(void *ctx, size_t length, size_t *iv_off,
    190                               unsigned char *iv, const unsigned char *input, unsigned char *output)
    191 {
    192     return mbedtls_aes_crypt_ofb((mbedtls_aes_context *) ctx, length, iv_off,
    193                                  iv, input, output);
    194 }
    195 #endif /* MBEDTLS_CIPHER_MODE_OFB */
    196 
    197 #if defined(MBEDTLS_CIPHER_MODE_CTR)
    198 static int aes_crypt_ctr_wrap(void *ctx, size_t length, size_t *nc_off,
    199                               unsigned char *nonce_counter, unsigned char *stream_block,
    200                               const unsigned char *input, unsigned char *output)
    201 {
    202     return mbedtls_aes_crypt_ctr((mbedtls_aes_context *) ctx, length, nc_off, nonce_counter,
    203                                  stream_block, input, output);
    204 }
    205 #endif /* MBEDTLS_CIPHER_MODE_CTR */
    206 
    207 #if defined(MBEDTLS_CIPHER_MODE_XTS)
    208 static int aes_crypt_xts_wrap(void *ctx, mbedtls_operation_t operation,
    209                               size_t length,
    210                               const unsigned char data_unit[16],
    211                               const unsigned char *input,
    212                               unsigned char *output)
    213 {
    214     mbedtls_aes_xts_context *xts_ctx = ctx;
    215     int mode;
    216 
    217     switch (operation) {
    218         case MBEDTLS_ENCRYPT:
    219             mode = MBEDTLS_AES_ENCRYPT;
    220             break;
    221         case MBEDTLS_DECRYPT:
    222             mode = MBEDTLS_AES_DECRYPT;
    223             break;
    224         default:
    225             return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
    226     }
    227 
    228     return mbedtls_aes_crypt_xts(xts_ctx, mode, length,
    229                                  data_unit, input, output);
    230 }
    231 #endif /* MBEDTLS_CIPHER_MODE_XTS */
    232 
    233 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
    234 static int aes_setkey_dec_wrap(void *ctx, const unsigned char *key,
    235                                unsigned int key_bitlen)
    236 {
    237     return mbedtls_aes_setkey_dec((mbedtls_aes_context *) ctx, key, key_bitlen);
    238 }
    239 #endif
    240 
    241 static int aes_setkey_enc_wrap(void *ctx, const unsigned char *key,
    242                                unsigned int key_bitlen)
    243 {
    244     return mbedtls_aes_setkey_enc((mbedtls_aes_context *) ctx, key, key_bitlen);
    245 }
    246 
    247 static void *aes_ctx_alloc(void)
    248 {
    249     mbedtls_aes_context *aes = mbedtls_calloc(1, sizeof(mbedtls_aes_context));
    250 
    251     if (aes == NULL) {
    252         return NULL;
    253     }
    254 
    255     mbedtls_aes_init(aes);
    256 
    257     return aes;
    258 }
    259 
    260 static void aes_ctx_free(void *ctx)
    261 {
    262     mbedtls_aes_free((mbedtls_aes_context *) ctx);
    263     mbedtls_free(ctx);
    264 }
    265 
    266 static const mbedtls_cipher_base_t aes_info = {
    267     MBEDTLS_CIPHER_ID_AES,
    268     aes_crypt_ecb_wrap,
    269 #if defined(MBEDTLS_CIPHER_MODE_CBC)
    270     aes_crypt_cbc_wrap,
    271 #endif
    272 #if defined(MBEDTLS_CIPHER_MODE_CFB)
    273     aes_crypt_cfb128_wrap,
    274 #endif
    275 #if defined(MBEDTLS_CIPHER_MODE_OFB)
    276     aes_crypt_ofb_wrap,
    277 #endif
    278 #if defined(MBEDTLS_CIPHER_MODE_CTR)
    279     aes_crypt_ctr_wrap,
    280 #endif
    281 #if defined(MBEDTLS_CIPHER_MODE_XTS)
    282     NULL,
    283 #endif
    284 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
    285     NULL,
    286 #endif
    287     aes_setkey_enc_wrap,
    288 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
    289     aes_setkey_dec_wrap,
    290 #endif
    291     aes_ctx_alloc,
    292     aes_ctx_free
    293 };
    294 
    295 static const mbedtls_cipher_info_t aes_128_ecb_info = {
    296     "AES-128-ECB",
    297     16,
    298     0 >> MBEDTLS_IV_SIZE_SHIFT,
    299     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    300     MBEDTLS_MODE_ECB,
    301     MBEDTLS_CIPHER_AES_128_ECB,
    302     0,
    303     MBEDTLS_CIPHER_BASE_INDEX_AES
    304 };
    305 
    306 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    307 static const mbedtls_cipher_info_t aes_192_ecb_info = {
    308     "AES-192-ECB",
    309     16,
    310     0 >> MBEDTLS_IV_SIZE_SHIFT,
    311     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    312     MBEDTLS_MODE_ECB,
    313     MBEDTLS_CIPHER_AES_192_ECB,
    314     0,
    315     MBEDTLS_CIPHER_BASE_INDEX_AES
    316 };
    317 
    318 static const mbedtls_cipher_info_t aes_256_ecb_info = {
    319     "AES-256-ECB",
    320     16,
    321     0 >> MBEDTLS_IV_SIZE_SHIFT,
    322     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    323     MBEDTLS_MODE_ECB,
    324     MBEDTLS_CIPHER_AES_256_ECB,
    325     0,
    326     MBEDTLS_CIPHER_BASE_INDEX_AES
    327 };
    328 #endif
    329 
    330 #if defined(MBEDTLS_CIPHER_MODE_CBC)
    331 static const mbedtls_cipher_info_t aes_128_cbc_info = {
    332     "AES-128-CBC",
    333     16,
    334     16 >> MBEDTLS_IV_SIZE_SHIFT,
    335     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    336     MBEDTLS_MODE_CBC,
    337     MBEDTLS_CIPHER_AES_128_CBC,
    338     0,
    339     MBEDTLS_CIPHER_BASE_INDEX_AES
    340 };
    341 
    342 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    343 static const mbedtls_cipher_info_t aes_192_cbc_info = {
    344     "AES-192-CBC",
    345     16,
    346     16 >> MBEDTLS_IV_SIZE_SHIFT,
    347     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    348     MBEDTLS_MODE_CBC,
    349     MBEDTLS_CIPHER_AES_192_CBC,
    350     0,
    351     MBEDTLS_CIPHER_BASE_INDEX_AES
    352 };
    353 
    354 static const mbedtls_cipher_info_t aes_256_cbc_info = {
    355     "AES-256-CBC",
    356     16,
    357     16 >> MBEDTLS_IV_SIZE_SHIFT,
    358     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    359     MBEDTLS_MODE_CBC,
    360     MBEDTLS_CIPHER_AES_256_CBC,
    361     0,
    362     MBEDTLS_CIPHER_BASE_INDEX_AES
    363 };
    364 #endif
    365 #endif /* MBEDTLS_CIPHER_MODE_CBC */
    366 
    367 #if defined(MBEDTLS_CIPHER_MODE_CFB)
    368 static const mbedtls_cipher_info_t aes_128_cfb128_info = {
    369     "AES-128-CFB128",
    370     16,
    371     16 >> MBEDTLS_IV_SIZE_SHIFT,
    372     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    373     MBEDTLS_MODE_CFB,
    374     MBEDTLS_CIPHER_AES_128_CFB128,
    375     0,
    376     MBEDTLS_CIPHER_BASE_INDEX_AES
    377 };
    378 
    379 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    380 static const mbedtls_cipher_info_t aes_192_cfb128_info = {
    381     "AES-192-CFB128",
    382     16,
    383     16 >> MBEDTLS_IV_SIZE_SHIFT,
    384     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    385     MBEDTLS_MODE_CFB,
    386     MBEDTLS_CIPHER_AES_192_CFB128,
    387     0,
    388     MBEDTLS_CIPHER_BASE_INDEX_AES
    389 };
    390 
    391 static const mbedtls_cipher_info_t aes_256_cfb128_info = {
    392     "AES-256-CFB128",
    393     16,
    394     16 >> MBEDTLS_IV_SIZE_SHIFT,
    395     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    396     MBEDTLS_MODE_CFB,
    397     MBEDTLS_CIPHER_AES_256_CFB128,
    398     0,
    399     MBEDTLS_CIPHER_BASE_INDEX_AES
    400 };
    401 #endif
    402 #endif /* MBEDTLS_CIPHER_MODE_CFB */
    403 
    404 #if defined(MBEDTLS_CIPHER_MODE_OFB)
    405 static const mbedtls_cipher_info_t aes_128_ofb_info = {
    406     "AES-128-OFB",
    407     16,
    408     16 >> MBEDTLS_IV_SIZE_SHIFT,
    409     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    410     MBEDTLS_MODE_OFB,
    411     MBEDTLS_CIPHER_AES_128_OFB,
    412     0,
    413     MBEDTLS_CIPHER_BASE_INDEX_AES
    414 };
    415 
    416 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    417 static const mbedtls_cipher_info_t aes_192_ofb_info = {
    418     "AES-192-OFB",
    419     16,
    420     16 >> MBEDTLS_IV_SIZE_SHIFT,
    421     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    422     MBEDTLS_MODE_OFB,
    423     MBEDTLS_CIPHER_AES_192_OFB,
    424     0,
    425     MBEDTLS_CIPHER_BASE_INDEX_AES
    426 };
    427 
    428 static const mbedtls_cipher_info_t aes_256_ofb_info = {
    429     "AES-256-OFB",
    430     16,
    431     16 >> MBEDTLS_IV_SIZE_SHIFT,
    432     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    433     MBEDTLS_MODE_OFB,
    434     MBEDTLS_CIPHER_AES_256_OFB,
    435     0,
    436     MBEDTLS_CIPHER_BASE_INDEX_AES
    437 };
    438 #endif
    439 #endif /* MBEDTLS_CIPHER_MODE_OFB */
    440 
    441 #if defined(MBEDTLS_CIPHER_MODE_CTR)
    442 static const mbedtls_cipher_info_t aes_128_ctr_info = {
    443     "AES-128-CTR",
    444     16,
    445     16 >> MBEDTLS_IV_SIZE_SHIFT,
    446     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    447     MBEDTLS_MODE_CTR,
    448     MBEDTLS_CIPHER_AES_128_CTR,
    449     0,
    450     MBEDTLS_CIPHER_BASE_INDEX_AES
    451 };
    452 
    453 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    454 static const mbedtls_cipher_info_t aes_192_ctr_info = {
    455     "AES-192-CTR",
    456     16,
    457     16 >> MBEDTLS_IV_SIZE_SHIFT,
    458     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    459     MBEDTLS_MODE_CTR,
    460     MBEDTLS_CIPHER_AES_192_CTR,
    461     0,
    462     MBEDTLS_CIPHER_BASE_INDEX_AES
    463 };
    464 
    465 static const mbedtls_cipher_info_t aes_256_ctr_info = {
    466     "AES-256-CTR",
    467     16,
    468     16 >> MBEDTLS_IV_SIZE_SHIFT,
    469     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    470     MBEDTLS_MODE_CTR,
    471     MBEDTLS_CIPHER_AES_256_CTR,
    472     0,
    473     MBEDTLS_CIPHER_BASE_INDEX_AES
    474 };
    475 #endif
    476 #endif /* MBEDTLS_CIPHER_MODE_CTR */
    477 
    478 #if defined(MBEDTLS_CIPHER_MODE_XTS)
    479 static int xts_aes_setkey_enc_wrap(void *ctx, const unsigned char *key,
    480                                    unsigned int key_bitlen)
    481 {
    482     mbedtls_aes_xts_context *xts_ctx = ctx;
    483     return mbedtls_aes_xts_setkey_enc(xts_ctx, key, key_bitlen);
    484 }
    485 
    486 static int xts_aes_setkey_dec_wrap(void *ctx, const unsigned char *key,
    487                                    unsigned int key_bitlen)
    488 {
    489     mbedtls_aes_xts_context *xts_ctx = ctx;
    490     return mbedtls_aes_xts_setkey_dec(xts_ctx, key, key_bitlen);
    491 }
    492 
    493 static void *xts_aes_ctx_alloc(void)
    494 {
    495     mbedtls_aes_xts_context *xts_ctx = mbedtls_calloc(1, sizeof(*xts_ctx));
    496 
    497     if (xts_ctx != NULL) {
    498         mbedtls_aes_xts_init(xts_ctx);
    499     }
    500 
    501     return xts_ctx;
    502 }
    503 
    504 static void xts_aes_ctx_free(void *ctx)
    505 {
    506     mbedtls_aes_xts_context *xts_ctx = ctx;
    507 
    508     if (xts_ctx == NULL) {
    509         return;
    510     }
    511 
    512     mbedtls_aes_xts_free(xts_ctx);
    513     mbedtls_free(xts_ctx);
    514 }
    515 
    516 static const mbedtls_cipher_base_t xts_aes_info = {
    517     MBEDTLS_CIPHER_ID_AES,
    518     NULL,
    519 #if defined(MBEDTLS_CIPHER_MODE_CBC)
    520     NULL,
    521 #endif
    522 #if defined(MBEDTLS_CIPHER_MODE_CFB)
    523     NULL,
    524 #endif
    525 #if defined(MBEDTLS_CIPHER_MODE_OFB)
    526     NULL,
    527 #endif
    528 #if defined(MBEDTLS_CIPHER_MODE_CTR)
    529     NULL,
    530 #endif
    531 #if defined(MBEDTLS_CIPHER_MODE_XTS)
    532     aes_crypt_xts_wrap,
    533 #endif
    534 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
    535     NULL,
    536 #endif
    537     xts_aes_setkey_enc_wrap,
    538     xts_aes_setkey_dec_wrap,
    539     xts_aes_ctx_alloc,
    540     xts_aes_ctx_free
    541 };
    542 
    543 static const mbedtls_cipher_info_t aes_128_xts_info = {
    544     "AES-128-XTS",
    545     16,
    546     16 >> MBEDTLS_IV_SIZE_SHIFT,
    547     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    548     MBEDTLS_MODE_XTS,
    549     MBEDTLS_CIPHER_AES_128_XTS,
    550     0,
    551     MBEDTLS_CIPHER_BASE_INDEX_XTS_AES
    552 };
    553 
    554 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    555 static const mbedtls_cipher_info_t aes_256_xts_info = {
    556     "AES-256-XTS",
    557     16,
    558     16 >> MBEDTLS_IV_SIZE_SHIFT,
    559     512 >> MBEDTLS_KEY_BITLEN_SHIFT,
    560     MBEDTLS_MODE_XTS,
    561     MBEDTLS_CIPHER_AES_256_XTS,
    562     0,
    563     MBEDTLS_CIPHER_BASE_INDEX_XTS_AES
    564 };
    565 #endif
    566 #endif /* MBEDTLS_CIPHER_MODE_XTS */
    567 #endif /* MBEDTLS_AES_C */
    568 
    569 #if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_CCM_GCM_CAN_AES)
    570 static int gcm_aes_setkey_wrap(void *ctx, const unsigned char *key,
    571                                unsigned int key_bitlen)
    572 {
    573     return mbedtls_gcm_setkey((mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
    574                               key, key_bitlen);
    575 }
    576 #endif /* MBEDTLS_GCM_C && MBEDTLS_CCM_GCM_CAN_AES */
    577 
    578 #if defined(MBEDTLS_CIPHER_HAVE_GCM_AES_VIA_LEGACY_OR_USE_PSA)
    579 static const mbedtls_cipher_base_t gcm_aes_info = {
    580     MBEDTLS_CIPHER_ID_AES,
    581     NULL,
    582 #if defined(MBEDTLS_CIPHER_MODE_CBC)
    583     NULL,
    584 #endif
    585 #if defined(MBEDTLS_CIPHER_MODE_CFB)
    586     NULL,
    587 #endif
    588 #if defined(MBEDTLS_CIPHER_MODE_OFB)
    589     NULL,
    590 #endif
    591 #if defined(MBEDTLS_CIPHER_MODE_CTR)
    592     NULL,
    593 #endif
    594 #if defined(MBEDTLS_CIPHER_MODE_XTS)
    595     NULL,
    596 #endif
    597 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
    598     NULL,
    599 #endif
    600 #if defined(MBEDTLS_GCM_C)
    601     gcm_aes_setkey_wrap,
    602 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
    603     gcm_aes_setkey_wrap,
    604 #endif
    605     gcm_ctx_alloc,
    606     gcm_ctx_free,
    607 #else
    608     NULL,
    609     NULL,
    610     NULL,
    611     NULL,
    612 #endif /* MBEDTLS_GCM_C */
    613 };
    614 #endif /* MBEDTLS_CIPHER_HAVE_GCM_AES_VIA_LEGACY_OR_USE_PSA */
    615 
    616 #if defined(MBEDTLS_CIPHER_HAVE_GCM_AES_VIA_LEGACY_OR_USE_PSA)
    617 static const mbedtls_cipher_info_t aes_128_gcm_info = {
    618     "AES-128-GCM",
    619     16,
    620     12 >> MBEDTLS_IV_SIZE_SHIFT,
    621     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    622     MBEDTLS_MODE_GCM,
    623     MBEDTLS_CIPHER_AES_128_GCM,
    624     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
    625     MBEDTLS_CIPHER_BASE_INDEX_GCM_AES
    626 };
    627 
    628 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    629 static const mbedtls_cipher_info_t aes_192_gcm_info = {
    630     "AES-192-GCM",
    631     16,
    632     12 >> MBEDTLS_IV_SIZE_SHIFT,
    633     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    634     MBEDTLS_MODE_GCM,
    635     MBEDTLS_CIPHER_AES_192_GCM,
    636     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
    637     MBEDTLS_CIPHER_BASE_INDEX_GCM_AES
    638 };
    639 
    640 static const mbedtls_cipher_info_t aes_256_gcm_info = {
    641     "AES-256-GCM",
    642     16,
    643     12 >> MBEDTLS_IV_SIZE_SHIFT,
    644     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    645     MBEDTLS_MODE_GCM,
    646     MBEDTLS_CIPHER_AES_256_GCM,
    647     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
    648     MBEDTLS_CIPHER_BASE_INDEX_GCM_AES
    649 };
    650 #endif
    651 #endif /* MBEDTLS_CIPHER_HAVE_GCM_AES_VIA_LEGACY_OR_USE_PSA */
    652 
    653 #if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_CCM_GCM_CAN_AES)
    654 static int ccm_aes_setkey_wrap(void *ctx, const unsigned char *key,
    655                                unsigned int key_bitlen)
    656 {
    657     return mbedtls_ccm_setkey((mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_AES,
    658                               key, key_bitlen);
    659 }
    660 #endif /* MBEDTLS_CCM_C && MBEDTLS_CCM_GCM_CAN_AES */
    661 
    662 #if defined(MBEDTLS_CIPHER_HAVE_CCM_AES_VIA_LEGACY_OR_USE_PSA)
    663 static const mbedtls_cipher_base_t ccm_aes_info = {
    664     MBEDTLS_CIPHER_ID_AES,
    665     NULL,
    666 #if defined(MBEDTLS_CIPHER_MODE_CBC)
    667     NULL,
    668 #endif
    669 #if defined(MBEDTLS_CIPHER_MODE_CFB)
    670     NULL,
    671 #endif
    672 #if defined(MBEDTLS_CIPHER_MODE_OFB)
    673     NULL,
    674 #endif
    675 #if defined(MBEDTLS_CIPHER_MODE_CTR)
    676     NULL,
    677 #endif
    678 #if defined(MBEDTLS_CIPHER_MODE_XTS)
    679     NULL,
    680 #endif
    681 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
    682     NULL,
    683 #endif
    684 #if defined(MBEDTLS_CCM_C)
    685     ccm_aes_setkey_wrap,
    686 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
    687     ccm_aes_setkey_wrap,
    688 #endif
    689     ccm_ctx_alloc,
    690     ccm_ctx_free,
    691 #else
    692     NULL,
    693     NULL,
    694     NULL,
    695     NULL,
    696 #endif
    697 };
    698 #endif /* MBEDTLS_CIPHER_HAVE_CCM_AES_VIA_LEGACY_OR_USE_PSA */
    699 
    700 #if defined(MBEDTLS_CIPHER_HAVE_CCM_AES_VIA_LEGACY_OR_USE_PSA)
    701 static const mbedtls_cipher_info_t aes_128_ccm_info = {
    702     "AES-128-CCM",
    703     16,
    704     12 >> MBEDTLS_IV_SIZE_SHIFT,
    705     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    706     MBEDTLS_MODE_CCM,
    707     MBEDTLS_CIPHER_AES_128_CCM,
    708     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
    709     MBEDTLS_CIPHER_BASE_INDEX_CCM_AES
    710 };
    711 
    712 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    713 static const mbedtls_cipher_info_t aes_192_ccm_info = {
    714     "AES-192-CCM",
    715     16,
    716     12 >> MBEDTLS_IV_SIZE_SHIFT,
    717     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    718     MBEDTLS_MODE_CCM,
    719     MBEDTLS_CIPHER_AES_192_CCM,
    720     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
    721     MBEDTLS_CIPHER_BASE_INDEX_CCM_AES
    722 };
    723 
    724 static const mbedtls_cipher_info_t aes_256_ccm_info = {
    725     "AES-256-CCM",
    726     16,
    727     12 >> MBEDTLS_IV_SIZE_SHIFT,
    728     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    729     MBEDTLS_MODE_CCM,
    730     MBEDTLS_CIPHER_AES_256_CCM,
    731     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
    732     MBEDTLS_CIPHER_BASE_INDEX_CCM_AES
    733 };
    734 #endif
    735 #endif /* MBEDTLS_CIPHER_HAVE_CCM_AES_VIA_LEGACY_OR_USE_PSA */
    736 
    737 #if defined(MBEDTLS_CIPHER_HAVE_CCM_STAR_NO_TAG_AES_VIA_LEGACY_OR_USE_PSA)
    738 static const mbedtls_cipher_info_t aes_128_ccm_star_no_tag_info = {
    739     "AES-128-CCM*-NO-TAG",
    740     16,
    741     12 >> MBEDTLS_IV_SIZE_SHIFT,
    742     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    743     MBEDTLS_MODE_CCM_STAR_NO_TAG,
    744     MBEDTLS_CIPHER_AES_128_CCM_STAR_NO_TAG,
    745     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
    746     MBEDTLS_CIPHER_BASE_INDEX_CCM_AES
    747 };
    748 
    749 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
    750 static const mbedtls_cipher_info_t aes_192_ccm_star_no_tag_info = {
    751     "AES-192-CCM*-NO-TAG",
    752     16,
    753     12 >> MBEDTLS_IV_SIZE_SHIFT,
    754     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    755     MBEDTLS_MODE_CCM_STAR_NO_TAG,
    756     MBEDTLS_CIPHER_AES_192_CCM_STAR_NO_TAG,
    757     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
    758     MBEDTLS_CIPHER_BASE_INDEX_CCM_AES
    759 };
    760 
    761 static const mbedtls_cipher_info_t aes_256_ccm_star_no_tag_info = {
    762     "AES-256-CCM*-NO-TAG",
    763     16,
    764     12 >> MBEDTLS_IV_SIZE_SHIFT,
    765     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    766     MBEDTLS_MODE_CCM_STAR_NO_TAG,
    767     MBEDTLS_CIPHER_AES_256_CCM_STAR_NO_TAG,
    768     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
    769     MBEDTLS_CIPHER_BASE_INDEX_CCM_AES
    770 };
    771 #endif
    772 #endif /* MBEDTLS_CIPHER_HAVE_CCM_STAR_NO_TAG_AES_VIA_LEGACY_OR_USE_PSA */
    773 
    774 
    775 #if defined(MBEDTLS_CAMELLIA_C)
    776 
    777 static int camellia_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation,
    778                                    const unsigned char *input, unsigned char *output)
    779 {
    780     return mbedtls_camellia_crypt_ecb((mbedtls_camellia_context *) ctx, operation, input,
    781                                       output);
    782 }
    783 
    784 #if defined(MBEDTLS_CIPHER_MODE_CBC)
    785 static int camellia_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation,
    786                                    size_t length, unsigned char *iv,
    787                                    const unsigned char *input, unsigned char *output)
    788 {
    789     return mbedtls_camellia_crypt_cbc((mbedtls_camellia_context *) ctx, operation, length, iv,
    790                                       input, output);
    791 }
    792 #endif /* MBEDTLS_CIPHER_MODE_CBC */
    793 
    794 #if defined(MBEDTLS_CIPHER_MODE_CFB)
    795 static int camellia_crypt_cfb128_wrap(void *ctx, mbedtls_operation_t operation,
    796                                       size_t length, size_t *iv_off, unsigned char *iv,
    797                                       const unsigned char *input, unsigned char *output)
    798 {
    799     return mbedtls_camellia_crypt_cfb128((mbedtls_camellia_context *) ctx, operation, length,
    800                                          iv_off, iv, input, output);
    801 }
    802 #endif /* MBEDTLS_CIPHER_MODE_CFB */
    803 
    804 #if defined(MBEDTLS_CIPHER_MODE_CTR)
    805 static int camellia_crypt_ctr_wrap(void *ctx, size_t length, size_t *nc_off,
    806                                    unsigned char *nonce_counter, unsigned char *stream_block,
    807                                    const unsigned char *input, unsigned char *output)
    808 {
    809     return mbedtls_camellia_crypt_ctr((mbedtls_camellia_context *) ctx, length, nc_off,
    810                                       nonce_counter, stream_block, input, output);
    811 }
    812 #endif /* MBEDTLS_CIPHER_MODE_CTR */
    813 
    814 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
    815 static int camellia_setkey_dec_wrap(void *ctx, const unsigned char *key,
    816                                     unsigned int key_bitlen)
    817 {
    818     return mbedtls_camellia_setkey_dec((mbedtls_camellia_context *) ctx, key, key_bitlen);
    819 }
    820 #endif
    821 
    822 static int camellia_setkey_enc_wrap(void *ctx, const unsigned char *key,
    823                                     unsigned int key_bitlen)
    824 {
    825     return mbedtls_camellia_setkey_enc((mbedtls_camellia_context *) ctx, key, key_bitlen);
    826 }
    827 
    828 static void *camellia_ctx_alloc(void)
    829 {
    830     mbedtls_camellia_context *ctx;
    831     ctx = mbedtls_calloc(1, sizeof(mbedtls_camellia_context));
    832 
    833     if (ctx == NULL) {
    834         return NULL;
    835     }
    836 
    837     mbedtls_camellia_init(ctx);
    838 
    839     return ctx;
    840 }
    841 
    842 static void camellia_ctx_free(void *ctx)
    843 {
    844     mbedtls_camellia_free((mbedtls_camellia_context *) ctx);
    845     mbedtls_free(ctx);
    846 }
    847 
    848 static const mbedtls_cipher_base_t camellia_info = {
    849     MBEDTLS_CIPHER_ID_CAMELLIA,
    850     camellia_crypt_ecb_wrap,
    851 #if defined(MBEDTLS_CIPHER_MODE_CBC)
    852     camellia_crypt_cbc_wrap,
    853 #endif
    854 #if defined(MBEDTLS_CIPHER_MODE_CFB)
    855     camellia_crypt_cfb128_wrap,
    856 #endif
    857 #if defined(MBEDTLS_CIPHER_MODE_OFB)
    858     NULL,
    859 #endif
    860 #if defined(MBEDTLS_CIPHER_MODE_CTR)
    861     camellia_crypt_ctr_wrap,
    862 #endif
    863 #if defined(MBEDTLS_CIPHER_MODE_XTS)
    864     NULL,
    865 #endif
    866 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
    867     NULL,
    868 #endif
    869     camellia_setkey_enc_wrap,
    870 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
    871     camellia_setkey_dec_wrap,
    872 #endif
    873     camellia_ctx_alloc,
    874     camellia_ctx_free
    875 };
    876 
    877 static const mbedtls_cipher_info_t camellia_128_ecb_info = {
    878     "CAMELLIA-128-ECB",
    879     16,
    880     0 >> MBEDTLS_IV_SIZE_SHIFT,
    881     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    882     MBEDTLS_MODE_ECB,
    883     MBEDTLS_CIPHER_CAMELLIA_128_ECB,
    884     0,
    885     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
    886 };
    887 
    888 static const mbedtls_cipher_info_t camellia_192_ecb_info = {
    889     "CAMELLIA-192-ECB",
    890     16,
    891     0 >> MBEDTLS_IV_SIZE_SHIFT,
    892     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    893     MBEDTLS_MODE_ECB,
    894     MBEDTLS_CIPHER_CAMELLIA_192_ECB,
    895     0,
    896     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
    897 };
    898 
    899 static const mbedtls_cipher_info_t camellia_256_ecb_info = {
    900     "CAMELLIA-256-ECB",
    901     16,
    902     0 >> MBEDTLS_IV_SIZE_SHIFT,
    903     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    904     MBEDTLS_MODE_ECB,
    905     MBEDTLS_CIPHER_CAMELLIA_256_ECB,
    906     0,
    907     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
    908 };
    909 
    910 #if defined(MBEDTLS_CIPHER_MODE_CBC)
    911 static const mbedtls_cipher_info_t camellia_128_cbc_info = {
    912     "CAMELLIA-128-CBC",
    913     16,
    914     16 >> MBEDTLS_IV_SIZE_SHIFT,
    915     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    916     MBEDTLS_MODE_CBC,
    917     MBEDTLS_CIPHER_CAMELLIA_128_CBC,
    918     0,
    919     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
    920 };
    921 
    922 static const mbedtls_cipher_info_t camellia_192_cbc_info = {
    923     "CAMELLIA-192-CBC",
    924     16,
    925     16 >> MBEDTLS_IV_SIZE_SHIFT,
    926     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    927     MBEDTLS_MODE_CBC,
    928     MBEDTLS_CIPHER_CAMELLIA_192_CBC,
    929     0,
    930     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
    931 };
    932 
    933 static const mbedtls_cipher_info_t camellia_256_cbc_info = {
    934     "CAMELLIA-256-CBC",
    935     16,
    936     16 >> MBEDTLS_IV_SIZE_SHIFT,
    937     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    938     MBEDTLS_MODE_CBC,
    939     MBEDTLS_CIPHER_CAMELLIA_256_CBC,
    940     0,
    941     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
    942 };
    943 #endif /* MBEDTLS_CIPHER_MODE_CBC */
    944 
    945 #if defined(MBEDTLS_CIPHER_MODE_CFB)
    946 static const mbedtls_cipher_info_t camellia_128_cfb128_info = {
    947     "CAMELLIA-128-CFB128",
    948     16,
    949     16 >> MBEDTLS_IV_SIZE_SHIFT,
    950     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    951     MBEDTLS_MODE_CFB,
    952     MBEDTLS_CIPHER_CAMELLIA_128_CFB128,
    953     0,
    954     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
    955 };
    956 
    957 static const mbedtls_cipher_info_t camellia_192_cfb128_info = {
    958     "CAMELLIA-192-CFB128",
    959     16,
    960     16 >> MBEDTLS_IV_SIZE_SHIFT,
    961     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    962     MBEDTLS_MODE_CFB,
    963     MBEDTLS_CIPHER_CAMELLIA_192_CFB128,
    964     0,
    965     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
    966 };
    967 
    968 static const mbedtls_cipher_info_t camellia_256_cfb128_info = {
    969     "CAMELLIA-256-CFB128",
    970     16,
    971     16 >> MBEDTLS_IV_SIZE_SHIFT,
    972     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
    973     MBEDTLS_MODE_CFB,
    974     MBEDTLS_CIPHER_CAMELLIA_256_CFB128,
    975     0,
    976     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
    977 };
    978 #endif /* MBEDTLS_CIPHER_MODE_CFB */
    979 
    980 #if defined(MBEDTLS_CIPHER_MODE_CTR)
    981 static const mbedtls_cipher_info_t camellia_128_ctr_info = {
    982     "CAMELLIA-128-CTR",
    983     16,
    984     16 >> MBEDTLS_IV_SIZE_SHIFT,
    985     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
    986     MBEDTLS_MODE_CTR,
    987     MBEDTLS_CIPHER_CAMELLIA_128_CTR,
    988     0,
    989     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
    990 };
    991 
    992 static const mbedtls_cipher_info_t camellia_192_ctr_info = {
    993     "CAMELLIA-192-CTR",
    994     16,
    995     16 >> MBEDTLS_IV_SIZE_SHIFT,
    996     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
    997     MBEDTLS_MODE_CTR,
    998     MBEDTLS_CIPHER_CAMELLIA_192_CTR,
    999     0,
   1000     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
   1001 };
   1002 
   1003 static const mbedtls_cipher_info_t camellia_256_ctr_info = {
   1004     "CAMELLIA-256-CTR",
   1005     16,
   1006     16 >> MBEDTLS_IV_SIZE_SHIFT,
   1007     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1008     MBEDTLS_MODE_CTR,
   1009     MBEDTLS_CIPHER_CAMELLIA_256_CTR,
   1010     0,
   1011     MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA
   1012 };
   1013 #endif /* MBEDTLS_CIPHER_MODE_CTR */
   1014 
   1015 #if defined(MBEDTLS_GCM_C)
   1016 static int gcm_camellia_setkey_wrap(void *ctx, const unsigned char *key,
   1017                                     unsigned int key_bitlen)
   1018 {
   1019     return mbedtls_gcm_setkey((mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
   1020                               key, key_bitlen);
   1021 }
   1022 
   1023 static const mbedtls_cipher_base_t gcm_camellia_info = {
   1024     MBEDTLS_CIPHER_ID_CAMELLIA,
   1025     NULL,
   1026 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1027     NULL,
   1028 #endif
   1029 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1030     NULL,
   1031 #endif
   1032 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1033     NULL,
   1034 #endif
   1035 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1036     NULL,
   1037 #endif
   1038 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1039     NULL,
   1040 #endif
   1041 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   1042     NULL,
   1043 #endif
   1044     gcm_camellia_setkey_wrap,
   1045 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1046     gcm_camellia_setkey_wrap,
   1047 #endif
   1048     gcm_ctx_alloc,
   1049     gcm_ctx_free,
   1050 };
   1051 
   1052 static const mbedtls_cipher_info_t camellia_128_gcm_info = {
   1053     "CAMELLIA-128-GCM",
   1054     16,
   1055     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1056     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1057     MBEDTLS_MODE_GCM,
   1058     MBEDTLS_CIPHER_CAMELLIA_128_GCM,
   1059     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1060     MBEDTLS_CIPHER_BASE_INDEX_GCM_CAMELLIA
   1061 };
   1062 
   1063 static const mbedtls_cipher_info_t camellia_192_gcm_info = {
   1064     "CAMELLIA-192-GCM",
   1065     16,
   1066     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1067     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1068     MBEDTLS_MODE_GCM,
   1069     MBEDTLS_CIPHER_CAMELLIA_192_GCM,
   1070     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1071     MBEDTLS_CIPHER_BASE_INDEX_GCM_CAMELLIA
   1072 };
   1073 
   1074 static const mbedtls_cipher_info_t camellia_256_gcm_info = {
   1075     "CAMELLIA-256-GCM",
   1076     16,
   1077     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1078     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1079     MBEDTLS_MODE_GCM,
   1080     MBEDTLS_CIPHER_CAMELLIA_256_GCM,
   1081     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1082     MBEDTLS_CIPHER_BASE_INDEX_GCM_CAMELLIA
   1083 };
   1084 #endif /* MBEDTLS_GCM_C */
   1085 
   1086 #if defined(MBEDTLS_CCM_C)
   1087 static int ccm_camellia_setkey_wrap(void *ctx, const unsigned char *key,
   1088                                     unsigned int key_bitlen)
   1089 {
   1090     return mbedtls_ccm_setkey((mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_CAMELLIA,
   1091                               key, key_bitlen);
   1092 }
   1093 
   1094 static const mbedtls_cipher_base_t ccm_camellia_info = {
   1095     MBEDTLS_CIPHER_ID_CAMELLIA,
   1096     NULL,
   1097 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1098     NULL,
   1099 #endif
   1100 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1101     NULL,
   1102 #endif
   1103 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1104     NULL,
   1105 #endif
   1106 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1107     NULL,
   1108 #endif
   1109 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1110     NULL,
   1111 #endif
   1112 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   1113     NULL,
   1114 #endif
   1115     ccm_camellia_setkey_wrap,
   1116 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1117     ccm_camellia_setkey_wrap,
   1118 #endif
   1119     ccm_ctx_alloc,
   1120     ccm_ctx_free,
   1121 };
   1122 
   1123 static const mbedtls_cipher_info_t camellia_128_ccm_info = {
   1124     "CAMELLIA-128-CCM",
   1125     16,
   1126     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1127     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1128     MBEDTLS_MODE_CCM,
   1129     MBEDTLS_CIPHER_CAMELLIA_128_CCM,
   1130     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1131     MBEDTLS_CIPHER_BASE_INDEX_CCM_CAMELLIA
   1132 };
   1133 
   1134 static const mbedtls_cipher_info_t camellia_192_ccm_info = {
   1135     "CAMELLIA-192-CCM",
   1136     16,
   1137     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1138     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1139     MBEDTLS_MODE_CCM,
   1140     MBEDTLS_CIPHER_CAMELLIA_192_CCM,
   1141     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1142     MBEDTLS_CIPHER_BASE_INDEX_CCM_CAMELLIA
   1143 };
   1144 
   1145 static const mbedtls_cipher_info_t camellia_256_ccm_info = {
   1146     "CAMELLIA-256-CCM",
   1147     16,
   1148     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1149     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1150     MBEDTLS_MODE_CCM,
   1151     MBEDTLS_CIPHER_CAMELLIA_256_CCM,
   1152     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1153     MBEDTLS_CIPHER_BASE_INDEX_CCM_CAMELLIA
   1154 };
   1155 
   1156 static const mbedtls_cipher_info_t camellia_128_ccm_star_no_tag_info = {
   1157     "CAMELLIA-128-CCM*-NO-TAG",
   1158     16,
   1159     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1160     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1161     MBEDTLS_MODE_CCM_STAR_NO_TAG,
   1162     MBEDTLS_CIPHER_CAMELLIA_128_CCM_STAR_NO_TAG,
   1163     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1164     MBEDTLS_CIPHER_BASE_INDEX_CCM_CAMELLIA
   1165 };
   1166 
   1167 static const mbedtls_cipher_info_t camellia_192_ccm_star_no_tag_info = {
   1168     "CAMELLIA-192-CCM*-NO-TAG",
   1169     16,
   1170     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1171     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1172     MBEDTLS_MODE_CCM_STAR_NO_TAG,
   1173     MBEDTLS_CIPHER_CAMELLIA_192_CCM_STAR_NO_TAG,
   1174     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1175     MBEDTLS_CIPHER_BASE_INDEX_CCM_CAMELLIA
   1176 };
   1177 
   1178 static const mbedtls_cipher_info_t camellia_256_ccm_star_no_tag_info = {
   1179     "CAMELLIA-256-CCM*-NO-TAG",
   1180     16,
   1181     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1182     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1183     MBEDTLS_MODE_CCM_STAR_NO_TAG,
   1184     MBEDTLS_CIPHER_CAMELLIA_256_CCM_STAR_NO_TAG,
   1185     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1186     MBEDTLS_CIPHER_BASE_INDEX_CCM_CAMELLIA
   1187 };
   1188 #endif /* MBEDTLS_CCM_C */
   1189 
   1190 #endif /* MBEDTLS_CAMELLIA_C */
   1191 
   1192 #if defined(MBEDTLS_ARIA_C)
   1193 
   1194 static int aria_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation,
   1195                                const unsigned char *input, unsigned char *output)
   1196 {
   1197     (void) operation;
   1198     return mbedtls_aria_crypt_ecb((mbedtls_aria_context *) ctx, input,
   1199                                   output);
   1200 }
   1201 
   1202 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1203 static int aria_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation,
   1204                                size_t length, unsigned char *iv,
   1205                                const unsigned char *input, unsigned char *output)
   1206 {
   1207     return mbedtls_aria_crypt_cbc((mbedtls_aria_context *) ctx, operation, length, iv,
   1208                                   input, output);
   1209 }
   1210 #endif /* MBEDTLS_CIPHER_MODE_CBC */
   1211 
   1212 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1213 static int aria_crypt_cfb128_wrap(void *ctx, mbedtls_operation_t operation,
   1214                                   size_t length, size_t *iv_off, unsigned char *iv,
   1215                                   const unsigned char *input, unsigned char *output)
   1216 {
   1217     return mbedtls_aria_crypt_cfb128((mbedtls_aria_context *) ctx, operation, length,
   1218                                      iv_off, iv, input, output);
   1219 }
   1220 #endif /* MBEDTLS_CIPHER_MODE_CFB */
   1221 
   1222 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1223 static int aria_crypt_ctr_wrap(void *ctx, size_t length, size_t *nc_off,
   1224                                unsigned char *nonce_counter, unsigned char *stream_block,
   1225                                const unsigned char *input, unsigned char *output)
   1226 {
   1227     return mbedtls_aria_crypt_ctr((mbedtls_aria_context *) ctx, length, nc_off,
   1228                                   nonce_counter, stream_block, input, output);
   1229 }
   1230 #endif /* MBEDTLS_CIPHER_MODE_CTR */
   1231 
   1232 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1233 static int aria_setkey_dec_wrap(void *ctx, const unsigned char *key,
   1234                                 unsigned int key_bitlen)
   1235 {
   1236     return mbedtls_aria_setkey_dec((mbedtls_aria_context *) ctx, key, key_bitlen);
   1237 }
   1238 #endif
   1239 
   1240 static int aria_setkey_enc_wrap(void *ctx, const unsigned char *key,
   1241                                 unsigned int key_bitlen)
   1242 {
   1243     return mbedtls_aria_setkey_enc((mbedtls_aria_context *) ctx, key, key_bitlen);
   1244 }
   1245 
   1246 static void *aria_ctx_alloc(void)
   1247 {
   1248     mbedtls_aria_context *ctx;
   1249     ctx = mbedtls_calloc(1, sizeof(mbedtls_aria_context));
   1250 
   1251     if (ctx == NULL) {
   1252         return NULL;
   1253     }
   1254 
   1255     mbedtls_aria_init(ctx);
   1256 
   1257     return ctx;
   1258 }
   1259 
   1260 static void aria_ctx_free(void *ctx)
   1261 {
   1262     mbedtls_aria_free((mbedtls_aria_context *) ctx);
   1263     mbedtls_free(ctx);
   1264 }
   1265 
   1266 static const mbedtls_cipher_base_t aria_info = {
   1267     MBEDTLS_CIPHER_ID_ARIA,
   1268     aria_crypt_ecb_wrap,
   1269 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1270     aria_crypt_cbc_wrap,
   1271 #endif
   1272 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1273     aria_crypt_cfb128_wrap,
   1274 #endif
   1275 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1276     NULL,
   1277 #endif
   1278 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1279     aria_crypt_ctr_wrap,
   1280 #endif
   1281 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1282     NULL,
   1283 #endif
   1284 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   1285     NULL,
   1286 #endif
   1287     aria_setkey_enc_wrap,
   1288 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1289     aria_setkey_dec_wrap,
   1290 #endif
   1291     aria_ctx_alloc,
   1292     aria_ctx_free
   1293 };
   1294 
   1295 static const mbedtls_cipher_info_t aria_128_ecb_info = {
   1296     "ARIA-128-ECB",
   1297     16,
   1298     0 >> MBEDTLS_IV_SIZE_SHIFT,
   1299     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1300     MBEDTLS_MODE_ECB,
   1301     MBEDTLS_CIPHER_ARIA_128_ECB,
   1302     0,
   1303     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1304 };
   1305 
   1306 static const mbedtls_cipher_info_t aria_192_ecb_info = {
   1307     "ARIA-192-ECB",
   1308     16,
   1309     0 >> MBEDTLS_IV_SIZE_SHIFT,
   1310     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1311     MBEDTLS_MODE_ECB,
   1312     MBEDTLS_CIPHER_ARIA_192_ECB,
   1313     0,
   1314     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1315 };
   1316 
   1317 static const mbedtls_cipher_info_t aria_256_ecb_info = {
   1318     "ARIA-256-ECB",
   1319     16,
   1320     0 >> MBEDTLS_IV_SIZE_SHIFT,
   1321     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1322     MBEDTLS_MODE_ECB,
   1323     MBEDTLS_CIPHER_ARIA_256_ECB,
   1324     0,
   1325     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1326 };
   1327 
   1328 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1329 static const mbedtls_cipher_info_t aria_128_cbc_info = {
   1330     "ARIA-128-CBC",
   1331     16,
   1332     16 >> MBEDTLS_IV_SIZE_SHIFT,
   1333     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1334     MBEDTLS_MODE_CBC,
   1335     MBEDTLS_CIPHER_ARIA_128_CBC,
   1336     0,
   1337     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1338 };
   1339 
   1340 static const mbedtls_cipher_info_t aria_192_cbc_info = {
   1341     "ARIA-192-CBC",
   1342     16,
   1343     16 >> MBEDTLS_IV_SIZE_SHIFT,
   1344     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1345     MBEDTLS_MODE_CBC,
   1346     MBEDTLS_CIPHER_ARIA_192_CBC,
   1347     0,
   1348     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1349 };
   1350 
   1351 static const mbedtls_cipher_info_t aria_256_cbc_info = {
   1352     "ARIA-256-CBC",
   1353     16,
   1354     16 >> MBEDTLS_IV_SIZE_SHIFT,
   1355     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1356     MBEDTLS_MODE_CBC,
   1357     MBEDTLS_CIPHER_ARIA_256_CBC,
   1358     0,
   1359     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1360 };
   1361 #endif /* MBEDTLS_CIPHER_MODE_CBC */
   1362 
   1363 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1364 static const mbedtls_cipher_info_t aria_128_cfb128_info = {
   1365     "ARIA-128-CFB128",
   1366     16,
   1367     16 >> MBEDTLS_IV_SIZE_SHIFT,
   1368     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1369     MBEDTLS_MODE_CFB,
   1370     MBEDTLS_CIPHER_ARIA_128_CFB128,
   1371     0,
   1372     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1373 };
   1374 
   1375 static const mbedtls_cipher_info_t aria_192_cfb128_info = {
   1376     "ARIA-192-CFB128",
   1377     16,
   1378     16 >> MBEDTLS_IV_SIZE_SHIFT,
   1379     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1380     MBEDTLS_MODE_CFB,
   1381     MBEDTLS_CIPHER_ARIA_192_CFB128,
   1382     0,
   1383     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1384 };
   1385 
   1386 static const mbedtls_cipher_info_t aria_256_cfb128_info = {
   1387     "ARIA-256-CFB128",
   1388     16,
   1389     16 >> MBEDTLS_IV_SIZE_SHIFT,
   1390     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1391     MBEDTLS_MODE_CFB,
   1392     MBEDTLS_CIPHER_ARIA_256_CFB128,
   1393     0,
   1394     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1395 };
   1396 #endif /* MBEDTLS_CIPHER_MODE_CFB */
   1397 
   1398 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1399 static const mbedtls_cipher_info_t aria_128_ctr_info = {
   1400     "ARIA-128-CTR",
   1401     16,
   1402     16 >> MBEDTLS_IV_SIZE_SHIFT,
   1403     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1404     MBEDTLS_MODE_CTR,
   1405     MBEDTLS_CIPHER_ARIA_128_CTR,
   1406     0,
   1407     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1408 };
   1409 
   1410 static const mbedtls_cipher_info_t aria_192_ctr_info = {
   1411     "ARIA-192-CTR",
   1412     16,
   1413     16 >> MBEDTLS_IV_SIZE_SHIFT,
   1414     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1415     MBEDTLS_MODE_CTR,
   1416     MBEDTLS_CIPHER_ARIA_192_CTR,
   1417     0,
   1418     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1419 };
   1420 
   1421 static const mbedtls_cipher_info_t aria_256_ctr_info = {
   1422     "ARIA-256-CTR",
   1423     16,
   1424     16 >> MBEDTLS_IV_SIZE_SHIFT,
   1425     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1426     MBEDTLS_MODE_CTR,
   1427     MBEDTLS_CIPHER_ARIA_256_CTR,
   1428     0,
   1429     MBEDTLS_CIPHER_BASE_INDEX_ARIA
   1430 };
   1431 #endif /* MBEDTLS_CIPHER_MODE_CTR */
   1432 
   1433 #if defined(MBEDTLS_GCM_C)
   1434 static int gcm_aria_setkey_wrap(void *ctx, const unsigned char *key,
   1435                                 unsigned int key_bitlen)
   1436 {
   1437     return mbedtls_gcm_setkey((mbedtls_gcm_context *) ctx, MBEDTLS_CIPHER_ID_ARIA,
   1438                               key, key_bitlen);
   1439 }
   1440 
   1441 static const mbedtls_cipher_base_t gcm_aria_info = {
   1442     MBEDTLS_CIPHER_ID_ARIA,
   1443     NULL,
   1444 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1445     NULL,
   1446 #endif
   1447 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1448     NULL,
   1449 #endif
   1450 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1451     NULL,
   1452 #endif
   1453 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1454     NULL,
   1455 #endif
   1456 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1457     NULL,
   1458 #endif
   1459 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   1460     NULL,
   1461 #endif
   1462     gcm_aria_setkey_wrap,
   1463 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1464     gcm_aria_setkey_wrap,
   1465 #endif
   1466     gcm_ctx_alloc,
   1467     gcm_ctx_free,
   1468 };
   1469 
   1470 static const mbedtls_cipher_info_t aria_128_gcm_info = {
   1471     "ARIA-128-GCM",
   1472     16,
   1473     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1474     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1475     MBEDTLS_MODE_GCM,
   1476     MBEDTLS_CIPHER_ARIA_128_GCM,
   1477     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1478     MBEDTLS_CIPHER_BASE_INDEX_GCM_ARIA
   1479 };
   1480 
   1481 static const mbedtls_cipher_info_t aria_192_gcm_info = {
   1482     "ARIA-192-GCM",
   1483     16,
   1484     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1485     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1486     MBEDTLS_MODE_GCM,
   1487     MBEDTLS_CIPHER_ARIA_192_GCM,
   1488     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1489     MBEDTLS_CIPHER_BASE_INDEX_GCM_ARIA
   1490 };
   1491 
   1492 static const mbedtls_cipher_info_t aria_256_gcm_info = {
   1493     "ARIA-256-GCM",
   1494     16,
   1495     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1496     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1497     MBEDTLS_MODE_GCM,
   1498     MBEDTLS_CIPHER_ARIA_256_GCM,
   1499     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1500     MBEDTLS_CIPHER_BASE_INDEX_GCM_ARIA
   1501 };
   1502 #endif /* MBEDTLS_GCM_C */
   1503 
   1504 #if defined(MBEDTLS_CCM_C)
   1505 static int ccm_aria_setkey_wrap(void *ctx, const unsigned char *key,
   1506                                 unsigned int key_bitlen)
   1507 {
   1508     return mbedtls_ccm_setkey((mbedtls_ccm_context *) ctx, MBEDTLS_CIPHER_ID_ARIA,
   1509                               key, key_bitlen);
   1510 }
   1511 
   1512 static const mbedtls_cipher_base_t ccm_aria_info = {
   1513     MBEDTLS_CIPHER_ID_ARIA,
   1514     NULL,
   1515 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1516     NULL,
   1517 #endif
   1518 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1519     NULL,
   1520 #endif
   1521 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1522     NULL,
   1523 #endif
   1524 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1525     NULL,
   1526 #endif
   1527 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1528     NULL,
   1529 #endif
   1530 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   1531     NULL,
   1532 #endif
   1533     ccm_aria_setkey_wrap,
   1534 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1535     ccm_aria_setkey_wrap,
   1536 #endif
   1537     ccm_ctx_alloc,
   1538     ccm_ctx_free,
   1539 };
   1540 
   1541 static const mbedtls_cipher_info_t aria_128_ccm_info = {
   1542     "ARIA-128-CCM",
   1543     16,
   1544     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1545     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1546     MBEDTLS_MODE_CCM,
   1547     MBEDTLS_CIPHER_ARIA_128_CCM,
   1548     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1549     MBEDTLS_CIPHER_BASE_INDEX_CCM_ARIA
   1550 };
   1551 
   1552 static const mbedtls_cipher_info_t aria_192_ccm_info = {
   1553     "ARIA-192-CCM",
   1554     16,
   1555     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1556     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1557     MBEDTLS_MODE_CCM,
   1558     MBEDTLS_CIPHER_ARIA_192_CCM,
   1559     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1560     MBEDTLS_CIPHER_BASE_INDEX_CCM_ARIA
   1561 };
   1562 
   1563 static const mbedtls_cipher_info_t aria_256_ccm_info = {
   1564     "ARIA-256-CCM",
   1565     16,
   1566     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1567     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1568     MBEDTLS_MODE_CCM,
   1569     MBEDTLS_CIPHER_ARIA_256_CCM,
   1570     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1571     MBEDTLS_CIPHER_BASE_INDEX_CCM_ARIA
   1572 };
   1573 
   1574 static const mbedtls_cipher_info_t aria_128_ccm_star_no_tag_info = {
   1575     "ARIA-128-CCM*-NO-TAG",
   1576     16,
   1577     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1578     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1579     MBEDTLS_MODE_CCM_STAR_NO_TAG,
   1580     MBEDTLS_CIPHER_ARIA_128_CCM_STAR_NO_TAG,
   1581     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1582     MBEDTLS_CIPHER_BASE_INDEX_CCM_ARIA
   1583 };
   1584 
   1585 static const mbedtls_cipher_info_t aria_192_ccm_star_no_tag_info = {
   1586     "ARIA-192-CCM*-NO-TAG",
   1587     16,
   1588     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1589     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1590     MBEDTLS_MODE_CCM_STAR_NO_TAG,
   1591     MBEDTLS_CIPHER_ARIA_192_CCM_STAR_NO_TAG,
   1592     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1593     MBEDTLS_CIPHER_BASE_INDEX_CCM_ARIA
   1594 };
   1595 
   1596 static const mbedtls_cipher_info_t aria_256_ccm_star_no_tag_info = {
   1597     "ARIA-256-CCM*-NO-TAG",
   1598     16,
   1599     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1600     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1601     MBEDTLS_MODE_CCM_STAR_NO_TAG,
   1602     MBEDTLS_CIPHER_ARIA_256_CCM_STAR_NO_TAG,
   1603     MBEDTLS_CIPHER_VARIABLE_IV_LEN,
   1604     MBEDTLS_CIPHER_BASE_INDEX_CCM_ARIA
   1605 };
   1606 #endif /* MBEDTLS_CCM_C */
   1607 
   1608 #endif /* MBEDTLS_ARIA_C */
   1609 
   1610 #if defined(MBEDTLS_DES_C)
   1611 
   1612 static int des_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation,
   1613                               const unsigned char *input, unsigned char *output)
   1614 {
   1615     ((void) operation);
   1616     return mbedtls_des_crypt_ecb((mbedtls_des_context *) ctx, input, output);
   1617 }
   1618 
   1619 static int des3_crypt_ecb_wrap(void *ctx, mbedtls_operation_t operation,
   1620                                const unsigned char *input, unsigned char *output)
   1621 {
   1622     ((void) operation);
   1623     return mbedtls_des3_crypt_ecb((mbedtls_des3_context *) ctx, input, output);
   1624 }
   1625 
   1626 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1627 static int des_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation, size_t length,
   1628                               unsigned char *iv, const unsigned char *input, unsigned char *output)
   1629 {
   1630     return mbedtls_des_crypt_cbc((mbedtls_des_context *) ctx, operation, length, iv, input,
   1631                                  output);
   1632 }
   1633 #endif /* MBEDTLS_CIPHER_MODE_CBC */
   1634 
   1635 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1636 static int des3_crypt_cbc_wrap(void *ctx, mbedtls_operation_t operation, size_t length,
   1637                                unsigned char *iv, const unsigned char *input, unsigned char *output)
   1638 {
   1639     return mbedtls_des3_crypt_cbc((mbedtls_des3_context *) ctx, operation, length, iv, input,
   1640                                   output);
   1641 }
   1642 #endif /* MBEDTLS_CIPHER_MODE_CBC */
   1643 
   1644 static int des_setkey_dec_wrap(void *ctx, const unsigned char *key,
   1645                                unsigned int key_bitlen)
   1646 {
   1647     ((void) key_bitlen);
   1648 
   1649     return mbedtls_des_setkey_dec((mbedtls_des_context *) ctx, key);
   1650 }
   1651 
   1652 static int des_setkey_enc_wrap(void *ctx, const unsigned char *key,
   1653                                unsigned int key_bitlen)
   1654 {
   1655     ((void) key_bitlen);
   1656 
   1657     return mbedtls_des_setkey_enc((mbedtls_des_context *) ctx, key);
   1658 }
   1659 
   1660 static int des3_set2key_dec_wrap(void *ctx, const unsigned char *key,
   1661                                  unsigned int key_bitlen)
   1662 {
   1663     ((void) key_bitlen);
   1664 
   1665     return mbedtls_des3_set2key_dec((mbedtls_des3_context *) ctx, key);
   1666 }
   1667 
   1668 static int des3_set2key_enc_wrap(void *ctx, const unsigned char *key,
   1669                                  unsigned int key_bitlen)
   1670 {
   1671     ((void) key_bitlen);
   1672 
   1673     return mbedtls_des3_set2key_enc((mbedtls_des3_context *) ctx, key);
   1674 }
   1675 
   1676 static int des3_set3key_dec_wrap(void *ctx, const unsigned char *key,
   1677                                  unsigned int key_bitlen)
   1678 {
   1679     ((void) key_bitlen);
   1680 
   1681     return mbedtls_des3_set3key_dec((mbedtls_des3_context *) ctx, key);
   1682 }
   1683 
   1684 static int des3_set3key_enc_wrap(void *ctx, const unsigned char *key,
   1685                                  unsigned int key_bitlen)
   1686 {
   1687     ((void) key_bitlen);
   1688 
   1689     return mbedtls_des3_set3key_enc((mbedtls_des3_context *) ctx, key);
   1690 }
   1691 
   1692 static void *des_ctx_alloc(void)
   1693 {
   1694     mbedtls_des_context *des = mbedtls_calloc(1, sizeof(mbedtls_des_context));
   1695 
   1696     if (des == NULL) {
   1697         return NULL;
   1698     }
   1699 
   1700     mbedtls_des_init(des);
   1701 
   1702     return des;
   1703 }
   1704 
   1705 static void des_ctx_free(void *ctx)
   1706 {
   1707     mbedtls_des_free((mbedtls_des_context *) ctx);
   1708     mbedtls_free(ctx);
   1709 }
   1710 
   1711 static void *des3_ctx_alloc(void)
   1712 {
   1713     mbedtls_des3_context *des3;
   1714     des3 = mbedtls_calloc(1, sizeof(mbedtls_des3_context));
   1715 
   1716     if (des3 == NULL) {
   1717         return NULL;
   1718     }
   1719 
   1720     mbedtls_des3_init(des3);
   1721 
   1722     return des3;
   1723 }
   1724 
   1725 static void des3_ctx_free(void *ctx)
   1726 {
   1727     mbedtls_des3_free((mbedtls_des3_context *) ctx);
   1728     mbedtls_free(ctx);
   1729 }
   1730 
   1731 static const mbedtls_cipher_base_t des_info = {
   1732     MBEDTLS_CIPHER_ID_DES,
   1733     des_crypt_ecb_wrap,
   1734 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1735     des_crypt_cbc_wrap,
   1736 #endif
   1737 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1738     NULL,
   1739 #endif
   1740 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1741     NULL,
   1742 #endif
   1743 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1744     NULL,
   1745 #endif
   1746 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1747     NULL,
   1748 #endif
   1749 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   1750     NULL,
   1751 #endif
   1752     des_setkey_enc_wrap,
   1753     des_setkey_dec_wrap,
   1754     des_ctx_alloc,
   1755     des_ctx_free
   1756 };
   1757 
   1758 static const mbedtls_cipher_info_t des_ecb_info = {
   1759     "DES-ECB",
   1760     8,
   1761     0 >> MBEDTLS_IV_SIZE_SHIFT,
   1762     MBEDTLS_KEY_LENGTH_DES >> MBEDTLS_KEY_BITLEN_SHIFT,
   1763     MBEDTLS_MODE_ECB,
   1764     MBEDTLS_CIPHER_DES_ECB,
   1765     0,
   1766     MBEDTLS_CIPHER_BASE_INDEX_DES
   1767 };
   1768 
   1769 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1770 static const mbedtls_cipher_info_t des_cbc_info = {
   1771     "DES-CBC",
   1772     8,
   1773     8 >> MBEDTLS_IV_SIZE_SHIFT,
   1774     MBEDTLS_KEY_LENGTH_DES >> MBEDTLS_KEY_BITLEN_SHIFT,
   1775     MBEDTLS_MODE_CBC,
   1776     MBEDTLS_CIPHER_DES_CBC,
   1777     0,
   1778     MBEDTLS_CIPHER_BASE_INDEX_DES
   1779 };
   1780 #endif /* MBEDTLS_CIPHER_MODE_CBC */
   1781 
   1782 static const mbedtls_cipher_base_t des_ede_info = {
   1783     MBEDTLS_CIPHER_ID_DES,
   1784     des3_crypt_ecb_wrap,
   1785 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1786     des3_crypt_cbc_wrap,
   1787 #endif
   1788 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1789     NULL,
   1790 #endif
   1791 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1792     NULL,
   1793 #endif
   1794 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1795     NULL,
   1796 #endif
   1797 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1798     NULL,
   1799 #endif
   1800 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   1801     NULL,
   1802 #endif
   1803     des3_set2key_enc_wrap,
   1804     des3_set2key_dec_wrap,
   1805     des3_ctx_alloc,
   1806     des3_ctx_free
   1807 };
   1808 
   1809 static const mbedtls_cipher_info_t des_ede_ecb_info = {
   1810     "DES-EDE-ECB",
   1811     8,
   1812     0 >> MBEDTLS_IV_SIZE_SHIFT,
   1813     MBEDTLS_KEY_LENGTH_DES_EDE >> MBEDTLS_KEY_BITLEN_SHIFT,
   1814     MBEDTLS_MODE_ECB,
   1815     MBEDTLS_CIPHER_DES_EDE_ECB,
   1816     0,
   1817     MBEDTLS_CIPHER_BASE_INDEX_DES_EDE
   1818 };
   1819 
   1820 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1821 static const mbedtls_cipher_info_t des_ede_cbc_info = {
   1822     "DES-EDE-CBC",
   1823     8,
   1824     8 >> MBEDTLS_IV_SIZE_SHIFT,
   1825     MBEDTLS_KEY_LENGTH_DES_EDE >> MBEDTLS_KEY_BITLEN_SHIFT,
   1826     MBEDTLS_MODE_CBC,
   1827     MBEDTLS_CIPHER_DES_EDE_CBC,
   1828     0,
   1829     MBEDTLS_CIPHER_BASE_INDEX_DES_EDE
   1830 };
   1831 #endif /* MBEDTLS_CIPHER_MODE_CBC */
   1832 
   1833 static const mbedtls_cipher_base_t des_ede3_info = {
   1834     MBEDTLS_CIPHER_ID_3DES,
   1835     des3_crypt_ecb_wrap,
   1836 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1837     des3_crypt_cbc_wrap,
   1838 #endif
   1839 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1840     NULL,
   1841 #endif
   1842 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1843     NULL,
   1844 #endif
   1845 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1846     NULL,
   1847 #endif
   1848 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1849     NULL,
   1850 #endif
   1851 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   1852     NULL,
   1853 #endif
   1854     des3_set3key_enc_wrap,
   1855     des3_set3key_dec_wrap,
   1856     des3_ctx_alloc,
   1857     des3_ctx_free
   1858 };
   1859 
   1860 static const mbedtls_cipher_info_t des_ede3_ecb_info = {
   1861     "DES-EDE3-ECB",
   1862     8,
   1863     0 >> MBEDTLS_IV_SIZE_SHIFT,
   1864     MBEDTLS_KEY_LENGTH_DES_EDE3 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1865     MBEDTLS_MODE_ECB,
   1866     MBEDTLS_CIPHER_DES_EDE3_ECB,
   1867     0,
   1868     MBEDTLS_CIPHER_BASE_INDEX_DES_EDE3
   1869 };
   1870 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1871 static const mbedtls_cipher_info_t des_ede3_cbc_info = {
   1872     "DES-EDE3-CBC",
   1873     8,
   1874     8 >> MBEDTLS_IV_SIZE_SHIFT,
   1875     MBEDTLS_KEY_LENGTH_DES_EDE3 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1876     MBEDTLS_MODE_CBC,
   1877     MBEDTLS_CIPHER_DES_EDE3_CBC,
   1878     0,
   1879     MBEDTLS_CIPHER_BASE_INDEX_DES_EDE3
   1880 };
   1881 #endif /* MBEDTLS_CIPHER_MODE_CBC */
   1882 #endif /* MBEDTLS_DES_C */
   1883 
   1884 #if defined(MBEDTLS_CHACHA20_C)
   1885 
   1886 static int chacha20_setkey_wrap(void *ctx, const unsigned char *key,
   1887                                 unsigned int key_bitlen)
   1888 {
   1889     if (key_bitlen != 256U) {
   1890         return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
   1891     }
   1892 
   1893     if (0 != mbedtls_chacha20_setkey((mbedtls_chacha20_context *) ctx, key)) {
   1894         return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
   1895     }
   1896 
   1897     return 0;
   1898 }
   1899 
   1900 static int chacha20_stream_wrap(void *ctx,  size_t length,
   1901                                 const unsigned char *input,
   1902                                 unsigned char *output)
   1903 {
   1904     int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
   1905 
   1906     ret = mbedtls_chacha20_update(ctx, length, input, output);
   1907     if (ret == MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA) {
   1908         return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
   1909     }
   1910 
   1911     return ret;
   1912 }
   1913 
   1914 static void *chacha20_ctx_alloc(void)
   1915 {
   1916     mbedtls_chacha20_context *ctx;
   1917     ctx = mbedtls_calloc(1, sizeof(mbedtls_chacha20_context));
   1918 
   1919     if (ctx == NULL) {
   1920         return NULL;
   1921     }
   1922 
   1923     mbedtls_chacha20_init(ctx);
   1924 
   1925     return ctx;
   1926 }
   1927 
   1928 static void chacha20_ctx_free(void *ctx)
   1929 {
   1930     mbedtls_chacha20_free((mbedtls_chacha20_context *) ctx);
   1931     mbedtls_free(ctx);
   1932 }
   1933 
   1934 static const mbedtls_cipher_base_t chacha20_base_info = {
   1935     MBEDTLS_CIPHER_ID_CHACHA20,
   1936     NULL,
   1937 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   1938     NULL,
   1939 #endif
   1940 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   1941     NULL,
   1942 #endif
   1943 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   1944     NULL,
   1945 #endif
   1946 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   1947     NULL,
   1948 #endif
   1949 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   1950     NULL,
   1951 #endif
   1952 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   1953     chacha20_stream_wrap,
   1954 #endif
   1955     chacha20_setkey_wrap,
   1956 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   1957     chacha20_setkey_wrap,
   1958 #endif
   1959     chacha20_ctx_alloc,
   1960     chacha20_ctx_free
   1961 };
   1962 static const mbedtls_cipher_info_t chacha20_info = {
   1963     "CHACHA20",
   1964     1,
   1965     12 >> MBEDTLS_IV_SIZE_SHIFT,
   1966     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   1967     MBEDTLS_MODE_STREAM,
   1968     MBEDTLS_CIPHER_CHACHA20,
   1969     0,
   1970     MBEDTLS_CIPHER_BASE_INDEX_CHACHA20_BASE
   1971 };
   1972 #endif /* MBEDTLS_CHACHA20_C */
   1973 
   1974 #if defined(MBEDTLS_CHACHAPOLY_C)
   1975 
   1976 static int chachapoly_setkey_wrap(void *ctx,
   1977                                   const unsigned char *key,
   1978                                   unsigned int key_bitlen)
   1979 {
   1980     if (key_bitlen != 256U) {
   1981         return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
   1982     }
   1983 
   1984     if (0 != mbedtls_chachapoly_setkey((mbedtls_chachapoly_context *) ctx, key)) {
   1985         return MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA;
   1986     }
   1987 
   1988     return 0;
   1989 }
   1990 
   1991 static void *chachapoly_ctx_alloc(void)
   1992 {
   1993     mbedtls_chachapoly_context *ctx;
   1994     ctx = mbedtls_calloc(1, sizeof(mbedtls_chachapoly_context));
   1995 
   1996     if (ctx == NULL) {
   1997         return NULL;
   1998     }
   1999 
   2000     mbedtls_chachapoly_init(ctx);
   2001 
   2002     return ctx;
   2003 }
   2004 
   2005 static void chachapoly_ctx_free(void *ctx)
   2006 {
   2007     mbedtls_chachapoly_free((mbedtls_chachapoly_context *) ctx);
   2008     mbedtls_free(ctx);
   2009 }
   2010 
   2011 static const mbedtls_cipher_base_t chachapoly_base_info = {
   2012     MBEDTLS_CIPHER_ID_CHACHA20,
   2013     NULL,
   2014 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   2015     NULL,
   2016 #endif
   2017 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   2018     NULL,
   2019 #endif
   2020 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   2021     NULL,
   2022 #endif
   2023 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   2024     NULL,
   2025 #endif
   2026 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   2027     NULL,
   2028 #endif
   2029 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   2030     NULL,
   2031 #endif
   2032     chachapoly_setkey_wrap,
   2033 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   2034     chachapoly_setkey_wrap,
   2035 #endif
   2036     chachapoly_ctx_alloc,
   2037     chachapoly_ctx_free
   2038 };
   2039 static const mbedtls_cipher_info_t chachapoly_info = {
   2040     "CHACHA20-POLY1305",
   2041     1,
   2042     12 >> MBEDTLS_IV_SIZE_SHIFT,
   2043     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   2044     MBEDTLS_MODE_CHACHAPOLY,
   2045     MBEDTLS_CIPHER_CHACHA20_POLY1305,
   2046     0,
   2047     MBEDTLS_CIPHER_BASE_INDEX_CHACHAPOLY_BASE
   2048 };
   2049 #endif /* MBEDTLS_CHACHAPOLY_C */
   2050 
   2051 #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
   2052 static int null_crypt_stream(void *ctx, size_t length,
   2053                              const unsigned char *input,
   2054                              unsigned char *output)
   2055 {
   2056     ((void) ctx);
   2057     memmove(output, input, length);
   2058     return 0;
   2059 }
   2060 
   2061 static int null_setkey(void *ctx, const unsigned char *key,
   2062                        unsigned int key_bitlen)
   2063 {
   2064     ((void) ctx);
   2065     ((void) key);
   2066     ((void) key_bitlen);
   2067 
   2068     return 0;
   2069 }
   2070 
   2071 static void *null_ctx_alloc(void)
   2072 {
   2073     return (void *) 1;
   2074 }
   2075 
   2076 static void null_ctx_free(void *ctx)
   2077 {
   2078     ((void) ctx);
   2079 }
   2080 
   2081 static const mbedtls_cipher_base_t null_base_info = {
   2082     MBEDTLS_CIPHER_ID_NULL,
   2083     NULL,
   2084 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   2085     NULL,
   2086 #endif
   2087 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   2088     NULL,
   2089 #endif
   2090 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   2091     NULL,
   2092 #endif
   2093 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   2094     NULL,
   2095 #endif
   2096 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   2097     NULL,
   2098 #endif
   2099 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   2100     null_crypt_stream,
   2101 #endif
   2102     null_setkey,
   2103 #if !defined(MBEDTLS_BLOCK_CIPHER_NO_DECRYPT)
   2104     null_setkey,
   2105 #endif
   2106     null_ctx_alloc,
   2107     null_ctx_free
   2108 };
   2109 
   2110 static const mbedtls_cipher_info_t null_cipher_info = {
   2111     "NULL",
   2112     1,
   2113     0 >> MBEDTLS_IV_SIZE_SHIFT,
   2114     0 >> MBEDTLS_KEY_BITLEN_SHIFT,
   2115     MBEDTLS_MODE_STREAM,
   2116     MBEDTLS_CIPHER_NULL,
   2117     0,
   2118     MBEDTLS_CIPHER_BASE_INDEX_NULL_BASE
   2119 };
   2120 #endif /* defined(MBEDTLS_CIPHER_NULL_CIPHER) */
   2121 
   2122 #if defined(MBEDTLS_NIST_KW_C)
   2123 static void *kw_ctx_alloc(void)
   2124 {
   2125     void *ctx = mbedtls_calloc(1, sizeof(mbedtls_nist_kw_context));
   2126 
   2127     if (ctx != NULL) {
   2128         mbedtls_nist_kw_init((mbedtls_nist_kw_context *) ctx);
   2129     }
   2130 
   2131     return ctx;
   2132 }
   2133 
   2134 static void kw_ctx_free(void *ctx)
   2135 {
   2136     mbedtls_nist_kw_free(ctx);
   2137     mbedtls_free(ctx);
   2138 }
   2139 
   2140 static int kw_aes_setkey_wrap(void *ctx, const unsigned char *key,
   2141                               unsigned int key_bitlen)
   2142 {
   2143     return mbedtls_nist_kw_setkey((mbedtls_nist_kw_context *) ctx,
   2144                                   MBEDTLS_CIPHER_ID_AES, key, key_bitlen, 1);
   2145 }
   2146 
   2147 static int kw_aes_setkey_unwrap(void *ctx, const unsigned char *key,
   2148                                 unsigned int key_bitlen)
   2149 {
   2150     return mbedtls_nist_kw_setkey((mbedtls_nist_kw_context *) ctx,
   2151                                   MBEDTLS_CIPHER_ID_AES, key, key_bitlen, 0);
   2152 }
   2153 
   2154 static const mbedtls_cipher_base_t kw_aes_info = {
   2155     MBEDTLS_CIPHER_ID_AES,
   2156     NULL,
   2157 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   2158     NULL,
   2159 #endif
   2160 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   2161     NULL,
   2162 #endif
   2163 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   2164     NULL,
   2165 #endif
   2166 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   2167     NULL,
   2168 #endif
   2169 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   2170     NULL,
   2171 #endif
   2172 #if defined(MBEDTLS_CIPHER_MODE_STREAM)
   2173     NULL,
   2174 #endif
   2175     kw_aes_setkey_wrap,
   2176     kw_aes_setkey_unwrap,
   2177     kw_ctx_alloc,
   2178     kw_ctx_free,
   2179 };
   2180 
   2181 static const mbedtls_cipher_info_t aes_128_nist_kw_info = {
   2182     "AES-128-KW",
   2183     16,
   2184     0 >> MBEDTLS_IV_SIZE_SHIFT,
   2185     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   2186     MBEDTLS_MODE_KW,
   2187     MBEDTLS_CIPHER_AES_128_KW,
   2188     0,
   2189     MBEDTLS_CIPHER_BASE_INDEX_KW_AES
   2190 };
   2191 
   2192 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2193 static const mbedtls_cipher_info_t aes_192_nist_kw_info = {
   2194     "AES-192-KW",
   2195     16,
   2196     0 >> MBEDTLS_IV_SIZE_SHIFT,
   2197     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   2198     MBEDTLS_MODE_KW,
   2199     MBEDTLS_CIPHER_AES_192_KW,
   2200     0,
   2201     MBEDTLS_CIPHER_BASE_INDEX_KW_AES
   2202 };
   2203 
   2204 static const mbedtls_cipher_info_t aes_256_nist_kw_info = {
   2205     "AES-256-KW",
   2206     16,
   2207     0 >> MBEDTLS_IV_SIZE_SHIFT,
   2208     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   2209     MBEDTLS_MODE_KW,
   2210     MBEDTLS_CIPHER_AES_256_KW,
   2211     0,
   2212     MBEDTLS_CIPHER_BASE_INDEX_KW_AES
   2213 };
   2214 #endif
   2215 
   2216 static const mbedtls_cipher_info_t aes_128_nist_kwp_info = {
   2217     "AES-128-KWP",
   2218     16,
   2219     0 >> MBEDTLS_IV_SIZE_SHIFT,
   2220     128 >> MBEDTLS_KEY_BITLEN_SHIFT,
   2221     MBEDTLS_MODE_KWP,
   2222     MBEDTLS_CIPHER_AES_128_KWP,
   2223     0,
   2224     MBEDTLS_CIPHER_BASE_INDEX_KW_AES
   2225 };
   2226 
   2227 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2228 static const mbedtls_cipher_info_t aes_192_nist_kwp_info = {
   2229     "AES-192-KWP",
   2230     16,
   2231     0 >> MBEDTLS_IV_SIZE_SHIFT,
   2232     192 >> MBEDTLS_KEY_BITLEN_SHIFT,
   2233     MBEDTLS_MODE_KWP,
   2234     MBEDTLS_CIPHER_AES_192_KWP,
   2235     0,
   2236     MBEDTLS_CIPHER_BASE_INDEX_KW_AES
   2237 };
   2238 
   2239 static const mbedtls_cipher_info_t aes_256_nist_kwp_info = {
   2240     "AES-256-KWP",
   2241     16,
   2242     0 >> MBEDTLS_IV_SIZE_SHIFT,
   2243     256 >> MBEDTLS_KEY_BITLEN_SHIFT,
   2244     MBEDTLS_MODE_KWP,
   2245     MBEDTLS_CIPHER_AES_256_KWP,
   2246     0,
   2247     MBEDTLS_CIPHER_BASE_INDEX_KW_AES
   2248 };
   2249 #endif
   2250 #endif /* MBEDTLS_NIST_KW_C */
   2251 
   2252 const mbedtls_cipher_definition_t mbedtls_cipher_definitions[] =
   2253 {
   2254 #if defined(MBEDTLS_AES_C)
   2255     { MBEDTLS_CIPHER_AES_128_ECB,          &aes_128_ecb_info },
   2256 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2257     { MBEDTLS_CIPHER_AES_192_ECB,          &aes_192_ecb_info },
   2258     { MBEDTLS_CIPHER_AES_256_ECB,          &aes_256_ecb_info },
   2259 #endif
   2260 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   2261     { MBEDTLS_CIPHER_AES_128_CBC,          &aes_128_cbc_info },
   2262 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2263     { MBEDTLS_CIPHER_AES_192_CBC,          &aes_192_cbc_info },
   2264     { MBEDTLS_CIPHER_AES_256_CBC,          &aes_256_cbc_info },
   2265 #endif
   2266 #endif
   2267 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   2268     { MBEDTLS_CIPHER_AES_128_CFB128,       &aes_128_cfb128_info },
   2269 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2270     { MBEDTLS_CIPHER_AES_192_CFB128,       &aes_192_cfb128_info },
   2271     { MBEDTLS_CIPHER_AES_256_CFB128,       &aes_256_cfb128_info },
   2272 #endif
   2273 #endif
   2274 #if defined(MBEDTLS_CIPHER_MODE_OFB)
   2275     { MBEDTLS_CIPHER_AES_128_OFB,          &aes_128_ofb_info },
   2276 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2277     { MBEDTLS_CIPHER_AES_192_OFB,          &aes_192_ofb_info },
   2278     { MBEDTLS_CIPHER_AES_256_OFB,          &aes_256_ofb_info },
   2279 #endif
   2280 #endif
   2281 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   2282     { MBEDTLS_CIPHER_AES_128_CTR,          &aes_128_ctr_info },
   2283 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2284     { MBEDTLS_CIPHER_AES_192_CTR,          &aes_192_ctr_info },
   2285     { MBEDTLS_CIPHER_AES_256_CTR,          &aes_256_ctr_info },
   2286 #endif
   2287 #endif
   2288 #if defined(MBEDTLS_CIPHER_MODE_XTS)
   2289     { MBEDTLS_CIPHER_AES_128_XTS,          &aes_128_xts_info },
   2290 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2291     { MBEDTLS_CIPHER_AES_256_XTS,          &aes_256_xts_info },
   2292 #endif
   2293 #endif
   2294 #endif /* MBEDTLS_AES_C */
   2295 #if defined(MBEDTLS_CIPHER_HAVE_GCM_AES_VIA_LEGACY_OR_USE_PSA)
   2296     { MBEDTLS_CIPHER_AES_128_GCM,          &aes_128_gcm_info },
   2297 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2298     { MBEDTLS_CIPHER_AES_192_GCM,          &aes_192_gcm_info },
   2299     { MBEDTLS_CIPHER_AES_256_GCM,          &aes_256_gcm_info },
   2300 #endif
   2301 #endif
   2302 #if defined(MBEDTLS_CIPHER_HAVE_CCM_AES_VIA_LEGACY_OR_USE_PSA)
   2303     { MBEDTLS_CIPHER_AES_128_CCM,          &aes_128_ccm_info },
   2304 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2305     { MBEDTLS_CIPHER_AES_192_CCM,          &aes_192_ccm_info },
   2306     { MBEDTLS_CIPHER_AES_256_CCM,          &aes_256_ccm_info },
   2307 #endif
   2308 #endif
   2309 #if defined(MBEDTLS_CIPHER_HAVE_CCM_STAR_NO_TAG_AES_VIA_LEGACY_OR_USE_PSA)
   2310     { MBEDTLS_CIPHER_AES_128_CCM_STAR_NO_TAG,          &aes_128_ccm_star_no_tag_info },
   2311 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2312     { MBEDTLS_CIPHER_AES_192_CCM_STAR_NO_TAG,          &aes_192_ccm_star_no_tag_info },
   2313     { MBEDTLS_CIPHER_AES_256_CCM_STAR_NO_TAG,          &aes_256_ccm_star_no_tag_info },
   2314 #endif
   2315 #endif
   2316 
   2317 #if defined(MBEDTLS_CAMELLIA_C)
   2318     { MBEDTLS_CIPHER_CAMELLIA_128_ECB,     &camellia_128_ecb_info },
   2319     { MBEDTLS_CIPHER_CAMELLIA_192_ECB,     &camellia_192_ecb_info },
   2320     { MBEDTLS_CIPHER_CAMELLIA_256_ECB,     &camellia_256_ecb_info },
   2321 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   2322     { MBEDTLS_CIPHER_CAMELLIA_128_CBC,     &camellia_128_cbc_info },
   2323     { MBEDTLS_CIPHER_CAMELLIA_192_CBC,     &camellia_192_cbc_info },
   2324     { MBEDTLS_CIPHER_CAMELLIA_256_CBC,     &camellia_256_cbc_info },
   2325 #endif
   2326 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   2327     { MBEDTLS_CIPHER_CAMELLIA_128_CFB128,  &camellia_128_cfb128_info },
   2328     { MBEDTLS_CIPHER_CAMELLIA_192_CFB128,  &camellia_192_cfb128_info },
   2329     { MBEDTLS_CIPHER_CAMELLIA_256_CFB128,  &camellia_256_cfb128_info },
   2330 #endif
   2331 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   2332     { MBEDTLS_CIPHER_CAMELLIA_128_CTR,     &camellia_128_ctr_info },
   2333     { MBEDTLS_CIPHER_CAMELLIA_192_CTR,     &camellia_192_ctr_info },
   2334     { MBEDTLS_CIPHER_CAMELLIA_256_CTR,     &camellia_256_ctr_info },
   2335 #endif
   2336 #if defined(MBEDTLS_GCM_C)
   2337     { MBEDTLS_CIPHER_CAMELLIA_128_GCM,     &camellia_128_gcm_info },
   2338     { MBEDTLS_CIPHER_CAMELLIA_192_GCM,     &camellia_192_gcm_info },
   2339     { MBEDTLS_CIPHER_CAMELLIA_256_GCM,     &camellia_256_gcm_info },
   2340 #endif
   2341 #if defined(MBEDTLS_CCM_C)
   2342     { MBEDTLS_CIPHER_CAMELLIA_128_CCM,     &camellia_128_ccm_info },
   2343     { MBEDTLS_CIPHER_CAMELLIA_192_CCM,     &camellia_192_ccm_info },
   2344     { MBEDTLS_CIPHER_CAMELLIA_256_CCM,     &camellia_256_ccm_info },
   2345     { MBEDTLS_CIPHER_CAMELLIA_128_CCM_STAR_NO_TAG,     &camellia_128_ccm_star_no_tag_info },
   2346     { MBEDTLS_CIPHER_CAMELLIA_192_CCM_STAR_NO_TAG,     &camellia_192_ccm_star_no_tag_info },
   2347     { MBEDTLS_CIPHER_CAMELLIA_256_CCM_STAR_NO_TAG,     &camellia_256_ccm_star_no_tag_info },
   2348 #endif
   2349 #endif /* MBEDTLS_CAMELLIA_C */
   2350 
   2351 #if defined(MBEDTLS_ARIA_C)
   2352     { MBEDTLS_CIPHER_ARIA_128_ECB,     &aria_128_ecb_info },
   2353     { MBEDTLS_CIPHER_ARIA_192_ECB,     &aria_192_ecb_info },
   2354     { MBEDTLS_CIPHER_ARIA_256_ECB,     &aria_256_ecb_info },
   2355 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   2356     { MBEDTLS_CIPHER_ARIA_128_CBC,     &aria_128_cbc_info },
   2357     { MBEDTLS_CIPHER_ARIA_192_CBC,     &aria_192_cbc_info },
   2358     { MBEDTLS_CIPHER_ARIA_256_CBC,     &aria_256_cbc_info },
   2359 #endif
   2360 #if defined(MBEDTLS_CIPHER_MODE_CFB)
   2361     { MBEDTLS_CIPHER_ARIA_128_CFB128,  &aria_128_cfb128_info },
   2362     { MBEDTLS_CIPHER_ARIA_192_CFB128,  &aria_192_cfb128_info },
   2363     { MBEDTLS_CIPHER_ARIA_256_CFB128,  &aria_256_cfb128_info },
   2364 #endif
   2365 #if defined(MBEDTLS_CIPHER_MODE_CTR)
   2366     { MBEDTLS_CIPHER_ARIA_128_CTR,     &aria_128_ctr_info },
   2367     { MBEDTLS_CIPHER_ARIA_192_CTR,     &aria_192_ctr_info },
   2368     { MBEDTLS_CIPHER_ARIA_256_CTR,     &aria_256_ctr_info },
   2369 #endif
   2370 #if defined(MBEDTLS_GCM_C)
   2371     { MBEDTLS_CIPHER_ARIA_128_GCM,     &aria_128_gcm_info },
   2372     { MBEDTLS_CIPHER_ARIA_192_GCM,     &aria_192_gcm_info },
   2373     { MBEDTLS_CIPHER_ARIA_256_GCM,     &aria_256_gcm_info },
   2374 #endif
   2375 #if defined(MBEDTLS_CCM_C)
   2376     { MBEDTLS_CIPHER_ARIA_128_CCM,     &aria_128_ccm_info },
   2377     { MBEDTLS_CIPHER_ARIA_192_CCM,     &aria_192_ccm_info },
   2378     { MBEDTLS_CIPHER_ARIA_256_CCM,     &aria_256_ccm_info },
   2379     { MBEDTLS_CIPHER_ARIA_128_CCM_STAR_NO_TAG,     &aria_128_ccm_star_no_tag_info },
   2380     { MBEDTLS_CIPHER_ARIA_192_CCM_STAR_NO_TAG,     &aria_192_ccm_star_no_tag_info },
   2381     { MBEDTLS_CIPHER_ARIA_256_CCM_STAR_NO_TAG,     &aria_256_ccm_star_no_tag_info },
   2382 #endif
   2383 #endif /* MBEDTLS_ARIA_C */
   2384 
   2385 #if defined(MBEDTLS_DES_C)
   2386     { MBEDTLS_CIPHER_DES_ECB,              &des_ecb_info },
   2387     { MBEDTLS_CIPHER_DES_EDE_ECB,          &des_ede_ecb_info },
   2388     { MBEDTLS_CIPHER_DES_EDE3_ECB,         &des_ede3_ecb_info },
   2389 #if defined(MBEDTLS_CIPHER_MODE_CBC)
   2390     { MBEDTLS_CIPHER_DES_CBC,              &des_cbc_info },
   2391     { MBEDTLS_CIPHER_DES_EDE_CBC,          &des_ede_cbc_info },
   2392     { MBEDTLS_CIPHER_DES_EDE3_CBC,         &des_ede3_cbc_info },
   2393 #endif
   2394 #endif /* MBEDTLS_DES_C */
   2395 
   2396 #if defined(MBEDTLS_CHACHA20_C)
   2397     { MBEDTLS_CIPHER_CHACHA20,             &chacha20_info },
   2398 #endif
   2399 
   2400 #if defined(MBEDTLS_CHACHAPOLY_C)
   2401     { MBEDTLS_CIPHER_CHACHA20_POLY1305,    &chachapoly_info },
   2402 #endif
   2403 
   2404 #if defined(MBEDTLS_NIST_KW_C)
   2405     { MBEDTLS_CIPHER_AES_128_KW,          &aes_128_nist_kw_info },
   2406 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2407     { MBEDTLS_CIPHER_AES_192_KW,          &aes_192_nist_kw_info },
   2408     { MBEDTLS_CIPHER_AES_256_KW,          &aes_256_nist_kw_info },
   2409 #endif
   2410     { MBEDTLS_CIPHER_AES_128_KWP,         &aes_128_nist_kwp_info },
   2411 #if !defined(MBEDTLS_AES_ONLY_128_BIT_KEY_LENGTH)
   2412     { MBEDTLS_CIPHER_AES_192_KWP,         &aes_192_nist_kwp_info },
   2413     { MBEDTLS_CIPHER_AES_256_KWP,         &aes_256_nist_kwp_info },
   2414 #endif
   2415 #endif
   2416 
   2417 #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
   2418     { MBEDTLS_CIPHER_NULL,                 &null_cipher_info },
   2419 #endif /* MBEDTLS_CIPHER_NULL_CIPHER */
   2420 
   2421     { MBEDTLS_CIPHER_NONE, NULL }
   2422 };
   2423 
   2424 #define NUM_CIPHERS (sizeof(mbedtls_cipher_definitions) /      \
   2425                      sizeof(mbedtls_cipher_definitions[0]))
   2426 int mbedtls_cipher_supported[NUM_CIPHERS];
   2427 
   2428 const mbedtls_cipher_base_t * const mbedtls_cipher_base_lookup_table[] = {
   2429 #if defined(MBEDTLS_AES_C)
   2430     [MBEDTLS_CIPHER_BASE_INDEX_AES] = &aes_info,
   2431 #endif
   2432 #if defined(MBEDTLS_ARIA_C)
   2433     [MBEDTLS_CIPHER_BASE_INDEX_ARIA] = &aria_info,
   2434 #endif
   2435 #if defined(MBEDTLS_CAMELLIA_C)
   2436     [MBEDTLS_CIPHER_BASE_INDEX_CAMELLIA] = &camellia_info,
   2437 #endif
   2438 #if defined(MBEDTLS_CIPHER_HAVE_CCM_AES_VIA_LEGACY_OR_USE_PSA)
   2439     [MBEDTLS_CIPHER_BASE_INDEX_CCM_AES] = &ccm_aes_info,
   2440 #endif
   2441 #if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_ARIA_C)
   2442     [MBEDTLS_CIPHER_BASE_INDEX_CCM_ARIA] = &ccm_aria_info,
   2443 #endif
   2444 #if defined(MBEDTLS_CCM_C) && defined(MBEDTLS_CAMELLIA_C)
   2445     [MBEDTLS_CIPHER_BASE_INDEX_CCM_CAMELLIA] = &ccm_camellia_info,
   2446 #endif
   2447 #if defined(MBEDTLS_CHACHA20_C)
   2448     [MBEDTLS_CIPHER_BASE_INDEX_CHACHA20_BASE] = &chacha20_base_info,
   2449 #endif
   2450 #if defined(MBEDTLS_CHACHAPOLY_C)
   2451     [MBEDTLS_CIPHER_BASE_INDEX_CHACHAPOLY_BASE] = &chachapoly_base_info,
   2452 #endif
   2453 #if defined(MBEDTLS_DES_C)
   2454     [MBEDTLS_CIPHER_BASE_INDEX_DES_EDE3] = &des_ede3_info,
   2455 #endif
   2456 #if defined(MBEDTLS_DES_C)
   2457     [MBEDTLS_CIPHER_BASE_INDEX_DES_EDE] = &des_ede_info,
   2458 #endif
   2459 #if defined(MBEDTLS_DES_C)
   2460     [MBEDTLS_CIPHER_BASE_INDEX_DES] = &des_info,
   2461 #endif
   2462 #if defined(MBEDTLS_CIPHER_HAVE_GCM_AES_VIA_LEGACY_OR_USE_PSA)
   2463     [MBEDTLS_CIPHER_BASE_INDEX_GCM_AES] = &gcm_aes_info,
   2464 #endif
   2465 #if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_ARIA_C)
   2466     [MBEDTLS_CIPHER_BASE_INDEX_GCM_ARIA] = &gcm_aria_info,
   2467 #endif
   2468 #if defined(MBEDTLS_GCM_C) && defined(MBEDTLS_CAMELLIA_C)
   2469     [MBEDTLS_CIPHER_BASE_INDEX_GCM_CAMELLIA] = &gcm_camellia_info,
   2470 #endif
   2471 #if defined(MBEDTLS_NIST_KW_C)
   2472     [MBEDTLS_CIPHER_BASE_INDEX_KW_AES] = &kw_aes_info,
   2473 #endif
   2474 #if defined(MBEDTLS_CIPHER_NULL_CIPHER)
   2475     [MBEDTLS_CIPHER_BASE_INDEX_NULL_BASE] = &null_base_info,
   2476 #endif
   2477 #if defined(MBEDTLS_CIPHER_MODE_XTS) && defined(MBEDTLS_AES_C)
   2478     [MBEDTLS_CIPHER_BASE_INDEX_XTS_AES] = &xts_aes_info
   2479 #endif
   2480 };
   2481 
   2482 #endif /* MBEDTLS_CIPHER_C */