Mercurial > trustbridge > nss-cmake-static
diff nss/lib/softoken/sftkpars.c @ 0:1e5118fa0cb1
This is NSS with a Cmake Buildsyste
To compile a static NSS library for Windows we've used the
Chromium-NSS fork and added a Cmake buildsystem to compile
it statically for Windows. See README.chromium for chromium
changes and README.trustbridge for our modifications.
author | Andre Heinecke <andre.heinecke@intevation.de> |
---|---|
date | Mon, 28 Jul 2014 10:47:06 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nss/lib/softoken/sftkpars.c Mon Jul 28 10:47:06 2014 +0200 @@ -0,0 +1,248 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +/* + * The following code handles the storage of PKCS 11 modules used by the + * NSS. This file is written to abstract away how the modules are + * stored so we can deside that later. + */ +#include "pkcs11i.h" +#include "sdb.h" +#include "prprf.h" +#include "prenv.h" +#include "utilpars.h" + +#define FREE_CLEAR(p) if (p) { PORT_Free(p); p = NULL; } + +static void +sftk_parseTokenFlags(char *tmp, sftk_token_parameters *parsed) { + parsed->readOnly = NSSUTIL_ArgHasFlag("flags","readOnly",tmp); + parsed->noCertDB = NSSUTIL_ArgHasFlag("flags","noCertDB",tmp); + parsed->noKeyDB = NSSUTIL_ArgHasFlag("flags","noKeyDB",tmp); + parsed->forceOpen = NSSUTIL_ArgHasFlag("flags","forceOpen",tmp); + parsed->pwRequired = NSSUTIL_ArgHasFlag("flags","passwordRequired",tmp); + parsed->optimizeSpace = NSSUTIL_ArgHasFlag("flags","optimizeSpace",tmp); + return; +} + +static void +sftk_parseFlags(char *tmp, sftk_parameters *parsed) { + parsed->noModDB = NSSUTIL_ArgHasFlag("flags","noModDB",tmp); + parsed->readOnly = NSSUTIL_ArgHasFlag("flags","readOnly",tmp); + /* keep legacy interface working */ + parsed->noCertDB = NSSUTIL_ArgHasFlag("flags","noCertDB",tmp); + parsed->forceOpen = NSSUTIL_ArgHasFlag("flags","forceOpen",tmp); + parsed->pwRequired = NSSUTIL_ArgHasFlag("flags","passwordRequired",tmp); + parsed->optimizeSpace = NSSUTIL_ArgHasFlag("flags","optimizeSpace",tmp); + return; +} + +static CK_RV +sftk_parseTokenParameters(char *param, sftk_token_parameters *parsed) +{ + int next; + char *tmp = NULL; + char *index; + index = NSSUTIL_ArgStrip(param); + + while (*index) { + NSSUTIL_HANDLE_STRING_ARG(index,parsed->configdir,"configDir=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->updatedir,"updateDir=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->updCertPrefix, + "updateCertPrefix=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->updKeyPrefix, + "updateKeyPrefix=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->updateID,"updateID=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->certPrefix,"certPrefix=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->keyPrefix,"keyPrefix=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->tokdes,"tokenDescription=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->updtokdes, + "updateTokenDescription=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->slotdes,"slotDescription=",;) + NSSUTIL_HANDLE_STRING_ARG(index,tmp,"minPWLen=", + if(tmp) { parsed->minPW=atoi(tmp); PORT_Free(tmp); tmp = NULL; }) + NSSUTIL_HANDLE_STRING_ARG(index,tmp,"flags=", + if(tmp) { sftk_parseTokenFlags(param,parsed); PORT_Free(tmp); + tmp = NULL; }) + NSSUTIL_HANDLE_FINAL_ARG(index) + } + return CKR_OK; +} + +static void +sftk_parseTokens(char *tokenParams, sftk_parameters *parsed) +{ + char *tokenIndex; + sftk_token_parameters *tokens = NULL; + int i=0,count = 0,next; + + if ((tokenParams == NULL) || (*tokenParams == 0)) return; + + /* first count the number of slots */ + for (tokenIndex = NSSUTIL_ArgStrip(tokenParams); *tokenIndex; + tokenIndex = NSSUTIL_ArgStrip(NSSUTIL_ArgSkipParameter(tokenIndex))) { + count++; + } + + /* get the data structures */ + tokens = (sftk_token_parameters *) + PORT_ZAlloc(count*sizeof(sftk_token_parameters)); + if (tokens == NULL) return; + + for (tokenIndex = NSSUTIL_ArgStrip(tokenParams), i = 0; + *tokenIndex && i < count ; i++ ) { + char *name; + name = NSSUTIL_ArgGetLabel(tokenIndex,&next); + tokenIndex += next; + + tokens[i].slotID = NSSUTIL_ArgDecodeNumber(name); + tokens[i].readOnly = PR_FALSE; + tokens[i].noCertDB = PR_FALSE; + tokens[i].noKeyDB = PR_FALSE; + if (!NSSUTIL_ArgIsBlank(*tokenIndex)) { + char *args = NSSUTIL_ArgFetchValue(tokenIndex,&next); + tokenIndex += next; + if (args) { + sftk_parseTokenParameters(args,&tokens[i]); + PORT_Free(args); + } + } + if (name) PORT_Free(name); + tokenIndex = NSSUTIL_ArgStrip(tokenIndex); + } + parsed->token_count = i; + parsed->tokens = tokens; + return; +} + +CK_RV +sftk_parseParameters(char *param, sftk_parameters *parsed, PRBool isFIPS) +{ + int next; + char *tmp = NULL; + char *index; + char *certPrefix = NULL, *keyPrefix = NULL; + char *tokdes = NULL, *ptokdes = NULL, *pupdtokdes = NULL; + char *slotdes = NULL, *pslotdes = NULL; + char *fslotdes = NULL, *ftokdes = NULL; + char *minPW = NULL; + index = NSSUTIL_ArgStrip(param); + + PORT_Memset(parsed, 0, sizeof(sftk_parameters)); + + while (*index) { + NSSUTIL_HANDLE_STRING_ARG(index,parsed->configdir,"configDir=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->updatedir,"updateDir=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->updateID,"updateID=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->secmodName,"secmod=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->man,"manufacturerID=",;) + NSSUTIL_HANDLE_STRING_ARG(index,parsed->libdes,"libraryDescription=",;) + /* constructed values, used so legacy interfaces still work */ + NSSUTIL_HANDLE_STRING_ARG(index,certPrefix,"certPrefix=",;) + NSSUTIL_HANDLE_STRING_ARG(index,keyPrefix,"keyPrefix=",;) + NSSUTIL_HANDLE_STRING_ARG(index,tokdes,"cryptoTokenDescription=",;) + NSSUTIL_HANDLE_STRING_ARG(index,ptokdes,"dbTokenDescription=",;) + NSSUTIL_HANDLE_STRING_ARG(index,slotdes,"cryptoSlotDescription=",;) + NSSUTIL_HANDLE_STRING_ARG(index,pslotdes,"dbSlotDescription=",;) + NSSUTIL_HANDLE_STRING_ARG(index,fslotdes,"FIPSSlotDescription=",;) + NSSUTIL_HANDLE_STRING_ARG(index,ftokdes,"FIPSTokenDescription=",;) + NSSUTIL_HANDLE_STRING_ARG(index,pupdtokdes, "updateTokenDescription=",;) + NSSUTIL_HANDLE_STRING_ARG(index,minPW,"minPWLen=",;) + + NSSUTIL_HANDLE_STRING_ARG(index,tmp,"flags=", + if(tmp) { sftk_parseFlags(param,parsed); PORT_Free(tmp); + tmp = NULL; }) + NSSUTIL_HANDLE_STRING_ARG(index,tmp,"tokens=", + if(tmp) { sftk_parseTokens(tmp,parsed); PORT_Free(tmp); tmp = NULL; }) + NSSUTIL_HANDLE_FINAL_ARG(index) + } + if (parsed->tokens == NULL) { + int count = isFIPS ? 1 : 2; + int index = count-1; + sftk_token_parameters *tokens = NULL; + + tokens = (sftk_token_parameters *) + PORT_ZAlloc(count*sizeof(sftk_token_parameters)); + if (tokens == NULL) { + goto loser; + } + parsed->tokens = tokens; + parsed->token_count = count; + tokens[index].slotID = isFIPS ? FIPS_SLOT_ID : PRIVATE_KEY_SLOT_ID; + tokens[index].certPrefix = certPrefix; + tokens[index].keyPrefix = keyPrefix; + tokens[index].minPW = minPW ? atoi(minPW) : 0; + tokens[index].readOnly = parsed->readOnly; + tokens[index].noCertDB = parsed->noCertDB; + tokens[index].noKeyDB = parsed->noCertDB; + tokens[index].forceOpen = parsed->forceOpen; + tokens[index].pwRequired = parsed->pwRequired; + tokens[index].optimizeSpace = parsed->optimizeSpace; + tokens[0].optimizeSpace = parsed->optimizeSpace; + certPrefix = NULL; + keyPrefix = NULL; + if (isFIPS) { + tokens[index].tokdes = ftokdes; + tokens[index].updtokdes = pupdtokdes; + tokens[index].slotdes = fslotdes; + fslotdes = NULL; + ftokdes = NULL; + pupdtokdes = NULL; + } else { + tokens[index].tokdes = ptokdes; + tokens[index].updtokdes = pupdtokdes; + tokens[index].slotdes = pslotdes; + tokens[0].slotID = NETSCAPE_SLOT_ID; + tokens[0].tokdes = tokdes; + tokens[0].slotdes = slotdes; + tokens[0].noCertDB = PR_TRUE; + tokens[0].noKeyDB = PR_TRUE; + pupdtokdes = NULL; + ptokdes = NULL; + pslotdes = NULL; + tokdes = NULL; + slotdes = NULL; + } + } + +loser: + FREE_CLEAR(certPrefix); + FREE_CLEAR(keyPrefix); + FREE_CLEAR(tokdes); + FREE_CLEAR(ptokdes); + FREE_CLEAR(pupdtokdes); + FREE_CLEAR(slotdes); + FREE_CLEAR(pslotdes); + FREE_CLEAR(fslotdes); + FREE_CLEAR(ftokdes); + FREE_CLEAR(minPW); + return CKR_OK; +} + +void +sftk_freeParams(sftk_parameters *params) +{ + int i; + + for (i=0; i < params->token_count; i++) { + FREE_CLEAR(params->tokens[i].configdir); + FREE_CLEAR(params->tokens[i].certPrefix); + FREE_CLEAR(params->tokens[i].keyPrefix); + FREE_CLEAR(params->tokens[i].tokdes); + FREE_CLEAR(params->tokens[i].slotdes); + FREE_CLEAR(params->tokens[i].updatedir); + FREE_CLEAR(params->tokens[i].updCertPrefix); + FREE_CLEAR(params->tokens[i].updKeyPrefix); + FREE_CLEAR(params->tokens[i].updateID); + FREE_CLEAR(params->tokens[i].updtokdes); + } + + FREE_CLEAR(params->configdir); + FREE_CLEAR(params->secmodName); + FREE_CLEAR(params->man); + FREE_CLEAR(params->libdes); + FREE_CLEAR(params->tokens); + FREE_CLEAR(params->updatedir); + FREE_CLEAR(params->updateID); +} +