ENGINE's init() and finish() handler functions are used when the ENGINE is
authorGeoff Thorpe <geoff@openssl.org>
Wed, 5 Sep 2001 18:32:23 +0000 (18:32 +0000)
committerGeoff Thorpe <geoff@openssl.org>
Wed, 5 Sep 2001 18:32:23 +0000 (18:32 +0000)
being enabled or disabled (respectively) for operation. Additionally, each
ENGINE has a constructor function where it can do more 'structural' level
intialisations such as loading error strings, creating "ex_data" indices,
etc. This change introduces a handler function that gives an ENGINE a
corresponding opportunity to cleanup when the ENGINE is being destroyed. It
also adds the "get/set" API functions that control this "destroy" handler
function in an ENGINE.

crypto/engine/engine.h
crypto/engine/engine_int.h
crypto/engine/engine_list.c

index 7c0b2f67c4b2d2ea472a3ddcf2094a8c6ef9966c..644f00c7789e29328000024b7fdf60a786970eb4 100644 (file)
@@ -371,6 +371,7 @@ int ENGINE_set_DH(ENGINE *e, const DH_METHOD *dh_meth);
 int ENGINE_set_RAND(ENGINE *e, const RAND_METHOD *rand_meth);
 int ENGINE_set_BN_mod_exp(ENGINE *e, BN_MOD_EXP bn_mod_exp);
 int ENGINE_set_BN_mod_exp_crt(ENGINE *e, BN_MOD_EXP_CRT bn_mod_exp_crt);
+int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f);
 int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f);
 int ENGINE_set_finish_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR finish_f);
 int ENGINE_set_ctrl_function(ENGINE *e, ENGINE_CTRL_FUNC_PTR ctrl_f);
@@ -409,6 +410,7 @@ int ENGINE_cipher_num(const ENGINE *e);
 const EVP_CIPHER *ENGINE_get_cipher(const ENGINE *e, int n);
 BN_MOD_EXP ENGINE_get_BN_mod_exp(const ENGINE *e);
 BN_MOD_EXP_CRT ENGINE_get_BN_mod_exp_crt(const ENGINE *e);
+ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e);
 ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e);
 ENGINE_GEN_INT_FUNC_PTR ENGINE_get_finish_function(const ENGINE *e);
 ENGINE_CTRL_FUNC_PTR ENGINE_get_ctrl_function(const ENGINE *e);
index 90a47a73256c0590b16ad6266e820eb1b5c37b82..2e87339db3f8203e84a97e066a2e8d8dadead7e3 100644 (file)
@@ -112,6 +112,7 @@ struct engine_st
 
        BN_MOD_EXP bn_mod_exp;
        BN_MOD_EXP_CRT bn_mod_exp_crt;
+       ENGINE_GEN_INT_FUNC_PTR destroy;
        ENGINE_GEN_INT_FUNC_PTR init;
        ENGINE_GEN_INT_FUNC_PTR finish;
        ENGINE_CTRL_FUNC_PTR ctrl;
index ab5652f293707da9b9cc4323ac5e9ae4894ed2e7..428ccd8cad3ebf784e0c7b8dce86a6d7e421670e 100644 (file)
@@ -415,6 +415,10 @@ static int ENGINE_free_util(ENGINE *e, int locked)
                abort();
                }
 #endif
+       /* Give the ENGINE a chance to do any structural cleanup corresponding
+        * to allocation it did in its constructor (eg. unload error strings) */
+       if(e->destroy)
+               e->destroy(e);
        sk_ENGINE_EVP_CIPHER_pop_free(e->ciphers,ENGINE_free_engine_cipher);
        CRYPTO_free_ex_data(CRYPTO_EX_INDEX_ENGINE, e, &e->ex_data);
        OPENSSL_free(e);
@@ -532,6 +536,12 @@ int ENGINE_set_BN_mod_exp_crt(ENGINE *e, BN_MOD_EXP_CRT bn_mod_exp_crt)
        return 1;
        }
 
+int ENGINE_set_destroy_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR destroy_f)
+       {
+       e->destroy = destroy_f;
+       return 1;
+       }
+
 int ENGINE_set_init_function(ENGINE *e, ENGINE_GEN_INT_FUNC_PTR init_f)
        {
        e->init = init_f;
@@ -648,6 +658,11 @@ BN_MOD_EXP_CRT ENGINE_get_BN_mod_exp_crt(const ENGINE *e)
        return e->bn_mod_exp_crt;
        }
 
+ENGINE_GEN_INT_FUNC_PTR ENGINE_get_destroy_function(const ENGINE *e)
+       {
+       return e->destroy;
+       }
+
 ENGINE_GEN_INT_FUNC_PTR ENGINE_get_init_function(const ENGINE *e)
        {
        return e->init;