This allows reading the "config=" value from the pkcs11.txt.
---
 lib/nss/nss.def         |  1 +
 lib/pk11wrap/pk11pars.c | 23 ++++++++++++++++++++---
 lib/pk11wrap/secmod.h   |  3 +++
 lib/util/nssutil.def    |  6 ++++++
 lib/util/utilpars.c     | 49 +++++++++++++++++++++++++++++++++++++++++++++----
 lib/util/utilpars.h     |  4 ++++
 6 files changed, 79 insertions(+), 7 deletions(-)

diff --git a/lib/nss/nss.def b/lib/nss/nss.def
index 70eee9d..3e6b12c 100644
--- a/lib/nss/nss.def
+++ b/lib/nss/nss.def
@@ -1057,6 +1057,7 @@ SECMOD_InternaltoPubMechFlags;
 ;+    global:
 NSS_OptionGet;
 NSS_OptionSet;
+SECMOD_CreateModuleEx;
 ;+    local:
 ;+       *;
 ;+};
diff --git a/lib/pk11wrap/pk11pars.c b/lib/pk11wrap/pk11pars.c
index 314062b..40ac790 100644
--- a/lib/pk11wrap/pk11pars.c
+++ b/lib/pk11wrap/pk11pars.c
@@ -134,6 +134,17 @@ SECMODModule *
 SECMOD_CreateModule(const char *library, const char *moduleName, 
                                const char *parameters, const char *nss)
 {
+    return SECMOD_CreateModuleEx(library, moduleName, parameters, nss, NULL);
+}
+
+/*
+ * for 3.4 we continue to use the old SECMODModule structure
+ */
+SECMODModule *
+SECMOD_CreateModuleEx(const char *library, const char *moduleName, 
+                               const char *parameters, const char *nss,
+                               const char *config)
+{
     SECMODModule *mod = secmod_NewModule();
     char *slotParams,*ciphers;
     /* pk11pars.h still does not have const char * interfaces */
@@ -148,6 +159,9 @@ SECMOD_CreateModule(const char *library, const char 
*moduleName,
     if (parameters) {
        mod->libraryParams = PORT_ArenaStrdup(mod->arena,parameters);
     }
+    if (config) {
+       /* XXX: Apply configuration */
+    }
     mod->internal   = NSSUTIL_ArgHasFlag("flags","internal",nssc);
     mod->isFIPS     = NSSUTIL_ArgHasFlag("flags","FIPS",nssc);
     mod->isCritical = NSSUTIL_ArgHasFlag("flags","critical",nssc);
@@ -977,6 +991,7 @@ SECMODModule *
 SECMOD_LoadModule(char *modulespec,SECMODModule *parent, PRBool recurse)
 {
     char *library = NULL, *moduleName = NULL, *parameters = NULL, *nss= NULL;
+    char *config = NULL;
     SECStatus status;
     SECMODModule *module = NULL;
     SECMODModule *oldModule = NULL;
@@ -985,17 +1000,19 @@ SECMOD_LoadModule(char *modulespec,SECMODModule *parent, 
PRBool recurse)
     /* initialize the underlying module structures */
     SECMOD_Init();
 
-    status = NSSUTIL_ArgParseModuleSpec(modulespec, &library, &moduleName, 
-                                                       &parameters, &nss);
+    status = NSSUTIL_ArgParseModuleSpecEx(modulespec, &library, &moduleName, 
+                                                       &parameters, &nss,
+                                                       &config);
     if (status != SECSuccess) {
        goto loser;
     }
 
-    module = SECMOD_CreateModule(library, moduleName, parameters, nss);
+    module = SECMOD_CreateModuleEx(library, moduleName, parameters, nss, 
config);
     if (library) PORT_Free(library);
     if (moduleName) PORT_Free(moduleName);
     if (parameters) PORT_Free(parameters);
     if (nss) PORT_Free(nss);
+    if (config) PORT_Free(config);
     if (!module) {
        goto loser;
     }
diff --git a/lib/pk11wrap/secmod.h b/lib/pk11wrap/secmod.h
index 9cc4cfb..c194d9a 100644
--- a/lib/pk11wrap/secmod.h
+++ b/lib/pk11wrap/secmod.h
@@ -64,6 +64,9 @@ SECStatus SECMOD_UnloadUserModule(SECMODModule *mod);
 
 SECMODModule * SECMOD_CreateModule(const char *lib, const char *name,
                                        const char *param, const char *nss);
+SECMODModule * SECMOD_CreateModuleEx(const char *lib, const char *name,
+                                       const char *param, const char *nss,
+                                       const char *config);
 /*
  * After a fork(), PKCS #11 says we need to call C_Initialize again in
  * the child before we can use the module. This function causes this 
diff --git a/lib/util/nssutil.def b/lib/util/nssutil.def
index 86a0ad7..4679793 100644
--- a/lib/util/nssutil.def
+++ b/lib/util/nssutil.def
@@ -271,3 +271,9 @@ SECITEM_ZfreeArray;
 ;+    local:
 ;+       *;
 ;+};
+;+NSSUTIL_3.16 {         # NSS Utilities 3.16 release
+;+    global:
+NSSUTIL_ArgParseModuleSpecEx;
+;+    local:
+;+       *;
+;+};
diff --git a/lib/util/utilpars.c b/lib/util/utilpars.c
index d2cd3e0..278f9c4 100644
--- a/lib/util/utilpars.c
+++ b/lib/util/utilpars.c
@@ -767,6 +767,31 @@ NSSUTIL_MkSlotString(unsigned long slotID, unsigned long 
defaultFlags,
  * and NSS specifi parameters.
  */
 SECStatus
+NSSUTIL_ArgParseModuleSpecEx(char *modulespec, char **lib, char **mod, 
+                                       char **parameters, char **nss,
+                                       char **config)
+{
+    int next;
+    modulespec = NSSUTIL_ArgStrip(modulespec);
+
+    *lib = *mod = *parameters = *nss = *config = 0;
+
+    while (*modulespec) {
+       NSSUTIL_HANDLE_STRING_ARG(modulespec,*lib,"library=",;)
+       NSSUTIL_HANDLE_STRING_ARG(modulespec,*mod,"name=",;)
+       NSSUTIL_HANDLE_STRING_ARG(modulespec,*parameters,"parameters=",;)
+       NSSUTIL_HANDLE_STRING_ARG(modulespec,*nss,"nss=",;)
+        NSSUTIL_HANDLE_STRING_ARG(modulespec,*config,"config=",;)
+       NSSUTIL_HANDLE_FINAL_ARG(modulespec)
+   }
+   return SECSuccess;
+}
+
+/************************************************************************
+ * Parse Full module specs into: library, commonName, module parameters,
+ * and NSS specifi parameters.
+ */
+SECStatus
 NSSUTIL_ArgParseModuleSpec(char *modulespec, char **lib, char **mod, 
                                        char **parameters, char **nss)
 {
@@ -788,11 +813,12 @@ NSSUTIL_ArgParseModuleSpec(char *modulespec, char **lib, 
char **mod,
 /************************************************************************
  * make a new module spec from it's components */
 char *
-NSSUTIL_MkModuleSpec(char *dllName, char *commonName, char *parameters, 
-                                                               char *NSS)
+NSSUTIL_MkModuleSpecEx(char *dllName, char *commonName, char *parameters, 
+                                                               char *NSS,
+                                                               char *config)
 {
     char *moduleSpec;
-    char *lib,*name,*param,*nss;
+    char *lib,*name,*param,*nss,*conf;
 
     /*
      * now the final spec
@@ -801,7 +827,13 @@ NSSUTIL_MkModuleSpec(char *dllName, char *commonName, char 
*parameters,
     name = nssutil_formatPair("name",commonName,'\"');
     param = nssutil_formatPair("parameters",parameters,'\"');
     nss = nssutil_formatPair("NSS",NSS,'\"');
-    moduleSpec = PR_smprintf("%s %s %s %s", lib,name,param,nss);
+    if (config) {
+        conf = nssutil_formatPair("config",config,'\"');
+        moduleSpec = PR_smprintf("%s %s %s %s %s", lib,name,param,nss,conf);
+        nssutil_freePair(conf);
+    } else {
+        moduleSpec = PR_smprintf("%s %s %s %s", lib,name,param,nss);
+    }
     nssutil_freePair(lib);
     nssutil_freePair(name);
     nssutil_freePair(param);
@@ -809,6 +841,15 @@ NSSUTIL_MkModuleSpec(char *dllName, char *commonName, char 
*parameters,
     return (moduleSpec);
 }
 
+/************************************************************************
+ * make a new module spec from it's components */
+char *
+NSSUTIL_MkModuleSpec(char *dllName, char *commonName, char *parameters, 
+                                                               char *NSS)
+{
+    return NSSUTIL_MkModuleSpecEx(dllName, commonName, parameters, NSS, NULL);
+}
+
 
 #define NSSUTIL_ARG_FORTEZZA_FLAG "FORTEZZA"
 /******************************************************************************
diff --git a/lib/util/utilpars.h b/lib/util/utilpars.h
index e01ba14..7562bb6 100644
--- a/lib/util/utilpars.h
+++ b/lib/util/utilpars.h
@@ -39,8 +39,12 @@ char * NSSUTIL_MkSlotString(unsigned long slotID, unsigned 
long defaultFlags,
                   PRBool hasRootCerts, PRBool hasRootTrust);
 SECStatus NSSUTIL_ArgParseModuleSpec(char *modulespec, char **lib, char **mod,
                                         char **parameters, char **nss);
+SECStatus NSSUTIL_ArgParseModuleSpecEx(char *modulespec, char **lib, char 
**mod,
+                                        char **parameters, char **nss, char 
**config);
 char *NSSUTIL_MkModuleSpec(char *dllName, char *commonName, 
                                        char *parameters, char *NSS);
+char *NSSUTIL_MkModuleSpecEx(char *dllName, char *commonName, 
+                               char *parameters, char *NSS, char *config);
 void NSSUTIL_ArgParseCipherFlags(unsigned long *newCiphers,char *cipherList);
 char * NSSUTIL_MkNSSString(char **slotStrings, int slotCount, PRBool internal,
           PRBool isFIPS, PRBool isModuleDB,  PRBool isModuleDBOnly,
-- 
1.9.0


-- 
dev-tech-crypto mailing list
dev-tech-crypto@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-tech-crypto

Reply via email to