OLD | NEW |
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 Loading... |
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 } |
OLD | NEW |