default_algorithms option in ENGINE config.
authorDr. Stephen Henson <steve@openssl.org>
Tue, 22 Jan 2002 01:40:18 +0000 (01:40 +0000)
committerDr. Stephen Henson <steve@openssl.org>
Tue, 22 Jan 2002 01:40:18 +0000 (01:40 +0000)
CHANGES
crypto/conf/conf.h
crypto/conf/conf_mod.c
crypto/engine/eng_cnf.c
crypto/engine/eng_err.c
crypto/engine/eng_fat.c
crypto/engine/engine.h

diff --git a/CHANGES b/CHANGES
index a56411c12b4616353c9131b195143b7f4528314c..3f5092a59d24e84bfd0b69b8dcd8352f718255ec 100644 (file)
--- a/CHANGES
+++ b/CHANGES
          *) applies to 0.9.6a/0.9.6b/0.9.6c and 0.9.7
          +) applies to 0.9.7 only
 
+  +) default_algorithms option in ENGINE config module. This allows things
+     like:
+     default_algorithms = ALL
+     default_algorithms = RSA, DSA, RAND, CIPHERS, DIGESTS
+     [Steve Henson]
+
   +) Prelminary ENGINE config module.
      [Steve Henson]
 
index 26452d4c81e55a51f8667a75d4975e95f4eb3836..882d75c74edab4dbf43a91793292caaa13b47071 100644 (file)
@@ -190,6 +190,9 @@ void CONF_module_set_usr_data(CONF_MODULE *pmod, void *usr_data);
 
 char *CONF_get1_default_config_file(void);
 
+int CONF_parse_list(char *list, int sep, int nospc,
+               int (*list_cb)(char *elem, int len, void *usr), void *arg);
+
 /* BEGIN ERROR CODES */
 /* The following lines are auto generated by the script mkerr.pl. Any changes
  * made after this point may be overwritten when the script is next run.
index 234eb7a06e52552594de7c056755f23848b45527..100d72ed03a46de3035347a348765f28aa47f1c1 100644 (file)
@@ -57,6 +57,7 @@
  */
 
 #include <stdio.h>
+#include <ctype.h>
 #include <openssl/crypto.h>
 #include "cryptlib.h"
 #include <openssl/conf.h>
@@ -549,3 +550,48 @@ char *CONF_get1_default_config_file(void)
 
        return file;
        }
+
+/* This function takes a list separated by 'sep' and calls the
+ * callback function giving the start and length of each member
+ * optionally stripping leading and trailing whitespace. This can
+ * be used to parse comma separated lists for example.
+ */
+
+int CONF_parse_list(char *list, int sep, int nospc,
+               int (*list_cb)(char *elem, int len, void *usr), void *arg)
+       {
+       int ret;
+       char *lstart, *tmpend, *p;
+       lstart = list;
+
+       for(;;)
+               {
+               if (nospc)
+                       {
+                       while(*lstart && isspace((unsigned char)*lstart))
+                               lstart++;
+                       }
+               p = strchr(lstart, sep);
+               if (p == lstart || !*lstart)
+                       ret = list_cb(NULL, 0, arg);
+               else
+                       {
+                       if (p)
+                               tmpend = p - 1;
+                       else 
+                               tmpend = lstart + strlen(lstart) - 1;
+                       if (nospc)
+                               {
+                               while(isspace((unsigned char)*tmpend))
+                                       tmpend--;
+                               }
+                       ret = list_cb(lstart, tmpend - lstart + 1, arg);
+                       }
+               if (ret <= 0)
+                       return ret;
+               if (p == NULL)
+                       return 1;
+               lstart = p + 1;
+               }
+       }
+
index 8e3f894f66e56cde7002ed722964216c1c136d47..3f5aa73943d72ae72d51984d9bdaf850f4e241fc 100644 (file)
@@ -138,7 +138,12 @@ int int_engine_configure(char *name, char *value, const CONF *cnf)
                         */
                        if (!strcmp(ctrlvalue, "EMPTY"))
                                ctrlvalue = NULL;
-                       if (!ENGINE_ctrl_cmd_string(e,
+                       if (!strcmp(ctrlname, "default_algorithms"))
+                               {
+                               if (!ENGINE_set_default_string(e, ctrlvalue))
+                                       goto err;
+                               }
+                       else if (!ENGINE_ctrl_cmd_string(e,
                                        ctrlname, ctrlvalue, 0))
                                return 0;
                        }
@@ -151,7 +156,7 @@ int int_engine_configure(char *name, char *value, const CONF *cnf)
                ENGINE_free(e);
        return ret;
        }
-       
+
 
 static int int_engine_module_init(CONF_IMODULE *md, const CONF *cnf)
        {
index f3c0c35863b62a3e1dcd3fedd5128332dad69eaf..8771a8d2618437bcfcf5cebb3292ccb6a33a7af1 100644 (file)
@@ -90,6 +90,7 @@ static ERR_STRING_DATA ENGINE_str_functs[]=
 {ERR_PACK(0,ENGINE_F_ENGINE_MODULE_INIT,0),    "ENGINE_MODULE_INIT"},
 {ERR_PACK(0,ENGINE_F_ENGINE_NEW,0),    "ENGINE_new"},
 {ERR_PACK(0,ENGINE_F_ENGINE_REMOVE,0), "ENGINE_remove"},
+{ERR_PACK(0,ENGINE_F_ENGINE_SET_DEFAULT_STRING,0),     "ENGINE_set_default_string"},
 {ERR_PACK(0,ENGINE_F_ENGINE_SET_DEFAULT_TYPE,0),       "ENGINE_SET_DEFAULT_TYPE"},
 {ERR_PACK(0,ENGINE_F_ENGINE_SET_ID,0), "ENGINE_set_id"},
 {ERR_PACK(0,ENGINE_F_ENGINE_SET_NAME,0),       "ENGINE_set_name"},
@@ -133,6 +134,7 @@ static ERR_STRING_DATA ENGINE_str_reasons[]=
 {ENGINE_R_INVALID_ARGUMENT               ,"invalid argument"},
 {ENGINE_R_INVALID_CMD_NAME               ,"invalid cmd name"},
 {ENGINE_R_INVALID_CMD_NUMBER             ,"invalid cmd number"},
+{ENGINE_R_INVALID_STRING                 ,"invalid string"},
 {ENGINE_R_MISSING_KEY_COMPONENTS         ,"missing key components"},
 {ENGINE_R_NOT_INITIALISED                ,"not initialised"},
 {ENGINE_R_NOT_LOADED                     ,"not loaded"},
index 3fb379f37c6e6f20595bf3ae1b2840dbd8b7c396..e101530ab1a127d538a2d4e85e6dc84804942c2e 100644 (file)
@@ -57,6 +57,7 @@
 #include "cryptlib.h"
 #include "eng_int.h"
 #include <openssl/engine.h>
+#include <openssl/conf.h>
 
 int ENGINE_set_default(ENGINE *e, unsigned int flags)
        {
@@ -81,6 +82,44 @@ int ENGINE_set_default(ENGINE *e, unsigned int flags)
        return 1;
        }
 
+/* Set default algorithms using a string */
+
+int int_def_cb(char *alg, int len, void *arg)
+       {
+       unsigned int *pflags = arg;
+       if (!strncmp(alg, "ALL", len))
+               *pflags |= ENGINE_METHOD_ALL;
+       else if (!strncmp(alg, "RSA", len))
+               *pflags |= ENGINE_METHOD_RSA;
+       else if (!strncmp(alg, "DSA", len))
+               *pflags |= ENGINE_METHOD_DSA;
+       else if (!strncmp(alg, "DH", len))
+               *pflags |= ENGINE_METHOD_DH;
+       else if (!strncmp(alg, "RAND", len))
+               *pflags |= ENGINE_METHOD_RAND;
+       else if (!strncmp(alg, "CIPHERS", len))
+               *pflags |= ENGINE_METHOD_CIPHERS;
+       else if (!strncmp(alg, "DIGESTS", len))
+               *pflags |= ENGINE_METHOD_DIGESTS;
+       else
+               return 0;
+       return 1;
+       }
+
+
+int ENGINE_set_default_string(ENGINE *e, char *list)
+       {
+       unsigned int flags = 0;
+       if (!CONF_parse_list(list, ',', 1, int_def_cb, &flags))
+               {
+               ENGINEerr(ENGINE_F_ENGINE_SET_DEFAULT_STRING,
+                                       ENGINE_R_INVALID_STRING);
+               ERR_add_error_data(2, "str=",list);
+               return 0;
+               }
+       return ENGINE_set_default(e, flags);
+       }
+
 int ENGINE_register_complete(ENGINE *e)
        {
        ENGINE_register_ciphers(e);
index 291841abcc66981ac27f10acd571f0655a28f71c..1dcb53bb1b41f49c58f2cd26db518c227def0363 100644 (file)
@@ -503,6 +503,7 @@ ENGINE *ENGINE_get_digest_engine(int nid);
  * structure will have had its reference count up'd so the caller
  * should still free their own reference 'e'. */
 int ENGINE_set_default_RSA(ENGINE *e);
+int ENGINE_set_default_string(ENGINE *e, char *list);
 /* Same for the other "methods" */
 int ENGINE_set_default_DSA(ENGINE *e);
 int ENGINE_set_default_DH(ENGINE *e);
@@ -651,6 +652,7 @@ void ERR_load_ENGINE_strings(void);
 #define ENGINE_F_ENGINE_MODULE_INIT                     187
 #define ENGINE_F_ENGINE_NEW                             122
 #define ENGINE_F_ENGINE_REMOVE                          123
+#define ENGINE_F_ENGINE_SET_DEFAULT_STRING              189
 #define ENGINE_F_ENGINE_SET_DEFAULT_TYPE                126
 #define ENGINE_F_ENGINE_SET_ID                          129
 #define ENGINE_F_ENGINE_SET_NAME                        130
@@ -691,6 +693,7 @@ void ERR_load_ENGINE_strings(void);
 #define ENGINE_R_INVALID_ARGUMENT                       143
 #define ENGINE_R_INVALID_CMD_NAME                       137
 #define ENGINE_R_INVALID_CMD_NUMBER                     138
+#define ENGINE_R_INVALID_STRING                                 150
 #define ENGINE_R_MISSING_KEY_COMPONENTS                         111
 #define ENGINE_R_NOT_INITIALISED                        117
 #define ENGINE_R_NOT_LOADED                             112