security/nss/lib/softoken/sftkpars.c

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

michael@0 1 /* This Source Code Form is subject to the terms of the Mozilla Public
michael@0 2 * License, v. 2.0. If a copy of the MPL was not distributed with this
michael@0 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
michael@0 4 /*
michael@0 5 * The following code handles the storage of PKCS 11 modules used by the
michael@0 6 * NSS. This file is written to abstract away how the modules are
michael@0 7 * stored so we can deside that later.
michael@0 8 */
michael@0 9 #include "pkcs11i.h"
michael@0 10 #include "sdb.h"
michael@0 11 #include "prprf.h"
michael@0 12 #include "prenv.h"
michael@0 13 #include "utilpars.h"
michael@0 14
michael@0 15 #define FREE_CLEAR(p) if (p) { PORT_Free(p); p = NULL; }
michael@0 16
michael@0 17 static void
michael@0 18 sftk_parseTokenFlags(char *tmp, sftk_token_parameters *parsed) {
michael@0 19 parsed->readOnly = NSSUTIL_ArgHasFlag("flags","readOnly",tmp);
michael@0 20 parsed->noCertDB = NSSUTIL_ArgHasFlag("flags","noCertDB",tmp);
michael@0 21 parsed->noKeyDB = NSSUTIL_ArgHasFlag("flags","noKeyDB",tmp);
michael@0 22 parsed->forceOpen = NSSUTIL_ArgHasFlag("flags","forceOpen",tmp);
michael@0 23 parsed->pwRequired = NSSUTIL_ArgHasFlag("flags","passwordRequired",tmp);
michael@0 24 parsed->optimizeSpace = NSSUTIL_ArgHasFlag("flags","optimizeSpace",tmp);
michael@0 25 return;
michael@0 26 }
michael@0 27
michael@0 28 static void
michael@0 29 sftk_parseFlags(char *tmp, sftk_parameters *parsed) {
michael@0 30 parsed->noModDB = NSSUTIL_ArgHasFlag("flags","noModDB",tmp);
michael@0 31 parsed->readOnly = NSSUTIL_ArgHasFlag("flags","readOnly",tmp);
michael@0 32 /* keep legacy interface working */
michael@0 33 parsed->noCertDB = NSSUTIL_ArgHasFlag("flags","noCertDB",tmp);
michael@0 34 parsed->forceOpen = NSSUTIL_ArgHasFlag("flags","forceOpen",tmp);
michael@0 35 parsed->pwRequired = NSSUTIL_ArgHasFlag("flags","passwordRequired",tmp);
michael@0 36 parsed->optimizeSpace = NSSUTIL_ArgHasFlag("flags","optimizeSpace",tmp);
michael@0 37 return;
michael@0 38 }
michael@0 39
michael@0 40 static CK_RV
michael@0 41 sftk_parseTokenParameters(char *param, sftk_token_parameters *parsed)
michael@0 42 {
michael@0 43 int next;
michael@0 44 char *tmp = NULL;
michael@0 45 char *index;
michael@0 46 index = NSSUTIL_ArgStrip(param);
michael@0 47
michael@0 48 while (*index) {
michael@0 49 NSSUTIL_HANDLE_STRING_ARG(index,parsed->configdir,"configDir=",;)
michael@0 50 NSSUTIL_HANDLE_STRING_ARG(index,parsed->updatedir,"updateDir=",;)
michael@0 51 NSSUTIL_HANDLE_STRING_ARG(index,parsed->updCertPrefix,
michael@0 52 "updateCertPrefix=",;)
michael@0 53 NSSUTIL_HANDLE_STRING_ARG(index,parsed->updKeyPrefix,
michael@0 54 "updateKeyPrefix=",;)
michael@0 55 NSSUTIL_HANDLE_STRING_ARG(index,parsed->updateID,"updateID=",;)
michael@0 56 NSSUTIL_HANDLE_STRING_ARG(index,parsed->certPrefix,"certPrefix=",;)
michael@0 57 NSSUTIL_HANDLE_STRING_ARG(index,parsed->keyPrefix,"keyPrefix=",;)
michael@0 58 NSSUTIL_HANDLE_STRING_ARG(index,parsed->tokdes,"tokenDescription=",;)
michael@0 59 NSSUTIL_HANDLE_STRING_ARG(index,parsed->updtokdes,
michael@0 60 "updateTokenDescription=",;)
michael@0 61 NSSUTIL_HANDLE_STRING_ARG(index,parsed->slotdes,"slotDescription=",;)
michael@0 62 NSSUTIL_HANDLE_STRING_ARG(index,tmp,"minPWLen=",
michael@0 63 if(tmp) { parsed->minPW=atoi(tmp); PORT_Free(tmp); tmp = NULL; })
michael@0 64 NSSUTIL_HANDLE_STRING_ARG(index,tmp,"flags=",
michael@0 65 if(tmp) { sftk_parseTokenFlags(param,parsed); PORT_Free(tmp);
michael@0 66 tmp = NULL; })
michael@0 67 NSSUTIL_HANDLE_FINAL_ARG(index)
michael@0 68 }
michael@0 69 return CKR_OK;
michael@0 70 }
michael@0 71
michael@0 72 static void
michael@0 73 sftk_parseTokens(char *tokenParams, sftk_parameters *parsed)
michael@0 74 {
michael@0 75 char *tokenIndex;
michael@0 76 sftk_token_parameters *tokens = NULL;
michael@0 77 int i=0,count = 0,next;
michael@0 78
michael@0 79 if ((tokenParams == NULL) || (*tokenParams == 0)) return;
michael@0 80
michael@0 81 /* first count the number of slots */
michael@0 82 for (tokenIndex = NSSUTIL_ArgStrip(tokenParams); *tokenIndex;
michael@0 83 tokenIndex = NSSUTIL_ArgStrip(NSSUTIL_ArgSkipParameter(tokenIndex))) {
michael@0 84 count++;
michael@0 85 }
michael@0 86
michael@0 87 /* get the data structures */
michael@0 88 tokens = (sftk_token_parameters *)
michael@0 89 PORT_ZAlloc(count*sizeof(sftk_token_parameters));
michael@0 90 if (tokens == NULL) return;
michael@0 91
michael@0 92 for (tokenIndex = NSSUTIL_ArgStrip(tokenParams), i = 0;
michael@0 93 *tokenIndex && i < count ; i++ ) {
michael@0 94 char *name;
michael@0 95 name = NSSUTIL_ArgGetLabel(tokenIndex,&next);
michael@0 96 tokenIndex += next;
michael@0 97
michael@0 98 tokens[i].slotID = NSSUTIL_ArgDecodeNumber(name);
michael@0 99 tokens[i].readOnly = PR_FALSE;
michael@0 100 tokens[i].noCertDB = PR_FALSE;
michael@0 101 tokens[i].noKeyDB = PR_FALSE;
michael@0 102 if (!NSSUTIL_ArgIsBlank(*tokenIndex)) {
michael@0 103 char *args = NSSUTIL_ArgFetchValue(tokenIndex,&next);
michael@0 104 tokenIndex += next;
michael@0 105 if (args) {
michael@0 106 sftk_parseTokenParameters(args,&tokens[i]);
michael@0 107 PORT_Free(args);
michael@0 108 }
michael@0 109 }
michael@0 110 if (name) PORT_Free(name);
michael@0 111 tokenIndex = NSSUTIL_ArgStrip(tokenIndex);
michael@0 112 }
michael@0 113 parsed->token_count = i;
michael@0 114 parsed->tokens = tokens;
michael@0 115 return;
michael@0 116 }
michael@0 117
michael@0 118 CK_RV
michael@0 119 sftk_parseParameters(char *param, sftk_parameters *parsed, PRBool isFIPS)
michael@0 120 {
michael@0 121 int next;
michael@0 122 char *tmp = NULL;
michael@0 123 char *index;
michael@0 124 char *certPrefix = NULL, *keyPrefix = NULL;
michael@0 125 char *tokdes = NULL, *ptokdes = NULL, *pupdtokdes = NULL;
michael@0 126 char *slotdes = NULL, *pslotdes = NULL;
michael@0 127 char *fslotdes = NULL, *ftokdes = NULL;
michael@0 128 char *minPW = NULL;
michael@0 129 index = NSSUTIL_ArgStrip(param);
michael@0 130
michael@0 131 PORT_Memset(parsed, 0, sizeof(sftk_parameters));
michael@0 132
michael@0 133 while (*index) {
michael@0 134 NSSUTIL_HANDLE_STRING_ARG(index,parsed->configdir,"configDir=",;)
michael@0 135 NSSUTIL_HANDLE_STRING_ARG(index,parsed->updatedir,"updateDir=",;)
michael@0 136 NSSUTIL_HANDLE_STRING_ARG(index,parsed->updateID,"updateID=",;)
michael@0 137 NSSUTIL_HANDLE_STRING_ARG(index,parsed->secmodName,"secmod=",;)
michael@0 138 NSSUTIL_HANDLE_STRING_ARG(index,parsed->man,"manufacturerID=",;)
michael@0 139 NSSUTIL_HANDLE_STRING_ARG(index,parsed->libdes,"libraryDescription=",;)
michael@0 140 /* constructed values, used so legacy interfaces still work */
michael@0 141 NSSUTIL_HANDLE_STRING_ARG(index,certPrefix,"certPrefix=",;)
michael@0 142 NSSUTIL_HANDLE_STRING_ARG(index,keyPrefix,"keyPrefix=",;)
michael@0 143 NSSUTIL_HANDLE_STRING_ARG(index,tokdes,"cryptoTokenDescription=",;)
michael@0 144 NSSUTIL_HANDLE_STRING_ARG(index,ptokdes,"dbTokenDescription=",;)
michael@0 145 NSSUTIL_HANDLE_STRING_ARG(index,slotdes,"cryptoSlotDescription=",;)
michael@0 146 NSSUTIL_HANDLE_STRING_ARG(index,pslotdes,"dbSlotDescription=",;)
michael@0 147 NSSUTIL_HANDLE_STRING_ARG(index,fslotdes,"FIPSSlotDescription=",;)
michael@0 148 NSSUTIL_HANDLE_STRING_ARG(index,ftokdes,"FIPSTokenDescription=",;)
michael@0 149 NSSUTIL_HANDLE_STRING_ARG(index,pupdtokdes, "updateTokenDescription=",;)
michael@0 150 NSSUTIL_HANDLE_STRING_ARG(index,minPW,"minPWLen=",;)
michael@0 151
michael@0 152 NSSUTIL_HANDLE_STRING_ARG(index,tmp,"flags=",
michael@0 153 if(tmp) { sftk_parseFlags(param,parsed); PORT_Free(tmp);
michael@0 154 tmp = NULL; })
michael@0 155 NSSUTIL_HANDLE_STRING_ARG(index,tmp,"tokens=",
michael@0 156 if(tmp) { sftk_parseTokens(tmp,parsed); PORT_Free(tmp); tmp = NULL; })
michael@0 157 NSSUTIL_HANDLE_FINAL_ARG(index)
michael@0 158 }
michael@0 159 if (parsed->tokens == NULL) {
michael@0 160 int count = isFIPS ? 1 : 2;
michael@0 161 int index = count-1;
michael@0 162 sftk_token_parameters *tokens = NULL;
michael@0 163
michael@0 164 tokens = (sftk_token_parameters *)
michael@0 165 PORT_ZAlloc(count*sizeof(sftk_token_parameters));
michael@0 166 if (tokens == NULL) {
michael@0 167 goto loser;
michael@0 168 }
michael@0 169 parsed->tokens = tokens;
michael@0 170 parsed->token_count = count;
michael@0 171 tokens[index].slotID = isFIPS ? FIPS_SLOT_ID : PRIVATE_KEY_SLOT_ID;
michael@0 172 tokens[index].certPrefix = certPrefix;
michael@0 173 tokens[index].keyPrefix = keyPrefix;
michael@0 174 tokens[index].minPW = minPW ? atoi(minPW) : 0;
michael@0 175 tokens[index].readOnly = parsed->readOnly;
michael@0 176 tokens[index].noCertDB = parsed->noCertDB;
michael@0 177 tokens[index].noKeyDB = parsed->noCertDB;
michael@0 178 tokens[index].forceOpen = parsed->forceOpen;
michael@0 179 tokens[index].pwRequired = parsed->pwRequired;
michael@0 180 tokens[index].optimizeSpace = parsed->optimizeSpace;
michael@0 181 tokens[0].optimizeSpace = parsed->optimizeSpace;
michael@0 182 certPrefix = NULL;
michael@0 183 keyPrefix = NULL;
michael@0 184 if (isFIPS) {
michael@0 185 tokens[index].tokdes = ftokdes;
michael@0 186 tokens[index].updtokdes = pupdtokdes;
michael@0 187 tokens[index].slotdes = fslotdes;
michael@0 188 fslotdes = NULL;
michael@0 189 ftokdes = NULL;
michael@0 190 pupdtokdes = NULL;
michael@0 191 } else {
michael@0 192 tokens[index].tokdes = ptokdes;
michael@0 193 tokens[index].updtokdes = pupdtokdes;
michael@0 194 tokens[index].slotdes = pslotdes;
michael@0 195 tokens[0].slotID = NETSCAPE_SLOT_ID;
michael@0 196 tokens[0].tokdes = tokdes;
michael@0 197 tokens[0].slotdes = slotdes;
michael@0 198 tokens[0].noCertDB = PR_TRUE;
michael@0 199 tokens[0].noKeyDB = PR_TRUE;
michael@0 200 pupdtokdes = NULL;
michael@0 201 ptokdes = NULL;
michael@0 202 pslotdes = NULL;
michael@0 203 tokdes = NULL;
michael@0 204 slotdes = NULL;
michael@0 205 }
michael@0 206 }
michael@0 207
michael@0 208 loser:
michael@0 209 FREE_CLEAR(certPrefix);
michael@0 210 FREE_CLEAR(keyPrefix);
michael@0 211 FREE_CLEAR(tokdes);
michael@0 212 FREE_CLEAR(ptokdes);
michael@0 213 FREE_CLEAR(pupdtokdes);
michael@0 214 FREE_CLEAR(slotdes);
michael@0 215 FREE_CLEAR(pslotdes);
michael@0 216 FREE_CLEAR(fslotdes);
michael@0 217 FREE_CLEAR(ftokdes);
michael@0 218 FREE_CLEAR(minPW);
michael@0 219 return CKR_OK;
michael@0 220 }
michael@0 221
michael@0 222 void
michael@0 223 sftk_freeParams(sftk_parameters *params)
michael@0 224 {
michael@0 225 int i;
michael@0 226
michael@0 227 for (i=0; i < params->token_count; i++) {
michael@0 228 FREE_CLEAR(params->tokens[i].configdir);
michael@0 229 FREE_CLEAR(params->tokens[i].certPrefix);
michael@0 230 FREE_CLEAR(params->tokens[i].keyPrefix);
michael@0 231 FREE_CLEAR(params->tokens[i].tokdes);
michael@0 232 FREE_CLEAR(params->tokens[i].slotdes);
michael@0 233 FREE_CLEAR(params->tokens[i].updatedir);
michael@0 234 FREE_CLEAR(params->tokens[i].updCertPrefix);
michael@0 235 FREE_CLEAR(params->tokens[i].updKeyPrefix);
michael@0 236 FREE_CLEAR(params->tokens[i].updateID);
michael@0 237 FREE_CLEAR(params->tokens[i].updtokdes);
michael@0 238 }
michael@0 239
michael@0 240 FREE_CLEAR(params->configdir);
michael@0 241 FREE_CLEAR(params->secmodName);
michael@0 242 FREE_CLEAR(params->man);
michael@0 243 FREE_CLEAR(params->libdes);
michael@0 244 FREE_CLEAR(params->tokens);
michael@0 245 FREE_CLEAR(params->updatedir);
michael@0 246 FREE_CLEAR(params->updateID);
michael@0 247 }
michael@0 248

mercurial