Home | History | Annotate | Line # | Download | only in ciphers
      1 /*
      2  * Copyright 2019-2023 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 /*
     11  * AES low level APIs are deprecated for public use, but still ok for internal
     12  * use where we're using them to implement the higher level EVP interface, as is
     13  * the case here.
     14  */
     15 #include "internal/deprecated.h"
     16 
     17 #include <openssl/proverr.h>
     18 #include "cipher_aes_ocb.h"
     19 #include "prov/providercommon.h"
     20 #include "prov/ciphercommon_aead.h"
     21 #include "prov/implementations.h"
     22 
     23 #define AES_OCB_FLAGS AEAD_FLAGS
     24 
     25 #define OCB_DEFAULT_TAG_LEN 16
     26 #define OCB_DEFAULT_IV_LEN 12
     27 #define OCB_MIN_IV_LEN 1
     28 #define OCB_MAX_IV_LEN 15
     29 
     30 PROV_CIPHER_FUNC(int, ocb_cipher, (PROV_AES_OCB_CTX * ctx, const unsigned char *in, unsigned char *out, size_t nextblock));
     31 /* forward declarations */
     32 static OSSL_FUNC_cipher_encrypt_init_fn aes_ocb_einit;
     33 static OSSL_FUNC_cipher_decrypt_init_fn aes_ocb_dinit;
     34 static OSSL_FUNC_cipher_update_fn aes_ocb_block_update;
     35 static OSSL_FUNC_cipher_final_fn aes_ocb_block_final;
     36 static OSSL_FUNC_cipher_cipher_fn aes_ocb_cipher;
     37 static OSSL_FUNC_cipher_freectx_fn aes_ocb_freectx;
     38 static OSSL_FUNC_cipher_dupctx_fn aes_ocb_dupctx;
     39 static OSSL_FUNC_cipher_get_ctx_params_fn aes_ocb_get_ctx_params;
     40 static OSSL_FUNC_cipher_set_ctx_params_fn aes_ocb_set_ctx_params;
     41 static OSSL_FUNC_cipher_gettable_ctx_params_fn cipher_ocb_gettable_ctx_params;
     42 static OSSL_FUNC_cipher_settable_ctx_params_fn cipher_ocb_settable_ctx_params;
     43 
     44 /*
     45  * The following methods could be moved into PROV_AES_OCB_HW if
     46  * multiple hardware implementations are ever needed.
     47  */
     48 static ossl_inline int aes_generic_ocb_setiv(PROV_AES_OCB_CTX *ctx,
     49     const unsigned char *iv,
     50     size_t ivlen, size_t taglen)
     51 {
     52     return (CRYPTO_ocb128_setiv(&ctx->ocb, iv, ivlen, taglen) == 1);
     53 }
     54 
     55 static ossl_inline int aes_generic_ocb_setaad(PROV_AES_OCB_CTX *ctx,
     56     const unsigned char *aad,
     57     size_t alen)
     58 {
     59     return CRYPTO_ocb128_aad(&ctx->ocb, aad, alen) == 1;
     60 }
     61 
     62 static ossl_inline int aes_generic_ocb_gettag(PROV_AES_OCB_CTX *ctx,
     63     unsigned char *tag, size_t tlen)
     64 {
     65     return CRYPTO_ocb128_tag(&ctx->ocb, tag, tlen) > 0;
     66 }
     67 
     68 static ossl_inline int aes_generic_ocb_final(PROV_AES_OCB_CTX *ctx)
     69 {
     70     return (CRYPTO_ocb128_finish(&ctx->ocb, ctx->tag, ctx->taglen) == 0);
     71 }
     72 
     73 static ossl_inline void aes_generic_ocb_cleanup(PROV_AES_OCB_CTX *ctx)
     74 {
     75     CRYPTO_ocb128_cleanup(&ctx->ocb);
     76 }
     77 
     78 static ossl_inline int aes_generic_ocb_cipher(PROV_AES_OCB_CTX *ctx,
     79     const unsigned char *in,
     80     unsigned char *out, size_t len)
     81 {
     82     if (ctx->base.enc) {
     83         if (!CRYPTO_ocb128_encrypt(&ctx->ocb, in, out, len))
     84             return 0;
     85     } else {
     86         if (!CRYPTO_ocb128_decrypt(&ctx->ocb, in, out, len))
     87             return 0;
     88     }
     89     return 1;
     90 }
     91 
     92 static ossl_inline int aes_generic_ocb_copy_ctx(PROV_AES_OCB_CTX *dst,
     93     PROV_AES_OCB_CTX *src)
     94 {
     95     return CRYPTO_ocb128_copy_ctx(&dst->ocb, &src->ocb,
     96         &dst->ksenc.ks, &dst->ksdec.ks);
     97 }
     98 
     99 /*-
    100  * Provider dispatch functions
    101  */
    102 static int aes_ocb_init(void *vctx, const unsigned char *key, size_t keylen,
    103     const unsigned char *iv, size_t ivlen,
    104     const OSSL_PARAM params[], int enc)
    105 {
    106     PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
    107 
    108     if (!ossl_prov_is_running())
    109         return 0;
    110 
    111     ctx->aad_buf_len = 0;
    112     ctx->data_buf_len = 0;
    113     ctx->base.enc = enc;
    114 
    115     if (iv != NULL) {
    116         if (ivlen != ctx->base.ivlen) {
    117             /* IV len must be 1 to 15 */
    118             if (ivlen < OCB_MIN_IV_LEN || ivlen > OCB_MAX_IV_LEN) {
    119                 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
    120                 return 0;
    121             }
    122             ctx->base.ivlen = ivlen;
    123         }
    124         if (!ossl_cipher_generic_initiv(&ctx->base, iv, ivlen))
    125             return 0;
    126         ctx->iv_state = IV_STATE_BUFFERED;
    127     }
    128     if (key != NULL) {
    129         if (keylen != ctx->base.keylen) {
    130             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
    131             return 0;
    132         }
    133         if (!ctx->base.hw->init(&ctx->base, key, keylen))
    134             return 0;
    135     }
    136     return aes_ocb_set_ctx_params(ctx, params);
    137 }
    138 
    139 static int aes_ocb_einit(void *vctx, const unsigned char *key, size_t keylen,
    140     const unsigned char *iv, size_t ivlen,
    141     const OSSL_PARAM params[])
    142 {
    143     return aes_ocb_init(vctx, key, keylen, iv, ivlen, params, 1);
    144 }
    145 
    146 static int aes_ocb_dinit(void *vctx, const unsigned char *key, size_t keylen,
    147     const unsigned char *iv, size_t ivlen,
    148     const OSSL_PARAM params[])
    149 {
    150     return aes_ocb_init(vctx, key, keylen, iv, ivlen, params, 0);
    151 }
    152 
    153 /*
    154  * Because of the way OCB works, both the AAD and data are buffered in the
    155  * same way. Only the last block can be a partial block.
    156  */
    157 static int aes_ocb_block_update_internal(PROV_AES_OCB_CTX *ctx,
    158     unsigned char *buf, size_t *bufsz,
    159     unsigned char *out, size_t *outl,
    160     size_t outsize, const unsigned char *in,
    161     size_t inl, OSSL_ocb_cipher_fn ciph)
    162 {
    163     size_t nextblocks;
    164     size_t outlint = 0;
    165 
    166     if (*bufsz != 0)
    167         nextblocks = ossl_cipher_fillblock(buf, bufsz, AES_BLOCK_SIZE, &in, &inl);
    168     else
    169         nextblocks = inl & ~(AES_BLOCK_SIZE - 1);
    170 
    171     if (*bufsz == AES_BLOCK_SIZE) {
    172         if (outsize < AES_BLOCK_SIZE) {
    173             ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
    174             return 0;
    175         }
    176         if (!ciph(ctx, buf, out, AES_BLOCK_SIZE)) {
    177             ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
    178             return 0;
    179         }
    180         *bufsz = 0;
    181         outlint = AES_BLOCK_SIZE;
    182         if (out != NULL)
    183             out += AES_BLOCK_SIZE;
    184     }
    185     if (nextblocks > 0) {
    186         outlint += nextblocks;
    187         if (outsize < outlint) {
    188             ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
    189             return 0;
    190         }
    191         if (!ciph(ctx, in, out, nextblocks)) {
    192             ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
    193             return 0;
    194         }
    195         in += nextblocks;
    196         inl -= nextblocks;
    197     }
    198     if (inl != 0
    199         && !ossl_cipher_trailingdata(buf, bufsz, AES_BLOCK_SIZE, &in, &inl)) {
    200         /* PROVerr already called */
    201         return 0;
    202     }
    203 
    204     *outl = outlint;
    205     return inl == 0;
    206 }
    207 
    208 /* A wrapper function that has the same signature as cipher */
    209 static int cipher_updateaad(PROV_AES_OCB_CTX *ctx, const unsigned char *in,
    210     unsigned char *out, size_t len)
    211 {
    212     return aes_generic_ocb_setaad(ctx, in, len);
    213 }
    214 
    215 static int update_iv(PROV_AES_OCB_CTX *ctx)
    216 {
    217     if (ctx->iv_state == IV_STATE_FINISHED
    218         || ctx->iv_state == IV_STATE_UNINITIALISED)
    219         return 0;
    220     if (ctx->iv_state == IV_STATE_BUFFERED) {
    221         if (!aes_generic_ocb_setiv(ctx, ctx->base.iv, ctx->base.ivlen,
    222                 ctx->taglen))
    223             return 0;
    224         ctx->iv_state = IV_STATE_COPIED;
    225     }
    226     return 1;
    227 }
    228 
    229 static int aes_ocb_block_update(void *vctx, unsigned char *out, size_t *outl,
    230     size_t outsize, const unsigned char *in,
    231     size_t inl)
    232 {
    233     PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
    234     unsigned char *buf;
    235     size_t *buflen;
    236     OSSL_ocb_cipher_fn fn;
    237 
    238     if (!ctx->key_set || !update_iv(ctx))
    239         return 0;
    240 
    241     if (inl == 0) {
    242         *outl = 0;
    243         return 1;
    244     }
    245 
    246     /* Are we dealing with AAD or normal data here? */
    247     if (out == NULL) {
    248         buf = ctx->aad_buf;
    249         buflen = &ctx->aad_buf_len;
    250         fn = cipher_updateaad;
    251     } else {
    252         buf = ctx->data_buf;
    253         buflen = &ctx->data_buf_len;
    254         fn = aes_generic_ocb_cipher;
    255     }
    256     return aes_ocb_block_update_internal(ctx, buf, buflen, out, outl, outsize,
    257         in, inl, fn);
    258 }
    259 
    260 static int aes_ocb_block_final(void *vctx, unsigned char *out, size_t *outl,
    261     size_t outsize)
    262 {
    263     PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
    264 
    265     if (!ossl_prov_is_running())
    266         return 0;
    267 
    268     /* If no block_update has run then the iv still needs to be set */
    269     if (!ctx->key_set || !update_iv(ctx))
    270         return 0;
    271 
    272     /*
    273      * Empty the buffer of any partial block that we might have been provided,
    274      * both for data and AAD
    275      */
    276     *outl = 0;
    277     if (ctx->data_buf_len > 0) {
    278         if (!aes_generic_ocb_cipher(ctx, ctx->data_buf, out, ctx->data_buf_len))
    279             return 0;
    280         *outl = ctx->data_buf_len;
    281         ctx->data_buf_len = 0;
    282     }
    283     if (ctx->aad_buf_len > 0) {
    284         if (!aes_generic_ocb_setaad(ctx, ctx->aad_buf, ctx->aad_buf_len))
    285             return 0;
    286         ctx->aad_buf_len = 0;
    287     }
    288     if (ctx->base.enc) {
    289         /* If encrypting then just get the tag */
    290         if (!aes_generic_ocb_gettag(ctx, ctx->tag, ctx->taglen))
    291             return 0;
    292     } else {
    293         /* If decrypting then verify */
    294         if (ctx->taglen == 0)
    295             return 0;
    296         if (!aes_generic_ocb_final(ctx))
    297             return 0;
    298     }
    299     /* Don't reuse the IV */
    300     ctx->iv_state = IV_STATE_FINISHED;
    301     return 1;
    302 }
    303 
    304 static void *aes_ocb_newctx(void *provctx, size_t kbits, size_t blkbits,
    305     size_t ivbits, unsigned int mode, uint64_t flags)
    306 {
    307     PROV_AES_OCB_CTX *ctx;
    308 
    309     if (!ossl_prov_is_running())
    310         return NULL;
    311 
    312     ctx = OPENSSL_zalloc(sizeof(*ctx));
    313     if (ctx != NULL) {
    314         ossl_cipher_generic_initkey(ctx, kbits, blkbits, ivbits, mode, flags,
    315             ossl_prov_cipher_hw_aes_ocb(kbits), NULL);
    316         ctx->taglen = OCB_DEFAULT_TAG_LEN;
    317     }
    318     return ctx;
    319 }
    320 
    321 static void aes_ocb_freectx(void *vctx)
    322 {
    323     PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
    324 
    325     if (ctx != NULL) {
    326         aes_generic_ocb_cleanup(ctx);
    327         ossl_cipher_generic_reset_ctx((PROV_CIPHER_CTX *)vctx);
    328         OPENSSL_clear_free(ctx, sizeof(*ctx));
    329     }
    330 }
    331 
    332 static void *aes_ocb_dupctx(void *vctx)
    333 {
    334     PROV_AES_OCB_CTX *in = (PROV_AES_OCB_CTX *)vctx;
    335     PROV_AES_OCB_CTX *ret;
    336 
    337     if (!ossl_prov_is_running())
    338         return NULL;
    339 
    340     ret = OPENSSL_malloc(sizeof(*ret));
    341     if (ret == NULL)
    342         return NULL;
    343     *ret = *in;
    344     if (!aes_generic_ocb_copy_ctx(ret, in)) {
    345         OPENSSL_free(ret);
    346         ret = NULL;
    347     }
    348     return ret;
    349 }
    350 
    351 static int aes_ocb_set_ctx_params(void *vctx, const OSSL_PARAM params[])
    352 {
    353     PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
    354     const OSSL_PARAM *p;
    355     size_t sz;
    356 
    357     if (ossl_param_is_empty(params))
    358         return 1;
    359 
    360     p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_AEAD_TAG);
    361     if (p != NULL) {
    362         if (p->data_type != OSSL_PARAM_OCTET_STRING) {
    363             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
    364             return 0;
    365         }
    366         if (p->data == NULL) {
    367             /* Tag len must be 0 to 16 */
    368             if (p->data_size > OCB_MAX_TAG_LEN) {
    369                 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_TAG_LENGTH);
    370                 return 0;
    371             }
    372             ctx->taglen = p->data_size;
    373         } else {
    374             if (ctx->base.enc) {
    375                 ERR_raise(ERR_LIB_PROV, ERR_R_PASSED_INVALID_ARGUMENT);
    376                 return 0;
    377             }
    378             if (p->data_size != ctx->taglen) {
    379                 ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_TAG_LENGTH);
    380                 return 0;
    381             }
    382             memcpy(ctx->tag, p->data, p->data_size);
    383         }
    384     }
    385     p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_AEAD_IVLEN);
    386     if (p != NULL) {
    387         if (!OSSL_PARAM_get_size_t(p, &sz)) {
    388             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
    389             return 0;
    390         }
    391         /* IV len must be 1 to 15 */
    392         if (sz < OCB_MIN_IV_LEN || sz > OCB_MAX_IV_LEN)
    393             return 0;
    394         if (ctx->base.ivlen != sz) {
    395             ctx->base.ivlen = sz;
    396             ctx->iv_state = IV_STATE_UNINITIALISED;
    397         }
    398     }
    399     p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_KEYLEN);
    400     if (p != NULL) {
    401         size_t keylen;
    402 
    403         if (!OSSL_PARAM_get_size_t(p, &keylen)) {
    404             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
    405             return 0;
    406         }
    407         if (ctx->base.keylen != keylen) {
    408             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH);
    409             return 0;
    410         }
    411     }
    412     return 1;
    413 }
    414 
    415 static int aes_ocb_get_ctx_params(void *vctx, OSSL_PARAM params[])
    416 {
    417     PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
    418     OSSL_PARAM *p;
    419 
    420     p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IVLEN);
    421     if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->base.ivlen)) {
    422         ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
    423         return 0;
    424     }
    425     p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_KEYLEN);
    426     if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->base.keylen)) {
    427         ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
    428         return 0;
    429     }
    430     p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_AEAD_TAGLEN);
    431     if (p != NULL) {
    432         if (!OSSL_PARAM_set_size_t(p, ctx->taglen)) {
    433             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
    434             return 0;
    435         }
    436     }
    437 
    438     p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IV);
    439     if (p != NULL) {
    440         if (ctx->base.ivlen > p->data_size) {
    441             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
    442             return 0;
    443         }
    444         if (!OSSL_PARAM_set_octet_string(p, ctx->base.oiv, ctx->base.ivlen)
    445             && !OSSL_PARAM_set_octet_ptr(p, &ctx->base.oiv, ctx->base.ivlen)) {
    446             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
    447             return 0;
    448         }
    449     }
    450     p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_UPDATED_IV);
    451     if (p != NULL) {
    452         if (ctx->base.ivlen > p->data_size) {
    453             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH);
    454             return 0;
    455         }
    456         if (!OSSL_PARAM_set_octet_string(p, ctx->base.iv, ctx->base.ivlen)
    457             && !OSSL_PARAM_set_octet_ptr(p, &ctx->base.iv, ctx->base.ivlen)) {
    458             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER);
    459             return 0;
    460         }
    461     }
    462     p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_AEAD_TAG);
    463     if (p != NULL) {
    464         if (p->data_type != OSSL_PARAM_OCTET_STRING) {
    465             ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER);
    466             return 0;
    467         }
    468         if (!ctx->base.enc || p->data_size != ctx->taglen) {
    469             ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_TAG_LENGTH);
    470             return 0;
    471         }
    472         memcpy(p->data, ctx->tag, ctx->taglen);
    473     }
    474     return 1;
    475 }
    476 
    477 static const OSSL_PARAM cipher_ocb_known_gettable_ctx_params[] = {
    478     OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
    479     OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL),
    480     OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_TAGLEN, NULL),
    481     OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_IV, NULL, 0),
    482     OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_UPDATED_IV, NULL, 0),
    483     OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, NULL, 0),
    484     OSSL_PARAM_END
    485 };
    486 static const OSSL_PARAM *cipher_ocb_gettable_ctx_params(ossl_unused void *cctx,
    487     ossl_unused void *p_ctx)
    488 {
    489     return cipher_ocb_known_gettable_ctx_params;
    490 }
    491 
    492 static const OSSL_PARAM cipher_ocb_known_settable_ctx_params[] = {
    493     OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL),
    494     OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_IVLEN, NULL),
    495     OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TAG, NULL, 0),
    496     OSSL_PARAM_END
    497 };
    498 static const OSSL_PARAM *cipher_ocb_settable_ctx_params(ossl_unused void *cctx,
    499     ossl_unused void *p_ctx)
    500 {
    501     return cipher_ocb_known_settable_ctx_params;
    502 }
    503 
    504 static int aes_ocb_cipher(void *vctx, unsigned char *out, size_t *outl,
    505     size_t outsize, const unsigned char *in, size_t inl)
    506 {
    507     PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
    508 
    509     if (!ossl_prov_is_running())
    510         return 0;
    511 
    512     if (outsize < inl) {
    513         ERR_raise(ERR_LIB_PROV, PROV_R_OUTPUT_BUFFER_TOO_SMALL);
    514         return 0;
    515     }
    516 
    517     if (!aes_generic_ocb_cipher(ctx, in, out, inl)) {
    518         ERR_raise(ERR_LIB_PROV, PROV_R_CIPHER_OPERATION_FAILED);
    519         return 0;
    520     }
    521 
    522     *outl = inl;
    523     return 1;
    524 }
    525 
    526 #define IMPLEMENT_cipher(mode, UCMODE, flags, kbits, blkbits, ivbits)           \
    527     static OSSL_FUNC_cipher_get_params_fn aes_##kbits##_##mode##_get_params;    \
    528     static int aes_##kbits##_##mode##_get_params(OSSL_PARAM params[])           \
    529     {                                                                           \
    530         return ossl_cipher_generic_get_params(params, EVP_CIPH_##UCMODE##_MODE, \
    531             flags, kbits, blkbits, ivbits);                                     \
    532     }                                                                           \
    533     static OSSL_FUNC_cipher_newctx_fn aes_##kbits##_##mode##_newctx;            \
    534     static void *aes_##kbits##_##mode##_newctx(void *provctx)                   \
    535     {                                                                           \
    536         return aes_##mode##_newctx(provctx, kbits, blkbits, ivbits,             \
    537             EVP_CIPH_##UCMODE##_MODE, flags);                                   \
    538     }                                                                           \
    539     const OSSL_DISPATCH ossl_##aes##kbits##mode##_functions[] = {               \
    540         { OSSL_FUNC_CIPHER_NEWCTX,                                              \
    541             (void (*)(void))aes_##kbits##_##mode##_newctx },                    \
    542         { OSSL_FUNC_CIPHER_ENCRYPT_INIT, (void (*)(void))aes_##mode##_einit },  \
    543         { OSSL_FUNC_CIPHER_DECRYPT_INIT, (void (*)(void))aes_##mode##_dinit },  \
    544         { OSSL_FUNC_CIPHER_UPDATE, (void (*)(void))aes_##mode##_block_update }, \
    545         { OSSL_FUNC_CIPHER_FINAL, (void (*)(void))aes_##mode##_block_final },   \
    546         { OSSL_FUNC_CIPHER_CIPHER, (void (*)(void))aes_ocb_cipher },            \
    547         { OSSL_FUNC_CIPHER_FREECTX, (void (*)(void))aes_##mode##_freectx },     \
    548         { OSSL_FUNC_CIPHER_DUPCTX, (void (*)(void))aes_##mode##_dupctx },       \
    549         { OSSL_FUNC_CIPHER_GET_PARAMS,                                          \
    550             (void (*)(void))aes_##kbits##_##mode##_get_params },                \
    551         { OSSL_FUNC_CIPHER_GET_CTX_PARAMS,                                      \
    552             (void (*)(void))aes_##mode##_get_ctx_params },                      \
    553         { OSSL_FUNC_CIPHER_SET_CTX_PARAMS,                                      \
    554             (void (*)(void))aes_##mode##_set_ctx_params },                      \
    555         { OSSL_FUNC_CIPHER_GETTABLE_PARAMS,                                     \
    556             (void (*)(void))ossl_cipher_generic_gettable_params },              \
    557         { OSSL_FUNC_CIPHER_GETTABLE_CTX_PARAMS,                                 \
    558             (void (*)(void))cipher_ocb_gettable_ctx_params },                   \
    559         { OSSL_FUNC_CIPHER_SETTABLE_CTX_PARAMS,                                 \
    560             (void (*)(void))cipher_ocb_settable_ctx_params },                   \
    561         OSSL_DISPATCH_END                                                       \
    562     }
    563 
    564 IMPLEMENT_cipher(ocb, OCB, AES_OCB_FLAGS, 256, 128, OCB_DEFAULT_IV_LEN * 8);
    565 IMPLEMENT_cipher(ocb, OCB, AES_OCB_FLAGS, 192, 128, OCB_DEFAULT_IV_LEN * 8);
    566 IMPLEMENT_cipher(ocb, OCB, AES_OCB_FLAGS, 128, 128, OCB_DEFAULT_IV_LEN * 8);
    567