slot.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:16k
源码类别:

CA认证

开发平台:

WINDOWS

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