1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/ckfw/slot.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,723 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +/* 1.9 + * slot.c 1.10 + * 1.11 + * This file implements the NSSCKFWSlot type and methods. 1.12 + */ 1.13 + 1.14 +#ifndef CK_T 1.15 +#include "ck.h" 1.16 +#endif /* CK_T */ 1.17 + 1.18 +/* 1.19 + * NSSCKFWSlot 1.20 + * 1.21 + * -- create/destroy -- 1.22 + * nssCKFWSlot_Create 1.23 + * nssCKFWSlot_Destroy 1.24 + * 1.25 + * -- public accessors -- 1.26 + * NSSCKFWSlot_GetMDSlot 1.27 + * NSSCKFWSlot_GetFWInstance 1.28 + * NSSCKFWSlot_GetMDInstance 1.29 + * 1.30 + * -- implement public accessors -- 1.31 + * nssCKFWSlot_GetMDSlot 1.32 + * nssCKFWSlot_GetFWInstance 1.33 + * nssCKFWSlot_GetMDInstance 1.34 + * 1.35 + * -- private accessors -- 1.36 + * nssCKFWSlot_GetSlotID 1.37 + * nssCKFWSlot_ClearToken 1.38 + * 1.39 + * -- module fronts -- 1.40 + * nssCKFWSlot_GetSlotDescription 1.41 + * nssCKFWSlot_GetManufacturerID 1.42 + * nssCKFWSlot_GetTokenPresent 1.43 + * nssCKFWSlot_GetRemovableDevice 1.44 + * nssCKFWSlot_GetHardwareSlot 1.45 + * nssCKFWSlot_GetHardwareVersion 1.46 + * nssCKFWSlot_GetFirmwareVersion 1.47 + * nssCKFWSlot_InitToken 1.48 + * nssCKFWSlot_GetToken 1.49 + */ 1.50 + 1.51 +struct NSSCKFWSlotStr { 1.52 + NSSCKFWMutex *mutex; 1.53 + NSSCKMDSlot *mdSlot; 1.54 + NSSCKFWInstance *fwInstance; 1.55 + NSSCKMDInstance *mdInstance; 1.56 + CK_SLOT_ID slotID; 1.57 + 1.58 + /* 1.59 + * Everything above is set at creation time, and then not modified. 1.60 + * The invariants the mutex protects are: 1.61 + * 1.62 + * 1) Each of the cached descriptions (versions, etc.) are in an 1.63 + * internally consistant state. 1.64 + * 1.65 + * 2) The fwToken points to the token currently in the slot, and 1.66 + * it is in a consistant state. 1.67 + * 1.68 + * Note that the calls accessing the cached descriptions will 1.69 + * call the NSSCKMDSlot methods with the mutex locked. Those 1.70 + * methods may then call the public NSSCKFWSlot routines. Those 1.71 + * public routines only access the constant data above, so there's 1.72 + * no problem. But be careful if you add to this object; mutexes 1.73 + * are in general not reentrant, so don't create deadlock situations. 1.74 + */ 1.75 + 1.76 + NSSUTF8 *slotDescription; 1.77 + NSSUTF8 *manufacturerID; 1.78 + CK_VERSION hardwareVersion; 1.79 + CK_VERSION firmwareVersion; 1.80 + NSSCKFWToken *fwToken; 1.81 +}; 1.82 + 1.83 +#ifdef DEBUG 1.84 +/* 1.85 + * But first, the pointer-tracking stuff. 1.86 + * 1.87 + * NOTE: the pointer-tracking support in NSS/base currently relies 1.88 + * upon NSPR's CallOnce support. That, however, relies upon NSPR's 1.89 + * locking, which is tied into the runtime. We need a pointer-tracker 1.90 + * implementation that uses the locks supplied through C_Initialize. 1.91 + * That support, however, can be filled in later. So for now, I'll 1.92 + * just do this routines as no-ops. 1.93 + */ 1.94 + 1.95 +static CK_RV 1.96 +slot_add_pointer 1.97 +( 1.98 + const NSSCKFWSlot *fwSlot 1.99 +) 1.100 +{ 1.101 + return CKR_OK; 1.102 +} 1.103 + 1.104 +static CK_RV 1.105 +slot_remove_pointer 1.106 +( 1.107 + const NSSCKFWSlot *fwSlot 1.108 +) 1.109 +{ 1.110 + return CKR_OK; 1.111 +} 1.112 + 1.113 +NSS_IMPLEMENT CK_RV 1.114 +nssCKFWSlot_verifyPointer 1.115 +( 1.116 + const NSSCKFWSlot *fwSlot 1.117 +) 1.118 +{ 1.119 + return CKR_OK; 1.120 +} 1.121 + 1.122 +#endif /* DEBUG */ 1.123 + 1.124 +/* 1.125 + * nssCKFWSlot_Create 1.126 + * 1.127 + */ 1.128 +NSS_IMPLEMENT NSSCKFWSlot * 1.129 +nssCKFWSlot_Create 1.130 +( 1.131 + NSSCKFWInstance *fwInstance, 1.132 + NSSCKMDSlot *mdSlot, 1.133 + CK_SLOT_ID slotID, 1.134 + CK_RV *pError 1.135 +) 1.136 +{ 1.137 + NSSCKFWSlot *fwSlot; 1.138 + NSSCKMDInstance *mdInstance; 1.139 + NSSArena *arena; 1.140 + 1.141 +#ifdef NSSDEBUG 1.142 + if (!pError) { 1.143 + return (NSSCKFWSlot *)NULL; 1.144 + } 1.145 + 1.146 + *pError = nssCKFWInstance_verifyPointer(fwInstance); 1.147 + if( CKR_OK != *pError ) { 1.148 + return (NSSCKFWSlot *)NULL; 1.149 + } 1.150 +#endif /* NSSDEBUG */ 1.151 + 1.152 + mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); 1.153 + if (!mdInstance) { 1.154 + *pError = CKR_GENERAL_ERROR; 1.155 + return (NSSCKFWSlot *)NULL; 1.156 + } 1.157 + 1.158 + arena = nssCKFWInstance_GetArena(fwInstance, pError); 1.159 + if (!arena) { 1.160 + if( CKR_OK == *pError ) { 1.161 + *pError = CKR_GENERAL_ERROR; 1.162 + } 1.163 + } 1.164 + 1.165 + fwSlot = nss_ZNEW(arena, NSSCKFWSlot); 1.166 + if (!fwSlot) { 1.167 + *pError = CKR_HOST_MEMORY; 1.168 + return (NSSCKFWSlot *)NULL; 1.169 + } 1.170 + 1.171 + fwSlot->mdSlot = mdSlot; 1.172 + fwSlot->fwInstance = fwInstance; 1.173 + fwSlot->mdInstance = mdInstance; 1.174 + fwSlot->slotID = slotID; 1.175 + 1.176 + fwSlot->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError); 1.177 + if (!fwSlot->mutex) { 1.178 + if( CKR_OK == *pError ) { 1.179 + *pError = CKR_GENERAL_ERROR; 1.180 + } 1.181 + (void)nss_ZFreeIf(fwSlot); 1.182 + return (NSSCKFWSlot *)NULL; 1.183 + } 1.184 + 1.185 + if (mdSlot->Initialize) { 1.186 + *pError = CKR_OK; 1.187 + *pError = mdSlot->Initialize(mdSlot, fwSlot, mdInstance, fwInstance); 1.188 + if( CKR_OK != *pError ) { 1.189 + (void)nssCKFWMutex_Destroy(fwSlot->mutex); 1.190 + (void)nss_ZFreeIf(fwSlot); 1.191 + return (NSSCKFWSlot *)NULL; 1.192 + } 1.193 + } 1.194 + 1.195 +#ifdef DEBUG 1.196 + *pError = slot_add_pointer(fwSlot); 1.197 + if( CKR_OK != *pError ) { 1.198 + if (mdSlot->Destroy) { 1.199 + mdSlot->Destroy(mdSlot, fwSlot, mdInstance, fwInstance); 1.200 + } 1.201 + 1.202 + (void)nssCKFWMutex_Destroy(fwSlot->mutex); 1.203 + (void)nss_ZFreeIf(fwSlot); 1.204 + return (NSSCKFWSlot *)NULL; 1.205 + } 1.206 +#endif /* DEBUG */ 1.207 + 1.208 + return fwSlot; 1.209 +} 1.210 + 1.211 +/* 1.212 + * nssCKFWSlot_Destroy 1.213 + * 1.214 + */ 1.215 +NSS_IMPLEMENT CK_RV 1.216 +nssCKFWSlot_Destroy 1.217 +( 1.218 + NSSCKFWSlot *fwSlot 1.219 +) 1.220 +{ 1.221 + CK_RV error = CKR_OK; 1.222 + 1.223 +#ifdef NSSDEBUG 1.224 + error = nssCKFWSlot_verifyPointer(fwSlot); 1.225 + if( CKR_OK != error ) { 1.226 + return error; 1.227 + } 1.228 +#endif /* NSSDEBUG */ 1.229 + if (fwSlot->fwToken) { 1.230 + nssCKFWToken_Destroy(fwSlot->fwToken); 1.231 + } 1.232 + 1.233 + (void)nssCKFWMutex_Destroy(fwSlot->mutex); 1.234 + 1.235 + if (fwSlot->mdSlot->Destroy) { 1.236 + fwSlot->mdSlot->Destroy(fwSlot->mdSlot, fwSlot, 1.237 + fwSlot->mdInstance, fwSlot->fwInstance); 1.238 + } 1.239 + 1.240 +#ifdef DEBUG 1.241 + error = slot_remove_pointer(fwSlot); 1.242 +#endif /* DEBUG */ 1.243 + (void)nss_ZFreeIf(fwSlot); 1.244 + return error; 1.245 +} 1.246 + 1.247 +/* 1.248 + * nssCKFWSlot_GetMDSlot 1.249 + * 1.250 + */ 1.251 +NSS_IMPLEMENT NSSCKMDSlot * 1.252 +nssCKFWSlot_GetMDSlot 1.253 +( 1.254 + NSSCKFWSlot *fwSlot 1.255 +) 1.256 +{ 1.257 +#ifdef NSSDEBUG 1.258 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.259 + return (NSSCKMDSlot *)NULL; 1.260 + } 1.261 +#endif /* NSSDEBUG */ 1.262 + 1.263 + return fwSlot->mdSlot; 1.264 +} 1.265 + 1.266 +/* 1.267 + * nssCKFWSlot_GetFWInstance 1.268 + * 1.269 + */ 1.270 + 1.271 +NSS_IMPLEMENT NSSCKFWInstance * 1.272 +nssCKFWSlot_GetFWInstance 1.273 +( 1.274 + NSSCKFWSlot *fwSlot 1.275 +) 1.276 +{ 1.277 +#ifdef NSSDEBUG 1.278 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.279 + return (NSSCKFWInstance *)NULL; 1.280 + } 1.281 +#endif /* NSSDEBUG */ 1.282 + 1.283 + return fwSlot->fwInstance; 1.284 +} 1.285 + 1.286 +/* 1.287 + * nssCKFWSlot_GetMDInstance 1.288 + * 1.289 + */ 1.290 + 1.291 +NSS_IMPLEMENT NSSCKMDInstance * 1.292 +nssCKFWSlot_GetMDInstance 1.293 +( 1.294 + NSSCKFWSlot *fwSlot 1.295 +) 1.296 +{ 1.297 +#ifdef NSSDEBUG 1.298 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.299 + return (NSSCKMDInstance *)NULL; 1.300 + } 1.301 +#endif /* NSSDEBUG */ 1.302 + 1.303 + return fwSlot->mdInstance; 1.304 +} 1.305 + 1.306 +/* 1.307 + * nssCKFWSlot_GetSlotID 1.308 + * 1.309 + */ 1.310 +NSS_IMPLEMENT CK_SLOT_ID 1.311 +nssCKFWSlot_GetSlotID 1.312 +( 1.313 + NSSCKFWSlot *fwSlot 1.314 +) 1.315 +{ 1.316 +#ifdef NSSDEBUG 1.317 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.318 + return (CK_SLOT_ID)0; 1.319 + } 1.320 +#endif /* NSSDEBUG */ 1.321 + 1.322 + return fwSlot->slotID; 1.323 +} 1.324 + 1.325 +/* 1.326 + * nssCKFWSlot_GetSlotDescription 1.327 + * 1.328 + */ 1.329 +NSS_IMPLEMENT CK_RV 1.330 +nssCKFWSlot_GetSlotDescription 1.331 +( 1.332 + NSSCKFWSlot *fwSlot, 1.333 + CK_CHAR slotDescription[64] 1.334 +) 1.335 +{ 1.336 + CK_RV error = CKR_OK; 1.337 + 1.338 +#ifdef NSSDEBUG 1.339 + if( (CK_CHAR_PTR)NULL == slotDescription ) { 1.340 + return CKR_ARGUMENTS_BAD; 1.341 + } 1.342 + 1.343 + error = nssCKFWSlot_verifyPointer(fwSlot); 1.344 + if( CKR_OK != error ) { 1.345 + return error; 1.346 + } 1.347 +#endif /* NSSDEBUG */ 1.348 + 1.349 + error = nssCKFWMutex_Lock(fwSlot->mutex); 1.350 + if( CKR_OK != error ) { 1.351 + return error; 1.352 + } 1.353 + 1.354 + if (!fwSlot->slotDescription) { 1.355 + if (fwSlot->mdSlot->GetSlotDescription) { 1.356 + fwSlot->slotDescription = fwSlot->mdSlot->GetSlotDescription( 1.357 + fwSlot->mdSlot, fwSlot, fwSlot->mdInstance, 1.358 + fwSlot->fwInstance, &error); 1.359 + if ((!fwSlot->slotDescription) && (CKR_OK != error)) { 1.360 + goto done; 1.361 + } 1.362 + } else { 1.363 + fwSlot->slotDescription = (NSSUTF8 *) ""; 1.364 + } 1.365 + } 1.366 + 1.367 + (void)nssUTF8_CopyIntoFixedBuffer(fwSlot->slotDescription, (char *)slotDescription, 64, ' '); 1.368 + error = CKR_OK; 1.369 + 1.370 + done: 1.371 + (void)nssCKFWMutex_Unlock(fwSlot->mutex); 1.372 + return error; 1.373 +} 1.374 + 1.375 +/* 1.376 + * nssCKFWSlot_GetManufacturerID 1.377 + * 1.378 + */ 1.379 +NSS_IMPLEMENT CK_RV 1.380 +nssCKFWSlot_GetManufacturerID 1.381 +( 1.382 + NSSCKFWSlot *fwSlot, 1.383 + CK_CHAR manufacturerID[32] 1.384 +) 1.385 +{ 1.386 + CK_RV error = CKR_OK; 1.387 + 1.388 +#ifdef NSSDEBUG 1.389 + if( (CK_CHAR_PTR)NULL == manufacturerID ) { 1.390 + return CKR_ARGUMENTS_BAD; 1.391 + } 1.392 + 1.393 + error = nssCKFWSlot_verifyPointer(fwSlot); 1.394 + if( CKR_OK != error ) { 1.395 + return error; 1.396 + } 1.397 +#endif /* NSSDEBUG */ 1.398 + 1.399 + error = nssCKFWMutex_Lock(fwSlot->mutex); 1.400 + if( CKR_OK != error ) { 1.401 + return error; 1.402 + } 1.403 + 1.404 + if (!fwSlot->manufacturerID) { 1.405 + if (fwSlot->mdSlot->GetManufacturerID) { 1.406 + fwSlot->manufacturerID = fwSlot->mdSlot->GetManufacturerID( 1.407 + fwSlot->mdSlot, fwSlot, fwSlot->mdInstance, 1.408 + fwSlot->fwInstance, &error); 1.409 + if ((!fwSlot->manufacturerID) && (CKR_OK != error)) { 1.410 + goto done; 1.411 + } 1.412 + } else { 1.413 + fwSlot->manufacturerID = (NSSUTF8 *) ""; 1.414 + } 1.415 + } 1.416 + 1.417 + (void)nssUTF8_CopyIntoFixedBuffer(fwSlot->manufacturerID, (char *)manufacturerID, 32, ' '); 1.418 + error = CKR_OK; 1.419 + 1.420 + done: 1.421 + (void)nssCKFWMutex_Unlock(fwSlot->mutex); 1.422 + return error; 1.423 +} 1.424 + 1.425 +/* 1.426 + * nssCKFWSlot_GetTokenPresent 1.427 + * 1.428 + */ 1.429 +NSS_IMPLEMENT CK_BBOOL 1.430 +nssCKFWSlot_GetTokenPresent 1.431 +( 1.432 + NSSCKFWSlot *fwSlot 1.433 +) 1.434 +{ 1.435 +#ifdef NSSDEBUG 1.436 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.437 + return CK_FALSE; 1.438 + } 1.439 +#endif /* NSSDEBUG */ 1.440 + 1.441 + if (!fwSlot->mdSlot->GetTokenPresent) { 1.442 + return CK_TRUE; 1.443 + } 1.444 + 1.445 + return fwSlot->mdSlot->GetTokenPresent(fwSlot->mdSlot, fwSlot, 1.446 + fwSlot->mdInstance, fwSlot->fwInstance); 1.447 +} 1.448 + 1.449 +/* 1.450 + * nssCKFWSlot_GetRemovableDevice 1.451 + * 1.452 + */ 1.453 +NSS_IMPLEMENT CK_BBOOL 1.454 +nssCKFWSlot_GetRemovableDevice 1.455 +( 1.456 + NSSCKFWSlot *fwSlot 1.457 +) 1.458 +{ 1.459 +#ifdef NSSDEBUG 1.460 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.461 + return CK_FALSE; 1.462 + } 1.463 +#endif /* NSSDEBUG */ 1.464 + 1.465 + if (!fwSlot->mdSlot->GetRemovableDevice) { 1.466 + return CK_FALSE; 1.467 + } 1.468 + 1.469 + return fwSlot->mdSlot->GetRemovableDevice(fwSlot->mdSlot, fwSlot, 1.470 + fwSlot->mdInstance, fwSlot->fwInstance); 1.471 +} 1.472 + 1.473 +/* 1.474 + * nssCKFWSlot_GetHardwareSlot 1.475 + * 1.476 + */ 1.477 +NSS_IMPLEMENT CK_BBOOL 1.478 +nssCKFWSlot_GetHardwareSlot 1.479 +( 1.480 + NSSCKFWSlot *fwSlot 1.481 +) 1.482 +{ 1.483 +#ifdef NSSDEBUG 1.484 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.485 + return CK_FALSE; 1.486 + } 1.487 +#endif /* NSSDEBUG */ 1.488 + 1.489 + if (!fwSlot->mdSlot->GetHardwareSlot) { 1.490 + return CK_FALSE; 1.491 + } 1.492 + 1.493 + return fwSlot->mdSlot->GetHardwareSlot(fwSlot->mdSlot, fwSlot, 1.494 + fwSlot->mdInstance, fwSlot->fwInstance); 1.495 +} 1.496 + 1.497 +/* 1.498 + * nssCKFWSlot_GetHardwareVersion 1.499 + * 1.500 + */ 1.501 +NSS_IMPLEMENT CK_VERSION 1.502 +nssCKFWSlot_GetHardwareVersion 1.503 +( 1.504 + NSSCKFWSlot *fwSlot 1.505 +) 1.506 +{ 1.507 + CK_VERSION rv; 1.508 + 1.509 +#ifdef NSSDEBUG 1.510 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.511 + rv.major = rv.minor = 0; 1.512 + return rv; 1.513 + } 1.514 +#endif /* NSSDEBUG */ 1.515 + 1.516 + if( CKR_OK != nssCKFWMutex_Lock(fwSlot->mutex) ) { 1.517 + rv.major = rv.minor = 0; 1.518 + return rv; 1.519 + } 1.520 + 1.521 + if( (0 != fwSlot->hardwareVersion.major) || 1.522 + (0 != fwSlot->hardwareVersion.minor) ) { 1.523 + rv = fwSlot->hardwareVersion; 1.524 + goto done; 1.525 + } 1.526 + 1.527 + if (fwSlot->mdSlot->GetHardwareVersion) { 1.528 + fwSlot->hardwareVersion = fwSlot->mdSlot->GetHardwareVersion( 1.529 + fwSlot->mdSlot, fwSlot, fwSlot->mdInstance, fwSlot->fwInstance); 1.530 + } else { 1.531 + fwSlot->hardwareVersion.major = 0; 1.532 + fwSlot->hardwareVersion.minor = 1; 1.533 + } 1.534 + 1.535 + rv = fwSlot->hardwareVersion; 1.536 + done: 1.537 + (void)nssCKFWMutex_Unlock(fwSlot->mutex); 1.538 + return rv; 1.539 +} 1.540 + 1.541 +/* 1.542 + * nssCKFWSlot_GetFirmwareVersion 1.543 + * 1.544 + */ 1.545 +NSS_IMPLEMENT CK_VERSION 1.546 +nssCKFWSlot_GetFirmwareVersion 1.547 +( 1.548 + NSSCKFWSlot *fwSlot 1.549 +) 1.550 +{ 1.551 + CK_VERSION rv; 1.552 + 1.553 +#ifdef NSSDEBUG 1.554 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.555 + rv.major = rv.minor = 0; 1.556 + return rv; 1.557 + } 1.558 +#endif /* NSSDEBUG */ 1.559 + 1.560 + if( CKR_OK != nssCKFWMutex_Lock(fwSlot->mutex) ) { 1.561 + rv.major = rv.minor = 0; 1.562 + return rv; 1.563 + } 1.564 + 1.565 + if( (0 != fwSlot->firmwareVersion.major) || 1.566 + (0 != fwSlot->firmwareVersion.minor) ) { 1.567 + rv = fwSlot->firmwareVersion; 1.568 + goto done; 1.569 + } 1.570 + 1.571 + if (fwSlot->mdSlot->GetFirmwareVersion) { 1.572 + fwSlot->firmwareVersion = fwSlot->mdSlot->GetFirmwareVersion( 1.573 + fwSlot->mdSlot, fwSlot, fwSlot->mdInstance, fwSlot->fwInstance); 1.574 + } else { 1.575 + fwSlot->firmwareVersion.major = 0; 1.576 + fwSlot->firmwareVersion.minor = 1; 1.577 + } 1.578 + 1.579 + rv = fwSlot->firmwareVersion; 1.580 + done: 1.581 + (void)nssCKFWMutex_Unlock(fwSlot->mutex); 1.582 + return rv; 1.583 +} 1.584 + 1.585 +/* 1.586 + * nssCKFWSlot_GetToken 1.587 + * 1.588 + */ 1.589 +NSS_IMPLEMENT NSSCKFWToken * 1.590 +nssCKFWSlot_GetToken 1.591 +( 1.592 + NSSCKFWSlot *fwSlot, 1.593 + CK_RV *pError 1.594 +) 1.595 +{ 1.596 + NSSCKMDToken *mdToken; 1.597 + NSSCKFWToken *fwToken; 1.598 + 1.599 +#ifdef NSSDEBUG 1.600 + if (!pError) { 1.601 + return (NSSCKFWToken *)NULL; 1.602 + } 1.603 + 1.604 + *pError = nssCKFWSlot_verifyPointer(fwSlot); 1.605 + if( CKR_OK != *pError ) { 1.606 + return (NSSCKFWToken *)NULL; 1.607 + } 1.608 +#endif /* NSSDEBUG */ 1.609 + 1.610 + *pError = nssCKFWMutex_Lock(fwSlot->mutex); 1.611 + if( CKR_OK != *pError ) { 1.612 + return (NSSCKFWToken *)NULL; 1.613 + } 1.614 + 1.615 + if (!fwSlot->fwToken) { 1.616 + if (!fwSlot->mdSlot->GetToken) { 1.617 + *pError = CKR_GENERAL_ERROR; 1.618 + fwToken = (NSSCKFWToken *)NULL; 1.619 + goto done; 1.620 + } 1.621 + 1.622 + mdToken = fwSlot->mdSlot->GetToken(fwSlot->mdSlot, fwSlot, 1.623 + fwSlot->mdInstance, fwSlot->fwInstance, pError); 1.624 + if (!mdToken) { 1.625 + if( CKR_OK == *pError ) { 1.626 + *pError = CKR_GENERAL_ERROR; 1.627 + } 1.628 + return (NSSCKFWToken *)NULL; 1.629 + } 1.630 + 1.631 + fwToken = nssCKFWToken_Create(fwSlot, mdToken, pError); 1.632 + fwSlot->fwToken = fwToken; 1.633 + } else { 1.634 + fwToken = fwSlot->fwToken; 1.635 + } 1.636 + 1.637 + done: 1.638 + (void)nssCKFWMutex_Unlock(fwSlot->mutex); 1.639 + return fwToken; 1.640 +} 1.641 + 1.642 +/* 1.643 + * nssCKFWSlot_ClearToken 1.644 + * 1.645 + */ 1.646 +NSS_IMPLEMENT void 1.647 +nssCKFWSlot_ClearToken 1.648 +( 1.649 + NSSCKFWSlot *fwSlot 1.650 +) 1.651 +{ 1.652 +#ifdef NSSDEBUG 1.653 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.654 + return; 1.655 + } 1.656 +#endif /* NSSDEBUG */ 1.657 + 1.658 + if( CKR_OK != nssCKFWMutex_Lock(fwSlot->mutex) ) { 1.659 + /* Now what? */ 1.660 + return; 1.661 + } 1.662 + 1.663 + fwSlot->fwToken = (NSSCKFWToken *)NULL; 1.664 + (void)nssCKFWMutex_Unlock(fwSlot->mutex); 1.665 + return; 1.666 +} 1.667 + 1.668 +/* 1.669 + * NSSCKFWSlot_GetMDSlot 1.670 + * 1.671 + */ 1.672 + 1.673 +NSS_IMPLEMENT NSSCKMDSlot * 1.674 +NSSCKFWSlot_GetMDSlot 1.675 +( 1.676 + NSSCKFWSlot *fwSlot 1.677 +) 1.678 +{ 1.679 +#ifdef DEBUG 1.680 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.681 + return (NSSCKMDSlot *)NULL; 1.682 + } 1.683 +#endif /* DEBUG */ 1.684 + 1.685 + return nssCKFWSlot_GetMDSlot(fwSlot); 1.686 +} 1.687 + 1.688 +/* 1.689 + * NSSCKFWSlot_GetFWInstance 1.690 + * 1.691 + */ 1.692 + 1.693 +NSS_IMPLEMENT NSSCKFWInstance * 1.694 +NSSCKFWSlot_GetFWInstance 1.695 +( 1.696 + NSSCKFWSlot *fwSlot 1.697 +) 1.698 +{ 1.699 +#ifdef DEBUG 1.700 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.701 + return (NSSCKFWInstance *)NULL; 1.702 + } 1.703 +#endif /* DEBUG */ 1.704 + 1.705 + return nssCKFWSlot_GetFWInstance(fwSlot); 1.706 +} 1.707 + 1.708 +/* 1.709 + * NSSCKFWSlot_GetMDInstance 1.710 + * 1.711 + */ 1.712 + 1.713 +NSS_IMPLEMENT NSSCKMDInstance * 1.714 +NSSCKFWSlot_GetMDInstance 1.715 +( 1.716 + NSSCKFWSlot *fwSlot 1.717 +) 1.718 +{ 1.719 +#ifdef DEBUG 1.720 + if( CKR_OK != nssCKFWSlot_verifyPointer(fwSlot) ) { 1.721 + return (NSSCKMDInstance *)NULL; 1.722 + } 1.723 +#endif /* DEBUG */ 1.724 + 1.725 + return nssCKFWSlot_GetMDInstance(fwSlot); 1.726 +}