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