| 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 |