1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/ckfw/dbm/slot.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,181 @@ 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 +#include "ckdbm.h" 1.9 + 1.10 +static CK_RV 1.11 +nss_dbm_mdSlot_Initialize 1.12 +( 1.13 + NSSCKMDSlot *mdSlot, 1.14 + NSSCKFWSlot *fwSlot, 1.15 + NSSCKMDInstance *mdInstance, 1.16 + NSSCKFWInstance *fwInstance 1.17 +) 1.18 +{ 1.19 + nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc; 1.20 + nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc; 1.21 + CK_RV rv = CKR_OK; 1.22 + 1.23 + slot->token_db = nss_dbm_db_open(instance->arena, fwInstance, slot->filename, 1.24 + slot->flags, &rv); 1.25 + if( (nss_dbm_db_t *)NULL == slot->token_db ) { 1.26 + if( CKR_TOKEN_NOT_PRESENT == rv ) { 1.27 + /* This is not an error-- just means "the token isn't there" */ 1.28 + rv = CKR_OK; 1.29 + } 1.30 + } 1.31 + 1.32 + return rv; 1.33 +} 1.34 + 1.35 +static void 1.36 +nss_dbm_mdSlot_Destroy 1.37 +( 1.38 + NSSCKMDSlot *mdSlot, 1.39 + NSSCKFWSlot *fwSlot, 1.40 + NSSCKMDInstance *mdInstance, 1.41 + NSSCKFWInstance *fwInstance 1.42 +) 1.43 +{ 1.44 + nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc; 1.45 + 1.46 + if( (nss_dbm_db_t *)NULL != slot->token_db ) { 1.47 + nss_dbm_db_close(slot->token_db); 1.48 + slot->token_db = (nss_dbm_db_t *)NULL; 1.49 + } 1.50 +} 1.51 + 1.52 +static NSSUTF8 * 1.53 +nss_dbm_mdSlot_GetSlotDescription 1.54 +( 1.55 + NSSCKMDSlot *mdSlot, 1.56 + NSSCKFWSlot *fwSlot, 1.57 + NSSCKMDInstance *mdInstance, 1.58 + NSSCKFWInstance *fwInstance, 1.59 + CK_RV *pError 1.60 +) 1.61 +{ 1.62 + return "Database"; 1.63 +} 1.64 + 1.65 +static NSSUTF8 * 1.66 +nss_dbm_mdSlot_GetManufacturerID 1.67 +( 1.68 + NSSCKMDSlot *mdSlot, 1.69 + NSSCKFWSlot *fwSlot, 1.70 + NSSCKMDInstance *mdInstance, 1.71 + NSSCKFWInstance *fwInstance, 1.72 + CK_RV *pError 1.73 +) 1.74 +{ 1.75 + return "Berkeley"; 1.76 +} 1.77 + 1.78 +static CK_BBOOL 1.79 +nss_dbm_mdSlot_GetTokenPresent 1.80 +( 1.81 + NSSCKMDSlot *mdSlot, 1.82 + NSSCKFWSlot *fwSlot, 1.83 + NSSCKMDInstance *mdInstance, 1.84 + NSSCKFWInstance *fwInstance 1.85 +) 1.86 +{ 1.87 + nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc; 1.88 + 1.89 + if( (nss_dbm_db_t *)NULL == slot->token_db ) { 1.90 + return CK_FALSE; 1.91 + } else { 1.92 + return CK_TRUE; 1.93 + } 1.94 +} 1.95 + 1.96 +static CK_BBOOL 1.97 +nss_dbm_mdSlot_GetRemovableDevice 1.98 +( 1.99 + NSSCKMDSlot *mdSlot, 1.100 + NSSCKFWSlot *fwSlot, 1.101 + NSSCKMDInstance *mdInstance, 1.102 + NSSCKFWInstance *fwInstance 1.103 +) 1.104 +{ 1.105 + /* 1.106 + * Well, this supports "tokens" (databases) that aren't there, so in 1.107 + * that sense they're removable. It'd be nice to handle databases 1.108 + * that suddenly disappear (NFS-mounted home directories and network 1.109 + * errors, for instance) but that's a harder problem. We'll say 1.110 + * we support removable devices, badly. 1.111 + */ 1.112 + 1.113 + return CK_TRUE; 1.114 +} 1.115 + 1.116 +/* nss_dbm_mdSlot_GetHardwareSlot defaults to CK_FALSE */ 1.117 +/* 1.118 + * nss_dbm_mdSlot_GetHardwareVersion 1.119 + * nss_dbm_mdSlot_GetFirmwareVersion 1.120 + * 1.121 + * These are kinda fuzzy concepts here. I suppose we could return the 1.122 + * Berkeley DB version for one of them, if we had an actual number we 1.123 + * were confident in. But mcom's "dbm" has been hacked enough that I 1.124 + * don't really know from what "real" version it stems.. 1.125 + */ 1.126 + 1.127 +static NSSCKMDToken * 1.128 +nss_dbm_mdSlot_GetToken 1.129 +( 1.130 + NSSCKMDSlot *mdSlot, 1.131 + NSSCKFWSlot *fwSlot, 1.132 + NSSCKMDInstance *mdInstance, 1.133 + NSSCKFWInstance *fwInstance, 1.134 + CK_RV *pError 1.135 +) 1.136 +{ 1.137 + nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc; 1.138 + return nss_dbm_mdToken_factory(slot, pError); 1.139 +} 1.140 + 1.141 +NSS_IMPLEMENT NSSCKMDSlot * 1.142 +nss_dbm_mdSlot_factory 1.143 +( 1.144 + nss_dbm_instance_t *instance, 1.145 + char *filename, 1.146 + int flags, 1.147 + CK_RV *pError 1.148 +) 1.149 +{ 1.150 + nss_dbm_slot_t *slot; 1.151 + NSSCKMDSlot *rv; 1.152 + 1.153 + slot = nss_ZNEW(instance->arena, nss_dbm_slot_t); 1.154 + if( (nss_dbm_slot_t *)NULL == slot ) { 1.155 + *pError = CKR_HOST_MEMORY; 1.156 + return (NSSCKMDSlot *)NULL; 1.157 + } 1.158 + 1.159 + slot->instance = instance; 1.160 + slot->filename = filename; 1.161 + slot->flags = flags; 1.162 + slot->token_db = (nss_dbm_db_t *)NULL; 1.163 + 1.164 + rv = nss_ZNEW(instance->arena, NSSCKMDSlot); 1.165 + if( (NSSCKMDSlot *)NULL == rv ) { 1.166 + *pError = CKR_HOST_MEMORY; 1.167 + return (NSSCKMDSlot *)NULL; 1.168 + } 1.169 + 1.170 + rv->etc = (void *)slot; 1.171 + rv->Initialize = nss_dbm_mdSlot_Initialize; 1.172 + rv->Destroy = nss_dbm_mdSlot_Destroy; 1.173 + rv->GetSlotDescription = nss_dbm_mdSlot_GetSlotDescription; 1.174 + rv->GetManufacturerID = nss_dbm_mdSlot_GetManufacturerID; 1.175 + rv->GetTokenPresent = nss_dbm_mdSlot_GetTokenPresent; 1.176 + rv->GetRemovableDevice = nss_dbm_mdSlot_GetRemovableDevice; 1.177 + /* GetHardwareSlot */ 1.178 + /* GetHardwareVersion */ 1.179 + /* GetFirmwareVersion */ 1.180 + rv->GetToken = nss_dbm_mdSlot_GetToken; 1.181 + rv->null = (void *)NULL; 1.182 + 1.183 + return rv; 1.184 +}