slot.c (4490B)
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 #include "ckdbm.h" 6 7 static CK_RV 8 nss_dbm_mdSlot_Initialize( 9 NSSCKMDSlot *mdSlot, 10 NSSCKFWSlot *fwSlot, 11 NSSCKMDInstance *mdInstance, 12 NSSCKFWInstance *fwInstance) 13 { 14 nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc; 15 nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc; 16 CK_RV rv = CKR_OK; 17 18 slot->token_db = nss_dbm_db_open(instance->arena, fwInstance, slot->filename, 19 slot->flags, &rv); 20 if ((nss_dbm_db_t *)NULL == slot->token_db) { 21 if (CKR_TOKEN_NOT_PRESENT == rv) { 22 /* This is not an error-- just means "the token isn't there" */ 23 rv = CKR_OK; 24 } 25 } 26 27 return rv; 28 } 29 30 static void 31 nss_dbm_mdSlot_Destroy( 32 NSSCKMDSlot *mdSlot, 33 NSSCKFWSlot *fwSlot, 34 NSSCKMDInstance *mdInstance, 35 NSSCKFWInstance *fwInstance) 36 { 37 nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc; 38 39 if ((nss_dbm_db_t *)NULL != slot->token_db) { 40 nss_dbm_db_close(slot->token_db); 41 slot->token_db = (nss_dbm_db_t *)NULL; 42 } 43 } 44 45 static NSSUTF8 * 46 nss_dbm_mdSlot_GetSlotDescription( 47 NSSCKMDSlot *mdSlot, 48 NSSCKFWSlot *fwSlot, 49 NSSCKMDInstance *mdInstance, 50 NSSCKFWInstance *fwInstance, 51 CK_RV *pError) 52 { 53 return "Database"; 54 } 55 56 static NSSUTF8 * 57 nss_dbm_mdSlot_GetManufacturerID( 58 NSSCKMDSlot *mdSlot, 59 NSSCKFWSlot *fwSlot, 60 NSSCKMDInstance *mdInstance, 61 NSSCKFWInstance *fwInstance, 62 CK_RV *pError) 63 { 64 return "Berkeley"; 65 } 66 67 static CK_BBOOL 68 nss_dbm_mdSlot_GetTokenPresent( 69 NSSCKMDSlot *mdSlot, 70 NSSCKFWSlot *fwSlot, 71 NSSCKMDInstance *mdInstance, 72 NSSCKFWInstance *fwInstance) 73 { 74 nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc; 75 76 if ((nss_dbm_db_t *)NULL == slot->token_db) { 77 return CK_FALSE; 78 } else { 79 return CK_TRUE; 80 } 81 } 82 83 static CK_BBOOL 84 nss_dbm_mdSlot_GetRemovableDevice( 85 NSSCKMDSlot *mdSlot, 86 NSSCKFWSlot *fwSlot, 87 NSSCKMDInstance *mdInstance, 88 NSSCKFWInstance *fwInstance) 89 { 90 /* 91 * Well, this supports "tokens" (databases) that aren't there, so in 92 * that sense they're removable. It'd be nice to handle databases 93 * that suddenly disappear (NFS-mounted home directories and network 94 * errors, for instance) but that's a harder problem. We'll say 95 * we support removable devices, badly. 96 */ 97 98 return CK_TRUE; 99 } 100 101 /* nss_dbm_mdSlot_GetHardwareSlot defaults to CK_FALSE */ 102 /* 103 * nss_dbm_mdSlot_GetHardwareVersion 104 * nss_dbm_mdSlot_GetFirmwareVersion 105 * 106 * These are kinda fuzzy concepts here. I suppose we could return the 107 * Berkeley DB version for one of them, if we had an actual number we 108 * were confident in. But mcom's "dbm" has been hacked enough that I 109 * don't really know from what "real" version it stems.. 110 */ 111 112 static NSSCKMDToken * 113 nss_dbm_mdSlot_GetToken( 114 NSSCKMDSlot *mdSlot, 115 NSSCKFWSlot *fwSlot, 116 NSSCKMDInstance *mdInstance, 117 NSSCKFWInstance *fwInstance, 118 CK_RV *pError) 119 { 120 nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc; 121 return nss_dbm_mdToken_factory(slot, pError); 122 } 123 124 NSS_IMPLEMENT NSSCKMDSlot * 125 nss_dbm_mdSlot_factory( 126 nss_dbm_instance_t *instance, 127 char *filename, 128 int flags, 129 CK_RV *pError) 130 { 131 nss_dbm_slot_t *slot; 132 NSSCKMDSlot *rv; 133 134 slot = nss_ZNEW(instance->arena, nss_dbm_slot_t); 135 if ((nss_dbm_slot_t *)NULL == slot) { 136 *pError = CKR_HOST_MEMORY; 137 return (NSSCKMDSlot *)NULL; 138 } 139 140 slot->instance = instance; 141 slot->filename = filename; 142 slot->flags = flags; 143 slot->token_db = (nss_dbm_db_t *)NULL; 144 145 rv = nss_ZNEW(instance->arena, NSSCKMDSlot); 146 if ((NSSCKMDSlot *)NULL == rv) { 147 *pError = CKR_HOST_MEMORY; 148 return (NSSCKMDSlot *)NULL; 149 } 150 151 rv->etc = (void *)slot; 152 rv->Initialize = nss_dbm_mdSlot_Initialize; 153 rv->Destroy = nss_dbm_mdSlot_Destroy; 154 rv->GetSlotDescription = nss_dbm_mdSlot_GetSlotDescription; 155 rv->GetManufacturerID = nss_dbm_mdSlot_GetManufacturerID; 156 rv->GetTokenPresent = nss_dbm_mdSlot_GetTokenPresent; 157 rv->GetRemovableDevice = nss_dbm_mdSlot_GetRemovableDevice; 158 /* GetHardwareSlot */ 159 /* GetHardwareVersion */ 160 /* GetFirmwareVersion */ 161 rv->GetToken = nss_dbm_mdSlot_GetToken; 162 rv->null = (void *)NULL; 163 164 return rv; 165 }