Hi,
We have a need to use a dynamic OpenSSL engine under apache. The
attached patch (against 2.0.48) directs apache to accept ssl.conf
directives such as:
SSLCryptoDevice dynamic
SSLCryptoLibpath /usr/local/lib/hw_ibmca.so
SSLCryptoDevID ibmca
directing openssl to load hw_ibmca.so dynamically as engine id ibmca.
Is there a fundamental complaint against incorporation of this feature?
thanks,
-serge
--
=======================================================
Serge Hallyn
Security Software Engineer, IBM Linux Technology Center
[EMAIL PROTECTED]
diff -Nru httpd-2.0.48/modules/ssl/mod_ssl.c httpd-2.0.48-dyn/modules/ssl/mod_ssl.c
--- httpd-2.0.48/modules/ssl/mod_ssl.c 2003-03-10 22:40:43.000000000 -0800
+++ httpd-2.0.48-dyn/modules/ssl/mod_ssl.c 2004-02-13 12:44:59.000000000 -0800
@@ -120,6 +120,12 @@
SSL_CMD_SRV(CryptoDevice, TAKE1,
"SSL external Crypto Device usage "
"(`builtin', `...')")
+ SSL_CMD_SRV(CryptoLibpath, TAKE1,
+ "Full path to dynamic SSL engine "
+ "(`builtin', `...')")
+ SSL_CMD_SRV(CryptoDevID, TAKE1,
+ "Engine ID for dynamic engine "
+ "(`builtin', `...')")
#endif
SSL_CMD_SRV(RandomSeed, TAKE23,
"SSL Pseudo Random Number Generator (PRNG) seeding source "
diff -Nru httpd-2.0.48/modules/ssl/mod_ssl.h httpd-2.0.48-dyn/modules/ssl/mod_ssl.h
--- httpd-2.0.48/modules/ssl/mod_ssl.h 2003-09-15 18:00:06.000000000 -0700
+++ httpd-2.0.48-dyn/modules/ssl/mod_ssl.h 2004-02-13 12:44:49.000000000 -0800
@@ -445,6 +445,8 @@
apr_hash_t *tPrivateKey;
#ifdef SSL_EXPERIMENTAL_ENGINE
char *szCryptoDevice;
+ char *szCryptoLibpath;
+ char *szCryptoDevID;
#endif
struct {
void *pV1, *pV2, *pV3, *pV4, *pV5, *pV6, *pV7, *pV8, *pV9, *pV10;
@@ -559,6 +561,8 @@
const char *ssl_cmd_SSLMutex(cmd_parms *, void *, const char *);
const char *ssl_cmd_SSLPassPhraseDialog(cmd_parms *, void *, const char *);
const char *ssl_cmd_SSLCryptoDevice(cmd_parms *, void *, const char *);
+const char *ssl_cmd_SSLCryptoLibpath(cmd_parms *, void *, const char *);
+const char *ssl_cmd_SSLCryptoDevID(cmd_parms *, void *, const char *);
const char *ssl_cmd_SSLRandomSeed(cmd_parms *, void *, const char *, const char *, const char *);
const char *ssl_cmd_SSLEngine(cmd_parms *, void *, int);
const char *ssl_cmd_SSLCipherSuite(cmd_parms *, void *, const char *);
diff -Nru httpd-2.0.48/modules/ssl/ssl_engine_config.c httpd-2.0.48-dyn/modules/ssl/ssl_engine_config.c
--- httpd-2.0.48/modules/ssl/ssl_engine_config.c 2003-09-15 18:00:06.000000000 -0700
+++ httpd-2.0.48-dyn/modules/ssl/ssl_engine_config.c 2004-02-13 12:32:05.000000000 -0800
@@ -109,6 +109,8 @@
mc->tPublicCert = apr_hash_make(pool);
#ifdef SSL_EXPERIMENTAL_ENGINE
mc->szCryptoDevice = NULL;
+ mc->szCryptoLibpath = NULL;
+ mc->szCryptoDevID = NULL;
#endif
memset(mc->pTmpKeys, 0, sizeof(mc->pTmpKeys));
@@ -525,6 +527,24 @@
}
#ifdef SSL_EXPERIMENTAL_ENGINE
+const char *ssl_cmd_SSLCryptoLibpath(cmd_parms *cmd,
+ void *dcfg,
+ const char *arg)
+{
+ SSLModConfigRec *mc = myModConfig(cmd->server);
+ mc->szCryptoLibpath = arg;
+ return NULL;
+}
+
+const char *ssl_cmd_SSLCryptoDevID(cmd_parms *cmd,
+ void *dcfg,
+ const char *arg)
+{
+ SSLModConfigRec *mc = myModConfig(cmd->server);
+ mc->szCryptoDevID = arg;
+ return NULL;
+}
+
const char *ssl_cmd_SSLCryptoDevice(cmd_parms *cmd,
void *dcfg,
const char *arg)
diff -Nru httpd-2.0.48/modules/ssl/ssl_engine_init.c httpd-2.0.48-dyn/modules/ssl/ssl_engine_init.c
--- httpd-2.0.48/modules/ssl/ssl_engine_init.c 2003-05-16 11:12:18.000000000 -0700
+++ httpd-2.0.48-dyn/modules/ssl/ssl_engine_init.c 2004-02-17 08:52:46.000000000 -0800
@@ -352,6 +352,7 @@
#ifdef SSL_EXPERIMENTAL_ENGINE
void ssl_init_Engine(server_rec *s, apr_pool_t *p)
{
+ static int need_to_init_dynamic = 1;
SSLModConfigRec *mc = myModConfig(s);
ENGINE *e;
@@ -363,6 +364,33 @@
ssl_die();
}
+ if (need_to_init_dynamic && strEQ(mc->szCryptoDevice, "dynamic")) {
+ if (!mc->szCryptoLibpath) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+ "Init: Dynamic engine specified, but no library path.\n");
+ ENGINE_free(e);
+ return;
+ }
+ if (!ENGINE_ctrl_cmd_string(e, "SO_PATH", mc->szCryptoLibpath, 0) ||
+ (mc->szCryptoDevID && !ENGINE_ctrl_cmd_string(e, "ID", mc->szCryptoDevID, 0)) ||
+ !ENGINE_ctrl_cmd_string(e, "LIST_ADD", "1", 0)) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+ "Init: Error setting the dynamic engine details.\n");
+ ENGINE_free(e);
+ return;
+ }
+
+ if (!ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0)) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+ "Init: Error LOADing the dynamic engine %s %s\n",
+ mc->szCryptoLibpath,
+ (mc->szCryptoDevID ? mc->szCryptoDevID : "(no ID)"));
+ ENGINE_free(e);
+ return;
+ }
+ need_to_init_dynamic = 0;
+ }
+
if (strEQ(mc->szCryptoDevice, "chil")) {
ENGINE_ctrl(e, ENGINE_CTRL_CHIL_SET_FORKCHECK, 1, 0, 0);
}