OLD | NEW |
| (Empty) |
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 #ifdef DEBUG | |
6 static const char CVS_ID[] = "@(#) $RCSfile: wrap.c,v $ $Revision: 1.21 $ $Date:
2012/04/25 14:49:28 $"; | |
7 #endif /* DEBUG */ | |
8 | |
9 /* | |
10 * wrap.c | |
11 * | |
12 * This file contains the routines that actually implement the cryptoki | |
13 * API, using the internal APIs of the NSS Cryptoki Framework. There is | |
14 * one routine here for every cryptoki routine. For linking reasons | |
15 * the actual entry points passed back with C_GetFunctionList have to | |
16 * exist in one of the Module's source files; however, those are merely | |
17 * simple wrappers that call these routines. The intelligence of the | |
18 * implementations is here. | |
19 */ | |
20 | |
21 #ifndef CK_T | |
22 #include "ck.h" | |
23 #endif /* CK_T */ | |
24 | |
25 /* | |
26 * NSSCKFWC_Initialize | |
27 * NSSCKFWC_Finalize | |
28 * NSSCKFWC_GetInfo | |
29 * -- NSSCKFWC_GetFunctionList -- see the API insert file | |
30 * NSSCKFWC_GetSlotList | |
31 * NSSCKFWC_GetSlotInfo | |
32 * NSSCKFWC_GetTokenInfo | |
33 * NSSCKFWC_WaitForSlotEvent | |
34 * NSSCKFWC_GetMechanismList | |
35 * NSSCKFWC_GetMechanismInfo | |
36 * NSSCKFWC_InitToken | |
37 * NSSCKFWC_InitPIN | |
38 * NSSCKFWC_SetPIN | |
39 * NSSCKFWC_OpenSession | |
40 * NSSCKFWC_CloseSession | |
41 * NSSCKFWC_CloseAllSessions | |
42 * NSSCKFWC_GetSessionInfo | |
43 * NSSCKFWC_GetOperationState | |
44 * NSSCKFWC_SetOperationState | |
45 * NSSCKFWC_Login | |
46 * NSSCKFWC_Logout | |
47 * NSSCKFWC_CreateObject | |
48 * NSSCKFWC_CopyObject | |
49 * NSSCKFWC_DestroyObject | |
50 * NSSCKFWC_GetObjectSize | |
51 * NSSCKFWC_GetAttributeValue | |
52 * NSSCKFWC_SetAttributeValue | |
53 * NSSCKFWC_FindObjectsInit | |
54 * NSSCKFWC_FindObjects | |
55 * NSSCKFWC_FindObjectsFinal | |
56 * NSSCKFWC_EncryptInit | |
57 * NSSCKFWC_Encrypt | |
58 * NSSCKFWC_EncryptUpdate | |
59 * NSSCKFWC_EncryptFinal | |
60 * NSSCKFWC_DecryptInit | |
61 * NSSCKFWC_Decrypt | |
62 * NSSCKFWC_DecryptUpdate | |
63 * NSSCKFWC_DecryptFinal | |
64 * NSSCKFWC_DigestInit | |
65 * NSSCKFWC_Digest | |
66 * NSSCKFWC_DigestUpdate | |
67 * NSSCKFWC_DigestKey | |
68 * NSSCKFWC_DigestFinal | |
69 * NSSCKFWC_SignInit | |
70 * NSSCKFWC_Sign | |
71 * NSSCKFWC_SignUpdate | |
72 * NSSCKFWC_SignFinal | |
73 * NSSCKFWC_SignRecoverInit | |
74 * NSSCKFWC_SignRecover | |
75 * NSSCKFWC_VerifyInit | |
76 * NSSCKFWC_Verify | |
77 * NSSCKFWC_VerifyUpdate | |
78 * NSSCKFWC_VerifyFinal | |
79 * NSSCKFWC_VerifyRecoverInit | |
80 * NSSCKFWC_VerifyRecover | |
81 * NSSCKFWC_DigestEncryptUpdate | |
82 * NSSCKFWC_DecryptDigestUpdate | |
83 * NSSCKFWC_SignEncryptUpdate | |
84 * NSSCKFWC_DecryptVerifyUpdate | |
85 * NSSCKFWC_GenerateKey | |
86 * NSSCKFWC_GenerateKeyPair | |
87 * NSSCKFWC_WrapKey | |
88 * NSSCKFWC_UnwrapKey | |
89 * NSSCKFWC_DeriveKey | |
90 * NSSCKFWC_SeedRandom | |
91 * NSSCKFWC_GenerateRandom | |
92 * NSSCKFWC_GetFunctionStatus | |
93 * NSSCKFWC_CancelFunction | |
94 */ | |
95 | |
96 /* figure out out locking semantics */ | |
97 static CK_RV | |
98 nssCKFW_GetThreadSafeState(CK_C_INITIALIZE_ARGS_PTR pInitArgs, | |
99 CryptokiLockingState *pLocking_state) { | |
100 int functionCount = 0; | |
101 | |
102 /* parsed according to (PKCS #11 Section 11.4) */ | |
103 /* no args, the degenerate version of case 1 */ | |
104 if (!pInitArgs) { | |
105 *pLocking_state = SingleThreaded; | |
106 return CKR_OK; | |
107 } | |
108 | |
109 /* CKF_OS_LOCKING_OK set, Cases 2 and 4 */ | |
110 if (pInitArgs->flags & CKF_OS_LOCKING_OK) { | |
111 *pLocking_state = MultiThreaded; | |
112 return CKR_OK; | |
113 } | |
114 if ((CK_CREATEMUTEX) NULL != pInitArgs->CreateMutex) functionCount++; | |
115 if ((CK_DESTROYMUTEX) NULL != pInitArgs->DestroyMutex) functionCount++; | |
116 if ((CK_LOCKMUTEX) NULL != pInitArgs->LockMutex) functionCount++; | |
117 if ((CK_UNLOCKMUTEX) NULL != pInitArgs->UnlockMutex) functionCount++; | |
118 | |
119 /* CKF_OS_LOCKING_OK is not set, and not functions supplied, | |
120 * explicit case 1 */ | |
121 if (0 == functionCount) { | |
122 *pLocking_state = SingleThreaded; | |
123 return CKR_OK; | |
124 } | |
125 | |
126 /* OS_LOCKING_OK is not set and functions have been supplied. Since | |
127 * ckfw uses nssbase library which explicitly calls NSPR, and since | |
128 * there is no way to reliably override these explicit calls to NSPR, | |
129 * therefore we can't support applications which have their own threading | |
130 * module. Return CKR_CANT_LOCK if they supplied the correct number of | |
131 * arguments, or CKR_ARGUMENTS_BAD if they did not in either case we will | |
132 * fail the initialize */ | |
133 return (4 == functionCount) ? CKR_CANT_LOCK : CKR_ARGUMENTS_BAD; | |
134 } | |
135 | |
136 static PRInt32 liveInstances; | |
137 | |
138 /* | |
139 * NSSCKFWC_Initialize | |
140 * | |
141 */ | |
142 NSS_IMPLEMENT CK_RV | |
143 NSSCKFWC_Initialize | |
144 ( | |
145 NSSCKFWInstance **pFwInstance, | |
146 NSSCKMDInstance *mdInstance, | |
147 CK_VOID_PTR pInitArgs | |
148 ) | |
149 { | |
150 CK_RV error = CKR_OK; | |
151 CryptokiLockingState locking_state; | |
152 | |
153 if( (NSSCKFWInstance **)NULL == pFwInstance ) { | |
154 error = CKR_GENERAL_ERROR; | |
155 goto loser; | |
156 } | |
157 | |
158 if (*pFwInstance) { | |
159 error = CKR_CRYPTOKI_ALREADY_INITIALIZED; | |
160 goto loser; | |
161 } | |
162 | |
163 if (!mdInstance) { | |
164 error = CKR_GENERAL_ERROR; | |
165 goto loser; | |
166 } | |
167 | |
168 error = nssCKFW_GetThreadSafeState(pInitArgs,&locking_state); | |
169 if( CKR_OK != error ) { | |
170 goto loser; | |
171 } | |
172 | |
173 *pFwInstance = nssCKFWInstance_Create(pInitArgs, locking_state, mdInstance, &e
rror); | |
174 if (!*pFwInstance) { | |
175 goto loser; | |
176 } | |
177 PR_ATOMIC_INCREMENT(&liveInstances); | |
178 return CKR_OK; | |
179 | |
180 loser: | |
181 switch( error ) { | |
182 case CKR_ARGUMENTS_BAD: | |
183 case CKR_CANT_LOCK: | |
184 case CKR_CRYPTOKI_ALREADY_INITIALIZED: | |
185 case CKR_FUNCTION_FAILED: | |
186 case CKR_GENERAL_ERROR: | |
187 case CKR_HOST_MEMORY: | |
188 case CKR_NEED_TO_CREATE_THREADS: | |
189 break; | |
190 default: | |
191 case CKR_OK: | |
192 error = CKR_GENERAL_ERROR; | |
193 break; | |
194 } | |
195 | |
196 return error; | |
197 } | |
198 | |
199 /* | |
200 * NSSCKFWC_Finalize | |
201 * | |
202 */ | |
203 NSS_IMPLEMENT CK_RV | |
204 NSSCKFWC_Finalize | |
205 ( | |
206 NSSCKFWInstance **pFwInstance | |
207 ) | |
208 { | |
209 CK_RV error = CKR_OK; | |
210 | |
211 if( (NSSCKFWInstance **)NULL == pFwInstance ) { | |
212 error = CKR_GENERAL_ERROR; | |
213 goto loser; | |
214 } | |
215 | |
216 if (!*pFwInstance) { | |
217 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
218 goto loser; | |
219 } | |
220 | |
221 error = nssCKFWInstance_Destroy(*pFwInstance); | |
222 | |
223 /* In any case */ | |
224 *pFwInstance = (NSSCKFWInstance *)NULL; | |
225 | |
226 loser: | |
227 switch( error ) { | |
228 PRInt32 remainingInstances; | |
229 case CKR_OK: | |
230 remainingInstances = PR_ATOMIC_DECREMENT(&liveInstances); | |
231 if (!remainingInstances) { | |
232 nssArena_Shutdown(); | |
233 } | |
234 break; | |
235 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
236 case CKR_FUNCTION_FAILED: | |
237 case CKR_GENERAL_ERROR: | |
238 case CKR_HOST_MEMORY: | |
239 break; | |
240 default: | |
241 error = CKR_GENERAL_ERROR; | |
242 break; | |
243 } | |
244 | |
245 /* | |
246 * A thread's error stack is automatically destroyed when the thread | |
247 * terminates or, for the primordial thread, by PR_Cleanup. On | |
248 * Windows with MinGW, the thread private data destructor PR_Free | |
249 * registered by this module is actually a thunk for PR_Free defined | |
250 * in this module. When the thread that unloads this module terminates | |
251 * or calls PR_Cleanup, the thunk for PR_Free is already gone with the | |
252 * module. Therefore we need to destroy the error stack before the | |
253 * module is unloaded. | |
254 */ | |
255 nss_DestroyErrorStack(); | |
256 return error; | |
257 } | |
258 | |
259 /* | |
260 * NSSCKFWC_GetInfo | |
261 * | |
262 */ | |
263 NSS_IMPLEMENT CK_RV | |
264 NSSCKFWC_GetInfo | |
265 ( | |
266 NSSCKFWInstance *fwInstance, | |
267 CK_INFO_PTR pInfo | |
268 ) | |
269 { | |
270 CK_RV error = CKR_OK; | |
271 | |
272 if( (CK_INFO_PTR)CK_NULL_PTR == pInfo ) { | |
273 error = CKR_ARGUMENTS_BAD; | |
274 goto loser; | |
275 } | |
276 | |
277 /* | |
278 * A purify error here means a caller error | |
279 */ | |
280 (void)nsslibc_memset(pInfo, 0, sizeof(CK_INFO)); | |
281 | |
282 pInfo->cryptokiVersion = nssCKFWInstance_GetCryptokiVersion(fwInstance); | |
283 | |
284 error = nssCKFWInstance_GetManufacturerID(fwInstance, pInfo->manufacturerID); | |
285 if( CKR_OK != error ) { | |
286 goto loser; | |
287 } | |
288 | |
289 pInfo->flags = nssCKFWInstance_GetFlags(fwInstance); | |
290 | |
291 error = nssCKFWInstance_GetLibraryDescription(fwInstance, pInfo->libraryDescri
ption); | |
292 if( CKR_OK != error ) { | |
293 goto loser; | |
294 } | |
295 | |
296 pInfo->libraryVersion = nssCKFWInstance_GetLibraryVersion(fwInstance); | |
297 | |
298 return CKR_OK; | |
299 | |
300 loser: | |
301 switch( error ) { | |
302 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
303 case CKR_FUNCTION_FAILED: | |
304 case CKR_GENERAL_ERROR: | |
305 case CKR_HOST_MEMORY: | |
306 break; | |
307 default: | |
308 error = CKR_GENERAL_ERROR; | |
309 break; | |
310 } | |
311 | |
312 return error; | |
313 } | |
314 | |
315 /* | |
316 * C_GetFunctionList is implemented entirely in the Module's file which | |
317 * includes the Framework API insert file. It requires no "actual" | |
318 * NSSCKFW routine. | |
319 */ | |
320 | |
321 /* | |
322 * NSSCKFWC_GetSlotList | |
323 * | |
324 */ | |
325 NSS_IMPLEMENT CK_RV | |
326 NSSCKFWC_GetSlotList | |
327 ( | |
328 NSSCKFWInstance *fwInstance, | |
329 CK_BBOOL tokenPresent, | |
330 CK_SLOT_ID_PTR pSlotList, | |
331 CK_ULONG_PTR pulCount | |
332 ) | |
333 { | |
334 CK_RV error = CKR_OK; | |
335 CK_ULONG nSlots; | |
336 | |
337 if (!fwInstance) { | |
338 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
339 goto loser; | |
340 } | |
341 | |
342 switch( tokenPresent ) { | |
343 case CK_TRUE: | |
344 case CK_FALSE: | |
345 break; | |
346 default: | |
347 error = CKR_ARGUMENTS_BAD; | |
348 goto loser; | |
349 } | |
350 | |
351 if( (CK_ULONG_PTR)CK_NULL_PTR == pulCount ) { | |
352 error = CKR_ARGUMENTS_BAD; | |
353 goto loser; | |
354 } | |
355 | |
356 nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error); | |
357 if( (CK_ULONG)0 == nSlots ) { | |
358 goto loser; | |
359 } | |
360 | |
361 if( (CK_SLOT_ID_PTR)CK_NULL_PTR == pSlotList ) { | |
362 *pulCount = nSlots; | |
363 return CKR_OK; | |
364 } | |
365 | |
366 /* | |
367 * A purify error here indicates caller error. | |
368 */ | |
369 (void)nsslibc_memset(pSlotList, 0, *pulCount * sizeof(CK_SLOT_ID)); | |
370 | |
371 if( *pulCount < nSlots ) { | |
372 *pulCount = nSlots; | |
373 error = CKR_BUFFER_TOO_SMALL; | |
374 goto loser; | |
375 } else { | |
376 CK_ULONG i; | |
377 *pulCount = nSlots; | |
378 | |
379 /* | |
380 * Our secret "mapping": CK_SLOT_IDs are integers [1,N], and we | |
381 * just index one when we need it. | |
382 */ | |
383 | |
384 for( i = 0; i < nSlots; i++ ) { | |
385 pSlotList[i] = i+1; | |
386 } | |
387 | |
388 return CKR_OK; | |
389 } | |
390 | |
391 loser: | |
392 switch( error ) { | |
393 case CKR_BUFFER_TOO_SMALL: | |
394 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
395 case CKR_FUNCTION_FAILED: | |
396 case CKR_GENERAL_ERROR: | |
397 case CKR_HOST_MEMORY: | |
398 break; | |
399 default: | |
400 case CKR_OK: | |
401 error = CKR_GENERAL_ERROR; | |
402 break; | |
403 } | |
404 | |
405 return error; | |
406 } | |
407 | |
408 /* | |
409 * NSSCKFWC_GetSlotInfo | |
410 * | |
411 */ | |
412 NSS_IMPLEMENT CK_RV | |
413 NSSCKFWC_GetSlotInfo | |
414 ( | |
415 NSSCKFWInstance *fwInstance, | |
416 CK_SLOT_ID slotID, | |
417 CK_SLOT_INFO_PTR pInfo | |
418 ) | |
419 { | |
420 CK_RV error = CKR_OK; | |
421 CK_ULONG nSlots; | |
422 NSSCKFWSlot **slots; | |
423 NSSCKFWSlot *fwSlot; | |
424 | |
425 if (!fwInstance) { | |
426 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
427 goto loser; | |
428 } | |
429 | |
430 nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error); | |
431 if( (CK_ULONG)0 == nSlots ) { | |
432 goto loser; | |
433 } | |
434 | |
435 if( (slotID < 1) || (slotID > nSlots) ) { | |
436 error = CKR_SLOT_ID_INVALID; | |
437 goto loser; | |
438 } | |
439 | |
440 if( (CK_SLOT_INFO_PTR)CK_NULL_PTR == pInfo ) { | |
441 error = CKR_ARGUMENTS_BAD; | |
442 goto loser; | |
443 } | |
444 | |
445 /* | |
446 * A purify error here indicates caller error. | |
447 */ | |
448 (void)nsslibc_memset(pInfo, 0, sizeof(CK_SLOT_INFO)); | |
449 | |
450 slots = nssCKFWInstance_GetSlots(fwInstance, &error); | |
451 if( (NSSCKFWSlot **)NULL == slots ) { | |
452 goto loser; | |
453 } | |
454 | |
455 fwSlot = slots[ slotID-1 ]; | |
456 | |
457 error = nssCKFWSlot_GetSlotDescription(fwSlot, pInfo->slotDescription); | |
458 if( CKR_OK != error ) { | |
459 goto loser; | |
460 } | |
461 | |
462 error = nssCKFWSlot_GetManufacturerID(fwSlot, pInfo->manufacturerID); | |
463 if( CKR_OK != error ) { | |
464 goto loser; | |
465 } | |
466 | |
467 if( nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
468 pInfo->flags |= CKF_TOKEN_PRESENT; | |
469 } | |
470 | |
471 if( nssCKFWSlot_GetRemovableDevice(fwSlot) ) { | |
472 pInfo->flags |= CKF_REMOVABLE_DEVICE; | |
473 } | |
474 | |
475 if( nssCKFWSlot_GetHardwareSlot(fwSlot) ) { | |
476 pInfo->flags |= CKF_HW_SLOT; | |
477 } | |
478 | |
479 pInfo->hardwareVersion = nssCKFWSlot_GetHardwareVersion(fwSlot); | |
480 pInfo->firmwareVersion = nssCKFWSlot_GetFirmwareVersion(fwSlot); | |
481 | |
482 return CKR_OK; | |
483 | |
484 loser: | |
485 switch( error ) { | |
486 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
487 case CKR_DEVICE_ERROR: | |
488 case CKR_FUNCTION_FAILED: | |
489 case CKR_GENERAL_ERROR: | |
490 case CKR_HOST_MEMORY: | |
491 case CKR_SLOT_ID_INVALID: | |
492 break; | |
493 default: | |
494 case CKR_OK: | |
495 error = CKR_GENERAL_ERROR; | |
496 } | |
497 | |
498 return error; | |
499 } | |
500 | |
501 /* | |
502 * NSSCKFWC_GetTokenInfo | |
503 * | |
504 */ | |
505 NSS_IMPLEMENT CK_RV | |
506 NSSCKFWC_GetTokenInfo | |
507 ( | |
508 NSSCKFWInstance *fwInstance, | |
509 CK_SLOT_ID slotID, | |
510 CK_TOKEN_INFO_PTR pInfo | |
511 ) | |
512 { | |
513 CK_RV error = CKR_OK; | |
514 CK_ULONG nSlots; | |
515 NSSCKFWSlot **slots; | |
516 NSSCKFWSlot *fwSlot; | |
517 NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL; | |
518 | |
519 if (!fwInstance) { | |
520 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
521 goto loser; | |
522 } | |
523 | |
524 nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error); | |
525 if( (CK_ULONG)0 == nSlots ) { | |
526 goto loser; | |
527 } | |
528 | |
529 if( (slotID < 1) || (slotID > nSlots) ) { | |
530 error = CKR_SLOT_ID_INVALID; | |
531 goto loser; | |
532 } | |
533 | |
534 if( (CK_TOKEN_INFO_PTR)CK_NULL_PTR == pInfo ) { | |
535 error = CKR_ARGUMENTS_BAD; | |
536 goto loser; | |
537 } | |
538 | |
539 /* | |
540 * A purify error here indicates caller error. | |
541 */ | |
542 (void)nsslibc_memset(pInfo, 0, sizeof(CK_TOKEN_INFO)); | |
543 | |
544 slots = nssCKFWInstance_GetSlots(fwInstance, &error); | |
545 if( (NSSCKFWSlot **)NULL == slots ) { | |
546 goto loser; | |
547 } | |
548 | |
549 fwSlot = slots[ slotID-1 ]; | |
550 | |
551 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
552 error = CKR_TOKEN_NOT_PRESENT; | |
553 goto loser; | |
554 } | |
555 | |
556 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
557 if (!fwToken) { | |
558 goto loser; | |
559 } | |
560 | |
561 error = nssCKFWToken_GetLabel(fwToken, pInfo->label); | |
562 if( CKR_OK != error ) { | |
563 goto loser; | |
564 } | |
565 | |
566 error = nssCKFWToken_GetManufacturerID(fwToken, pInfo->manufacturerID); | |
567 if( CKR_OK != error ) { | |
568 goto loser; | |
569 } | |
570 | |
571 error = nssCKFWToken_GetModel(fwToken, pInfo->model); | |
572 if( CKR_OK != error ) { | |
573 goto loser; | |
574 } | |
575 | |
576 error = nssCKFWToken_GetSerialNumber(fwToken, pInfo->serialNumber); | |
577 if( CKR_OK != error ) { | |
578 goto loser; | |
579 } | |
580 | |
581 if( nssCKFWToken_GetHasRNG(fwToken) ) { | |
582 pInfo->flags |= CKF_RNG; | |
583 } | |
584 | |
585 if( nssCKFWToken_GetIsWriteProtected(fwToken) ) { | |
586 pInfo->flags |= CKF_WRITE_PROTECTED; | |
587 } | |
588 | |
589 if( nssCKFWToken_GetLoginRequired(fwToken) ) { | |
590 pInfo->flags |= CKF_LOGIN_REQUIRED; | |
591 } | |
592 | |
593 if( nssCKFWToken_GetUserPinInitialized(fwToken) ) { | |
594 pInfo->flags |= CKF_USER_PIN_INITIALIZED; | |
595 } | |
596 | |
597 if( nssCKFWToken_GetRestoreKeyNotNeeded(fwToken) ) { | |
598 pInfo->flags |= CKF_RESTORE_KEY_NOT_NEEDED; | |
599 } | |
600 | |
601 if( nssCKFWToken_GetHasClockOnToken(fwToken) ) { | |
602 pInfo->flags |= CKF_CLOCK_ON_TOKEN; | |
603 } | |
604 | |
605 if( nssCKFWToken_GetHasProtectedAuthenticationPath(fwToken) ) { | |
606 pInfo->flags |= CKF_PROTECTED_AUTHENTICATION_PATH; | |
607 } | |
608 | |
609 if( nssCKFWToken_GetSupportsDualCryptoOperations(fwToken) ) { | |
610 pInfo->flags |= CKF_DUAL_CRYPTO_OPERATIONS; | |
611 } | |
612 | |
613 pInfo->ulMaxSessionCount = nssCKFWToken_GetMaxSessionCount(fwToken); | |
614 pInfo->ulSessionCount = nssCKFWToken_GetSessionCount(fwToken); | |
615 pInfo->ulMaxRwSessionCount = nssCKFWToken_GetMaxRwSessionCount(fwToken); | |
616 pInfo->ulRwSessionCount= nssCKFWToken_GetRwSessionCount(fwToken); | |
617 pInfo->ulMaxPinLen = nssCKFWToken_GetMaxPinLen(fwToken); | |
618 pInfo->ulMinPinLen = nssCKFWToken_GetMinPinLen(fwToken); | |
619 pInfo->ulTotalPublicMemory = nssCKFWToken_GetTotalPublicMemory(fwToken); | |
620 pInfo->ulFreePublicMemory = nssCKFWToken_GetFreePublicMemory(fwToken); | |
621 pInfo->ulTotalPrivateMemory = nssCKFWToken_GetTotalPrivateMemory(fwToken); | |
622 pInfo->ulFreePrivateMemory = nssCKFWToken_GetFreePrivateMemory(fwToken); | |
623 pInfo->hardwareVersion = nssCKFWToken_GetHardwareVersion(fwToken); | |
624 pInfo->firmwareVersion = nssCKFWToken_GetFirmwareVersion(fwToken); | |
625 | |
626 error = nssCKFWToken_GetUTCTime(fwToken, pInfo->utcTime); | |
627 if( CKR_OK != error ) { | |
628 goto loser; | |
629 } | |
630 | |
631 return CKR_OK; | |
632 | |
633 loser: | |
634 switch( error ) { | |
635 case CKR_DEVICE_REMOVED: | |
636 case CKR_TOKEN_NOT_PRESENT: | |
637 if (fwToken) | |
638 nssCKFWToken_Destroy(fwToken); | |
639 break; | |
640 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
641 case CKR_DEVICE_ERROR: | |
642 case CKR_DEVICE_MEMORY: | |
643 case CKR_FUNCTION_FAILED: | |
644 case CKR_GENERAL_ERROR: | |
645 case CKR_HOST_MEMORY: | |
646 case CKR_SLOT_ID_INVALID: | |
647 case CKR_TOKEN_NOT_RECOGNIZED: | |
648 break; | |
649 default: | |
650 case CKR_OK: | |
651 error = CKR_GENERAL_ERROR; | |
652 break; | |
653 } | |
654 | |
655 return error; | |
656 } | |
657 | |
658 /* | |
659 * NSSCKFWC_WaitForSlotEvent | |
660 * | |
661 */ | |
662 NSS_IMPLEMENT CK_RV | |
663 NSSCKFWC_WaitForSlotEvent | |
664 ( | |
665 NSSCKFWInstance *fwInstance, | |
666 CK_FLAGS flags, | |
667 CK_SLOT_ID_PTR pSlot, | |
668 CK_VOID_PTR pReserved | |
669 ) | |
670 { | |
671 CK_RV error = CKR_OK; | |
672 CK_ULONG nSlots; | |
673 CK_BBOOL block; | |
674 NSSCKFWSlot **slots; | |
675 NSSCKFWSlot *fwSlot; | |
676 CK_ULONG i; | |
677 | |
678 if (!fwInstance) { | |
679 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
680 goto loser; | |
681 } | |
682 | |
683 if( flags & ~CKF_DONT_BLOCK ) { | |
684 error = CKR_ARGUMENTS_BAD; | |
685 goto loser; | |
686 } | |
687 | |
688 block = (flags & CKF_DONT_BLOCK) ? CK_TRUE : CK_FALSE; | |
689 | |
690 nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error); | |
691 if( (CK_ULONG)0 == nSlots ) { | |
692 goto loser; | |
693 } | |
694 | |
695 if( (CK_SLOT_ID_PTR)CK_NULL_PTR == pSlot ) { | |
696 error = CKR_ARGUMENTS_BAD; | |
697 goto loser; | |
698 } | |
699 | |
700 if( (CK_VOID_PTR)CK_NULL_PTR != pReserved ) { | |
701 error = CKR_ARGUMENTS_BAD; | |
702 goto loser; | |
703 } | |
704 | |
705 slots = nssCKFWInstance_GetSlots(fwInstance, &error); | |
706 if( (NSSCKFWSlot **)NULL == slots ) { | |
707 goto loser; | |
708 } | |
709 | |
710 fwSlot = nssCKFWInstance_WaitForSlotEvent(fwInstance, block, &error); | |
711 if (!fwSlot) { | |
712 goto loser; | |
713 } | |
714 | |
715 for( i = 0; i < nSlots; i++ ) { | |
716 if( fwSlot == slots[i] ) { | |
717 *pSlot = (CK_SLOT_ID)(CK_ULONG)(i+1); | |
718 return CKR_OK; | |
719 } | |
720 } | |
721 | |
722 error = CKR_GENERAL_ERROR; /* returned something not in the slot list */ | |
723 | |
724 loser: | |
725 switch( error ) { | |
726 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
727 case CKR_FUNCTION_FAILED: | |
728 case CKR_GENERAL_ERROR: | |
729 case CKR_HOST_MEMORY: | |
730 case CKR_NO_EVENT: | |
731 break; | |
732 default: | |
733 case CKR_OK: | |
734 error = CKR_GENERAL_ERROR; | |
735 break; | |
736 } | |
737 | |
738 return error; | |
739 } | |
740 | |
741 /* | |
742 * NSSCKFWC_GetMechanismList | |
743 * | |
744 */ | |
745 NSS_IMPLEMENT CK_RV | |
746 NSSCKFWC_GetMechanismList | |
747 ( | |
748 NSSCKFWInstance *fwInstance, | |
749 CK_SLOT_ID slotID, | |
750 CK_MECHANISM_TYPE_PTR pMechanismList, | |
751 CK_ULONG_PTR pulCount | |
752 ) | |
753 { | |
754 CK_RV error = CKR_OK; | |
755 CK_ULONG nSlots; | |
756 NSSCKFWSlot **slots; | |
757 NSSCKFWSlot *fwSlot; | |
758 NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL; | |
759 CK_ULONG count; | |
760 | |
761 if (!fwInstance) { | |
762 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
763 goto loser; | |
764 } | |
765 | |
766 nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error); | |
767 if( (CK_ULONG)0 == nSlots ) { | |
768 goto loser; | |
769 } | |
770 | |
771 if( (slotID < 1) || (slotID > nSlots) ) { | |
772 error = CKR_SLOT_ID_INVALID; | |
773 goto loser; | |
774 } | |
775 | |
776 if( (CK_ULONG_PTR)CK_NULL_PTR == pulCount ) { | |
777 error = CKR_ARGUMENTS_BAD; | |
778 goto loser; | |
779 } | |
780 | |
781 slots = nssCKFWInstance_GetSlots(fwInstance, &error); | |
782 if( (NSSCKFWSlot **)NULL == slots ) { | |
783 goto loser; | |
784 } | |
785 | |
786 fwSlot = slots[ slotID-1 ]; | |
787 | |
788 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
789 error = CKR_TOKEN_NOT_PRESENT; | |
790 goto loser; | |
791 } | |
792 | |
793 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
794 if (!fwToken) { | |
795 goto loser; | |
796 } | |
797 | |
798 count = nssCKFWToken_GetMechanismCount(fwToken); | |
799 | |
800 if( (CK_MECHANISM_TYPE_PTR)CK_NULL_PTR == pMechanismList ) { | |
801 *pulCount = count; | |
802 return CKR_OK; | |
803 } | |
804 | |
805 if( *pulCount < count ) { | |
806 *pulCount = count; | |
807 error = CKR_BUFFER_TOO_SMALL; | |
808 goto loser; | |
809 } | |
810 | |
811 /* | |
812 * A purify error here indicates caller error. | |
813 */ | |
814 (void)nsslibc_memset(pMechanismList, 0, *pulCount * sizeof(CK_MECHANISM_TYPE))
; | |
815 | |
816 *pulCount = count; | |
817 | |
818 if( 0 != count ) { | |
819 error = nssCKFWToken_GetMechanismTypes(fwToken, pMechanismList); | |
820 } else { | |
821 error = CKR_OK; | |
822 } | |
823 | |
824 if( CKR_OK == error ) { | |
825 return CKR_OK; | |
826 } | |
827 | |
828 loser: | |
829 switch( error ) { | |
830 case CKR_DEVICE_REMOVED: | |
831 case CKR_TOKEN_NOT_PRESENT: | |
832 if (fwToken) | |
833 nssCKFWToken_Destroy(fwToken); | |
834 break; | |
835 case CKR_ARGUMENTS_BAD: | |
836 case CKR_BUFFER_TOO_SMALL: | |
837 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
838 case CKR_DEVICE_ERROR: | |
839 case CKR_DEVICE_MEMORY: | |
840 case CKR_FUNCTION_FAILED: | |
841 case CKR_GENERAL_ERROR: | |
842 case CKR_HOST_MEMORY: | |
843 case CKR_SLOT_ID_INVALID: | |
844 case CKR_TOKEN_NOT_RECOGNIZED: | |
845 break; | |
846 default: | |
847 case CKR_OK: | |
848 error = CKR_GENERAL_ERROR; | |
849 break; | |
850 } | |
851 | |
852 return error; | |
853 } | |
854 | |
855 /* | |
856 * NSSCKFWC_GetMechanismInfo | |
857 * | |
858 */ | |
859 NSS_IMPLEMENT CK_RV | |
860 NSSCKFWC_GetMechanismInfo | |
861 ( | |
862 NSSCKFWInstance *fwInstance, | |
863 CK_SLOT_ID slotID, | |
864 CK_MECHANISM_TYPE type, | |
865 CK_MECHANISM_INFO_PTR pInfo | |
866 ) | |
867 { | |
868 CK_RV error = CKR_OK; | |
869 CK_ULONG nSlots; | |
870 NSSCKFWSlot **slots; | |
871 NSSCKFWSlot *fwSlot; | |
872 NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL; | |
873 NSSCKFWMechanism *fwMechanism; | |
874 | |
875 if (!fwInstance) { | |
876 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
877 goto loser; | |
878 } | |
879 | |
880 nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error); | |
881 if( (CK_ULONG)0 == nSlots ) { | |
882 goto loser; | |
883 } | |
884 | |
885 if( (slotID < 1) || (slotID > nSlots) ) { | |
886 error = CKR_SLOT_ID_INVALID; | |
887 goto loser; | |
888 } | |
889 | |
890 slots = nssCKFWInstance_GetSlots(fwInstance, &error); | |
891 if( (NSSCKFWSlot **)NULL == slots ) { | |
892 goto loser; | |
893 } | |
894 | |
895 fwSlot = slots[ slotID-1 ]; | |
896 | |
897 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
898 error = CKR_TOKEN_NOT_PRESENT; | |
899 goto loser; | |
900 } | |
901 | |
902 if( (CK_MECHANISM_INFO_PTR)CK_NULL_PTR == pInfo ) { | |
903 error = CKR_ARGUMENTS_BAD; | |
904 goto loser; | |
905 } | |
906 | |
907 /* | |
908 * A purify error here indicates caller error. | |
909 */ | |
910 (void)nsslibc_memset(pInfo, 0, sizeof(CK_MECHANISM_INFO)); | |
911 | |
912 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
913 if (!fwToken) { | |
914 goto loser; | |
915 } | |
916 | |
917 fwMechanism = nssCKFWToken_GetMechanism(fwToken, type, &error); | |
918 if (!fwMechanism) { | |
919 goto loser; | |
920 } | |
921 | |
922 pInfo->ulMinKeySize = nssCKFWMechanism_GetMinKeySize(fwMechanism, &error); | |
923 pInfo->ulMaxKeySize = nssCKFWMechanism_GetMaxKeySize(fwMechanism, &error); | |
924 | |
925 if( nssCKFWMechanism_GetInHardware(fwMechanism, &error) ) { | |
926 pInfo->flags |= CKF_HW; | |
927 } | |
928 if( nssCKFWMechanism_GetCanEncrypt(fwMechanism, &error) ) { | |
929 pInfo->flags |= CKF_ENCRYPT; | |
930 } | |
931 if( nssCKFWMechanism_GetCanDecrypt(fwMechanism, &error) ) { | |
932 pInfo->flags |= CKF_DECRYPT; | |
933 } | |
934 if( nssCKFWMechanism_GetCanDigest(fwMechanism, &error) ) { | |
935 pInfo->flags |= CKF_DIGEST; | |
936 } | |
937 if( nssCKFWMechanism_GetCanSign(fwMechanism, &error) ) { | |
938 pInfo->flags |= CKF_SIGN; | |
939 } | |
940 if( nssCKFWMechanism_GetCanSignRecover(fwMechanism, &error) ) { | |
941 pInfo->flags |= CKF_SIGN_RECOVER; | |
942 } | |
943 if( nssCKFWMechanism_GetCanVerify(fwMechanism, &error) ) { | |
944 pInfo->flags |= CKF_VERIFY; | |
945 } | |
946 if( nssCKFWMechanism_GetCanVerifyRecover(fwMechanism, &error) ) { | |
947 pInfo->flags |= CKF_VERIFY_RECOVER; | |
948 } | |
949 if( nssCKFWMechanism_GetCanGenerate(fwMechanism, &error) ) { | |
950 pInfo->flags |= CKF_GENERATE; | |
951 } | |
952 if( nssCKFWMechanism_GetCanGenerateKeyPair(fwMechanism, &error) ) { | |
953 pInfo->flags |= CKF_GENERATE_KEY_PAIR; | |
954 } | |
955 if( nssCKFWMechanism_GetCanWrap(fwMechanism, &error) ) { | |
956 pInfo->flags |= CKF_WRAP; | |
957 } | |
958 if( nssCKFWMechanism_GetCanUnwrap(fwMechanism, &error) ) { | |
959 pInfo->flags |= CKF_UNWRAP; | |
960 } | |
961 if( nssCKFWMechanism_GetCanDerive(fwMechanism, &error) ) { | |
962 pInfo->flags |= CKF_DERIVE; | |
963 } | |
964 nssCKFWMechanism_Destroy(fwMechanism); | |
965 | |
966 return error; | |
967 | |
968 loser: | |
969 switch( error ) { | |
970 case CKR_DEVICE_REMOVED: | |
971 case CKR_TOKEN_NOT_PRESENT: | |
972 if (fwToken) | |
973 nssCKFWToken_Destroy(fwToken); | |
974 break; | |
975 case CKR_ARGUMENTS_BAD: | |
976 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
977 case CKR_DEVICE_ERROR: | |
978 case CKR_DEVICE_MEMORY: | |
979 case CKR_FUNCTION_FAILED: | |
980 case CKR_GENERAL_ERROR: | |
981 case CKR_HOST_MEMORY: | |
982 case CKR_MECHANISM_INVALID: | |
983 case CKR_SLOT_ID_INVALID: | |
984 case CKR_TOKEN_NOT_RECOGNIZED: | |
985 break; | |
986 default: | |
987 case CKR_OK: | |
988 error = CKR_GENERAL_ERROR; | |
989 break; | |
990 } | |
991 | |
992 return error; | |
993 } | |
994 | |
995 /* | |
996 * NSSCKFWC_InitToken | |
997 * | |
998 */ | |
999 NSS_IMPLEMENT CK_RV | |
1000 NSSCKFWC_InitToken | |
1001 ( | |
1002 NSSCKFWInstance *fwInstance, | |
1003 CK_SLOT_ID slotID, | |
1004 CK_CHAR_PTR pPin, | |
1005 CK_ULONG ulPinLen, | |
1006 CK_CHAR_PTR pLabel | |
1007 ) | |
1008 { | |
1009 CK_RV error = CKR_OK; | |
1010 CK_ULONG nSlots; | |
1011 NSSCKFWSlot **slots; | |
1012 NSSCKFWSlot *fwSlot; | |
1013 NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL; | |
1014 NSSItem pin; | |
1015 NSSUTF8 *label; | |
1016 | |
1017 if (!fwInstance) { | |
1018 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1019 goto loser; | |
1020 } | |
1021 | |
1022 nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error); | |
1023 if( (CK_ULONG)0 == nSlots ) { | |
1024 goto loser; | |
1025 } | |
1026 | |
1027 if( (slotID < 1) || (slotID > nSlots) ) { | |
1028 error = CKR_SLOT_ID_INVALID; | |
1029 goto loser; | |
1030 } | |
1031 | |
1032 slots = nssCKFWInstance_GetSlots(fwInstance, &error); | |
1033 if( (NSSCKFWSlot **)NULL == slots ) { | |
1034 goto loser; | |
1035 } | |
1036 | |
1037 fwSlot = slots[ slotID-1 ]; | |
1038 | |
1039 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
1040 error = CKR_TOKEN_NOT_PRESENT; | |
1041 goto loser; | |
1042 } | |
1043 | |
1044 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
1045 if (!fwToken) { | |
1046 goto loser; | |
1047 } | |
1048 | |
1049 pin.size = (PRUint32)ulPinLen; | |
1050 pin.data = (void *)pPin; | |
1051 label = (NSSUTF8 *)pLabel; /* identity conversion */ | |
1052 | |
1053 error = nssCKFWToken_InitToken(fwToken, &pin, label); | |
1054 if( CKR_OK != error ) { | |
1055 goto loser; | |
1056 } | |
1057 | |
1058 return CKR_OK; | |
1059 | |
1060 loser: | |
1061 switch( error ) { | |
1062 case CKR_DEVICE_REMOVED: | |
1063 case CKR_TOKEN_NOT_PRESENT: | |
1064 if (fwToken) | |
1065 nssCKFWToken_Destroy(fwToken); | |
1066 break; | |
1067 case CKR_ARGUMENTS_BAD: | |
1068 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1069 case CKR_DEVICE_ERROR: | |
1070 case CKR_DEVICE_MEMORY: | |
1071 case CKR_FUNCTION_FAILED: | |
1072 case CKR_GENERAL_ERROR: | |
1073 case CKR_HOST_MEMORY: | |
1074 case CKR_PIN_INCORRECT: | |
1075 case CKR_PIN_LOCKED: | |
1076 case CKR_SESSION_EXISTS: | |
1077 case CKR_SLOT_ID_INVALID: | |
1078 case CKR_TOKEN_NOT_RECOGNIZED: | |
1079 case CKR_TOKEN_WRITE_PROTECTED: | |
1080 break; | |
1081 default: | |
1082 case CKR_OK: | |
1083 error = CKR_GENERAL_ERROR; | |
1084 break; | |
1085 } | |
1086 | |
1087 return error; | |
1088 } | |
1089 | |
1090 /* | |
1091 * NSSCKFWC_InitPIN | |
1092 * | |
1093 */ | |
1094 NSS_IMPLEMENT CK_RV | |
1095 NSSCKFWC_InitPIN | |
1096 ( | |
1097 NSSCKFWInstance *fwInstance, | |
1098 CK_SESSION_HANDLE hSession, | |
1099 CK_CHAR_PTR pPin, | |
1100 CK_ULONG ulPinLen | |
1101 ) | |
1102 { | |
1103 CK_RV error = CKR_OK; | |
1104 NSSCKFWSession *fwSession; | |
1105 NSSItem pin, *arg; | |
1106 | |
1107 if (!fwInstance) { | |
1108 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1109 goto loser; | |
1110 } | |
1111 | |
1112 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
1113 if (!fwSession) { | |
1114 error = CKR_SESSION_HANDLE_INVALID; | |
1115 goto loser; | |
1116 } | |
1117 | |
1118 if( (CK_CHAR_PTR)CK_NULL_PTR == pPin ) { | |
1119 arg = (NSSItem *)NULL; | |
1120 } else { | |
1121 arg = &pin; | |
1122 pin.size = (PRUint32)ulPinLen; | |
1123 pin.data = (void *)pPin; | |
1124 } | |
1125 | |
1126 error = nssCKFWSession_InitPIN(fwSession, arg); | |
1127 if( CKR_OK != error ) { | |
1128 goto loser; | |
1129 } | |
1130 | |
1131 return CKR_OK; | |
1132 | |
1133 loser: | |
1134 switch( error ) { | |
1135 case CKR_SESSION_CLOSED: | |
1136 /* destroy session? */ | |
1137 break; | |
1138 case CKR_DEVICE_REMOVED: | |
1139 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1140 break; | |
1141 case CKR_ARGUMENTS_BAD: | |
1142 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1143 case CKR_DEVICE_ERROR: | |
1144 case CKR_DEVICE_MEMORY: | |
1145 case CKR_FUNCTION_FAILED: | |
1146 case CKR_GENERAL_ERROR: | |
1147 case CKR_HOST_MEMORY: | |
1148 case CKR_PIN_INVALID: | |
1149 case CKR_PIN_LEN_RANGE: | |
1150 case CKR_SESSION_READ_ONLY: | |
1151 case CKR_SESSION_HANDLE_INVALID: | |
1152 case CKR_TOKEN_WRITE_PROTECTED: | |
1153 case CKR_USER_NOT_LOGGED_IN: | |
1154 break; | |
1155 default: | |
1156 case CKR_OK: | |
1157 error = CKR_GENERAL_ERROR; | |
1158 break; | |
1159 } | |
1160 | |
1161 return error; | |
1162 } | |
1163 | |
1164 /* | |
1165 * NSSCKFWC_SetPIN | |
1166 * | |
1167 */ | |
1168 NSS_IMPLEMENT CK_RV | |
1169 NSSCKFWC_SetPIN | |
1170 ( | |
1171 NSSCKFWInstance *fwInstance, | |
1172 CK_SESSION_HANDLE hSession, | |
1173 CK_CHAR_PTR pOldPin, | |
1174 CK_ULONG ulOldLen, | |
1175 CK_CHAR_PTR pNewPin, | |
1176 CK_ULONG ulNewLen | |
1177 ) | |
1178 { | |
1179 CK_RV error = CKR_OK; | |
1180 NSSCKFWSession *fwSession; | |
1181 NSSItem oldPin, newPin, *oldArg, *newArg; | |
1182 | |
1183 if (!fwInstance) { | |
1184 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1185 goto loser; | |
1186 } | |
1187 | |
1188 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
1189 if (!fwSession) { | |
1190 error = CKR_SESSION_HANDLE_INVALID; | |
1191 goto loser; | |
1192 } | |
1193 | |
1194 if( (CK_CHAR_PTR)CK_NULL_PTR == pOldPin ) { | |
1195 oldArg = (NSSItem *)NULL; | |
1196 } else { | |
1197 oldArg = &oldPin; | |
1198 oldPin.size = (PRUint32)ulOldLen; | |
1199 oldPin.data = (void *)pOldPin; | |
1200 } | |
1201 | |
1202 if( (CK_CHAR_PTR)CK_NULL_PTR == pNewPin ) { | |
1203 newArg = (NSSItem *)NULL; | |
1204 } else { | |
1205 newArg = &newPin; | |
1206 newPin.size = (PRUint32)ulNewLen; | |
1207 newPin.data = (void *)pNewPin; | |
1208 } | |
1209 | |
1210 error = nssCKFWSession_SetPIN(fwSession, oldArg, newArg); | |
1211 if( CKR_OK != error ) { | |
1212 goto loser; | |
1213 } | |
1214 | |
1215 return CKR_OK; | |
1216 | |
1217 loser: | |
1218 switch( error ) { | |
1219 case CKR_SESSION_CLOSED: | |
1220 /* destroy session? */ | |
1221 break; | |
1222 case CKR_DEVICE_REMOVED: | |
1223 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1224 break; | |
1225 case CKR_ARGUMENTS_BAD: | |
1226 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1227 case CKR_DEVICE_ERROR: | |
1228 case CKR_DEVICE_MEMORY: | |
1229 case CKR_FUNCTION_FAILED: | |
1230 case CKR_GENERAL_ERROR: | |
1231 case CKR_HOST_MEMORY: | |
1232 case CKR_PIN_INCORRECT: | |
1233 case CKR_PIN_INVALID: | |
1234 case CKR_PIN_LEN_RANGE: | |
1235 case CKR_PIN_LOCKED: | |
1236 case CKR_SESSION_HANDLE_INVALID: | |
1237 case CKR_SESSION_READ_ONLY: | |
1238 case CKR_TOKEN_WRITE_PROTECTED: | |
1239 break; | |
1240 default: | |
1241 case CKR_OK: | |
1242 error = CKR_GENERAL_ERROR; | |
1243 break; | |
1244 } | |
1245 | |
1246 return error; | |
1247 } | |
1248 | |
1249 /* | |
1250 * NSSCKFWC_OpenSession | |
1251 * | |
1252 */ | |
1253 NSS_IMPLEMENT CK_RV | |
1254 NSSCKFWC_OpenSession | |
1255 ( | |
1256 NSSCKFWInstance *fwInstance, | |
1257 CK_SLOT_ID slotID, | |
1258 CK_FLAGS flags, | |
1259 CK_VOID_PTR pApplication, | |
1260 CK_NOTIFY Notify, | |
1261 CK_SESSION_HANDLE_PTR phSession | |
1262 ) | |
1263 { | |
1264 CK_RV error = CKR_OK; | |
1265 CK_ULONG nSlots; | |
1266 NSSCKFWSlot **slots; | |
1267 NSSCKFWSlot *fwSlot; | |
1268 NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL; | |
1269 NSSCKFWSession *fwSession; | |
1270 CK_BBOOL rw; | |
1271 | |
1272 if (!fwInstance) { | |
1273 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1274 goto loser; | |
1275 } | |
1276 | |
1277 nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error); | |
1278 if( (CK_ULONG)0 == nSlots ) { | |
1279 goto loser; | |
1280 } | |
1281 | |
1282 if( (slotID < 1) || (slotID > nSlots) ) { | |
1283 error = CKR_SLOT_ID_INVALID; | |
1284 goto loser; | |
1285 } | |
1286 | |
1287 if( flags & CKF_RW_SESSION ) { | |
1288 rw = CK_TRUE; | |
1289 } else { | |
1290 rw = CK_FALSE; | |
1291 } | |
1292 | |
1293 if( flags & CKF_SERIAL_SESSION ) { | |
1294 ; | |
1295 } else { | |
1296 error = CKR_SESSION_PARALLEL_NOT_SUPPORTED; | |
1297 goto loser; | |
1298 } | |
1299 | |
1300 if( flags & ~(CKF_RW_SESSION|CKF_SERIAL_SESSION) ) { | |
1301 error = CKR_ARGUMENTS_BAD; | |
1302 goto loser; | |
1303 } | |
1304 | |
1305 if( (CK_SESSION_HANDLE_PTR)CK_NULL_PTR == phSession ) { | |
1306 error = CKR_ARGUMENTS_BAD; | |
1307 goto loser; | |
1308 } | |
1309 | |
1310 /* | |
1311 * A purify error here indicates caller error. | |
1312 */ | |
1313 *phSession = (CK_SESSION_HANDLE)0; | |
1314 | |
1315 slots = nssCKFWInstance_GetSlots(fwInstance, &error); | |
1316 if( (NSSCKFWSlot **)NULL == slots ) { | |
1317 goto loser; | |
1318 } | |
1319 | |
1320 fwSlot = slots[ slotID-1 ]; | |
1321 | |
1322 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
1323 error = CKR_TOKEN_NOT_PRESENT; | |
1324 goto loser; | |
1325 } | |
1326 | |
1327 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
1328 if (!fwToken) { | |
1329 goto loser; | |
1330 } | |
1331 | |
1332 fwSession = nssCKFWToken_OpenSession(fwToken, rw, pApplication, | |
1333 Notify, &error); | |
1334 if (!fwSession) { | |
1335 goto loser; | |
1336 } | |
1337 | |
1338 *phSession = nssCKFWInstance_CreateSessionHandle(fwInstance, | |
1339 fwSession, &error); | |
1340 if( (CK_SESSION_HANDLE)0 == *phSession ) { | |
1341 goto loser; | |
1342 } | |
1343 | |
1344 return CKR_OK; | |
1345 | |
1346 loser: | |
1347 switch( error ) { | |
1348 case CKR_SESSION_CLOSED: | |
1349 /* destroy session? */ | |
1350 break; | |
1351 case CKR_DEVICE_REMOVED: | |
1352 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1353 break; | |
1354 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1355 case CKR_DEVICE_ERROR: | |
1356 case CKR_DEVICE_MEMORY: | |
1357 case CKR_FUNCTION_FAILED: | |
1358 case CKR_GENERAL_ERROR: | |
1359 case CKR_HOST_MEMORY: | |
1360 case CKR_SESSION_COUNT: | |
1361 case CKR_SESSION_EXISTS: | |
1362 case CKR_SESSION_PARALLEL_NOT_SUPPORTED: | |
1363 case CKR_SESSION_READ_WRITE_SO_EXISTS: | |
1364 case CKR_SLOT_ID_INVALID: | |
1365 case CKR_TOKEN_NOT_PRESENT: | |
1366 case CKR_TOKEN_NOT_RECOGNIZED: | |
1367 case CKR_TOKEN_WRITE_PROTECTED: | |
1368 break; | |
1369 default: | |
1370 case CKR_OK: | |
1371 error = CKR_GENERAL_ERROR; | |
1372 break; | |
1373 } | |
1374 | |
1375 return error; | |
1376 } | |
1377 | |
1378 /* | |
1379 * NSSCKFWC_CloseSession | |
1380 * | |
1381 */ | |
1382 NSS_IMPLEMENT CK_RV | |
1383 NSSCKFWC_CloseSession | |
1384 ( | |
1385 NSSCKFWInstance *fwInstance, | |
1386 CK_SESSION_HANDLE hSession | |
1387 ) | |
1388 { | |
1389 CK_RV error = CKR_OK; | |
1390 NSSCKFWSession *fwSession; | |
1391 | |
1392 if (!fwInstance) { | |
1393 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1394 goto loser; | |
1395 } | |
1396 | |
1397 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
1398 if (!fwSession) { | |
1399 error = CKR_SESSION_HANDLE_INVALID; | |
1400 goto loser; | |
1401 } | |
1402 | |
1403 nssCKFWInstance_DestroySessionHandle(fwInstance, hSession); | |
1404 error = nssCKFWSession_Destroy(fwSession, CK_TRUE); | |
1405 | |
1406 if( CKR_OK != error ) { | |
1407 goto loser; | |
1408 } | |
1409 | |
1410 return CKR_OK; | |
1411 | |
1412 loser: | |
1413 switch( error ) { | |
1414 case CKR_SESSION_CLOSED: | |
1415 /* destroy session? */ | |
1416 break; | |
1417 case CKR_DEVICE_REMOVED: | |
1418 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1419 break; | |
1420 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1421 case CKR_DEVICE_ERROR: | |
1422 case CKR_DEVICE_MEMORY: | |
1423 case CKR_FUNCTION_FAILED: | |
1424 case CKR_GENERAL_ERROR: | |
1425 case CKR_HOST_MEMORY: | |
1426 case CKR_SESSION_HANDLE_INVALID: | |
1427 break; | |
1428 default: | |
1429 case CKR_OK: | |
1430 error = CKR_GENERAL_ERROR; | |
1431 break; | |
1432 } | |
1433 | |
1434 return error; | |
1435 } | |
1436 | |
1437 /* | |
1438 * NSSCKFWC_CloseAllSessions | |
1439 * | |
1440 */ | |
1441 NSS_IMPLEMENT CK_RV | |
1442 NSSCKFWC_CloseAllSessions | |
1443 ( | |
1444 NSSCKFWInstance *fwInstance, | |
1445 CK_SLOT_ID slotID | |
1446 ) | |
1447 { | |
1448 CK_RV error = CKR_OK; | |
1449 CK_ULONG nSlots; | |
1450 NSSCKFWSlot **slots; | |
1451 NSSCKFWSlot *fwSlot; | |
1452 NSSCKFWToken *fwToken = (NSSCKFWToken *)NULL; | |
1453 | |
1454 if (!fwInstance) { | |
1455 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1456 goto loser; | |
1457 } | |
1458 | |
1459 nSlots = nssCKFWInstance_GetNSlots(fwInstance, &error); | |
1460 if( (CK_ULONG)0 == nSlots ) { | |
1461 goto loser; | |
1462 } | |
1463 | |
1464 if( (slotID < 1) || (slotID > nSlots) ) { | |
1465 error = CKR_SLOT_ID_INVALID; | |
1466 goto loser; | |
1467 } | |
1468 | |
1469 slots = nssCKFWInstance_GetSlots(fwInstance, &error); | |
1470 if( (NSSCKFWSlot **)NULL == slots ) { | |
1471 goto loser; | |
1472 } | |
1473 | |
1474 fwSlot = slots[ slotID-1 ]; | |
1475 | |
1476 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
1477 error = CKR_TOKEN_NOT_PRESENT; | |
1478 goto loser; | |
1479 } | |
1480 | |
1481 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
1482 if (!fwToken) { | |
1483 goto loser; | |
1484 } | |
1485 | |
1486 error = nssCKFWToken_CloseAllSessions(fwToken); | |
1487 if( CKR_OK != error ) { | |
1488 goto loser; | |
1489 } | |
1490 | |
1491 return CKR_OK; | |
1492 | |
1493 loser: | |
1494 switch( error ) { | |
1495 case CKR_DEVICE_REMOVED: | |
1496 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1497 break; | |
1498 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1499 case CKR_DEVICE_ERROR: | |
1500 case CKR_DEVICE_MEMORY: | |
1501 case CKR_FUNCTION_FAILED: | |
1502 case CKR_GENERAL_ERROR: | |
1503 case CKR_HOST_MEMORY: | |
1504 case CKR_SLOT_ID_INVALID: | |
1505 case CKR_TOKEN_NOT_PRESENT: | |
1506 break; | |
1507 default: | |
1508 case CKR_OK: | |
1509 error = CKR_GENERAL_ERROR; | |
1510 break; | |
1511 } | |
1512 | |
1513 return error; | |
1514 } | |
1515 | |
1516 /* | |
1517 * NSSCKFWC_GetSessionInfo | |
1518 * | |
1519 */ | |
1520 NSS_IMPLEMENT CK_RV | |
1521 NSSCKFWC_GetSessionInfo | |
1522 ( | |
1523 NSSCKFWInstance *fwInstance, | |
1524 CK_SESSION_HANDLE hSession, | |
1525 CK_SESSION_INFO_PTR pInfo | |
1526 ) | |
1527 { | |
1528 CK_RV error = CKR_OK; | |
1529 NSSCKFWSession *fwSession; | |
1530 NSSCKFWSlot *fwSlot; | |
1531 | |
1532 if (!fwInstance) { | |
1533 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1534 goto loser; | |
1535 } | |
1536 | |
1537 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
1538 if (!fwSession) { | |
1539 error = CKR_SESSION_HANDLE_INVALID; | |
1540 goto loser; | |
1541 } | |
1542 | |
1543 if( (CK_SESSION_INFO_PTR)CK_NULL_PTR == pInfo ) { | |
1544 error = CKR_ARGUMENTS_BAD; | |
1545 goto loser; | |
1546 } | |
1547 | |
1548 /* | |
1549 * A purify error here indicates caller error. | |
1550 */ | |
1551 (void)nsslibc_memset(pInfo, 0, sizeof(CK_SESSION_INFO)); | |
1552 | |
1553 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
1554 if (!fwSlot) { | |
1555 error = CKR_GENERAL_ERROR; | |
1556 goto loser; | |
1557 } | |
1558 | |
1559 pInfo->slotID = nssCKFWSlot_GetSlotID(fwSlot); | |
1560 pInfo->state = nssCKFWSession_GetSessionState(fwSession); | |
1561 | |
1562 if( CK_TRUE == nssCKFWSession_IsRWSession(fwSession) ) { | |
1563 pInfo->flags |= CKF_RW_SESSION; | |
1564 } | |
1565 | |
1566 pInfo->flags |= CKF_SERIAL_SESSION; /* Always true */ | |
1567 | |
1568 pInfo->ulDeviceError = nssCKFWSession_GetDeviceError(fwSession); | |
1569 | |
1570 return CKR_OK; | |
1571 | |
1572 loser: | |
1573 switch( error ) { | |
1574 case CKR_SESSION_CLOSED: | |
1575 /* destroy session? */ | |
1576 break; | |
1577 case CKR_DEVICE_REMOVED: | |
1578 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1579 break; | |
1580 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1581 case CKR_DEVICE_ERROR: | |
1582 case CKR_DEVICE_MEMORY: | |
1583 case CKR_FUNCTION_FAILED: | |
1584 case CKR_GENERAL_ERROR: | |
1585 case CKR_HOST_MEMORY: | |
1586 case CKR_SESSION_HANDLE_INVALID: | |
1587 break; | |
1588 default: | |
1589 case CKR_OK: | |
1590 error = CKR_GENERAL_ERROR; | |
1591 break; | |
1592 } | |
1593 | |
1594 return error; | |
1595 } | |
1596 | |
1597 /* | |
1598 * NSSCKFWC_GetOperationState | |
1599 * | |
1600 */ | |
1601 NSS_IMPLEMENT CK_RV | |
1602 NSSCKFWC_GetOperationState | |
1603 ( | |
1604 NSSCKFWInstance *fwInstance, | |
1605 CK_SESSION_HANDLE hSession, | |
1606 CK_BYTE_PTR pOperationState, | |
1607 CK_ULONG_PTR pulOperationStateLen | |
1608 ) | |
1609 { | |
1610 CK_RV error = CKR_OK; | |
1611 NSSCKFWSession *fwSession; | |
1612 CK_ULONG len; | |
1613 NSSItem buf; | |
1614 | |
1615 if (!fwInstance) { | |
1616 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1617 goto loser; | |
1618 } | |
1619 | |
1620 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
1621 if (!fwSession) { | |
1622 error = CKR_SESSION_HANDLE_INVALID; | |
1623 goto loser; | |
1624 } | |
1625 | |
1626 if( (CK_ULONG_PTR)CK_NULL_PTR == pulOperationStateLen ) { | |
1627 error = CKR_ARGUMENTS_BAD; | |
1628 goto loser; | |
1629 } | |
1630 | |
1631 len = nssCKFWSession_GetOperationStateLen(fwSession, &error); | |
1632 if( ((CK_ULONG)0 == len) && (CKR_OK != error) ) { | |
1633 goto loser; | |
1634 } | |
1635 | |
1636 if( (CK_BYTE_PTR)CK_NULL_PTR == pOperationState ) { | |
1637 *pulOperationStateLen = len; | |
1638 return CKR_OK; | |
1639 } | |
1640 | |
1641 if( *pulOperationStateLen < len ) { | |
1642 *pulOperationStateLen = len; | |
1643 error = CKR_BUFFER_TOO_SMALL; | |
1644 goto loser; | |
1645 } | |
1646 | |
1647 buf.size = (PRUint32)*pulOperationStateLen; | |
1648 buf.data = (void *)pOperationState; | |
1649 *pulOperationStateLen = len; | |
1650 error = nssCKFWSession_GetOperationState(fwSession, &buf); | |
1651 | |
1652 if( CKR_OK != error ) { | |
1653 goto loser; | |
1654 } | |
1655 | |
1656 return CKR_OK; | |
1657 | |
1658 loser: | |
1659 switch( error ) { | |
1660 case CKR_SESSION_CLOSED: | |
1661 /* destroy session? */ | |
1662 break; | |
1663 case CKR_DEVICE_REMOVED: | |
1664 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1665 break; | |
1666 case CKR_BUFFER_TOO_SMALL: | |
1667 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1668 case CKR_DEVICE_ERROR: | |
1669 case CKR_DEVICE_MEMORY: | |
1670 case CKR_FUNCTION_FAILED: | |
1671 case CKR_GENERAL_ERROR: | |
1672 case CKR_HOST_MEMORY: | |
1673 case CKR_OPERATION_NOT_INITIALIZED: | |
1674 case CKR_SESSION_HANDLE_INVALID: | |
1675 case CKR_STATE_UNSAVEABLE: | |
1676 break; | |
1677 default: | |
1678 case CKR_OK: | |
1679 error = CKR_GENERAL_ERROR; | |
1680 break; | |
1681 } | |
1682 | |
1683 return error; | |
1684 } | |
1685 | |
1686 /* | |
1687 * NSSCKFWC_SetOperationState | |
1688 * | |
1689 */ | |
1690 NSS_IMPLEMENT CK_RV | |
1691 NSSCKFWC_SetOperationState | |
1692 ( | |
1693 NSSCKFWInstance *fwInstance, | |
1694 CK_SESSION_HANDLE hSession, | |
1695 CK_BYTE_PTR pOperationState, | |
1696 CK_ULONG ulOperationStateLen, | |
1697 CK_OBJECT_HANDLE hEncryptionKey, | |
1698 CK_OBJECT_HANDLE hAuthenticationKey | |
1699 ) | |
1700 { | |
1701 CK_RV error = CKR_OK; | |
1702 NSSCKFWSession *fwSession; | |
1703 NSSCKFWObject *eKey; | |
1704 NSSCKFWObject *aKey; | |
1705 NSSItem state; | |
1706 | |
1707 if (!fwInstance) { | |
1708 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1709 goto loser; | |
1710 } | |
1711 | |
1712 if( (CK_BYTE_PTR)CK_NULL_PTR == pOperationState ) { | |
1713 error = CKR_ARGUMENTS_BAD; | |
1714 goto loser; | |
1715 } | |
1716 | |
1717 /* | |
1718 * We could loop through the buffer, to catch any purify errors | |
1719 * in a place with a "user error" note. | |
1720 */ | |
1721 | |
1722 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
1723 if (!fwSession) { | |
1724 error = CKR_SESSION_HANDLE_INVALID; | |
1725 goto loser; | |
1726 } | |
1727 | |
1728 if( (CK_OBJECT_HANDLE)0 == hEncryptionKey ) { | |
1729 eKey = (NSSCKFWObject *)NULL; | |
1730 } else { | |
1731 eKey = nssCKFWInstance_ResolveObjectHandle(fwInstance, hEncryptionKey); | |
1732 if (!eKey) { | |
1733 error = CKR_KEY_HANDLE_INVALID; | |
1734 goto loser; | |
1735 } | |
1736 } | |
1737 | |
1738 if( (CK_OBJECT_HANDLE)0 == hAuthenticationKey ) { | |
1739 aKey = (NSSCKFWObject *)NULL; | |
1740 } else { | |
1741 aKey = nssCKFWInstance_ResolveObjectHandle(fwInstance, hAuthenticationKey); | |
1742 if (!aKey) { | |
1743 error = CKR_KEY_HANDLE_INVALID; | |
1744 goto loser; | |
1745 } | |
1746 } | |
1747 | |
1748 state.data = pOperationState; | |
1749 state.size = ulOperationStateLen; | |
1750 | |
1751 error = nssCKFWSession_SetOperationState(fwSession, &state, eKey, aKey); | |
1752 if( CKR_OK != error ) { | |
1753 goto loser; | |
1754 } | |
1755 | |
1756 return CKR_OK; | |
1757 | |
1758 loser: | |
1759 switch( error ) { | |
1760 case CKR_SESSION_CLOSED: | |
1761 /* destroy session? */ | |
1762 break; | |
1763 case CKR_DEVICE_REMOVED: | |
1764 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1765 break; | |
1766 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1767 case CKR_DEVICE_ERROR: | |
1768 case CKR_DEVICE_MEMORY: | |
1769 case CKR_FUNCTION_FAILED: | |
1770 case CKR_GENERAL_ERROR: | |
1771 case CKR_HOST_MEMORY: | |
1772 case CKR_KEY_CHANGED: | |
1773 case CKR_KEY_NEEDED: | |
1774 case CKR_KEY_NOT_NEEDED: | |
1775 case CKR_SAVED_STATE_INVALID: | |
1776 case CKR_SESSION_HANDLE_INVALID: | |
1777 break; | |
1778 default: | |
1779 case CKR_OK: | |
1780 error = CKR_GENERAL_ERROR; | |
1781 break; | |
1782 } | |
1783 | |
1784 return error; | |
1785 } | |
1786 | |
1787 /* | |
1788 * NSSCKFWC_Login | |
1789 * | |
1790 */ | |
1791 NSS_IMPLEMENT CK_RV | |
1792 NSSCKFWC_Login | |
1793 ( | |
1794 NSSCKFWInstance *fwInstance, | |
1795 CK_SESSION_HANDLE hSession, | |
1796 CK_USER_TYPE userType, | |
1797 CK_CHAR_PTR pPin, | |
1798 CK_ULONG ulPinLen | |
1799 ) | |
1800 { | |
1801 CK_RV error = CKR_OK; | |
1802 NSSCKFWSession *fwSession; | |
1803 NSSItem pin, *arg; | |
1804 | |
1805 if (!fwInstance) { | |
1806 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1807 goto loser; | |
1808 } | |
1809 | |
1810 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
1811 if (!fwSession) { | |
1812 error = CKR_SESSION_HANDLE_INVALID; | |
1813 goto loser; | |
1814 } | |
1815 | |
1816 if( (CK_CHAR_PTR)CK_NULL_PTR == pPin ) { | |
1817 arg = (NSSItem *)NULL; | |
1818 } else { | |
1819 arg = &pin; | |
1820 pin.size = (PRUint32)ulPinLen; | |
1821 pin.data = (void *)pPin; | |
1822 } | |
1823 | |
1824 error = nssCKFWSession_Login(fwSession, userType, arg); | |
1825 if( CKR_OK != error ) { | |
1826 goto loser; | |
1827 } | |
1828 | |
1829 return CKR_OK; | |
1830 | |
1831 loser: | |
1832 switch( error ) { | |
1833 case CKR_SESSION_CLOSED: | |
1834 /* destroy session? */ | |
1835 break; | |
1836 case CKR_DEVICE_REMOVED: | |
1837 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1838 break; | |
1839 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1840 case CKR_DEVICE_ERROR: | |
1841 case CKR_DEVICE_MEMORY: | |
1842 case CKR_FUNCTION_FAILED: | |
1843 case CKR_GENERAL_ERROR: | |
1844 case CKR_HOST_MEMORY: | |
1845 case CKR_PIN_EXPIRED: | |
1846 case CKR_PIN_INCORRECT: | |
1847 case CKR_PIN_LOCKED: | |
1848 case CKR_SESSION_HANDLE_INVALID: | |
1849 case CKR_SESSION_READ_ONLY_EXISTS: | |
1850 case CKR_USER_ALREADY_LOGGED_IN: | |
1851 case CKR_USER_ANOTHER_ALREADY_LOGGED_IN: | |
1852 case CKR_USER_PIN_NOT_INITIALIZED: | |
1853 case CKR_USER_TOO_MANY_TYPES: | |
1854 case CKR_USER_TYPE_INVALID: | |
1855 break; | |
1856 default: | |
1857 case CKR_OK: | |
1858 error = CKR_GENERAL_ERROR; | |
1859 break; | |
1860 } | |
1861 | |
1862 return error; | |
1863 } | |
1864 | |
1865 /* | |
1866 * NSSCKFWC_Logout | |
1867 * | |
1868 */ | |
1869 NSS_IMPLEMENT CK_RV | |
1870 NSSCKFWC_Logout | |
1871 ( | |
1872 NSSCKFWInstance *fwInstance, | |
1873 CK_SESSION_HANDLE hSession | |
1874 ) | |
1875 { | |
1876 CK_RV error = CKR_OK; | |
1877 NSSCKFWSession *fwSession; | |
1878 | |
1879 if (!fwInstance) { | |
1880 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1881 goto loser; | |
1882 } | |
1883 | |
1884 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
1885 if (!fwSession) { | |
1886 error = CKR_SESSION_HANDLE_INVALID; | |
1887 goto loser; | |
1888 } | |
1889 | |
1890 error = nssCKFWSession_Logout(fwSession); | |
1891 if( CKR_OK != error ) { | |
1892 goto loser; | |
1893 } | |
1894 | |
1895 return CKR_OK; | |
1896 | |
1897 loser: | |
1898 switch( error ) { | |
1899 case CKR_SESSION_CLOSED: | |
1900 /* destroy session? */ | |
1901 break; | |
1902 case CKR_DEVICE_REMOVED: | |
1903 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1904 break; | |
1905 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1906 case CKR_DEVICE_ERROR: | |
1907 case CKR_DEVICE_MEMORY: | |
1908 case CKR_FUNCTION_FAILED: | |
1909 case CKR_GENERAL_ERROR: | |
1910 case CKR_HOST_MEMORY: | |
1911 case CKR_SESSION_HANDLE_INVALID: | |
1912 case CKR_USER_NOT_LOGGED_IN: | |
1913 break; | |
1914 default: | |
1915 case CKR_OK: | |
1916 error = CKR_GENERAL_ERROR; | |
1917 break; | |
1918 } | |
1919 | |
1920 return error; | |
1921 } | |
1922 | |
1923 /* | |
1924 * NSSCKFWC_CreateObject | |
1925 * | |
1926 */ | |
1927 NSS_IMPLEMENT CK_RV | |
1928 NSSCKFWC_CreateObject | |
1929 ( | |
1930 NSSCKFWInstance *fwInstance, | |
1931 CK_SESSION_HANDLE hSession, | |
1932 CK_ATTRIBUTE_PTR pTemplate, | |
1933 CK_ULONG ulCount, | |
1934 CK_OBJECT_HANDLE_PTR phObject | |
1935 ) | |
1936 { | |
1937 CK_RV error = CKR_OK; | |
1938 NSSCKFWSession *fwSession; | |
1939 NSSCKFWObject *fwObject; | |
1940 | |
1941 if (!fwInstance) { | |
1942 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
1943 goto loser; | |
1944 } | |
1945 | |
1946 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
1947 if (!fwSession) { | |
1948 error = CKR_SESSION_HANDLE_INVALID; | |
1949 goto loser; | |
1950 } | |
1951 | |
1952 if( (CK_OBJECT_HANDLE_PTR)CK_NULL_PTR == phObject ) { | |
1953 error = CKR_ARGUMENTS_BAD; | |
1954 goto loser; | |
1955 } | |
1956 | |
1957 /* | |
1958 * A purify error here indicates caller error. | |
1959 */ | |
1960 *phObject = (CK_OBJECT_HANDLE)0; | |
1961 | |
1962 fwObject = nssCKFWSession_CreateObject(fwSession, pTemplate, | |
1963 ulCount, &error); | |
1964 if (!fwObject) { | |
1965 goto loser; | |
1966 } | |
1967 | |
1968 *phObject = nssCKFWInstance_CreateObjectHandle(fwInstance, fwObject, &error); | |
1969 if( (CK_OBJECT_HANDLE)0 == *phObject ) { | |
1970 nssCKFWObject_Destroy(fwObject); | |
1971 goto loser; | |
1972 } | |
1973 | |
1974 return CKR_OK; | |
1975 | |
1976 loser: | |
1977 switch( error ) { | |
1978 case CKR_SESSION_CLOSED: | |
1979 /* destroy session? */ | |
1980 break; | |
1981 case CKR_DEVICE_REMOVED: | |
1982 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
1983 break; | |
1984 case CKR_ATTRIBUTE_READ_ONLY: | |
1985 case CKR_ATTRIBUTE_TYPE_INVALID: | |
1986 case CKR_ATTRIBUTE_VALUE_INVALID: | |
1987 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
1988 case CKR_DEVICE_ERROR: | |
1989 case CKR_DEVICE_MEMORY: | |
1990 case CKR_FUNCTION_FAILED: | |
1991 case CKR_GENERAL_ERROR: | |
1992 case CKR_HOST_MEMORY: | |
1993 case CKR_SESSION_HANDLE_INVALID: | |
1994 case CKR_SESSION_READ_ONLY: | |
1995 case CKR_TEMPLATE_INCOMPLETE: | |
1996 case CKR_TEMPLATE_INCONSISTENT: | |
1997 case CKR_TOKEN_WRITE_PROTECTED: | |
1998 case CKR_USER_NOT_LOGGED_IN: | |
1999 break; | |
2000 default: | |
2001 case CKR_OK: | |
2002 error = CKR_GENERAL_ERROR; | |
2003 break; | |
2004 } | |
2005 | |
2006 return error; | |
2007 } | |
2008 | |
2009 /* | |
2010 * NSSCKFWC_CopyObject | |
2011 * | |
2012 */ | |
2013 NSS_IMPLEMENT CK_RV | |
2014 NSSCKFWC_CopyObject | |
2015 ( | |
2016 NSSCKFWInstance *fwInstance, | |
2017 CK_SESSION_HANDLE hSession, | |
2018 CK_OBJECT_HANDLE hObject, | |
2019 CK_ATTRIBUTE_PTR pTemplate, | |
2020 CK_ULONG ulCount, | |
2021 CK_OBJECT_HANDLE_PTR phNewObject | |
2022 ) | |
2023 { | |
2024 CK_RV error = CKR_OK; | |
2025 NSSCKFWSession *fwSession; | |
2026 NSSCKFWObject *fwObject; | |
2027 NSSCKFWObject *fwNewObject; | |
2028 | |
2029 if (!fwInstance) { | |
2030 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2031 goto loser; | |
2032 } | |
2033 | |
2034 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2035 if (!fwSession) { | |
2036 error = CKR_SESSION_HANDLE_INVALID; | |
2037 goto loser; | |
2038 } | |
2039 | |
2040 if( (CK_OBJECT_HANDLE_PTR)CK_NULL_PTR == phNewObject ) { | |
2041 error = CKR_ARGUMENTS_BAD; | |
2042 goto loser; | |
2043 } | |
2044 | |
2045 /* | |
2046 * A purify error here indicates caller error. | |
2047 */ | |
2048 *phNewObject = (CK_OBJECT_HANDLE)0; | |
2049 | |
2050 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hObject); | |
2051 if (!fwObject) { | |
2052 error = CKR_OBJECT_HANDLE_INVALID; | |
2053 goto loser; | |
2054 } | |
2055 | |
2056 fwNewObject = nssCKFWSession_CopyObject(fwSession, fwObject, | |
2057 pTemplate, ulCount, &error); | |
2058 if (!fwNewObject) { | |
2059 goto loser; | |
2060 } | |
2061 | |
2062 *phNewObject = nssCKFWInstance_CreateObjectHandle(fwInstance, | |
2063 fwNewObject, &error); | |
2064 if( (CK_OBJECT_HANDLE)0 == *phNewObject ) { | |
2065 nssCKFWObject_Destroy(fwNewObject); | |
2066 goto loser; | |
2067 } | |
2068 | |
2069 return CKR_OK; | |
2070 | |
2071 loser: | |
2072 switch( error ) { | |
2073 case CKR_SESSION_CLOSED: | |
2074 /* destroy session? */ | |
2075 break; | |
2076 case CKR_DEVICE_REMOVED: | |
2077 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
2078 break; | |
2079 case CKR_ATTRIBUTE_READ_ONLY: | |
2080 case CKR_ATTRIBUTE_TYPE_INVALID: | |
2081 case CKR_ATTRIBUTE_VALUE_INVALID: | |
2082 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2083 case CKR_DEVICE_ERROR: | |
2084 case CKR_DEVICE_MEMORY: | |
2085 case CKR_FUNCTION_FAILED: | |
2086 case CKR_GENERAL_ERROR: | |
2087 case CKR_HOST_MEMORY: | |
2088 case CKR_OBJECT_HANDLE_INVALID: | |
2089 case CKR_SESSION_HANDLE_INVALID: | |
2090 case CKR_SESSION_READ_ONLY: | |
2091 case CKR_TEMPLATE_INCONSISTENT: | |
2092 case CKR_TOKEN_WRITE_PROTECTED: | |
2093 case CKR_USER_NOT_LOGGED_IN: | |
2094 break; | |
2095 default: | |
2096 case CKR_OK: | |
2097 error = CKR_GENERAL_ERROR; | |
2098 break; | |
2099 } | |
2100 | |
2101 return error; | |
2102 } | |
2103 | |
2104 /* | |
2105 * NSSCKFWC_DestroyObject | |
2106 * | |
2107 */ | |
2108 NSS_IMPLEMENT CK_RV | |
2109 NSSCKFWC_DestroyObject | |
2110 ( | |
2111 NSSCKFWInstance *fwInstance, | |
2112 CK_SESSION_HANDLE hSession, | |
2113 CK_OBJECT_HANDLE hObject | |
2114 ) | |
2115 { | |
2116 CK_RV error = CKR_OK; | |
2117 NSSCKFWSession *fwSession; | |
2118 NSSCKFWObject *fwObject; | |
2119 | |
2120 if (!fwInstance) { | |
2121 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2122 goto loser; | |
2123 } | |
2124 | |
2125 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2126 if (!fwSession) { | |
2127 error = CKR_SESSION_HANDLE_INVALID; | |
2128 goto loser; | |
2129 } | |
2130 | |
2131 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hObject); | |
2132 if (!fwObject) { | |
2133 error = CKR_OBJECT_HANDLE_INVALID; | |
2134 goto loser; | |
2135 } | |
2136 | |
2137 nssCKFWInstance_DestroyObjectHandle(fwInstance, hObject); | |
2138 nssCKFWObject_Destroy(fwObject); | |
2139 | |
2140 return CKR_OK; | |
2141 | |
2142 loser: | |
2143 switch( error ) { | |
2144 case CKR_SESSION_CLOSED: | |
2145 /* destroy session? */ | |
2146 break; | |
2147 case CKR_DEVICE_REMOVED: | |
2148 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
2149 break; | |
2150 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2151 case CKR_DEVICE_ERROR: | |
2152 case CKR_DEVICE_MEMORY: | |
2153 case CKR_FUNCTION_FAILED: | |
2154 case CKR_GENERAL_ERROR: | |
2155 case CKR_HOST_MEMORY: | |
2156 case CKR_OBJECT_HANDLE_INVALID: | |
2157 case CKR_SESSION_HANDLE_INVALID: | |
2158 case CKR_SESSION_READ_ONLY: | |
2159 case CKR_TOKEN_WRITE_PROTECTED: | |
2160 break; | |
2161 default: | |
2162 case CKR_OK: | |
2163 error = CKR_GENERAL_ERROR; | |
2164 break; | |
2165 } | |
2166 | |
2167 return error; | |
2168 } | |
2169 | |
2170 /* | |
2171 * NSSCKFWC_GetObjectSize | |
2172 * | |
2173 */ | |
2174 NSS_IMPLEMENT CK_RV | |
2175 NSSCKFWC_GetObjectSize | |
2176 ( | |
2177 NSSCKFWInstance *fwInstance, | |
2178 CK_SESSION_HANDLE hSession, | |
2179 CK_OBJECT_HANDLE hObject, | |
2180 CK_ULONG_PTR pulSize | |
2181 ) | |
2182 { | |
2183 CK_RV error = CKR_OK; | |
2184 NSSCKFWSession *fwSession; | |
2185 NSSCKFWObject *fwObject; | |
2186 | |
2187 if (!fwInstance) { | |
2188 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2189 goto loser; | |
2190 } | |
2191 | |
2192 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2193 if (!fwSession) { | |
2194 error = CKR_SESSION_HANDLE_INVALID; | |
2195 goto loser; | |
2196 } | |
2197 | |
2198 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hObject); | |
2199 if (!fwObject) { | |
2200 error = CKR_OBJECT_HANDLE_INVALID; | |
2201 goto loser; | |
2202 } | |
2203 | |
2204 if( (CK_ULONG_PTR)CK_NULL_PTR == pulSize ) { | |
2205 error = CKR_ARGUMENTS_BAD; | |
2206 goto loser; | |
2207 } | |
2208 | |
2209 /* | |
2210 * A purify error here indicates caller error. | |
2211 */ | |
2212 *pulSize = (CK_ULONG)0; | |
2213 | |
2214 *pulSize = nssCKFWObject_GetObjectSize(fwObject, &error); | |
2215 if( ((CK_ULONG)0 == *pulSize) && (CKR_OK != error) ) { | |
2216 goto loser; | |
2217 } | |
2218 | |
2219 return CKR_OK; | |
2220 | |
2221 loser: | |
2222 switch( error ) { | |
2223 case CKR_SESSION_CLOSED: | |
2224 /* destroy session? */ | |
2225 break; | |
2226 case CKR_DEVICE_REMOVED: | |
2227 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
2228 break; | |
2229 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2230 case CKR_DEVICE_ERROR: | |
2231 case CKR_DEVICE_MEMORY: | |
2232 case CKR_FUNCTION_FAILED: | |
2233 case CKR_GENERAL_ERROR: | |
2234 case CKR_HOST_MEMORY: | |
2235 case CKR_INFORMATION_SENSITIVE: | |
2236 case CKR_OBJECT_HANDLE_INVALID: | |
2237 case CKR_SESSION_HANDLE_INVALID: | |
2238 break; | |
2239 default: | |
2240 case CKR_OK: | |
2241 error = CKR_GENERAL_ERROR; | |
2242 break; | |
2243 } | |
2244 | |
2245 return error; | |
2246 } | |
2247 | |
2248 /* | |
2249 * NSSCKFWC_GetAttributeValue | |
2250 * | |
2251 */ | |
2252 NSS_IMPLEMENT CK_RV | |
2253 NSSCKFWC_GetAttributeValue | |
2254 ( | |
2255 NSSCKFWInstance *fwInstance, | |
2256 CK_SESSION_HANDLE hSession, | |
2257 CK_OBJECT_HANDLE hObject, | |
2258 CK_ATTRIBUTE_PTR pTemplate, | |
2259 CK_ULONG ulCount | |
2260 ) | |
2261 { | |
2262 CK_RV error = CKR_OK; | |
2263 NSSCKFWSession *fwSession; | |
2264 NSSCKFWObject *fwObject; | |
2265 CK_BBOOL sensitive = CK_FALSE; | |
2266 CK_BBOOL invalid = CK_FALSE; | |
2267 CK_BBOOL tooSmall = CK_FALSE; | |
2268 CK_ULONG i; | |
2269 | |
2270 if (!fwInstance) { | |
2271 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2272 goto loser; | |
2273 } | |
2274 | |
2275 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2276 if (!fwSession) { | |
2277 error = CKR_SESSION_HANDLE_INVALID; | |
2278 goto loser; | |
2279 } | |
2280 | |
2281 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hObject); | |
2282 if (!fwObject) { | |
2283 error = CKR_OBJECT_HANDLE_INVALID; | |
2284 goto loser; | |
2285 } | |
2286 | |
2287 if( (CK_ATTRIBUTE_PTR)CK_NULL_PTR == pTemplate ) { | |
2288 error = CKR_ARGUMENTS_BAD; | |
2289 goto loser; | |
2290 } | |
2291 | |
2292 for( i = 0; i < ulCount; i++ ) { | |
2293 CK_ULONG size = nssCKFWObject_GetAttributeSize(fwObject, | |
2294 pTemplate[i].type, &error); | |
2295 if( (CK_ULONG)0 == size ) { | |
2296 switch( error ) { | |
2297 case CKR_ATTRIBUTE_SENSITIVE: | |
2298 case CKR_INFORMATION_SENSITIVE: | |
2299 sensitive = CK_TRUE; | |
2300 pTemplate[i].ulValueLen = (CK_ULONG)(-1); | |
2301 continue; | |
2302 case CKR_ATTRIBUTE_TYPE_INVALID: | |
2303 invalid = CK_TRUE; | |
2304 pTemplate[i].ulValueLen = (CK_ULONG)(-1); | |
2305 continue; | |
2306 case CKR_OK: | |
2307 break; | |
2308 default: | |
2309 goto loser; | |
2310 } | |
2311 } | |
2312 | |
2313 if( (CK_VOID_PTR)CK_NULL_PTR == pTemplate[i].pValue ) { | |
2314 pTemplate[i].ulValueLen = size; | |
2315 } else { | |
2316 NSSItem it, *p; | |
2317 | |
2318 if( pTemplate[i].ulValueLen < size ) { | |
2319 tooSmall = CK_TRUE; | |
2320 continue; | |
2321 } | |
2322 | |
2323 it.size = (PRUint32)pTemplate[i].ulValueLen; | |
2324 it.data = (void *)pTemplate[i].pValue; | |
2325 p = nssCKFWObject_GetAttribute(fwObject, pTemplate[i].type, &it, | |
2326 (NSSArena *)NULL, &error); | |
2327 if (!p) { | |
2328 switch( error ) { | |
2329 case CKR_ATTRIBUTE_SENSITIVE: | |
2330 case CKR_INFORMATION_SENSITIVE: | |
2331 sensitive = CK_TRUE; | |
2332 pTemplate[i].ulValueLen = (CK_ULONG)(-1); | |
2333 continue; | |
2334 case CKR_ATTRIBUTE_TYPE_INVALID: | |
2335 invalid = CK_TRUE; | |
2336 pTemplate[i].ulValueLen = (CK_ULONG)(-1); | |
2337 continue; | |
2338 default: | |
2339 goto loser; | |
2340 } | |
2341 } | |
2342 | |
2343 pTemplate[i].ulValueLen = size; | |
2344 } | |
2345 } | |
2346 | |
2347 if( sensitive ) { | |
2348 error = CKR_ATTRIBUTE_SENSITIVE; | |
2349 goto loser; | |
2350 } else if( invalid ) { | |
2351 error = CKR_ATTRIBUTE_TYPE_INVALID; | |
2352 goto loser; | |
2353 } else if( tooSmall ) { | |
2354 error = CKR_BUFFER_TOO_SMALL; | |
2355 goto loser; | |
2356 } | |
2357 | |
2358 return CKR_OK; | |
2359 | |
2360 loser: | |
2361 switch( error ) { | |
2362 case CKR_SESSION_CLOSED: | |
2363 /* destroy session? */ | |
2364 break; | |
2365 case CKR_DEVICE_REMOVED: | |
2366 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
2367 break; | |
2368 case CKR_ATTRIBUTE_SENSITIVE: | |
2369 case CKR_ATTRIBUTE_TYPE_INVALID: | |
2370 case CKR_BUFFER_TOO_SMALL: | |
2371 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2372 case CKR_DEVICE_ERROR: | |
2373 case CKR_DEVICE_MEMORY: | |
2374 case CKR_FUNCTION_FAILED: | |
2375 case CKR_GENERAL_ERROR: | |
2376 case CKR_HOST_MEMORY: | |
2377 case CKR_OBJECT_HANDLE_INVALID: | |
2378 case CKR_SESSION_HANDLE_INVALID: | |
2379 break; | |
2380 default: | |
2381 case CKR_OK: | |
2382 error = CKR_GENERAL_ERROR; | |
2383 break; | |
2384 } | |
2385 | |
2386 return error; | |
2387 } | |
2388 | |
2389 /* | |
2390 * NSSCKFWC_SetAttributeValue | |
2391 * | |
2392 */ | |
2393 NSS_IMPLEMENT CK_RV | |
2394 NSSCKFWC_SetAttributeValue | |
2395 ( | |
2396 NSSCKFWInstance *fwInstance, | |
2397 CK_SESSION_HANDLE hSession, | |
2398 CK_OBJECT_HANDLE hObject, | |
2399 CK_ATTRIBUTE_PTR pTemplate, | |
2400 CK_ULONG ulCount | |
2401 ) | |
2402 { | |
2403 CK_RV error = CKR_OK; | |
2404 NSSCKFWSession *fwSession; | |
2405 NSSCKFWObject *fwObject; | |
2406 CK_ULONG i; | |
2407 | |
2408 if (!fwInstance) { | |
2409 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2410 goto loser; | |
2411 } | |
2412 | |
2413 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2414 if (!fwSession) { | |
2415 error = CKR_SESSION_HANDLE_INVALID; | |
2416 goto loser; | |
2417 } | |
2418 | |
2419 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hObject); | |
2420 if (!fwObject) { | |
2421 error = CKR_OBJECT_HANDLE_INVALID; | |
2422 goto loser; | |
2423 } | |
2424 | |
2425 if( (CK_ATTRIBUTE_PTR)CK_NULL_PTR == pTemplate ) { | |
2426 error = CKR_ARGUMENTS_BAD; | |
2427 goto loser; | |
2428 } | |
2429 | |
2430 for (i=0; i < ulCount; i++) { | |
2431 NSSItem value; | |
2432 | |
2433 value.data = pTemplate[i].pValue; | |
2434 value.size = pTemplate[i].ulValueLen; | |
2435 | |
2436 error = nssCKFWObject_SetAttribute(fwObject, fwSession, | |
2437 pTemplate[i].type, &value); | |
2438 | |
2439 if( CKR_OK != error ) { | |
2440 goto loser; | |
2441 } | |
2442 } | |
2443 | |
2444 return CKR_OK; | |
2445 | |
2446 loser: | |
2447 switch( error ) { | |
2448 case CKR_SESSION_CLOSED: | |
2449 /* destroy session? */ | |
2450 break; | |
2451 case CKR_DEVICE_REMOVED: | |
2452 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
2453 break; | |
2454 case CKR_ATTRIBUTE_READ_ONLY: | |
2455 case CKR_ATTRIBUTE_TYPE_INVALID: | |
2456 case CKR_ATTRIBUTE_VALUE_INVALID: | |
2457 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2458 case CKR_DEVICE_ERROR: | |
2459 case CKR_DEVICE_MEMORY: | |
2460 case CKR_FUNCTION_FAILED: | |
2461 case CKR_GENERAL_ERROR: | |
2462 case CKR_HOST_MEMORY: | |
2463 case CKR_OBJECT_HANDLE_INVALID: | |
2464 case CKR_SESSION_HANDLE_INVALID: | |
2465 case CKR_SESSION_READ_ONLY: | |
2466 case CKR_TEMPLATE_INCONSISTENT: | |
2467 case CKR_TOKEN_WRITE_PROTECTED: | |
2468 break; | |
2469 default: | |
2470 case CKR_OK: | |
2471 error = CKR_GENERAL_ERROR; | |
2472 break; | |
2473 } | |
2474 | |
2475 return error; | |
2476 } | |
2477 | |
2478 /* | |
2479 * NSSCKFWC_FindObjectsInit | |
2480 * | |
2481 */ | |
2482 NSS_IMPLEMENT CK_RV | |
2483 NSSCKFWC_FindObjectsInit | |
2484 ( | |
2485 NSSCKFWInstance *fwInstance, | |
2486 CK_SESSION_HANDLE hSession, | |
2487 CK_ATTRIBUTE_PTR pTemplate, | |
2488 CK_ULONG ulCount | |
2489 ) | |
2490 { | |
2491 CK_RV error = CKR_OK; | |
2492 NSSCKFWSession *fwSession; | |
2493 NSSCKFWFindObjects *fwFindObjects; | |
2494 | |
2495 if (!fwInstance) { | |
2496 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2497 goto loser; | |
2498 } | |
2499 | |
2500 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2501 if (!fwSession) { | |
2502 error = CKR_SESSION_HANDLE_INVALID; | |
2503 goto loser; | |
2504 } | |
2505 | |
2506 if( ((CK_ATTRIBUTE_PTR)CK_NULL_PTR == pTemplate) && (ulCount != 0) ) { | |
2507 error = CKR_ARGUMENTS_BAD; | |
2508 goto loser; | |
2509 } | |
2510 | |
2511 fwFindObjects = nssCKFWSession_GetFWFindObjects(fwSession, &error); | |
2512 if (fwFindObjects) { | |
2513 error = CKR_OPERATION_ACTIVE; | |
2514 goto loser; | |
2515 } | |
2516 | |
2517 if( CKR_OPERATION_NOT_INITIALIZED != error ) { | |
2518 goto loser; | |
2519 } | |
2520 | |
2521 fwFindObjects = nssCKFWSession_FindObjectsInit(fwSession, | |
2522 pTemplate, ulCount, &error); | |
2523 if (!fwFindObjects) { | |
2524 goto loser; | |
2525 } | |
2526 | |
2527 error = nssCKFWSession_SetFWFindObjects(fwSession, fwFindObjects); | |
2528 | |
2529 if( CKR_OK != error ) { | |
2530 nssCKFWFindObjects_Destroy(fwFindObjects); | |
2531 goto loser; | |
2532 } | |
2533 | |
2534 return CKR_OK; | |
2535 | |
2536 loser: | |
2537 switch( error ) { | |
2538 case CKR_SESSION_CLOSED: | |
2539 /* destroy session? */ | |
2540 break; | |
2541 case CKR_DEVICE_REMOVED: | |
2542 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
2543 break; | |
2544 case CKR_ATTRIBUTE_TYPE_INVALID: | |
2545 case CKR_ATTRIBUTE_VALUE_INVALID: | |
2546 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2547 case CKR_DEVICE_ERROR: | |
2548 case CKR_DEVICE_MEMORY: | |
2549 case CKR_FUNCTION_FAILED: | |
2550 case CKR_GENERAL_ERROR: | |
2551 case CKR_HOST_MEMORY: | |
2552 case CKR_OPERATION_ACTIVE: | |
2553 case CKR_SESSION_HANDLE_INVALID: | |
2554 break; | |
2555 default: | |
2556 case CKR_OK: | |
2557 error = CKR_GENERAL_ERROR; | |
2558 break; | |
2559 } | |
2560 | |
2561 return error; | |
2562 } | |
2563 | |
2564 /* | |
2565 * NSSCKFWC_FindObjects | |
2566 * | |
2567 */ | |
2568 NSS_IMPLEMENT CK_RV | |
2569 NSSCKFWC_FindObjects | |
2570 ( | |
2571 NSSCKFWInstance *fwInstance, | |
2572 CK_SESSION_HANDLE hSession, | |
2573 CK_OBJECT_HANDLE_PTR phObject, | |
2574 CK_ULONG ulMaxObjectCount, | |
2575 CK_ULONG_PTR pulObjectCount | |
2576 ) | |
2577 { | |
2578 CK_RV error = CKR_OK; | |
2579 NSSCKFWSession *fwSession; | |
2580 NSSCKFWFindObjects *fwFindObjects; | |
2581 CK_ULONG i; | |
2582 | |
2583 if (!fwInstance) { | |
2584 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2585 goto loser; | |
2586 } | |
2587 | |
2588 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2589 if (!fwSession) { | |
2590 error = CKR_SESSION_HANDLE_INVALID; | |
2591 goto loser; | |
2592 } | |
2593 | |
2594 if( (CK_OBJECT_HANDLE_PTR)CK_NULL_PTR == phObject ) { | |
2595 error = CKR_ARGUMENTS_BAD; | |
2596 goto loser; | |
2597 } | |
2598 | |
2599 /* | |
2600 * A purify error here indicates caller error. | |
2601 */ | |
2602 (void)nsslibc_memset(phObject, 0, sizeof(CK_OBJECT_HANDLE) * ulMaxObjectCount)
; | |
2603 *pulObjectCount = (CK_ULONG)0; | |
2604 | |
2605 fwFindObjects = nssCKFWSession_GetFWFindObjects(fwSession, &error); | |
2606 if (!fwFindObjects) { | |
2607 goto loser; | |
2608 } | |
2609 | |
2610 for( i = 0; i < ulMaxObjectCount; i++ ) { | |
2611 NSSCKFWObject *fwObject = nssCKFWFindObjects_Next(fwFindObjects, | |
2612 NULL, &error); | |
2613 if (!fwObject) { | |
2614 break; | |
2615 } | |
2616 | |
2617 phObject[i] = nssCKFWInstance_FindObjectHandle(fwInstance, fwObject); | |
2618 if( (CK_OBJECT_HANDLE)0 == phObject[i] ) { | |
2619 phObject[i] = nssCKFWInstance_CreateObjectHandle(fwInstance, fwObject, &er
ror); | |
2620 } | |
2621 if( (CK_OBJECT_HANDLE)0 == phObject[i] ) { | |
2622 /* This isn't right either, is it? */ | |
2623 nssCKFWObject_Destroy(fwObject); | |
2624 goto loser; | |
2625 } | |
2626 } | |
2627 | |
2628 *pulObjectCount = i; | |
2629 | |
2630 return CKR_OK; | |
2631 | |
2632 loser: | |
2633 switch( error ) { | |
2634 case CKR_SESSION_CLOSED: | |
2635 /* destroy session? */ | |
2636 break; | |
2637 case CKR_DEVICE_REMOVED: | |
2638 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
2639 break; | |
2640 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2641 case CKR_DEVICE_ERROR: | |
2642 case CKR_DEVICE_MEMORY: | |
2643 case CKR_FUNCTION_FAILED: | |
2644 case CKR_GENERAL_ERROR: | |
2645 case CKR_HOST_MEMORY: | |
2646 case CKR_OPERATION_NOT_INITIALIZED: | |
2647 case CKR_SESSION_HANDLE_INVALID: | |
2648 break; | |
2649 default: | |
2650 case CKR_OK: | |
2651 error = CKR_GENERAL_ERROR; | |
2652 break; | |
2653 } | |
2654 | |
2655 return error; | |
2656 } | |
2657 | |
2658 /* | |
2659 * NSSCKFWC_FindObjectsFinal | |
2660 * | |
2661 */ | |
2662 NSS_IMPLEMENT CK_RV | |
2663 NSSCKFWC_FindObjectsFinal | |
2664 ( | |
2665 NSSCKFWInstance *fwInstance, | |
2666 CK_SESSION_HANDLE hSession | |
2667 ) | |
2668 { | |
2669 CK_RV error = CKR_OK; | |
2670 NSSCKFWSession *fwSession; | |
2671 NSSCKFWFindObjects *fwFindObjects; | |
2672 | |
2673 if (!fwInstance) { | |
2674 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2675 goto loser; | |
2676 } | |
2677 | |
2678 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2679 if (!fwSession) { | |
2680 error = CKR_SESSION_HANDLE_INVALID; | |
2681 goto loser; | |
2682 } | |
2683 | |
2684 fwFindObjects = nssCKFWSession_GetFWFindObjects(fwSession, &error); | |
2685 if (!fwFindObjects) { | |
2686 error = CKR_OPERATION_NOT_INITIALIZED; | |
2687 goto loser; | |
2688 } | |
2689 | |
2690 nssCKFWFindObjects_Destroy(fwFindObjects); | |
2691 error = nssCKFWSession_SetFWFindObjects(fwSession, | |
2692 (NSSCKFWFindObjects *)NULL); | |
2693 | |
2694 if( CKR_OK != error ) { | |
2695 goto loser; | |
2696 } | |
2697 | |
2698 return CKR_OK; | |
2699 | |
2700 loser: | |
2701 switch( error ) { | |
2702 case CKR_SESSION_CLOSED: | |
2703 /* destroy session? */ | |
2704 break; | |
2705 case CKR_DEVICE_REMOVED: | |
2706 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
2707 break; | |
2708 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2709 case CKR_DEVICE_ERROR: | |
2710 case CKR_DEVICE_MEMORY: | |
2711 case CKR_FUNCTION_FAILED: | |
2712 case CKR_GENERAL_ERROR: | |
2713 case CKR_HOST_MEMORY: | |
2714 case CKR_OPERATION_NOT_INITIALIZED: | |
2715 case CKR_SESSION_HANDLE_INVALID: | |
2716 break; | |
2717 default: | |
2718 case CKR_OK: | |
2719 error = CKR_GENERAL_ERROR; | |
2720 break; | |
2721 } | |
2722 | |
2723 return error; | |
2724 } | |
2725 | |
2726 /* | |
2727 * NSSCKFWC_EncryptInit | |
2728 * | |
2729 */ | |
2730 NSS_IMPLEMENT CK_RV | |
2731 NSSCKFWC_EncryptInit | |
2732 ( | |
2733 NSSCKFWInstance *fwInstance, | |
2734 CK_SESSION_HANDLE hSession, | |
2735 CK_MECHANISM_PTR pMechanism, | |
2736 CK_OBJECT_HANDLE hKey | |
2737 ) | |
2738 { | |
2739 CK_RV error = CKR_OK; | |
2740 NSSCKFWSession *fwSession; | |
2741 NSSCKFWObject *fwObject; | |
2742 NSSCKFWSlot *fwSlot; | |
2743 NSSCKFWToken *fwToken; | |
2744 NSSCKFWMechanism *fwMechanism; | |
2745 | |
2746 if (!fwInstance) { | |
2747 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2748 goto loser; | |
2749 } | |
2750 | |
2751 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2752 if (!fwSession) { | |
2753 error = CKR_SESSION_HANDLE_INVALID; | |
2754 goto loser; | |
2755 } | |
2756 | |
2757 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hKey); | |
2758 if (!fwObject) { | |
2759 error = CKR_KEY_HANDLE_INVALID; | |
2760 goto loser; | |
2761 } | |
2762 | |
2763 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
2764 if (!fwSlot) { | |
2765 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
2766 goto loser; | |
2767 } | |
2768 | |
2769 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
2770 error = CKR_TOKEN_NOT_PRESENT; | |
2771 goto loser; | |
2772 } | |
2773 | |
2774 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
2775 if (!fwToken) { | |
2776 goto loser; | |
2777 } | |
2778 | |
2779 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
2780 if (!fwMechanism) { | |
2781 goto loser; | |
2782 } | |
2783 | |
2784 error = nssCKFWMechanism_EncryptInit(fwMechanism, pMechanism, | |
2785 fwSession, fwObject); | |
2786 | |
2787 nssCKFWMechanism_Destroy(fwMechanism); | |
2788 | |
2789 if (CKR_OK == error) { | |
2790 return CKR_OK; | |
2791 } | |
2792 | |
2793 loser: | |
2794 /* verify error */ | |
2795 switch( error ) { | |
2796 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2797 case CKR_DEVICE_ERROR: | |
2798 case CKR_DEVICE_MEMORY: | |
2799 case CKR_DEVICE_REMOVED: | |
2800 case CKR_FUNCTION_CANCELED: | |
2801 case CKR_FUNCTION_FAILED: | |
2802 case CKR_GENERAL_ERROR: | |
2803 case CKR_HOST_MEMORY: | |
2804 case CKR_KEY_FUNCTION_NOT_PERMITTED: | |
2805 case CKR_KEY_HANDLE_INVALID: | |
2806 case CKR_KEY_SIZE_RANGE: | |
2807 case CKR_KEY_TYPE_INCONSISTENT: | |
2808 case CKR_MECHANISM_INVALID: | |
2809 case CKR_MECHANISM_PARAM_INVALID: | |
2810 case CKR_OPERATION_ACTIVE: | |
2811 case CKR_PIN_EXPIRED: | |
2812 case CKR_SESSION_CLOSED: | |
2813 case CKR_SESSION_HANDLE_INVALID: | |
2814 case CKR_USER_NOT_LOGGED_IN: | |
2815 break; | |
2816 default: | |
2817 case CKR_OK: | |
2818 error = CKR_GENERAL_ERROR; | |
2819 break; | |
2820 } | |
2821 return error; | |
2822 } | |
2823 | |
2824 /* | |
2825 * NSSCKFWC_Encrypt | |
2826 * | |
2827 */ | |
2828 NSS_IMPLEMENT CK_RV | |
2829 NSSCKFWC_Encrypt | |
2830 ( | |
2831 NSSCKFWInstance *fwInstance, | |
2832 CK_SESSION_HANDLE hSession, | |
2833 CK_BYTE_PTR pData, | |
2834 CK_ULONG ulDataLen, | |
2835 CK_BYTE_PTR pEncryptedData, | |
2836 CK_ULONG_PTR pulEncryptedDataLen | |
2837 ) | |
2838 { | |
2839 CK_RV error = CKR_OK; | |
2840 NSSCKFWSession *fwSession; | |
2841 | |
2842 if (!fwInstance) { | |
2843 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2844 goto loser; | |
2845 } | |
2846 | |
2847 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2848 if (!fwSession) { | |
2849 error = CKR_SESSION_HANDLE_INVALID; | |
2850 goto loser; | |
2851 } | |
2852 | |
2853 error = nssCKFWSession_UpdateFinal(fwSession, | |
2854 NSSCKFWCryptoOperationType_Encrypt, | |
2855 NSSCKFWCryptoOperationState_EncryptDecrypt, | |
2856 pData, ulDataLen, pEncryptedData, pulEncryptedDataLen); | |
2857 | |
2858 if (CKR_OK == error) { | |
2859 return CKR_OK; | |
2860 } | |
2861 | |
2862 loser: | |
2863 /* verify error */ | |
2864 switch( error ) { | |
2865 case CKR_ARGUMENTS_BAD: | |
2866 case CKR_BUFFER_TOO_SMALL: | |
2867 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2868 case CKR_DATA_INVALID: | |
2869 case CKR_DATA_LEN_RANGE: | |
2870 case CKR_DEVICE_ERROR: | |
2871 case CKR_DEVICE_MEMORY: | |
2872 case CKR_DEVICE_REMOVED: | |
2873 case CKR_FUNCTION_CANCELED: | |
2874 case CKR_FUNCTION_FAILED: | |
2875 case CKR_GENERAL_ERROR: | |
2876 case CKR_HOST_MEMORY: | |
2877 case CKR_OPERATION_NOT_INITIALIZED: | |
2878 case CKR_SESSION_HANDLE_INVALID: | |
2879 case CKR_SESSION_CLOSED: | |
2880 break; | |
2881 default: | |
2882 case CKR_OK: | |
2883 error = CKR_GENERAL_ERROR; | |
2884 break; | |
2885 } | |
2886 return error; | |
2887 } | |
2888 | |
2889 /* | |
2890 * NSSCKFWC_EncryptUpdate | |
2891 * | |
2892 */ | |
2893 NSS_IMPLEMENT CK_RV | |
2894 NSSCKFWC_EncryptUpdate | |
2895 ( | |
2896 NSSCKFWInstance *fwInstance, | |
2897 CK_SESSION_HANDLE hSession, | |
2898 CK_BYTE_PTR pPart, | |
2899 CK_ULONG ulPartLen, | |
2900 CK_BYTE_PTR pEncryptedPart, | |
2901 CK_ULONG_PTR pulEncryptedPartLen | |
2902 ) | |
2903 { | |
2904 CK_RV error = CKR_OK; | |
2905 NSSCKFWSession *fwSession; | |
2906 | |
2907 if (!fwInstance) { | |
2908 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2909 goto loser; | |
2910 } | |
2911 | |
2912 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2913 if (!fwSession) { | |
2914 error = CKR_SESSION_HANDLE_INVALID; | |
2915 goto loser; | |
2916 } | |
2917 | |
2918 error = nssCKFWSession_Update(fwSession, | |
2919 NSSCKFWCryptoOperationType_Encrypt, | |
2920 NSSCKFWCryptoOperationState_EncryptDecrypt, | |
2921 pPart, ulPartLen, pEncryptedPart, pulEncryptedPartLen); | |
2922 | |
2923 if (CKR_OK == error) { | |
2924 return CKR_OK; | |
2925 } | |
2926 | |
2927 loser: | |
2928 /* verify error */ | |
2929 switch( error ) { | |
2930 case CKR_ARGUMENTS_BAD: | |
2931 case CKR_BUFFER_TOO_SMALL: | |
2932 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2933 case CKR_DATA_LEN_RANGE: | |
2934 case CKR_DEVICE_ERROR: | |
2935 case CKR_DEVICE_MEMORY: | |
2936 case CKR_DEVICE_REMOVED: | |
2937 case CKR_FUNCTION_CANCELED: | |
2938 case CKR_FUNCTION_FAILED: | |
2939 case CKR_GENERAL_ERROR: | |
2940 case CKR_HOST_MEMORY: | |
2941 case CKR_OPERATION_NOT_INITIALIZED: | |
2942 case CKR_SESSION_CLOSED: | |
2943 case CKR_SESSION_HANDLE_INVALID: | |
2944 break; | |
2945 default: | |
2946 case CKR_OK: | |
2947 error = CKR_GENERAL_ERROR; | |
2948 break; | |
2949 } | |
2950 return error; | |
2951 } | |
2952 | |
2953 /* | |
2954 * NSSCKFWC_EncryptFinal | |
2955 * | |
2956 */ | |
2957 NSS_IMPLEMENT CK_RV | |
2958 NSSCKFWC_EncryptFinal | |
2959 ( | |
2960 NSSCKFWInstance *fwInstance, | |
2961 CK_SESSION_HANDLE hSession, | |
2962 CK_BYTE_PTR pLastEncryptedPart, | |
2963 CK_ULONG_PTR pulLastEncryptedPartLen | |
2964 ) | |
2965 { | |
2966 CK_RV error = CKR_OK; | |
2967 NSSCKFWSession *fwSession; | |
2968 | |
2969 if (!fwInstance) { | |
2970 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
2971 goto loser; | |
2972 } | |
2973 | |
2974 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
2975 if (!fwSession) { | |
2976 error = CKR_SESSION_HANDLE_INVALID; | |
2977 goto loser; | |
2978 } | |
2979 | |
2980 error = nssCKFWSession_Final(fwSession, | |
2981 NSSCKFWCryptoOperationType_Encrypt, | |
2982 NSSCKFWCryptoOperationState_EncryptDecrypt, | |
2983 pLastEncryptedPart, pulLastEncryptedPartLen); | |
2984 | |
2985 if (CKR_OK == error) { | |
2986 return CKR_OK; | |
2987 } | |
2988 | |
2989 loser: | |
2990 /* verify error */ | |
2991 switch( error ) { | |
2992 case CKR_ARGUMENTS_BAD: | |
2993 case CKR_BUFFER_TOO_SMALL: | |
2994 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
2995 case CKR_DATA_LEN_RANGE: | |
2996 case CKR_DEVICE_ERROR: | |
2997 case CKR_DEVICE_MEMORY: | |
2998 case CKR_DEVICE_REMOVED: | |
2999 case CKR_FUNCTION_CANCELED: | |
3000 case CKR_FUNCTION_FAILED: | |
3001 case CKR_GENERAL_ERROR: | |
3002 case CKR_HOST_MEMORY: | |
3003 case CKR_OPERATION_NOT_INITIALIZED: | |
3004 case CKR_SESSION_CLOSED: | |
3005 case CKR_SESSION_HANDLE_INVALID: | |
3006 break; | |
3007 default: | |
3008 case CKR_OK: | |
3009 error = CKR_GENERAL_ERROR; | |
3010 break; | |
3011 } | |
3012 return error; | |
3013 } | |
3014 | |
3015 /* | |
3016 * NSSCKFWC_DecryptInit | |
3017 * | |
3018 */ | |
3019 NSS_IMPLEMENT CK_RV | |
3020 NSSCKFWC_DecryptInit | |
3021 ( | |
3022 NSSCKFWInstance *fwInstance, | |
3023 CK_SESSION_HANDLE hSession, | |
3024 CK_MECHANISM_PTR pMechanism, | |
3025 CK_OBJECT_HANDLE hKey | |
3026 ) | |
3027 { | |
3028 CK_RV error = CKR_OK; | |
3029 NSSCKFWSession *fwSession; | |
3030 NSSCKFWObject *fwObject; | |
3031 NSSCKFWSlot *fwSlot; | |
3032 NSSCKFWToken *fwToken; | |
3033 NSSCKFWMechanism *fwMechanism; | |
3034 | |
3035 if (!fwInstance) { | |
3036 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3037 goto loser; | |
3038 } | |
3039 | |
3040 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3041 if (!fwSession) { | |
3042 error = CKR_SESSION_HANDLE_INVALID; | |
3043 goto loser; | |
3044 } | |
3045 | |
3046 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hKey); | |
3047 if (!fwObject) { | |
3048 error = CKR_KEY_HANDLE_INVALID; | |
3049 goto loser; | |
3050 } | |
3051 | |
3052 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
3053 if (!fwSlot) { | |
3054 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
3055 goto loser; | |
3056 } | |
3057 | |
3058 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
3059 error = CKR_TOKEN_NOT_PRESENT; | |
3060 goto loser; | |
3061 } | |
3062 | |
3063 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
3064 if (!fwToken) { | |
3065 goto loser; | |
3066 } | |
3067 | |
3068 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
3069 if (!fwMechanism) { | |
3070 goto loser; | |
3071 } | |
3072 | |
3073 error = nssCKFWMechanism_DecryptInit(fwMechanism, pMechanism, | |
3074 fwSession, fwObject); | |
3075 nssCKFWMechanism_Destroy(fwMechanism); | |
3076 | |
3077 if (CKR_OK == error) { | |
3078 return CKR_OK; | |
3079 } | |
3080 | |
3081 loser: | |
3082 /* verify error */ | |
3083 switch( error ) { | |
3084 case CKR_ARGUMENTS_BAD: | |
3085 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3086 case CKR_DEVICE_ERROR: | |
3087 case CKR_DEVICE_MEMORY: | |
3088 case CKR_DEVICE_REMOVED: | |
3089 case CKR_FUNCTION_CANCELED: | |
3090 case CKR_FUNCTION_FAILED: | |
3091 case CKR_GENERAL_ERROR: | |
3092 case CKR_HOST_MEMORY: | |
3093 case CKR_KEY_FUNCTION_NOT_PERMITTED: | |
3094 case CKR_KEY_HANDLE_INVALID: | |
3095 case CKR_KEY_SIZE_RANGE: | |
3096 case CKR_KEY_TYPE_INCONSISTENT: | |
3097 case CKR_MECHANISM_INVALID: | |
3098 case CKR_MECHANISM_PARAM_INVALID: | |
3099 case CKR_OPERATION_ACTIVE: | |
3100 case CKR_PIN_EXPIRED: | |
3101 case CKR_SESSION_CLOSED: | |
3102 case CKR_SESSION_HANDLE_INVALID: | |
3103 case CKR_USER_NOT_LOGGED_IN: | |
3104 break; | |
3105 default: | |
3106 case CKR_OK: | |
3107 error = CKR_GENERAL_ERROR; | |
3108 break; | |
3109 } | |
3110 return error; | |
3111 } | |
3112 | |
3113 /* | |
3114 * NSSCKFWC_Decrypt | |
3115 * | |
3116 */ | |
3117 NSS_IMPLEMENT CK_RV | |
3118 NSSCKFWC_Decrypt | |
3119 ( | |
3120 NSSCKFWInstance *fwInstance, | |
3121 CK_SESSION_HANDLE hSession, | |
3122 CK_BYTE_PTR pEncryptedData, | |
3123 CK_ULONG ulEncryptedDataLen, | |
3124 CK_BYTE_PTR pData, | |
3125 CK_ULONG_PTR pulDataLen | |
3126 ) | |
3127 { | |
3128 CK_RV error = CKR_OK; | |
3129 NSSCKFWSession *fwSession; | |
3130 | |
3131 if (!fwInstance) { | |
3132 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3133 goto loser; | |
3134 } | |
3135 | |
3136 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3137 if (!fwSession) { | |
3138 error = CKR_SESSION_HANDLE_INVALID; | |
3139 goto loser; | |
3140 } | |
3141 | |
3142 error = nssCKFWSession_UpdateFinal(fwSession, | |
3143 NSSCKFWCryptoOperationType_Decrypt, | |
3144 NSSCKFWCryptoOperationState_EncryptDecrypt, | |
3145 pEncryptedData, ulEncryptedDataLen, pData, pulDataLen); | |
3146 | |
3147 if (CKR_OK == error) { | |
3148 return CKR_OK; | |
3149 } | |
3150 | |
3151 loser: | |
3152 /* verify error */ | |
3153 switch( error ) { | |
3154 case CKR_ARGUMENTS_BAD: | |
3155 case CKR_BUFFER_TOO_SMALL: | |
3156 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3157 case CKR_DEVICE_ERROR: | |
3158 case CKR_DEVICE_MEMORY: | |
3159 case CKR_DEVICE_REMOVED: | |
3160 case CKR_ENCRYPTED_DATA_INVALID: | |
3161 case CKR_ENCRYPTED_DATA_LEN_RANGE: | |
3162 case CKR_FUNCTION_CANCELED: | |
3163 case CKR_FUNCTION_FAILED: | |
3164 case CKR_GENERAL_ERROR: | |
3165 case CKR_HOST_MEMORY: | |
3166 case CKR_OPERATION_NOT_INITIALIZED: | |
3167 case CKR_SESSION_CLOSED: | |
3168 case CKR_SESSION_HANDLE_INVALID: | |
3169 case CKR_USER_NOT_LOGGED_IN: | |
3170 break; | |
3171 case CKR_DATA_LEN_RANGE: | |
3172 error = CKR_ENCRYPTED_DATA_LEN_RANGE; | |
3173 break; | |
3174 case CKR_DATA_INVALID: | |
3175 error = CKR_ENCRYPTED_DATA_INVALID; | |
3176 break; | |
3177 default: | |
3178 case CKR_OK: | |
3179 error = CKR_GENERAL_ERROR; | |
3180 break; | |
3181 } | |
3182 return error; | |
3183 } | |
3184 | |
3185 /* | |
3186 * NSSCKFWC_DecryptUpdate | |
3187 * | |
3188 */ | |
3189 NSS_IMPLEMENT CK_RV | |
3190 NSSCKFWC_DecryptUpdate | |
3191 ( | |
3192 NSSCKFWInstance *fwInstance, | |
3193 CK_SESSION_HANDLE hSession, | |
3194 CK_BYTE_PTR pEncryptedPart, | |
3195 CK_ULONG ulEncryptedPartLen, | |
3196 CK_BYTE_PTR pPart, | |
3197 CK_ULONG_PTR pulPartLen | |
3198 ) | |
3199 { | |
3200 CK_RV error = CKR_OK; | |
3201 NSSCKFWSession *fwSession; | |
3202 | |
3203 if (!fwInstance) { | |
3204 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3205 goto loser; | |
3206 } | |
3207 | |
3208 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3209 if (!fwSession) { | |
3210 error = CKR_SESSION_HANDLE_INVALID; | |
3211 goto loser; | |
3212 } | |
3213 | |
3214 error = nssCKFWSession_Update(fwSession, | |
3215 NSSCKFWCryptoOperationType_Decrypt, | |
3216 NSSCKFWCryptoOperationState_EncryptDecrypt, | |
3217 pEncryptedPart, ulEncryptedPartLen, pPart, pulPartLen); | |
3218 | |
3219 if (CKR_OK == error) { | |
3220 return CKR_OK; | |
3221 } | |
3222 | |
3223 loser: | |
3224 /* verify error */ | |
3225 switch( error ) { | |
3226 case CKR_ARGUMENTS_BAD: | |
3227 case CKR_BUFFER_TOO_SMALL: | |
3228 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3229 case CKR_DEVICE_ERROR: | |
3230 case CKR_DEVICE_MEMORY: | |
3231 case CKR_DEVICE_REMOVED: | |
3232 case CKR_ENCRYPTED_DATA_INVALID: | |
3233 case CKR_ENCRYPTED_DATA_LEN_RANGE: | |
3234 case CKR_FUNCTION_CANCELED: | |
3235 case CKR_FUNCTION_FAILED: | |
3236 case CKR_GENERAL_ERROR: | |
3237 case CKR_HOST_MEMORY: | |
3238 case CKR_OPERATION_NOT_INITIALIZED: | |
3239 case CKR_SESSION_CLOSED: | |
3240 case CKR_SESSION_HANDLE_INVALID: | |
3241 case CKR_USER_NOT_LOGGED_IN: | |
3242 break; | |
3243 case CKR_DATA_LEN_RANGE: | |
3244 error = CKR_ENCRYPTED_DATA_LEN_RANGE; | |
3245 break; | |
3246 case CKR_DATA_INVALID: | |
3247 error = CKR_ENCRYPTED_DATA_INVALID; | |
3248 break; | |
3249 default: | |
3250 case CKR_OK: | |
3251 error = CKR_GENERAL_ERROR; | |
3252 break; | |
3253 } | |
3254 return error; | |
3255 } | |
3256 | |
3257 /* | |
3258 * NSSCKFWC_DecryptFinal | |
3259 * | |
3260 */ | |
3261 NSS_IMPLEMENT CK_RV | |
3262 NSSCKFWC_DecryptFinal | |
3263 ( | |
3264 NSSCKFWInstance *fwInstance, | |
3265 CK_SESSION_HANDLE hSession, | |
3266 CK_BYTE_PTR pLastPart, | |
3267 CK_ULONG_PTR pulLastPartLen | |
3268 ) | |
3269 { | |
3270 CK_RV error = CKR_OK; | |
3271 NSSCKFWSession *fwSession; | |
3272 | |
3273 if (!fwInstance) { | |
3274 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3275 goto loser; | |
3276 } | |
3277 | |
3278 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3279 if (!fwSession) { | |
3280 error = CKR_SESSION_HANDLE_INVALID; | |
3281 goto loser; | |
3282 } | |
3283 | |
3284 error = nssCKFWSession_Final(fwSession, | |
3285 NSSCKFWCryptoOperationType_Decrypt, | |
3286 NSSCKFWCryptoOperationState_EncryptDecrypt, | |
3287 pLastPart, pulLastPartLen); | |
3288 | |
3289 if (CKR_OK == error) { | |
3290 return CKR_OK; | |
3291 } | |
3292 | |
3293 loser: | |
3294 /* verify error */ | |
3295 switch( error ) { | |
3296 case CKR_ARGUMENTS_BAD: | |
3297 case CKR_BUFFER_TOO_SMALL: | |
3298 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3299 case CKR_DEVICE_ERROR: | |
3300 case CKR_DEVICE_MEMORY: | |
3301 case CKR_DEVICE_REMOVED: | |
3302 case CKR_FUNCTION_FAILED: | |
3303 case CKR_FUNCTION_CANCELED: | |
3304 case CKR_ENCRYPTED_DATA_INVALID: | |
3305 case CKR_ENCRYPTED_DATA_LEN_RANGE: | |
3306 case CKR_GENERAL_ERROR: | |
3307 case CKR_HOST_MEMORY: | |
3308 case CKR_OPERATION_NOT_INITIALIZED: | |
3309 case CKR_SESSION_CLOSED: | |
3310 case CKR_SESSION_HANDLE_INVALID: | |
3311 case CKR_USER_NOT_LOGGED_IN: | |
3312 break; | |
3313 case CKR_DATA_LEN_RANGE: | |
3314 error = CKR_ENCRYPTED_DATA_LEN_RANGE; | |
3315 break; | |
3316 case CKR_DATA_INVALID: | |
3317 error = CKR_ENCRYPTED_DATA_INVALID; | |
3318 break; | |
3319 default: | |
3320 case CKR_OK: | |
3321 error = CKR_GENERAL_ERROR; | |
3322 break; | |
3323 } | |
3324 return error; | |
3325 } | |
3326 | |
3327 /* | |
3328 * NSSCKFWC_DigestInit | |
3329 * | |
3330 */ | |
3331 NSS_IMPLEMENT CK_RV | |
3332 NSSCKFWC_DigestInit | |
3333 ( | |
3334 NSSCKFWInstance *fwInstance, | |
3335 CK_SESSION_HANDLE hSession, | |
3336 CK_MECHANISM_PTR pMechanism | |
3337 ) | |
3338 { | |
3339 CK_RV error = CKR_OK; | |
3340 NSSCKFWSession *fwSession; | |
3341 NSSCKFWSlot *fwSlot; | |
3342 NSSCKFWToken *fwToken; | |
3343 NSSCKFWMechanism *fwMechanism; | |
3344 | |
3345 if (!fwInstance) { | |
3346 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3347 goto loser; | |
3348 } | |
3349 | |
3350 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3351 if (!fwSession) { | |
3352 error = CKR_SESSION_HANDLE_INVALID; | |
3353 goto loser; | |
3354 } | |
3355 | |
3356 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
3357 if (!fwSlot) { | |
3358 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
3359 goto loser; | |
3360 } | |
3361 | |
3362 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
3363 error = CKR_TOKEN_NOT_PRESENT; | |
3364 goto loser; | |
3365 } | |
3366 | |
3367 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
3368 if (!fwToken) { | |
3369 goto loser; | |
3370 } | |
3371 | |
3372 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
3373 if (!fwMechanism) { | |
3374 goto loser; | |
3375 } | |
3376 | |
3377 error = nssCKFWMechanism_DigestInit(fwMechanism, pMechanism, fwSession); | |
3378 | |
3379 nssCKFWMechanism_Destroy(fwMechanism); | |
3380 | |
3381 if (CKR_OK == error) { | |
3382 return CKR_OK; | |
3383 } | |
3384 | |
3385 loser: | |
3386 /* verify error */ | |
3387 switch( error ) { | |
3388 case CKR_ARGUMENTS_BAD: | |
3389 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3390 case CKR_DEVICE_ERROR: | |
3391 case CKR_DEVICE_MEMORY: | |
3392 case CKR_DEVICE_REMOVED: | |
3393 case CKR_FUNCTION_CANCELED: | |
3394 case CKR_FUNCTION_FAILED: | |
3395 case CKR_GENERAL_ERROR: | |
3396 case CKR_HOST_MEMORY: | |
3397 case CKR_MECHANISM_INVALID: | |
3398 case CKR_MECHANISM_PARAM_INVALID: | |
3399 case CKR_OPERATION_ACTIVE: | |
3400 case CKR_PIN_EXPIRED: | |
3401 case CKR_SESSION_CLOSED: | |
3402 case CKR_SESSION_HANDLE_INVALID: | |
3403 case CKR_USER_NOT_LOGGED_IN: | |
3404 break; | |
3405 default: | |
3406 case CKR_OK: | |
3407 error = CKR_GENERAL_ERROR; | |
3408 break; | |
3409 } | |
3410 return error; | |
3411 } | |
3412 | |
3413 /* | |
3414 * NSSCKFWC_Digest | |
3415 * | |
3416 */ | |
3417 NSS_IMPLEMENT CK_RV | |
3418 NSSCKFWC_Digest | |
3419 ( | |
3420 NSSCKFWInstance *fwInstance, | |
3421 CK_SESSION_HANDLE hSession, | |
3422 CK_BYTE_PTR pData, | |
3423 CK_ULONG ulDataLen, | |
3424 CK_BYTE_PTR pDigest, | |
3425 CK_ULONG_PTR pulDigestLen | |
3426 ) | |
3427 { | |
3428 CK_RV error = CKR_OK; | |
3429 NSSCKFWSession *fwSession; | |
3430 | |
3431 if (!fwInstance) { | |
3432 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3433 goto loser; | |
3434 } | |
3435 | |
3436 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3437 if (!fwSession) { | |
3438 error = CKR_SESSION_HANDLE_INVALID; | |
3439 goto loser; | |
3440 } | |
3441 | |
3442 error = nssCKFWSession_UpdateFinal(fwSession, | |
3443 NSSCKFWCryptoOperationType_Digest, | |
3444 NSSCKFWCryptoOperationState_Digest, | |
3445 pData, ulDataLen, pDigest, pulDigestLen); | |
3446 | |
3447 if (CKR_OK == error) { | |
3448 return CKR_OK; | |
3449 } | |
3450 | |
3451 loser: | |
3452 /* verify error */ | |
3453 switch( error ) { | |
3454 case CKR_ARGUMENTS_BAD: | |
3455 case CKR_BUFFER_TOO_SMALL: | |
3456 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3457 case CKR_DEVICE_ERROR: | |
3458 case CKR_DEVICE_MEMORY: | |
3459 case CKR_DEVICE_REMOVED: | |
3460 case CKR_FUNCTION_CANCELED: | |
3461 case CKR_FUNCTION_FAILED: | |
3462 case CKR_GENERAL_ERROR: | |
3463 case CKR_HOST_MEMORY: | |
3464 case CKR_OPERATION_NOT_INITIALIZED: | |
3465 case CKR_SESSION_CLOSED: | |
3466 case CKR_SESSION_HANDLE_INVALID: | |
3467 break; | |
3468 default: | |
3469 case CKR_OK: | |
3470 error = CKR_GENERAL_ERROR; | |
3471 break; | |
3472 } | |
3473 return error; | |
3474 } | |
3475 | |
3476 /* | |
3477 * NSSCKFWC_DigestUpdate | |
3478 * | |
3479 */ | |
3480 NSS_IMPLEMENT CK_RV | |
3481 NSSCKFWC_DigestUpdate | |
3482 ( | |
3483 NSSCKFWInstance *fwInstance, | |
3484 CK_SESSION_HANDLE hSession, | |
3485 CK_BYTE_PTR pData, | |
3486 CK_ULONG ulDataLen | |
3487 ) | |
3488 { | |
3489 CK_RV error = CKR_OK; | |
3490 NSSCKFWSession *fwSession; | |
3491 | |
3492 if (!fwInstance) { | |
3493 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3494 goto loser; | |
3495 } | |
3496 | |
3497 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3498 if (!fwSession) { | |
3499 error = CKR_SESSION_HANDLE_INVALID; | |
3500 goto loser; | |
3501 } | |
3502 | |
3503 error = nssCKFWSession_DigestUpdate(fwSession, | |
3504 NSSCKFWCryptoOperationType_Digest, | |
3505 NSSCKFWCryptoOperationState_Digest, | |
3506 pData, ulDataLen); | |
3507 | |
3508 if (CKR_OK == error) { | |
3509 return CKR_OK; | |
3510 } | |
3511 | |
3512 loser: | |
3513 /* verify error */ | |
3514 switch( error ) { | |
3515 case CKR_ARGUMENTS_BAD: | |
3516 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3517 case CKR_DEVICE_ERROR: | |
3518 case CKR_DEVICE_MEMORY: | |
3519 case CKR_DEVICE_REMOVED: | |
3520 case CKR_FUNCTION_CANCELED: | |
3521 case CKR_FUNCTION_FAILED: | |
3522 case CKR_GENERAL_ERROR: | |
3523 case CKR_HOST_MEMORY: | |
3524 case CKR_OPERATION_NOT_INITIALIZED: | |
3525 case CKR_SESSION_CLOSED: | |
3526 case CKR_SESSION_HANDLE_INVALID: | |
3527 break; | |
3528 default: | |
3529 case CKR_OK: | |
3530 error = CKR_GENERAL_ERROR; | |
3531 break; | |
3532 } | |
3533 return error; | |
3534 } | |
3535 | |
3536 /* | |
3537 * NSSCKFWC_DigestKey | |
3538 * | |
3539 */ | |
3540 NSS_IMPLEMENT CK_RV | |
3541 NSSCKFWC_DigestKey | |
3542 ( | |
3543 NSSCKFWInstance *fwInstance, | |
3544 CK_SESSION_HANDLE hSession, | |
3545 CK_OBJECT_HANDLE hKey | |
3546 ) | |
3547 { | |
3548 CK_RV error = CKR_OK; | |
3549 NSSCKFWSession *fwSession; | |
3550 NSSCKFWObject *fwObject; | |
3551 | |
3552 if (!fwInstance) { | |
3553 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3554 goto loser; | |
3555 } | |
3556 | |
3557 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3558 if (!fwSession) { | |
3559 error = CKR_SESSION_HANDLE_INVALID; | |
3560 goto loser; | |
3561 } | |
3562 | |
3563 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hKey); | |
3564 if (!fwObject) { | |
3565 error = CKR_KEY_HANDLE_INVALID; | |
3566 goto loser; | |
3567 } | |
3568 | |
3569 error = nssCKFWSession_DigestKey(fwSession, fwObject); | |
3570 | |
3571 if (CKR_OK == error) { | |
3572 return CKR_OK; | |
3573 } | |
3574 | |
3575 loser: | |
3576 /* verify error */ | |
3577 switch( error ) { | |
3578 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3579 case CKR_DEVICE_ERROR: | |
3580 case CKR_DEVICE_MEMORY: | |
3581 case CKR_DEVICE_REMOVED: | |
3582 case CKR_FUNCTION_CANCELED: | |
3583 case CKR_FUNCTION_FAILED: | |
3584 case CKR_GENERAL_ERROR: | |
3585 case CKR_HOST_MEMORY: | |
3586 case CKR_KEY_HANDLE_INVALID: | |
3587 case CKR_KEY_INDIGESTIBLE: | |
3588 case CKR_KEY_SIZE_RANGE: | |
3589 case CKR_OPERATION_NOT_INITIALIZED: | |
3590 case CKR_SESSION_CLOSED: | |
3591 case CKR_SESSION_HANDLE_INVALID: | |
3592 break; | |
3593 default: | |
3594 case CKR_OK: | |
3595 error = CKR_GENERAL_ERROR; | |
3596 break; | |
3597 } | |
3598 return error; | |
3599 } | |
3600 | |
3601 /* | |
3602 * NSSCKFWC_DigestFinal | |
3603 * | |
3604 */ | |
3605 NSS_IMPLEMENT CK_RV | |
3606 NSSCKFWC_DigestFinal | |
3607 ( | |
3608 NSSCKFWInstance *fwInstance, | |
3609 CK_SESSION_HANDLE hSession, | |
3610 CK_BYTE_PTR pDigest, | |
3611 CK_ULONG_PTR pulDigestLen | |
3612 ) | |
3613 { | |
3614 CK_RV error = CKR_OK; | |
3615 NSSCKFWSession *fwSession; | |
3616 | |
3617 if (!fwInstance) { | |
3618 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3619 goto loser; | |
3620 } | |
3621 | |
3622 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3623 if (!fwSession) { | |
3624 error = CKR_SESSION_HANDLE_INVALID; | |
3625 goto loser; | |
3626 } | |
3627 | |
3628 error = nssCKFWSession_Final(fwSession, | |
3629 NSSCKFWCryptoOperationType_Digest, | |
3630 NSSCKFWCryptoOperationState_Digest, | |
3631 pDigest, pulDigestLen); | |
3632 | |
3633 if (CKR_OK == error) { | |
3634 return CKR_OK; | |
3635 } | |
3636 | |
3637 loser: | |
3638 /* verify error */ | |
3639 switch( error ) { | |
3640 case CKR_ARGUMENTS_BAD: | |
3641 case CKR_BUFFER_TOO_SMALL: | |
3642 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3643 case CKR_DEVICE_ERROR: | |
3644 case CKR_DEVICE_MEMORY: | |
3645 case CKR_DEVICE_REMOVED: | |
3646 case CKR_FUNCTION_CANCELED: | |
3647 case CKR_FUNCTION_FAILED: | |
3648 case CKR_GENERAL_ERROR: | |
3649 case CKR_HOST_MEMORY: | |
3650 case CKR_OPERATION_NOT_INITIALIZED: | |
3651 case CKR_SESSION_CLOSED: | |
3652 case CKR_SESSION_HANDLE_INVALID: | |
3653 break; | |
3654 default: | |
3655 case CKR_OK: | |
3656 error = CKR_GENERAL_ERROR; | |
3657 break; | |
3658 } | |
3659 return error; | |
3660 } | |
3661 | |
3662 /* | |
3663 * NSSCKFWC_SignInit | |
3664 * | |
3665 */ | |
3666 NSS_IMPLEMENT CK_RV | |
3667 NSSCKFWC_SignInit | |
3668 ( | |
3669 NSSCKFWInstance *fwInstance, | |
3670 CK_SESSION_HANDLE hSession, | |
3671 CK_MECHANISM_PTR pMechanism, | |
3672 CK_OBJECT_HANDLE hKey | |
3673 ) | |
3674 { | |
3675 CK_RV error = CKR_OK; | |
3676 NSSCKFWSession *fwSession; | |
3677 NSSCKFWObject *fwObject; | |
3678 NSSCKFWSlot *fwSlot; | |
3679 NSSCKFWToken *fwToken; | |
3680 NSSCKFWMechanism *fwMechanism; | |
3681 | |
3682 if (!fwInstance) { | |
3683 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3684 goto loser; | |
3685 } | |
3686 | |
3687 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3688 if (!fwSession) { | |
3689 error = CKR_SESSION_HANDLE_INVALID; | |
3690 goto loser; | |
3691 } | |
3692 | |
3693 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hKey); | |
3694 if (!fwObject) { | |
3695 error = CKR_KEY_HANDLE_INVALID; | |
3696 goto loser; | |
3697 } | |
3698 | |
3699 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
3700 if (!fwSlot) { | |
3701 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
3702 goto loser; | |
3703 } | |
3704 | |
3705 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
3706 error = CKR_TOKEN_NOT_PRESENT; | |
3707 goto loser; | |
3708 } | |
3709 | |
3710 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
3711 if (!fwToken) { | |
3712 goto loser; | |
3713 } | |
3714 | |
3715 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
3716 if (!fwMechanism) { | |
3717 goto loser; | |
3718 } | |
3719 | |
3720 error = nssCKFWMechanism_SignInit(fwMechanism, pMechanism, fwSession, | |
3721 fwObject); | |
3722 | |
3723 nssCKFWMechanism_Destroy(fwMechanism); | |
3724 | |
3725 if (CKR_OK == error) { | |
3726 return CKR_OK; | |
3727 } | |
3728 | |
3729 loser: | |
3730 /* verify error */ | |
3731 switch( error ) { | |
3732 case CKR_ARGUMENTS_BAD: | |
3733 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3734 case CKR_DEVICE_ERROR: | |
3735 case CKR_DEVICE_MEMORY: | |
3736 case CKR_DEVICE_REMOVED: | |
3737 case CKR_FUNCTION_CANCELED: | |
3738 case CKR_FUNCTION_FAILED: | |
3739 case CKR_GENERAL_ERROR: | |
3740 case CKR_HOST_MEMORY: | |
3741 case CKR_KEY_FUNCTION_NOT_PERMITTED: | |
3742 case CKR_KEY_HANDLE_INVALID: | |
3743 case CKR_KEY_SIZE_RANGE: | |
3744 case CKR_KEY_TYPE_INCONSISTENT: | |
3745 case CKR_MECHANISM_INVALID: | |
3746 case CKR_MECHANISM_PARAM_INVALID: | |
3747 case CKR_OPERATION_ACTIVE: | |
3748 case CKR_PIN_EXPIRED: | |
3749 case CKR_SESSION_CLOSED: | |
3750 case CKR_SESSION_HANDLE_INVALID: | |
3751 case CKR_USER_NOT_LOGGED_IN: | |
3752 break; | |
3753 default: | |
3754 case CKR_OK: | |
3755 error = CKR_GENERAL_ERROR; | |
3756 break; | |
3757 } | |
3758 return error; | |
3759 } | |
3760 | |
3761 /* | |
3762 * NSSCKFWC_Sign | |
3763 * | |
3764 */ | |
3765 NSS_IMPLEMENT CK_RV | |
3766 NSSCKFWC_Sign | |
3767 ( | |
3768 NSSCKFWInstance *fwInstance, | |
3769 CK_SESSION_HANDLE hSession, | |
3770 CK_BYTE_PTR pData, | |
3771 CK_ULONG ulDataLen, | |
3772 CK_BYTE_PTR pSignature, | |
3773 CK_ULONG_PTR pulSignatureLen | |
3774 ) | |
3775 { | |
3776 CK_RV error = CKR_OK; | |
3777 NSSCKFWSession *fwSession; | |
3778 | |
3779 if (!fwInstance) { | |
3780 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3781 goto loser; | |
3782 } | |
3783 | |
3784 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3785 if (!fwSession) { | |
3786 error = CKR_SESSION_HANDLE_INVALID; | |
3787 goto loser; | |
3788 } | |
3789 | |
3790 error = nssCKFWSession_UpdateFinal(fwSession, | |
3791 NSSCKFWCryptoOperationType_Sign, | |
3792 NSSCKFWCryptoOperationState_SignVerify, | |
3793 pData, ulDataLen, pSignature, pulSignatureLen); | |
3794 | |
3795 if (CKR_OK == error) { | |
3796 return CKR_OK; | |
3797 } | |
3798 | |
3799 loser: | |
3800 /* verify error */ | |
3801 switch( error ) { | |
3802 case CKR_ARGUMENTS_BAD: | |
3803 case CKR_BUFFER_TOO_SMALL: | |
3804 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3805 case CKR_DATA_INVALID: | |
3806 case CKR_DATA_LEN_RANGE: | |
3807 case CKR_DEVICE_ERROR: | |
3808 case CKR_DEVICE_MEMORY: | |
3809 case CKR_DEVICE_REMOVED: | |
3810 case CKR_FUNCTION_CANCELED: | |
3811 case CKR_FUNCTION_FAILED: | |
3812 case CKR_GENERAL_ERROR: | |
3813 case CKR_HOST_MEMORY: | |
3814 case CKR_OPERATION_NOT_INITIALIZED: | |
3815 case CKR_SESSION_CLOSED: | |
3816 case CKR_SESSION_HANDLE_INVALID: | |
3817 case CKR_USER_NOT_LOGGED_IN: | |
3818 case CKR_FUNCTION_REJECTED: | |
3819 break; | |
3820 default: | |
3821 case CKR_OK: | |
3822 error = CKR_GENERAL_ERROR; | |
3823 break; | |
3824 } | |
3825 return error; | |
3826 } | |
3827 | |
3828 /* | |
3829 * NSSCKFWC_SignUpdate | |
3830 * | |
3831 */ | |
3832 NSS_IMPLEMENT CK_RV | |
3833 NSSCKFWC_SignUpdate | |
3834 ( | |
3835 NSSCKFWInstance *fwInstance, | |
3836 CK_SESSION_HANDLE hSession, | |
3837 CK_BYTE_PTR pPart, | |
3838 CK_ULONG ulPartLen | |
3839 ) | |
3840 { | |
3841 CK_RV error = CKR_OK; | |
3842 NSSCKFWSession *fwSession; | |
3843 | |
3844 if (!fwInstance) { | |
3845 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3846 goto loser; | |
3847 } | |
3848 | |
3849 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3850 if (!fwSession) { | |
3851 error = CKR_SESSION_HANDLE_INVALID; | |
3852 goto loser; | |
3853 } | |
3854 | |
3855 error = nssCKFWSession_DigestUpdate(fwSession, | |
3856 NSSCKFWCryptoOperationType_Sign, | |
3857 NSSCKFWCryptoOperationState_SignVerify, | |
3858 pPart, ulPartLen); | |
3859 | |
3860 if (CKR_OK == error) { | |
3861 return CKR_OK; | |
3862 } | |
3863 | |
3864 loser: | |
3865 /* verify error */ | |
3866 switch( error ) { | |
3867 case CKR_ARGUMENTS_BAD: | |
3868 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3869 case CKR_DATA_LEN_RANGE: | |
3870 case CKR_DEVICE_ERROR: | |
3871 case CKR_DEVICE_MEMORY: | |
3872 case CKR_DEVICE_REMOVED: | |
3873 case CKR_FUNCTION_CANCELED: | |
3874 case CKR_FUNCTION_FAILED: | |
3875 case CKR_GENERAL_ERROR: | |
3876 case CKR_HOST_MEMORY: | |
3877 case CKR_OPERATION_NOT_INITIALIZED: | |
3878 case CKR_SESSION_CLOSED: | |
3879 case CKR_SESSION_HANDLE_INVALID: | |
3880 case CKR_USER_NOT_LOGGED_IN: | |
3881 break; | |
3882 default: | |
3883 case CKR_OK: | |
3884 error = CKR_GENERAL_ERROR; | |
3885 break; | |
3886 } | |
3887 return error; | |
3888 } | |
3889 | |
3890 /* | |
3891 * NSSCKFWC_SignFinal | |
3892 * | |
3893 */ | |
3894 NSS_IMPLEMENT CK_RV | |
3895 NSSCKFWC_SignFinal | |
3896 ( | |
3897 NSSCKFWInstance *fwInstance, | |
3898 CK_SESSION_HANDLE hSession, | |
3899 CK_BYTE_PTR pSignature, | |
3900 CK_ULONG_PTR pulSignatureLen | |
3901 ) | |
3902 { | |
3903 CK_RV error = CKR_OK; | |
3904 NSSCKFWSession *fwSession; | |
3905 | |
3906 if (!fwInstance) { | |
3907 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3908 goto loser; | |
3909 } | |
3910 | |
3911 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3912 if (!fwSession) { | |
3913 error = CKR_SESSION_HANDLE_INVALID; | |
3914 goto loser; | |
3915 } | |
3916 | |
3917 error = nssCKFWSession_Final(fwSession, | |
3918 NSSCKFWCryptoOperationType_Sign, | |
3919 NSSCKFWCryptoOperationState_SignVerify, | |
3920 pSignature, pulSignatureLen); | |
3921 | |
3922 if (CKR_OK == error) { | |
3923 return CKR_OK; | |
3924 } | |
3925 | |
3926 loser: | |
3927 /* verify error */ | |
3928 switch( error ) { | |
3929 case CKR_ARGUMENTS_BAD: | |
3930 case CKR_BUFFER_TOO_SMALL: | |
3931 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
3932 case CKR_DATA_LEN_RANGE: | |
3933 case CKR_DEVICE_ERROR: | |
3934 case CKR_DEVICE_MEMORY: | |
3935 case CKR_DEVICE_REMOVED: | |
3936 case CKR_FUNCTION_CANCELED: | |
3937 case CKR_FUNCTION_FAILED: | |
3938 case CKR_GENERAL_ERROR: | |
3939 case CKR_HOST_MEMORY: | |
3940 case CKR_OPERATION_NOT_INITIALIZED: | |
3941 case CKR_SESSION_CLOSED: | |
3942 case CKR_SESSION_HANDLE_INVALID: | |
3943 case CKR_USER_NOT_LOGGED_IN: | |
3944 case CKR_FUNCTION_REJECTED: | |
3945 break; | |
3946 default: | |
3947 case CKR_OK: | |
3948 error = CKR_GENERAL_ERROR; | |
3949 break; | |
3950 } | |
3951 return error; | |
3952 } | |
3953 | |
3954 /* | |
3955 * NSSCKFWC_SignRecoverInit | |
3956 * | |
3957 */ | |
3958 NSS_IMPLEMENT CK_RV | |
3959 NSSCKFWC_SignRecoverInit | |
3960 ( | |
3961 NSSCKFWInstance *fwInstance, | |
3962 CK_SESSION_HANDLE hSession, | |
3963 CK_MECHANISM_PTR pMechanism, | |
3964 CK_OBJECT_HANDLE hKey | |
3965 ) | |
3966 { | |
3967 CK_RV error = CKR_OK; | |
3968 NSSCKFWSession *fwSession; | |
3969 NSSCKFWObject *fwObject; | |
3970 NSSCKFWSlot *fwSlot; | |
3971 NSSCKFWToken *fwToken; | |
3972 NSSCKFWMechanism *fwMechanism; | |
3973 | |
3974 if (!fwInstance) { | |
3975 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
3976 goto loser; | |
3977 } | |
3978 | |
3979 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
3980 if (!fwSession) { | |
3981 error = CKR_SESSION_HANDLE_INVALID; | |
3982 goto loser; | |
3983 } | |
3984 | |
3985 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hKey); | |
3986 if (!fwObject) { | |
3987 error = CKR_KEY_HANDLE_INVALID; | |
3988 goto loser; | |
3989 } | |
3990 | |
3991 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
3992 if (!fwSlot) { | |
3993 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
3994 goto loser; | |
3995 } | |
3996 | |
3997 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
3998 error = CKR_TOKEN_NOT_PRESENT; | |
3999 goto loser; | |
4000 } | |
4001 | |
4002 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
4003 if (!fwToken) { | |
4004 goto loser; | |
4005 } | |
4006 | |
4007 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
4008 if (!fwMechanism) { | |
4009 goto loser; | |
4010 } | |
4011 | |
4012 error = nssCKFWMechanism_SignRecoverInit(fwMechanism, pMechanism, fwSession, | |
4013 fwObject); | |
4014 | |
4015 nssCKFWMechanism_Destroy(fwMechanism); | |
4016 | |
4017 if (CKR_OK == error) { | |
4018 return CKR_OK; | |
4019 } | |
4020 | |
4021 loser: | |
4022 /* verify error */ | |
4023 switch( error ) { | |
4024 case CKR_ARGUMENTS_BAD: | |
4025 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4026 case CKR_DEVICE_ERROR: | |
4027 case CKR_DEVICE_MEMORY: | |
4028 case CKR_DEVICE_REMOVED: | |
4029 case CKR_FUNCTION_CANCELED: | |
4030 case CKR_FUNCTION_FAILED: | |
4031 case CKR_GENERAL_ERROR: | |
4032 case CKR_HOST_MEMORY: | |
4033 case CKR_KEY_FUNCTION_NOT_PERMITTED: | |
4034 case CKR_KEY_HANDLE_INVALID: | |
4035 case CKR_KEY_SIZE_RANGE: | |
4036 case CKR_KEY_TYPE_INCONSISTENT: | |
4037 case CKR_MECHANISM_INVALID: | |
4038 case CKR_MECHANISM_PARAM_INVALID: | |
4039 case CKR_OPERATION_ACTIVE: | |
4040 case CKR_PIN_EXPIRED: | |
4041 case CKR_SESSION_CLOSED: | |
4042 case CKR_SESSION_HANDLE_INVALID: | |
4043 case CKR_USER_NOT_LOGGED_IN: | |
4044 break; | |
4045 default: | |
4046 case CKR_OK: | |
4047 error = CKR_GENERAL_ERROR; | |
4048 break; | |
4049 } | |
4050 return error; | |
4051 } | |
4052 | |
4053 /* | |
4054 * NSSCKFWC_SignRecover | |
4055 * | |
4056 */ | |
4057 NSS_IMPLEMENT CK_RV | |
4058 NSSCKFWC_SignRecover | |
4059 ( | |
4060 NSSCKFWInstance *fwInstance, | |
4061 CK_SESSION_HANDLE hSession, | |
4062 CK_BYTE_PTR pData, | |
4063 CK_ULONG ulDataLen, | |
4064 CK_BYTE_PTR pSignature, | |
4065 CK_ULONG_PTR pulSignatureLen | |
4066 ) | |
4067 { | |
4068 CK_RV error = CKR_OK; | |
4069 NSSCKFWSession *fwSession; | |
4070 | |
4071 if (!fwInstance) { | |
4072 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4073 goto loser; | |
4074 } | |
4075 | |
4076 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4077 if (!fwSession) { | |
4078 error = CKR_SESSION_HANDLE_INVALID; | |
4079 goto loser; | |
4080 } | |
4081 | |
4082 error = nssCKFWSession_UpdateFinal(fwSession, | |
4083 NSSCKFWCryptoOperationType_SignRecover, | |
4084 NSSCKFWCryptoOperationState_SignVerify, | |
4085 pData, ulDataLen, pSignature, pulSignatureLen); | |
4086 | |
4087 if (CKR_OK == error) { | |
4088 return CKR_OK; | |
4089 } | |
4090 | |
4091 loser: | |
4092 /* verify error */ | |
4093 switch( error ) { | |
4094 case CKR_ARGUMENTS_BAD: | |
4095 case CKR_BUFFER_TOO_SMALL: | |
4096 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4097 case CKR_DATA_INVALID: | |
4098 case CKR_DATA_LEN_RANGE: | |
4099 case CKR_DEVICE_ERROR: | |
4100 case CKR_DEVICE_MEMORY: | |
4101 case CKR_DEVICE_REMOVED: | |
4102 case CKR_FUNCTION_CANCELED: | |
4103 case CKR_FUNCTION_FAILED: | |
4104 case CKR_GENERAL_ERROR: | |
4105 case CKR_HOST_MEMORY: | |
4106 case CKR_OPERATION_NOT_INITIALIZED: | |
4107 case CKR_SESSION_CLOSED: | |
4108 case CKR_SESSION_HANDLE_INVALID: | |
4109 case CKR_USER_NOT_LOGGED_IN: | |
4110 break; | |
4111 default: | |
4112 case CKR_OK: | |
4113 error = CKR_GENERAL_ERROR; | |
4114 break; | |
4115 } | |
4116 return error; | |
4117 } | |
4118 | |
4119 /* | |
4120 * NSSCKFWC_VerifyInit | |
4121 * | |
4122 */ | |
4123 NSS_IMPLEMENT CK_RV | |
4124 NSSCKFWC_VerifyInit | |
4125 ( | |
4126 NSSCKFWInstance *fwInstance, | |
4127 CK_SESSION_HANDLE hSession, | |
4128 CK_MECHANISM_PTR pMechanism, | |
4129 CK_OBJECT_HANDLE hKey | |
4130 ) | |
4131 { | |
4132 CK_RV error = CKR_OK; | |
4133 NSSCKFWSession *fwSession; | |
4134 NSSCKFWObject *fwObject; | |
4135 NSSCKFWSlot *fwSlot; | |
4136 NSSCKFWToken *fwToken; | |
4137 NSSCKFWMechanism *fwMechanism; | |
4138 | |
4139 if (!fwInstance) { | |
4140 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4141 goto loser; | |
4142 } | |
4143 | |
4144 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4145 if (!fwSession) { | |
4146 error = CKR_SESSION_HANDLE_INVALID; | |
4147 goto loser; | |
4148 } | |
4149 | |
4150 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hKey); | |
4151 if (!fwObject) { | |
4152 error = CKR_KEY_HANDLE_INVALID; | |
4153 goto loser; | |
4154 } | |
4155 | |
4156 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
4157 if (!fwSlot) { | |
4158 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
4159 goto loser; | |
4160 } | |
4161 | |
4162 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
4163 error = CKR_TOKEN_NOT_PRESENT; | |
4164 goto loser; | |
4165 } | |
4166 | |
4167 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
4168 if (!fwToken) { | |
4169 goto loser; | |
4170 } | |
4171 | |
4172 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
4173 if (!fwMechanism) { | |
4174 goto loser; | |
4175 } | |
4176 | |
4177 error = nssCKFWMechanism_VerifyInit(fwMechanism, pMechanism, fwSession, | |
4178 fwObject); | |
4179 | |
4180 nssCKFWMechanism_Destroy(fwMechanism); | |
4181 | |
4182 if (CKR_OK == error) { | |
4183 return CKR_OK; | |
4184 } | |
4185 | |
4186 loser: | |
4187 /* verify error */ | |
4188 switch( error ) { | |
4189 case CKR_ARGUMENTS_BAD: | |
4190 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4191 case CKR_DEVICE_ERROR: | |
4192 case CKR_DEVICE_MEMORY: | |
4193 case CKR_DEVICE_REMOVED: | |
4194 case CKR_FUNCTION_CANCELED: | |
4195 case CKR_FUNCTION_FAILED: | |
4196 case CKR_GENERAL_ERROR: | |
4197 case CKR_HOST_MEMORY: | |
4198 case CKR_KEY_FUNCTION_NOT_PERMITTED: | |
4199 case CKR_KEY_HANDLE_INVALID: | |
4200 case CKR_KEY_SIZE_RANGE: | |
4201 case CKR_KEY_TYPE_INCONSISTENT: | |
4202 case CKR_MECHANISM_INVALID: | |
4203 case CKR_MECHANISM_PARAM_INVALID: | |
4204 case CKR_OPERATION_ACTIVE: | |
4205 case CKR_PIN_EXPIRED: | |
4206 case CKR_SESSION_CLOSED: | |
4207 case CKR_SESSION_HANDLE_INVALID: | |
4208 case CKR_USER_NOT_LOGGED_IN: | |
4209 break; | |
4210 default: | |
4211 case CKR_OK: | |
4212 error = CKR_GENERAL_ERROR; | |
4213 break; | |
4214 } | |
4215 return error; | |
4216 } | |
4217 | |
4218 /* | |
4219 * NSSCKFWC_Verify | |
4220 * | |
4221 */ | |
4222 NSS_IMPLEMENT CK_RV | |
4223 NSSCKFWC_Verify | |
4224 ( | |
4225 NSSCKFWInstance *fwInstance, | |
4226 CK_SESSION_HANDLE hSession, | |
4227 CK_BYTE_PTR pData, | |
4228 CK_ULONG ulDataLen, | |
4229 CK_BYTE_PTR pSignature, | |
4230 CK_ULONG ulSignatureLen | |
4231 ) | |
4232 { | |
4233 CK_RV error = CKR_OK; | |
4234 NSSCKFWSession *fwSession; | |
4235 | |
4236 if (!fwInstance) { | |
4237 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4238 goto loser; | |
4239 } | |
4240 | |
4241 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4242 if (!fwSession) { | |
4243 error = CKR_SESSION_HANDLE_INVALID; | |
4244 goto loser; | |
4245 } | |
4246 | |
4247 error = nssCKFWSession_UpdateFinal(fwSession, | |
4248 NSSCKFWCryptoOperationType_Verify, | |
4249 NSSCKFWCryptoOperationState_SignVerify, | |
4250 pData, ulDataLen, pSignature, &ulSignatureLen); | |
4251 | |
4252 if (CKR_OK == error) { | |
4253 return CKR_OK; | |
4254 } | |
4255 | |
4256 loser: | |
4257 /* verify error */ | |
4258 switch( error ) { | |
4259 case CKR_ARGUMENTS_BAD: | |
4260 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4261 case CKR_DATA_INVALID: | |
4262 case CKR_DATA_LEN_RANGE: | |
4263 case CKR_DEVICE_ERROR: | |
4264 case CKR_DEVICE_MEMORY: | |
4265 case CKR_DEVICE_REMOVED: | |
4266 case CKR_FUNCTION_CANCELED: | |
4267 case CKR_FUNCTION_FAILED: | |
4268 case CKR_GENERAL_ERROR: | |
4269 case CKR_HOST_MEMORY: | |
4270 case CKR_OPERATION_NOT_INITIALIZED: | |
4271 case CKR_SESSION_CLOSED: | |
4272 case CKR_SESSION_HANDLE_INVALID: | |
4273 case CKR_SIGNATURE_INVALID: | |
4274 case CKR_SIGNATURE_LEN_RANGE: | |
4275 break; | |
4276 default: | |
4277 case CKR_OK: | |
4278 error = CKR_GENERAL_ERROR; | |
4279 break; | |
4280 } | |
4281 return error; | |
4282 } | |
4283 | |
4284 /* | |
4285 * NSSCKFWC_VerifyUpdate | |
4286 * | |
4287 */ | |
4288 NSS_IMPLEMENT CK_RV | |
4289 NSSCKFWC_VerifyUpdate | |
4290 ( | |
4291 NSSCKFWInstance *fwInstance, | |
4292 CK_SESSION_HANDLE hSession, | |
4293 CK_BYTE_PTR pPart, | |
4294 CK_ULONG ulPartLen | |
4295 ) | |
4296 { | |
4297 CK_RV error = CKR_OK; | |
4298 NSSCKFWSession *fwSession; | |
4299 | |
4300 if (!fwInstance) { | |
4301 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4302 goto loser; | |
4303 } | |
4304 | |
4305 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4306 if (!fwSession) { | |
4307 error = CKR_SESSION_HANDLE_INVALID; | |
4308 goto loser; | |
4309 } | |
4310 | |
4311 error = nssCKFWSession_DigestUpdate(fwSession, | |
4312 NSSCKFWCryptoOperationType_Verify, | |
4313 NSSCKFWCryptoOperationState_SignVerify, | |
4314 pPart, ulPartLen); | |
4315 | |
4316 if (CKR_OK == error) { | |
4317 return CKR_OK; | |
4318 } | |
4319 | |
4320 loser: | |
4321 /* verify error */ | |
4322 switch( error ) { | |
4323 case CKR_ARGUMENTS_BAD: | |
4324 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4325 case CKR_DATA_LEN_RANGE: | |
4326 case CKR_DEVICE_ERROR: | |
4327 case CKR_DEVICE_MEMORY: | |
4328 case CKR_DEVICE_REMOVED: | |
4329 case CKR_FUNCTION_CANCELED: | |
4330 case CKR_FUNCTION_FAILED: | |
4331 case CKR_GENERAL_ERROR: | |
4332 case CKR_HOST_MEMORY: | |
4333 case CKR_OPERATION_NOT_INITIALIZED: | |
4334 case CKR_SESSION_CLOSED: | |
4335 case CKR_SESSION_HANDLE_INVALID: | |
4336 break; | |
4337 default: | |
4338 case CKR_OK: | |
4339 error = CKR_GENERAL_ERROR; | |
4340 break; | |
4341 } | |
4342 return error; | |
4343 } | |
4344 | |
4345 /* | |
4346 * NSSCKFWC_VerifyFinal | |
4347 * | |
4348 */ | |
4349 NSS_IMPLEMENT CK_RV | |
4350 NSSCKFWC_VerifyFinal | |
4351 ( | |
4352 NSSCKFWInstance *fwInstance, | |
4353 CK_SESSION_HANDLE hSession, | |
4354 CK_BYTE_PTR pSignature, | |
4355 CK_ULONG ulSignatureLen | |
4356 ) | |
4357 { | |
4358 CK_RV error = CKR_OK; | |
4359 NSSCKFWSession *fwSession; | |
4360 | |
4361 if (!fwInstance) { | |
4362 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4363 goto loser; | |
4364 } | |
4365 | |
4366 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4367 if (!fwSession) { | |
4368 error = CKR_SESSION_HANDLE_INVALID; | |
4369 goto loser; | |
4370 } | |
4371 | |
4372 error = nssCKFWSession_Final(fwSession, | |
4373 NSSCKFWCryptoOperationType_Verify, | |
4374 NSSCKFWCryptoOperationState_SignVerify, | |
4375 pSignature, &ulSignatureLen); | |
4376 | |
4377 if (CKR_OK == error) { | |
4378 return CKR_OK; | |
4379 } | |
4380 | |
4381 loser: | |
4382 /* verify error */ | |
4383 switch( error ) { | |
4384 case CKR_ARGUMENTS_BAD: | |
4385 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4386 case CKR_DATA_LEN_RANGE: | |
4387 case CKR_DEVICE_ERROR: | |
4388 case CKR_DEVICE_MEMORY: | |
4389 case CKR_DEVICE_REMOVED: | |
4390 case CKR_FUNCTION_CANCELED: | |
4391 case CKR_FUNCTION_FAILED: | |
4392 case CKR_GENERAL_ERROR: | |
4393 case CKR_HOST_MEMORY: | |
4394 case CKR_OPERATION_NOT_INITIALIZED: | |
4395 case CKR_SESSION_CLOSED: | |
4396 case CKR_SESSION_HANDLE_INVALID: | |
4397 case CKR_SIGNATURE_INVALID: | |
4398 case CKR_SIGNATURE_LEN_RANGE: | |
4399 break; | |
4400 default: | |
4401 case CKR_OK: | |
4402 error = CKR_GENERAL_ERROR; | |
4403 break; | |
4404 } | |
4405 return error; | |
4406 } | |
4407 | |
4408 /* | |
4409 * NSSCKFWC_VerifyRecoverInit | |
4410 * | |
4411 */ | |
4412 NSS_IMPLEMENT CK_RV | |
4413 NSSCKFWC_VerifyRecoverInit | |
4414 ( | |
4415 NSSCKFWInstance *fwInstance, | |
4416 CK_SESSION_HANDLE hSession, | |
4417 CK_MECHANISM_PTR pMechanism, | |
4418 CK_OBJECT_HANDLE hKey | |
4419 ) | |
4420 { | |
4421 CK_RV error = CKR_OK; | |
4422 NSSCKFWSession *fwSession; | |
4423 NSSCKFWObject *fwObject; | |
4424 NSSCKFWSlot *fwSlot; | |
4425 NSSCKFWToken *fwToken; | |
4426 NSSCKFWMechanism *fwMechanism; | |
4427 | |
4428 if (!fwInstance) { | |
4429 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4430 goto loser; | |
4431 } | |
4432 | |
4433 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4434 if (!fwSession) { | |
4435 error = CKR_SESSION_HANDLE_INVALID; | |
4436 goto loser; | |
4437 } | |
4438 | |
4439 fwObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hKey); | |
4440 if (!fwObject) { | |
4441 error = CKR_KEY_HANDLE_INVALID; | |
4442 goto loser; | |
4443 } | |
4444 | |
4445 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
4446 if (!fwSlot) { | |
4447 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
4448 goto loser; | |
4449 } | |
4450 | |
4451 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
4452 error = CKR_TOKEN_NOT_PRESENT; | |
4453 goto loser; | |
4454 } | |
4455 | |
4456 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
4457 if (!fwToken) { | |
4458 goto loser; | |
4459 } | |
4460 | |
4461 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
4462 if (!fwMechanism) { | |
4463 goto loser; | |
4464 } | |
4465 | |
4466 error = nssCKFWMechanism_VerifyRecoverInit(fwMechanism, pMechanism, | |
4467 fwSession, fwObject); | |
4468 | |
4469 nssCKFWMechanism_Destroy(fwMechanism); | |
4470 | |
4471 if (CKR_OK == error) { | |
4472 return CKR_OK; | |
4473 } | |
4474 | |
4475 loser: | |
4476 /* verify error */ | |
4477 switch( error ) { | |
4478 case CKR_ARGUMENTS_BAD: | |
4479 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4480 case CKR_DEVICE_ERROR: | |
4481 case CKR_DEVICE_MEMORY: | |
4482 case CKR_DEVICE_REMOVED: | |
4483 case CKR_FUNCTION_CANCELED: | |
4484 case CKR_FUNCTION_FAILED: | |
4485 case CKR_GENERAL_ERROR: | |
4486 case CKR_HOST_MEMORY: | |
4487 case CKR_KEY_FUNCTION_NOT_PERMITTED: | |
4488 case CKR_KEY_HANDLE_INVALID: | |
4489 case CKR_KEY_SIZE_RANGE: | |
4490 case CKR_KEY_TYPE_INCONSISTENT: | |
4491 case CKR_MECHANISM_INVALID: | |
4492 case CKR_MECHANISM_PARAM_INVALID: | |
4493 case CKR_OPERATION_ACTIVE: | |
4494 case CKR_PIN_EXPIRED: | |
4495 case CKR_SESSION_HANDLE_INVALID: | |
4496 case CKR_SESSION_CLOSED: | |
4497 case CKR_USER_NOT_LOGGED_IN: | |
4498 break; | |
4499 default: | |
4500 case CKR_OK: | |
4501 error = CKR_GENERAL_ERROR; | |
4502 break; | |
4503 } | |
4504 return error; | |
4505 } | |
4506 | |
4507 /* | |
4508 * NSSCKFWC_VerifyRecover | |
4509 * | |
4510 */ | |
4511 NSS_IMPLEMENT CK_RV | |
4512 NSSCKFWC_VerifyRecover | |
4513 ( | |
4514 NSSCKFWInstance *fwInstance, | |
4515 CK_SESSION_HANDLE hSession, | |
4516 CK_BYTE_PTR pSignature, | |
4517 CK_ULONG ulSignatureLen, | |
4518 CK_BYTE_PTR pData, | |
4519 CK_ULONG_PTR pulDataLen | |
4520 ) | |
4521 { | |
4522 CK_RV error = CKR_OK; | |
4523 NSSCKFWSession *fwSession; | |
4524 | |
4525 if (!fwInstance) { | |
4526 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4527 goto loser; | |
4528 } | |
4529 | |
4530 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4531 if (!fwSession) { | |
4532 error = CKR_SESSION_HANDLE_INVALID; | |
4533 goto loser; | |
4534 } | |
4535 | |
4536 error = nssCKFWSession_UpdateFinal(fwSession, | |
4537 NSSCKFWCryptoOperationType_VerifyRecover, | |
4538 NSSCKFWCryptoOperationState_SignVerify, | |
4539 pSignature, ulSignatureLen, pData, pulDataLen); | |
4540 if (CKR_OK == error) { | |
4541 return CKR_OK; | |
4542 } | |
4543 loser: | |
4544 /* verify error */ | |
4545 switch( error ) { | |
4546 case CKR_ARGUMENTS_BAD: | |
4547 case CKR_BUFFER_TOO_SMALL: | |
4548 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4549 case CKR_DATA_INVALID: | |
4550 case CKR_DATA_LEN_RANGE: | |
4551 case CKR_DEVICE_ERROR: | |
4552 case CKR_DEVICE_MEMORY: | |
4553 case CKR_DEVICE_REMOVED: | |
4554 case CKR_FUNCTION_CANCELED: | |
4555 case CKR_FUNCTION_FAILED: | |
4556 case CKR_GENERAL_ERROR: | |
4557 case CKR_HOST_MEMORY: | |
4558 case CKR_OPERATION_NOT_INITIALIZED: | |
4559 case CKR_SESSION_CLOSED: | |
4560 case CKR_SESSION_HANDLE_INVALID: | |
4561 case CKR_SIGNATURE_INVALID: | |
4562 case CKR_SIGNATURE_LEN_RANGE: | |
4563 break; | |
4564 default: | |
4565 case CKR_OK: | |
4566 error = CKR_GENERAL_ERROR; | |
4567 break; | |
4568 } | |
4569 return error; | |
4570 } | |
4571 | |
4572 /* | |
4573 * NSSCKFWC_DigestEncryptUpdate | |
4574 * | |
4575 */ | |
4576 NSS_IMPLEMENT CK_RV | |
4577 NSSCKFWC_DigestEncryptUpdate | |
4578 ( | |
4579 NSSCKFWInstance *fwInstance, | |
4580 CK_SESSION_HANDLE hSession, | |
4581 CK_BYTE_PTR pPart, | |
4582 CK_ULONG ulPartLen, | |
4583 CK_BYTE_PTR pEncryptedPart, | |
4584 CK_ULONG_PTR pulEncryptedPartLen | |
4585 ) | |
4586 { | |
4587 CK_RV error = CKR_OK; | |
4588 NSSCKFWSession *fwSession; | |
4589 | |
4590 if (!fwInstance) { | |
4591 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4592 goto loser; | |
4593 } | |
4594 | |
4595 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4596 if (!fwSession) { | |
4597 error = CKR_SESSION_HANDLE_INVALID; | |
4598 goto loser; | |
4599 } | |
4600 | |
4601 error = nssCKFWSession_UpdateCombo(fwSession, | |
4602 NSSCKFWCryptoOperationType_Encrypt, | |
4603 NSSCKFWCryptoOperationType_Digest, | |
4604 NSSCKFWCryptoOperationState_Digest, | |
4605 pPart, ulPartLen, pEncryptedPart, pulEncryptedPartLen); | |
4606 | |
4607 if (CKR_OK == error) { | |
4608 return CKR_OK; | |
4609 } | |
4610 | |
4611 loser: | |
4612 /* verify error */ | |
4613 switch( error ) { | |
4614 case CKR_ARGUMENTS_BAD: | |
4615 case CKR_BUFFER_TOO_SMALL: | |
4616 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4617 case CKR_DATA_LEN_RANGE: | |
4618 case CKR_DEVICE_ERROR: | |
4619 case CKR_DEVICE_MEMORY: | |
4620 case CKR_DEVICE_REMOVED: | |
4621 case CKR_FUNCTION_CANCELED: | |
4622 case CKR_FUNCTION_FAILED: | |
4623 case CKR_GENERAL_ERROR: | |
4624 case CKR_HOST_MEMORY: | |
4625 case CKR_OPERATION_NOT_INITIALIZED: | |
4626 case CKR_SESSION_CLOSED: | |
4627 case CKR_SESSION_HANDLE_INVALID: | |
4628 break; | |
4629 default: | |
4630 case CKR_OK: | |
4631 error = CKR_GENERAL_ERROR; | |
4632 break; | |
4633 } | |
4634 return error; | |
4635 } | |
4636 | |
4637 /* | |
4638 * NSSCKFWC_DecryptDigestUpdate | |
4639 * | |
4640 */ | |
4641 NSS_IMPLEMENT CK_RV | |
4642 NSSCKFWC_DecryptDigestUpdate | |
4643 ( | |
4644 NSSCKFWInstance *fwInstance, | |
4645 CK_SESSION_HANDLE hSession, | |
4646 CK_BYTE_PTR pEncryptedPart, | |
4647 CK_ULONG ulEncryptedPartLen, | |
4648 CK_BYTE_PTR pPart, | |
4649 CK_ULONG_PTR pulPartLen | |
4650 ) | |
4651 { | |
4652 CK_RV error = CKR_OK; | |
4653 NSSCKFWSession *fwSession; | |
4654 | |
4655 if (!fwInstance) { | |
4656 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4657 goto loser; | |
4658 } | |
4659 | |
4660 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4661 if (!fwSession) { | |
4662 error = CKR_SESSION_HANDLE_INVALID; | |
4663 goto loser; | |
4664 } | |
4665 | |
4666 error = nssCKFWSession_UpdateCombo(fwSession, | |
4667 NSSCKFWCryptoOperationType_Decrypt, | |
4668 NSSCKFWCryptoOperationType_Digest, | |
4669 NSSCKFWCryptoOperationState_Digest, | |
4670 pEncryptedPart, ulEncryptedPartLen, pPart, pulPartLen); | |
4671 | |
4672 if (CKR_OK == error) { | |
4673 return CKR_OK; | |
4674 } | |
4675 | |
4676 loser: | |
4677 /* verify error */ | |
4678 switch( error ) { | |
4679 case CKR_ARGUMENTS_BAD: | |
4680 case CKR_BUFFER_TOO_SMALL: | |
4681 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4682 case CKR_DEVICE_ERROR: | |
4683 case CKR_DEVICE_MEMORY: | |
4684 case CKR_DEVICE_REMOVED: | |
4685 case CKR_ENCRYPTED_DATA_INVALID: | |
4686 case CKR_ENCRYPTED_DATA_LEN_RANGE: | |
4687 case CKR_FUNCTION_CANCELED: | |
4688 case CKR_FUNCTION_FAILED: | |
4689 case CKR_GENERAL_ERROR: | |
4690 case CKR_HOST_MEMORY: | |
4691 case CKR_OPERATION_NOT_INITIALIZED: | |
4692 case CKR_SESSION_CLOSED: | |
4693 case CKR_SESSION_HANDLE_INVALID: | |
4694 break; | |
4695 case CKR_DATA_INVALID: | |
4696 error = CKR_ENCRYPTED_DATA_INVALID; | |
4697 break; | |
4698 case CKR_DATA_LEN_RANGE: | |
4699 error = CKR_ENCRYPTED_DATA_LEN_RANGE; | |
4700 break; | |
4701 default: | |
4702 case CKR_OK: | |
4703 error = CKR_GENERAL_ERROR; | |
4704 break; | |
4705 } | |
4706 return error; | |
4707 } | |
4708 | |
4709 /* | |
4710 * NSSCKFWC_SignEncryptUpdate | |
4711 * | |
4712 */ | |
4713 NSS_IMPLEMENT CK_RV | |
4714 NSSCKFWC_SignEncryptUpdate | |
4715 ( | |
4716 NSSCKFWInstance *fwInstance, | |
4717 CK_SESSION_HANDLE hSession, | |
4718 CK_BYTE_PTR pPart, | |
4719 CK_ULONG ulPartLen, | |
4720 CK_BYTE_PTR pEncryptedPart, | |
4721 CK_ULONG_PTR pulEncryptedPartLen | |
4722 ) | |
4723 { | |
4724 CK_RV error = CKR_OK; | |
4725 NSSCKFWSession *fwSession; | |
4726 | |
4727 if (!fwInstance) { | |
4728 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4729 goto loser; | |
4730 } | |
4731 | |
4732 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4733 if (!fwSession) { | |
4734 error = CKR_SESSION_HANDLE_INVALID; | |
4735 goto loser; | |
4736 } | |
4737 | |
4738 error = nssCKFWSession_UpdateCombo(fwSession, | |
4739 NSSCKFWCryptoOperationType_Encrypt, | |
4740 NSSCKFWCryptoOperationType_Sign, | |
4741 NSSCKFWCryptoOperationState_SignVerify, | |
4742 pPart, ulPartLen, pEncryptedPart, pulEncryptedPartLen); | |
4743 | |
4744 if (CKR_OK == error) { | |
4745 return CKR_OK; | |
4746 } | |
4747 | |
4748 loser: | |
4749 /* verify error */ | |
4750 switch( error ) { | |
4751 case CKR_ARGUMENTS_BAD: | |
4752 case CKR_BUFFER_TOO_SMALL: | |
4753 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4754 case CKR_DATA_LEN_RANGE: | |
4755 case CKR_DEVICE_ERROR: | |
4756 case CKR_DEVICE_MEMORY: | |
4757 case CKR_DEVICE_REMOVED: | |
4758 case CKR_FUNCTION_CANCELED: | |
4759 case CKR_FUNCTION_FAILED: | |
4760 case CKR_GENERAL_ERROR: | |
4761 case CKR_HOST_MEMORY: | |
4762 case CKR_OPERATION_NOT_INITIALIZED: | |
4763 case CKR_SESSION_CLOSED: | |
4764 case CKR_SESSION_HANDLE_INVALID: | |
4765 case CKR_USER_NOT_LOGGED_IN: | |
4766 break; | |
4767 default: | |
4768 case CKR_OK: | |
4769 error = CKR_GENERAL_ERROR; | |
4770 break; | |
4771 } | |
4772 return error; | |
4773 } | |
4774 | |
4775 /* | |
4776 * NSSCKFWC_DecryptVerifyUpdate | |
4777 * | |
4778 */ | |
4779 NSS_IMPLEMENT CK_RV | |
4780 NSSCKFWC_DecryptVerifyUpdate | |
4781 ( | |
4782 NSSCKFWInstance *fwInstance, | |
4783 CK_SESSION_HANDLE hSession, | |
4784 CK_BYTE_PTR pEncryptedPart, | |
4785 CK_ULONG ulEncryptedPartLen, | |
4786 CK_BYTE_PTR pPart, | |
4787 CK_ULONG_PTR pulPartLen | |
4788 ) | |
4789 { | |
4790 CK_RV error = CKR_OK; | |
4791 NSSCKFWSession *fwSession; | |
4792 | |
4793 if (!fwInstance) { | |
4794 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4795 goto loser; | |
4796 } | |
4797 | |
4798 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4799 if (!fwSession) { | |
4800 error = CKR_SESSION_HANDLE_INVALID; | |
4801 goto loser; | |
4802 } | |
4803 | |
4804 error = nssCKFWSession_UpdateCombo(fwSession, | |
4805 NSSCKFWCryptoOperationType_Decrypt, | |
4806 NSSCKFWCryptoOperationType_Verify, | |
4807 NSSCKFWCryptoOperationState_SignVerify, | |
4808 pEncryptedPart, ulEncryptedPartLen, pPart, pulPartLen); | |
4809 | |
4810 if (CKR_OK == error) { | |
4811 return CKR_OK; | |
4812 } | |
4813 | |
4814 loser: | |
4815 /* verify error */ | |
4816 switch( error ) { | |
4817 case CKR_ARGUMENTS_BAD: | |
4818 case CKR_BUFFER_TOO_SMALL: | |
4819 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4820 case CKR_DATA_LEN_RANGE: | |
4821 case CKR_DEVICE_ERROR: | |
4822 case CKR_DEVICE_MEMORY: | |
4823 case CKR_DEVICE_REMOVED: | |
4824 case CKR_ENCRYPTED_DATA_INVALID: | |
4825 case CKR_ENCRYPTED_DATA_LEN_RANGE: | |
4826 case CKR_FUNCTION_CANCELED: | |
4827 case CKR_FUNCTION_FAILED: | |
4828 case CKR_GENERAL_ERROR: | |
4829 case CKR_HOST_MEMORY: | |
4830 case CKR_OPERATION_NOT_INITIALIZED: | |
4831 case CKR_SESSION_CLOSED: | |
4832 case CKR_SESSION_HANDLE_INVALID: | |
4833 break; | |
4834 case CKR_DATA_INVALID: | |
4835 error = CKR_ENCRYPTED_DATA_INVALID; | |
4836 break; | |
4837 default: | |
4838 case CKR_OK: | |
4839 error = CKR_GENERAL_ERROR; | |
4840 break; | |
4841 } | |
4842 return error; | |
4843 } | |
4844 | |
4845 /* | |
4846 * NSSCKFWC_GenerateKey | |
4847 * | |
4848 */ | |
4849 NSS_IMPLEMENT CK_RV | |
4850 NSSCKFWC_GenerateKey | |
4851 ( | |
4852 NSSCKFWInstance *fwInstance, | |
4853 CK_SESSION_HANDLE hSession, | |
4854 CK_MECHANISM_PTR pMechanism, | |
4855 CK_ATTRIBUTE_PTR pTemplate, | |
4856 CK_ULONG ulCount, | |
4857 CK_OBJECT_HANDLE_PTR phKey | |
4858 ) | |
4859 { | |
4860 CK_RV error = CKR_OK; | |
4861 NSSCKFWSession *fwSession; | |
4862 NSSCKFWObject *fwObject; | |
4863 NSSCKFWSlot *fwSlot; | |
4864 NSSCKFWToken *fwToken; | |
4865 NSSCKFWMechanism *fwMechanism; | |
4866 | |
4867 if (!fwInstance) { | |
4868 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4869 goto loser; | |
4870 } | |
4871 | |
4872 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4873 if (!fwSession) { | |
4874 error = CKR_SESSION_HANDLE_INVALID; | |
4875 goto loser; | |
4876 } | |
4877 | |
4878 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
4879 if (!fwSlot) { | |
4880 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
4881 goto loser; | |
4882 } | |
4883 | |
4884 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
4885 error = CKR_TOKEN_NOT_PRESENT; | |
4886 goto loser; | |
4887 } | |
4888 | |
4889 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
4890 if (!fwToken) { | |
4891 goto loser; | |
4892 } | |
4893 | |
4894 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
4895 if (!fwMechanism) { | |
4896 goto loser; | |
4897 } | |
4898 | |
4899 fwObject = nssCKFWMechanism_GenerateKey( | |
4900 fwMechanism, | |
4901 pMechanism, | |
4902 fwSession, | |
4903 pTemplate, | |
4904 ulCount, | |
4905 &error); | |
4906 | |
4907 nssCKFWMechanism_Destroy(fwMechanism); | |
4908 if (!fwObject) { | |
4909 goto loser; | |
4910 } | |
4911 *phKey= nssCKFWInstance_CreateObjectHandle(fwInstance, fwObject, &error); | |
4912 | |
4913 if (CKR_OK == error) { | |
4914 return CKR_OK; | |
4915 } | |
4916 | |
4917 loser: | |
4918 /* verify error */ | |
4919 switch( error ) { | |
4920 case CKR_ARGUMENTS_BAD: | |
4921 case CKR_ATTRIBUTE_READ_ONLY: | |
4922 case CKR_ATTRIBUTE_TYPE_INVALID: | |
4923 case CKR_ATTRIBUTE_VALUE_INVALID: | |
4924 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
4925 case CKR_DEVICE_ERROR: | |
4926 case CKR_DEVICE_MEMORY: | |
4927 case CKR_DEVICE_REMOVED: | |
4928 case CKR_FUNCTION_CANCELED: | |
4929 case CKR_FUNCTION_FAILED: | |
4930 case CKR_GENERAL_ERROR: | |
4931 case CKR_HOST_MEMORY: | |
4932 case CKR_MECHANISM_INVALID: | |
4933 case CKR_MECHANISM_PARAM_INVALID: | |
4934 case CKR_OPERATION_ACTIVE: | |
4935 case CKR_PIN_EXPIRED: | |
4936 case CKR_SESSION_CLOSED: | |
4937 case CKR_SESSION_HANDLE_INVALID: | |
4938 case CKR_SESSION_READ_ONLY: | |
4939 case CKR_TEMPLATE_INCOMPLETE: | |
4940 case CKR_TEMPLATE_INCONSISTENT: | |
4941 case CKR_TOKEN_WRITE_PROTECTED: | |
4942 case CKR_USER_NOT_LOGGED_IN: | |
4943 break; | |
4944 default: | |
4945 case CKR_OK: | |
4946 error = CKR_GENERAL_ERROR; | |
4947 break; | |
4948 } | |
4949 return error; | |
4950 } | |
4951 | |
4952 /* | |
4953 * NSSCKFWC_GenerateKeyPair | |
4954 * | |
4955 */ | |
4956 NSS_IMPLEMENT CK_RV | |
4957 NSSCKFWC_GenerateKeyPair | |
4958 ( | |
4959 NSSCKFWInstance *fwInstance, | |
4960 CK_SESSION_HANDLE hSession, | |
4961 CK_MECHANISM_PTR pMechanism, | |
4962 CK_ATTRIBUTE_PTR pPublicKeyTemplate, | |
4963 CK_ULONG ulPublicKeyAttributeCount, | |
4964 CK_ATTRIBUTE_PTR pPrivateKeyTemplate, | |
4965 CK_ULONG ulPrivateKeyAttributeCount, | |
4966 CK_OBJECT_HANDLE_PTR phPublicKey, | |
4967 CK_OBJECT_HANDLE_PTR phPrivateKey | |
4968 ) | |
4969 { | |
4970 CK_RV error = CKR_OK; | |
4971 NSSCKFWSession *fwSession; | |
4972 NSSCKFWObject *fwPrivateKeyObject; | |
4973 NSSCKFWObject *fwPublicKeyObject; | |
4974 NSSCKFWSlot *fwSlot; | |
4975 NSSCKFWToken *fwToken; | |
4976 NSSCKFWMechanism *fwMechanism; | |
4977 | |
4978 if (!fwInstance) { | |
4979 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
4980 goto loser; | |
4981 } | |
4982 | |
4983 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
4984 if (!fwSession) { | |
4985 error = CKR_SESSION_HANDLE_INVALID; | |
4986 goto loser; | |
4987 } | |
4988 | |
4989 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
4990 if (!fwSlot) { | |
4991 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
4992 goto loser; | |
4993 } | |
4994 | |
4995 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
4996 error = CKR_TOKEN_NOT_PRESENT; | |
4997 goto loser; | |
4998 } | |
4999 | |
5000 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
5001 if (!fwToken) { | |
5002 goto loser; | |
5003 } | |
5004 | |
5005 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
5006 if (!fwMechanism) { | |
5007 goto loser; | |
5008 } | |
5009 | |
5010 error= nssCKFWMechanism_GenerateKeyPair( | |
5011 fwMechanism, | |
5012 pMechanism, | |
5013 fwSession, | |
5014 pPublicKeyTemplate, | |
5015 ulPublicKeyAttributeCount, | |
5016 pPublicKeyTemplate, | |
5017 ulPublicKeyAttributeCount, | |
5018 &fwPublicKeyObject, | |
5019 &fwPrivateKeyObject); | |
5020 | |
5021 nssCKFWMechanism_Destroy(fwMechanism); | |
5022 if (CKR_OK != error) { | |
5023 goto loser; | |
5024 } | |
5025 *phPublicKey = nssCKFWInstance_CreateObjectHandle(fwInstance, | |
5026 fwPublicKeyObject, | |
5027 &error); | |
5028 if (CKR_OK != error) { | |
5029 goto loser; | |
5030 } | |
5031 *phPrivateKey = nssCKFWInstance_CreateObjectHandle(fwInstance, | |
5032 fwPrivateKeyObject, | |
5033 &error); | |
5034 if (CKR_OK == error) { | |
5035 return CKR_OK; | |
5036 } | |
5037 | |
5038 loser: | |
5039 /* verify error */ | |
5040 switch( error ) { | |
5041 case CKR_ARGUMENTS_BAD: | |
5042 case CKR_ATTRIBUTE_READ_ONLY: | |
5043 case CKR_ATTRIBUTE_TYPE_INVALID: | |
5044 case CKR_ATTRIBUTE_VALUE_INVALID: | |
5045 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
5046 case CKR_DEVICE_ERROR: | |
5047 case CKR_DEVICE_MEMORY: | |
5048 case CKR_DEVICE_REMOVED: | |
5049 case CKR_DOMAIN_PARAMS_INVALID: | |
5050 case CKR_FUNCTION_CANCELED: | |
5051 case CKR_FUNCTION_FAILED: | |
5052 case CKR_GENERAL_ERROR: | |
5053 case CKR_HOST_MEMORY: | |
5054 case CKR_MECHANISM_INVALID: | |
5055 case CKR_MECHANISM_PARAM_INVALID: | |
5056 case CKR_OPERATION_ACTIVE: | |
5057 case CKR_PIN_EXPIRED: | |
5058 case CKR_SESSION_CLOSED: | |
5059 case CKR_SESSION_HANDLE_INVALID: | |
5060 case CKR_SESSION_READ_ONLY: | |
5061 case CKR_TEMPLATE_INCOMPLETE: | |
5062 case CKR_TEMPLATE_INCONSISTENT: | |
5063 case CKR_TOKEN_WRITE_PROTECTED: | |
5064 case CKR_USER_NOT_LOGGED_IN: | |
5065 break; | |
5066 default: | |
5067 case CKR_OK: | |
5068 error = CKR_GENERAL_ERROR; | |
5069 break; | |
5070 } | |
5071 return error; | |
5072 } | |
5073 | |
5074 /* | |
5075 * NSSCKFWC_WrapKey | |
5076 * | |
5077 */ | |
5078 NSS_IMPLEMENT CK_RV | |
5079 NSSCKFWC_WrapKey | |
5080 ( | |
5081 NSSCKFWInstance *fwInstance, | |
5082 CK_SESSION_HANDLE hSession, | |
5083 CK_MECHANISM_PTR pMechanism, | |
5084 CK_OBJECT_HANDLE hWrappingKey, | |
5085 CK_OBJECT_HANDLE hKey, | |
5086 CK_BYTE_PTR pWrappedKey, | |
5087 CK_ULONG_PTR pulWrappedKeyLen | |
5088 ) | |
5089 { | |
5090 CK_RV error = CKR_OK; | |
5091 NSSCKFWSession *fwSession; | |
5092 NSSCKFWObject *fwKeyObject; | |
5093 NSSCKFWObject *fwWrappingKeyObject; | |
5094 NSSCKFWSlot *fwSlot; | |
5095 NSSCKFWToken *fwToken; | |
5096 NSSCKFWMechanism *fwMechanism; | |
5097 NSSItem wrappedKey; | |
5098 CK_ULONG wrappedKeyLength = 0; | |
5099 | |
5100 if (!fwInstance) { | |
5101 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
5102 goto loser; | |
5103 } | |
5104 | |
5105 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
5106 if (!fwSession) { | |
5107 error = CKR_SESSION_HANDLE_INVALID; | |
5108 goto loser; | |
5109 } | |
5110 | |
5111 fwWrappingKeyObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, | |
5112 hWrappingKey); | |
5113 if (!fwWrappingKeyObject) { | |
5114 error = CKR_WRAPPING_KEY_HANDLE_INVALID; | |
5115 goto loser; | |
5116 } | |
5117 | |
5118 fwKeyObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hKey); | |
5119 if (!fwKeyObject) { | |
5120 error = CKR_KEY_HANDLE_INVALID; | |
5121 goto loser; | |
5122 } | |
5123 | |
5124 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
5125 if (!fwSlot) { | |
5126 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
5127 goto loser; | |
5128 } | |
5129 | |
5130 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
5131 error = CKR_TOKEN_NOT_PRESENT; | |
5132 goto loser; | |
5133 } | |
5134 | |
5135 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
5136 if (!fwToken) { | |
5137 goto loser; | |
5138 } | |
5139 | |
5140 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
5141 if (!fwMechanism) { | |
5142 goto loser; | |
5143 } | |
5144 | |
5145 /* | |
5146 * first get the length... | |
5147 */ | |
5148 wrappedKeyLength = nssCKFWMechanism_GetWrapKeyLength( | |
5149 fwMechanism, | |
5150 pMechanism, | |
5151 fwSession, | |
5152 fwWrappingKeyObject, | |
5153 fwKeyObject, | |
5154 &error); | |
5155 if ((CK_ULONG) 0 == wrappedKeyLength) { | |
5156 nssCKFWMechanism_Destroy(fwMechanism); | |
5157 goto loser; | |
5158 } | |
5159 if ((CK_BYTE_PTR)NULL == pWrappedKey) { | |
5160 *pulWrappedKeyLen = wrappedKeyLength; | |
5161 nssCKFWMechanism_Destroy(fwMechanism); | |
5162 return CKR_OK; | |
5163 } | |
5164 if (wrappedKeyLength > *pulWrappedKeyLen) { | |
5165 *pulWrappedKeyLen = wrappedKeyLength; | |
5166 nssCKFWMechanism_Destroy(fwMechanism); | |
5167 error = CKR_BUFFER_TOO_SMALL; | |
5168 goto loser; | |
5169 } | |
5170 | |
5171 | |
5172 wrappedKey.data = pWrappedKey; | |
5173 wrappedKey.size = wrappedKeyLength; | |
5174 | |
5175 error = nssCKFWMechanism_WrapKey( | |
5176 fwMechanism, | |
5177 pMechanism, | |
5178 fwSession, | |
5179 fwWrappingKeyObject, | |
5180 fwKeyObject, | |
5181 &wrappedKey); | |
5182 | |
5183 nssCKFWMechanism_Destroy(fwMechanism); | |
5184 *pulWrappedKeyLen = wrappedKey.size; | |
5185 | |
5186 if (CKR_OK == error) { | |
5187 return CKR_OK; | |
5188 } | |
5189 | |
5190 loser: | |
5191 /* verify error */ | |
5192 switch( error ) { | |
5193 case CKR_ARGUMENTS_BAD: | |
5194 case CKR_BUFFER_TOO_SMALL: | |
5195 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
5196 case CKR_DEVICE_ERROR: | |
5197 case CKR_DEVICE_MEMORY: | |
5198 case CKR_DEVICE_REMOVED: | |
5199 case CKR_FUNCTION_CANCELED: | |
5200 case CKR_FUNCTION_FAILED: | |
5201 case CKR_GENERAL_ERROR: | |
5202 case CKR_HOST_MEMORY: | |
5203 case CKR_KEY_HANDLE_INVALID: | |
5204 case CKR_KEY_NOT_WRAPPABLE: | |
5205 case CKR_KEY_SIZE_RANGE: | |
5206 case CKR_KEY_UNEXTRACTABLE: | |
5207 case CKR_MECHANISM_INVALID: | |
5208 case CKR_MECHANISM_PARAM_INVALID: | |
5209 case CKR_OPERATION_ACTIVE: | |
5210 case CKR_PIN_EXPIRED: | |
5211 case CKR_SESSION_CLOSED: | |
5212 case CKR_SESSION_HANDLE_INVALID: | |
5213 case CKR_WRAPPING_KEY_HANDLE_INVALID: | |
5214 case CKR_WRAPPING_KEY_SIZE_RANGE: | |
5215 case CKR_WRAPPING_KEY_TYPE_INCONSISTENT: | |
5216 break; | |
5217 case CKR_KEY_TYPE_INCONSISTENT: | |
5218 error = CKR_WRAPPING_KEY_TYPE_INCONSISTENT; | |
5219 break; | |
5220 default: | |
5221 case CKR_OK: | |
5222 error = CKR_GENERAL_ERROR; | |
5223 break; | |
5224 } | |
5225 return error; | |
5226 } | |
5227 | |
5228 /* | |
5229 * NSSCKFWC_UnwrapKey | |
5230 * | |
5231 */ | |
5232 NSS_IMPLEMENT CK_RV | |
5233 NSSCKFWC_UnwrapKey | |
5234 ( | |
5235 NSSCKFWInstance *fwInstance, | |
5236 CK_SESSION_HANDLE hSession, | |
5237 CK_MECHANISM_PTR pMechanism, | |
5238 CK_OBJECT_HANDLE hUnwrappingKey, | |
5239 CK_BYTE_PTR pWrappedKey, | |
5240 CK_ULONG ulWrappedKeyLen, | |
5241 CK_ATTRIBUTE_PTR pTemplate, | |
5242 CK_ULONG ulAttributeCount, | |
5243 CK_OBJECT_HANDLE_PTR phKey | |
5244 ) | |
5245 { | |
5246 CK_RV error = CKR_OK; | |
5247 NSSCKFWSession *fwSession; | |
5248 NSSCKFWObject *fwObject; | |
5249 NSSCKFWObject *fwWrappingKeyObject; | |
5250 NSSCKFWSlot *fwSlot; | |
5251 NSSCKFWToken *fwToken; | |
5252 NSSCKFWMechanism *fwMechanism; | |
5253 NSSItem wrappedKey; | |
5254 | |
5255 if (!fwInstance) { | |
5256 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
5257 goto loser; | |
5258 } | |
5259 | |
5260 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
5261 if (!fwSession) { | |
5262 error = CKR_SESSION_HANDLE_INVALID; | |
5263 goto loser; | |
5264 } | |
5265 | |
5266 fwWrappingKeyObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, | |
5267 hUnwrappingKey); | |
5268 if (!fwWrappingKeyObject) { | |
5269 error = CKR_WRAPPING_KEY_HANDLE_INVALID; | |
5270 goto loser; | |
5271 } | |
5272 | |
5273 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
5274 if (!fwSlot) { | |
5275 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
5276 goto loser; | |
5277 } | |
5278 | |
5279 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
5280 error = CKR_TOKEN_NOT_PRESENT; | |
5281 goto loser; | |
5282 } | |
5283 | |
5284 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
5285 if (!fwToken) { | |
5286 goto loser; | |
5287 } | |
5288 | |
5289 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
5290 if (!fwMechanism) { | |
5291 goto loser; | |
5292 } | |
5293 | |
5294 wrappedKey.data = pWrappedKey; | |
5295 wrappedKey.size = ulWrappedKeyLen; | |
5296 | |
5297 fwObject = nssCKFWMechanism_UnwrapKey( | |
5298 fwMechanism, | |
5299 pMechanism, | |
5300 fwSession, | |
5301 fwWrappingKeyObject, | |
5302 &wrappedKey, | |
5303 pTemplate, | |
5304 ulAttributeCount, | |
5305 &error); | |
5306 | |
5307 nssCKFWMechanism_Destroy(fwMechanism); | |
5308 if (!fwObject) { | |
5309 goto loser; | |
5310 } | |
5311 *phKey = nssCKFWInstance_CreateObjectHandle(fwInstance, fwObject, &error); | |
5312 | |
5313 if (CKR_OK == error) { | |
5314 return CKR_OK; | |
5315 } | |
5316 | |
5317 loser: | |
5318 /* verify error */ | |
5319 switch( error ) { | |
5320 case CKR_ARGUMENTS_BAD: | |
5321 case CKR_ATTRIBUTE_READ_ONLY: | |
5322 case CKR_ATTRIBUTE_TYPE_INVALID: | |
5323 case CKR_ATTRIBUTE_VALUE_INVALID: | |
5324 case CKR_BUFFER_TOO_SMALL: | |
5325 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
5326 case CKR_DEVICE_ERROR: | |
5327 case CKR_DEVICE_MEMORY: | |
5328 case CKR_DEVICE_REMOVED: | |
5329 case CKR_DOMAIN_PARAMS_INVALID: | |
5330 case CKR_FUNCTION_CANCELED: | |
5331 case CKR_FUNCTION_FAILED: | |
5332 case CKR_GENERAL_ERROR: | |
5333 case CKR_HOST_MEMORY: | |
5334 case CKR_MECHANISM_INVALID: | |
5335 case CKR_MECHANISM_PARAM_INVALID: | |
5336 case CKR_OPERATION_ACTIVE: | |
5337 case CKR_PIN_EXPIRED: | |
5338 case CKR_SESSION_CLOSED: | |
5339 case CKR_SESSION_HANDLE_INVALID: | |
5340 case CKR_SESSION_READ_ONLY: | |
5341 case CKR_TEMPLATE_INCOMPLETE: | |
5342 case CKR_TEMPLATE_INCONSISTENT: | |
5343 case CKR_TOKEN_WRITE_PROTECTED: | |
5344 case CKR_UNWRAPPING_KEY_HANDLE_INVALID: | |
5345 case CKR_UNWRAPPING_KEY_SIZE_RANGE: | |
5346 case CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT: | |
5347 case CKR_USER_NOT_LOGGED_IN: | |
5348 case CKR_WRAPPED_KEY_INVALID: | |
5349 case CKR_WRAPPED_KEY_LEN_RANGE: | |
5350 break; | |
5351 case CKR_KEY_HANDLE_INVALID: | |
5352 error = CKR_UNWRAPPING_KEY_HANDLE_INVALID; | |
5353 break; | |
5354 case CKR_KEY_SIZE_RANGE: | |
5355 error = CKR_UNWRAPPING_KEY_SIZE_RANGE; | |
5356 break; | |
5357 case CKR_KEY_TYPE_INCONSISTENT: | |
5358 error = CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT; | |
5359 break; | |
5360 case CKR_ENCRYPTED_DATA_INVALID: | |
5361 error = CKR_WRAPPED_KEY_INVALID; | |
5362 break; | |
5363 case CKR_ENCRYPTED_DATA_LEN_RANGE: | |
5364 error = CKR_WRAPPED_KEY_LEN_RANGE; | |
5365 break; | |
5366 default: | |
5367 case CKR_OK: | |
5368 error = CKR_GENERAL_ERROR; | |
5369 break; | |
5370 } | |
5371 return error; | |
5372 } | |
5373 | |
5374 /* | |
5375 * NSSCKFWC_DeriveKey | |
5376 * | |
5377 */ | |
5378 NSS_IMPLEMENT CK_RV | |
5379 NSSCKFWC_DeriveKey | |
5380 ( | |
5381 NSSCKFWInstance *fwInstance, | |
5382 CK_SESSION_HANDLE hSession, | |
5383 CK_MECHANISM_PTR pMechanism, | |
5384 CK_OBJECT_HANDLE hBaseKey, | |
5385 CK_ATTRIBUTE_PTR pTemplate, | |
5386 CK_ULONG ulAttributeCount, | |
5387 CK_OBJECT_HANDLE_PTR phKey | |
5388 ) | |
5389 { | |
5390 CK_RV error = CKR_OK; | |
5391 NSSCKFWSession *fwSession; | |
5392 NSSCKFWObject *fwObject; | |
5393 NSSCKFWObject *fwBaseKeyObject; | |
5394 NSSCKFWSlot *fwSlot; | |
5395 NSSCKFWToken *fwToken; | |
5396 NSSCKFWMechanism *fwMechanism; | |
5397 | |
5398 if (!fwInstance) { | |
5399 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
5400 goto loser; | |
5401 } | |
5402 | |
5403 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
5404 if (!fwSession) { | |
5405 error = CKR_SESSION_HANDLE_INVALID; | |
5406 goto loser; | |
5407 } | |
5408 | |
5409 fwBaseKeyObject = nssCKFWInstance_ResolveObjectHandle(fwInstance, hBaseKey); | |
5410 if (!fwBaseKeyObject) { | |
5411 error = CKR_KEY_HANDLE_INVALID; | |
5412 goto loser; | |
5413 } | |
5414 | |
5415 fwSlot = nssCKFWSession_GetFWSlot(fwSession); | |
5416 if (!fwSlot) { | |
5417 error = CKR_GENERAL_ERROR; /* should never happen! */ | |
5418 goto loser; | |
5419 } | |
5420 | |
5421 if( CK_TRUE != nssCKFWSlot_GetTokenPresent(fwSlot) ) { | |
5422 error = CKR_TOKEN_NOT_PRESENT; | |
5423 goto loser; | |
5424 } | |
5425 | |
5426 fwToken = nssCKFWSlot_GetToken(fwSlot, &error); | |
5427 if (!fwToken) { | |
5428 goto loser; | |
5429 } | |
5430 | |
5431 fwMechanism = nssCKFWToken_GetMechanism(fwToken, pMechanism->mechanism, &error
); | |
5432 if (!fwMechanism) { | |
5433 goto loser; | |
5434 } | |
5435 | |
5436 fwObject = nssCKFWMechanism_DeriveKey( | |
5437 fwMechanism, | |
5438 pMechanism, | |
5439 fwSession, | |
5440 fwBaseKeyObject, | |
5441 pTemplate, | |
5442 ulAttributeCount, | |
5443 &error); | |
5444 | |
5445 nssCKFWMechanism_Destroy(fwMechanism); | |
5446 if (!fwObject) { | |
5447 goto loser; | |
5448 } | |
5449 *phKey = nssCKFWInstance_CreateObjectHandle(fwInstance, fwObject, &error); | |
5450 | |
5451 if (CKR_OK == error) { | |
5452 return CKR_OK; | |
5453 } | |
5454 | |
5455 loser: | |
5456 /* verify error */ | |
5457 switch( error ) { | |
5458 case CKR_ARGUMENTS_BAD: | |
5459 case CKR_ATTRIBUTE_READ_ONLY: | |
5460 case CKR_ATTRIBUTE_TYPE_INVALID: | |
5461 case CKR_ATTRIBUTE_VALUE_INVALID: | |
5462 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
5463 case CKR_DEVICE_ERROR: | |
5464 case CKR_DEVICE_MEMORY: | |
5465 case CKR_DEVICE_REMOVED: | |
5466 case CKR_DOMAIN_PARAMS_INVALID: | |
5467 case CKR_FUNCTION_CANCELED: | |
5468 case CKR_FUNCTION_FAILED: | |
5469 case CKR_GENERAL_ERROR: | |
5470 case CKR_HOST_MEMORY: | |
5471 case CKR_KEY_HANDLE_INVALID: | |
5472 case CKR_KEY_SIZE_RANGE: | |
5473 case CKR_KEY_TYPE_INCONSISTENT: | |
5474 case CKR_MECHANISM_INVALID: | |
5475 case CKR_MECHANISM_PARAM_INVALID: | |
5476 case CKR_OPERATION_ACTIVE: | |
5477 case CKR_PIN_EXPIRED: | |
5478 case CKR_SESSION_CLOSED: | |
5479 case CKR_SESSION_HANDLE_INVALID: | |
5480 case CKR_SESSION_READ_ONLY: | |
5481 case CKR_TEMPLATE_INCOMPLETE: | |
5482 case CKR_TEMPLATE_INCONSISTENT: | |
5483 case CKR_TOKEN_WRITE_PROTECTED: | |
5484 case CKR_USER_NOT_LOGGED_IN: | |
5485 break; | |
5486 default: | |
5487 case CKR_OK: | |
5488 error = CKR_GENERAL_ERROR; | |
5489 break; | |
5490 } | |
5491 return error; | |
5492 } | |
5493 | |
5494 /* | |
5495 * NSSCKFWC_SeedRandom | |
5496 * | |
5497 */ | |
5498 NSS_IMPLEMENT CK_RV | |
5499 NSSCKFWC_SeedRandom | |
5500 ( | |
5501 NSSCKFWInstance *fwInstance, | |
5502 CK_SESSION_HANDLE hSession, | |
5503 CK_BYTE_PTR pSeed, | |
5504 CK_ULONG ulSeedLen | |
5505 ) | |
5506 { | |
5507 CK_RV error = CKR_OK; | |
5508 NSSCKFWSession *fwSession; | |
5509 NSSItem seed; | |
5510 | |
5511 if (!fwInstance) { | |
5512 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
5513 goto loser; | |
5514 } | |
5515 | |
5516 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
5517 if (!fwSession) { | |
5518 error = CKR_SESSION_HANDLE_INVALID; | |
5519 goto loser; | |
5520 } | |
5521 | |
5522 if( (CK_BYTE_PTR)CK_NULL_PTR == pSeed ) { | |
5523 error = CKR_ARGUMENTS_BAD; | |
5524 goto loser; | |
5525 } | |
5526 | |
5527 /* We could read through the buffer in a Purify trap */ | |
5528 | |
5529 seed.size = (PRUint32)ulSeedLen; | |
5530 seed.data = (void *)pSeed; | |
5531 | |
5532 error = nssCKFWSession_SeedRandom(fwSession, &seed); | |
5533 | |
5534 if( CKR_OK != error ) { | |
5535 goto loser; | |
5536 } | |
5537 | |
5538 return CKR_OK; | |
5539 | |
5540 loser: | |
5541 switch( error ) { | |
5542 case CKR_SESSION_CLOSED: | |
5543 /* destroy session? */ | |
5544 break; | |
5545 case CKR_DEVICE_REMOVED: | |
5546 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
5547 break; | |
5548 case CKR_ARGUMENTS_BAD: | |
5549 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
5550 case CKR_DEVICE_ERROR: | |
5551 case CKR_DEVICE_MEMORY: | |
5552 case CKR_FUNCTION_CANCELED: | |
5553 case CKR_FUNCTION_FAILED: | |
5554 case CKR_GENERAL_ERROR: | |
5555 case CKR_HOST_MEMORY: | |
5556 case CKR_OPERATION_ACTIVE: | |
5557 case CKR_RANDOM_SEED_NOT_SUPPORTED: | |
5558 case CKR_RANDOM_NO_RNG: | |
5559 case CKR_SESSION_HANDLE_INVALID: | |
5560 case CKR_USER_NOT_LOGGED_IN: | |
5561 break; | |
5562 default: | |
5563 case CKR_OK: | |
5564 error = CKR_GENERAL_ERROR; | |
5565 break; | |
5566 } | |
5567 | |
5568 return error; | |
5569 } | |
5570 | |
5571 /* | |
5572 * NSSCKFWC_GenerateRandom | |
5573 * | |
5574 */ | |
5575 NSS_IMPLEMENT CK_RV | |
5576 NSSCKFWC_GenerateRandom | |
5577 ( | |
5578 NSSCKFWInstance *fwInstance, | |
5579 CK_SESSION_HANDLE hSession, | |
5580 CK_BYTE_PTR pRandomData, | |
5581 CK_ULONG ulRandomLen | |
5582 ) | |
5583 { | |
5584 CK_RV error = CKR_OK; | |
5585 NSSCKFWSession *fwSession; | |
5586 NSSItem buffer; | |
5587 | |
5588 if (!fwInstance) { | |
5589 error = CKR_CRYPTOKI_NOT_INITIALIZED; | |
5590 goto loser; | |
5591 } | |
5592 | |
5593 fwSession = nssCKFWInstance_ResolveSessionHandle(fwInstance, hSession); | |
5594 if (!fwSession) { | |
5595 error = CKR_SESSION_HANDLE_INVALID; | |
5596 goto loser; | |
5597 } | |
5598 | |
5599 if( (CK_BYTE_PTR)CK_NULL_PTR == pRandomData ) { | |
5600 error = CKR_ARGUMENTS_BAD; | |
5601 goto loser; | |
5602 } | |
5603 | |
5604 /* | |
5605 * A purify error here indicates caller error. | |
5606 */ | |
5607 (void)nsslibc_memset(pRandomData, 0, ulRandomLen); | |
5608 | |
5609 buffer.size = (PRUint32)ulRandomLen; | |
5610 buffer.data = (void *)pRandomData; | |
5611 | |
5612 error = nssCKFWSession_GetRandom(fwSession, &buffer); | |
5613 | |
5614 if( CKR_OK != error ) { | |
5615 goto loser; | |
5616 } | |
5617 | |
5618 return CKR_OK; | |
5619 | |
5620 loser: | |
5621 switch( error ) { | |
5622 case CKR_SESSION_CLOSED: | |
5623 /* destroy session? */ | |
5624 break; | |
5625 case CKR_DEVICE_REMOVED: | |
5626 /* (void)nssCKFWToken_Destroy(fwToken); */ | |
5627 break; | |
5628 case CKR_ARGUMENTS_BAD: | |
5629 case CKR_CRYPTOKI_NOT_INITIALIZED: | |
5630 case CKR_DEVICE_ERROR: | |
5631 case CKR_DEVICE_MEMORY: | |
5632 case CKR_FUNCTION_CANCELED: | |
5633 case CKR_FUNCTION_FAILED: | |
5634 case CKR_GENERAL_ERROR: | |
5635 case CKR_HOST_MEMORY: | |
5636 case CKR_OPERATION_ACTIVE: | |
5637 case CKR_RANDOM_NO_RNG: | |
5638 case CKR_SESSION_HANDLE_INVALID: | |
5639 case CKR_USER_NOT_LOGGED_IN: | |
5640 break; | |
5641 default: | |
5642 case CKR_OK: | |
5643 error = CKR_GENERAL_ERROR; | |
5644 break; | |
5645 } | |
5646 | |
5647 return error; | |
5648 } | |
5649 | |
5650 /* | |
5651 * NSSCKFWC_GetFunctionStatus | |
5652 * | |
5653 */ | |
5654 NSS_IMPLEMENT CK_RV | |
5655 NSSCKFWC_GetFunctionStatus | |
5656 ( | |
5657 NSSCKFWInstance *fwInstance, | |
5658 CK_SESSION_HANDLE hSession | |
5659 ) | |
5660 { | |
5661 return CKR_FUNCTION_NOT_PARALLEL; | |
5662 } | |
5663 | |
5664 /* | |
5665 * NSSCKFWC_CancelFunction | |
5666 * | |
5667 */ | |
5668 NSS_IMPLEMENT CK_RV | |
5669 NSSCKFWC_CancelFunction | |
5670 ( | |
5671 NSSCKFWInstance *fwInstance, | |
5672 CK_SESSION_HANDLE hSession | |
5673 ) | |
5674 { | |
5675 return CKR_FUNCTION_NOT_PARALLEL; | |
5676 } | |
OLD | NEW |