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