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

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: token.c,v $ $Revision: 1.2 $ $Date: 2000/05/17 18:28:13 $ $Name: NSS_3_1_1_RTM $";
  35. #endif /* DEBUG */
  36. #include "ckdbm.h"
  37. static CK_RV
  38. nss_dbm_mdToken_Setup
  39. (
  40.   NSSCKMDToken *mdToken,
  41.   NSSCKFWToken *fwToken,
  42.   NSSCKMDInstance *mdInstance,
  43.   NSSCKFWInstance *fwInstance
  44. )
  45. {
  46.   nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
  47.   CK_RV rv = CKR_OK;
  48.   token->arena = NSSCKFWToken_GetArena(fwToken, &rv);
  49.   token->session_db = nss_dbm_db_open(token->arena, fwInstance, (char *)NULL, 
  50.                                       O_RDWR|O_CREAT, &rv);
  51.   if( (nss_dbm_db_t *)NULL == token->session_db ) {
  52.     return rv;
  53.   }
  54.   /* Add a label record if there isn't one? */
  55.   return CKR_OK;
  56. }
  57. static void
  58. nss_dbm_mdToken_Invalidate
  59. (
  60.   NSSCKMDToken *mdToken,
  61.   NSSCKFWToken *fwToken,
  62.   NSSCKMDInstance *mdInstance,
  63.   NSSCKFWInstance *fwInstance
  64. )
  65. {
  66.   nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
  67.   if( (nss_dbm_db_t *)NULL != token->session_db ) {
  68.     nss_dbm_db_close(token->session_db);
  69.     token->session_db = (nss_dbm_db_t *)NULL;
  70.   }
  71. }
  72. static CK_RV
  73. nss_dbm_mdToken_InitToken
  74. (
  75.   NSSCKMDToken *mdToken,
  76.   NSSCKFWToken *fwToken,
  77.   NSSCKMDInstance *mdInstance,
  78.   NSSCKFWInstance *fwInstance,
  79.   NSSItem *pin,
  80.   NSSUTF8 *label
  81. )
  82. {
  83.   nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
  84.   nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc;
  85.   CK_RV rv;
  86.   /* Wipe the session object data */
  87.   
  88.   if( (nss_dbm_db_t *)NULL != token->session_db ) {
  89.     nss_dbm_db_close(token->session_db);
  90.   }
  91.   token->session_db = nss_dbm_db_open(token->arena, fwInstance, (char *)NULL, 
  92.                                       O_RDWR|O_CREAT, &rv);
  93.   if( (nss_dbm_db_t *)NULL == token->session_db ) {
  94.     return rv;
  95.   }
  96.   /* Wipe the token object data */
  97.   if( token->slot->flags & O_RDWR ) {
  98.     if( (nss_dbm_db_t *)NULL != token->slot->token_db ) {
  99.       nss_dbm_db_close(token->slot->token_db);
  100.     }
  101.     token->slot->token_db = nss_dbm_db_open(instance->arena, fwInstance, 
  102.                                             token->slot->filename,
  103.                                             token->slot->flags | O_CREAT | O_TRUNC, 
  104.                                             &rv);
  105.     if( (nss_dbm_db_t *)NULL == token->slot->token_db ) {
  106.       return rv;
  107.     }
  108.     /* PIN is irrelevant */
  109.     rv = nss_dbm_db_set_label(token->slot->token_db, label);
  110.     if( CKR_OK != rv ) {
  111.       return rv;
  112.     }
  113.   }
  114.   return CKR_OK;
  115. }
  116. static NSSUTF8 *
  117. nss_dbm_mdToken_GetLabel
  118. (
  119.   NSSCKMDToken *mdToken,
  120.   NSSCKFWToken *fwToken,
  121.   NSSCKMDInstance *mdInstance,
  122.   NSSCKFWInstance *fwInstance,
  123.   CK_RV *pError
  124. )
  125. {
  126.   nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
  127.   if( (NSSUTF8 *)NULL == token->label ) {
  128.     token->label = nss_dbm_db_get_label(token->slot->token_db, token->arena, pError);
  129.   }
  130.   /* If no label has been set, return *something* */
  131.   if( (NSSUTF8 *)NULL == token->label ) {
  132.     return token->slot->filename;
  133.   }
  134.   return token->label;
  135. }
  136. static NSSUTF8 *
  137. nss_dbm_mdToken_GetManufacturerID
  138. (
  139.   NSSCKMDToken *mdToken,
  140.   NSSCKFWToken *fwToken,
  141.   NSSCKMDInstance *mdInstance,
  142.   NSSCKFWInstance *fwInstance,
  143.   CK_RV *pError
  144. )
  145. {
  146.   return "mozilla.org NSS";
  147. }
  148. static NSSUTF8 *
  149. nss_dbm_mdToken_GetModel
  150. (
  151.   NSSCKMDToken *mdToken,
  152.   NSSCKFWToken *fwToken,
  153.   NSSCKMDInstance *mdInstance,
  154.   NSSCKFWInstance *fwInstance,
  155.   CK_RV *pError
  156. )
  157. {
  158.   return "dbm";
  159. }
  160. /* GetSerialNumber is irrelevant */
  161. /* GetHasRNG defaults to CK_FALSE */
  162. static CK_BBOOL
  163. nss_dbm_mdToken_GetIsWriteProtected
  164. (
  165.   NSSCKMDToken *mdToken,
  166.   NSSCKFWToken *fwToken,
  167.   NSSCKMDInstance *mdInstance,
  168.   NSSCKFWInstance *fwInstance
  169. )
  170. {
  171.   nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
  172.   if( token->slot->flags & O_RDWR ) {
  173.     return CK_FALSE;
  174.   } else {
  175.     return CK_TRUE;
  176.   }
  177. }
  178. /* GetLoginRequired defaults to CK_FALSE */
  179. /* GetUserPinInitialized defaults to CK_FALSE */
  180. /* GetRestoreKeyNotNeeded is irrelevant */
  181. /* GetHasClockOnToken defaults to CK_FALSE */
  182. /* GetHasProtectedAuthenticationPath defaults to CK_FALSE */
  183. /* GetSupportsDualCryptoOperations is irrelevant */
  184. static CK_ULONG
  185. nss_dbm_mdToken_effectively_infinite
  186. (
  187.   NSSCKMDToken *mdToken,
  188.   NSSCKFWToken *fwToken,
  189.   NSSCKMDInstance *mdInstance,
  190.   NSSCKFWInstance *fwInstance
  191. )
  192. {
  193.   return CK_EFFECTIVELY_INFINITE;
  194. }
  195. static CK_VERSION
  196. nss_dbm_mdToken_GetHardwareVersion
  197. (
  198.   NSSCKMDToken *mdToken,
  199.   NSSCKFWToken *fwToken,
  200.   NSSCKMDInstance *mdInstance,
  201.   NSSCKFWInstance *fwInstance
  202. )
  203. {
  204.   nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
  205.   return nss_dbm_db_get_format_version(token->slot->token_db);
  206. }
  207. /* GetFirmwareVersion is irrelevant */
  208. /* GetUTCTime is irrelevant */
  209. static NSSCKMDSession *
  210. nss_dbm_mdToken_OpenSession
  211. (
  212.   NSSCKMDToken *mdToken,
  213.   NSSCKFWToken *fwToken,
  214.   NSSCKMDInstance *mdInstance,
  215.   NSSCKFWInstance *fwInstance,
  216.   NSSCKFWSession *fwSession,
  217.   CK_BBOOL rw,
  218.   CK_RV *pError
  219. )
  220. {
  221.   nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
  222.   return nss_dbm_mdSession_factory(token, fwSession, fwInstance, rw, pError);
  223. }
  224. /* GetMechanismCount defaults to zero */
  225. /* GetMechanismTypes is irrelevant */
  226. /* GetMechanism is irrelevant */
  227. NSS_IMPLEMENT NSSCKMDToken *
  228. nss_dbm_mdToken_factory
  229. (
  230.   nss_dbm_slot_t *slot,
  231.   CK_RV *pError
  232. )
  233. {
  234.   nss_dbm_token_t *token;
  235.   NSSCKMDToken *rv;
  236.   token = nss_ZNEW(slot->instance->arena, nss_dbm_token_t);
  237.   if( (nss_dbm_token_t *)NULL == token ) {
  238.     *pError = CKR_HOST_MEMORY;
  239.     return (NSSCKMDToken *)NULL;
  240.   }
  241.   rv = nss_ZNEW(slot->instance->arena, NSSCKMDToken);
  242.   if( (NSSCKMDToken *)NULL == rv ) {
  243.     *pError = CKR_HOST_MEMORY;
  244.     return (NSSCKMDToken *)NULL;
  245.   }
  246.   token->slot = slot;
  247.   rv->etc = (void *)token;
  248.   rv->Setup = nss_dbm_mdToken_Setup;
  249.   rv->Invalidate = nss_dbm_mdToken_Invalidate;
  250.   rv->InitToken = nss_dbm_mdToken_InitToken;
  251.   rv->GetLabel = nss_dbm_mdToken_GetLabel;
  252.   rv->GetManufacturerID = nss_dbm_mdToken_GetManufacturerID;
  253.   rv->GetModel = nss_dbm_mdToken_GetModel;
  254.   /*  GetSerialNumber is irrelevant */
  255.   /*  GetHasRNG defaults to CK_FALSE */
  256.   rv->GetIsWriteProtected = nss_dbm_mdToken_GetIsWriteProtected;
  257.   /*  GetLoginRequired defaults to CK_FALSE */
  258.   /*  GetUserPinInitialized defaults to CK_FALSE */
  259.   /*  GetRestoreKeyNotNeeded is irrelevant */
  260.   /*  GetHasClockOnToken defaults to CK_FALSE */
  261.   /*  GetHasProtectedAuthenticationPath defaults to CK_FALSE */
  262.   /*  GetSupportsDualCryptoOperations is irrelevant */
  263.   rv->GetMaxSessionCount = nss_dbm_mdToken_effectively_infinite;
  264.   rv->GetMaxRwSessionCount = nss_dbm_mdToken_effectively_infinite;
  265.   /*  GetMaxPinLen is irrelevant */
  266.   /*  GetMinPinLen is irrelevant */
  267.   /*  GetTotalPublicMemory defaults to CK_UNAVAILABLE_INFORMATION */
  268.   /*  GetFreePublicMemory defaults to CK_UNAVAILABLE_INFORMATION */
  269.   /*  GetTotalPrivateMemory defaults to CK_UNAVAILABLE_INFORMATION */
  270.   /*  GetFreePrivateMemory defaults to CK_UNAVAILABLE_INFORMATION */
  271.   rv->GetHardwareVersion = nss_dbm_mdToken_GetHardwareVersion;
  272.   /*  GetFirmwareVersion is irrelevant */
  273.   /*  GetUTCTime is irrelevant */
  274.   rv->OpenSession = nss_dbm_mdToken_OpenSession;
  275.   rv->null = NULL;
  276.   return rv;
  277. }