123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436 |
- #include "eng_local.h"
- static ENGINE *engine_list_head = NULL;
- static ENGINE *engine_list_tail = NULL;
- static ENGINE *engine_dyn_list_head = NULL;
- static ENGINE *engine_dyn_list_tail = NULL;
- static void engine_list_cleanup(void)
- {
- ENGINE *iterator = engine_list_head;
- while (iterator != NULL) {
- ENGINE_remove(iterator);
- iterator = engine_list_head;
- }
- return;
- }
- static int engine_list_add(ENGINE *e)
- {
- int conflict = 0;
- ENGINE *iterator = NULL;
- if (e == NULL) {
- ENGINEerr(ENGINE_F_ENGINE_LIST_ADD, ERR_R_PASSED_NULL_PARAMETER);
- return 0;
- }
- iterator = engine_list_head;
- while (iterator && !conflict) {
- conflict = (strcmp(iterator->id, e->id) == 0);
- iterator = iterator->next;
- }
- if (conflict) {
- ENGINEerr(ENGINE_F_ENGINE_LIST_ADD, ENGINE_R_CONFLICTING_ENGINE_ID);
- return 0;
- }
- if (engine_list_head == NULL) {
-
- if (engine_list_tail) {
- ENGINEerr(ENGINE_F_ENGINE_LIST_ADD, ENGINE_R_INTERNAL_LIST_ERROR);
- return 0;
- }
- engine_list_head = e;
- e->prev = NULL;
-
- engine_cleanup_add_last(engine_list_cleanup);
- } else {
-
- if ((engine_list_tail == NULL) || (engine_list_tail->next != NULL)) {
- ENGINEerr(ENGINE_F_ENGINE_LIST_ADD, ENGINE_R_INTERNAL_LIST_ERROR);
- return 0;
- }
- engine_list_tail->next = e;
- e->prev = engine_list_tail;
- }
-
- e->struct_ref++;
- engine_ref_debug(e, 0, 1);
-
- engine_list_tail = e;
- e->next = NULL;
- return 1;
- }
- static int engine_list_remove(ENGINE *e)
- {
- ENGINE *iterator;
- if (e == NULL) {
- ENGINEerr(ENGINE_F_ENGINE_LIST_REMOVE, ERR_R_PASSED_NULL_PARAMETER);
- return 0;
- }
-
- iterator = engine_list_head;
- while (iterator && (iterator != e))
- iterator = iterator->next;
- if (iterator == NULL) {
- ENGINEerr(ENGINE_F_ENGINE_LIST_REMOVE,
- ENGINE_R_ENGINE_IS_NOT_IN_LIST);
- return 0;
- }
-
- if (e->next)
- e->next->prev = e->prev;
- if (e->prev)
- e->prev->next = e->next;
-
- if (engine_list_head == e)
- engine_list_head = e->next;
- if (engine_list_tail == e)
- engine_list_tail = e->prev;
- engine_free_util(e, 0);
- return 1;
- }
- int engine_add_dynamic_id(ENGINE *e, ENGINE_DYNAMIC_ID dynamic_id,
- int not_locked)
- {
- int result = 0;
- ENGINE *iterator = NULL;
- if (e == NULL)
- return 0;
- if (e->dynamic_id == NULL && dynamic_id == NULL)
- return 0;
- if (not_locked && !CRYPTO_THREAD_write_lock(global_engine_lock))
- return 0;
- if (dynamic_id != NULL) {
- iterator = engine_dyn_list_head;
- while (iterator != NULL) {
- if (iterator->dynamic_id == dynamic_id)
- goto err;
- iterator = iterator->next;
- }
- if (e->dynamic_id != NULL)
- goto err;
- e->dynamic_id = dynamic_id;
- }
- if (engine_dyn_list_head == NULL) {
-
- if (engine_dyn_list_tail != NULL)
- goto err;
- engine_dyn_list_head = e;
- e->prev_dyn = NULL;
- } else {
-
- if (engine_dyn_list_tail == NULL
- || engine_dyn_list_tail->next_dyn != NULL)
- goto err;
- engine_dyn_list_tail->next_dyn = e;
- e->prev_dyn = engine_dyn_list_tail;
- }
- engine_dyn_list_tail = e;
- e->next_dyn = NULL;
- result = 1;
- err:
- if (not_locked)
- CRYPTO_THREAD_unlock(global_engine_lock);
- return result;
- }
- void engine_remove_dynamic_id(ENGINE *e, int not_locked)
- {
- if (e == NULL || e->dynamic_id == NULL)
- return;
- if (not_locked && !CRYPTO_THREAD_write_lock(global_engine_lock))
- return;
- e->dynamic_id = NULL;
-
- if (e->next_dyn != NULL)
- e->next_dyn->prev_dyn = e->prev_dyn;
- if (e->prev_dyn != NULL)
- e->prev_dyn->next_dyn = e->next_dyn;
-
- if (engine_dyn_list_head == e)
- engine_dyn_list_head = e->next_dyn;
- if (engine_dyn_list_tail == e)
- engine_dyn_list_tail = e->prev_dyn;
- if (not_locked)
- CRYPTO_THREAD_unlock(global_engine_lock);
- }
- ENGINE *ENGINE_get_first(void)
- {
- ENGINE *ret;
- if (!RUN_ONCE(&engine_lock_init, do_engine_lock_init)) {
- ENGINEerr(ENGINE_F_ENGINE_GET_FIRST, ERR_R_MALLOC_FAILURE);
- return NULL;
- }
- CRYPTO_THREAD_write_lock(global_engine_lock);
- ret = engine_list_head;
- if (ret) {
- ret->struct_ref++;
- engine_ref_debug(ret, 0, 1);
- }
- CRYPTO_THREAD_unlock(global_engine_lock);
- return ret;
- }
- ENGINE *ENGINE_get_last(void)
- {
- ENGINE *ret;
- if (!RUN_ONCE(&engine_lock_init, do_engine_lock_init)) {
- ENGINEerr(ENGINE_F_ENGINE_GET_LAST, ERR_R_MALLOC_FAILURE);
- return NULL;
- }
- CRYPTO_THREAD_write_lock(global_engine_lock);
- ret = engine_list_tail;
- if (ret) {
- ret->struct_ref++;
- engine_ref_debug(ret, 0, 1);
- }
- CRYPTO_THREAD_unlock(global_engine_lock);
- return ret;
- }
- ENGINE *ENGINE_get_next(ENGINE *e)
- {
- ENGINE *ret = NULL;
- if (e == NULL) {
- ENGINEerr(ENGINE_F_ENGINE_GET_NEXT, ERR_R_PASSED_NULL_PARAMETER);
- return 0;
- }
- CRYPTO_THREAD_write_lock(global_engine_lock);
- ret = e->next;
- if (ret) {
-
- ret->struct_ref++;
- engine_ref_debug(ret, 0, 1);
- }
- CRYPTO_THREAD_unlock(global_engine_lock);
-
- ENGINE_free(e);
- return ret;
- }
- ENGINE *ENGINE_get_prev(ENGINE *e)
- {
- ENGINE *ret = NULL;
- if (e == NULL) {
- ENGINEerr(ENGINE_F_ENGINE_GET_PREV, ERR_R_PASSED_NULL_PARAMETER);
- return 0;
- }
- CRYPTO_THREAD_write_lock(global_engine_lock);
- ret = e->prev;
- if (ret) {
-
- ret->struct_ref++;
- engine_ref_debug(ret, 0, 1);
- }
- CRYPTO_THREAD_unlock(global_engine_lock);
-
- ENGINE_free(e);
- return ret;
- }
- int ENGINE_add(ENGINE *e)
- {
- int to_return = 1;
- if (e == NULL) {
- ENGINEerr(ENGINE_F_ENGINE_ADD, ERR_R_PASSED_NULL_PARAMETER);
- return 0;
- }
- if ((e->id == NULL) || (e->name == NULL)) {
- ENGINEerr(ENGINE_F_ENGINE_ADD, ENGINE_R_ID_OR_NAME_MISSING);
- return 0;
- }
- CRYPTO_THREAD_write_lock(global_engine_lock);
- if (!engine_list_add(e)) {
- ENGINEerr(ENGINE_F_ENGINE_ADD, ENGINE_R_INTERNAL_LIST_ERROR);
- to_return = 0;
- }
- CRYPTO_THREAD_unlock(global_engine_lock);
- return to_return;
- }
- int ENGINE_remove(ENGINE *e)
- {
- int to_return = 1;
- if (e == NULL) {
- ENGINEerr(ENGINE_F_ENGINE_REMOVE, ERR_R_PASSED_NULL_PARAMETER);
- return 0;
- }
- CRYPTO_THREAD_write_lock(global_engine_lock);
- if (!engine_list_remove(e)) {
- ENGINEerr(ENGINE_F_ENGINE_REMOVE, ENGINE_R_INTERNAL_LIST_ERROR);
- to_return = 0;
- }
- CRYPTO_THREAD_unlock(global_engine_lock);
- return to_return;
- }
- static void engine_cpy(ENGINE *dest, const ENGINE *src)
- {
- dest->id = src->id;
- dest->name = src->name;
- #ifndef OPENSSL_NO_RSA
- dest->rsa_meth = src->rsa_meth;
- #endif
- #ifndef OPENSSL_NO_DSA
- dest->dsa_meth = src->dsa_meth;
- #endif
- #ifndef OPENSSL_NO_DH
- dest->dh_meth = src->dh_meth;
- #endif
- #ifndef OPENSSL_NO_EC
- dest->ec_meth = src->ec_meth;
- #endif
- dest->rand_meth = src->rand_meth;
- dest->ciphers = src->ciphers;
- dest->digests = src->digests;
- dest->pkey_meths = src->pkey_meths;
- dest->destroy = src->destroy;
- dest->init = src->init;
- dest->finish = src->finish;
- dest->ctrl = src->ctrl;
- dest->load_privkey = src->load_privkey;
- dest->load_pubkey = src->load_pubkey;
- dest->cmd_defns = src->cmd_defns;
- dest->flags = src->flags;
- dest->dynamic_id = src->dynamic_id;
- engine_add_dynamic_id(dest, NULL, 0);
- }
- ENGINE *ENGINE_by_id(const char *id)
- {
- ENGINE *iterator;
- char *load_dir = NULL;
- if (id == NULL) {
- ENGINEerr(ENGINE_F_ENGINE_BY_ID, ERR_R_PASSED_NULL_PARAMETER);
- return NULL;
- }
- if (!RUN_ONCE(&engine_lock_init, do_engine_lock_init)) {
- ENGINEerr(ENGINE_F_ENGINE_BY_ID, ERR_R_MALLOC_FAILURE);
- return NULL;
- }
- CRYPTO_THREAD_write_lock(global_engine_lock);
- iterator = engine_list_head;
- while (iterator && (strcmp(id, iterator->id) != 0))
- iterator = iterator->next;
- if (iterator != NULL) {
-
- if (iterator->flags & ENGINE_FLAGS_BY_ID_COPY) {
- ENGINE *cp = ENGINE_new();
- if (cp == NULL)
- iterator = NULL;
- else {
- engine_cpy(cp, iterator);
- iterator = cp;
- }
- } else {
- iterator->struct_ref++;
- engine_ref_debug(iterator, 0, 1);
- }
- }
- CRYPTO_THREAD_unlock(global_engine_lock);
- if (iterator != NULL)
- return iterator;
-
- if (strcmp(id, "dynamic")) {
- if ((load_dir = ossl_safe_getenv("OPENSSL_ENGINES")) == NULL)
- load_dir = ENGINESDIR;
- iterator = ENGINE_by_id("dynamic");
- if (!iterator || !ENGINE_ctrl_cmd_string(iterator, "ID", id, 0) ||
- !ENGINE_ctrl_cmd_string(iterator, "DIR_LOAD", "2", 0) ||
- !ENGINE_ctrl_cmd_string(iterator, "DIR_ADD",
- load_dir, 0) ||
- !ENGINE_ctrl_cmd_string(iterator, "LIST_ADD", "1", 0) ||
- !ENGINE_ctrl_cmd_string(iterator, "LOAD", NULL, 0))
- goto notfound;
- return iterator;
- }
- notfound:
- ENGINE_free(iterator);
- ENGINEerr(ENGINE_F_ENGINE_BY_ID, ENGINE_R_NO_SUCH_ENGINE);
- ERR_add_error_data(2, "id=", id);
- return NULL;
-
- }
- int ENGINE_up_ref(ENGINE *e)
- {
- int i;
- if (e == NULL) {
- ENGINEerr(ENGINE_F_ENGINE_UP_REF, ERR_R_PASSED_NULL_PARAMETER);
- return 0;
- }
- CRYPTO_UP_REF(&e->struct_ref, &i, global_engine_lock);
- return 1;
- }
|