Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(217)

Side by Side Diff: nss/lib/ckfw/token.c

Issue 1843333003: Update NSPR to 4.12 and NSS to 3.23 on iOS (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/nss.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* This Source Code Form is subject to the terms of the Mozilla Public 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 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/. */ 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 4
5 /* 5 /*
6 * token.c 6 * token.c
7 * 7 *
8 * This file implements the NSSCKFWToken type and methods. 8 * This file implements the NSSCKFWToken type and methods.
9 */ 9 */
10 10
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 * nssCKFWToken_GetHardwareVersion 68 * nssCKFWToken_GetHardwareVersion
69 * nssCKFWToken_GetFirmwareVersion 69 * nssCKFWToken_GetFirmwareVersion
70 * nssCKFWToken_GetUTCTime 70 * nssCKFWToken_GetUTCTime
71 * nssCKFWToken_OpenSession 71 * nssCKFWToken_OpenSession
72 * nssCKFWToken_GetMechanismCount 72 * nssCKFWToken_GetMechanismCount
73 * nssCKFWToken_GetMechanismTypes 73 * nssCKFWToken_GetMechanismTypes
74 * nssCKFWToken_GetMechanism 74 * nssCKFWToken_GetMechanism
75 */ 75 */
76 76
77 struct NSSCKFWTokenStr { 77 struct NSSCKFWTokenStr {
78 NSSCKFWMutex *mutex; 78 NSSCKFWMutex *mutex;
79 NSSArena *arena; 79 NSSArena *arena;
80 NSSCKMDToken *mdToken; 80 NSSCKMDToken *mdToken;
81 NSSCKFWSlot *fwSlot; 81 NSSCKFWSlot *fwSlot;
82 NSSCKMDSlot *mdSlot; 82 NSSCKMDSlot *mdSlot;
83 NSSCKFWInstance *fwInstance; 83 NSSCKFWInstance *fwInstance;
84 NSSCKMDInstance *mdInstance; 84 NSSCKMDInstance *mdInstance;
85 85
86 /* 86 /*
87 * Everything above is set at creation time, and then not modified. 87 * Everything above is set at creation time, and then not modified.
88 * The invariants the mutex protects are: 88 * The invariants the mutex protects are:
89 * 89 *
90 * 1) Each of the cached descriptions (versions, etc.) are in an 90 * 1) Each of the cached descriptions (versions, etc.) are in an
91 * internally consistant state. 91 * internally consistant state.
92 * 92 *
93 * 2) The session counts and hashes are consistant. 93 * 2) The session counts and hashes are consistant.
94 * 94 *
95 * 3) The object hashes are consistant. 95 * 3) The object hashes are consistant.
96 * 96 *
97 * Note that the calls accessing the cached descriptions will call 97 * Note that the calls accessing the cached descriptions will call
98 * the NSSCKMDToken methods with the mutex locked. Those methods 98 * the NSSCKMDToken methods with the mutex locked. Those methods
99 * may then call the public NSSCKFWToken routines. Those public 99 * may then call the public NSSCKFWToken routines. Those public
100 * routines only access the constant data above and the atomic 100 * routines only access the constant data above and the atomic
101 * CK_STATE session state variable below, so there's no problem. 101 * CK_STATE session state variable below, so there's no problem.
102 * But be careful if you add to this object; mutexes are in 102 * But be careful if you add to this object; mutexes are in
103 * general not reentrant, so don't create deadlock situations. 103 * general not reentrant, so don't create deadlock situations.
104 */ 104 */
105 105
106 NSSUTF8 *label; 106 NSSUTF8 *label;
107 NSSUTF8 *manufacturerID; 107 NSSUTF8 *manufacturerID;
108 NSSUTF8 *model; 108 NSSUTF8 *model;
109 NSSUTF8 *serialNumber; 109 NSSUTF8 *serialNumber;
110 CK_VERSION hardwareVersion; 110 CK_VERSION hardwareVersion;
111 CK_VERSION firmwareVersion; 111 CK_VERSION firmwareVersion;
112 112
113 CK_ULONG sessionCount; 113 CK_ULONG sessionCount;
114 CK_ULONG rwSessionCount; 114 CK_ULONG rwSessionCount;
115 nssCKFWHash *sessions; 115 nssCKFWHash *sessions;
116 nssCKFWHash *sessionObjectHash; 116 nssCKFWHash *sessionObjectHash;
117 nssCKFWHash *mdObjectHash; 117 nssCKFWHash *mdObjectHash;
118 nssCKFWHash *mdMechanismHash; 118 nssCKFWHash *mdMechanismHash;
119 119
120 CK_STATE state; 120 CK_STATE state;
121 }; 121 };
122 122
123 #ifdef DEBUG 123 #ifdef DEBUG
124 /* 124 /*
125 * But first, the pointer-tracking stuff. 125 * But first, the pointer-tracking stuff.
126 * 126 *
127 * NOTE: the pointer-tracking support in NSS/base currently relies 127 * NOTE: the pointer-tracking support in NSS/base currently relies
128 * upon NSPR's CallOnce support. That, however, relies upon NSPR's 128 * upon NSPR's CallOnce support. That, however, relies upon NSPR's
129 * locking, which is tied into the runtime. We need a pointer-tracker 129 * locking, which is tied into the runtime. We need a pointer-tracker
130 * implementation that uses the locks supplied through C_Initialize. 130 * implementation that uses the locks supplied through C_Initialize.
131 * That support, however, can be filled in later. So for now, I'll 131 * That support, however, can be filled in later. So for now, I'll
132 * just do this routines as no-ops. 132 * just do this routines as no-ops.
133 */ 133 */
134 134
135 static CK_RV 135 static CK_RV
136 token_add_pointer 136 token_add_pointer(
137 ( 137 const NSSCKFWToken *fwToken)
138 const NSSCKFWToken *fwToken
139 )
140 { 138 {
141 return CKR_OK; 139 return CKR_OK;
142 } 140 }
143 141
144 static CK_RV 142 static CK_RV
145 token_remove_pointer 143 token_remove_pointer(
146 ( 144 const NSSCKFWToken *fwToken)
147 const NSSCKFWToken *fwToken
148 )
149 { 145 {
150 return CKR_OK; 146 return CKR_OK;
151 } 147 }
152 148
153 NSS_IMPLEMENT CK_RV 149 NSS_IMPLEMENT CK_RV
154 nssCKFWToken_verifyPointer 150 nssCKFWToken_verifyPointer(
155 ( 151 const NSSCKFWToken *fwToken)
156 const NSSCKFWToken *fwToken
157 )
158 { 152 {
159 return CKR_OK; 153 return CKR_OK;
160 } 154 }
161 155
162 #endif /* DEBUG */ 156 #endif /* DEBUG */
163 157
164 /* 158 /*
165 * nssCKFWToken_Create 159 * nssCKFWToken_Create
166 * 160 *
167 */ 161 */
168 NSS_IMPLEMENT NSSCKFWToken * 162 NSS_IMPLEMENT NSSCKFWToken *
169 nssCKFWToken_Create 163 nssCKFWToken_Create(
170 ( 164 NSSCKFWSlot *fwSlot,
171 NSSCKFWSlot *fwSlot, 165 NSSCKMDToken *mdToken,
172 NSSCKMDToken *mdToken, 166 CK_RV *pError)
173 CK_RV *pError
174 )
175 { 167 {
176 NSSArena *arena = (NSSArena *)NULL; 168 NSSArena *arena = (NSSArena *)NULL;
177 NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL; 169 NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL;
178 CK_BBOOL called_setup = CK_FALSE; 170 CK_BBOOL called_setup = CK_FALSE;
179 171
180 /* 172 /*
181 * We have already verified the arguments in nssCKFWSlot_GetToken. 173 * We have already verified the arguments in nssCKFWSlot_GetToken.
182 */ 174 */
183 175
184 arena = NSSArena_Create(); 176 arena = NSSArena_Create();
185 if (!arena) { 177 if (!arena) {
186 *pError = CKR_HOST_MEMORY; 178 *pError = CKR_HOST_MEMORY;
187 goto loser; 179 goto loser;
188 } 180 }
189 181
190 fwToken = nss_ZNEW(arena, NSSCKFWToken); 182 fwToken = nss_ZNEW(arena, NSSCKFWToken);
191 if (!fwToken) { 183 if (!fwToken) {
192 *pError = CKR_HOST_MEMORY; 184 *pError = CKR_HOST_MEMORY;
193 goto loser; 185 goto loser;
194 } 186 }
195 187
196 fwToken->arena = arena; 188 fwToken->arena = arena;
197 fwToken->mdToken = mdToken; 189 fwToken->mdToken = mdToken;
198 fwToken->fwSlot = fwSlot; 190 fwToken->fwSlot = fwSlot;
199 fwToken->fwInstance = nssCKFWSlot_GetFWInstance(fwSlot); 191 fwToken->fwInstance = nssCKFWSlot_GetFWInstance(fwSlot);
200 fwToken->mdInstance = nssCKFWSlot_GetMDInstance(fwSlot); 192 fwToken->mdInstance = nssCKFWSlot_GetMDInstance(fwSlot);
201 fwToken->state = CKS_RO_PUBLIC_SESSION; /* some default */ 193 fwToken->state = CKS_RO_PUBLIC_SESSION; /* some default */
202 fwToken->sessionCount = 0; 194 fwToken->sessionCount = 0;
203 fwToken->rwSessionCount = 0; 195 fwToken->rwSessionCount = 0;
204 196
205 fwToken->mutex = nssCKFWInstance_CreateMutex(fwToken->fwInstance, arena, pErro r); 197 fwToken->mutex = nssCKFWInstance_CreateMutex(fwToken->fwInstance, arena, pEr ror);
206 if (!fwToken->mutex) { 198 if (!fwToken->mutex) {
207 if( CKR_OK == *pError ) { 199 if (CKR_OK == *pError) {
208 *pError = CKR_GENERAL_ERROR; 200 *pError = CKR_GENERAL_ERROR;
201 }
202 goto loser;
209 } 203 }
210 goto loser;
211 }
212 204
213 fwToken->sessions = nssCKFWHash_Create(fwToken->fwInstance, arena, pError); 205 fwToken->sessions = nssCKFWHash_Create(fwToken->fwInstance, arena, pError);
214 if (!fwToken->sessions) { 206 if (!fwToken->sessions) {
215 if( CKR_OK == *pError ) { 207 if (CKR_OK == *pError) {
216 *pError = CKR_GENERAL_ERROR; 208 *pError = CKR_GENERAL_ERROR;
209 }
210 goto loser;
217 } 211 }
218 goto loser;
219 }
220 212
221 if( CK_TRUE != nssCKFWInstance_GetModuleHandlesSessionObjects( 213 if (CK_TRUE != nssCKFWInstance_GetModuleHandlesSessionObjects(
222 fwToken->fwInstance) ) { 214 fwToken->fwInstance)) {
223 fwToken->sessionObjectHash = nssCKFWHash_Create(fwToken->fwInstance, 215 fwToken->sessionObjectHash = nssCKFWHash_Create(fwToken->fwInstance,
224 arena, pError); 216 arena, pError);
225 if (!fwToken->sessionObjectHash) { 217 if (!fwToken->sessionObjectHash) {
226 if( CKR_OK == *pError ) { 218 if (CKR_OK == *pError) {
227 *pError = CKR_GENERAL_ERROR; 219 *pError = CKR_GENERAL_ERROR;
228 } 220 }
229 goto loser; 221 goto loser;
222 }
230 } 223 }
231 }
232 224
233 fwToken->mdObjectHash = nssCKFWHash_Create(fwToken->fwInstance, 225 fwToken->mdObjectHash = nssCKFWHash_Create(fwToken->fwInstance,
234 arena, pError); 226 arena, pError);
235 if (!fwToken->mdObjectHash) { 227 if (!fwToken->mdObjectHash) {
236 if( CKR_OK == *pError ) { 228 if (CKR_OK == *pError) {
237 *pError = CKR_GENERAL_ERROR; 229 *pError = CKR_GENERAL_ERROR;
230 }
231 goto loser;
238 } 232 }
239 goto loser;
240 }
241 233
242 fwToken->mdMechanismHash = nssCKFWHash_Create(fwToken->fwInstance, 234 fwToken->mdMechanismHash = nssCKFWHash_Create(fwToken->fwInstance,
243 arena, pError); 235 arena, pError);
244 if (!fwToken->mdMechanismHash) { 236 if (!fwToken->mdMechanismHash) {
245 if( CKR_OK == *pError ) { 237 if (CKR_OK == *pError) {
246 *pError = CKR_GENERAL_ERROR; 238 *pError = CKR_GENERAL_ERROR;
239 }
240 goto loser;
247 } 241 }
248 goto loser;
249 }
250 242
251 /* More here */ 243 /* More here */
252 244
253 if (mdToken->Setup) { 245 if (mdToken->Setup) {
254 *pError = mdToken->Setup(mdToken, fwToken, fwToken->mdInstance, fwToken->fwI nstance); 246 *pError = mdToken->Setup(mdToken, fwToken, fwToken->mdInstance, fwToken- >fwInstance);
255 if( CKR_OK != *pError ) { 247 if (CKR_OK != *pError) {
256 goto loser; 248 goto loser;
249 }
257 } 250 }
258 }
259 251
260 called_setup = CK_TRUE; 252 called_setup = CK_TRUE;
261 253
262 #ifdef DEBUG 254 #ifdef DEBUG
263 *pError = token_add_pointer(fwToken); 255 *pError = token_add_pointer(fwToken);
264 if( CKR_OK != *pError ) { 256 if (CKR_OK != *pError) {
265 goto loser; 257 goto loser;
266 } 258 }
267 #endif /* DEBUG */ 259 #endif /* DEBUG */
268 260
269 *pError = CKR_OK; 261 *pError = CKR_OK;
270 return fwToken; 262 return fwToken;
271 263
272 loser: 264 loser:
273 265
274 if( CK_TRUE == called_setup ) { 266 if (CK_TRUE == called_setup) {
275 if (mdToken->Invalidate) { 267 if (mdToken->Invalidate) {
276 mdToken->Invalidate(mdToken, fwToken, fwToken->mdInstance, fwToken->fwInst ance); 268 mdToken->Invalidate(mdToken, fwToken, fwToken->mdInstance, fwToken-> fwInstance);
269 }
277 } 270 }
278 }
279 271
280 if (arena) { 272 if (arena) {
281 (void)NSSArena_Destroy(arena); 273 (void)NSSArena_Destroy(arena);
282 } 274 }
283 275
284 return (NSSCKFWToken *)NULL; 276 return (NSSCKFWToken *)NULL;
285 } 277 }
286 278
287 static void 279 static void
288 nss_ckfwtoken_session_iterator 280 nss_ckfwtoken_session_iterator(
289 ( 281 const void *key,
290 const void *key, 282 void *value,
291 void *value, 283 void *closure)
292 void *closure
293 )
294 { 284 {
295 /* 285 /*
296 * Remember that the fwToken->mutex is locked 286 * Remember that the fwToken->mutex is locked
297 */ 287 */
298 NSSCKFWSession *fwSession = (NSSCKFWSession *)value; 288 NSSCKFWSession *fwSession = (NSSCKFWSession *)value;
299 (void)nssCKFWSession_Destroy(fwSession, CK_FALSE); 289 (void)nssCKFWSession_Destroy(fwSession, CK_FALSE);
300 return; 290 return;
301 } 291 }
302 292
303 static void 293 static void
304 nss_ckfwtoken_object_iterator 294 nss_ckfwtoken_object_iterator(
305 ( 295 const void *key,
306 const void *key, 296 void *value,
307 void *value, 297 void *closure)
308 void *closure
309 )
310 { 298 {
311 /* 299 /*
312 * Remember that the fwToken->mutex is locked 300 * Remember that the fwToken->mutex is locked
313 */ 301 */
314 NSSCKFWObject *fwObject = (NSSCKFWObject *)value; 302 NSSCKFWObject *fwObject = (NSSCKFWObject *)value;
315 (void)nssCKFWObject_Finalize(fwObject, CK_FALSE); 303 (void)nssCKFWObject_Finalize(fwObject, CK_FALSE);
316 return; 304 return;
317 } 305 }
318 306
319 /* 307 /*
320 * nssCKFWToken_Destroy 308 * nssCKFWToken_Destroy
321 * 309 *
322 */ 310 */
323 NSS_IMPLEMENT CK_RV 311 NSS_IMPLEMENT CK_RV
324 nssCKFWToken_Destroy 312 nssCKFWToken_Destroy(
325 ( 313 NSSCKFWToken *fwToken)
326 NSSCKFWToken *fwToken
327 )
328 { 314 {
329 CK_RV error = CKR_OK; 315 CK_RV error = CKR_OK;
330 316
331 #ifdef NSSDEBUG 317 #ifdef NSSDEBUG
332 error = nssCKFWToken_verifyPointer(fwToken); 318 error = nssCKFWToken_verifyPointer(fwToken);
333 if( CKR_OK != error ) { 319 if (CKR_OK != error) {
334 return error; 320 return error;
335 } 321 }
336 #endif /* NSSDEBUG */ 322 #endif /* NSSDEBUG */
337 323
338 (void)nssCKFWMutex_Destroy(fwToken->mutex); 324 (void)nssCKFWMutex_Destroy(fwToken->mutex);
339
340 if (fwToken->mdToken->Invalidate) {
341 fwToken->mdToken->Invalidate(fwToken->mdToken, fwToken,
342 fwToken->mdInstance, fwToken->fwInstance);
343 }
344 /* we can destroy the list without locking now because no one else is
345 * referencing us (or _Destroy was invalidly called!)
346 */
347 nssCKFWHash_Iterate(fwToken->sessions, nss_ckfwtoken_session_iterator,
348 (void *)NULL);
349 nssCKFWHash_Destroy(fwToken->sessions);
350 325
351 /* session objects go away when their sessions are removed */ 326 if (fwToken->mdToken->Invalidate) {
352 if (fwToken->sessionObjectHash) { 327 fwToken->mdToken->Invalidate(fwToken->mdToken, fwToken,
353 nssCKFWHash_Destroy(fwToken->sessionObjectHash); 328 fwToken->mdInstance, fwToken->fwInstance);
354 } 329 }
330 /* we can destroy the list without locking now because no one else is
331 * referencing us (or _Destroy was invalidly called!)
332 */
333 nssCKFWHash_Iterate(fwToken->sessions, nss_ckfwtoken_session_iterator,
334 (void *)NULL);
335 nssCKFWHash_Destroy(fwToken->sessions);
355 336
356 /* free up the token objects */ 337 /* session objects go away when their sessions are removed */
357 if (fwToken->mdObjectHash) { 338 if (fwToken->sessionObjectHash) {
358 nssCKFWHash_Iterate(fwToken->mdObjectHash, nss_ckfwtoken_object_iterator, 339 nssCKFWHash_Destroy(fwToken->sessionObjectHash);
359 (void *)NULL); 340 }
360 nssCKFWHash_Destroy(fwToken->mdObjectHash);
361 }
362 if (fwToken->mdMechanismHash) {
363 nssCKFWHash_Destroy(fwToken->mdMechanismHash);
364 }
365 341
366 nssCKFWSlot_ClearToken(fwToken->fwSlot); 342 /* free up the token objects */
367 343 if (fwToken->mdObjectHash) {
344 nssCKFWHash_Iterate(fwToken->mdObjectHash, nss_ckfwtoken_object_iterator ,
345 (void *)NULL);
346 nssCKFWHash_Destroy(fwToken->mdObjectHash);
347 }
348 if (fwToken->mdMechanismHash) {
349 nssCKFWHash_Destroy(fwToken->mdMechanismHash);
350 }
351
352 nssCKFWSlot_ClearToken(fwToken->fwSlot);
353
368 #ifdef DEBUG 354 #ifdef DEBUG
369 error = token_remove_pointer(fwToken); 355 error = token_remove_pointer(fwToken);
370 #endif /* DEBUG */ 356 #endif /* DEBUG */
371 357
372 (void)NSSArena_Destroy(fwToken->arena); 358 (void)NSSArena_Destroy(fwToken->arena);
373 return error; 359 return error;
374 } 360 }
375 361
376 /* 362 /*
377 * nssCKFWToken_GetMDToken 363 * nssCKFWToken_GetMDToken
378 * 364 *
379 */ 365 */
380 NSS_IMPLEMENT NSSCKMDToken * 366 NSS_IMPLEMENT NSSCKMDToken *
381 nssCKFWToken_GetMDToken 367 nssCKFWToken_GetMDToken(
382 ( 368 NSSCKFWToken *fwToken)
383 NSSCKFWToken *fwToken
384 )
385 { 369 {
386 #ifdef NSSDEBUG 370 #ifdef NSSDEBUG
387 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 371 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
388 return (NSSCKMDToken *)NULL; 372 return (NSSCKMDToken *)NULL;
389 } 373 }
390 #endif /* NSSDEBUG */ 374 #endif /* NSSDEBUG */
391 375
392 return fwToken->mdToken; 376 return fwToken->mdToken;
393 } 377 }
394 378
395 /* 379 /*
396 * nssCKFWToken_GetArena 380 * nssCKFWToken_GetArena
397 * 381 *
398 */ 382 */
399 NSS_IMPLEMENT NSSArena * 383 NSS_IMPLEMENT NSSArena *
400 nssCKFWToken_GetArena 384 nssCKFWToken_GetArena(
401 ( 385 NSSCKFWToken *fwToken,
402 NSSCKFWToken *fwToken, 386 CK_RV *pError)
403 CK_RV *pError
404 )
405 { 387 {
406 #ifdef NSSDEBUG 388 #ifdef NSSDEBUG
407 if (!pError) { 389 if (!pError) {
408 return (NSSArena *)NULL; 390 return (NSSArena *)NULL;
409 } 391 }
410 392
411 *pError = nssCKFWToken_verifyPointer(fwToken); 393 *pError = nssCKFWToken_verifyPointer(fwToken);
412 if( CKR_OK != *pError ) { 394 if (CKR_OK != *pError) {
413 return (NSSArena *)NULL; 395 return (NSSArena *)NULL;
414 } 396 }
415 #endif /* NSSDEBUG */ 397 #endif /* NSSDEBUG */
416 398
417 return fwToken->arena; 399 return fwToken->arena;
418 } 400 }
419 401
420 /* 402 /*
421 * nssCKFWToken_GetFWSlot 403 * nssCKFWToken_GetFWSlot
422 * 404 *
423 */ 405 */
424 NSS_IMPLEMENT NSSCKFWSlot * 406 NSS_IMPLEMENT NSSCKFWSlot *
425 nssCKFWToken_GetFWSlot 407 nssCKFWToken_GetFWSlot(
426 ( 408 NSSCKFWToken *fwToken)
427 NSSCKFWToken *fwToken
428 )
429 { 409 {
430 #ifdef NSSDEBUG 410 #ifdef NSSDEBUG
431 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 411 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
432 return (NSSCKFWSlot *)NULL; 412 return (NSSCKFWSlot *)NULL;
433 } 413 }
434 #endif /* NSSDEBUG */ 414 #endif /* NSSDEBUG */
435 415
436 return fwToken->fwSlot; 416 return fwToken->fwSlot;
437 } 417 }
438 418
439 /* 419 /*
440 * nssCKFWToken_GetMDSlot 420 * nssCKFWToken_GetMDSlot
441 * 421 *
442 */ 422 */
443 NSS_IMPLEMENT NSSCKMDSlot * 423 NSS_IMPLEMENT NSSCKMDSlot *
444 nssCKFWToken_GetMDSlot 424 nssCKFWToken_GetMDSlot(
445 ( 425 NSSCKFWToken *fwToken)
446 NSSCKFWToken *fwToken
447 )
448 { 426 {
449 #ifdef NSSDEBUG 427 #ifdef NSSDEBUG
450 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 428 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
451 return (NSSCKMDSlot *)NULL; 429 return (NSSCKMDSlot *)NULL;
452 } 430 }
453 #endif /* NSSDEBUG */ 431 #endif /* NSSDEBUG */
454 432
455 return fwToken->mdSlot; 433 return fwToken->mdSlot;
456 } 434 }
457 435
458 /* 436 /*
459 * nssCKFWToken_GetSessionState 437 * nssCKFWToken_GetSessionState
460 * 438 *
461 */ 439 */
462 NSS_IMPLEMENT CK_STATE 440 NSS_IMPLEMENT CK_STATE
463 nssCKFWToken_GetSessionState 441 nssCKFWToken_GetSessionState(
464 ( 442 NSSCKFWToken *fwToken)
465 NSSCKFWToken *fwToken
466 )
467 { 443 {
468 #ifdef NSSDEBUG 444 #ifdef NSSDEBUG
469 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 445 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
470 return CKS_RO_PUBLIC_SESSION; /* whatever */ 446 return CKS_RO_PUBLIC_SESSION; /* whatever */
471 } 447 }
472 #endif /* NSSDEBUG */ 448 #endif /* NSSDEBUG */
473 449
474 /* 450 /*
475 * BTW, do not lock the token in this method. 451 * BTW, do not lock the token in this method.
476 */ 452 */
477 453
478 /* 454 /*
479 * Theoretically, there is no state if there aren't any 455 * Theoretically, there is no state if there aren't any
480 * sessions open. But then we'd need to worry about 456 * sessions open. But then we'd need to worry about
481 * reporting an error, etc. What the heck-- let's just 457 * reporting an error, etc. What the heck-- let's just
482 * revert to CKR_RO_PUBLIC_SESSION as the "default." 458 * revert to CKR_RO_PUBLIC_SESSION as the "default."
483 */ 459 */
484 460
485 return fwToken->state; 461 return fwToken->state;
486 } 462 }
487 463
488 /* 464 /*
489 * nssCKFWToken_InitToken 465 * nssCKFWToken_InitToken
490 * 466 *
491 */ 467 */
492 NSS_IMPLEMENT CK_RV 468 NSS_IMPLEMENT CK_RV
493 nssCKFWToken_InitToken 469 nssCKFWToken_InitToken(
494 ( 470 NSSCKFWToken *fwToken,
495 NSSCKFWToken *fwToken, 471 NSSItem *pin,
496 NSSItem *pin, 472 NSSUTF8 *label)
497 NSSUTF8 *label
498 )
499 { 473 {
500 CK_RV error; 474 CK_RV error;
501 475
502 #ifdef NSSDEBUG 476 #ifdef NSSDEBUG
503 error = nssCKFWToken_verifyPointer(fwToken); 477 error = nssCKFWToken_verifyPointer(fwToken);
504 if( CKR_OK != error ) { 478 if (CKR_OK != error) {
505 return CKR_ARGUMENTS_BAD; 479 return CKR_ARGUMENTS_BAD;
506 } 480 }
507 #endif /* NSSDEBUG */ 481 #endif /* NSSDEBUG */
508 482
509 error = nssCKFWMutex_Lock(fwToken->mutex); 483 error = nssCKFWMutex_Lock(fwToken->mutex);
510 if( CKR_OK != error ) { 484 if (CKR_OK != error) {
485 return error;
486 }
487
488 if (fwToken->sessionCount > 0) {
489 error = CKR_SESSION_EXISTS;
490 goto done;
491 }
492
493 if (!fwToken->mdToken->InitToken) {
494 error = CKR_DEVICE_ERROR;
495 goto done;
496 }
497
498 if (!pin) {
499 if (nssCKFWToken_GetHasProtectedAuthenticationPath(fwToken)) {
500 ; /* okay */
501 } else {
502 error = CKR_PIN_INCORRECT;
503 goto done;
504 }
505 }
506
507 if (!label) {
508 label = (NSSUTF8 *)"";
509 }
510
511 error = fwToken->mdToken->InitToken(fwToken->mdToken, fwToken,
512 fwToken->mdInstance, fwToken->fwInstance , pin, label);
513
514 done:
515 (void)nssCKFWMutex_Unlock(fwToken->mutex);
511 return error; 516 return error;
512 }
513
514 if( fwToken->sessionCount > 0 ) {
515 error = CKR_SESSION_EXISTS;
516 goto done;
517 }
518
519 if (!fwToken->mdToken->InitToken) {
520 error = CKR_DEVICE_ERROR;
521 goto done;
522 }
523
524 if (!pin) {
525 if( nssCKFWToken_GetHasProtectedAuthenticationPath(fwToken) ) {
526 ; /* okay */
527 } else {
528 error = CKR_PIN_INCORRECT;
529 goto done;
530 }
531 }
532
533 if (!label) {
534 label = (NSSUTF8 *) "";
535 }
536
537 error = fwToken->mdToken->InitToken(fwToken->mdToken, fwToken,
538 fwToken->mdInstance, fwToken->fwInstance, pin, label);
539
540 done:
541 (void)nssCKFWMutex_Unlock(fwToken->mutex);
542 return error;
543 } 517 }
544 518
545 /* 519 /*
546 * nssCKFWToken_GetLabel 520 * nssCKFWToken_GetLabel
547 * 521 *
548 */ 522 */
549 NSS_IMPLEMENT CK_RV 523 NSS_IMPLEMENT CK_RV
550 nssCKFWToken_GetLabel 524 nssCKFWToken_GetLabel(
551 ( 525 NSSCKFWToken *fwToken,
552 NSSCKFWToken *fwToken, 526 CK_CHAR label[32])
553 CK_CHAR label[32]
554 )
555 { 527 {
556 CK_RV error = CKR_OK; 528 CK_RV error = CKR_OK;
557 529
558 #ifdef NSSDEBUG 530 #ifdef NSSDEBUG
559 if( (CK_CHAR_PTR)NULL == label ) { 531 if ((CK_CHAR_PTR)NULL == label) {
560 return CKR_ARGUMENTS_BAD; 532 return CKR_ARGUMENTS_BAD;
561 } 533 }
562 534
563 error = nssCKFWToken_verifyPointer(fwToken); 535 error = nssCKFWToken_verifyPointer(fwToken);
564 if( CKR_OK != error ) { 536 if (CKR_OK != error) {
565 return error; 537 return error;
566 } 538 }
567 #endif /* NSSDEBUG */ 539 #endif /* NSSDEBUG */
568 540
569 error = nssCKFWMutex_Lock(fwToken->mutex); 541 error = nssCKFWMutex_Lock(fwToken->mutex);
570 if( CKR_OK != error ) { 542 if (CKR_OK != error) {
543 return error;
544 }
545
546 if (!fwToken->label) {
547 if (fwToken->mdToken->GetLabel) {
548 fwToken->label = fwToken->mdToken->GetLabel(fwToken->mdToken, fwToke n,
549 fwToken->mdInstance, fwT oken->fwInstance, &error);
550 if ((!fwToken->label) && (CKR_OK != error)) {
551 goto done;
552 }
553 } else {
554 fwToken->label = (NSSUTF8 *)"";
555 }
556 }
557
558 (void)nssUTF8_CopyIntoFixedBuffer(fwToken->label, (char *)label, 32, ' ');
559 error = CKR_OK;
560
561 done:
562 (void)nssCKFWMutex_Unlock(fwToken->mutex);
571 return error; 563 return error;
572 }
573
574 if (!fwToken->label) {
575 if (fwToken->mdToken->GetLabel) {
576 fwToken->label = fwToken->mdToken->GetLabel(fwToken->mdToken, fwToken,
577 fwToken->mdInstance, fwToken->fwInstance, &error);
578 if ((!fwToken->label) && (CKR_OK != error)) {
579 goto done;
580 }
581 } else {
582 fwToken->label = (NSSUTF8 *) "";
583 }
584 }
585
586 (void)nssUTF8_CopyIntoFixedBuffer(fwToken->label, (char *)label, 32, ' ');
587 error = CKR_OK;
588
589 done:
590 (void)nssCKFWMutex_Unlock(fwToken->mutex);
591 return error;
592 } 564 }
593 565
594 /* 566 /*
595 * nssCKFWToken_GetManufacturerID 567 * nssCKFWToken_GetManufacturerID
596 * 568 *
597 */ 569 */
598 NSS_IMPLEMENT CK_RV 570 NSS_IMPLEMENT CK_RV
599 nssCKFWToken_GetManufacturerID 571 nssCKFWToken_GetManufacturerID(
600 ( 572 NSSCKFWToken *fwToken,
601 NSSCKFWToken *fwToken, 573 CK_CHAR manufacturerID[32])
602 CK_CHAR manufacturerID[32]
603 )
604 { 574 {
605 CK_RV error = CKR_OK; 575 CK_RV error = CKR_OK;
606 576
607 #ifdef NSSDEBUG 577 #ifdef NSSDEBUG
608 if( (CK_CHAR_PTR)NULL == manufacturerID ) { 578 if ((CK_CHAR_PTR)NULL == manufacturerID) {
609 return CKR_ARGUMENTS_BAD; 579 return CKR_ARGUMENTS_BAD;
610 } 580 }
611 581
612 error = nssCKFWToken_verifyPointer(fwToken); 582 error = nssCKFWToken_verifyPointer(fwToken);
613 if( CKR_OK != error ) { 583 if (CKR_OK != error) {
614 return error; 584 return error;
615 } 585 }
616 #endif /* NSSDEBUG */ 586 #endif /* NSSDEBUG */
617 587
618 error = nssCKFWMutex_Lock(fwToken->mutex); 588 error = nssCKFWMutex_Lock(fwToken->mutex);
619 if( CKR_OK != error ) { 589 if (CKR_OK != error) {
590 return error;
591 }
592
593 if (!fwToken->manufacturerID) {
594 if (fwToken->mdToken->GetManufacturerID) {
595 fwToken->manufacturerID = fwToken->mdToken->GetManufacturerID(fwToke n->mdToken,
596 fwToke n, fwToken->mdInstance, fwToken->fwInstance, &error);
597 if ((!fwToken->manufacturerID) && (CKR_OK != error)) {
598 goto done;
599 }
600 } else {
601 fwToken->manufacturerID = (NSSUTF8 *)"";
602 }
603 }
604
605 (void)nssUTF8_CopyIntoFixedBuffer(fwToken->manufacturerID, (char *)manufactu rerID, 32, ' ');
606 error = CKR_OK;
607
608 done:
609 (void)nssCKFWMutex_Unlock(fwToken->mutex);
620 return error; 610 return error;
621 }
622
623 if (!fwToken->manufacturerID) {
624 if (fwToken->mdToken->GetManufacturerID) {
625 fwToken->manufacturerID = fwToken->mdToken->GetManufacturerID(fwToken->mdT oken,
626 fwToken, fwToken->mdInstance, fwToken->fwInstance, &error);
627 if ((!fwToken->manufacturerID) && (CKR_OK != error)) {
628 goto done;
629 }
630 } else {
631 fwToken->manufacturerID = (NSSUTF8 *)"";
632 }
633 }
634
635 (void)nssUTF8_CopyIntoFixedBuffer(fwToken->manufacturerID, (char *)manufacture rID, 32, ' ');
636 error = CKR_OK;
637
638 done:
639 (void)nssCKFWMutex_Unlock(fwToken->mutex);
640 return error;
641 } 611 }
642 612
643 /* 613 /*
644 * nssCKFWToken_GetModel 614 * nssCKFWToken_GetModel
645 * 615 *
646 */ 616 */
647 NSS_IMPLEMENT CK_RV 617 NSS_IMPLEMENT CK_RV
648 nssCKFWToken_GetModel 618 nssCKFWToken_GetModel(
649 ( 619 NSSCKFWToken *fwToken,
650 NSSCKFWToken *fwToken, 620 CK_CHAR model[16])
651 CK_CHAR model[16]
652 )
653 { 621 {
654 CK_RV error = CKR_OK; 622 CK_RV error = CKR_OK;
655 623
656 #ifdef NSSDEBUG 624 #ifdef NSSDEBUG
657 if( (CK_CHAR_PTR)NULL == model ) { 625 if ((CK_CHAR_PTR)NULL == model) {
658 return CKR_ARGUMENTS_BAD; 626 return CKR_ARGUMENTS_BAD;
659 } 627 }
660 628
661 error = nssCKFWToken_verifyPointer(fwToken); 629 error = nssCKFWToken_verifyPointer(fwToken);
662 if( CKR_OK != error ) { 630 if (CKR_OK != error) {
663 return error; 631 return error;
664 } 632 }
665 #endif /* NSSDEBUG */ 633 #endif /* NSSDEBUG */
666 634
667 error = nssCKFWMutex_Lock(fwToken->mutex); 635 error = nssCKFWMutex_Lock(fwToken->mutex);
668 if( CKR_OK != error ) { 636 if (CKR_OK != error) {
637 return error;
638 }
639
640 if (!fwToken->model) {
641 if (fwToken->mdToken->GetModel) {
642 fwToken->model = fwToken->mdToken->GetModel(fwToken->mdToken, fwToke n,
643 fwToken->mdInstance, fwT oken->fwInstance, &error);
644 if ((!fwToken->model) && (CKR_OK != error)) {
645 goto done;
646 }
647 } else {
648 fwToken->model = (NSSUTF8 *)"";
649 }
650 }
651
652 (void)nssUTF8_CopyIntoFixedBuffer(fwToken->model, (char *)model, 16, ' ');
653 error = CKR_OK;
654
655 done:
656 (void)nssCKFWMutex_Unlock(fwToken->mutex);
669 return error; 657 return error;
670 }
671
672 if (!fwToken->model) {
673 if (fwToken->mdToken->GetModel) {
674 fwToken->model = fwToken->mdToken->GetModel(fwToken->mdToken, fwToken,
675 fwToken->mdInstance, fwToken->fwInstance, &error);
676 if ((!fwToken->model) && (CKR_OK != error)) {
677 goto done;
678 }
679 } else {
680 fwToken->model = (NSSUTF8 *)"";
681 }
682 }
683
684 (void)nssUTF8_CopyIntoFixedBuffer(fwToken->model, (char *)model, 16, ' ');
685 error = CKR_OK;
686
687 done:
688 (void)nssCKFWMutex_Unlock(fwToken->mutex);
689 return error;
690 } 658 }
691 659
692 /* 660 /*
693 * nssCKFWToken_GetSerialNumber 661 * nssCKFWToken_GetSerialNumber
694 * 662 *
695 */ 663 */
696 NSS_IMPLEMENT CK_RV 664 NSS_IMPLEMENT CK_RV
697 nssCKFWToken_GetSerialNumber 665 nssCKFWToken_GetSerialNumber(
698 ( 666 NSSCKFWToken *fwToken,
699 NSSCKFWToken *fwToken, 667 CK_CHAR serialNumber[16])
700 CK_CHAR serialNumber[16]
701 )
702 { 668 {
703 CK_RV error = CKR_OK; 669 CK_RV error = CKR_OK;
704 670
705 #ifdef NSSDEBUG 671 #ifdef NSSDEBUG
706 if( (CK_CHAR_PTR)NULL == serialNumber ) { 672 if ((CK_CHAR_PTR)NULL == serialNumber) {
707 return CKR_ARGUMENTS_BAD; 673 return CKR_ARGUMENTS_BAD;
708 } 674 }
709 675
710 error = nssCKFWToken_verifyPointer(fwToken); 676 error = nssCKFWToken_verifyPointer(fwToken);
711 if( CKR_OK != error ) { 677 if (CKR_OK != error) {
712 return error; 678 return error;
713 } 679 }
714 #endif /* NSSDEBUG */ 680 #endif /* NSSDEBUG */
715 681
716 error = nssCKFWMutex_Lock(fwToken->mutex); 682 error = nssCKFWMutex_Lock(fwToken->mutex);
717 if( CKR_OK != error ) { 683 if (CKR_OK != error) {
684 return error;
685 }
686
687 if (!fwToken->serialNumber) {
688 if (fwToken->mdToken->GetSerialNumber) {
689 fwToken->serialNumber = fwToken->mdToken->GetSerialNumber(fwToken->m dToken,
690 fwToken, f wToken->mdInstance, fwToken->fwInstance, &error);
691 if ((!fwToken->serialNumber) && (CKR_OK != error)) {
692 goto done;
693 }
694 } else {
695 fwToken->serialNumber = (NSSUTF8 *)"";
696 }
697 }
698
699 (void)nssUTF8_CopyIntoFixedBuffer(fwToken->serialNumber, (char *)serialNumbe r, 16, ' ');
700 error = CKR_OK;
701
702 done:
703 (void)nssCKFWMutex_Unlock(fwToken->mutex);
718 return error; 704 return error;
719 }
720
721 if (!fwToken->serialNumber) {
722 if (fwToken->mdToken->GetSerialNumber) {
723 fwToken->serialNumber = fwToken->mdToken->GetSerialNumber(fwToken->mdToken ,
724 fwToken, fwToken->mdInstance, fwToken->fwInstance, &error);
725 if ((!fwToken->serialNumber) && (CKR_OK != error)) {
726 goto done;
727 }
728 } else {
729 fwToken->serialNumber = (NSSUTF8 *)"";
730 }
731 }
732
733 (void)nssUTF8_CopyIntoFixedBuffer(fwToken->serialNumber, (char *)serialNumber, 16, ' ');
734 error = CKR_OK;
735
736 done:
737 (void)nssCKFWMutex_Unlock(fwToken->mutex);
738 return error;
739 } 705 }
740 706
741
742 /* 707 /*
743 * nssCKFWToken_GetHasRNG 708 * nssCKFWToken_GetHasRNG
744 * 709 *
745 */ 710 */
746 NSS_IMPLEMENT CK_BBOOL 711 NSS_IMPLEMENT CK_BBOOL
747 nssCKFWToken_GetHasRNG 712 nssCKFWToken_GetHasRNG(
748 ( 713 NSSCKFWToken *fwToken)
749 NSSCKFWToken *fwToken
750 )
751 { 714 {
752 #ifdef NSSDEBUG 715 #ifdef NSSDEBUG
753 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 716 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
754 return CK_FALSE; 717 return CK_FALSE;
755 } 718 }
756 #endif /* NSSDEBUG */ 719 #endif /* NSSDEBUG */
757 720
758 if (!fwToken->mdToken->GetHasRNG) { 721 if (!fwToken->mdToken->GetHasRNG) {
759 return CK_FALSE; 722 return CK_FALSE;
760 } 723 }
761 724
762 return fwToken->mdToken->GetHasRNG(fwToken->mdToken, fwToken, 725 return fwToken->mdToken->GetHasRNG(fwToken->mdToken, fwToken,
763 fwToken->mdInstance, fwToken->fwInstance); 726 fwToken->mdInstance, fwToken->fwInstance) ;
764 } 727 }
765 728
766 /* 729 /*
767 * nssCKFWToken_GetIsWriteProtected 730 * nssCKFWToken_GetIsWriteProtected
768 * 731 *
769 */ 732 */
770 NSS_IMPLEMENT CK_BBOOL 733 NSS_IMPLEMENT CK_BBOOL
771 nssCKFWToken_GetIsWriteProtected 734 nssCKFWToken_GetIsWriteProtected(
772 ( 735 NSSCKFWToken *fwToken)
773 NSSCKFWToken *fwToken
774 )
775 { 736 {
776 #ifdef NSSDEBUG 737 #ifdef NSSDEBUG
777 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 738 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
778 return CK_FALSE; 739 return CK_FALSE;
779 } 740 }
780 #endif /* NSSDEBUG */ 741 #endif /* NSSDEBUG */
781 742
782 if (!fwToken->mdToken->GetIsWriteProtected) { 743 if (!fwToken->mdToken->GetIsWriteProtected) {
783 return CK_FALSE; 744 return CK_FALSE;
784 } 745 }
785 746
786 return fwToken->mdToken->GetIsWriteProtected(fwToken->mdToken, fwToken, 747 return fwToken->mdToken->GetIsWriteProtected(fwToken->mdToken, fwToken,
787 fwToken->mdInstance, fwToken->fwInstance); 748 fwToken->mdInstance, fwToken->f wInstance);
788 } 749 }
789 750
790 /* 751 /*
791 * nssCKFWToken_GetLoginRequired 752 * nssCKFWToken_GetLoginRequired
792 * 753 *
793 */ 754 */
794 NSS_IMPLEMENT CK_BBOOL 755 NSS_IMPLEMENT CK_BBOOL
795 nssCKFWToken_GetLoginRequired 756 nssCKFWToken_GetLoginRequired(
796 ( 757 NSSCKFWToken *fwToken)
797 NSSCKFWToken *fwToken
798 )
799 { 758 {
800 #ifdef NSSDEBUG 759 #ifdef NSSDEBUG
801 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 760 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
802 return CK_FALSE; 761 return CK_FALSE;
803 } 762 }
804 #endif /* NSSDEBUG */ 763 #endif /* NSSDEBUG */
805 764
806 if (!fwToken->mdToken->GetLoginRequired) { 765 if (!fwToken->mdToken->GetLoginRequired) {
807 return CK_FALSE; 766 return CK_FALSE;
808 } 767 }
809 768
810 return fwToken->mdToken->GetLoginRequired(fwToken->mdToken, fwToken, 769 return fwToken->mdToken->GetLoginRequired(fwToken->mdToken, fwToken,
811 fwToken->mdInstance, fwToken->fwInstance); 770 fwToken->mdInstance, fwToken->fwIn stance);
812 } 771 }
813 772
814 /* 773 /*
815 * nssCKFWToken_GetUserPinInitialized 774 * nssCKFWToken_GetUserPinInitialized
816 * 775 *
817 */ 776 */
818 NSS_IMPLEMENT CK_BBOOL 777 NSS_IMPLEMENT CK_BBOOL
819 nssCKFWToken_GetUserPinInitialized 778 nssCKFWToken_GetUserPinInitialized(
820 ( 779 NSSCKFWToken *fwToken)
821 NSSCKFWToken *fwToken
822 )
823 { 780 {
824 #ifdef NSSDEBUG 781 #ifdef NSSDEBUG
825 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 782 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
826 return CK_FALSE; 783 return CK_FALSE;
827 } 784 }
828 #endif /* NSSDEBUG */ 785 #endif /* NSSDEBUG */
829 786
830 if (!fwToken->mdToken->GetUserPinInitialized) { 787 if (!fwToken->mdToken->GetUserPinInitialized) {
831 return CK_FALSE; 788 return CK_FALSE;
832 } 789 }
833 790
834 return fwToken->mdToken->GetUserPinInitialized(fwToken->mdToken, fwToken, 791 return fwToken->mdToken->GetUserPinInitialized(fwToken->mdToken, fwToken,
835 fwToken->mdInstance, fwToken->fwInstance); 792 fwToken->mdInstance, fwToken- >fwInstance);
836 } 793 }
837 794
838 /* 795 /*
839 * nssCKFWToken_GetRestoreKeyNotNeeded 796 * nssCKFWToken_GetRestoreKeyNotNeeded
840 * 797 *
841 */ 798 */
842 NSS_IMPLEMENT CK_BBOOL 799 NSS_IMPLEMENT CK_BBOOL
843 nssCKFWToken_GetRestoreKeyNotNeeded 800 nssCKFWToken_GetRestoreKeyNotNeeded(
844 ( 801 NSSCKFWToken *fwToken)
845 NSSCKFWToken *fwToken
846 )
847 { 802 {
848 #ifdef NSSDEBUG 803 #ifdef NSSDEBUG
849 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 804 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
850 return CK_FALSE; 805 return CK_FALSE;
851 } 806 }
852 #endif /* NSSDEBUG */ 807 #endif /* NSSDEBUG */
853 808
854 if (!fwToken->mdToken->GetRestoreKeyNotNeeded) { 809 if (!fwToken->mdToken->GetRestoreKeyNotNeeded) {
855 return CK_FALSE; 810 return CK_FALSE;
856 } 811 }
857 812
858 return fwToken->mdToken->GetRestoreKeyNotNeeded(fwToken->mdToken, fwToken, 813 return fwToken->mdToken->GetRestoreKeyNotNeeded(fwToken->mdToken, fwToken,
859 fwToken->mdInstance, fwToken->fwInstance); 814 fwToken->mdInstance, fwToken ->fwInstance);
860 } 815 }
861 816
862 /* 817 /*
863 * nssCKFWToken_GetHasClockOnToken 818 * nssCKFWToken_GetHasClockOnToken
864 * 819 *
865 */ 820 */
866 NSS_IMPLEMENT CK_BBOOL 821 NSS_IMPLEMENT CK_BBOOL
867 nssCKFWToken_GetHasClockOnToken 822 nssCKFWToken_GetHasClockOnToken(
868 ( 823 NSSCKFWToken *fwToken)
869 NSSCKFWToken *fwToken
870 )
871 { 824 {
872 #ifdef NSSDEBUG 825 #ifdef NSSDEBUG
873 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 826 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
874 return CK_FALSE; 827 return CK_FALSE;
875 } 828 }
876 #endif /* NSSDEBUG */ 829 #endif /* NSSDEBUG */
877 830
878 if (!fwToken->mdToken->GetHasClockOnToken) { 831 if (!fwToken->mdToken->GetHasClockOnToken) {
879 return CK_FALSE; 832 return CK_FALSE;
880 } 833 }
881 834
882 return fwToken->mdToken->GetHasClockOnToken(fwToken->mdToken, fwToken, 835 return fwToken->mdToken->GetHasClockOnToken(fwToken->mdToken, fwToken,
883 fwToken->mdInstance, fwToken->fwInstance); 836 fwToken->mdInstance, fwToken->fw Instance);
884 } 837 }
885 838
886 /* 839 /*
887 * nssCKFWToken_GetHasProtectedAuthenticationPath 840 * nssCKFWToken_GetHasProtectedAuthenticationPath
888 * 841 *
889 */ 842 */
890 NSS_IMPLEMENT CK_BBOOL 843 NSS_IMPLEMENT CK_BBOOL
891 nssCKFWToken_GetHasProtectedAuthenticationPath 844 nssCKFWToken_GetHasProtectedAuthenticationPath(
892 ( 845 NSSCKFWToken *fwToken)
893 NSSCKFWToken *fwToken
894 )
895 { 846 {
896 #ifdef NSSDEBUG 847 #ifdef NSSDEBUG
897 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 848 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
898 return CK_FALSE; 849 return CK_FALSE;
899 } 850 }
900 #endif /* NSSDEBUG */ 851 #endif /* NSSDEBUG */
901 852
902 if (!fwToken->mdToken->GetHasProtectedAuthenticationPath) { 853 if (!fwToken->mdToken->GetHasProtectedAuthenticationPath) {
903 return CK_FALSE; 854 return CK_FALSE;
904 } 855 }
905 856
906 return fwToken->mdToken->GetHasProtectedAuthenticationPath(fwToken->mdToken, 857 return fwToken->mdToken->GetHasProtectedAuthenticationPath(fwToken->mdToken,
907 fwToken, fwToken->mdInstance, fwToken->fwInstance); 858 fwToken, fwToken- >mdInstance, fwToken->fwInstance);
908 } 859 }
909 860
910 /* 861 /*
911 * nssCKFWToken_GetSupportsDualCryptoOperations 862 * nssCKFWToken_GetSupportsDualCryptoOperations
912 * 863 *
913 */ 864 */
914 NSS_IMPLEMENT CK_BBOOL 865 NSS_IMPLEMENT CK_BBOOL
915 nssCKFWToken_GetSupportsDualCryptoOperations 866 nssCKFWToken_GetSupportsDualCryptoOperations(
916 ( 867 NSSCKFWToken *fwToken)
917 NSSCKFWToken *fwToken
918 )
919 { 868 {
920 #ifdef NSSDEBUG 869 #ifdef NSSDEBUG
921 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 870 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
922 return CK_FALSE; 871 return CK_FALSE;
923 } 872 }
924 #endif /* NSSDEBUG */ 873 #endif /* NSSDEBUG */
925 874
926 if (!fwToken->mdToken->GetSupportsDualCryptoOperations) { 875 if (!fwToken->mdToken->GetSupportsDualCryptoOperations) {
927 return CK_FALSE; 876 return CK_FALSE;
928 } 877 }
929 878
930 return fwToken->mdToken->GetSupportsDualCryptoOperations(fwToken->mdToken, 879 return fwToken->mdToken->GetSupportsDualCryptoOperations(fwToken->mdToken,
931 fwToken, fwToken->mdInstance, fwToken->fwInstance); 880 fwToken, fwToken->m dInstance, fwToken->fwInstance);
932 } 881 }
933 882
934 /* 883 /*
935 * nssCKFWToken_GetMaxSessionCount 884 * nssCKFWToken_GetMaxSessionCount
936 * 885 *
937 */ 886 */
938 NSS_IMPLEMENT CK_ULONG 887 NSS_IMPLEMENT CK_ULONG
939 nssCKFWToken_GetMaxSessionCount 888 nssCKFWToken_GetMaxSessionCount(
940 ( 889 NSSCKFWToken *fwToken)
941 NSSCKFWToken *fwToken
942 )
943 { 890 {
944 #ifdef NSSDEBUG 891 #ifdef NSSDEBUG
945 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 892 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
946 return CK_UNAVAILABLE_INFORMATION; 893 return CK_UNAVAILABLE_INFORMATION;
947 } 894 }
948 #endif /* NSSDEBUG */ 895 #endif /* NSSDEBUG */
949 896
950 if (!fwToken->mdToken->GetMaxSessionCount) { 897 if (!fwToken->mdToken->GetMaxSessionCount) {
951 return CK_UNAVAILABLE_INFORMATION; 898 return CK_UNAVAILABLE_INFORMATION;
952 } 899 }
953 900
954 return fwToken->mdToken->GetMaxSessionCount(fwToken->mdToken, fwToken, 901 return fwToken->mdToken->GetMaxSessionCount(fwToken->mdToken, fwToken,
955 fwToken->mdInstance, fwToken->fwInstance); 902 fwToken->mdInstance, fwToken->fw Instance);
956 } 903 }
957 904
958 /* 905 /*
959 * nssCKFWToken_GetMaxRwSessionCount 906 * nssCKFWToken_GetMaxRwSessionCount
960 * 907 *
961 */ 908 */
962 NSS_IMPLEMENT CK_ULONG 909 NSS_IMPLEMENT CK_ULONG
963 nssCKFWToken_GetMaxRwSessionCount 910 nssCKFWToken_GetMaxRwSessionCount(
964 ( 911 NSSCKFWToken *fwToken)
965 NSSCKFWToken *fwToken
966 )
967 { 912 {
968 #ifdef NSSDEBUG 913 #ifdef NSSDEBUG
969 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 914 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
970 return CK_UNAVAILABLE_INFORMATION; 915 return CK_UNAVAILABLE_INFORMATION;
971 } 916 }
972 #endif /* NSSDEBUG */ 917 #endif /* NSSDEBUG */
973 918
974 if (!fwToken->mdToken->GetMaxRwSessionCount) { 919 if (!fwToken->mdToken->GetMaxRwSessionCount) {
975 return CK_UNAVAILABLE_INFORMATION; 920 return CK_UNAVAILABLE_INFORMATION;
976 } 921 }
977 922
978 return fwToken->mdToken->GetMaxRwSessionCount(fwToken->mdToken, fwToken, 923 return fwToken->mdToken->GetMaxRwSessionCount(fwToken->mdToken, fwToken,
979 fwToken->mdInstance, fwToken->fwInstance); 924 fwToken->mdInstance, fwToken-> fwInstance);
980 } 925 }
981 926
982 /* 927 /*
983 * nssCKFWToken_GetMaxPinLen 928 * nssCKFWToken_GetMaxPinLen
984 * 929 *
985 */ 930 */
986 NSS_IMPLEMENT CK_ULONG 931 NSS_IMPLEMENT CK_ULONG
987 nssCKFWToken_GetMaxPinLen 932 nssCKFWToken_GetMaxPinLen(
988 ( 933 NSSCKFWToken *fwToken)
989 NSSCKFWToken *fwToken
990 )
991 { 934 {
992 #ifdef NSSDEBUG 935 #ifdef NSSDEBUG
993 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 936 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
994 return CK_UNAVAILABLE_INFORMATION; 937 return CK_UNAVAILABLE_INFORMATION;
995 } 938 }
996 #endif /* NSSDEBUG */ 939 #endif /* NSSDEBUG */
997 940
998 if (!fwToken->mdToken->GetMaxPinLen) { 941 if (!fwToken->mdToken->GetMaxPinLen) {
999 return CK_UNAVAILABLE_INFORMATION; 942 return CK_UNAVAILABLE_INFORMATION;
1000 } 943 }
1001 944
1002 return fwToken->mdToken->GetMaxPinLen(fwToken->mdToken, fwToken, 945 return fwToken->mdToken->GetMaxPinLen(fwToken->mdToken, fwToken,
1003 fwToken->mdInstance, fwToken->fwInstance); 946 fwToken->mdInstance, fwToken->fwInstan ce);
1004 } 947 }
1005 948
1006 /* 949 /*
1007 * nssCKFWToken_GetMinPinLen 950 * nssCKFWToken_GetMinPinLen
1008 * 951 *
1009 */ 952 */
1010 NSS_IMPLEMENT CK_ULONG 953 NSS_IMPLEMENT CK_ULONG
1011 nssCKFWToken_GetMinPinLen 954 nssCKFWToken_GetMinPinLen(
1012 ( 955 NSSCKFWToken *fwToken)
1013 NSSCKFWToken *fwToken
1014 )
1015 { 956 {
1016 #ifdef NSSDEBUG 957 #ifdef NSSDEBUG
1017 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 958 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1018 return CK_UNAVAILABLE_INFORMATION; 959 return CK_UNAVAILABLE_INFORMATION;
1019 } 960 }
1020 #endif /* NSSDEBUG */ 961 #endif /* NSSDEBUG */
1021 962
1022 if (!fwToken->mdToken->GetMinPinLen) { 963 if (!fwToken->mdToken->GetMinPinLen) {
1023 return CK_UNAVAILABLE_INFORMATION; 964 return CK_UNAVAILABLE_INFORMATION;
1024 } 965 }
1025 966
1026 return fwToken->mdToken->GetMinPinLen(fwToken->mdToken, fwToken, 967 return fwToken->mdToken->GetMinPinLen(fwToken->mdToken, fwToken,
1027 fwToken->mdInstance, fwToken->fwInstance); 968 fwToken->mdInstance, fwToken->fwInstan ce);
1028 } 969 }
1029 970
1030 /* 971 /*
1031 * nssCKFWToken_GetTotalPublicMemory 972 * nssCKFWToken_GetTotalPublicMemory
1032 * 973 *
1033 */ 974 */
1034 NSS_IMPLEMENT CK_ULONG 975 NSS_IMPLEMENT CK_ULONG
1035 nssCKFWToken_GetTotalPublicMemory 976 nssCKFWToken_GetTotalPublicMemory(
1036 ( 977 NSSCKFWToken *fwToken)
1037 NSSCKFWToken *fwToken
1038 )
1039 { 978 {
1040 #ifdef NSSDEBUG 979 #ifdef NSSDEBUG
1041 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 980 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1042 return CK_UNAVAILABLE_INFORMATION; 981 return CK_UNAVAILABLE_INFORMATION;
1043 } 982 }
1044 #endif /* NSSDEBUG */ 983 #endif /* NSSDEBUG */
1045 984
1046 if (!fwToken->mdToken->GetTotalPublicMemory) { 985 if (!fwToken->mdToken->GetTotalPublicMemory) {
1047 return CK_UNAVAILABLE_INFORMATION; 986 return CK_UNAVAILABLE_INFORMATION;
1048 } 987 }
1049 988
1050 return fwToken->mdToken->GetTotalPublicMemory(fwToken->mdToken, fwToken, 989 return fwToken->mdToken->GetTotalPublicMemory(fwToken->mdToken, fwToken,
1051 fwToken->mdInstance, fwToken->fwInstance); 990 fwToken->mdInstance, fwToken-> fwInstance);
1052 } 991 }
1053 992
1054 /* 993 /*
1055 * nssCKFWToken_GetFreePublicMemory 994 * nssCKFWToken_GetFreePublicMemory
1056 * 995 *
1057 */ 996 */
1058 NSS_IMPLEMENT CK_ULONG 997 NSS_IMPLEMENT CK_ULONG
1059 nssCKFWToken_GetFreePublicMemory 998 nssCKFWToken_GetFreePublicMemory(
1060 ( 999 NSSCKFWToken *fwToken)
1061 NSSCKFWToken *fwToken
1062 )
1063 { 1000 {
1064 #ifdef NSSDEBUG 1001 #ifdef NSSDEBUG
1065 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1002 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1066 return CK_UNAVAILABLE_INFORMATION; 1003 return CK_UNAVAILABLE_INFORMATION;
1067 } 1004 }
1068 #endif /* NSSDEBUG */ 1005 #endif /* NSSDEBUG */
1069 1006
1070 if (!fwToken->mdToken->GetFreePublicMemory) { 1007 if (!fwToken->mdToken->GetFreePublicMemory) {
1071 return CK_UNAVAILABLE_INFORMATION; 1008 return CK_UNAVAILABLE_INFORMATION;
1072 } 1009 }
1073 1010
1074 return fwToken->mdToken->GetFreePublicMemory(fwToken->mdToken, fwToken, 1011 return fwToken->mdToken->GetFreePublicMemory(fwToken->mdToken, fwToken,
1075 fwToken->mdInstance, fwToken->fwInstance); 1012 fwToken->mdInstance, fwToken->f wInstance);
1076 } 1013 }
1077 1014
1078 /* 1015 /*
1079 * nssCKFWToken_GetTotalPrivateMemory 1016 * nssCKFWToken_GetTotalPrivateMemory
1080 * 1017 *
1081 */ 1018 */
1082 NSS_IMPLEMENT CK_ULONG 1019 NSS_IMPLEMENT CK_ULONG
1083 nssCKFWToken_GetTotalPrivateMemory 1020 nssCKFWToken_GetTotalPrivateMemory(
1084 ( 1021 NSSCKFWToken *fwToken)
1085 NSSCKFWToken *fwToken
1086 )
1087 { 1022 {
1088 #ifdef NSSDEBUG 1023 #ifdef NSSDEBUG
1089 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1024 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1090 return CK_UNAVAILABLE_INFORMATION; 1025 return CK_UNAVAILABLE_INFORMATION;
1091 } 1026 }
1092 #endif /* NSSDEBUG */ 1027 #endif /* NSSDEBUG */
1093 1028
1094 if (!fwToken->mdToken->GetTotalPrivateMemory) { 1029 if (!fwToken->mdToken->GetTotalPrivateMemory) {
1095 return CK_UNAVAILABLE_INFORMATION; 1030 return CK_UNAVAILABLE_INFORMATION;
1096 } 1031 }
1097 1032
1098 return fwToken->mdToken->GetTotalPrivateMemory(fwToken->mdToken, fwToken, 1033 return fwToken->mdToken->GetTotalPrivateMemory(fwToken->mdToken, fwToken,
1099 fwToken->mdInstance, fwToken->fwInstance); 1034 fwToken->mdInstance, fwToken- >fwInstance);
1100 } 1035 }
1101 1036
1102 /* 1037 /*
1103 * nssCKFWToken_GetFreePrivateMemory 1038 * nssCKFWToken_GetFreePrivateMemory
1104 * 1039 *
1105 */ 1040 */
1106 NSS_IMPLEMENT CK_ULONG 1041 NSS_IMPLEMENT CK_ULONG
1107 nssCKFWToken_GetFreePrivateMemory 1042 nssCKFWToken_GetFreePrivateMemory(
1108 ( 1043 NSSCKFWToken *fwToken)
1109 NSSCKFWToken *fwToken
1110 )
1111 { 1044 {
1112 #ifdef NSSDEBUG 1045 #ifdef NSSDEBUG
1113 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1046 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1114 return CK_UNAVAILABLE_INFORMATION; 1047 return CK_UNAVAILABLE_INFORMATION;
1115 } 1048 }
1116 #endif /* NSSDEBUG */ 1049 #endif /* NSSDEBUG */
1117 1050
1118 if (!fwToken->mdToken->GetFreePrivateMemory) { 1051 if (!fwToken->mdToken->GetFreePrivateMemory) {
1119 return CK_UNAVAILABLE_INFORMATION; 1052 return CK_UNAVAILABLE_INFORMATION;
1120 } 1053 }
1121 1054
1122 return fwToken->mdToken->GetFreePrivateMemory(fwToken->mdToken, fwToken, 1055 return fwToken->mdToken->GetFreePrivateMemory(fwToken->mdToken, fwToken,
1123 fwToken->mdInstance, fwToken->fwInstance); 1056 fwToken->mdInstance, fwToken-> fwInstance);
1124 } 1057 }
1125 1058
1126 /* 1059 /*
1127 * nssCKFWToken_GetHardwareVersion 1060 * nssCKFWToken_GetHardwareVersion
1128 * 1061 *
1129 */ 1062 */
1130 NSS_IMPLEMENT CK_VERSION 1063 NSS_IMPLEMENT CK_VERSION
1131 nssCKFWToken_GetHardwareVersion 1064 nssCKFWToken_GetHardwareVersion(
1132 ( 1065 NSSCKFWToken *fwToken)
1133 NSSCKFWToken *fwToken
1134 )
1135 { 1066 {
1136 CK_VERSION rv; 1067 CK_VERSION rv;
1137 1068
1138 #ifdef NSSDEBUG 1069 #ifdef NSSDEBUG
1139 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1070 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1140 rv.major = rv.minor = 0; 1071 rv.major = rv.minor = 0;
1141 return rv; 1072 return rv;
1142 } 1073 }
1143 #endif /* NSSDEBUG */ 1074 #endif /* NSSDEBUG */
1144 1075
1145 if( CKR_OK != nssCKFWMutex_Lock(fwToken->mutex) ) { 1076 if (CKR_OK != nssCKFWMutex_Lock(fwToken->mutex)) {
1146 rv.major = rv.minor = 0; 1077 rv.major = rv.minor = 0;
1078 return rv;
1079 }
1080
1081 if ((0 != fwToken->hardwareVersion.major) ||
1082 (0 != fwToken->hardwareVersion.minor)) {
1083 rv = fwToken->hardwareVersion;
1084 goto done;
1085 }
1086
1087 if (fwToken->mdToken->GetHardwareVersion) {
1088 fwToken->hardwareVersion = fwToken->mdToken->GetHardwareVersion(
1089 fwToken->mdToken, fwToken, fwToken->mdInstance, fwToken->fwInstance) ;
1090 } else {
1091 fwToken->hardwareVersion.major = 0;
1092 fwToken->hardwareVersion.minor = 1;
1093 }
1094
1095 rv = fwToken->hardwareVersion;
1096
1097 done:
1098 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1147 return rv; 1099 return rv;
1148 }
1149
1150 if( (0 != fwToken->hardwareVersion.major) ||
1151 (0 != fwToken->hardwareVersion.minor) ) {
1152 rv = fwToken->hardwareVersion;
1153 goto done;
1154 }
1155
1156 if (fwToken->mdToken->GetHardwareVersion) {
1157 fwToken->hardwareVersion = fwToken->mdToken->GetHardwareVersion(
1158 fwToken->mdToken, fwToken, fwToken->mdInstance, fwToken->fwInstance);
1159 } else {
1160 fwToken->hardwareVersion.major = 0;
1161 fwToken->hardwareVersion.minor = 1;
1162 }
1163
1164 rv = fwToken->hardwareVersion;
1165
1166 done:
1167 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1168 return rv;
1169 } 1100 }
1170 1101
1171 /* 1102 /*
1172 * nssCKFWToken_GetFirmwareVersion 1103 * nssCKFWToken_GetFirmwareVersion
1173 * 1104 *
1174 */ 1105 */
1175 NSS_IMPLEMENT CK_VERSION 1106 NSS_IMPLEMENT CK_VERSION
1176 nssCKFWToken_GetFirmwareVersion 1107 nssCKFWToken_GetFirmwareVersion(
1177 ( 1108 NSSCKFWToken *fwToken)
1178 NSSCKFWToken *fwToken
1179 )
1180 { 1109 {
1181 CK_VERSION rv; 1110 CK_VERSION rv;
1182 1111
1183 #ifdef NSSDEBUG 1112 #ifdef NSSDEBUG
1184 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1113 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1185 rv.major = rv.minor = 0; 1114 rv.major = rv.minor = 0;
1186 return rv; 1115 return rv;
1187 } 1116 }
1188 #endif /* NSSDEBUG */ 1117 #endif /* NSSDEBUG */
1189 1118
1190 if( CKR_OK != nssCKFWMutex_Lock(fwToken->mutex) ) { 1119 if (CKR_OK != nssCKFWMutex_Lock(fwToken->mutex)) {
1191 rv.major = rv.minor = 0; 1120 rv.major = rv.minor = 0;
1121 return rv;
1122 }
1123
1124 if ((0 != fwToken->firmwareVersion.major) ||
1125 (0 != fwToken->firmwareVersion.minor)) {
1126 rv = fwToken->firmwareVersion;
1127 goto done;
1128 }
1129
1130 if (fwToken->mdToken->GetFirmwareVersion) {
1131 fwToken->firmwareVersion = fwToken->mdToken->GetFirmwareVersion(
1132 fwToken->mdToken, fwToken, fwToken->mdInstance, fwToken->fwInstance) ;
1133 } else {
1134 fwToken->firmwareVersion.major = 0;
1135 fwToken->firmwareVersion.minor = 1;
1136 }
1137
1138 rv = fwToken->firmwareVersion;
1139
1140 done:
1141 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1192 return rv; 1142 return rv;
1193 }
1194
1195 if( (0 != fwToken->firmwareVersion.major) ||
1196 (0 != fwToken->firmwareVersion.minor) ) {
1197 rv = fwToken->firmwareVersion;
1198 goto done;
1199 }
1200
1201 if (fwToken->mdToken->GetFirmwareVersion) {
1202 fwToken->firmwareVersion = fwToken->mdToken->GetFirmwareVersion(
1203 fwToken->mdToken, fwToken, fwToken->mdInstance, fwToken->fwInstance);
1204 } else {
1205 fwToken->firmwareVersion.major = 0;
1206 fwToken->firmwareVersion.minor = 1;
1207 }
1208
1209 rv = fwToken->firmwareVersion;
1210
1211 done:
1212 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1213 return rv;
1214 } 1143 }
1215 1144
1216 /* 1145 /*
1217 * nssCKFWToken_GetUTCTime 1146 * nssCKFWToken_GetUTCTime
1218 * 1147 *
1219 */ 1148 */
1220 NSS_IMPLEMENT CK_RV 1149 NSS_IMPLEMENT CK_RV
1221 nssCKFWToken_GetUTCTime 1150 nssCKFWToken_GetUTCTime(
1222 ( 1151 NSSCKFWToken *fwToken,
1223 NSSCKFWToken *fwToken, 1152 CK_CHAR utcTime[16])
1224 CK_CHAR utcTime[16]
1225 )
1226 { 1153 {
1227 CK_RV error = CKR_OK; 1154 CK_RV error = CKR_OK;
1228 1155
1229 #ifdef NSSDEBUG 1156 #ifdef NSSDEBUG
1230 error = nssCKFWToken_verifyPointer(fwToken); 1157 error = nssCKFWToken_verifyPointer(fwToken);
1231 if( CKR_OK != error ) { 1158 if (CKR_OK != error) {
1232 return error; 1159 return error;
1233 } 1160 }
1234 1161
1235 if( (CK_CHAR_PTR)NULL == utcTime ) { 1162 if ((CK_CHAR_PTR)NULL == utcTime) {
1236 return CKR_ARGUMENTS_BAD; 1163 return CKR_ARGUMENTS_BAD;
1237 } 1164 }
1238 #endif /* DEBUG */ 1165 #endif /* DEBUG */
1239 1166
1240 if( CK_TRUE != nssCKFWToken_GetHasClockOnToken(fwToken) ) { 1167 if (CK_TRUE != nssCKFWToken_GetHasClockOnToken(fwToken)) {
1241 /* return CKR_DEVICE_ERROR; */ 1168 /* return CKR_DEVICE_ERROR; */
1242 (void)nssUTF8_CopyIntoFixedBuffer((NSSUTF8 *)NULL, (char *)utcTime, 16, ' ') ; 1169 (void)nssUTF8_CopyIntoFixedBuffer((NSSUTF8 *)NULL, (char *)utcTime, 16, ' ');
1243 return CKR_OK; 1170 return CKR_OK;
1244 }
1245
1246 if (!fwToken->mdToken->GetUTCTime) {
1247 /* It said it had one! */
1248 return CKR_GENERAL_ERROR;
1249 }
1250
1251 error = fwToken->mdToken->GetUTCTime(fwToken->mdToken, fwToken,
1252 fwToken->mdInstance, fwToken->fwInstance, utcTime);
1253 if( CKR_OK != error ) {
1254 return error;
1255 }
1256
1257 /* Sanity-check the data */
1258 {
1259 /* Format is YYYYMMDDhhmmss00 */
1260 int i;
1261 int Y, M, D, h, m, s;
1262 static int dims[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1263
1264 for( i = 0; i < 16; i++ ) {
1265 if( (utcTime[i] < '0') || (utcTime[i] > '9') ) {
1266 goto badtime;
1267 }
1268 } 1171 }
1269 1172
1270 Y = ((utcTime[ 0] - '0') * 1000) + ((utcTime[1] - '0') * 100) + 1173 if (!fwToken->mdToken->GetUTCTime) {
1271 ((utcTime[ 2] - '0') * 10) + (utcTime[ 3] - '0'); 1174 /* It said it had one! */
1272 M = ((utcTime[ 4] - '0') * 10) + (utcTime[ 5] - '0'); 1175 return CKR_GENERAL_ERROR;
1273 D = ((utcTime[ 6] - '0') * 10) + (utcTime[ 7] - '0'); 1176 }
1274 h = ((utcTime[ 8] - '0') * 10) + (utcTime[ 9] - '0');
1275 m = ((utcTime[10] - '0') * 10) + (utcTime[11] - '0');
1276 s = ((utcTime[12] - '0') * 10) + (utcTime[13] - '0');
1277 1177
1278 if( (Y < 1990) || (Y > 3000) ) goto badtime; /* Y3K problem. heh heh heh */ 1178 error = fwToken->mdToken->GetUTCTime(fwToken->mdToken, fwToken,
1279 if( (M < 1) || (M > 12) ) goto badtime; 1179 fwToken->mdInstance, fwToken->fwInstanc e, utcTime);
1280 if( (D < 1) || (D > 31) ) goto badtime; 1180 if (CKR_OK != error) {
1181 return error;
1182 }
1281 1183
1282 if( D > dims[M-1] ) goto badtime; /* per-month check */ 1184 /* Sanity-check the data */
1283 if( (2 == M) && (((Y%4)||!(Y%100))&&(Y%400)) && (D > 28) ) goto badtime; /* leap years */ 1185 {
1186 /* Format is YYYYMMDDhhmmss00 */
1187 int i;
1188 int Y, M, D, h, m, s;
1189 static int dims[] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
1284 1190
1285 if( (h < 0) || (h > 23) ) goto badtime; 1191 for (i = 0; i < 16; i++) {
1286 if( (m < 0) || (m > 60) ) goto badtime; 1192 if ((utcTime[i] < '0') || (utcTime[i] > '9')) {
1287 if( (s < 0) || (s > 61) ) goto badtime; 1193 goto badtime;
1194 }
1195 }
1288 1196
1289 /* 60m and 60 or 61s is only allowed for leap seconds. */ 1197 Y = ((utcTime[0] - '0') * 1000) + ((utcTime[1] - '0') * 100) +
1290 if( (60 == m) || (s >= 60) ) { 1198 ((utcTime[2] - '0') * 10) + (utcTime[3] - '0');
1291 if( (23 != h) || (60 != m) || (s < 60) ) goto badtime; 1199 M = ((utcTime[4] - '0') * 10) + (utcTime[5] - '0');
1292 /* leap seconds can only happen on June 30 or Dec 31.. I think */ 1200 D = ((utcTime[6] - '0') * 10) + (utcTime[7] - '0');
1293 /* if( ((6 != M) || (30 != D)) && ((12 != M) || (31 != D)) ) goto badtime; */ 1201 h = ((utcTime[8] - '0') * 10) + (utcTime[9] - '0');
1202 m = ((utcTime[10] - '0') * 10) + (utcTime[11] - '0');
1203 s = ((utcTime[12] - '0') * 10) + (utcTime[13] - '0');
1204
1205 if ((Y < 1990) || (Y > 3000))
1206 goto badtime; /* Y3K problem. heh heh heh */
1207 if ((M < 1) || (M > 12))
1208 goto badtime;
1209 if ((D < 1) || (D > 31))
1210 goto badtime;
1211
1212 if (D > dims[M - 1])
1213 goto badtime; /* per-month check */
1214 if ((2 == M) && (((Y % 4) || !(Y % 100)) &&
1215 (Y % 400)) &&
1216 (D > 28))
1217 goto badtime; /* leap years */
1218
1219 if ((h < 0) || (h > 23))
1220 goto badtime;
1221 if ((m < 0) || (m > 60))
1222 goto badtime;
1223 if ((s < 0) || (s > 61))
1224 goto badtime;
1225
1226 /* 60m and 60 or 61s is only allowed for leap seconds. */
1227 if ((60 == m) || (s >= 60)) {
1228 if ((23 != h) || (60 != m) || (s < 60))
1229 goto badtime;
1230 /* leap seconds can only happen on June 30 or Dec 31.. I think */
1231 /* if( ((6 != M) || (30 != D)) && ((12 != M) || (31 != D)) ) goto ba dtime; */
1232 }
1294 } 1233 }
1295 }
1296 1234
1297 return CKR_OK; 1235 return CKR_OK;
1298 1236
1299 badtime: 1237 badtime:
1300 return CKR_GENERAL_ERROR; 1238 return CKR_GENERAL_ERROR;
1301 } 1239 }
1302 1240
1303 /* 1241 /*
1304 * nssCKFWToken_OpenSession 1242 * nssCKFWToken_OpenSession
1305 * 1243 *
1306 */ 1244 */
1307 NSS_IMPLEMENT NSSCKFWSession * 1245 NSS_IMPLEMENT NSSCKFWSession *
1308 nssCKFWToken_OpenSession 1246 nssCKFWToken_OpenSession(
1309 ( 1247 NSSCKFWToken *fwToken,
1310 NSSCKFWToken *fwToken, 1248 CK_BBOOL rw,
1311 CK_BBOOL rw, 1249 CK_VOID_PTR pApplication,
1312 CK_VOID_PTR pApplication, 1250 CK_NOTIFY Notify,
1313 CK_NOTIFY Notify, 1251 CK_RV *pError)
1314 CK_RV *pError
1315 )
1316 { 1252 {
1317 NSSCKFWSession *fwSession = (NSSCKFWSession *)NULL; 1253 NSSCKFWSession *fwSession = (NSSCKFWSession *)NULL;
1318 NSSCKMDSession *mdSession; 1254 NSSCKMDSession *mdSession;
1319 1255
1320 #ifdef NSSDEBUG 1256 #ifdef NSSDEBUG
1321 if (!pError) { 1257 if (!pError) {
1322 return (NSSCKFWSession *)NULL; 1258 return (NSSCKFWSession *)NULL;
1323 } 1259 }
1324 1260
1325 *pError = nssCKFWToken_verifyPointer(fwToken); 1261 *pError = nssCKFWToken_verifyPointer(fwToken);
1326 if( CKR_OK != *pError ) { 1262 if (CKR_OK != *pError) {
1327 return (NSSCKFWSession *)NULL; 1263 return (NSSCKFWSession *)NULL;
1328 } 1264 }
1329 1265
1330 switch( rw ) { 1266 switch (rw) {
1331 case CK_TRUE: 1267 case CK_TRUE:
1332 case CK_FALSE: 1268 case CK_FALSE:
1333 break; 1269 break;
1334 default: 1270 default:
1335 *pError = CKR_ARGUMENTS_BAD; 1271 *pError = CKR_ARGUMENTS_BAD;
1336 return (NSSCKFWSession *)NULL; 1272 return (NSSCKFWSession *)NULL;
1337 } 1273 }
1338 #endif /* NSSDEBUG */ 1274 #endif /* NSSDEBUG */
1339 1275
1340 *pError = nssCKFWMutex_Lock(fwToken->mutex); 1276 *pError = nssCKFWMutex_Lock(fwToken->mutex);
1341 if( CKR_OK != *pError ) { 1277 if (CKR_OK != *pError) {
1342 return (NSSCKFWSession *)NULL; 1278 return (NSSCKFWSession *)NULL;
1343 } 1279 }
1344 1280
1345 if( CK_TRUE == rw ) { 1281 if (CK_TRUE == rw) {
1346 /* Read-write session desired */ 1282 /* Read-write session desired */
1347 if( CK_TRUE == nssCKFWToken_GetIsWriteProtected(fwToken) ) { 1283 if (CK_TRUE == nssCKFWToken_GetIsWriteProtected(fwToken)) {
1348 *pError = CKR_TOKEN_WRITE_PROTECTED; 1284 *pError = CKR_TOKEN_WRITE_PROTECTED;
1349 goto done; 1285 goto done;
1286 }
1287 } else {
1288 /* Read-only session desired */
1289 if (CKS_RW_SO_FUNCTIONS == nssCKFWToken_GetSessionState(fwToken)) {
1290 *pError = CKR_SESSION_READ_WRITE_SO_EXISTS;
1291 goto done;
1292 }
1350 } 1293 }
1351 } else { 1294
1352 /* Read-only session desired */ 1295 /* We could compare sesion counts to any limits we know of, I guess.. */
1353 if( CKS_RW_SO_FUNCTIONS == nssCKFWToken_GetSessionState(fwToken) ) { 1296
1354 *pError = CKR_SESSION_READ_WRITE_SO_EXISTS; 1297 if (!fwToken->mdToken->OpenSession) {
1355 goto done; 1298 /*
1299 * I'm not sure that the Module actually needs to implement
1300 * mdSessions -- the Framework can keep track of everything
1301 * needed, really. But I'll sort out that detail later..
1302 */
1303 *pError = CKR_GENERAL_ERROR;
1304 goto done;
1356 } 1305 }
1357 }
1358 1306
1359 /* We could compare sesion counts to any limits we know of, I guess.. */ 1307 fwSession = nssCKFWSession_Create(fwToken, rw, pApplication, Notify, pError) ;
1308 if (!fwSession) {
1309 if (CKR_OK == *pError) {
1310 *pError = CKR_GENERAL_ERROR;
1311 }
1312 goto done;
1313 }
1360 1314
1361 if (!fwToken->mdToken->OpenSession) { 1315 mdSession = fwToken->mdToken->OpenSession(fwToken->mdToken, fwToken,
1362 /* 1316 fwToken->mdInstance, fwToken->fwIn stance, fwSession,
1363 * I'm not sure that the Module actually needs to implement 1317 rw, pError);
1364 * mdSessions -- the Framework can keep track of everything 1318 if (!mdSession) {
1365 * needed, really. But I'll sort out that detail later.. 1319 (void)nssCKFWSession_Destroy(fwSession, CK_FALSE);
1366 */ 1320 if (CKR_OK == *pError) {
1367 *pError = CKR_GENERAL_ERROR; 1321 *pError = CKR_GENERAL_ERROR;
1368 goto done; 1322 }
1369 } 1323 goto done;
1324 }
1370 1325
1371 fwSession = nssCKFWSession_Create(fwToken, rw, pApplication, Notify, pError); 1326 *pError = nssCKFWSession_SetMDSession(fwSession, mdSession);
1372 if (!fwSession) { 1327 if (CKR_OK != *pError) {
1373 if( CKR_OK == *pError ) { 1328 if (mdSession->Close) {
1374 *pError = CKR_GENERAL_ERROR; 1329 mdSession->Close(mdSession, fwSession, fwToken->mdToken, fwToken,
1330 fwToken->mdInstance, fwToken->fwInstance);
1331 }
1332 (void)nssCKFWSession_Destroy(fwSession, CK_FALSE);
1333 goto done;
1375 } 1334 }
1376 goto done;
1377 }
1378 1335
1379 mdSession = fwToken->mdToken->OpenSession(fwToken->mdToken, fwToken, 1336 *pError = nssCKFWHash_Add(fwToken->sessions, fwSession, fwSession);
1380 fwToken->mdInstance, fwToken->fwInstance, fwSession, 1337 if (CKR_OK != *pError) {
1381 rw, pError); 1338 (void)nssCKFWSession_Destroy(fwSession, CK_FALSE);
1382 if (!mdSession) { 1339 fwSession = (NSSCKFWSession *)NULL;
1383 (void)nssCKFWSession_Destroy(fwSession, CK_FALSE); 1340 goto done;
1384 if( CKR_OK == *pError ) {
1385 *pError = CKR_GENERAL_ERROR;
1386 } 1341 }
1387 goto done;
1388 }
1389 1342
1390 *pError = nssCKFWSession_SetMDSession(fwSession, mdSession); 1343 done:
1391 if( CKR_OK != *pError ) { 1344 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1392 if (mdSession->Close) { 1345 return fwSession;
1393 mdSession->Close(mdSession, fwSession, fwToken->mdToken, fwToken,
1394 fwToken->mdInstance, fwToken->fwInstance);
1395 }
1396 (void)nssCKFWSession_Destroy(fwSession, CK_FALSE);
1397 goto done;
1398 }
1399
1400 *pError = nssCKFWHash_Add(fwToken->sessions, fwSession, fwSession);
1401 if( CKR_OK != *pError ) {
1402 (void)nssCKFWSession_Destroy(fwSession, CK_FALSE);
1403 fwSession = (NSSCKFWSession *)NULL;
1404 goto done;
1405 }
1406
1407 done:
1408 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1409 return fwSession;
1410 } 1346 }
1411 1347
1412 /* 1348 /*
1413 * nssCKFWToken_GetMechanismCount 1349 * nssCKFWToken_GetMechanismCount
1414 * 1350 *
1415 */ 1351 */
1416 NSS_IMPLEMENT CK_ULONG 1352 NSS_IMPLEMENT CK_ULONG
1417 nssCKFWToken_GetMechanismCount 1353 nssCKFWToken_GetMechanismCount(
1418 ( 1354 NSSCKFWToken *fwToken)
1419 NSSCKFWToken *fwToken
1420 )
1421 { 1355 {
1422 #ifdef NSSDEBUG 1356 #ifdef NSSDEBUG
1423 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1357 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1424 return 0; 1358 return 0;
1425 } 1359 }
1426 #endif /* NSSDEBUG */ 1360 #endif /* NSSDEBUG */
1427 1361
1428 if (!fwToken->mdToken->GetMechanismCount) { 1362 if (!fwToken->mdToken->GetMechanismCount) {
1429 return 0; 1363 return 0;
1430 } 1364 }
1431 1365
1432 return fwToken->mdToken->GetMechanismCount(fwToken->mdToken, fwToken, 1366 return fwToken->mdToken->GetMechanismCount(fwToken->mdToken, fwToken,
1433 fwToken->mdInstance, fwToken->fwInstance); 1367 fwToken->mdInstance, fwToken->fwI nstance);
1434 } 1368 }
1435 1369
1436 /* 1370 /*
1437 * nssCKFWToken_GetMechanismTypes 1371 * nssCKFWToken_GetMechanismTypes
1438 * 1372 *
1439 */ 1373 */
1440 NSS_IMPLEMENT CK_RV 1374 NSS_IMPLEMENT CK_RV
1441 nssCKFWToken_GetMechanismTypes 1375 nssCKFWToken_GetMechanismTypes(
1442 ( 1376 NSSCKFWToken *fwToken,
1443 NSSCKFWToken *fwToken, 1377 CK_MECHANISM_TYPE types[])
1444 CK_MECHANISM_TYPE types[]
1445 )
1446 { 1378 {
1447 #ifdef NSSDEBUG 1379 #ifdef NSSDEBUG
1448 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1380 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1449 return CKR_ARGUMENTS_BAD; 1381 return CKR_ARGUMENTS_BAD;
1450 } 1382 }
1451 1383
1452 if (!types) { 1384 if (!types) {
1453 return CKR_ARGUMENTS_BAD; 1385 return CKR_ARGUMENTS_BAD;
1454 } 1386 }
1455 #endif /* NSSDEBUG */ 1387 #endif /* NSSDEBUG */
1456 1388
1457 if (!fwToken->mdToken->GetMechanismTypes) { 1389 if (!fwToken->mdToken->GetMechanismTypes) {
1458 /* 1390 /*
1459 * This should only be called with a sufficiently-large 1391 * This should only be called with a sufficiently-large
1460 * "types" array, which can only be done if GetMechanismCount 1392 * "types" array, which can only be done if GetMechanismCount
1461 * is implemented. If that's implemented (and returns nonzero), 1393 * is implemented. If that's implemented (and returns nonzero),
1462 * then this should be too. So return an error. 1394 * then this should be too. So return an error.
1463 */ 1395 */
1464 return CKR_GENERAL_ERROR; 1396 return CKR_GENERAL_ERROR;
1465 } 1397 }
1466 1398
1467 return fwToken->mdToken->GetMechanismTypes(fwToken->mdToken, fwToken, 1399 return fwToken->mdToken->GetMechanismTypes(fwToken->mdToken, fwToken,
1468 fwToken->mdInstance, fwToken->fwInstance, types); 1400 fwToken->mdInstance, fwToken->fwI nstance, types);
1469 } 1401 }
1470 1402
1471
1472 /* 1403 /*
1473 * nssCKFWToken_GetMechanism 1404 * nssCKFWToken_GetMechanism
1474 * 1405 *
1475 */ 1406 */
1476 NSS_IMPLEMENT NSSCKFWMechanism * 1407 NSS_IMPLEMENT NSSCKFWMechanism *
1477 nssCKFWToken_GetMechanism 1408 nssCKFWToken_GetMechanism(
1478 ( 1409 NSSCKFWToken *fwToken,
1479 NSSCKFWToken *fwToken, 1410 CK_MECHANISM_TYPE which,
1480 CK_MECHANISM_TYPE which, 1411 CK_RV *pError)
1481 CK_RV *pError
1482 )
1483 { 1412 {
1484 NSSCKMDMechanism *mdMechanism; 1413 NSSCKMDMechanism *mdMechanism;
1485 if (!fwToken->mdMechanismHash) { 1414 if (!fwToken->mdMechanismHash) {
1486 *pError = CKR_GENERAL_ERROR; 1415 *pError = CKR_GENERAL_ERROR;
1487 return (NSSCKFWMechanism *)NULL; 1416 return (NSSCKFWMechanism *)NULL;
1488 } 1417 }
1489
1490 if (!fwToken->mdToken->GetMechanism) {
1491 /*
1492 * If we don't implement any GetMechanism function, then we must
1493 * not support any.
1494 */
1495 *pError = CKR_MECHANISM_INVALID;
1496 return (NSSCKFWMechanism *)NULL;
1497 }
1498 1418
1499 /* lookup in hash table */ 1419 if (!fwToken->mdToken->GetMechanism) {
1500 mdMechanism = fwToken->mdToken->GetMechanism(fwToken->mdToken, fwToken, 1420 /*
1501 fwToken->mdInstance, fwToken->fwInstance, which, pError); 1421 * If we don't implement any GetMechanism function, then we must
1502 if (!mdMechanism) { 1422 * not support any.
1503 return (NSSCKFWMechanism *) NULL; 1423 */
1504 } 1424 *pError = CKR_MECHANISM_INVALID;
1505 /* store in hash table */ 1425 return (NSSCKFWMechanism *)NULL;
1506 return nssCKFWMechanism_Create(mdMechanism, fwToken->mdToken, fwToken, 1426 }
1507 fwToken->mdInstance, fwToken->fwInstance); 1427
1428 /* lookup in hash table */
1429 mdMechanism = fwToken->mdToken->GetMechanism(fwToken->mdToken, fwToken,
1430 fwToken->mdInstance, fwToken->f wInstance, which, pError);
1431 if (!mdMechanism) {
1432 return (NSSCKFWMechanism *)NULL;
1433 }
1434 /* store in hash table */
1435 return nssCKFWMechanism_Create(mdMechanism, fwToken->mdToken, fwToken,
1436 fwToken->mdInstance, fwToken->fwInstance);
1508 } 1437 }
1509 1438
1510 NSS_IMPLEMENT CK_RV 1439 NSS_IMPLEMENT CK_RV
1511 nssCKFWToken_SetSessionState 1440 nssCKFWToken_SetSessionState(
1512 ( 1441 NSSCKFWToken *fwToken,
1513 NSSCKFWToken *fwToken, 1442 CK_STATE newState)
1514 CK_STATE newState
1515 )
1516 { 1443 {
1517 CK_RV error = CKR_OK; 1444 CK_RV error = CKR_OK;
1518 1445
1519 #ifdef NSSDEBUG 1446 #ifdef NSSDEBUG
1520 error = nssCKFWToken_verifyPointer(fwToken); 1447 error = nssCKFWToken_verifyPointer(fwToken);
1521 if( CKR_OK != error ) { 1448 if (CKR_OK != error) {
1522 return error; 1449 return error;
1523 } 1450 }
1524 1451
1525 switch( newState ) { 1452 switch (newState) {
1526 case CKS_RO_PUBLIC_SESSION: 1453 case CKS_RO_PUBLIC_SESSION:
1527 case CKS_RO_USER_FUNCTIONS: 1454 case CKS_RO_USER_FUNCTIONS:
1528 case CKS_RW_PUBLIC_SESSION: 1455 case CKS_RW_PUBLIC_SESSION:
1529 case CKS_RW_USER_FUNCTIONS: 1456 case CKS_RW_USER_FUNCTIONS:
1530 case CKS_RW_SO_FUNCTIONS: 1457 case CKS_RW_SO_FUNCTIONS:
1531 break; 1458 break;
1532 default: 1459 default:
1533 return CKR_ARGUMENTS_BAD; 1460 return CKR_ARGUMENTS_BAD;
1534 } 1461 }
1535 #endif /* NSSDEBUG */ 1462 #endif /* NSSDEBUG */
1536 1463
1537 error = nssCKFWMutex_Lock(fwToken->mutex); 1464 error = nssCKFWMutex_Lock(fwToken->mutex);
1538 if( CKR_OK != error ) { 1465 if (CKR_OK != error) {
1539 return error; 1466 return error;
1540 } 1467 }
1541 1468
1542 fwToken->state = newState; 1469 fwToken->state = newState;
1543 (void)nssCKFWMutex_Unlock(fwToken->mutex); 1470 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1544 return CKR_OK; 1471 return CKR_OK;
1545 } 1472 }
1546 1473
1547 /* 1474 /*
1548 * nssCKFWToken_RemoveSession 1475 * nssCKFWToken_RemoveSession
1549 * 1476 *
1550 */ 1477 */
1551 NSS_IMPLEMENT CK_RV 1478 NSS_IMPLEMENT CK_RV
1552 nssCKFWToken_RemoveSession 1479 nssCKFWToken_RemoveSession(
1553 ( 1480 NSSCKFWToken *fwToken,
1554 NSSCKFWToken *fwToken, 1481 NSSCKFWSession *fwSession)
1555 NSSCKFWSession *fwSession
1556 )
1557 { 1482 {
1558 CK_RV error = CKR_OK; 1483 CK_RV error = CKR_OK;
1559 1484
1560 #ifdef NSSDEBUG 1485 #ifdef NSSDEBUG
1561 error = nssCKFWToken_verifyPointer(fwToken); 1486 error = nssCKFWToken_verifyPointer(fwToken);
1562 if( CKR_OK != error ) { 1487 if (CKR_OK != error) {
1563 return error; 1488 return error;
1564 } 1489 }
1565 1490
1566 error = nssCKFWSession_verifyPointer(fwSession); 1491 error = nssCKFWSession_verifyPointer(fwSession);
1567 if( CKR_OK != error ) { 1492 if (CKR_OK != error) {
1568 return error; 1493 return error;
1569 } 1494 }
1570 #endif /* NSSDEBUG */ 1495 #endif /* NSSDEBUG */
1571 1496
1572 error = nssCKFWMutex_Lock(fwToken->mutex); 1497 error = nssCKFWMutex_Lock(fwToken->mutex);
1573 if( CKR_OK != error ) { 1498 if (CKR_OK != error) {
1499 return error;
1500 }
1501
1502 if (CK_TRUE != nssCKFWHash_Exists(fwToken->sessions, fwSession)) {
1503 error = CKR_SESSION_HANDLE_INVALID;
1504 goto done;
1505 }
1506
1507 nssCKFWHash_Remove(fwToken->sessions, fwSession);
1508 fwToken->sessionCount--;
1509
1510 if (nssCKFWSession_IsRWSession(fwSession)) {
1511 fwToken->rwSessionCount--;
1512 }
1513
1514 if (0 == fwToken->sessionCount) {
1515 fwToken->rwSessionCount = 0; /* sanity */
1516 fwToken->state = CKS_RO_PUBLIC_SESSION; /* some default */
1517 }
1518
1519 error = CKR_OK;
1520
1521 done:
1522 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1574 return error; 1523 return error;
1575 }
1576
1577 if( CK_TRUE != nssCKFWHash_Exists(fwToken->sessions, fwSession) ) {
1578 error = CKR_SESSION_HANDLE_INVALID;
1579 goto done;
1580 }
1581
1582 nssCKFWHash_Remove(fwToken->sessions, fwSession);
1583 fwToken->sessionCount--;
1584
1585 if( nssCKFWSession_IsRWSession(fwSession) ) {
1586 fwToken->rwSessionCount--;
1587 }
1588
1589 if( 0 == fwToken->sessionCount ) {
1590 fwToken->rwSessionCount = 0; /* sanity */
1591 fwToken->state = CKS_RO_PUBLIC_SESSION; /* some default */
1592 }
1593
1594 error = CKR_OK;
1595
1596 done:
1597 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1598 return error;
1599 } 1524 }
1600 1525
1601
1602 /* 1526 /*
1603 * nssCKFWToken_CloseAllSessions 1527 * nssCKFWToken_CloseAllSessions
1604 * 1528 *
1605 */ 1529 */
1606 NSS_IMPLEMENT CK_RV 1530 NSS_IMPLEMENT CK_RV
1607 nssCKFWToken_CloseAllSessions 1531 nssCKFWToken_CloseAllSessions(
1608 ( 1532 NSSCKFWToken *fwToken)
1609 NSSCKFWToken *fwToken
1610 )
1611 { 1533 {
1612 CK_RV error = CKR_OK; 1534 CK_RV error = CKR_OK;
1613 1535
1614 #ifdef NSSDEBUG 1536 #ifdef NSSDEBUG
1615 error = nssCKFWToken_verifyPointer(fwToken); 1537 error = nssCKFWToken_verifyPointer(fwToken);
1616 if( CKR_OK != error ) { 1538 if (CKR_OK != error) {
1617 return error; 1539 return error;
1618 } 1540 }
1619 #endif /* NSSDEBUG */ 1541 #endif /* NSSDEBUG */
1620 1542
1621 error = nssCKFWMutex_Lock(fwToken->mutex); 1543 error = nssCKFWMutex_Lock(fwToken->mutex);
1622 if( CKR_OK != error ) { 1544 if (CKR_OK != error) {
1545 return error;
1546 }
1547
1548 nssCKFWHash_Iterate(fwToken->sessions, nss_ckfwtoken_session_iterator, (void *)NULL);
1549
1550 nssCKFWHash_Destroy(fwToken->sessions);
1551
1552 fwToken->sessions = nssCKFWHash_Create(fwToken->fwInstance, fwToken->arena, &error);
1553 if (!fwToken->sessions) {
1554 if (CKR_OK == error) {
1555 error = CKR_GENERAL_ERROR;
1556 }
1557 goto done;
1558 }
1559
1560 fwToken->state = CKS_RO_PUBLIC_SESSION; /* some default */
1561 fwToken->sessionCount = 0;
1562 fwToken->rwSessionCount = 0;
1563
1564 error = CKR_OK;
1565
1566 done:
1567 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1623 return error; 1568 return error;
1624 }
1625
1626 nssCKFWHash_Iterate(fwToken->sessions, nss_ckfwtoken_session_iterator, (void * )NULL);
1627
1628 nssCKFWHash_Destroy(fwToken->sessions);
1629
1630 fwToken->sessions = nssCKFWHash_Create(fwToken->fwInstance, fwToken->arena, &e rror);
1631 if (!fwToken->sessions) {
1632 if( CKR_OK == error ) {
1633 error = CKR_GENERAL_ERROR;
1634 }
1635 goto done;
1636 }
1637
1638 fwToken->state = CKS_RO_PUBLIC_SESSION; /* some default */
1639 fwToken->sessionCount = 0;
1640 fwToken->rwSessionCount = 0;
1641
1642 error = CKR_OK;
1643
1644 done:
1645 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1646 return error;
1647 } 1569 }
1648 1570
1649 /* 1571 /*
1650 * nssCKFWToken_GetSessionCount 1572 * nssCKFWToken_GetSessionCount
1651 * 1573 *
1652 */ 1574 */
1653 NSS_IMPLEMENT CK_ULONG 1575 NSS_IMPLEMENT CK_ULONG
1654 nssCKFWToken_GetSessionCount 1576 nssCKFWToken_GetSessionCount(
1655 ( 1577 NSSCKFWToken *fwToken)
1656 NSSCKFWToken *fwToken
1657 )
1658 { 1578 {
1659 CK_ULONG rv; 1579 CK_ULONG rv;
1660 1580
1661 #ifdef NSSDEBUG 1581 #ifdef NSSDEBUG
1662 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1582 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1663 return (CK_ULONG)0; 1583 return (CK_ULONG)0;
1664 } 1584 }
1665 #endif /* NSSDEBUG */ 1585 #endif /* NSSDEBUG */
1666 1586
1667 if( CKR_OK != nssCKFWMutex_Lock(fwToken->mutex) ) { 1587 if (CKR_OK != nssCKFWMutex_Lock(fwToken->mutex)) {
1668 return (CK_ULONG)0; 1588 return (CK_ULONG)0;
1669 } 1589 }
1670 1590
1671 rv = fwToken->sessionCount; 1591 rv = fwToken->sessionCount;
1672 (void)nssCKFWMutex_Unlock(fwToken->mutex); 1592 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1673 return rv; 1593 return rv;
1674 } 1594 }
1675 1595
1676 /* 1596 /*
1677 * nssCKFWToken_GetRwSessionCount 1597 * nssCKFWToken_GetRwSessionCount
1678 * 1598 *
1679 */ 1599 */
1680 NSS_IMPLEMENT CK_ULONG 1600 NSS_IMPLEMENT CK_ULONG
1681 nssCKFWToken_GetRwSessionCount 1601 nssCKFWToken_GetRwSessionCount(
1682 ( 1602 NSSCKFWToken *fwToken)
1683 NSSCKFWToken *fwToken
1684 )
1685 { 1603 {
1686 CK_ULONG rv; 1604 CK_ULONG rv;
1687 1605
1688 #ifdef NSSDEBUG 1606 #ifdef NSSDEBUG
1689 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1607 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1690 return (CK_ULONG)0; 1608 return (CK_ULONG)0;
1691 } 1609 }
1692 #endif /* NSSDEBUG */ 1610 #endif /* NSSDEBUG */
1693 1611
1694 if( CKR_OK != nssCKFWMutex_Lock(fwToken->mutex) ) { 1612 if (CKR_OK != nssCKFWMutex_Lock(fwToken->mutex)) {
1695 return (CK_ULONG)0; 1613 return (CK_ULONG)0;
1696 } 1614 }
1697 1615
1698 rv = fwToken->rwSessionCount; 1616 rv = fwToken->rwSessionCount;
1699 (void)nssCKFWMutex_Unlock(fwToken->mutex); 1617 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1700 return rv; 1618 return rv;
1701 } 1619 }
1702 1620
1703 /* 1621 /*
1704 * nssCKFWToken_GetRoSessionCount 1622 * nssCKFWToken_GetRoSessionCount
1705 * 1623 *
1706 */ 1624 */
1707 NSS_IMPLEMENT CK_ULONG 1625 NSS_IMPLEMENT CK_ULONG
1708 nssCKFWToken_GetRoSessionCount 1626 nssCKFWToken_GetRoSessionCount(
1709 ( 1627 NSSCKFWToken *fwToken)
1710 NSSCKFWToken *fwToken
1711 )
1712 { 1628 {
1713 CK_ULONG rv; 1629 CK_ULONG rv;
1714 1630
1715 #ifdef NSSDEBUG 1631 #ifdef NSSDEBUG
1716 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1632 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1717 return (CK_ULONG)0; 1633 return (CK_ULONG)0;
1718 } 1634 }
1719 #endif /* NSSDEBUG */ 1635 #endif /* NSSDEBUG */
1720 1636
1721 if( CKR_OK != nssCKFWMutex_Lock(fwToken->mutex) ) { 1637 if (CKR_OK != nssCKFWMutex_Lock(fwToken->mutex)) {
1722 return (CK_ULONG)0; 1638 return (CK_ULONG)0;
1723 } 1639 }
1724 1640
1725 rv = fwToken->sessionCount - fwToken->rwSessionCount; 1641 rv = fwToken->sessionCount - fwToken->rwSessionCount;
1726 (void)nssCKFWMutex_Unlock(fwToken->mutex); 1642 (void)nssCKFWMutex_Unlock(fwToken->mutex);
1727 return rv; 1643 return rv;
1728 } 1644 }
1729 1645
1730 /* 1646 /*
1731 * nssCKFWToken_GetSessionObjectHash 1647 * nssCKFWToken_GetSessionObjectHash
1732 * 1648 *
1733 */ 1649 */
1734 NSS_IMPLEMENT nssCKFWHash * 1650 NSS_IMPLEMENT nssCKFWHash *
1735 nssCKFWToken_GetSessionObjectHash 1651 nssCKFWToken_GetSessionObjectHash(
1736 ( 1652 NSSCKFWToken *fwToken)
1737 NSSCKFWToken *fwToken
1738 )
1739 { 1653 {
1740 #ifdef NSSDEBUG 1654 #ifdef NSSDEBUG
1741 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1655 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1742 return (nssCKFWHash *)NULL; 1656 return (nssCKFWHash *)NULL;
1743 } 1657 }
1744 #endif /* NSSDEBUG */ 1658 #endif /* NSSDEBUG */
1745 1659
1746 return fwToken->sessionObjectHash; 1660 return fwToken->sessionObjectHash;
1747 } 1661 }
1748 1662
1749 /* 1663 /*
1750 * nssCKFWToken_GetMDObjectHash 1664 * nssCKFWToken_GetMDObjectHash
1751 * 1665 *
1752 */ 1666 */
1753 NSS_IMPLEMENT nssCKFWHash * 1667 NSS_IMPLEMENT nssCKFWHash *
1754 nssCKFWToken_GetMDObjectHash 1668 nssCKFWToken_GetMDObjectHash(
1755 ( 1669 NSSCKFWToken *fwToken)
1756 NSSCKFWToken *fwToken
1757 )
1758 { 1670 {
1759 #ifdef NSSDEBUG 1671 #ifdef NSSDEBUG
1760 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1672 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1761 return (nssCKFWHash *)NULL; 1673 return (nssCKFWHash *)NULL;
1762 } 1674 }
1763 #endif /* NSSDEBUG */ 1675 #endif /* NSSDEBUG */
1764 1676
1765 return fwToken->mdObjectHash; 1677 return fwToken->mdObjectHash;
1766 } 1678 }
1767 1679
1768 /* 1680 /*
1769 * nssCKFWToken_GetObjectHandleHash 1681 * nssCKFWToken_GetObjectHandleHash
1770 * 1682 *
1771 */ 1683 */
1772 NSS_IMPLEMENT nssCKFWHash * 1684 NSS_IMPLEMENT nssCKFWHash *
1773 nssCKFWToken_GetObjectHandleHash 1685 nssCKFWToken_GetObjectHandleHash(
1774 ( 1686 NSSCKFWToken *fwToken)
1775 NSSCKFWToken *fwToken
1776 )
1777 { 1687 {
1778 #ifdef NSSDEBUG 1688 #ifdef NSSDEBUG
1779 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1689 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1780 return (nssCKFWHash *)NULL; 1690 return (nssCKFWHash *)NULL;
1781 } 1691 }
1782 #endif /* NSSDEBUG */ 1692 #endif /* NSSDEBUG */
1783 1693
1784 return fwToken->mdObjectHash; 1694 return fwToken->mdObjectHash;
1785 } 1695 }
1786 1696
1787 /* 1697 /*
1788 * NSSCKFWToken_GetMDToken 1698 * NSSCKFWToken_GetMDToken
1789 * 1699 *
1790 */ 1700 */
1791 1701
1792 NSS_IMPLEMENT NSSCKMDToken * 1702 NSS_IMPLEMENT NSSCKMDToken *
1793 NSSCKFWToken_GetMDToken 1703 NSSCKFWToken_GetMDToken(
1794 ( 1704 NSSCKFWToken *fwToken)
1795 NSSCKFWToken *fwToken
1796 )
1797 { 1705 {
1798 #ifdef DEBUG 1706 #ifdef DEBUG
1799 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1707 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1800 return (NSSCKMDToken *)NULL; 1708 return (NSSCKMDToken *)NULL;
1801 } 1709 }
1802 #endif /* DEBUG */ 1710 #endif /* DEBUG */
1803 1711
1804 return nssCKFWToken_GetMDToken(fwToken); 1712 return nssCKFWToken_GetMDToken(fwToken);
1805 } 1713 }
1806 1714
1807 /* 1715 /*
1808 * NSSCKFWToken_GetArena 1716 * NSSCKFWToken_GetArena
1809 * 1717 *
1810 */ 1718 */
1811 1719
1812 NSS_IMPLEMENT NSSArena * 1720 NSS_IMPLEMENT NSSArena *
1813 NSSCKFWToken_GetArena 1721 NSSCKFWToken_GetArena(
1814 ( 1722 NSSCKFWToken *fwToken,
1815 NSSCKFWToken *fwToken, 1723 CK_RV *pError)
1816 CK_RV *pError
1817 )
1818 { 1724 {
1819 #ifdef DEBUG 1725 #ifdef DEBUG
1820 if (!pError) { 1726 if (!pError) {
1821 return (NSSArena *)NULL; 1727 return (NSSArena *)NULL;
1822 } 1728 }
1823 1729
1824 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1730 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1825 *pError = CKR_ARGUMENTS_BAD; 1731 *pError = CKR_ARGUMENTS_BAD;
1826 return (NSSArena *)NULL; 1732 return (NSSArena *)NULL;
1827 } 1733 }
1828 #endif /* DEBUG */ 1734 #endif /* DEBUG */
1829 1735
1830 return nssCKFWToken_GetArena(fwToken, pError); 1736 return nssCKFWToken_GetArena(fwToken, pError);
1831 } 1737 }
1832 1738
1833 /* 1739 /*
1834 * NSSCKFWToken_GetFWSlot 1740 * NSSCKFWToken_GetFWSlot
1835 * 1741 *
1836 */ 1742 */
1837 1743
1838 NSS_IMPLEMENT NSSCKFWSlot * 1744 NSS_IMPLEMENT NSSCKFWSlot *
1839 NSSCKFWToken_GetFWSlot 1745 NSSCKFWToken_GetFWSlot(
1840 ( 1746 NSSCKFWToken *fwToken)
1841 NSSCKFWToken *fwToken
1842 )
1843 { 1747 {
1844 #ifdef DEBUG 1748 #ifdef DEBUG
1845 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1749 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1846 return (NSSCKFWSlot *)NULL; 1750 return (NSSCKFWSlot *)NULL;
1847 } 1751 }
1848 #endif /* DEBUG */ 1752 #endif /* DEBUG */
1849 1753
1850 return nssCKFWToken_GetFWSlot(fwToken); 1754 return nssCKFWToken_GetFWSlot(fwToken);
1851 } 1755 }
1852 1756
1853 /* 1757 /*
1854 * NSSCKFWToken_GetMDSlot 1758 * NSSCKFWToken_GetMDSlot
1855 * 1759 *
1856 */ 1760 */
1857 1761
1858 NSS_IMPLEMENT NSSCKMDSlot * 1762 NSS_IMPLEMENT NSSCKMDSlot *
1859 NSSCKFWToken_GetMDSlot 1763 NSSCKFWToken_GetMDSlot(
1860 ( 1764 NSSCKFWToken *fwToken)
1861 NSSCKFWToken *fwToken
1862 )
1863 { 1765 {
1864 #ifdef DEBUG 1766 #ifdef DEBUG
1865 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1767 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1866 return (NSSCKMDSlot *)NULL; 1768 return (NSSCKMDSlot *)NULL;
1867 } 1769 }
1868 #endif /* DEBUG */ 1770 #endif /* DEBUG */
1869 1771
1870 return nssCKFWToken_GetMDSlot(fwToken); 1772 return nssCKFWToken_GetMDSlot(fwToken);
1871 } 1773 }
1872 1774
1873 /* 1775 /*
1874 * NSSCKFWToken_GetSessionState 1776 * NSSCKFWToken_GetSessionState
1875 * 1777 *
1876 */ 1778 */
1877 1779
1878 NSS_IMPLEMENT CK_STATE 1780 NSS_IMPLEMENT CK_STATE
1879 NSSCKFWSession_GetSessionState 1781 NSSCKFWSession_GetSessionState(
1880 ( 1782 NSSCKFWToken *fwToken)
1881 NSSCKFWToken *fwToken
1882 )
1883 { 1783 {
1884 #ifdef DEBUG 1784 #ifdef DEBUG
1885 if( CKR_OK != nssCKFWToken_verifyPointer(fwToken) ) { 1785 if (CKR_OK != nssCKFWToken_verifyPointer(fwToken)) {
1886 return CKS_RO_PUBLIC_SESSION; 1786 return CKS_RO_PUBLIC_SESSION;
1887 } 1787 }
1888 #endif /* DEBUG */ 1788 #endif /* DEBUG */
1889 1789
1890 return nssCKFWToken_GetSessionState(fwToken); 1790 return nssCKFWToken_GetSessionState(fwToken);
1891 } 1791 }
OLDNEW
« no previous file with comments | « nss/lib/ckfw/slot.c ('k') | nss/lib/ckfw/wrap.c » ('j') | nss/lib/util/secoid.c » ('J')

Powered by Google App Engine
This is Rietveld 408576698