Thu, 22 Jan 2015 13:21:57 +0100
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 |