Add the possibility to control some engine internals.
authorRichard Levitte <levitte@openssl.org>
Thu, 29 Jun 2000 14:26:07 +0000 (14:26 +0000)
committerRichard Levitte <levitte@openssl.org>
Thu, 29 Jun 2000 14:26:07 +0000 (14:26 +0000)
crypto/engine/engine.h
crypto/engine/engine_err.c
crypto/engine/engine_int.h
crypto/engine/engine_lib.c
crypto/engine/engine_openssl.c
crypto/engine/hw_cswift.c
crypto/engine/hw_ncipher.c
util/libeay.num

index eb25e055b6d2fc22bf332398a1c6c3a68d3b19aa..7c7f181f15a80e4675268cda67ef197a0b61fbc8 100644 (file)
@@ -81,6 +81,13 @@ extern "C" {
 #define ENGINE_METHOD_ALL              (unsigned int)0xFFFF
 #define ENGINE_METHOD_NONE             (unsigned int)0x0000
 
+/* These flags are used to tell the ctrl function what should be done.
+ * All command numbers are shared between all engines, even if some don't
+ * make sense to some engines.  In such a case, they do nothing but return
+ * the error ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED. */
+#define ENGINE_CTRL_SET_LOGSTREAM      1
+
+
 /* As we're missing a BIGNUM_METHOD, we need a couple of locally
  * defined function types that engines can implement. */
 
@@ -202,6 +209,12 @@ int ENGINE_init(ENGINE *e);
  * a corresponding call to ENGINE_free as it also releases a structural
  * reference. */
 int ENGINE_finish(ENGINE *e);
+/* Send control parametrised commands to the engine.  The possibilities
+ * to send down an integer, a pointer to data or a function pointer are
+ * provided.  Any of the parameters may or may not be NULL, depending
+ * on the command number */
+/* WARNING: This is currently experimental and may change radically! */
+int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)());
 
 /* This returns a pointer for the current ENGINE structure that
  * is (by default) performing any RSA operations. The value returned
@@ -265,6 +278,7 @@ void ERR_load_ENGINE_strings(void);
 #define ENGINE_F_CSWIFT_RSA_MOD_EXP                     104
 #define ENGINE_F_ENGINE_ADD                             105
 #define ENGINE_F_ENGINE_BY_ID                           106
+#define ENGINE_F_ENGINE_CTRL                            142
 #define ENGINE_F_ENGINE_FINISH                          107
 #define ENGINE_F_ENGINE_FREE                            108
 #define ENGINE_F_ENGINE_GET_BN_MOD_EXP                  109
@@ -291,6 +305,7 @@ void ERR_load_ENGINE_strings(void);
 #define ENGINE_F_ENGINE_SET_NAME                        130
 #define ENGINE_F_ENGINE_SET_RAND                        131
 #define ENGINE_F_ENGINE_SET_RSA                                 132
+#define ENGINE_F_HWCRHK_CTRL                            143
 #define ENGINE_F_HWCRHK_FINISH                          135
 #define ENGINE_F_HWCRHK_INIT                            136
 #define ENGINE_F_HWCRHK_MOD_EXP                                 137
@@ -304,6 +319,7 @@ void ERR_load_ENGINE_strings(void);
 #define ENGINE_R_BN_CTX_FULL                            101
 #define ENGINE_R_BN_EXPAND_FAIL                                 102
 #define ENGINE_R_CONFLICTING_ENGINE_ID                  103
+#define ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED           119
 #define ENGINE_R_DSO_FAILURE                            104
 #define ENGINE_R_ENGINE_IS_NOT_IN_LIST                  105
 #define ENGINE_R_FINISH_FAILED                          106
@@ -314,6 +330,7 @@ void ERR_load_ENGINE_strings(void);
 #define ENGINE_R_MISSING_KEY_COMPONENTS                         111
 #define ENGINE_R_NOT_INITIALISED                        117
 #define ENGINE_R_NOT_LOADED                             112
+#define ENGINE_R_NO_CONTROL_FUNCTION                    120
 #define ENGINE_R_NO_SUCH_ENGINE                                 116
 #define ENGINE_R_PROVIDE_PARAMETERS                     113
 #define ENGINE_R_REQUEST_FAILED                                 114
index a356a5ec7c5408ba3ff552b22dc5323eb2f740aa..a250367c3b69797a9d6d9157741e306c96a88d66 100644 (file)
@@ -79,6 +79,7 @@ static ERR_STRING_DATA ENGINE_str_functs[]=
 {ERR_PACK(0,ENGINE_F_CSWIFT_RSA_MOD_EXP,0),    "CSWIFT_RSA_MOD_EXP"},
 {ERR_PACK(0,ENGINE_F_ENGINE_ADD,0),    "ENGINE_add"},
 {ERR_PACK(0,ENGINE_F_ENGINE_BY_ID,0),  "ENGINE_by_id"},
+{ERR_PACK(0,ENGINE_F_ENGINE_CTRL,0),   "ENGINE_ctrl"},
 {ERR_PACK(0,ENGINE_F_ENGINE_FINISH,0), "ENGINE_finish"},
 {ERR_PACK(0,ENGINE_F_ENGINE_FREE,0),   "ENGINE_free"},
 {ERR_PACK(0,ENGINE_F_ENGINE_GET_BN_MOD_EXP,0), "ENGINE_get_BN_mod_exp"},
@@ -105,13 +106,14 @@ static ERR_STRING_DATA ENGINE_str_functs[]=
 {ERR_PACK(0,ENGINE_F_ENGINE_SET_NAME,0),       "ENGINE_set_name"},
 {ERR_PACK(0,ENGINE_F_ENGINE_SET_RAND,0),       "ENGINE_set_RAND"},
 {ERR_PACK(0,ENGINE_F_ENGINE_SET_RSA,0),        "ENGINE_set_RSA"},
-{ERR_PACK(0,ENGINE_F_HWCRHK_FINISH,0), "hwcrhk_finish"},
-{ERR_PACK(0,ENGINE_F_HWCRHK_INIT,0),   "hwcrhk_init"},
-{ERR_PACK(0,ENGINE_F_HWCRHK_MOD_EXP,0),        "hwcrhk_mod_exp"},
-{ERR_PACK(0,ENGINE_F_HWCRHK_MOD_EXP_CRT,0),    "hwcrhk_mod_exp_crt"},
-{ERR_PACK(0,ENGINE_F_HWCRHK_RAND_BYTES,0),     "hwcrhk_rand_bytes"},
-{ERR_PACK(0,ENGINE_F_HWCRHK_RSA_MOD_EXP,0),    "hwcrhk_rsa_mod_exp"},
-{ERR_PACK(0,ENGINE_F_LOG_MESSAGE,0),   "log_message"},
+{ERR_PACK(0,ENGINE_F_HWCRHK_CTRL,0),   "HWCRHK_CTRL"},
+{ERR_PACK(0,ENGINE_F_HWCRHK_FINISH,0), "HWCRHK_FINISH"},
+{ERR_PACK(0,ENGINE_F_HWCRHK_INIT,0),   "HWCRHK_INIT"},
+{ERR_PACK(0,ENGINE_F_HWCRHK_MOD_EXP,0),        "HWCRHK_MOD_EXP"},
+{ERR_PACK(0,ENGINE_F_HWCRHK_MOD_EXP_CRT,0),    "HWCRHK_MOD_EXP_CRT"},
+{ERR_PACK(0,ENGINE_F_HWCRHK_RAND_BYTES,0),     "HWCRHK_RAND_BYTES"},
+{ERR_PACK(0,ENGINE_F_HWCRHK_RSA_MOD_EXP,0),    "HWCRHK_RSA_MOD_EXP"},
+{ERR_PACK(0,ENGINE_F_LOG_MESSAGE,0),   "LOG_MESSAGE"},
 {0,NULL}
        };
 
@@ -121,6 +123,7 @@ static ERR_STRING_DATA ENGINE_str_reasons[]=
 {ENGINE_R_BN_CTX_FULL                    ,"BN_CTX full"},
 {ENGINE_R_BN_EXPAND_FAIL                 ,"bn_expand fail"},
 {ENGINE_R_CONFLICTING_ENGINE_ID          ,"conflicting engine id"},
+{ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED   ,"ctrl command not implemented"},
 {ENGINE_R_DSO_FAILURE                    ,"DSO failure"},
 {ENGINE_R_ENGINE_IS_NOT_IN_LIST          ,"engine is not in the list"},
 {ENGINE_R_FINISH_FAILED                  ,"finish failed"},
@@ -131,6 +134,7 @@ static ERR_STRING_DATA ENGINE_str_reasons[]=
 {ENGINE_R_MISSING_KEY_COMPONENTS         ,"missing key components"},
 {ENGINE_R_NOT_INITIALISED                ,"not initialised"},
 {ENGINE_R_NOT_LOADED                     ,"not loaded"},
+{ENGINE_R_NO_CONTROL_FUNCTION            ,"no control function"},
 {ENGINE_R_NO_SUCH_ENGINE                 ,"no such engine"},
 {ENGINE_R_PROVIDE_PARAMETERS             ,"provide parameters"},
 {ENGINE_R_REQUEST_FAILED                 ,"request failed"},
index 2fe3cf832a0d91e167cc92e519d7f226be838eb0..fc9291dea2ab831ee90e8a35539fee1a9b59daa6 100644 (file)
@@ -100,8 +100,9 @@ typedef struct engine_st
        RAND_METHOD *rand_meth;
        BN_MOD_EXP bn_mod_exp;
        BN_MOD_EXP_CRT bn_mod_exp_crt;
-       int (*init)();
-       int (*finish)();
+       int (*init)(void);
+       int (*finish)(void);
+       int (*ctrl)(int cmd, long i, void *p, void (*f)());
        int flags;
        /* reference count on the structure itself */
        int struct_ref;
index 2ef27db8130a0eb9e10d51186f33f62f503ab0ef..afd03b0f3d8b18bb4b019f1a47db1fc8aea15a59 100644 (file)
@@ -216,6 +216,30 @@ int ENGINE_finish(ENGINE *e)
        return to_return;
        }
 
+/* Initialise a engine type for use (or up its functional reference count
+ * if it's already in use). */
+int ENGINE_ctrl(ENGINE *e, int cmd, long i, void *p, void (*f)())
+       {
+       if(e == NULL)
+               {
+               ENGINEerr(ENGINE_F_ENGINE_CTRL,ERR_R_PASSED_NULL_PARAMETER);
+               return 0;
+               }
+       CRYPTO_w_lock(CRYPTO_LOCK_ENGINE);
+       if(e->funct_ref == 0)
+               {
+               ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NOT_INITIALISED);
+               return 0;
+               }
+       if (!e->ctrl)
+               {
+               ENGINEerr(ENGINE_F_ENGINE_CTRL,ENGINE_R_NO_CONTROL_FUNCTION);
+               return 0;
+               }
+       CRYPTO_w_unlock(CRYPTO_LOCK_ENGINE);
+       return e->ctrl(cmd, i, p, f);
+       }
+
 static ENGINE *engine_get_default_type(ENGINE_TYPE t)
        {
        ENGINE *ret = NULL;
index 0747f1058cfd5b57e936dfe7573b36fb41bb5a0f..731834dafa0a6bf67cf82c78ebd31c4ff486685f 100644 (file)
@@ -89,6 +89,7 @@ static ENGINE engine_openssl =
        openssl_mod_exp_crt,
        NULL, /* no "init()" */
        NULL, /* no "finish()" */
+       NULL, /* no "ctrl()" */
        0, /* no flags */
        0, 0, /* no references. */
        NULL, NULL /* unlinked */
index bf2f0b694fad95a73ca82a929391e194f15ee9d3..7a67af37edd157dfdc4638114a1a59a39db2b459 100644 (file)
@@ -165,6 +165,7 @@ static ENGINE engine_cswift =
        cswift_mod_exp_crt,
        cswift_init,
        cswift_finish,
+       NULL, /* no ctrl() */
        0, /* no flags */
        0, 0, /* no references */
        NULL, NULL /* unlinked */
index 586750239e198e7f5d32e3bbc364d0c17d019933..5151dd5cf72485f071e87ba91bc348437cd4f0ce 100644 (file)
@@ -78,6 +78,7 @@
 
 static int hwcrhk_init();
 static int hwcrhk_finish();
+static int hwcrhk_ctrl(int cmd, long i, void *p, void (*f)()); 
 
 /* Functions to handle mutexes */
 static int hwcrhk_mutex_init(HWCryptoHook_Mutex*, HWCryptoHook_CallerContext*);
@@ -163,6 +164,7 @@ static ENGINE engine_hwcrhk =
        NULL,
        hwcrhk_init,
        hwcrhk_finish,
+       hwcrhk_ctrl,
        0, /* no flags */
        0, 0, /* no references */
        NULL, NULL /* unlinked */
@@ -460,6 +462,24 @@ static int hwcrhk_finish()
        return to_return;
        }
 
+static int hwcrhk_ctrl(int cmd, long i, void *p, void (*f)())
+       {
+       int to_return = 1;
+
+       switch(cmd)
+               {
+       case ENGINE_CTRL_SET_LOGSTREAM:
+               logstream = (BIO *)p;
+               break;
+       default:
+               ENGINEerr(ENGINE_F_HWCRHK_CTRL,
+                       ENGINE_R_CTRL_COMMAND_NOT_IMPLEMENTED);
+               to_return = 0;
+               break;
+               }
+
+       return to_return;
+       }
 /* A little mod_exp */
 static int hwcrhk_mod_exp(BIGNUM *r, BIGNUM *a, const BIGNUM *p,
                        const BIGNUM *m, BN_CTX *ctx)
index c73ca9b407cc9144336881046fba5b0858277f1d..3c593f1a01812a7ee6ea7f50292851e7e89c3660 100755 (executable)
@@ -1889,3 +1889,4 @@ DSA_set_default_openssl_method          2464
 ENGINE_add                              2465
 DH_set_default_openssl_method           2466
 ENGINE_get_DSA                          2467
+ENGINE_ctrl                             2468