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

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

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

Powered by Google App Engine
This is Rietveld 408576698