Home | History | Annotate | Line # | Download | only in crypto
      1 /*
      2  * Copyright 2019-2025 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 #include <assert.h>
     11 #include <openssl/core.h>
     12 #include <openssl/core_dispatch.h>
     13 #include <openssl/core_names.h>
     14 #include <openssl/provider.h>
     15 #include <openssl/params.h>
     16 #include <openssl/opensslv.h>
     17 #include "crypto/cryptlib.h"
     18 #ifndef FIPS_MODULE
     19 #include "crypto/decoder.h" /* ossl_decoder_store_cache_flush */
     20 #include "crypto/encoder.h" /* ossl_encoder_store_cache_flush */
     21 #include "crypto/store.h" /* ossl_store_loader_store_cache_flush */
     22 #endif
     23 #include "crypto/evp.h" /* evp_method_store_cache_flush */
     24 #include "crypto/rand.h"
     25 #include "internal/nelem.h"
     26 #include "internal/thread_once.h"
     27 #include "internal/provider.h"
     28 #include "internal/refcount.h"
     29 #include "internal/bio.h"
     30 #include "internal/core.h"
     31 #include "provider_local.h"
     32 #include "crypto/context.h"
     33 #ifndef FIPS_MODULE
     34 #include <openssl/self_test.h>
     35 #include <openssl/indicator.h>
     36 #endif
     37 
     38 /*
     39  * This file defines and uses a number of different structures:
     40  *
     41  * OSSL_PROVIDER (provider_st): Used to represent all information related to a
     42  * single instance of a provider.
     43  *
     44  * provider_store_st: Holds information about the collection of providers that
     45  * are available within the current library context (OSSL_LIB_CTX). It also
     46  * holds configuration information about providers that could be loaded at some
     47  * future point.
     48  *
     49  * OSSL_PROVIDER_CHILD_CB: An instance of this structure holds the callbacks
     50  * that have been registered for a child library context and the associated
     51  * provider that registered those callbacks.
     52  *
     53  * Where a child library context exists then it has its own instance of the
     54  * provider store. Each provider that exists in the parent provider store, has
     55  * an associated child provider in the child library context's provider store.
     56  * As providers get activated or deactivated this needs to be mirrored in the
     57  * associated child providers.
     58  *
     59  * LOCKING
     60  * =======
     61  *
     62  * There are a number of different locks used in this file and it is important
     63  * to understand how they should be used in order to avoid deadlocks.
     64  *
     65  * Fields within a structure can often be "write once" on creation, and then
     66  * "read many". Creation of a structure is done by a single thread, and
     67  * therefore no lock is required for the "write once/read many" fields. It is
     68  * safe for multiple threads to read these fields without a lock, because they
     69  * will never be changed.
     70  *
     71  * However some fields may be changed after a structure has been created and
     72  * shared between multiple threads. Where this is the case a lock is required.
     73  *
     74  * The locks available are:
     75  *
     76  * The provider flag_lock: Used to control updates to the various provider
     77  * "flags" (flag_initialized and flag_activated).
     78  *
     79  * The provider activatecnt_lock: Used to control updates to the provider
     80  * activatecnt value.
     81  *
     82  * The provider optbits_lock: Used to control access to the provider's
     83  * operation_bits and operation_bits_sz fields.
     84  *
     85  * The store default_path_lock: Used to control access to the provider store's
     86  * default search path value (default_path)
     87  *
     88  * The store lock: Used to control the stack of provider's held within the
     89  * provider store, as well as the stack of registered child provider callbacks.
     90  *
     91  * As a general rule-of-thumb it is best to:
     92  *  - keep the scope of the code that is protected by a lock to the absolute
     93  *    minimum possible;
     94  *  - try to keep the scope of the lock to within a single function (i.e. avoid
     95  *    making calls to other functions while holding a lock);
     96  *  - try to only ever hold one lock at a time.
     97  *
     98  * Unfortunately, it is not always possible to stick to the above guidelines.
     99  * Where they are not adhered to there is always a danger of inadvertently
    100  * introducing the possibility of deadlock. The following rules MUST be adhered
    101  * to in order to avoid that:
    102  *  - Holding multiple locks at the same time is only allowed for the
    103  *    provider store lock, the provider activatecnt_lock and the provider flag_lock.
    104  *  - When holding multiple locks they must be acquired in the following order of
    105  *    precedence:
    106  *        1) provider store lock
    107  *        2) provider flag_lock
    108  *        3) provider activatecnt_lock
    109  *  - When releasing locks they must be released in the reverse order to which
    110  *    they were acquired
    111  *  - No locks may be held when making an upcall. NOTE: Some common functions
    112  *    can make upcalls as part of their normal operation. If you need to call
    113  *    some other function while holding a lock make sure you know whether it
    114  *    will make any upcalls or not. For example ossl_provider_up_ref() can call
    115  *    ossl_provider_up_ref_parent() which can call the c_prov_up_ref() upcall.
    116  *  - It is permissible to hold the store and flag locks when calling child
    117  *    provider callbacks. No other locks may be held during such callbacks.
    118  */
    119 
    120 static OSSL_PROVIDER *provider_new(const char *name,
    121     OSSL_provider_init_fn *init_function,
    122     STACK_OF(INFOPAIR) *parameters);
    123 
    124 /*-
    125  * Provider Object structure
    126  * =========================
    127  */
    128 
    129 #ifndef FIPS_MODULE
    130 typedef struct {
    131     OSSL_PROVIDER *prov;
    132     int (*create_cb)(const OSSL_CORE_HANDLE *provider, void *cbdata);
    133     int (*remove_cb)(const OSSL_CORE_HANDLE *provider, void *cbdata);
    134     int (*global_props_cb)(const char *props, void *cbdata);
    135     void *cbdata;
    136 } OSSL_PROVIDER_CHILD_CB;
    137 DEFINE_STACK_OF(OSSL_PROVIDER_CHILD_CB)
    138 #endif
    139 
    140 struct provider_store_st; /* Forward declaration */
    141 
    142 struct ossl_provider_st {
    143     /* Flag bits */
    144     unsigned int flag_initialized : 1;
    145     unsigned int flag_activated : 1;
    146 
    147     /* Getting and setting the flags require synchronization */
    148     CRYPTO_RWLOCK *flag_lock;
    149 
    150     /* OpenSSL library side data */
    151     CRYPTO_REF_COUNT refcnt;
    152     CRYPTO_RWLOCK *activatecnt_lock; /* For the activatecnt counter */
    153     int activatecnt;
    154     char *name;
    155     char *path;
    156     DSO *module;
    157     OSSL_provider_init_fn *init_function;
    158     STACK_OF(INFOPAIR) *parameters;
    159     OSSL_LIB_CTX *libctx; /* The library context this instance is in */
    160     struct provider_store_st *store; /* The store this instance belongs to */
    161 #ifndef FIPS_MODULE
    162     /*
    163      * In the FIPS module inner provider, this isn't needed, since the
    164      * error upcalls are always direct calls to the outer provider.
    165      */
    166     int error_lib; /* ERR library number, one for each provider */
    167 #ifndef OPENSSL_NO_ERR
    168     ERR_STRING_DATA *error_strings; /* Copy of what the provider gives us */
    169 #endif
    170 #endif
    171 
    172     /* Provider side functions */
    173     OSSL_FUNC_provider_teardown_fn *teardown;
    174     OSSL_FUNC_provider_gettable_params_fn *gettable_params;
    175     OSSL_FUNC_provider_get_params_fn *get_params;
    176     OSSL_FUNC_provider_get_capabilities_fn *get_capabilities;
    177     OSSL_FUNC_provider_self_test_fn *self_test;
    178     OSSL_FUNC_provider_random_bytes_fn *random_bytes;
    179     OSSL_FUNC_provider_query_operation_fn *query_operation;
    180     OSSL_FUNC_provider_unquery_operation_fn *unquery_operation;
    181 
    182     /*
    183      * Cache of bit to indicate of query_operation() has been called on
    184      * a specific operation or not.
    185      */
    186     unsigned char *operation_bits;
    187     size_t operation_bits_sz;
    188     CRYPTO_RWLOCK *opbits_lock;
    189 
    190 #ifndef FIPS_MODULE
    191     /* Whether this provider is the child of some other provider */
    192     const OSSL_CORE_HANDLE *handle;
    193     unsigned int ischild : 1;
    194 #endif
    195 
    196     /* Provider side data */
    197     void *provctx;
    198     const OSSL_DISPATCH *dispatch;
    199 };
    200 DEFINE_STACK_OF(OSSL_PROVIDER)
    201 
    202 static int ossl_provider_cmp(const OSSL_PROVIDER *const *a,
    203     const OSSL_PROVIDER *const *b)
    204 {
    205     return strcmp((*a)->name, (*b)->name);
    206 }
    207 
    208 /*-
    209  * Provider Object store
    210  * =====================
    211  *
    212  * The Provider Object store is a library context object, and therefore needs
    213  * an index.
    214  */
    215 
    216 struct provider_store_st {
    217     OSSL_LIB_CTX *libctx;
    218     STACK_OF(OSSL_PROVIDER) *providers;
    219     STACK_OF(OSSL_PROVIDER_CHILD_CB) *child_cbs;
    220     CRYPTO_RWLOCK *default_path_lock;
    221     CRYPTO_RWLOCK *lock;
    222     char *default_path;
    223     OSSL_PROVIDER_INFO *provinfo;
    224     size_t numprovinfo;
    225     size_t provinfosz;
    226     unsigned int use_fallbacks : 1;
    227     unsigned int freeing : 1;
    228 };
    229 
    230 /*
    231  * provider_deactivate_free() is a wrapper around ossl_provider_deactivate()
    232  * and ossl_provider_free(), called as needed.
    233  * Since this is only called when the provider store is being emptied, we
    234  * don't need to care about any lock.
    235  */
    236 static void provider_deactivate_free(OSSL_PROVIDER *prov)
    237 {
    238     if (prov->flag_activated)
    239         ossl_provider_deactivate(prov, 1);
    240     ossl_provider_free(prov);
    241 }
    242 
    243 #ifndef FIPS_MODULE
    244 static void ossl_provider_child_cb_free(OSSL_PROVIDER_CHILD_CB *cb)
    245 {
    246     OPENSSL_free(cb);
    247 }
    248 #endif
    249 
    250 static void infopair_free(INFOPAIR *pair)
    251 {
    252     OPENSSL_free(pair->name);
    253     OPENSSL_free(pair->value);
    254     OPENSSL_free(pair);
    255 }
    256 
    257 static INFOPAIR *infopair_copy(const INFOPAIR *src)
    258 {
    259     INFOPAIR *dest = OPENSSL_zalloc(sizeof(*dest));
    260 
    261     if (dest == NULL)
    262         return NULL;
    263     if (src->name != NULL) {
    264         dest->name = OPENSSL_strdup(src->name);
    265         if (dest->name == NULL)
    266             goto err;
    267     }
    268     if (src->value != NULL) {
    269         dest->value = OPENSSL_strdup(src->value);
    270         if (dest->value == NULL)
    271             goto err;
    272     }
    273     return dest;
    274 err:
    275     OPENSSL_free(dest->name);
    276     OPENSSL_free(dest);
    277     return NULL;
    278 }
    279 
    280 void ossl_provider_info_clear(OSSL_PROVIDER_INFO *info)
    281 {
    282     OPENSSL_free(info->name);
    283     OPENSSL_free(info->path);
    284     sk_INFOPAIR_pop_free(info->parameters, infopair_free);
    285 }
    286 
    287 void ossl_provider_store_free(void *vstore)
    288 {
    289     struct provider_store_st *store = vstore;
    290     size_t i;
    291 
    292     if (store == NULL)
    293         return;
    294     store->freeing = 1;
    295     OPENSSL_free(store->default_path);
    296     sk_OSSL_PROVIDER_pop_free(store->providers, provider_deactivate_free);
    297 #ifndef FIPS_MODULE
    298     sk_OSSL_PROVIDER_CHILD_CB_pop_free(store->child_cbs,
    299         ossl_provider_child_cb_free);
    300 #endif
    301     CRYPTO_THREAD_lock_free(store->default_path_lock);
    302     CRYPTO_THREAD_lock_free(store->lock);
    303     for (i = 0; i < store->numprovinfo; i++)
    304         ossl_provider_info_clear(&store->provinfo[i]);
    305     OPENSSL_free(store->provinfo);
    306     OPENSSL_free(store);
    307 }
    308 
    309 void *ossl_provider_store_new(OSSL_LIB_CTX *ctx)
    310 {
    311     struct provider_store_st *store = OPENSSL_zalloc(sizeof(*store));
    312 
    313     if (store == NULL
    314         || (store->providers = sk_OSSL_PROVIDER_new(ossl_provider_cmp)) == NULL
    315         || (store->default_path_lock = CRYPTO_THREAD_lock_new()) == NULL
    316 #ifndef FIPS_MODULE
    317         || (store->child_cbs = sk_OSSL_PROVIDER_CHILD_CB_new_null()) == NULL
    318 #endif
    319         || (store->lock = CRYPTO_THREAD_lock_new()) == NULL) {
    320         ossl_provider_store_free(store);
    321         return NULL;
    322     }
    323     store->libctx = ctx;
    324     store->use_fallbacks = 1;
    325 
    326     return store;
    327 }
    328 
    329 static struct provider_store_st *get_provider_store(OSSL_LIB_CTX *libctx)
    330 {
    331     struct provider_store_st *store = NULL;
    332 
    333     store = ossl_lib_ctx_get_data(libctx, OSSL_LIB_CTX_PROVIDER_STORE_INDEX);
    334     if (store == NULL)
    335         ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR);
    336     return store;
    337 }
    338 
    339 int ossl_provider_disable_fallback_loading(OSSL_LIB_CTX *libctx)
    340 {
    341     struct provider_store_st *store;
    342 
    343     if ((store = get_provider_store(libctx)) != NULL) {
    344         if (!CRYPTO_THREAD_write_lock(store->lock))
    345             return 0;
    346         store->use_fallbacks = 0;
    347         CRYPTO_THREAD_unlock(store->lock);
    348         return 1;
    349     }
    350     return 0;
    351 }
    352 
    353 #define BUILTINS_BLOCK_SIZE 10
    354 
    355 int ossl_provider_info_add_to_store(OSSL_LIB_CTX *libctx,
    356     OSSL_PROVIDER_INFO *entry)
    357 {
    358     struct provider_store_st *store = get_provider_store(libctx);
    359     int ret = 0;
    360 
    361     if (entry->name == NULL) {
    362         ERR_raise(ERR_LIB_CRYPTO, ERR_R_PASSED_NULL_PARAMETER);
    363         return 0;
    364     }
    365 
    366     if (store == NULL) {
    367         ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR);
    368         return 0;
    369     }
    370 
    371     if (!CRYPTO_THREAD_write_lock(store->lock))
    372         return 0;
    373     if (store->provinfosz == 0) {
    374         store->provinfo = OPENSSL_zalloc(sizeof(*store->provinfo)
    375             * BUILTINS_BLOCK_SIZE);
    376         if (store->provinfo == NULL)
    377             goto err;
    378         store->provinfosz = BUILTINS_BLOCK_SIZE;
    379     } else if (store->numprovinfo == store->provinfosz) {
    380         OSSL_PROVIDER_INFO *tmpbuiltins;
    381         size_t newsz = store->provinfosz + BUILTINS_BLOCK_SIZE;
    382 
    383         tmpbuiltins = OPENSSL_realloc(store->provinfo,
    384             sizeof(*store->provinfo) * newsz);
    385         if (tmpbuiltins == NULL)
    386             goto err;
    387         store->provinfo = tmpbuiltins;
    388         store->provinfosz = newsz;
    389     }
    390     store->provinfo[store->numprovinfo] = *entry;
    391     store->numprovinfo++;
    392 
    393     ret = 1;
    394 err:
    395     CRYPTO_THREAD_unlock(store->lock);
    396     return ret;
    397 }
    398 
    399 OSSL_PROVIDER *ossl_provider_find(OSSL_LIB_CTX *libctx, const char *name,
    400     ossl_unused int noconfig)
    401 {
    402     struct provider_store_st *store = NULL;
    403     OSSL_PROVIDER *prov = NULL;
    404 
    405     if ((store = get_provider_store(libctx)) != NULL) {
    406         OSSL_PROVIDER tmpl = {
    407             0,
    408         };
    409         int i;
    410 
    411 #if !defined(FIPS_MODULE) && !defined(OPENSSL_NO_AUTOLOAD_CONFIG)
    412         /*
    413          * Make sure any providers are loaded from config before we try to find
    414          * them.
    415          */
    416         if (!noconfig) {
    417             if (ossl_lib_ctx_is_default(libctx))
    418                 OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);
    419         }
    420 #endif
    421 
    422         tmpl.name = (char *)name;
    423         if (!CRYPTO_THREAD_write_lock(store->lock))
    424             return NULL;
    425         sk_OSSL_PROVIDER_sort(store->providers);
    426         if ((i = sk_OSSL_PROVIDER_find(store->providers, &tmpl)) != -1)
    427             prov = sk_OSSL_PROVIDER_value(store->providers, i);
    428         CRYPTO_THREAD_unlock(store->lock);
    429         if (prov != NULL && !ossl_provider_up_ref(prov))
    430             prov = NULL;
    431     }
    432 
    433     return prov;
    434 }
    435 
    436 /*-
    437  * Provider Object methods
    438  * =======================
    439  */
    440 
    441 static OSSL_PROVIDER *provider_new(const char *name,
    442     OSSL_provider_init_fn *init_function,
    443     STACK_OF(INFOPAIR) *parameters)
    444 {
    445     OSSL_PROVIDER *prov = NULL;
    446 
    447     if ((prov = OPENSSL_zalloc(sizeof(*prov))) == NULL)
    448         return NULL;
    449     if (!CRYPTO_NEW_REF(&prov->refcnt, 1)) {
    450         OPENSSL_free(prov);
    451         return NULL;
    452     }
    453     if ((prov->activatecnt_lock = CRYPTO_THREAD_lock_new()) == NULL) {
    454         ossl_provider_free(prov);
    455         ERR_raise(ERR_LIB_CRYPTO, ERR_R_CRYPTO_LIB);
    456         return NULL;
    457     }
    458 
    459     if ((prov->opbits_lock = CRYPTO_THREAD_lock_new()) == NULL
    460         || (prov->flag_lock = CRYPTO_THREAD_lock_new()) == NULL
    461         || (prov->parameters = sk_INFOPAIR_deep_copy(parameters,
    462                 infopair_copy,
    463                 infopair_free))
    464             == NULL) {
    465         ossl_provider_free(prov);
    466         ERR_raise(ERR_LIB_CRYPTO, ERR_R_CRYPTO_LIB);
    467         return NULL;
    468     }
    469     if ((prov->name = OPENSSL_strdup(name)) == NULL) {
    470         ossl_provider_free(prov);
    471         return NULL;
    472     }
    473 
    474     prov->init_function = init_function;
    475 
    476     return prov;
    477 }
    478 
    479 int ossl_provider_up_ref(OSSL_PROVIDER *prov)
    480 {
    481     int ref = 0;
    482 
    483     if (CRYPTO_UP_REF(&prov->refcnt, &ref) <= 0)
    484         return 0;
    485 
    486 #ifndef FIPS_MODULE
    487     if (prov->ischild) {
    488         if (!ossl_provider_up_ref_parent(prov, 0)) {
    489             ossl_provider_free(prov);
    490             return 0;
    491         }
    492     }
    493 #endif
    494 
    495     return ref;
    496 }
    497 
    498 #ifndef FIPS_MODULE
    499 static int provider_up_ref_intern(OSSL_PROVIDER *prov, int activate)
    500 {
    501     if (activate)
    502         return ossl_provider_activate(prov, 1, 0);
    503 
    504     return ossl_provider_up_ref(prov);
    505 }
    506 
    507 static int provider_free_intern(OSSL_PROVIDER *prov, int deactivate)
    508 {
    509     if (deactivate)
    510         return ossl_provider_deactivate(prov, 1);
    511 
    512     ossl_provider_free(prov);
    513     return 1;
    514 }
    515 #endif
    516 
    517 /*
    518  * We assume that the requested provider does not already exist in the store.
    519  * The caller should check. If it does exist then adding it to the store later
    520  * will fail.
    521  */
    522 OSSL_PROVIDER *ossl_provider_new(OSSL_LIB_CTX *libctx, const char *name,
    523     OSSL_provider_init_fn *init_function,
    524     OSSL_PARAM *params, int noconfig)
    525 {
    526     struct provider_store_st *store = NULL;
    527     OSSL_PROVIDER_INFO template;
    528     OSSL_PROVIDER *prov = NULL;
    529 
    530     if ((store = get_provider_store(libctx)) == NULL)
    531         return NULL;
    532 
    533     memset(&template, 0, sizeof(template));
    534     if (init_function == NULL) {
    535         const OSSL_PROVIDER_INFO *p;
    536         size_t i;
    537         int chosen = 0;
    538 
    539         /* Check if this is a predefined builtin provider */
    540         for (p = ossl_predefined_providers; p->name != NULL; p++) {
    541             if (strcmp(p->name, name) != 0)
    542                 continue;
    543             /* These compile-time templates always have NULL parameters */
    544             template = *p;
    545             chosen = 1;
    546             break;
    547         }
    548         if (!CRYPTO_THREAD_read_lock(store->lock))
    549             return NULL;
    550         for (i = 0, p = store->provinfo; i < store->numprovinfo; p++, i++) {
    551             if (strcmp(p->name, name) != 0)
    552                 continue;
    553             /* For built-in providers, copy just implicit parameters. */
    554             if (!chosen)
    555                 template = *p;
    556             /*
    557              * Explicit parameters override config-file defaults.  If an empty
    558              * parameter set is desired, a non-NULL empty set must be provided.
    559              */
    560             if (params != NULL || p->parameters == NULL) {
    561                 template.parameters = NULL;
    562                 break;
    563             }
    564             /* Always copy to avoid sharing/mutation. */
    565             template.parameters = sk_INFOPAIR_deep_copy(p->parameters,
    566                 infopair_copy,
    567                 infopair_free);
    568             if (template.parameters == NULL) {
    569                 CRYPTO_THREAD_unlock(store->lock);
    570                 return NULL;
    571             }
    572             break;
    573         }
    574         CRYPTO_THREAD_unlock(store->lock);
    575     } else {
    576         template.init = init_function;
    577     }
    578 
    579     if (params != NULL) {
    580         int i;
    581 
    582         /* Don't leak if already non-NULL */
    583         if (template.parameters == NULL)
    584             template.parameters = sk_INFOPAIR_new_null();
    585         if (template.parameters == NULL)
    586             return NULL;
    587 
    588         for (i = 0; params[i].key != NULL; i++) {
    589             if (params[i].data_type != OSSL_PARAM_UTF8_STRING)
    590                 continue;
    591             if (ossl_provider_info_add_parameter(&template, params[i].key,
    592                     (char *)params[i].data)
    593                 <= 0) {
    594                 sk_INFOPAIR_pop_free(template.parameters, infopair_free);
    595                 return NULL;
    596             }
    597         }
    598     }
    599 
    600     /* provider_new() generates an error, so no need here */
    601     prov = provider_new(name, template.init, template.parameters);
    602 
    603     /* If we copied the parameters, free them */
    604     if (template.parameters != NULL)
    605         sk_INFOPAIR_pop_free(template.parameters, infopair_free);
    606 
    607     if (prov == NULL)
    608         return NULL;
    609 
    610     if (!ossl_provider_set_module_path(prov, template.path)) {
    611         ossl_provider_free(prov);
    612         return NULL;
    613     }
    614 
    615     prov->libctx = libctx;
    616 #ifndef FIPS_MODULE
    617     prov->error_lib = ERR_get_next_error_library();
    618 #endif
    619 
    620     /*
    621      * At this point, the provider is only partially "loaded".  To be
    622      * fully "loaded", ossl_provider_activate() must also be called and it must
    623      * then be added to the provider store.
    624      */
    625 
    626     return prov;
    627 }
    628 
    629 /* Assumes that the store lock is held */
    630 static int create_provider_children(OSSL_PROVIDER *prov)
    631 {
    632     int ret = 1;
    633 #ifndef FIPS_MODULE
    634     struct provider_store_st *store = prov->store;
    635     OSSL_PROVIDER_CHILD_CB *child_cb;
    636     int i, max;
    637 
    638     max = sk_OSSL_PROVIDER_CHILD_CB_num(store->child_cbs);
    639     for (i = 0; i < max; i++) {
    640         /*
    641          * This is newly activated (activatecnt == 1), so we need to
    642          * create child providers as necessary.
    643          */
    644         child_cb = sk_OSSL_PROVIDER_CHILD_CB_value(store->child_cbs, i);
    645         ret &= child_cb->create_cb((OSSL_CORE_HANDLE *)prov, child_cb->cbdata);
    646     }
    647 #endif
    648 
    649     return ret;
    650 }
    651 
    652 int ossl_provider_add_to_store(OSSL_PROVIDER *prov, OSSL_PROVIDER **actualprov,
    653     int retain_fallbacks)
    654 {
    655     struct provider_store_st *store;
    656     int idx;
    657     OSSL_PROVIDER tmpl = {
    658         0,
    659     };
    660     OSSL_PROVIDER *actualtmp = NULL;
    661 
    662     if (actualprov != NULL)
    663         *actualprov = NULL;
    664 
    665     if ((store = get_provider_store(prov->libctx)) == NULL)
    666         return 0;
    667 
    668     if (!CRYPTO_THREAD_write_lock(store->lock))
    669         return 0;
    670 
    671     tmpl.name = (char *)prov->name;
    672     idx = sk_OSSL_PROVIDER_find(store->providers, &tmpl);
    673     if (idx == -1)
    674         actualtmp = prov;
    675     else
    676         actualtmp = sk_OSSL_PROVIDER_value(store->providers, idx);
    677 
    678     if (idx == -1) {
    679         if (sk_OSSL_PROVIDER_push(store->providers, prov) == 0)
    680             goto err;
    681         prov->store = store;
    682         if (!create_provider_children(prov)) {
    683             sk_OSSL_PROVIDER_delete_ptr(store->providers, prov);
    684             goto err;
    685         }
    686         if (!retain_fallbacks)
    687             store->use_fallbacks = 0;
    688     }
    689 
    690     CRYPTO_THREAD_unlock(store->lock);
    691 
    692     if (actualprov != NULL) {
    693         if (!ossl_provider_up_ref(actualtmp)) {
    694             ERR_raise(ERR_LIB_CRYPTO, ERR_R_CRYPTO_LIB);
    695             actualtmp = NULL;
    696             return 0;
    697         }
    698         *actualprov = actualtmp;
    699     }
    700 
    701     if (idx >= 0) {
    702         /*
    703          * The provider is already in the store. Probably two threads
    704          * independently initialised their own provider objects with the same
    705          * name and raced to put them in the store. This thread lost. We
    706          * deactivate the one we just created and use the one that already
    707          * exists instead.
    708          * If we get here then we know we did not create provider children
    709          * above, so we inform ossl_provider_deactivate not to attempt to remove
    710          * any.
    711          */
    712         ossl_provider_deactivate(prov, 0);
    713         ossl_provider_free(prov);
    714     }
    715 #ifndef FIPS_MODULE
    716     else {
    717         /*
    718          * This can be done outside the lock. We tolerate other threads getting
    719          * the wrong result briefly when creating OSSL_DECODER_CTXs.
    720          */
    721         ossl_decoder_cache_flush(prov->libctx);
    722     }
    723 #endif
    724 
    725     return 1;
    726 
    727 err:
    728     CRYPTO_THREAD_unlock(store->lock);
    729     return 0;
    730 }
    731 
    732 void ossl_provider_free(OSSL_PROVIDER *prov)
    733 {
    734     if (prov != NULL) {
    735         int ref = 0;
    736 
    737         CRYPTO_DOWN_REF(&prov->refcnt, &ref);
    738 
    739         /*
    740          * When the refcount drops to zero, we clean up the provider.
    741          * Note that this also does teardown, which may seem late,
    742          * considering that init happens on first activation.  However,
    743          * there may be other structures hanging on to the provider after
    744          * the last deactivation and may therefore need full access to the
    745          * provider's services.  Therefore, we deinit late.
    746          */
    747         if (ref == 0) {
    748             if (prov->flag_initialized) {
    749                 ossl_provider_teardown(prov);
    750 #ifndef OPENSSL_NO_ERR
    751 #ifndef FIPS_MODULE
    752                 if (prov->error_strings != NULL) {
    753                     ERR_unload_strings(prov->error_lib, prov->error_strings);
    754                     OPENSSL_free(prov->error_strings);
    755                     prov->error_strings = NULL;
    756                 }
    757 #endif
    758 #endif
    759                 OPENSSL_free(prov->operation_bits);
    760                 prov->operation_bits = NULL;
    761                 prov->operation_bits_sz = 0;
    762                 prov->flag_initialized = 0;
    763             }
    764 
    765 #ifndef FIPS_MODULE
    766             /*
    767              * We deregister thread handling whether or not the provider was
    768              * initialized. If init was attempted but was not successful then
    769              * the provider may still have registered a thread handler.
    770              */
    771             ossl_init_thread_deregister(prov);
    772             DSO_free(prov->module);
    773 #endif
    774             OPENSSL_free(prov->name);
    775             OPENSSL_free(prov->path);
    776             sk_INFOPAIR_pop_free(prov->parameters, infopair_free);
    777             CRYPTO_THREAD_lock_free(prov->opbits_lock);
    778             CRYPTO_THREAD_lock_free(prov->flag_lock);
    779             CRYPTO_THREAD_lock_free(prov->activatecnt_lock);
    780             CRYPTO_FREE_REF(&prov->refcnt);
    781             OPENSSL_free(prov);
    782         }
    783 #ifndef FIPS_MODULE
    784         else if (prov->ischild) {
    785             ossl_provider_free_parent(prov, 0);
    786         }
    787 #endif
    788     }
    789 }
    790 
    791 /* Setters */
    792 int ossl_provider_set_module_path(OSSL_PROVIDER *prov, const char *module_path)
    793 {
    794     OPENSSL_free(prov->path);
    795     prov->path = NULL;
    796     if (module_path == NULL)
    797         return 1;
    798     if ((prov->path = OPENSSL_strdup(module_path)) != NULL)
    799         return 1;
    800     return 0;
    801 }
    802 
    803 static int infopair_add(STACK_OF(INFOPAIR) **infopairsk, const char *name,
    804     const char *value)
    805 {
    806     INFOPAIR *pair = NULL;
    807 
    808     if ((pair = OPENSSL_zalloc(sizeof(*pair))) == NULL
    809         || (pair->name = OPENSSL_strdup(name)) == NULL
    810         || (pair->value = OPENSSL_strdup(value)) == NULL)
    811         goto err;
    812 
    813     if ((*infopairsk == NULL
    814             && (*infopairsk = sk_INFOPAIR_new_null()) == NULL)
    815         || sk_INFOPAIR_push(*infopairsk, pair) <= 0) {
    816         ERR_raise(ERR_LIB_CRYPTO, ERR_R_CRYPTO_LIB);
    817         goto err;
    818     }
    819 
    820     return 1;
    821 
    822 err:
    823     if (pair != NULL) {
    824         OPENSSL_free(pair->name);
    825         OPENSSL_free(pair->value);
    826         OPENSSL_free(pair);
    827     }
    828     return 0;
    829 }
    830 
    831 int OSSL_PROVIDER_add_conf_parameter(OSSL_PROVIDER *prov,
    832     const char *name, const char *value)
    833 {
    834     return infopair_add(&prov->parameters, name, value);
    835 }
    836 
    837 int OSSL_PROVIDER_get_conf_parameters(const OSSL_PROVIDER *prov,
    838     OSSL_PARAM params[])
    839 {
    840     int i;
    841 
    842     if (prov->parameters == NULL)
    843         return 1;
    844 
    845     for (i = 0; i < sk_INFOPAIR_num(prov->parameters); i++) {
    846         INFOPAIR *pair = sk_INFOPAIR_value(prov->parameters, i);
    847         OSSL_PARAM *p = OSSL_PARAM_locate(params, pair->name);
    848 
    849         if (p != NULL
    850             && !OSSL_PARAM_set_utf8_ptr(p, pair->value))
    851             return 0;
    852     }
    853     return 1;
    854 }
    855 
    856 int OSSL_PROVIDER_conf_get_bool(const OSSL_PROVIDER *prov,
    857     const char *name, int defval)
    858 {
    859     char *val = NULL;
    860     OSSL_PARAM param[2] = { OSSL_PARAM_END, OSSL_PARAM_END };
    861 
    862     param[0].key = (char *)name;
    863     param[0].data_type = OSSL_PARAM_UTF8_PTR;
    864     param[0].data = (void *)&val;
    865     param[0].data_size = sizeof(val);
    866     param[0].return_size = OSSL_PARAM_UNMODIFIED;
    867 
    868     /* Errors are ignored, returning the default value */
    869     if (OSSL_PROVIDER_get_conf_parameters(prov, param)
    870         && OSSL_PARAM_modified(param)
    871         && val != NULL) {
    872         if ((strcmp(val, "1") == 0)
    873             || (OPENSSL_strcasecmp(val, "yes") == 0)
    874             || (OPENSSL_strcasecmp(val, "true") == 0)
    875             || (OPENSSL_strcasecmp(val, "on") == 0))
    876             return 1;
    877         else if ((strcmp(val, "0") == 0)
    878             || (OPENSSL_strcasecmp(val, "no") == 0)
    879             || (OPENSSL_strcasecmp(val, "false") == 0)
    880             || (OPENSSL_strcasecmp(val, "off") == 0))
    881             return 0;
    882     }
    883     return defval;
    884 }
    885 
    886 int ossl_provider_info_add_parameter(OSSL_PROVIDER_INFO *provinfo,
    887     const char *name,
    888     const char *value)
    889 {
    890     return infopair_add(&provinfo->parameters, name, value);
    891 }
    892 
    893 /*
    894  * Provider activation.
    895  *
    896  * What "activation" means depends on the provider form; for built in
    897  * providers (in the library or the application alike), the provider
    898  * can already be considered to be loaded, all that's needed is to
    899  * initialize it.  However, for dynamically loadable provider modules,
    900  * we must first load that module.
    901  *
    902  * Built in modules are distinguished from dynamically loaded modules
    903  * with an already assigned init function.
    904  */
    905 static const OSSL_DISPATCH *core_dispatch; /* Define further down */
    906 
    907 int OSSL_PROVIDER_set_default_search_path(OSSL_LIB_CTX *libctx,
    908     const char *path)
    909 {
    910     struct provider_store_st *store;
    911     char *p = NULL;
    912 
    913     if (path != NULL) {
    914         p = OPENSSL_strdup(path);
    915         if (p == NULL)
    916             return 0;
    917     }
    918     if ((store = get_provider_store(libctx)) != NULL
    919         && CRYPTO_THREAD_write_lock(store->default_path_lock)) {
    920         OPENSSL_free(store->default_path);
    921         store->default_path = p;
    922         CRYPTO_THREAD_unlock(store->default_path_lock);
    923         return 1;
    924     }
    925     OPENSSL_free(p);
    926     return 0;
    927 }
    928 
    929 const char *OSSL_PROVIDER_get0_default_search_path(OSSL_LIB_CTX *libctx)
    930 {
    931     struct provider_store_st *store;
    932     char *path = NULL;
    933 
    934     if ((store = get_provider_store(libctx)) != NULL
    935         && CRYPTO_THREAD_read_lock(store->default_path_lock)) {
    936         path = store->default_path;
    937         CRYPTO_THREAD_unlock(store->default_path_lock);
    938     }
    939     return path;
    940 }
    941 
    942 /*
    943  * Internal version that doesn't affect the store flags, and thereby avoid
    944  * locking.  Direct callers must remember to set the store flags when
    945  * appropriate.
    946  */
    947 static int provider_init(OSSL_PROVIDER *prov)
    948 {
    949     const OSSL_DISPATCH *provider_dispatch = NULL;
    950     void *tmp_provctx = NULL; /* safety measure */
    951 #ifndef OPENSSL_NO_ERR
    952 #ifndef FIPS_MODULE
    953     OSSL_FUNC_provider_get_reason_strings_fn *p_get_reason_strings = NULL;
    954 #endif
    955 #endif
    956     int ok = 0;
    957 
    958     if (!ossl_assert(!prov->flag_initialized)) {
    959         ERR_raise(ERR_LIB_CRYPTO, ERR_R_INTERNAL_ERROR);
    960         goto end;
    961     }
    962 
    963     /*
    964      * If the init function isn't set, it indicates that this provider is
    965      * a loadable module.
    966      */
    967     if (prov->init_function == NULL) {
    968 #ifdef FIPS_MODULE
    969         goto end;
    970 #else
    971         if (prov->module == NULL) {
    972             char *allocated_path = NULL;
    973             const char *module_path = NULL;
    974             char *merged_path = NULL;
    975             const char *load_dir = NULL;
    976             char *allocated_load_dir = NULL;
    977             struct provider_store_st *store;
    978 
    979             if ((prov->module = DSO_new()) == NULL) {
    980                 /* DSO_new() generates an error already */
    981                 goto end;
    982             }
    983 
    984             if ((store = get_provider_store(prov->libctx)) == NULL
    985                 || !CRYPTO_THREAD_read_lock(store->default_path_lock))
    986                 goto end;
    987 
    988             if (store->default_path != NULL) {
    989                 allocated_load_dir = OPENSSL_strdup(store->default_path);
    990                 CRYPTO_THREAD_unlock(store->default_path_lock);
    991                 if (allocated_load_dir == NULL)
    992                     goto end;
    993                 load_dir = allocated_load_dir;
    994             } else {
    995                 CRYPTO_THREAD_unlock(store->default_path_lock);
    996             }
    997 
    998             if (load_dir == NULL) {
    999                 load_dir = ossl_safe_getenv("OPENSSL_MODULES");
   1000                 if (load_dir == NULL)
   1001                     load_dir = ossl_get_modulesdir();
   1002             }
   1003 
   1004             DSO_ctrl(prov->module, DSO_CTRL_SET_FLAGS,
   1005                 DSO_FLAG_NAME_TRANSLATION_EXT_ONLY, NULL);
   1006 
   1007             module_path = prov->path;
   1008             if (module_path == NULL)
   1009                 module_path = allocated_path = DSO_convert_filename(prov->module, prov->name);
   1010             if (module_path != NULL)
   1011                 merged_path = DSO_merge(prov->module, module_path, load_dir);
   1012 
   1013             if (merged_path == NULL
   1014                 || (DSO_load(prov->module, merged_path, NULL, 0)) == NULL) {
   1015                 DSO_free(prov->module);
   1016                 prov->module = NULL;
   1017             }
   1018 
   1019             OPENSSL_free(merged_path);
   1020             OPENSSL_free(allocated_path);
   1021             OPENSSL_free(allocated_load_dir);
   1022         }
   1023 
   1024         if (prov->module == NULL) {
   1025             /* DSO has already recorded errors, this is just a tracepoint */
   1026             ERR_raise_data(ERR_LIB_CRYPTO, ERR_R_DSO_LIB,
   1027                 "name=%s", prov->name);
   1028             goto end;
   1029         }
   1030 
   1031         prov->init_function = (OSSL_provider_init_fn *)
   1032             DSO_bind_func(prov->module, "OSSL_provider_init");
   1033 #endif
   1034     }
   1035 
   1036     /* Check for and call the initialise function for the provider. */
   1037     if (prov->init_function == NULL) {
   1038         ERR_raise_data(ERR_LIB_CRYPTO, ERR_R_UNSUPPORTED,
   1039             "name=%s, provider has no provider init function",
   1040             prov->name);
   1041         goto end;
   1042     }
   1043 #ifndef FIPS_MODULE
   1044     OSSL_TRACE_BEGIN(PROVIDER)
   1045     {
   1046         BIO_printf(trc_out,
   1047             "(provider %s) initializing\n", prov->name);
   1048     }
   1049     OSSL_TRACE_END(PROVIDER);
   1050 #endif
   1051 
   1052     if (!prov->init_function((OSSL_CORE_HANDLE *)prov, core_dispatch,
   1053             &provider_dispatch, &tmp_provctx)) {
   1054         ERR_raise_data(ERR_LIB_CRYPTO, ERR_R_INIT_FAIL,
   1055             "name=%s", prov->name);
   1056         goto end;
   1057     }
   1058     prov->provctx = tmp_provctx;
   1059     prov->dispatch = provider_dispatch;
   1060 
   1061     if (provider_dispatch != NULL) {
   1062         for (; provider_dispatch->function_id != 0; provider_dispatch++) {
   1063             switch (provider_dispatch->function_id) {
   1064             case OSSL_FUNC_PROVIDER_TEARDOWN:
   1065                 prov->teardown = OSSL_FUNC_provider_teardown(provider_dispatch);
   1066                 break;
   1067             case OSSL_FUNC_PROVIDER_GETTABLE_PARAMS:
   1068                 prov->gettable_params = OSSL_FUNC_provider_gettable_params(provider_dispatch);
   1069                 break;
   1070             case OSSL_FUNC_PROVIDER_GET_PARAMS:
   1071                 prov->get_params = OSSL_FUNC_provider_get_params(provider_dispatch);
   1072                 break;
   1073             case OSSL_FUNC_PROVIDER_SELF_TEST:
   1074                 prov->self_test = OSSL_FUNC_provider_self_test(provider_dispatch);
   1075                 break;
   1076             case OSSL_FUNC_PROVIDER_RANDOM_BYTES:
   1077                 prov->random_bytes = OSSL_FUNC_provider_random_bytes(provider_dispatch);
   1078                 break;
   1079             case OSSL_FUNC_PROVIDER_GET_CAPABILITIES:
   1080                 prov->get_capabilities = OSSL_FUNC_provider_get_capabilities(provider_dispatch);
   1081                 break;
   1082             case OSSL_FUNC_PROVIDER_QUERY_OPERATION:
   1083                 prov->query_operation = OSSL_FUNC_provider_query_operation(provider_dispatch);
   1084                 break;
   1085             case OSSL_FUNC_PROVIDER_UNQUERY_OPERATION:
   1086                 prov->unquery_operation = OSSL_FUNC_provider_unquery_operation(provider_dispatch);
   1087                 break;
   1088 #ifndef OPENSSL_NO_ERR
   1089 #ifndef FIPS_MODULE
   1090             case OSSL_FUNC_PROVIDER_GET_REASON_STRINGS:
   1091                 p_get_reason_strings = OSSL_FUNC_provider_get_reason_strings(provider_dispatch);
   1092                 break;
   1093 #endif
   1094 #endif
   1095             }
   1096         }
   1097     }
   1098 
   1099 #ifndef OPENSSL_NO_ERR
   1100 #ifndef FIPS_MODULE
   1101     if (p_get_reason_strings != NULL) {
   1102         const OSSL_ITEM *reasonstrings = p_get_reason_strings(prov->provctx);
   1103         size_t cnt, cnt2;
   1104 
   1105         /*
   1106          * ERR_load_strings() handles ERR_STRING_DATA rather than OSSL_ITEM,
   1107          * although they are essentially the same type.
   1108          * Furthermore, ERR_load_strings() patches the array's error number
   1109          * with the error library number, so we need to make a copy of that
   1110          * array either way.
   1111          */
   1112         cnt = 0;
   1113         while (reasonstrings[cnt].id != 0) {
   1114             if (ERR_GET_LIB(reasonstrings[cnt].id) != 0)
   1115                 goto end;
   1116             cnt++;
   1117         }
   1118         cnt++; /* One for the terminating item */
   1119 
   1120         /* Allocate one extra item for the "library" name */
   1121         prov->error_strings = OPENSSL_zalloc(sizeof(ERR_STRING_DATA) * (cnt + 1));
   1122         if (prov->error_strings == NULL)
   1123             goto end;
   1124 
   1125         /*
   1126          * Set the "library" name.
   1127          */
   1128         prov->error_strings[0].error = ERR_PACK(prov->error_lib, 0, 0);
   1129         prov->error_strings[0].string = prov->name;
   1130         /*
   1131          * Copy reasonstrings item 0..cnt-1 to prov->error_trings positions
   1132          * 1..cnt.
   1133          */
   1134         for (cnt2 = 1; cnt2 <= cnt; cnt2++) {
   1135             prov->error_strings[cnt2].error = (int)reasonstrings[cnt2 - 1].id;
   1136             prov->error_strings[cnt2].string = reasonstrings[cnt2 - 1].ptr;
   1137         }
   1138 
   1139         ERR_load_strings(prov->error_lib, prov->error_strings);
   1140     }
   1141 #endif
   1142 #endif
   1143 
   1144     /* With this flag set, this provider has become fully "loaded". */
   1145     prov->flag_initialized = 1;
   1146     ok = 1;
   1147 
   1148 end:
   1149     return ok;
   1150 }
   1151 
   1152 /*
   1153  * Deactivate a provider. If upcalls is 0 then we suppress any upcalls to a
   1154  * parent provider. If removechildren is 0 then we suppress any calls to remove
   1155  * child providers.
   1156  * Return -1 on failure and the activation count on success
   1157  */
   1158 static int provider_deactivate(OSSL_PROVIDER *prov, int upcalls,
   1159     int removechildren)
   1160 {
   1161     int count;
   1162     struct provider_store_st *store;
   1163 #ifndef FIPS_MODULE
   1164     int freeparent = 0;
   1165 #endif
   1166     int lock = 1;
   1167 
   1168     if (!ossl_assert(prov != NULL))
   1169         return -1;
   1170 
   1171 #ifndef FIPS_MODULE
   1172     if (prov->random_bytes != NULL
   1173         && !ossl_rand_check_random_provider_on_unload(prov->libctx, prov))
   1174         return -1;
   1175 #endif
   1176 
   1177     /*
   1178      * No need to lock if we've got no store because we've not been shared with
   1179      * other threads.
   1180      */
   1181     store = get_provider_store(prov->libctx);
   1182     if (store == NULL)
   1183         lock = 0;
   1184 
   1185     if (lock && !CRYPTO_THREAD_read_lock(store->lock))
   1186         return -1;
   1187     if (lock && !CRYPTO_THREAD_write_lock(prov->flag_lock)) {
   1188         CRYPTO_THREAD_unlock(store->lock);
   1189         return -1;
   1190     }
   1191 
   1192     if (!CRYPTO_atomic_add(&prov->activatecnt, -1, &count, prov->activatecnt_lock)) {
   1193         if (lock) {
   1194             CRYPTO_THREAD_unlock(prov->flag_lock);
   1195             CRYPTO_THREAD_unlock(store->lock);
   1196         }
   1197         return -1;
   1198     }
   1199 
   1200 #ifndef FIPS_MODULE
   1201     if (count >= 1 && prov->ischild && upcalls) {
   1202         /*
   1203          * We have had a direct activation in this child libctx so we need to
   1204          * now down the ref count in the parent provider. We do the actual down
   1205          * ref outside of the flag_lock, since it could involve getting other
   1206          * locks.
   1207          */
   1208         freeparent = 1;
   1209     }
   1210 #endif
   1211 
   1212     if (count < 1)
   1213         prov->flag_activated = 0;
   1214 #ifndef FIPS_MODULE
   1215     else
   1216         removechildren = 0;
   1217 #endif
   1218 
   1219 #ifndef FIPS_MODULE
   1220     if (removechildren && store != NULL) {
   1221         int i, max = sk_OSSL_PROVIDER_CHILD_CB_num(store->child_cbs);
   1222         OSSL_PROVIDER_CHILD_CB *child_cb;
   1223 
   1224         for (i = 0; i < max; i++) {
   1225             child_cb = sk_OSSL_PROVIDER_CHILD_CB_value(store->child_cbs, i);
   1226             child_cb->remove_cb((OSSL_CORE_HANDLE *)prov, child_cb->cbdata);
   1227         }
   1228     }
   1229 #endif
   1230     if (lock) {
   1231         CRYPTO_THREAD_unlock(prov->flag_lock);
   1232         CRYPTO_THREAD_unlock(store->lock);
   1233         /*
   1234          * This can be done outside the lock. We tolerate other threads getting
   1235          * the wrong result briefly when creating OSSL_DECODER_CTXs.
   1236          */
   1237 #ifndef FIPS_MODULE
   1238         if (count < 1)
   1239             ossl_decoder_cache_flush(prov->libctx);
   1240 #endif
   1241     }
   1242 #ifndef FIPS_MODULE
   1243     if (freeparent)
   1244         ossl_provider_free_parent(prov, 1);
   1245 #endif
   1246 
   1247     /* We don't deinit here, that's done in ossl_provider_free() */
   1248     return count;
   1249 }
   1250 
   1251 /*
   1252  * Activate a provider.
   1253  * Return -1 on failure and the activation count on success
   1254  */
   1255 static int provider_activate(OSSL_PROVIDER *prov, int lock, int upcalls)
   1256 {
   1257     int count = -1;
   1258     struct provider_store_st *store;
   1259     int ret = 1;
   1260 
   1261     store = prov->store;
   1262     /*
   1263      * If the provider hasn't been added to the store, then we don't need
   1264      * any locks because we've not shared it with other threads.
   1265      */
   1266     if (store == NULL) {
   1267         lock = 0;
   1268         if (!provider_init(prov))
   1269             return -1;
   1270     }
   1271 
   1272 #ifndef FIPS_MODULE
   1273     if (prov->random_bytes != NULL
   1274         && !ossl_rand_check_random_provider_on_load(prov->libctx, prov))
   1275         return -1;
   1276 
   1277     if (prov->ischild && upcalls && !ossl_provider_up_ref_parent(prov, 1))
   1278         return -1;
   1279 #endif
   1280 
   1281     if (lock && !CRYPTO_THREAD_read_lock(store->lock)) {
   1282 #ifndef FIPS_MODULE
   1283         if (prov->ischild && upcalls)
   1284             ossl_provider_free_parent(prov, 1);
   1285 #endif
   1286         return -1;
   1287     }
   1288 
   1289     if (lock && !CRYPTO_THREAD_write_lock(prov->flag_lock)) {
   1290         CRYPTO_THREAD_unlock(store->lock);
   1291 #ifndef FIPS_MODULE
   1292         if (prov->ischild && upcalls)
   1293             ossl_provider_free_parent(prov, 1);
   1294 #endif
   1295         return -1;
   1296     }
   1297     if (CRYPTO_atomic_add(&prov->activatecnt, 1, &count, prov->activatecnt_lock)) {
   1298         prov->flag_activated = 1;
   1299 
   1300         if (count == 1 && store != NULL) {
   1301             ret = create_provider_children(prov);
   1302         }
   1303     }
   1304     if (lock) {
   1305         CRYPTO_THREAD_unlock(prov->flag_lock);
   1306         CRYPTO_THREAD_unlock(store->lock);
   1307         /*
   1308          * This can be done outside the lock. We tolerate other threads getting
   1309          * the wrong result briefly when creating OSSL_DECODER_CTXs.
   1310          */
   1311 #ifndef FIPS_MODULE
   1312         if (count == 1)
   1313             ossl_decoder_cache_flush(prov->libctx);
   1314 #endif
   1315     }
   1316 
   1317     if (!ret)
   1318         return -1;
   1319 
   1320     return count;
   1321 }
   1322 
   1323 static int provider_flush_store_cache(const OSSL_PROVIDER *prov)
   1324 {
   1325     struct provider_store_st *store;
   1326     int freeing;
   1327 
   1328     if ((store = get_provider_store(prov->libctx)) == NULL)
   1329         return 0;
   1330 
   1331     if (!CRYPTO_THREAD_read_lock(store->lock))
   1332         return 0;
   1333     freeing = store->freeing;
   1334     CRYPTO_THREAD_unlock(store->lock);
   1335 
   1336     if (!freeing) {
   1337         int acc
   1338             = evp_method_store_cache_flush(prov->libctx)
   1339 #ifndef FIPS_MODULE
   1340             + ossl_encoder_store_cache_flush(prov->libctx)
   1341             + ossl_decoder_store_cache_flush(prov->libctx)
   1342             + ossl_store_loader_store_cache_flush(prov->libctx)
   1343 #endif
   1344             ;
   1345 
   1346 #ifndef FIPS_MODULE
   1347         return acc == 4;
   1348 #else
   1349         return acc == 1;
   1350 #endif
   1351     }
   1352     return 1;
   1353 }
   1354 
   1355 static int provider_remove_store_methods(OSSL_PROVIDER *prov)
   1356 {
   1357     struct provider_store_st *store;
   1358     int freeing;
   1359 
   1360     if ((store = get_provider_store(prov->libctx)) == NULL)
   1361         return 0;
   1362 
   1363     if (!CRYPTO_THREAD_read_lock(store->lock))
   1364         return 0;
   1365     freeing = store->freeing;
   1366     CRYPTO_THREAD_unlock(store->lock);
   1367 
   1368     if (!freeing) {
   1369         int acc;
   1370 
   1371         if (!CRYPTO_THREAD_write_lock(prov->opbits_lock))
   1372             return 0;
   1373         OPENSSL_free(prov->operation_bits);
   1374         prov->operation_bits = NULL;
   1375         prov->operation_bits_sz = 0;
   1376         CRYPTO_THREAD_unlock(prov->opbits_lock);
   1377 
   1378         acc = evp_method_store_remove_all_provided(prov)
   1379 #ifndef FIPS_MODULE
   1380             + ossl_encoder_store_remove_all_provided(prov)
   1381             + ossl_decoder_store_remove_all_provided(prov)
   1382             + ossl_store_loader_store_remove_all_provided(prov)
   1383 #endif
   1384             ;
   1385 
   1386 #ifndef FIPS_MODULE
   1387         return acc == 4;
   1388 #else
   1389         return acc == 1;
   1390 #endif
   1391     }
   1392     return 1;
   1393 }
   1394 
   1395 int ossl_provider_activate(OSSL_PROVIDER *prov, int upcalls, int aschild)
   1396 {
   1397     int count;
   1398 
   1399     if (prov == NULL)
   1400         return 0;
   1401 #ifndef FIPS_MODULE
   1402     /*
   1403      * If aschild is true, then we only actually do the activation if the
   1404      * provider is a child. If its not, this is still success.
   1405      */
   1406     if (aschild && !prov->ischild)
   1407         return 1;
   1408 #endif
   1409     if ((count = provider_activate(prov, 1, upcalls)) > 0)
   1410         return count == 1 ? provider_flush_store_cache(prov) : 1;
   1411 
   1412     return 0;
   1413 }
   1414 
   1415 int ossl_provider_deactivate(OSSL_PROVIDER *prov, int removechildren)
   1416 {
   1417     int count;
   1418 
   1419     if (prov == NULL
   1420         || (count = provider_deactivate(prov, 1, removechildren)) < 0)
   1421         return 0;
   1422     return count == 0 ? provider_remove_store_methods(prov) : 1;
   1423 }
   1424 
   1425 void *ossl_provider_ctx(const OSSL_PROVIDER *prov)
   1426 {
   1427     return prov != NULL ? prov->provctx : NULL;
   1428 }
   1429 
   1430 /*
   1431  * This function only does something once when store->use_fallbacks == 1,
   1432  * and then sets store->use_fallbacks = 0, so the second call and so on is
   1433  * effectively a no-op.
   1434  */
   1435 static int provider_activate_fallbacks(struct provider_store_st *store)
   1436 {
   1437     int use_fallbacks;
   1438     int activated_fallback_count = 0;
   1439     int ret = 0;
   1440     const OSSL_PROVIDER_INFO *p;
   1441 
   1442     if (!CRYPTO_THREAD_read_lock(store->lock))
   1443         return 0;
   1444     use_fallbacks = store->use_fallbacks;
   1445     CRYPTO_THREAD_unlock(store->lock);
   1446     if (!use_fallbacks)
   1447         return 1;
   1448 
   1449     if (!CRYPTO_THREAD_write_lock(store->lock))
   1450         return 0;
   1451     /* Check again, just in case another thread changed it */
   1452     use_fallbacks = store->use_fallbacks;
   1453     if (!use_fallbacks) {
   1454         CRYPTO_THREAD_unlock(store->lock);
   1455         return 1;
   1456     }
   1457 
   1458     for (p = ossl_predefined_providers; p->name != NULL; p++) {
   1459         OSSL_PROVIDER *prov = NULL;
   1460         OSSL_PROVIDER_INFO *info = store->provinfo;
   1461         STACK_OF(INFOPAIR) *params = NULL;
   1462         size_t i;
   1463 
   1464         if (!p->is_fallback)
   1465             continue;
   1466 
   1467         for (i = 0; i < store->numprovinfo; info++, i++) {
   1468             if (strcmp(info->name, p->name) != 0)
   1469                 continue;
   1470             params = info->parameters;
   1471             break;
   1472         }
   1473 
   1474         /*
   1475          * We use the internal constructor directly here,
   1476          * otherwise we get a call loop
   1477          */
   1478         prov = provider_new(p->name, p->init, params);
   1479         if (prov == NULL)
   1480             goto err;
   1481         prov->libctx = store->libctx;
   1482 #ifndef FIPS_MODULE
   1483         prov->error_lib = ERR_get_next_error_library();
   1484 #endif
   1485 
   1486         /*
   1487          * We are calling provider_activate while holding the store lock. This
   1488          * means the init function will be called while holding a lock. Normally
   1489          * we try to avoid calling a user callback while holding a lock.
   1490          * However, fallbacks are never third party providers so we accept this.
   1491          */
   1492         if (provider_activate(prov, 0, 0) < 0) {
   1493             ossl_provider_free(prov);
   1494             goto err;
   1495         }
   1496         prov->store = store;
   1497         if (sk_OSSL_PROVIDER_push(store->providers, prov) == 0) {
   1498             ossl_provider_free(prov);
   1499             goto err;
   1500         }
   1501         activated_fallback_count++;
   1502     }
   1503 
   1504     if (activated_fallback_count > 0) {
   1505         store->use_fallbacks = 0;
   1506         ret = 1;
   1507     }
   1508 err:
   1509     CRYPTO_THREAD_unlock(store->lock);
   1510     return ret;
   1511 }
   1512 
   1513 int ossl_provider_activate_fallbacks(OSSL_LIB_CTX *ctx)
   1514 {
   1515     struct provider_store_st *store = get_provider_store(ctx);
   1516 
   1517     if (store == NULL)
   1518         return 0;
   1519 
   1520     return provider_activate_fallbacks(store);
   1521 }
   1522 
   1523 int ossl_provider_doall_activated(OSSL_LIB_CTX *ctx,
   1524     int (*cb)(OSSL_PROVIDER *provider,
   1525         void *cbdata),
   1526     void *cbdata)
   1527 {
   1528     int ret = 0, curr, max, ref = 0;
   1529     struct provider_store_st *store = get_provider_store(ctx);
   1530     STACK_OF(OSSL_PROVIDER) *provs = NULL;
   1531 
   1532 #if !defined(FIPS_MODULE) && !defined(OPENSSL_NO_AUTOLOAD_CONFIG)
   1533     /*
   1534      * Make sure any providers are loaded from config before we try to use
   1535      * them.
   1536      */
   1537     if (ossl_lib_ctx_is_default(ctx))
   1538         OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CONFIG, NULL);
   1539 #endif
   1540 
   1541     if (store == NULL)
   1542         return 1;
   1543     if (!provider_activate_fallbacks(store))
   1544         return 0;
   1545 
   1546     /*
   1547      * Under lock, grab a copy of the provider list and up_ref each
   1548      * provider so that they don't disappear underneath us.
   1549      */
   1550     if (!CRYPTO_THREAD_read_lock(store->lock))
   1551         return 0;
   1552     provs = sk_OSSL_PROVIDER_dup(store->providers);
   1553     if (provs == NULL) {
   1554         CRYPTO_THREAD_unlock(store->lock);
   1555         return 0;
   1556     }
   1557     max = sk_OSSL_PROVIDER_num(provs);
   1558     /*
   1559      * We work backwards through the stack so that we can safely delete items
   1560      * as we go.
   1561      */
   1562     for (curr = max - 1; curr >= 0; curr--) {
   1563         OSSL_PROVIDER *prov = sk_OSSL_PROVIDER_value(provs, curr);
   1564 
   1565         if (!CRYPTO_THREAD_read_lock(prov->flag_lock))
   1566             goto err_unlock;
   1567         if (prov->flag_activated) {
   1568             /*
   1569              * We call CRYPTO_UP_REF directly rather than ossl_provider_up_ref
   1570              * to avoid upping the ref count on the parent provider, which we
   1571              * must not do while holding locks.
   1572              */
   1573             if (CRYPTO_UP_REF(&prov->refcnt, &ref) <= 0) {
   1574                 CRYPTO_THREAD_unlock(prov->flag_lock);
   1575                 goto err_unlock;
   1576             }
   1577             /*
   1578              * It's already activated, but we up the activated count to ensure
   1579              * it remains activated until after we've called the user callback.
   1580              * In theory this could mean the parent provider goes inactive,
   1581              * whilst still activated in the child for a short period. That's ok.
   1582              */
   1583             if (!CRYPTO_atomic_add(&prov->activatecnt, 1, &ref,
   1584                     prov->activatecnt_lock)) {
   1585                 CRYPTO_DOWN_REF(&prov->refcnt, &ref);
   1586                 CRYPTO_THREAD_unlock(prov->flag_lock);
   1587                 goto err_unlock;
   1588             }
   1589         } else {
   1590             sk_OSSL_PROVIDER_delete(provs, curr);
   1591             max--;
   1592         }
   1593         CRYPTO_THREAD_unlock(prov->flag_lock);
   1594     }
   1595     CRYPTO_THREAD_unlock(store->lock);
   1596 
   1597     /*
   1598      * Now, we sweep through all providers not under lock
   1599      */
   1600     for (curr = 0; curr < max; curr++) {
   1601         OSSL_PROVIDER *prov = sk_OSSL_PROVIDER_value(provs, curr);
   1602 
   1603         if (!cb(prov, cbdata)) {
   1604             curr = -1;
   1605             goto finish;
   1606         }
   1607     }
   1608     curr = -1;
   1609 
   1610     ret = 1;
   1611     goto finish;
   1612 
   1613 err_unlock:
   1614     CRYPTO_THREAD_unlock(store->lock);
   1615 finish:
   1616     /*
   1617      * The pop_free call doesn't do what we want on an error condition. We
   1618      * either start from the first item in the stack, or part way through if
   1619      * we only processed some of the items.
   1620      */
   1621     for (curr++; curr < max; curr++) {
   1622         OSSL_PROVIDER *prov = sk_OSSL_PROVIDER_value(provs, curr);
   1623 
   1624         if (!CRYPTO_atomic_add(&prov->activatecnt, -1, &ref,
   1625                 prov->activatecnt_lock)) {
   1626             ret = 0;
   1627             continue;
   1628         }
   1629         if (ref < 1) {
   1630             /*
   1631              * Looks like we need to deactivate properly. We could just have
   1632              * done this originally, but it involves taking a write lock so
   1633              * we avoid it. We up the count again and do a full deactivation
   1634              */
   1635             if (CRYPTO_atomic_add(&prov->activatecnt, 1, &ref,
   1636                     prov->activatecnt_lock))
   1637                 provider_deactivate(prov, 0, 1);
   1638             else
   1639                 ret = 0;
   1640         }
   1641         /*
   1642          * As above where we did the up-ref, we don't call ossl_provider_free
   1643          * to avoid making upcalls. There should always be at least one ref
   1644          * to the provider in the store, so this should never drop to 0.
   1645          */
   1646         if (!CRYPTO_DOWN_REF(&prov->refcnt, &ref)) {
   1647             ret = 0;
   1648             continue;
   1649         }
   1650         /*
   1651          * Not much we can do if this assert ever fails. So we don't use
   1652          * ossl_assert here.
   1653          */
   1654         assert(ref > 0);
   1655     }
   1656     sk_OSSL_PROVIDER_free(provs);
   1657     return ret;
   1658 }
   1659 
   1660 int OSSL_PROVIDER_available(OSSL_LIB_CTX *libctx, const char *name)
   1661 {
   1662     OSSL_PROVIDER *prov = NULL;
   1663     int available = 0;
   1664     struct provider_store_st *store = get_provider_store(libctx);
   1665 
   1666     if (store == NULL || !provider_activate_fallbacks(store))
   1667         return 0;
   1668 
   1669     prov = ossl_provider_find(libctx, name, 0);
   1670     if (prov != NULL) {
   1671         if (!CRYPTO_THREAD_read_lock(prov->flag_lock))
   1672             return 0;
   1673         available = prov->flag_activated;
   1674         CRYPTO_THREAD_unlock(prov->flag_lock);
   1675         ossl_provider_free(prov);
   1676     }
   1677     return available;
   1678 }
   1679 
   1680 /* Getters of Provider Object data */
   1681 const char *ossl_provider_name(const OSSL_PROVIDER *prov)
   1682 {
   1683     return prov->name;
   1684 }
   1685 
   1686 const DSO *ossl_provider_dso(const OSSL_PROVIDER *prov)
   1687 {
   1688     return prov->module;
   1689 }
   1690 
   1691 const char *ossl_provider_module_name(const OSSL_PROVIDER *prov)
   1692 {
   1693 #ifdef FIPS_MODULE
   1694     return NULL;
   1695 #else
   1696     return DSO_get_filename(prov->module);
   1697 #endif
   1698 }
   1699 
   1700 const char *ossl_provider_module_path(const OSSL_PROVIDER *prov)
   1701 {
   1702 #ifdef FIPS_MODULE
   1703     return NULL;
   1704 #else
   1705     /* FIXME: Ensure it's a full path */
   1706     return DSO_get_filename(prov->module);
   1707 #endif
   1708 }
   1709 
   1710 const OSSL_DISPATCH *ossl_provider_get0_dispatch(const OSSL_PROVIDER *prov)
   1711 {
   1712     if (prov != NULL)
   1713         return prov->dispatch;
   1714 
   1715     return NULL;
   1716 }
   1717 
   1718 OSSL_LIB_CTX *ossl_provider_libctx(const OSSL_PROVIDER *prov)
   1719 {
   1720     return prov != NULL ? prov->libctx : NULL;
   1721 }
   1722 
   1723 /**
   1724  * @brief Tears down the given provider.
   1725  *
   1726  * This function calls the `teardown` callback of the given provider to release
   1727  * any resources associated with it. The teardown is skipped if the callback is
   1728  * not defined or, in non-FIPS builds, if the provider is a child.
   1729  *
   1730  * @param prov Pointer to the OSSL_PROVIDER structure representing the provider.
   1731  *
   1732  * If tracing is enabled, a message is printed indicating that the teardown is
   1733  * being called.
   1734  */
   1735 void ossl_provider_teardown(const OSSL_PROVIDER *prov)
   1736 {
   1737     if (prov->teardown != NULL
   1738 #ifndef FIPS_MODULE
   1739         && !prov->ischild
   1740 #endif
   1741     ) {
   1742 #ifndef FIPS_MODULE
   1743         OSSL_TRACE_BEGIN(PROVIDER)
   1744         {
   1745             BIO_printf(trc_out, "(provider %s) calling teardown\n",
   1746                 ossl_provider_name(prov));
   1747         }
   1748         OSSL_TRACE_END(PROVIDER);
   1749 #endif
   1750         prov->teardown(prov->provctx);
   1751     }
   1752 }
   1753 
   1754 /**
   1755  * @brief Retrieves the parameters that can be obtained from a provider.
   1756  *
   1757  * This function calls the `gettable_params` callback of the given provider to
   1758  * get a list of parameters that can be retrieved.
   1759  *
   1760  * @param prov Pointer to the OSSL_PROVIDER structure representing the provider.
   1761  *
   1762  * @return Pointer to an array of OSSL_PARAM structures that represent the
   1763  *         gettable parameters, or NULL if the callback is not defined.
   1764  *
   1765  * If tracing is enabled, the gettable parameters are printed for debugging.
   1766  */
   1767 const OSSL_PARAM *ossl_provider_gettable_params(const OSSL_PROVIDER *prov)
   1768 {
   1769     const OSSL_PARAM *ret = NULL;
   1770 
   1771     if (prov->gettable_params != NULL)
   1772         ret = prov->gettable_params(prov->provctx);
   1773 
   1774 #ifndef FIPS_MODULE
   1775     OSSL_TRACE_BEGIN(PROVIDER)
   1776     {
   1777         char *buf = NULL;
   1778 
   1779         BIO_printf(trc_out, "(provider %s) gettable params\n",
   1780             ossl_provider_name(prov));
   1781         BIO_printf(trc_out, "Parameters:\n");
   1782         if (prov->gettable_params != NULL) {
   1783             if (!OSSL_PARAM_print_to_bio(ret, trc_out, 0))
   1784                 BIO_printf(trc_out, "Failed to parse param values\n");
   1785             OPENSSL_free(buf);
   1786         } else {
   1787             BIO_printf(trc_out, "Provider doesn't implement gettable_params\n");
   1788         }
   1789     }
   1790     OSSL_TRACE_END(PROVIDER);
   1791 #endif
   1792 
   1793     return ret;
   1794 }
   1795 
   1796 /**
   1797  * @brief Retrieves parameters from a provider.
   1798  *
   1799  * This function calls the `get_params` callback of the given provider to
   1800  * retrieve its parameters. If the callback is defined, it is invoked with the
   1801  * provider context and the parameters array.
   1802  *
   1803  * @param prov Pointer to the OSSL_PROVIDER structure representing the provider.
   1804  * @param params Array of OSSL_PARAM structures to store the retrieved parameters.
   1805  *
   1806  * @return 1 on success, 0 if the `get_params` callback is not defined or fails.
   1807  *
   1808  * If tracing is enabled, the retrieved parameters are printed for debugging.
   1809  */
   1810 int ossl_provider_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[])
   1811 {
   1812     int ret;
   1813 
   1814     if (prov->get_params == NULL)
   1815         return 0;
   1816 
   1817     ret = prov->get_params(prov->provctx, params);
   1818 #ifndef FIPS_MODULE
   1819     OSSL_TRACE_BEGIN(PROVIDER)
   1820     {
   1821 
   1822         BIO_printf(trc_out,
   1823             "(provider %s) calling get_params\n", prov->name);
   1824         if (ret == 1) {
   1825             BIO_printf(trc_out, "Parameters:\n");
   1826             if (!OSSL_PARAM_print_to_bio(params, trc_out, 1))
   1827                 BIO_printf(trc_out, "Failed to parse param values\n");
   1828         } else {
   1829             BIO_printf(trc_out, "get_params call failed\n");
   1830         }
   1831     }
   1832     OSSL_TRACE_END(PROVIDER);
   1833 #endif
   1834     return ret;
   1835 }
   1836 
   1837 /**
   1838  * @brief Performs a self-test on the given provider.
   1839  *
   1840  * This function calls the `self_test` callback of the given provider to
   1841  * perform a self-test. If the callback is not defined, it assumes the test
   1842  * passed.
   1843  *
   1844  * @param prov Pointer to the OSSL_PROVIDER structure representing the provider.
   1845  *
   1846  * @return 1 if the self-test passes or the callback is not defined, 0 on failure.
   1847  *
   1848  * If tracing is enabled, the result of the self-test is printed for debugging.
   1849  * If the test fails, the provider's store methods are removed.
   1850  */
   1851 int ossl_provider_self_test(const OSSL_PROVIDER *prov)
   1852 {
   1853     int ret = 1;
   1854 
   1855     if (prov->self_test != NULL)
   1856         ret = prov->self_test(prov->provctx);
   1857 
   1858 #ifndef FIPS_MODULE
   1859     OSSL_TRACE_BEGIN(PROVIDER)
   1860     {
   1861         if (prov->self_test != NULL)
   1862             BIO_printf(trc_out,
   1863                 "(provider %s) Calling self_test, ret = %d\n",
   1864                 prov->name, ret);
   1865         else
   1866             BIO_printf(trc_out,
   1867                 "(provider %s) doesn't implement self_test\n",
   1868                 prov->name);
   1869     }
   1870     OSSL_TRACE_END(PROVIDER);
   1871 #endif
   1872     if (ret == 0)
   1873         (void)provider_remove_store_methods((OSSL_PROVIDER *)prov);
   1874     return ret;
   1875 }
   1876 
   1877 /**
   1878  * @brief Retrieves capabilities from the given provider.
   1879  *
   1880  * This function calls the `get_capabilities` callback of the specified provider
   1881  * to retrieve capabilities information. The callback is invoked with the
   1882  * provider context, capability name, a callback function, and an argument.
   1883  *
   1884  * @param prov Pointer to the OSSL_PROVIDER structure representing the provider.
   1885  * @param capability String representing the capability to be retrieved.
   1886  * @param cb Callback function to process the capability data.
   1887  * @param arg Argument to be passed to the callback function.
   1888  *
   1889  * @return 1 if the capabilities are successfully retrieved or if the callback
   1890  *         is not defined, otherwise the value returned by `get_capabilities`.
   1891  *
   1892  * If tracing is enabled, a message is printed indicating the requested
   1893  * capabilities.
   1894  */
   1895 int ossl_provider_random_bytes(const OSSL_PROVIDER *prov, int which,
   1896     void *buf, size_t n, unsigned int strength)
   1897 {
   1898     return prov->random_bytes == NULL ? 0
   1899                                       : prov->random_bytes(prov->provctx, which,
   1900                                             buf, n, strength);
   1901 }
   1902 
   1903 int ossl_provider_get_capabilities(const OSSL_PROVIDER *prov,
   1904     const char *capability,
   1905     OSSL_CALLBACK *cb,
   1906     void *arg)
   1907 {
   1908     if (prov->get_capabilities != NULL) {
   1909 #ifndef FIPS_MODULE
   1910         OSSL_TRACE_BEGIN(PROVIDER)
   1911         {
   1912             BIO_printf(trc_out,
   1913                 "(provider %s) Calling get_capabilities "
   1914                 "with capabilities %s\n",
   1915                 prov->name,
   1916                 capability == NULL ? "none" : capability);
   1917         }
   1918         OSSL_TRACE_END(PROVIDER);
   1919 #endif
   1920         return prov->get_capabilities(prov->provctx, capability, cb, arg);
   1921     }
   1922     return 1;
   1923 }
   1924 
   1925 /**
   1926  * @brief Queries the provider for available algorithms for a given operation.
   1927  *
   1928  * This function calls the `query_operation` callback of the specified provider
   1929  * to obtain a list of algorithms that can perform the given operation. It may
   1930  * also set a flag indicating whether the result should be cached.
   1931  *
   1932  * @param prov Pointer to the OSSL_PROVIDER structure representing the provider.
   1933  * @param operation_id Identifier of the operation to query.
   1934  * @param no_cache Pointer to an integer flag to indicate whether caching is allowed.
   1935  *
   1936  * @return Pointer to an array of OSSL_ALGORITHM structures representing the
   1937  *         available algorithms, or NULL if the callback is not defined or
   1938  *         there are no available algorithms.
   1939  *
   1940  * If tracing is enabled, the available algorithms and their properties are
   1941  * printed for debugging.
   1942  */
   1943 const OSSL_ALGORITHM *ossl_provider_query_operation(const OSSL_PROVIDER *prov,
   1944     int operation_id,
   1945     int *no_cache)
   1946 {
   1947     const OSSL_ALGORITHM *res;
   1948 
   1949     if (prov->query_operation == NULL) {
   1950 #ifndef FIPS_MODULE
   1951         OSSL_TRACE_BEGIN(PROVIDER)
   1952         {
   1953             BIO_printf(trc_out, "provider %s lacks query operation!\n",
   1954                 prov->name);
   1955         }
   1956         OSSL_TRACE_END(PROVIDER);
   1957 #endif
   1958         return NULL;
   1959     }
   1960 
   1961     res = prov->query_operation(prov->provctx, operation_id, no_cache);
   1962 #ifndef FIPS_MODULE
   1963     OSSL_TRACE_BEGIN(PROVIDER)
   1964     {
   1965         const OSSL_ALGORITHM *idx;
   1966         if (res != NULL) {
   1967             BIO_printf(trc_out,
   1968                 "(provider %s) Calling query, available algs are:\n", prov->name);
   1969 
   1970             for (idx = res; idx->algorithm_names != NULL; idx++) {
   1971                 BIO_printf(trc_out,
   1972                     "(provider %s) names %s, prop_def %s, desc %s\n",
   1973                     prov->name,
   1974                     idx->algorithm_names == NULL ? "none" : idx->algorithm_names,
   1975                     idx->property_definition == NULL ? "none" : idx->property_definition,
   1976                     idx->algorithm_description == NULL ? "none" : idx->algorithm_description);
   1977             }
   1978         } else {
   1979             BIO_printf(trc_out, "(provider %s) query_operation failed\n", prov->name);
   1980         }
   1981     }
   1982     OSSL_TRACE_END(PROVIDER);
   1983 #endif
   1984 
   1985 #if defined(OPENSSL_NO_CACHED_FETCH)
   1986     /* Forcing the non-caching of queries */
   1987     if (no_cache != NULL)
   1988         *no_cache = 1;
   1989 #endif
   1990     return res;
   1991 }
   1992 
   1993 /**
   1994  * @brief Releases resources associated with a queried operation.
   1995  *
   1996  * This function calls the `unquery_operation` callback of the specified
   1997  * provider to release any resources related to a previously queried operation.
   1998  *
   1999  * @param prov Pointer to the OSSL_PROVIDER structure representing the provider.
   2000  * @param operation_id Identifier of the operation to unquery.
   2001  * @param algs Pointer to the OSSL_ALGORITHM structures representing the
   2002  *             algorithms associated with the operation.
   2003  *
   2004  * If tracing is enabled, a message is printed indicating that the operation
   2005  * is being unqueried.
   2006  */
   2007 void ossl_provider_unquery_operation(const OSSL_PROVIDER *prov,
   2008     int operation_id,
   2009     const OSSL_ALGORITHM *algs)
   2010 {
   2011     if (prov->unquery_operation != NULL) {
   2012 #ifndef FIPS_MODULE
   2013         OSSL_TRACE_BEGIN(PROVIDER)
   2014         {
   2015             BIO_printf(trc_out,
   2016                 "(provider %s) Calling unquery"
   2017                 " with operation %d\n",
   2018                 prov->name,
   2019                 operation_id);
   2020         }
   2021         OSSL_TRACE_END(PROVIDER);
   2022 #endif
   2023         prov->unquery_operation(prov->provctx, operation_id, algs);
   2024     }
   2025 }
   2026 
   2027 int ossl_provider_set_operation_bit(OSSL_PROVIDER *provider, size_t bitnum)
   2028 {
   2029     size_t byte = bitnum / 8;
   2030     unsigned char bit = (1 << (bitnum % 8)) & 0xFF;
   2031 
   2032     if (!CRYPTO_THREAD_write_lock(provider->opbits_lock))
   2033         return 0;
   2034     if (provider->operation_bits_sz <= byte) {
   2035         unsigned char *tmp = OPENSSL_realloc(provider->operation_bits,
   2036             byte + 1);
   2037 
   2038         if (tmp == NULL) {
   2039             CRYPTO_THREAD_unlock(provider->opbits_lock);
   2040             return 0;
   2041         }
   2042         provider->operation_bits = tmp;
   2043         memset(provider->operation_bits + provider->operation_bits_sz,
   2044             '\0', byte + 1 - provider->operation_bits_sz);
   2045         provider->operation_bits_sz = byte + 1;
   2046     }
   2047     provider->operation_bits[byte] |= bit;
   2048     CRYPTO_THREAD_unlock(provider->opbits_lock);
   2049     return 1;
   2050 }
   2051 
   2052 int ossl_provider_test_operation_bit(OSSL_PROVIDER *provider, size_t bitnum,
   2053     int *result)
   2054 {
   2055     size_t byte = bitnum / 8;
   2056     unsigned char bit = (1 << (bitnum % 8)) & 0xFF;
   2057 
   2058     if (!ossl_assert(result != NULL)) {
   2059         ERR_raise(ERR_LIB_CRYPTO, ERR_R_PASSED_NULL_PARAMETER);
   2060         return 0;
   2061     }
   2062 
   2063     *result = 0;
   2064     if (!CRYPTO_THREAD_read_lock(provider->opbits_lock))
   2065         return 0;
   2066     if (provider->operation_bits_sz > byte)
   2067         *result = ((provider->operation_bits[byte] & bit) != 0);
   2068     CRYPTO_THREAD_unlock(provider->opbits_lock);
   2069     return 1;
   2070 }
   2071 
   2072 #ifndef FIPS_MODULE
   2073 const OSSL_CORE_HANDLE *ossl_provider_get_parent(OSSL_PROVIDER *prov)
   2074 {
   2075     return prov->handle;
   2076 }
   2077 
   2078 int ossl_provider_is_child(const OSSL_PROVIDER *prov)
   2079 {
   2080     return prov->ischild;
   2081 }
   2082 
   2083 int ossl_provider_set_child(OSSL_PROVIDER *prov, const OSSL_CORE_HANDLE *handle)
   2084 {
   2085     prov->handle = handle;
   2086     prov->ischild = 1;
   2087 
   2088     return 1;
   2089 }
   2090 
   2091 int ossl_provider_default_props_update(OSSL_LIB_CTX *libctx, const char *props)
   2092 {
   2093 #ifndef FIPS_MODULE
   2094     struct provider_store_st *store = NULL;
   2095     int i, max;
   2096     OSSL_PROVIDER_CHILD_CB *child_cb;
   2097 
   2098     if ((store = get_provider_store(libctx)) == NULL)
   2099         return 0;
   2100 
   2101     if (!CRYPTO_THREAD_read_lock(store->lock))
   2102         return 0;
   2103 
   2104     max = sk_OSSL_PROVIDER_CHILD_CB_num(store->child_cbs);
   2105     for (i = 0; i < max; i++) {
   2106         child_cb = sk_OSSL_PROVIDER_CHILD_CB_value(store->child_cbs, i);
   2107         child_cb->global_props_cb(props, child_cb->cbdata);
   2108     }
   2109 
   2110     CRYPTO_THREAD_unlock(store->lock);
   2111 #endif
   2112     return 1;
   2113 }
   2114 
   2115 static int ossl_provider_register_child_cb(const OSSL_CORE_HANDLE *handle,
   2116     int (*create_cb)(
   2117         const OSSL_CORE_HANDLE *provider,
   2118         void *cbdata),
   2119     int (*remove_cb)(
   2120         const OSSL_CORE_HANDLE *provider,
   2121         void *cbdata),
   2122     int (*global_props_cb)(
   2123         const char *props,
   2124         void *cbdata),
   2125     void *cbdata)
   2126 {
   2127     /*
   2128      * This is really an OSSL_PROVIDER that we created and cast to
   2129      * OSSL_CORE_HANDLE originally. Therefore it is safe to cast it back.
   2130      */
   2131     OSSL_PROVIDER *thisprov = (OSSL_PROVIDER *)handle;
   2132     OSSL_PROVIDER *prov;
   2133     OSSL_LIB_CTX *libctx = thisprov->libctx;
   2134     struct provider_store_st *store = NULL;
   2135     int ret = 0, i, max;
   2136     OSSL_PROVIDER_CHILD_CB *child_cb;
   2137     char *propsstr = NULL;
   2138 
   2139     if ((store = get_provider_store(libctx)) == NULL)
   2140         return 0;
   2141 
   2142     child_cb = OPENSSL_malloc(sizeof(*child_cb));
   2143     if (child_cb == NULL)
   2144         return 0;
   2145     child_cb->prov = thisprov;
   2146     child_cb->create_cb = create_cb;
   2147     child_cb->remove_cb = remove_cb;
   2148     child_cb->global_props_cb = global_props_cb;
   2149     child_cb->cbdata = cbdata;
   2150 
   2151     if (!CRYPTO_THREAD_write_lock(store->lock)) {
   2152         OPENSSL_free(child_cb);
   2153         return 0;
   2154     }
   2155     propsstr = evp_get_global_properties_str(libctx, 0);
   2156 
   2157     if (propsstr != NULL) {
   2158         global_props_cb(propsstr, cbdata);
   2159         OPENSSL_free(propsstr);
   2160     }
   2161     max = sk_OSSL_PROVIDER_num(store->providers);
   2162     for (i = 0; i < max; i++) {
   2163         int activated;
   2164 
   2165         prov = sk_OSSL_PROVIDER_value(store->providers, i);
   2166 
   2167         if (!CRYPTO_THREAD_read_lock(prov->flag_lock))
   2168             break;
   2169         activated = prov->flag_activated;
   2170         CRYPTO_THREAD_unlock(prov->flag_lock);
   2171         /*
   2172          * We hold the store lock while calling the user callback. This means
   2173          * that the user callback must be short and simple and not do anything
   2174          * likely to cause a deadlock. We don't hold the flag_lock during this
   2175          * call. In theory this means that another thread could deactivate it
   2176          * while we are calling create. This is ok because the other thread
   2177          * will also call remove_cb, but won't be able to do so until we release
   2178          * the store lock.
   2179          */
   2180         if (activated && !create_cb((OSSL_CORE_HANDLE *)prov, cbdata))
   2181             break;
   2182     }
   2183     if (i == max) {
   2184         /* Success */
   2185         ret = sk_OSSL_PROVIDER_CHILD_CB_push(store->child_cbs, child_cb);
   2186     }
   2187     if (i != max || ret <= 0) {
   2188         /* Failed during creation. Remove everything we just added */
   2189         for (; i >= 0; i--) {
   2190             prov = sk_OSSL_PROVIDER_value(store->providers, i);
   2191             remove_cb((OSSL_CORE_HANDLE *)prov, cbdata);
   2192         }
   2193         OPENSSL_free(child_cb);
   2194         ret = 0;
   2195     }
   2196     CRYPTO_THREAD_unlock(store->lock);
   2197 
   2198     return ret;
   2199 }
   2200 
   2201 static void ossl_provider_deregister_child_cb(const OSSL_CORE_HANDLE *handle)
   2202 {
   2203     /*
   2204      * This is really an OSSL_PROVIDER that we created and cast to
   2205      * OSSL_CORE_HANDLE originally. Therefore it is safe to cast it back.
   2206      */
   2207     OSSL_PROVIDER *thisprov = (OSSL_PROVIDER *)handle;
   2208     OSSL_LIB_CTX *libctx = thisprov->libctx;
   2209     struct provider_store_st *store = NULL;
   2210     int i, max;
   2211     OSSL_PROVIDER_CHILD_CB *child_cb;
   2212 
   2213     if ((store = get_provider_store(libctx)) == NULL)
   2214         return;
   2215 
   2216     if (!CRYPTO_THREAD_write_lock(store->lock))
   2217         return;
   2218     max = sk_OSSL_PROVIDER_CHILD_CB_num(store->child_cbs);
   2219     for (i = 0; i < max; i++) {
   2220         child_cb = sk_OSSL_PROVIDER_CHILD_CB_value(store->child_cbs, i);
   2221         if (child_cb->prov == thisprov) {
   2222             /* Found an entry */
   2223             sk_OSSL_PROVIDER_CHILD_CB_delete(store->child_cbs, i);
   2224             OPENSSL_free(child_cb);
   2225             break;
   2226         }
   2227     }
   2228     CRYPTO_THREAD_unlock(store->lock);
   2229 }
   2230 #endif
   2231 
   2232 /*-
   2233  * Core functions for the provider
   2234  * ===============================
   2235  *
   2236  * This is the set of functions that the core makes available to the provider
   2237  */
   2238 
   2239 /*
   2240  * This returns a list of Provider Object parameters with their types, for
   2241  * discovery.  We do not expect that many providers will use this, but one
   2242  * never knows.
   2243  */
   2244 static const OSSL_PARAM param_types[] = {
   2245     OSSL_PARAM_DEFN(OSSL_PROV_PARAM_CORE_VERSION, OSSL_PARAM_UTF8_PTR, NULL, 0),
   2246     OSSL_PARAM_DEFN(OSSL_PROV_PARAM_CORE_PROV_NAME, OSSL_PARAM_UTF8_PTR,
   2247         NULL, 0),
   2248 #ifndef FIPS_MODULE
   2249     OSSL_PARAM_DEFN(OSSL_PROV_PARAM_CORE_MODULE_FILENAME, OSSL_PARAM_UTF8_PTR,
   2250         NULL, 0),
   2251 #endif
   2252     OSSL_PARAM_END
   2253 };
   2254 
   2255 /*
   2256  * Forward declare all the functions that are provided aa dispatch.
   2257  * This ensures that the compiler will complain if they aren't defined
   2258  * with the correct signature.
   2259  */
   2260 static OSSL_FUNC_core_gettable_params_fn core_gettable_params;
   2261 static OSSL_FUNC_core_get_params_fn core_get_params;
   2262 static OSSL_FUNC_core_get_libctx_fn core_get_libctx;
   2263 static OSSL_FUNC_core_thread_start_fn core_thread_start;
   2264 #ifndef FIPS_MODULE
   2265 static OSSL_FUNC_core_new_error_fn core_new_error;
   2266 static OSSL_FUNC_core_set_error_debug_fn core_set_error_debug;
   2267 static OSSL_FUNC_core_vset_error_fn core_vset_error;
   2268 static OSSL_FUNC_core_set_error_mark_fn core_set_error_mark;
   2269 static OSSL_FUNC_core_clear_last_error_mark_fn core_clear_last_error_mark;
   2270 static OSSL_FUNC_core_pop_error_to_mark_fn core_pop_error_to_mark;
   2271 OSSL_FUNC_BIO_new_file_fn ossl_core_bio_new_file;
   2272 OSSL_FUNC_BIO_new_membuf_fn ossl_core_bio_new_mem_buf;
   2273 OSSL_FUNC_BIO_read_ex_fn ossl_core_bio_read_ex;
   2274 OSSL_FUNC_BIO_write_ex_fn ossl_core_bio_write_ex;
   2275 OSSL_FUNC_BIO_gets_fn ossl_core_bio_gets;
   2276 OSSL_FUNC_BIO_puts_fn ossl_core_bio_puts;
   2277 OSSL_FUNC_BIO_up_ref_fn ossl_core_bio_up_ref;
   2278 OSSL_FUNC_BIO_free_fn ossl_core_bio_free;
   2279 OSSL_FUNC_BIO_vprintf_fn ossl_core_bio_vprintf;
   2280 OSSL_FUNC_BIO_vsnprintf_fn BIO_vsnprintf;
   2281 static OSSL_FUNC_indicator_cb_fn core_indicator_get_callback;
   2282 static OSSL_FUNC_self_test_cb_fn core_self_test_get_callback;
   2283 static OSSL_FUNC_get_entropy_fn rand_get_entropy;
   2284 static OSSL_FUNC_get_user_entropy_fn rand_get_user_entropy;
   2285 static OSSL_FUNC_cleanup_entropy_fn rand_cleanup_entropy;
   2286 static OSSL_FUNC_cleanup_user_entropy_fn rand_cleanup_user_entropy;
   2287 static OSSL_FUNC_get_nonce_fn rand_get_nonce;
   2288 static OSSL_FUNC_get_user_nonce_fn rand_get_user_nonce;
   2289 static OSSL_FUNC_cleanup_nonce_fn rand_cleanup_nonce;
   2290 static OSSL_FUNC_cleanup_user_nonce_fn rand_cleanup_user_nonce;
   2291 #endif
   2292 OSSL_FUNC_CRYPTO_malloc_fn CRYPTO_malloc;
   2293 OSSL_FUNC_CRYPTO_zalloc_fn CRYPTO_zalloc;
   2294 OSSL_FUNC_CRYPTO_free_fn CRYPTO_free;
   2295 OSSL_FUNC_CRYPTO_clear_free_fn CRYPTO_clear_free;
   2296 OSSL_FUNC_CRYPTO_realloc_fn CRYPTO_realloc;
   2297 OSSL_FUNC_CRYPTO_clear_realloc_fn CRYPTO_clear_realloc;
   2298 OSSL_FUNC_CRYPTO_secure_malloc_fn CRYPTO_secure_malloc;
   2299 OSSL_FUNC_CRYPTO_secure_zalloc_fn CRYPTO_secure_zalloc;
   2300 OSSL_FUNC_CRYPTO_secure_free_fn CRYPTO_secure_free;
   2301 OSSL_FUNC_CRYPTO_secure_clear_free_fn CRYPTO_secure_clear_free;
   2302 OSSL_FUNC_CRYPTO_secure_allocated_fn CRYPTO_secure_allocated;
   2303 OSSL_FUNC_OPENSSL_cleanse_fn OPENSSL_cleanse;
   2304 #ifndef FIPS_MODULE
   2305 OSSL_FUNC_provider_register_child_cb_fn ossl_provider_register_child_cb;
   2306 OSSL_FUNC_provider_deregister_child_cb_fn ossl_provider_deregister_child_cb;
   2307 static OSSL_FUNC_provider_name_fn core_provider_get0_name;
   2308 static OSSL_FUNC_provider_get0_provider_ctx_fn core_provider_get0_provider_ctx;
   2309 static OSSL_FUNC_provider_get0_dispatch_fn core_provider_get0_dispatch;
   2310 static OSSL_FUNC_provider_up_ref_fn core_provider_up_ref_intern;
   2311 static OSSL_FUNC_provider_free_fn core_provider_free_intern;
   2312 static OSSL_FUNC_core_obj_add_sigid_fn core_obj_add_sigid;
   2313 static OSSL_FUNC_core_obj_create_fn core_obj_create;
   2314 #endif
   2315 
   2316 static const OSSL_PARAM *core_gettable_params(const OSSL_CORE_HANDLE *handle)
   2317 {
   2318     return param_types;
   2319 }
   2320 
   2321 static int core_get_params(const OSSL_CORE_HANDLE *handle, OSSL_PARAM params[])
   2322 {
   2323     OSSL_PARAM *p;
   2324     /*
   2325      * We created this object originally and we know it is actually an
   2326      * OSSL_PROVIDER *, so the cast is safe
   2327      */
   2328     OSSL_PROVIDER *prov = (OSSL_PROVIDER *)handle;
   2329 
   2330     if ((p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_CORE_VERSION)) != NULL)
   2331         OSSL_PARAM_set_utf8_ptr(p, OPENSSL_VERSION_STR);
   2332     if ((p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_CORE_PROV_NAME)) != NULL)
   2333         OSSL_PARAM_set_utf8_ptr(p, prov->name);
   2334 
   2335 #ifndef FIPS_MODULE
   2336     if ((p = OSSL_PARAM_locate(params,
   2337              OSSL_PROV_PARAM_CORE_MODULE_FILENAME))
   2338         != NULL)
   2339         OSSL_PARAM_set_utf8_ptr(p, ossl_provider_module_path(prov));
   2340 #endif
   2341 
   2342     return OSSL_PROVIDER_get_conf_parameters(prov, params);
   2343 }
   2344 
   2345 static OPENSSL_CORE_CTX *core_get_libctx(const OSSL_CORE_HANDLE *handle)
   2346 {
   2347     /*
   2348      * We created this object originally and we know it is actually an
   2349      * OSSL_PROVIDER *, so the cast is safe
   2350      */
   2351     OSSL_PROVIDER *prov = (OSSL_PROVIDER *)handle;
   2352 
   2353     /*
   2354      * Using ossl_provider_libctx would be wrong as that returns
   2355      * NULL for |prov| == NULL and NULL libctx has a special meaning
   2356      * that does not apply here. Here |prov| == NULL can happen only in
   2357      * case of a coding error.
   2358      */
   2359     assert(prov != NULL);
   2360     return (OPENSSL_CORE_CTX *)prov->libctx;
   2361 }
   2362 
   2363 static int core_thread_start(const OSSL_CORE_HANDLE *handle,
   2364     OSSL_thread_stop_handler_fn handfn,
   2365     void *arg)
   2366 {
   2367     /*
   2368      * We created this object originally and we know it is actually an
   2369      * OSSL_PROVIDER *, so the cast is safe
   2370      */
   2371     OSSL_PROVIDER *prov = (OSSL_PROVIDER *)handle;
   2372 
   2373     return ossl_init_thread_start(prov, arg, handfn);
   2374 }
   2375 
   2376 /*
   2377  * The FIPS module inner provider doesn't implement these.  They aren't
   2378  * needed there, since the FIPS module upcalls are always the outer provider
   2379  * ones.
   2380  */
   2381 #ifndef FIPS_MODULE
   2382 /*
   2383  * These error functions should use |handle| to select the proper
   2384  * library context to report in the correct error stack if error
   2385  * stacks become tied to the library context.
   2386  * We cannot currently do that since there's no support for it in the
   2387  * ERR subsystem.
   2388  */
   2389 static void core_new_error(const OSSL_CORE_HANDLE *handle)
   2390 {
   2391     ERR_new();
   2392 }
   2393 
   2394 static void core_set_error_debug(const OSSL_CORE_HANDLE *handle,
   2395     const char *file, int line, const char *func)
   2396 {
   2397     ERR_set_debug(file, line, func);
   2398 }
   2399 
   2400 static void core_vset_error(const OSSL_CORE_HANDLE *handle,
   2401     uint32_t reason, const char *fmt, va_list args)
   2402 {
   2403     /*
   2404      * We created this object originally and we know it is actually an
   2405      * OSSL_PROVIDER *, so the cast is safe
   2406      */
   2407     OSSL_PROVIDER *prov = (OSSL_PROVIDER *)handle;
   2408 
   2409     /*
   2410      * If the uppermost 8 bits are non-zero, it's an OpenSSL library
   2411      * error and will be treated as such.  Otherwise, it's a new style
   2412      * provider error and will be treated as such.
   2413      */
   2414     if (ERR_GET_LIB(reason) != 0) {
   2415         ERR_vset_error(ERR_GET_LIB(reason), ERR_GET_REASON(reason), fmt, args);
   2416     } else {
   2417         ERR_vset_error(prov->error_lib, (int)reason, fmt, args);
   2418     }
   2419 }
   2420 
   2421 static int core_set_error_mark(const OSSL_CORE_HANDLE *handle)
   2422 {
   2423     return ERR_set_mark();
   2424 }
   2425 
   2426 static int core_clear_last_error_mark(const OSSL_CORE_HANDLE *handle)
   2427 {
   2428     return ERR_clear_last_mark();
   2429 }
   2430 
   2431 static int core_pop_error_to_mark(const OSSL_CORE_HANDLE *handle)
   2432 {
   2433     return ERR_pop_to_mark();
   2434 }
   2435 
   2436 static int core_count_to_mark(const OSSL_CORE_HANDLE *handle)
   2437 {
   2438     return ERR_count_to_mark();
   2439 }
   2440 
   2441 static void core_indicator_get_callback(OPENSSL_CORE_CTX *libctx,
   2442     OSSL_INDICATOR_CALLBACK **cb)
   2443 {
   2444     OSSL_INDICATOR_get_callback((OSSL_LIB_CTX *)libctx, cb);
   2445 }
   2446 
   2447 static void core_self_test_get_callback(OPENSSL_CORE_CTX *libctx,
   2448     OSSL_CALLBACK **cb, void **cbarg)
   2449 {
   2450     OSSL_SELF_TEST_get_callback((OSSL_LIB_CTX *)libctx, cb, cbarg);
   2451 }
   2452 
   2453 #ifdef OPENSSL_NO_FIPS_JITTER
   2454 static size_t rand_get_entropy(const OSSL_CORE_HANDLE *handle,
   2455     unsigned char **pout, int entropy,
   2456     size_t min_len, size_t max_len)
   2457 {
   2458     return ossl_rand_get_entropy((OSSL_LIB_CTX *)core_get_libctx(handle),
   2459         pout, entropy, min_len, max_len);
   2460 }
   2461 #else
   2462 /*
   2463  * OpenSSL FIPS providers prior to 3.2 call rand_get_entropy API from
   2464  * core, instead of the newer get_user_entropy. Newer API call honors
   2465  * runtime configuration of random seed source and can be configured
   2466  * to use os getranom() or another seed source, such as
   2467  * JITTER. However, 3.0.9 only calls this API. Note that no other
   2468  * providers known to use this, and it is core <-> provider only
   2469  * API. Public facing EVP and getrandom bytes already correctly honor
   2470  * runtime configuration for seed source. There are no other providers
   2471  * packaged in Wolfi, or even known to exist that use this api. Thus
   2472  * it is safe to say any caller of this API is in fact 3.0.9 FIPS
   2473  * provider. Also note that the passed in handle is invalid and cannot
   2474  * be safely dereferences in such cases. Due to a bug in FIPS
   2475  * providers 3.0.0, 3.0.8 and 3.0.9. See
   2476  * https://github.com/openssl/openssl/blob/master/doc/internal/man3/ossl_rand_get_entropy.pod#notes
   2477  */
   2478 size_t ossl_rand_jitter_get_seed(unsigned char **, int, size_t, size_t);
   2479 static size_t rand_get_entropy(const OSSL_CORE_HANDLE *handle,
   2480     unsigned char **pout, int entropy,
   2481     size_t min_len, size_t max_len)
   2482 {
   2483     return ossl_rand_jitter_get_seed(pout, entropy, min_len, max_len);
   2484 }
   2485 #endif
   2486 
   2487 static size_t rand_get_user_entropy(const OSSL_CORE_HANDLE *handle,
   2488     unsigned char **pout, int entropy,
   2489     size_t min_len, size_t max_len)
   2490 {
   2491     return ossl_rand_get_user_entropy((OSSL_LIB_CTX *)core_get_libctx(handle),
   2492         pout, entropy, min_len, max_len);
   2493 }
   2494 
   2495 static void rand_cleanup_entropy(const OSSL_CORE_HANDLE *handle,
   2496     unsigned char *buf, size_t len)
   2497 {
   2498     ossl_rand_cleanup_entropy((OSSL_LIB_CTX *)core_get_libctx(handle),
   2499         buf, len);
   2500 }
   2501 
   2502 static void rand_cleanup_user_entropy(const OSSL_CORE_HANDLE *handle,
   2503     unsigned char *buf, size_t len)
   2504 {
   2505     ossl_rand_cleanup_user_entropy((OSSL_LIB_CTX *)core_get_libctx(handle),
   2506         buf, len);
   2507 }
   2508 
   2509 static size_t rand_get_nonce(const OSSL_CORE_HANDLE *handle,
   2510     unsigned char **pout,
   2511     size_t min_len, size_t max_len,
   2512     const void *salt, size_t salt_len)
   2513 {
   2514     return ossl_rand_get_nonce((OSSL_LIB_CTX *)core_get_libctx(handle),
   2515         pout, min_len, max_len, salt, salt_len);
   2516 }
   2517 
   2518 static size_t rand_get_user_nonce(const OSSL_CORE_HANDLE *handle,
   2519     unsigned char **pout,
   2520     size_t min_len, size_t max_len,
   2521     const void *salt, size_t salt_len)
   2522 {
   2523     return ossl_rand_get_user_nonce((OSSL_LIB_CTX *)core_get_libctx(handle),
   2524         pout, min_len, max_len, salt, salt_len);
   2525 }
   2526 
   2527 static void rand_cleanup_nonce(const OSSL_CORE_HANDLE *handle,
   2528     unsigned char *buf, size_t len)
   2529 {
   2530     ossl_rand_cleanup_nonce((OSSL_LIB_CTX *)core_get_libctx(handle),
   2531         buf, len);
   2532 }
   2533 
   2534 static void rand_cleanup_user_nonce(const OSSL_CORE_HANDLE *handle,
   2535     unsigned char *buf, size_t len)
   2536 {
   2537     ossl_rand_cleanup_user_nonce((OSSL_LIB_CTX *)core_get_libctx(handle),
   2538         buf, len);
   2539 }
   2540 
   2541 static const char *core_provider_get0_name(const OSSL_CORE_HANDLE *prov)
   2542 {
   2543     return OSSL_PROVIDER_get0_name((const OSSL_PROVIDER *)prov);
   2544 }
   2545 
   2546 static void *core_provider_get0_provider_ctx(const OSSL_CORE_HANDLE *prov)
   2547 {
   2548     return OSSL_PROVIDER_get0_provider_ctx((const OSSL_PROVIDER *)prov);
   2549 }
   2550 
   2551 static const OSSL_DISPATCH *
   2552 core_provider_get0_dispatch(const OSSL_CORE_HANDLE *prov)
   2553 {
   2554     return OSSL_PROVIDER_get0_dispatch((const OSSL_PROVIDER *)prov);
   2555 }
   2556 
   2557 static int core_provider_up_ref_intern(const OSSL_CORE_HANDLE *prov,
   2558     int activate)
   2559 {
   2560     return provider_up_ref_intern((OSSL_PROVIDER *)prov, activate);
   2561 }
   2562 
   2563 static int core_provider_free_intern(const OSSL_CORE_HANDLE *prov,
   2564     int deactivate)
   2565 {
   2566     return provider_free_intern((OSSL_PROVIDER *)prov, deactivate);
   2567 }
   2568 
   2569 static int core_obj_add_sigid(const OSSL_CORE_HANDLE *prov,
   2570     const char *sign_name, const char *digest_name,
   2571     const char *pkey_name)
   2572 {
   2573     int sign_nid = OBJ_txt2nid(sign_name);
   2574     int digest_nid = NID_undef;
   2575     int pkey_nid = OBJ_txt2nid(pkey_name);
   2576 
   2577     if (digest_name != NULL && digest_name[0] != '\0'
   2578         && (digest_nid = OBJ_txt2nid(digest_name)) == NID_undef)
   2579         return 0;
   2580 
   2581     if (sign_nid == NID_undef)
   2582         return 0;
   2583 
   2584     /*
   2585      * Check if it already exists. This is a success if so (even if we don't
   2586      * have nids for the digest/pkey)
   2587      */
   2588     if (OBJ_find_sigid_algs(sign_nid, NULL, NULL))
   2589         return 1;
   2590 
   2591     if (pkey_nid == NID_undef)
   2592         return 0;
   2593 
   2594     return OBJ_add_sigid(sign_nid, digest_nid, pkey_nid);
   2595 }
   2596 
   2597 static int core_obj_create(const OSSL_CORE_HANDLE *prov, const char *oid,
   2598     const char *sn, const char *ln)
   2599 {
   2600     /* Check if it already exists and create it if not */
   2601     return OBJ_txt2nid(oid) != NID_undef
   2602         || OBJ_create(oid, sn, ln) != NID_undef;
   2603 }
   2604 #endif /* FIPS_MODULE */
   2605 
   2606 /*
   2607  * Functions provided by the core.
   2608  */
   2609 static const OSSL_DISPATCH core_dispatch_[] = {
   2610     { OSSL_FUNC_CORE_GETTABLE_PARAMS, (void (*)(void))core_gettable_params },
   2611     { OSSL_FUNC_CORE_GET_PARAMS, (void (*)(void))core_get_params },
   2612     { OSSL_FUNC_CORE_GET_LIBCTX, (void (*)(void))core_get_libctx },
   2613     { OSSL_FUNC_CORE_THREAD_START, (void (*)(void))core_thread_start },
   2614 #ifndef FIPS_MODULE
   2615     { OSSL_FUNC_CORE_NEW_ERROR, (void (*)(void))core_new_error },
   2616     { OSSL_FUNC_CORE_SET_ERROR_DEBUG, (void (*)(void))core_set_error_debug },
   2617     { OSSL_FUNC_CORE_VSET_ERROR, (void (*)(void))core_vset_error },
   2618     { OSSL_FUNC_CORE_SET_ERROR_MARK, (void (*)(void))core_set_error_mark },
   2619     { OSSL_FUNC_CORE_CLEAR_LAST_ERROR_MARK,
   2620         (void (*)(void))core_clear_last_error_mark },
   2621     { OSSL_FUNC_CORE_POP_ERROR_TO_MARK, (void (*)(void))core_pop_error_to_mark },
   2622     { OSSL_FUNC_CORE_COUNT_TO_MARK, (void (*)(void))core_count_to_mark },
   2623     { OSSL_FUNC_BIO_NEW_FILE, (void (*)(void))ossl_core_bio_new_file },
   2624     { OSSL_FUNC_BIO_NEW_MEMBUF, (void (*)(void))ossl_core_bio_new_mem_buf },
   2625     { OSSL_FUNC_BIO_READ_EX, (void (*)(void))ossl_core_bio_read_ex },
   2626     { OSSL_FUNC_BIO_WRITE_EX, (void (*)(void))ossl_core_bio_write_ex },
   2627     { OSSL_FUNC_BIO_GETS, (void (*)(void))ossl_core_bio_gets },
   2628     { OSSL_FUNC_BIO_PUTS, (void (*)(void))ossl_core_bio_puts },
   2629     { OSSL_FUNC_BIO_CTRL, (void (*)(void))ossl_core_bio_ctrl },
   2630     { OSSL_FUNC_BIO_UP_REF, (void (*)(void))ossl_core_bio_up_ref },
   2631     { OSSL_FUNC_BIO_FREE, (void (*)(void))ossl_core_bio_free },
   2632     { OSSL_FUNC_BIO_VPRINTF, (void (*)(void))ossl_core_bio_vprintf },
   2633     { OSSL_FUNC_BIO_VSNPRINTF, (void (*)(void))BIO_vsnprintf },
   2634     { OSSL_FUNC_SELF_TEST_CB, (void (*)(void))core_self_test_get_callback },
   2635     { OSSL_FUNC_INDICATOR_CB, (void (*)(void))core_indicator_get_callback },
   2636     { OSSL_FUNC_GET_ENTROPY, (void (*)(void))rand_get_entropy },
   2637     { OSSL_FUNC_GET_USER_ENTROPY, (void (*)(void))rand_get_user_entropy },
   2638     { OSSL_FUNC_CLEANUP_ENTROPY, (void (*)(void))rand_cleanup_entropy },
   2639     { OSSL_FUNC_CLEANUP_USER_ENTROPY, (void (*)(void))rand_cleanup_user_entropy },
   2640     { OSSL_FUNC_GET_NONCE, (void (*)(void))rand_get_nonce },
   2641     { OSSL_FUNC_GET_USER_NONCE, (void (*)(void))rand_get_user_nonce },
   2642     { OSSL_FUNC_CLEANUP_NONCE, (void (*)(void))rand_cleanup_nonce },
   2643     { OSSL_FUNC_CLEANUP_USER_NONCE, (void (*)(void))rand_cleanup_user_nonce },
   2644 #endif
   2645     { OSSL_FUNC_CRYPTO_MALLOC, (void (*)(void))CRYPTO_malloc },
   2646     { OSSL_FUNC_CRYPTO_ZALLOC, (void (*)(void))CRYPTO_zalloc },
   2647     { OSSL_FUNC_CRYPTO_FREE, (void (*)(void))CRYPTO_free },
   2648     { OSSL_FUNC_CRYPTO_CLEAR_FREE, (void (*)(void))CRYPTO_clear_free },
   2649     { OSSL_FUNC_CRYPTO_REALLOC, (void (*)(void))CRYPTO_realloc },
   2650     { OSSL_FUNC_CRYPTO_CLEAR_REALLOC, (void (*)(void))CRYPTO_clear_realloc },
   2651     { OSSL_FUNC_CRYPTO_SECURE_MALLOC, (void (*)(void))CRYPTO_secure_malloc },
   2652     { OSSL_FUNC_CRYPTO_SECURE_ZALLOC, (void (*)(void))CRYPTO_secure_zalloc },
   2653     { OSSL_FUNC_CRYPTO_SECURE_FREE, (void (*)(void))CRYPTO_secure_free },
   2654     { OSSL_FUNC_CRYPTO_SECURE_CLEAR_FREE,
   2655         (void (*)(void))CRYPTO_secure_clear_free },
   2656     { OSSL_FUNC_CRYPTO_SECURE_ALLOCATED,
   2657         (void (*)(void))CRYPTO_secure_allocated },
   2658     { OSSL_FUNC_OPENSSL_CLEANSE, (void (*)(void))OPENSSL_cleanse },
   2659 #ifndef FIPS_MODULE
   2660     { OSSL_FUNC_PROVIDER_REGISTER_CHILD_CB,
   2661         (void (*)(void))ossl_provider_register_child_cb },
   2662     { OSSL_FUNC_PROVIDER_DEREGISTER_CHILD_CB,
   2663         (void (*)(void))ossl_provider_deregister_child_cb },
   2664     { OSSL_FUNC_PROVIDER_NAME,
   2665         (void (*)(void))core_provider_get0_name },
   2666     { OSSL_FUNC_PROVIDER_GET0_PROVIDER_CTX,
   2667         (void (*)(void))core_provider_get0_provider_ctx },
   2668     { OSSL_FUNC_PROVIDER_GET0_DISPATCH,
   2669         (void (*)(void))core_provider_get0_dispatch },
   2670     { OSSL_FUNC_PROVIDER_UP_REF,
   2671         (void (*)(void))core_provider_up_ref_intern },
   2672     { OSSL_FUNC_PROVIDER_FREE,
   2673         (void (*)(void))core_provider_free_intern },
   2674     { OSSL_FUNC_CORE_OBJ_ADD_SIGID, (void (*)(void))core_obj_add_sigid },
   2675     { OSSL_FUNC_CORE_OBJ_CREATE, (void (*)(void))core_obj_create },
   2676 #endif
   2677     OSSL_DISPATCH_END
   2678 };
   2679 static const OSSL_DISPATCH *core_dispatch = core_dispatch_;
   2680