Home | History | Annotate | Line # | Download | only in hcrypto
evp-pkcs11.c revision 1.3
      1 /*	$NetBSD: evp-pkcs11.c,v 1.3 2019/12/15 22:50:48 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2015-2016, Secure Endpoints Inc.
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  *
     11  * - Redistributions of source code must retain the above copyright
     12  *   notice, this list of conditions and the following disclaimer.
     13  *
     14  * - Redistributions in binary form must reproduce the above copyright
     15  *   notice, this list of conditions and the following disclaimer in
     16  *   the documentation and/or other materials provided with the
     17  *   distribution.
     18  *
     19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     20  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     21  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
     22  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
     23  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
     24  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     25  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     26  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     28  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
     30  * OF THE POSSIBILITY OF SUCH DAMAGE.
     31  */
     32 
     33 /* PKCS#11 provider */
     34 
     35 #include <config.h>
     36 #include <krb5/roken.h>
     37 #include <assert.h>
     38 #ifdef HAVE_DLFCN_H
     39 #include <dlfcn.h>
     40 #ifndef RTLD_LAZY
     41 #define RTLD_LAZY 0
     42 #endif
     43 #ifndef RTLD_LOCAL
     44 #define RTLD_LOCAL 0
     45 #endif
     46 #ifndef RTLD_GROUP
     47 #define RTLD_GROUP 0
     48 #endif
     49 #ifndef RTLD_NODELETE
     50 #define RTLD_NODELETE 0
     51 #endif
     52 #else
     53 #error PKCS11 support requires dlfcn.h
     54 #endif
     55 
     56 #include <krb5/heimbase.h>
     57 
     58 #include <evp.h>
     59 #include <evp-hcrypto.h>
     60 #include <evp-pkcs11.h>
     61 
     62 #include <ref/pkcs11.h>
     63 
     64 #if __sun && !defined(PKCS11_MODULE_PATH)
     65 # ifdef _LP64
     66 # define PKCS11_MODULE_PATH "/usr/lib/64/libpkcs11.so"
     67 # else
     68 # define PKCS11_MODULE_PATH "/usr/lib/libpkcs11.so"
     69 # endif
     70 #elif defined(__linux__)
     71 /*
     72  * XXX We should have an autoconf check for OpenCryptoki and such
     73  * things.  However, there's no AC_CHECK_OBJECT(), and we'd have to
     74  * write one.  Today I'm feeling lazy.  Another possibility would be to
     75  * have a symlink from the libdir we'll install into, and then we could
     76  * dlopen() that on all platforms.
     77  *
     78  * XXX Also, we should pick an appropriate shared object based on 32- vs
     79  * 64-bits.
     80  */
     81 # define PKCS11_MODULE_PATH "/usr/lib/pkcs11/PKCS11_API.so"
     82 #endif
     83 
     84 static CK_FUNCTION_LIST_PTR p11_module;
     85 
     86 static int
     87 p11_cleanup(EVP_CIPHER_CTX *ctx);
     88 
     89 struct pkcs11_cipher_ctx {
     90     CK_SESSION_HANDLE hSession;
     91     CK_OBJECT_HANDLE hSecret;
     92 };
     93 
     94 struct pkcs11_md_ctx {
     95     CK_SESSION_HANDLE hSession;
     96 };
     97 
     98 static void *pkcs11_module_handle;
     99 
    100 static CK_RV
    101 p11_module_load(CK_FUNCTION_LIST_PTR_PTR ppFunctionList)
    102 {
    103     CK_RV rv;
    104     CK_RV (*C_GetFunctionList_fn)(CK_FUNCTION_LIST_PTR_PTR);
    105 
    106 	*ppFunctionList = NULL;
    107 
    108     if (!issuid()) {
    109         char *pkcs11ModulePath = getenv("PKCS11_MODULE_PATH");
    110         if (pkcs11ModulePath != NULL) {
    111 	    pkcs11_module_handle =
    112 		dlopen(pkcs11ModulePath,
    113 		       RTLD_LAZY | RTLD_LOCAL | RTLD_GROUP | RTLD_NODELETE);
    114 	    if (pkcs11_module_handle == NULL)
    115                 fprintf(stderr, "p11_module_load(%s): %s\n", pkcs11ModulePath, dlerror());
    116         }
    117     }
    118 #ifdef PKCS11_MODULE_PATH
    119     if (pkcs11_module_handle == NULL) {
    120 	pkcs11_module_handle =
    121 	    dlopen(PKCS11_MODULE_PATH,
    122 		   RTLD_LAZY | RTLD_LOCAL | RTLD_GROUP | RTLD_NODELETE);
    123 	if (pkcs11_module_handle == NULL)
    124             fprintf(stderr, "p11_module_load(%s): %s\n", PKCS11_MODULE_PATH, dlerror());
    125     }
    126 #endif
    127     if (pkcs11_module_handle == NULL)
    128         return CKR_LIBRARY_LOAD_FAILED;
    129 
    130     C_GetFunctionList_fn = (CK_RV (*)(CK_FUNCTION_LIST_PTR_PTR))
    131 	dlsym(pkcs11_module_handle, "C_GetFunctionList");
    132     if (C_GetFunctionList_fn == NULL) {
    133         dlclose(pkcs11_module_handle);
    134         return CKR_LIBRARY_LOAD_FAILED;
    135     }
    136 
    137     rv = C_GetFunctionList_fn(ppFunctionList);
    138     if (rv != CKR_OK) {
    139         dlclose(pkcs11_module_handle);
    140         return rv;
    141     }
    142 
    143     return CKR_OK;
    144 }
    145 
    146 static void
    147 p11_module_load_once(void *context)
    148 {
    149     p11_module_load((CK_FUNCTION_LIST_PTR_PTR)context);
    150 }
    151 
    152 static CK_RV
    153 p11_module_init(void)
    154 {
    155     static heim_base_once_t once = HEIM_BASE_ONCE_INIT;
    156     CK_RV rv;
    157 
    158     heim_base_once_f(&once, &p11_module, p11_module_load_once);
    159 
    160     if (p11_module == NULL)
    161         return CKR_LIBRARY_LOAD_FAILED;
    162 
    163     /*
    164      * Call C_Initialize() on every call, because it will be invalid after fork().
    165      * Caching the initialization status using a once control and invalidating it
    166      * on fork provided no measurable performance benefit on Solaris 11. Other
    167      * approaches would not be thread-safe or would involve more intrusive code
    168      * changes, such as exposing heimbase's atomics.
    169      */
    170     rv = p11_module->C_Initialize(NULL);
    171     if (rv == CKR_CRYPTOKI_ALREADY_INITIALIZED)
    172         rv = CKR_OK;
    173 
    174     return rv;
    175 }
    176 
    177 static CK_RV
    178 p11_session_init(CK_MECHANISM_TYPE mechanismType,
    179                  CK_SESSION_HANDLE_PTR phSession,
    180                  CK_FLAGS *pFlags)
    181 {
    182     CK_RV rv;
    183     CK_ULONG i, ulSlotCount = 0;
    184     CK_SLOT_ID_PTR pSlotList = NULL;
    185     CK_MECHANISM_INFO info;
    186 
    187     if (phSession != NULL)
    188         *phSession = CK_INVALID_HANDLE;
    189 
    190     *pFlags = 0;
    191 
    192     rv = p11_module_init();
    193     if (rv != CKR_OK)
    194         goto cleanup;
    195 
    196     assert(p11_module != NULL);
    197 
    198     rv = p11_module->C_GetSlotList(CK_FALSE, NULL, &ulSlotCount);
    199     if (rv != CKR_OK)
    200         goto cleanup;
    201 
    202     pSlotList = (CK_SLOT_ID_PTR)calloc(ulSlotCount, sizeof(CK_SLOT_ID));
    203     if (pSlotList == NULL) {
    204         rv = CKR_HOST_MEMORY;
    205         goto cleanup;
    206     }
    207 
    208     rv = p11_module->C_GetSlotList(CK_FALSE, pSlotList, &ulSlotCount);
    209     if (rv != CKR_OK)
    210         goto cleanup;
    211 
    212     /*
    213      * Note that this approach of using the first slot that supports the desired
    214      * mechanism may not always be what the user wants (for example it may prefer
    215      * software to hardware crypto). We're going to assume that this code will be
    216      * principally used on Solaris (which has a meta-slot provider that sorts by
    217      * hardware first) or in situations where the user can configure the slots in
    218      * order of provider preference. In the future we should make this configurable.
    219      */
    220     for (i = 0; i < ulSlotCount; i++) {
    221         rv = p11_module->C_GetMechanismInfo(pSlotList[i], mechanismType, &info);
    222         if (rv == CKR_OK) {
    223 	    *pFlags = info.flags;
    224 	    break;
    225 	}
    226     }
    227 
    228     if (i == ulSlotCount) {
    229         rv = CKR_MECHANISM_INVALID;
    230         goto cleanup;
    231     }
    232 
    233     if (phSession != NULL) {
    234         rv = p11_module->C_OpenSession(pSlotList[i], CKF_SERIAL_SESSION, NULL, NULL, phSession);
    235         if (rv != CKR_OK)
    236             goto cleanup;
    237     }
    238 
    239 cleanup:
    240     free(pSlotList);
    241 
    242     return rv;
    243 }
    244 
    245 static int
    246 p11_mech_available_p(CK_MECHANISM_TYPE mechanismType, CK_FLAGS reqFlags)
    247 {
    248     CK_RV rv;
    249     CK_FLAGS flags;
    250 
    251     rv = p11_session_init(mechanismType, NULL, &flags);
    252     if (rv != CKR_OK)
    253 	return 0;
    254 
    255     return (flags & reqFlags) == reqFlags;
    256 }
    257 
    258 static CK_KEY_TYPE
    259 p11_key_type_for_mech(CK_MECHANISM_TYPE mechanismType)
    260 {
    261     CK_KEY_TYPE keyType = 0;
    262 
    263     switch (mechanismType) {
    264     case CKM_RC2_CBC:
    265         keyType = CKK_RC2;
    266         break;
    267     case CKM_RC4:
    268         keyType = CKK_RC4;
    269         break;
    270     case CKM_DES_CBC:
    271         keyType = CKK_DES;
    272         break;
    273     case CKM_DES3_CBC:
    274         keyType = CKK_DES3;
    275         break;
    276     case CKM_AES_CBC:
    277     case CKM_AES_CFB8:
    278         keyType = CKK_AES;
    279         break;
    280     case CKM_CAMELLIA_CBC:
    281         keyType = CKK_CAMELLIA;
    282         break;
    283     default:
    284         assert(0 && "Unknown PKCS#11 mechanism type");
    285         break;
    286     }
    287 
    288     return keyType;
    289 }
    290 
    291 static int
    292 p11_key_init(EVP_CIPHER_CTX *ctx,
    293              const unsigned char *key,
    294              const unsigned char *iv,
    295              int encp)
    296 {
    297     CK_RV rv;
    298     CK_BBOOL bFalse = CK_FALSE;
    299     CK_BBOOL bTrue = CK_TRUE;
    300     CK_MECHANISM_TYPE mechanismType = (CK_MECHANISM_TYPE)ctx->cipher->app_data;
    301     CK_KEY_TYPE keyType = p11_key_type_for_mech(mechanismType);
    302     CK_OBJECT_CLASS objectClass = CKO_SECRET_KEY;
    303     CK_ATTRIBUTE_TYPE op = encp ? CKA_ENCRYPT : CKA_DECRYPT;
    304     CK_ATTRIBUTE attributes[] = {
    305         { CKA_EXTRACTABLE,      &bFalse,        sizeof(bFalse)          },
    306         { CKA_CLASS,            &objectClass,   sizeof(objectClass)     },
    307         { CKA_KEY_TYPE,         &keyType,       sizeof(keyType)         },
    308         { CKA_TOKEN,            &bFalse,        sizeof(bFalse)          },
    309         { CKA_PRIVATE,          &bFalse,        sizeof(bFalse)          },
    310         { CKA_SENSITIVE,        &bTrue,         sizeof(bTrue)           },
    311         { CKA_VALUE,            (void *)key,    ctx->key_len            },
    312         { op,                   &bTrue,         sizeof(bTrue)           }
    313     };
    314     CK_MECHANISM mechanism = {
    315         mechanismType,
    316         ctx->cipher->iv_len ? ctx->iv : NULL,
    317         ctx->cipher->iv_len
    318     };
    319     struct pkcs11_cipher_ctx *p11ctx = (struct pkcs11_cipher_ctx *)ctx->cipher_data;
    320     CK_FLAGS flags;
    321 
    322     rv = CKR_OK;
    323 
    324     if (p11ctx->hSession != CK_INVALID_HANDLE && key != NULL)
    325         p11_cleanup(ctx); /* refresh session with new key */
    326 
    327     if (p11ctx->hSession == CK_INVALID_HANDLE) {
    328         rv = p11_session_init(mechanismType, &p11ctx->hSession, &flags);
    329         if (rv != CKR_OK)
    330             goto cleanup;
    331 
    332 	if ((flags & (CKF_ENCRYPT|CKF_DECRYPT)) != (CKF_ENCRYPT|CKF_DECRYPT)) {
    333 	    rv = CKR_MECHANISM_INVALID;
    334 	    goto cleanup;
    335 	}
    336     }
    337 
    338     if (key != NULL) {
    339         assert(p11_module != NULL);
    340         assert(p11ctx->hSecret == CK_INVALID_HANDLE);
    341 
    342         rv = p11_module->C_CreateObject(p11ctx->hSession, attributes,
    343                                         sizeof(attributes) / sizeof(attributes[0]),
    344                                         &p11ctx->hSecret);
    345         if (rv != CKR_OK)
    346             goto cleanup;
    347     }
    348 
    349     if (p11ctx->hSecret != CK_INVALID_HANDLE) {
    350         if (op == CKA_ENCRYPT)
    351             rv = p11_module->C_EncryptInit(p11ctx->hSession, &mechanism, p11ctx->hSecret);
    352         else
    353             rv = p11_module->C_DecryptInit(p11ctx->hSession, &mechanism, p11ctx->hSecret);
    354         if (rv != CKR_OK)
    355             goto cleanup;
    356     }
    357 
    358 cleanup:
    359     if (rv != CKR_OK)
    360         p11_cleanup(ctx);
    361 
    362     return rv == CKR_OK;
    363 }
    364 
    365 static int
    366 p11_do_cipher(EVP_CIPHER_CTX *ctx,
    367               unsigned char *out,
    368               const unsigned char *in,
    369               unsigned int size)
    370 {
    371     struct pkcs11_cipher_ctx *p11ctx = (struct pkcs11_cipher_ctx *)ctx->cipher_data;
    372     CK_RV rv;
    373     CK_ULONG ulCipherTextLen = size;
    374 
    375     assert(p11_module != NULL);
    376     assert(EVP_CIPHER_CTX_mode(ctx) == EVP_CIPH_STREAM_CIPHER ||
    377            (size % ctx->cipher->block_size) == 0);
    378 
    379     if (ctx->encrypt)
    380         rv = p11_module->C_EncryptUpdate(p11ctx->hSession, (unsigned char *)in, size, out, &ulCipherTextLen);
    381     else
    382         rv = p11_module->C_DecryptUpdate(p11ctx->hSession, (unsigned char *)in, size, out, &ulCipherTextLen);
    383 
    384     return rv == CKR_OK;
    385 }
    386 
    387 static int
    388 p11_cleanup(EVP_CIPHER_CTX *ctx)
    389 {
    390     struct pkcs11_cipher_ctx *p11ctx = (struct pkcs11_cipher_ctx *)ctx->cipher_data;
    391 
    392     if (p11ctx->hSecret != CK_INVALID_HANDLE)  {
    393         p11_module->C_DestroyObject(p11ctx->hSession, p11ctx->hSecret);
    394         p11ctx->hSecret = CK_INVALID_HANDLE;
    395     }
    396     if (p11ctx->hSession != CK_INVALID_HANDLE) {
    397         p11_module->C_CloseSession(p11ctx->hSession);
    398         p11ctx->hSession = CK_INVALID_HANDLE;
    399     }
    400 
    401     return 1;
    402 }
    403 
    404 static int
    405 p11_md_cleanup(EVP_MD_CTX *ctx);
    406 
    407 static int
    408 p11_md_hash_init(CK_MECHANISM_TYPE mechanismType, EVP_MD_CTX *ctx)
    409 {
    410     struct pkcs11_md_ctx *p11ctx = (struct pkcs11_md_ctx *)ctx;
    411     CK_RV rv;
    412     CK_FLAGS flags;
    413     CK_MECHANISM mechanism = { mechanismType, NULL, 0 };
    414 
    415     if (p11ctx->hSession != CK_INVALID_HANDLE)
    416         p11_md_cleanup(ctx);
    417 
    418     rv = p11_session_init(mechanismType, &p11ctx->hSession, &flags);
    419     if (rv != CKR_OK)
    420 	goto cleanup;
    421 
    422     if ((flags & CKF_DIGEST) != CKF_DIGEST) {
    423 	rv = CKR_MECHANISM_INVALID;
    424 	goto cleanup;
    425     }
    426 
    427     assert(p11_module != NULL);
    428 
    429     rv = p11_module->C_DigestInit(p11ctx->hSession, &mechanism);
    430 
    431   cleanup:
    432     return rv == CKR_OK;
    433 }
    434 
    435 static int
    436 p11_md_update(EVP_MD_CTX *ctx, const void *data, size_t length)
    437 {
    438     struct pkcs11_md_ctx *p11ctx = (struct pkcs11_md_ctx *)ctx;
    439     CK_RV rv;
    440 
    441     assert(p11_module != NULL);
    442     assert(data != NULL || length == 0);
    443 
    444     rv = p11_module->C_DigestUpdate(p11ctx->hSession,
    445                                     data ? (CK_BYTE_PTR)data : (CK_BYTE_PTR)"",
    446                                     length);
    447 
    448     return rv == CKR_OK;
    449 }
    450 
    451 static int
    452 p11_md_final(void *digest, EVP_MD_CTX *ctx)
    453 {
    454     struct pkcs11_md_ctx *p11ctx = (struct pkcs11_md_ctx *)ctx;
    455     CK_RV rv;
    456     CK_ULONG digestLen = 0;
    457 
    458     assert(p11_module != NULL);
    459 
    460     rv = p11_module->C_DigestFinal(p11ctx->hSession, NULL, &digestLen);
    461     if (rv == CKR_OK)
    462         rv = p11_module->C_DigestFinal(p11ctx->hSession, digest, &digestLen);
    463 
    464     return rv == CKR_OK;
    465 }
    466 
    467 static int
    468 p11_md_cleanup(EVP_MD_CTX *ctx)
    469 {
    470     struct pkcs11_md_ctx *p11ctx = (struct pkcs11_md_ctx *)ctx;
    471     CK_RV rv;
    472 
    473     assert(p11_module != NULL);
    474 
    475     rv = p11_module->C_CloseSession(p11ctx->hSession);
    476     if (rv == CKR_OK)
    477         p11ctx->hSession = CK_INVALID_HANDLE;
    478 
    479     return rv == CKR_OK;
    480 }
    481 
    482 #define PKCS11_CIPHER_ALGORITHM(name, mechanismType, block_size,        \
    483                                 key_len, iv_len, flags)                 \
    484                                                                         \
    485     static EVP_CIPHER                                                   \
    486     pkcs11_##name = {                                                   \
    487         0,                                                              \
    488         block_size,                                                     \
    489         key_len,                                                        \
    490         iv_len,                                                         \
    491         (flags) | EVP_CIPH_ALWAYS_CALL_INIT,                            \
    492         p11_key_init,                                                   \
    493         p11_do_cipher,                                                  \
    494         p11_cleanup,                                                    \
    495         sizeof(struct pkcs11_cipher_ctx),                               \
    496         NULL,                                                           \
    497         NULL,                                                           \
    498         NULL,                                                           \
    499         (void *)mechanismType                                           \
    500     };                                                                  \
    501                                                                         \
    502     const EVP_CIPHER *                                                  \
    503     hc_EVP_pkcs11_##name(void)                                          \
    504     {                                                                   \
    505         if (p11_mech_available_p(mechanismType, CKF_ENCRYPT|CKF_DECRYPT)) \
    506             return &pkcs11_##name;                                      \
    507         else                                                            \
    508             return NULL;                                                \
    509     }                                                                   \
    510                                                                         \
    511     static void                                                         \
    512     pkcs11_hcrypto_##name##_init_once(void *context)                    \
    513     {                                                                   \
    514         const EVP_CIPHER *cipher;                                       \
    515                                                                         \
    516         cipher = hc_EVP_pkcs11_ ##name();                               \
    517         if (cipher == NULL && HCRYPTO_FALLBACK)                         \
    518             cipher = hc_EVP_hcrypto_ ##name();                          \
    519                                                                         \
    520         *((const EVP_CIPHER **)context) = cipher;                       \
    521     }                                                                   \
    522                                                                         \
    523     const EVP_CIPHER *                                                  \
    524     hc_EVP_pkcs11_hcrypto_##name(void)                                  \
    525     {                                                                   \
    526         static const EVP_CIPHER *__cipher;                              \
    527         static heim_base_once_t __init = HEIM_BASE_ONCE_INIT;           \
    528                                                                         \
    529         heim_base_once_f(&__init, &__cipher,                            \
    530                          pkcs11_hcrypto_##name##_init_once);            \
    531                                                                         \
    532         return __cipher;                                                \
    533     }
    534 
    535 #define PKCS11_MD_ALGORITHM(name, mechanismType, hash_size, block_size) \
    536                                                                         \
    537     static int p11_##name##_init(EVP_MD_CTX *ctx)                       \
    538     {                                                                   \
    539         return p11_md_hash_init(mechanismType, ctx);                    \
    540     }                                                                   \
    541                                                                         \
    542     const EVP_MD *                                                      \
    543     hc_EVP_pkcs11_##name(void)                                          \
    544     {                                                                   \
    545         static struct hc_evp_md name = {                                \
    546             hash_size,                                                  \
    547             block_size,                                                 \
    548             sizeof(struct pkcs11_md_ctx),                               \
    549             p11_##name##_init,                                          \
    550             p11_md_update,                                              \
    551             p11_md_final,                                               \
    552             p11_md_cleanup                                              \
    553         };                                                              \
    554                                                                         \
    555         if (p11_mech_available_p(mechanismType, CKF_DIGEST))            \
    556             return &name;                                               \
    557         else                                                            \
    558             return NULL;                                                \
    559     }                                                                   \
    560                                                                         \
    561     static void                                                         \
    562     pkcs11_hcrypto_##name##_init_once(void *context)                    \
    563     {                                                                   \
    564         const EVP_MD *md;                                               \
    565                                                                         \
    566         md = hc_EVP_pkcs11_ ##name();                                   \
    567         if (md == NULL && HCRYPTO_FALLBACK)                             \
    568             md = hc_EVP_hcrypto_ ##name();                              \
    569                                                                         \
    570         *((const EVP_MD **)context) = md;                               \
    571     }                                                                   \
    572                                                                         \
    573     const EVP_MD *                                                      \
    574     hc_EVP_pkcs11_hcrypto_##name(void)                                  \
    575     {                                                                   \
    576         static const EVP_MD *__md;                                      \
    577         static heim_base_once_t __init = HEIM_BASE_ONCE_INIT;           \
    578                                                                         \
    579         heim_base_once_f(&__init, &__md,                                \
    580                          pkcs11_hcrypto_##name##_init_once);            \
    581                                                                         \
    582         return __md;                                                    \
    583     }
    584 
    585 #define PKCS11_MD_ALGORITHM_UNAVAILABLE(name)                           \
    586                                                                         \
    587     const EVP_MD *                                                      \
    588     hc_EVP_pkcs11_##name(void)                                          \
    589     {                                                                   \
    590         return NULL;                                                    \
    591     }                                                                   \
    592                                                                         \
    593     const EVP_MD *                                                      \
    594     hc_EVP_pkcs11_hcrypto_##name(void)                                  \
    595     {                                                                   \
    596         return hc_EVP_hcrypto_ ##name();                                \
    597     }
    598 
    599 /**
    600  * The triple DES cipher type (PKCS#11 provider)
    601  *
    602  * @return the DES-EDE3-CBC EVP_CIPHER pointer.
    603  *
    604  * @ingroup hcrypto_evp
    605  */
    606 
    607 PKCS11_CIPHER_ALGORITHM(des_ede3_cbc,
    608                         CKM_DES3_CBC,
    609                         8,
    610                         24,
    611                         8,
    612                         EVP_CIPH_CBC_MODE)
    613 
    614 /**
    615  * The DES cipher type (PKCS#11 provider)
    616  *
    617  * @return the DES-CBC EVP_CIPHER pointer.
    618  *
    619  * @ingroup hcrypto_evp
    620  */
    621 
    622 PKCS11_CIPHER_ALGORITHM(des_cbc,
    623                         CKM_DES_CBC,
    624                         8,
    625                         8,
    626                         8,
    627                         EVP_CIPH_CBC_MODE)
    628 
    629 /**
    630  * The AES-128 cipher type (PKCS#11 provider)
    631  *
    632  * @return the AES-128-CBC EVP_CIPHER pointer.
    633  *
    634  * @ingroup hcrypto_evp
    635  */
    636 
    637 PKCS11_CIPHER_ALGORITHM(aes_128_cbc,
    638                         CKM_AES_CBC,
    639                         16,
    640                         16,
    641                         16,
    642                         EVP_CIPH_CBC_MODE)
    643 
    644 /**
    645  * The AES-192 cipher type (PKCS#11 provider)
    646  *
    647  * @return the AES-192-CBC EVP_CIPHER pointer.
    648  *
    649  * @ingroup hcrypto_evp
    650  */
    651 
    652 PKCS11_CIPHER_ALGORITHM(aes_192_cbc,
    653                         CKM_AES_CBC,
    654                         16,
    655                         24,
    656                         16,
    657                         EVP_CIPH_CBC_MODE)
    658 
    659 /**
    660  * The AES-256 cipher type (PKCS#11 provider)
    661  *
    662  * @return the AES-256-CBC EVP_CIPHER pointer.
    663  *
    664  * @ingroup hcrypto_evp
    665  */
    666 
    667 PKCS11_CIPHER_ALGORITHM(aes_256_cbc,
    668                         CKM_AES_CBC,
    669                         16,
    670                         32,
    671                         16,
    672                         EVP_CIPH_CBC_MODE)
    673 
    674 /**
    675  * The AES-128 CFB8 cipher type (PKCS#11 provider)
    676  *
    677  * @return the AES-128-CFB8 EVP_CIPHER pointer.
    678  *
    679  * @ingroup hcrypto_evp
    680  */
    681 
    682 PKCS11_CIPHER_ALGORITHM(aes_128_cfb8,
    683                         CKM_AES_CFB8,
    684                         16,
    685                         16,
    686                         16,
    687                         EVP_CIPH_CFB8_MODE)
    688 
    689 /**
    690  * The AES-192 CFB8 cipher type (PKCS#11 provider)
    691  *
    692  * @return the AES-192-CFB8 EVP_CIPHER pointer.
    693  *
    694  * @ingroup hcrypto_evp
    695  */
    696 
    697 PKCS11_CIPHER_ALGORITHM(aes_192_cfb8,
    698                         CKM_AES_CFB8,
    699                         16,
    700                         24,
    701                         16,
    702                         EVP_CIPH_CFB8_MODE)
    703 
    704 /**
    705  * The AES-256 CFB8 cipher type (PKCS#11 provider)
    706  *
    707  * @return the AES-256-CFB8 EVP_CIPHER pointer.
    708  *
    709  * @ingroup hcrypto_evp
    710  */
    711 
    712 PKCS11_CIPHER_ALGORITHM(aes_256_cfb8,
    713                         CKM_AES_CFB8,
    714                         16,
    715                         32,
    716                         16,
    717                         EVP_CIPH_CFB8_MODE)
    718 
    719 /**
    720  * The RC2 cipher type - PKCS#11
    721  *
    722  * @return the RC2 EVP_CIPHER pointer.
    723  *
    724  * @ingroup hcrypto_evp
    725  */
    726 
    727 PKCS11_CIPHER_ALGORITHM(rc2_cbc,
    728                         CKM_RC2_CBC,
    729                         8,
    730                         16,
    731                         8,
    732                         EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH)
    733 
    734 /**
    735  * The RC2-40 cipher type - PKCS#11
    736  *
    737  * @return the RC2-40 EVP_CIPHER pointer.
    738  *
    739  * @ingroup hcrypto_evp
    740  */
    741 
    742 PKCS11_CIPHER_ALGORITHM(rc2_40_cbc,
    743                         CKM_RC2_CBC,
    744                         8,
    745                         5,
    746                         8,
    747                         EVP_CIPH_CBC_MODE)
    748 
    749 /**
    750  * The RC2-64 cipher type - PKCS#11
    751  *
    752  * @return the RC2-64 EVP_CIPHER pointer.
    753  *
    754  * @ingroup hcrypto_evp
    755  */
    756 
    757 PKCS11_CIPHER_ALGORITHM(rc2_64_cbc,
    758                         CKM_RC2_CBC,
    759                         8,
    760                         8,
    761                         8,
    762                         EVP_CIPH_CBC_MODE)
    763 
    764 /**
    765  * The Camellia-128 cipher type - PKCS#11
    766  *
    767  * @return the Camellia-128 EVP_CIPHER pointer.
    768  *
    769  * @ingroup hcrypto_evp
    770  */
    771 
    772 PKCS11_CIPHER_ALGORITHM(camellia_128_cbc,
    773                         CKM_CAMELLIA_CBC,
    774                         16,
    775                         16,
    776                         16,
    777                         EVP_CIPH_CBC_MODE)
    778 
    779 /**
    780  * The Camellia-198 cipher type - PKCS#11
    781  *
    782  * @return the Camellia-198 EVP_CIPHER pointer.
    783  *
    784  * @ingroup hcrypto_evp
    785  */
    786 
    787 PKCS11_CIPHER_ALGORITHM(camellia_192_cbc,
    788                         CKM_CAMELLIA_CBC,
    789                         16,
    790                         24,
    791                         16,
    792                         EVP_CIPH_CBC_MODE)
    793 
    794 /**
    795  * The Camellia-256 cipher type - PKCS#11
    796  *
    797  * @return the Camellia-256 EVP_CIPHER pointer.
    798  *
    799  * @ingroup hcrypto_evp
    800  */
    801 
    802 PKCS11_CIPHER_ALGORITHM(camellia_256_cbc,
    803                         CKM_CAMELLIA_CBC,
    804                         16,
    805                         32,
    806                         16,
    807                         EVP_CIPH_CBC_MODE)
    808 
    809 /**
    810  * The RC4 cipher type (PKCS#11 provider)
    811  *
    812  * @return the RC4 EVP_CIPHER pointer.
    813  *
    814  * @ingroup hcrypto_evp
    815  */
    816 
    817 PKCS11_CIPHER_ALGORITHM(rc4,
    818                         CKM_RC4,
    819                         1,
    820                         16,
    821                         0,
    822                         EVP_CIPH_STREAM_CIPHER | EVP_CIPH_VARIABLE_LENGTH)
    823 
    824 /**
    825  * The RC4-40 cipher type (PKCS#11 provider)
    826  *
    827  * @return the RC4 EVP_CIPHER pointer.
    828  *
    829  * @ingroup hcrypto_evp
    830  */
    831 
    832 PKCS11_CIPHER_ALGORITHM(rc4_40,
    833                         CKM_RC4,
    834                         1,
    835                         5,
    836                         0,
    837                         EVP_CIPH_STREAM_CIPHER | EVP_CIPH_VARIABLE_LENGTH)
    838 
    839 PKCS11_MD_ALGORITHM(md2,    CKM_MD2,    16, 16)
    840 #ifdef CKM_MD4 /* non-standard extension */
    841 PKCS11_MD_ALGORITHM(md4,    CKM_MD4,    16, 64)
    842 #else
    843 PKCS11_MD_ALGORITHM_UNAVAILABLE(md4)
    844 #endif
    845 PKCS11_MD_ALGORITHM(md5,    CKM_MD5,    16, 64)
    846 PKCS11_MD_ALGORITHM(sha1,   CKM_SHA_1,  20, 64)
    847 PKCS11_MD_ALGORITHM(sha256, CKM_SHA256, 32, 64)
    848 PKCS11_MD_ALGORITHM(sha384, CKM_SHA384, 48, 128)
    849 PKCS11_MD_ALGORITHM(sha512, CKM_SHA512, 64, 128)
    850