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, - ¶meters, &nss); + status = NSSUTIL_ArgParseModuleSpecEx(modulespec, &library, &moduleName, + ¶meters, &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