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