slot.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. /*
  5. * slot.c
  6. *
  7. * This file implements the NSSCKFWSlot type and methods.
  8. */
  9. #ifndef CK_T
  10. #include "ck.h"
  11. #endif /* CK_T */
  12. /*
  13. * NSSCKFWSlot
  14. *
  15. * -- create/destroy --
  16. * nssCKFWSlot_Create
  17. * nssCKFWSlot_Destroy
  18. *
  19. * -- public accessors --
  20. * NSSCKFWSlot_GetMDSlot
  21. * NSSCKFWSlot_GetFWInstance
  22. * NSSCKFWSlot_GetMDInstance
  23. * NSSCKFWSlot_GetSlotID
  24. *
  25. * -- implement public accessors --
  26. * nssCKFWSlot_GetMDSlot
  27. * nssCKFWSlot_GetFWInstance
  28. * nssCKFWSlot_GetMDInstance
  29. * nssCKFWSlot_GetSlotID
  30. *
  31. * -- private accessors --
  32. * nssCKFWSlot_ClearToken
  33. *
  34. * -- module fronts --
  35. * nssCKFWSlot_GetSlotDescription
  36. * nssCKFWSlot_GetManufacturerID
  37. * nssCKFWSlot_GetTokenPresent
  38. * nssCKFWSlot_GetRemovableDevice
  39. * nssCKFWSlot_GetHardwareSlot
  40. * nssCKFWSlot_GetHardwareVersion
  41. * nssCKFWSlot_GetFirmwareVersion
  42. * nssCKFWSlot_InitToken
  43. * nssCKFWSlot_GetToken
  44. */
  45. struct NSSCKFWSlotStr {
  46. NSSCKFWMutex *mutex;
  47. NSSCKMDSlot *mdSlot;
  48. NSSCKFWInstance *fwInstance;
  49. NSSCKMDInstance *mdInstance;
  50. CK_SLOT_ID slotID;
  51. /*
  52. * Everything above is set at creation time, and then not modified.
  53. * The invariants the mutex protects are:
  54. *
  55. * 1) Each of the cached descriptions (versions, etc.) are in an
  56. * internally consistant state.
  57. *
  58. * 2) The fwToken points to the token currently in the slot, and
  59. * it is in a consistant state.
  60. *
  61. * Note that the calls accessing the cached descriptions will
  62. * call the NSSCKMDSlot methods with the mutex locked. Those
  63. * methods may then call the public NSSCKFWSlot routines. Those
  64. * public routines only access the constant data above, so there's
  65. * no problem. But be careful if you add to this object; mutexes
  66. * are in general not reentrant, so don't create deadlock situations.
  67. */
  68. NSSUTF8 *slotDescription;
  69. NSSUTF8 *manufacturerID;
  70. CK_VERSION hardwareVersion;
  71. CK_VERSION firmwareVersion;
  72. NSSCKFWToken *fwToken;
  73. };
  74. #ifdef DEBUG
  75. /*
  76. * But first, the pointer-tracking stuff.
  77. *
  78. * NOTE: the pointer-tracking support in NSS/base currently relies
  79. * upon NSPR's CallOnce support. That, however, relies upon NSPR's
  80. * locking, which is tied into the runtime. We need a pointer-tracker
  81. * implementation that uses the locks supplied through C_Initialize.
  82. * That support, however, can be filled in later. So for now, I'll
  83. * just do this routines as no-ops.
  84. */
  85. static CK_RV
  86. slot_add_pointer(
  87. const NSSCKFWSlot *fwSlot)
  88. {
  89. return CKR_OK;
  90. }
  91. static CK_RV
  92. slot_remove_pointer(
  93. const NSSCKFWSlot *fwSlot)
  94. {
  95. return CKR_OK;
  96. }
  97. NSS_IMPLEMENT CK_RV
  98. nssCKFWSlot_verifyPointer(
  99. const NSSCKFWSlot *fwSlot)
  100. {
  101. return CKR_OK;
  102. }
  103. #endif /* DEBUG */
  104. /*
  105. * nssCKFWSlot_Create
  106. *
  107. */
  108. NSS_IMPLEMENT NSSCKFWSlot *
  109. nssCKFWSlot_Create(
  110. NSSCKFWInstance *fwInstance,
  111. NSSCKMDSlot *mdSlot,
  112. CK_SLOT_ID slotID,
  113. CK_RV *pError)
  114. {
  115. NSSCKFWSlot *fwSlot;
  116. NSSCKMDInstance *mdInstance;
  117. NSSArena *arena;
  118. #ifdef NSSDEBUG
  119. if (!pError) {
  120. return (NSSCKFWSlot *)NULL;
  121. }
  122. *pError = nssCKFWInstance_verifyPointer(fwInstance);
  123. if (CKR_OK != *pError) {
  124. return (NSSCKFWSlot *)NULL;
  125. }
  126. #endif /* NSSDEBUG */
  127. mdInstance = nssCKFWInstance_GetMDInstance(fwInstance);
  128. if (!mdInstance) {
  129. *pError = CKR_GENERAL_ERROR;
  130. return (NSSCKFWSlot *)NULL;
  131. }
  132. arena = nssCKFWInstance_GetArena(fwInstance, pError);
  133. if (!arena) {
  134. if (CKR_OK == *pError) {
  135. *pError = CKR_GENERAL_ERROR;
  136. }
  137. }
  138. fwSlot = nss_ZNEW(arena, NSSCKFWSlot);
  139. if (!fwSlot) {
  140. *pError = CKR_HOST_MEMORY;
  141. return (NSSCKFWSlot *)NULL;
  142. }
  143. fwSlot->mdSlot = mdSlot;
  144. fwSlot->fwInstance = fwInstance;
  145. fwSlot->mdInstance = mdInstance;
  146. fwSlot->slotID = slotID;
  147. fwSlot->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError);
  148. if (!fwSlot->mutex) {
  149. if (CKR_OK == *pError) {
  150. *pError = CKR_GENERAL_ERROR;
  151. }
  152. (void)nss_ZFreeIf(fwSlot);
  153. return (NSSCKFWSlot *)NULL;
  154. }
  155. if (mdSlot->Initialize) {
  156. *pError = CKR_OK;
  157. *pError = mdSlot->Initialize(mdSlot, fwSlot, mdInstance, fwInstance);
  158. if (CKR_OK != *pError) {
  159. (void)nssCKFWMutex_Destroy(fwSlot->mutex);
  160. (void)nss_ZFreeIf(fwSlot);
  161. return (NSSCKFWSlot *)NULL;
  162. }
  163. }
  164. #ifdef DEBUG
  165. *pError = slot_add_pointer(fwSlot);
  166. if (CKR_OK != *pError) {
  167. if (mdSlot->Destroy) {
  168. mdSlot->Destroy(mdSlot, fwSlot, mdInstance, fwInstance);
  169. }
  170. (void)nssCKFWMutex_Destroy(fwSlot->mutex);
  171. (void)nss_ZFreeIf(fwSlot);
  172. return (NSSCKFWSlot *)NULL;
  173. }
  174. #endif /* DEBUG */
  175. return fwSlot;
  176. }
  177. /*
  178. * nssCKFWSlot_Destroy
  179. *
  180. */
  181. NSS_IMPLEMENT CK_RV
  182. nssCKFWSlot_Destroy(
  183. NSSCKFWSlot *fwSlot)
  184. {
  185. CK_RV error = CKR_OK;
  186. #ifdef NSSDEBUG
  187. error = nssCKFWSlot_verifyPointer(fwSlot);
  188. if (CKR_OK != error) {
  189. return error;
  190. }
  191. #endif /* NSSDEBUG */
  192. if (fwSlot->fwToken) {
  193. nssCKFWToken_Destroy(fwSlot->fwToken);
  194. }
  195. (void)nssCKFWMutex_Destroy(fwSlot->mutex);
  196. if (fwSlot->mdSlot->Destroy) {
  197. fwSlot->mdSlot->Destroy(fwSlot->mdSlot, fwSlot,
  198. fwSlot->mdInstance, fwSlot->fwInstance);
  199. }
  200. #ifdef DEBUG
  201. error = slot_remove_pointer(fwSlot);
  202. #endif /* DEBUG */
  203. (void)nss_ZFreeIf(fwSlot);
  204. return error;
  205. }
  206. /*
  207. * nssCKFWSlot_GetMDSlot
  208. *
  209. */
  210. NSS_IMPLEMENT NSSCKMDSlot *
  211. nssCKFWSlot_GetMDSlot(
  212. NSSCKFWSlot *fwSlot)
  213. {
  214. #ifdef NSSDEBUG
  215. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  216. return (NSSCKMDSlot *)NULL;
  217. }
  218. #endif /* NSSDEBUG */
  219. return fwSlot->mdSlot;
  220. }
  221. /*
  222. * nssCKFWSlot_GetFWInstance
  223. *
  224. */
  225. NSS_IMPLEMENT NSSCKFWInstance *
  226. nssCKFWSlot_GetFWInstance(
  227. NSSCKFWSlot *fwSlot)
  228. {
  229. #ifdef NSSDEBUG
  230. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  231. return (NSSCKFWInstance *)NULL;
  232. }
  233. #endif /* NSSDEBUG */
  234. return fwSlot->fwInstance;
  235. }
  236. /*
  237. * nssCKFWSlot_GetMDInstance
  238. *
  239. */
  240. NSS_IMPLEMENT NSSCKMDInstance *
  241. nssCKFWSlot_GetMDInstance(
  242. NSSCKFWSlot *fwSlot)
  243. {
  244. #ifdef NSSDEBUG
  245. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  246. return (NSSCKMDInstance *)NULL;
  247. }
  248. #endif /* NSSDEBUG */
  249. return fwSlot->mdInstance;
  250. }
  251. /*
  252. * nssCKFWSlot_GetSlotID
  253. *
  254. */
  255. NSS_IMPLEMENT CK_SLOT_ID
  256. nssCKFWSlot_GetSlotID(
  257. NSSCKFWSlot *fwSlot)
  258. {
  259. #ifdef NSSDEBUG
  260. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  261. return (CK_SLOT_ID)0;
  262. }
  263. #endif /* NSSDEBUG */
  264. return fwSlot->slotID;
  265. }
  266. /*
  267. * nssCKFWSlot_GetSlotDescription
  268. *
  269. */
  270. NSS_IMPLEMENT CK_RV
  271. nssCKFWSlot_GetSlotDescription(
  272. NSSCKFWSlot *fwSlot,
  273. CK_CHAR slotDescription[64])
  274. {
  275. CK_RV error = CKR_OK;
  276. #ifdef NSSDEBUG
  277. if ((CK_CHAR_PTR)NULL == slotDescription) {
  278. return CKR_ARGUMENTS_BAD;
  279. }
  280. error = nssCKFWSlot_verifyPointer(fwSlot);
  281. if (CKR_OK != error) {
  282. return error;
  283. }
  284. #endif /* NSSDEBUG */
  285. error = nssCKFWMutex_Lock(fwSlot->mutex);
  286. if (CKR_OK != error) {
  287. return error;
  288. }
  289. if (!fwSlot->slotDescription) {
  290. if (fwSlot->mdSlot->GetSlotDescription) {
  291. fwSlot->slotDescription = fwSlot->mdSlot->GetSlotDescription(
  292. fwSlot->mdSlot, fwSlot, fwSlot->mdInstance,
  293. fwSlot->fwInstance, &error);
  294. if ((!fwSlot->slotDescription) && (CKR_OK != error)) {
  295. goto done;
  296. }
  297. } else {
  298. fwSlot->slotDescription = (NSSUTF8 *)"";
  299. }
  300. }
  301. (void)nssUTF8_CopyIntoFixedBuffer(fwSlot->slotDescription, (char *)slotDescription, 64, ' ');
  302. error = CKR_OK;
  303. done:
  304. (void)nssCKFWMutex_Unlock(fwSlot->mutex);
  305. return error;
  306. }
  307. /*
  308. * nssCKFWSlot_GetManufacturerID
  309. *
  310. */
  311. NSS_IMPLEMENT CK_RV
  312. nssCKFWSlot_GetManufacturerID(
  313. NSSCKFWSlot *fwSlot,
  314. CK_CHAR manufacturerID[32])
  315. {
  316. CK_RV error = CKR_OK;
  317. #ifdef NSSDEBUG
  318. if ((CK_CHAR_PTR)NULL == manufacturerID) {
  319. return CKR_ARGUMENTS_BAD;
  320. }
  321. error = nssCKFWSlot_verifyPointer(fwSlot);
  322. if (CKR_OK != error) {
  323. return error;
  324. }
  325. #endif /* NSSDEBUG */
  326. error = nssCKFWMutex_Lock(fwSlot->mutex);
  327. if (CKR_OK != error) {
  328. return error;
  329. }
  330. if (!fwSlot->manufacturerID) {
  331. if (fwSlot->mdSlot->GetManufacturerID) {
  332. fwSlot->manufacturerID = fwSlot->mdSlot->GetManufacturerID(
  333. fwSlot->mdSlot, fwSlot, fwSlot->mdInstance,
  334. fwSlot->fwInstance, &error);
  335. if ((!fwSlot->manufacturerID) && (CKR_OK != error)) {
  336. goto done;
  337. }
  338. } else {
  339. fwSlot->manufacturerID = (NSSUTF8 *)"";
  340. }
  341. }
  342. (void)nssUTF8_CopyIntoFixedBuffer(fwSlot->manufacturerID, (char *)manufacturerID, 32, ' ');
  343. error = CKR_OK;
  344. done:
  345. (void)nssCKFWMutex_Unlock(fwSlot->mutex);
  346. return error;
  347. }
  348. /*
  349. * nssCKFWSlot_GetTokenPresent
  350. *
  351. */
  352. NSS_IMPLEMENT CK_BBOOL
  353. nssCKFWSlot_GetTokenPresent(
  354. NSSCKFWSlot *fwSlot)
  355. {
  356. #ifdef NSSDEBUG
  357. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  358. return CK_FALSE;
  359. }
  360. #endif /* NSSDEBUG */
  361. if (!fwSlot->mdSlot->GetTokenPresent) {
  362. return CK_TRUE;
  363. }
  364. return fwSlot->mdSlot->GetTokenPresent(fwSlot->mdSlot, fwSlot,
  365. fwSlot->mdInstance, fwSlot->fwInstance);
  366. }
  367. /*
  368. * nssCKFWSlot_GetRemovableDevice
  369. *
  370. */
  371. NSS_IMPLEMENT CK_BBOOL
  372. nssCKFWSlot_GetRemovableDevice(
  373. NSSCKFWSlot *fwSlot)
  374. {
  375. #ifdef NSSDEBUG
  376. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  377. return CK_FALSE;
  378. }
  379. #endif /* NSSDEBUG */
  380. if (!fwSlot->mdSlot->GetRemovableDevice) {
  381. return CK_FALSE;
  382. }
  383. return fwSlot->mdSlot->GetRemovableDevice(fwSlot->mdSlot, fwSlot,
  384. fwSlot->mdInstance, fwSlot->fwInstance);
  385. }
  386. /*
  387. * nssCKFWSlot_GetHardwareSlot
  388. *
  389. */
  390. NSS_IMPLEMENT CK_BBOOL
  391. nssCKFWSlot_GetHardwareSlot(
  392. NSSCKFWSlot *fwSlot)
  393. {
  394. #ifdef NSSDEBUG
  395. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  396. return CK_FALSE;
  397. }
  398. #endif /* NSSDEBUG */
  399. if (!fwSlot->mdSlot->GetHardwareSlot) {
  400. return CK_FALSE;
  401. }
  402. return fwSlot->mdSlot->GetHardwareSlot(fwSlot->mdSlot, fwSlot,
  403. fwSlot->mdInstance, fwSlot->fwInstance);
  404. }
  405. /*
  406. * nssCKFWSlot_GetHardwareVersion
  407. *
  408. */
  409. NSS_IMPLEMENT CK_VERSION
  410. nssCKFWSlot_GetHardwareVersion(
  411. NSSCKFWSlot *fwSlot)
  412. {
  413. CK_VERSION rv;
  414. #ifdef NSSDEBUG
  415. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  416. rv.major = rv.minor = 0;
  417. return rv;
  418. }
  419. #endif /* NSSDEBUG */
  420. if (CKR_OK != nssCKFWMutex_Lock(fwSlot->mutex)) {
  421. rv.major = rv.minor = 0;
  422. return rv;
  423. }
  424. if ((0 != fwSlot->hardwareVersion.major) ||
  425. (0 != fwSlot->hardwareVersion.minor)) {
  426. rv = fwSlot->hardwareVersion;
  427. goto done;
  428. }
  429. if (fwSlot->mdSlot->GetHardwareVersion) {
  430. fwSlot->hardwareVersion = fwSlot->mdSlot->GetHardwareVersion(
  431. fwSlot->mdSlot, fwSlot, fwSlot->mdInstance, fwSlot->fwInstance);
  432. } else {
  433. fwSlot->hardwareVersion.major = 0;
  434. fwSlot->hardwareVersion.minor = 1;
  435. }
  436. rv = fwSlot->hardwareVersion;
  437. done:
  438. (void)nssCKFWMutex_Unlock(fwSlot->mutex);
  439. return rv;
  440. }
  441. /*
  442. * nssCKFWSlot_GetFirmwareVersion
  443. *
  444. */
  445. NSS_IMPLEMENT CK_VERSION
  446. nssCKFWSlot_GetFirmwareVersion(
  447. NSSCKFWSlot *fwSlot)
  448. {
  449. CK_VERSION rv;
  450. #ifdef NSSDEBUG
  451. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  452. rv.major = rv.minor = 0;
  453. return rv;
  454. }
  455. #endif /* NSSDEBUG */
  456. if (CKR_OK != nssCKFWMutex_Lock(fwSlot->mutex)) {
  457. rv.major = rv.minor = 0;
  458. return rv;
  459. }
  460. if ((0 != fwSlot->firmwareVersion.major) ||
  461. (0 != fwSlot->firmwareVersion.minor)) {
  462. rv = fwSlot->firmwareVersion;
  463. goto done;
  464. }
  465. if (fwSlot->mdSlot->GetFirmwareVersion) {
  466. fwSlot->firmwareVersion = fwSlot->mdSlot->GetFirmwareVersion(
  467. fwSlot->mdSlot, fwSlot, fwSlot->mdInstance, fwSlot->fwInstance);
  468. } else {
  469. fwSlot->firmwareVersion.major = 0;
  470. fwSlot->firmwareVersion.minor = 1;
  471. }
  472. rv = fwSlot->firmwareVersion;
  473. done:
  474. (void)nssCKFWMutex_Unlock(fwSlot->mutex);
  475. return rv;
  476. }
  477. /*
  478. * nssCKFWSlot_GetToken
  479. *
  480. */
  481. NSS_IMPLEMENT NSSCKFWToken *
  482. nssCKFWSlot_GetToken(
  483. NSSCKFWSlot *fwSlot,
  484. CK_RV *pError)
  485. {
  486. NSSCKMDToken *mdToken;
  487. NSSCKFWToken *fwToken;
  488. #ifdef NSSDEBUG
  489. if (!pError) {
  490. return (NSSCKFWToken *)NULL;
  491. }
  492. *pError = nssCKFWSlot_verifyPointer(fwSlot);
  493. if (CKR_OK != *pError) {
  494. return (NSSCKFWToken *)NULL;
  495. }
  496. #endif /* NSSDEBUG */
  497. *pError = nssCKFWMutex_Lock(fwSlot->mutex);
  498. if (CKR_OK != *pError) {
  499. return (NSSCKFWToken *)NULL;
  500. }
  501. if (!fwSlot->fwToken) {
  502. if (!fwSlot->mdSlot->GetToken) {
  503. *pError = CKR_GENERAL_ERROR;
  504. fwToken = (NSSCKFWToken *)NULL;
  505. goto done;
  506. }
  507. mdToken = fwSlot->mdSlot->GetToken(fwSlot->mdSlot, fwSlot,
  508. fwSlot->mdInstance, fwSlot->fwInstance, pError);
  509. if (!mdToken) {
  510. if (CKR_OK == *pError) {
  511. *pError = CKR_GENERAL_ERROR;
  512. }
  513. return (NSSCKFWToken *)NULL;
  514. }
  515. fwToken = nssCKFWToken_Create(fwSlot, mdToken, pError);
  516. fwSlot->fwToken = fwToken;
  517. } else {
  518. fwToken = fwSlot->fwToken;
  519. }
  520. done:
  521. (void)nssCKFWMutex_Unlock(fwSlot->mutex);
  522. return fwToken;
  523. }
  524. /*
  525. * nssCKFWSlot_ClearToken
  526. *
  527. */
  528. NSS_IMPLEMENT void
  529. nssCKFWSlot_ClearToken(
  530. NSSCKFWSlot *fwSlot)
  531. {
  532. #ifdef NSSDEBUG
  533. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  534. return;
  535. }
  536. #endif /* NSSDEBUG */
  537. if (CKR_OK != nssCKFWMutex_Lock(fwSlot->mutex)) {
  538. /* Now what? */
  539. return;
  540. }
  541. fwSlot->fwToken = (NSSCKFWToken *)NULL;
  542. (void)nssCKFWMutex_Unlock(fwSlot->mutex);
  543. return;
  544. }
  545. /*
  546. * NSSCKFWSlot_GetMDSlot
  547. *
  548. */
  549. NSS_IMPLEMENT NSSCKMDSlot *
  550. NSSCKFWSlot_GetMDSlot(
  551. NSSCKFWSlot *fwSlot)
  552. {
  553. #ifdef DEBUG
  554. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  555. return (NSSCKMDSlot *)NULL;
  556. }
  557. #endif /* DEBUG */
  558. return nssCKFWSlot_GetMDSlot(fwSlot);
  559. }
  560. /*
  561. * NSSCKFWSlot_GetFWInstance
  562. *
  563. */
  564. NSS_IMPLEMENT NSSCKFWInstance *
  565. NSSCKFWSlot_GetFWInstance(
  566. NSSCKFWSlot *fwSlot)
  567. {
  568. #ifdef DEBUG
  569. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  570. return (NSSCKFWInstance *)NULL;
  571. }
  572. #endif /* DEBUG */
  573. return nssCKFWSlot_GetFWInstance(fwSlot);
  574. }
  575. /*
  576. * NSSCKFWSlot_GetMDInstance
  577. *
  578. */
  579. NSS_IMPLEMENT NSSCKMDInstance *
  580. NSSCKFWSlot_GetMDInstance(
  581. NSSCKFWSlot *fwSlot)
  582. {
  583. #ifdef DEBUG
  584. if (CKR_OK != nssCKFWSlot_verifyPointer(fwSlot)) {
  585. return (NSSCKMDInstance *)NULL;
  586. }
  587. #endif /* DEBUG */
  588. return nssCKFWSlot_GetMDInstance(fwSlot);
  589. }
  590. /*
  591. * NSSCKFWSlot_GetSlotID
  592. *
  593. */
  594. NSS_IMPLEMENT CK_SLOT_ID
  595. NSSCKFWSlot_GetSlotID(
  596. NSSCKFWSlot *fwSlot)
  597. {
  598. return nssCKFWSlot_GetSlotID(fwSlot);
  599. }