1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/ckfw/dbm/token.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,282 @@ 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_mdToken_Setup 1.12 +( 1.13 + NSSCKMDToken *mdToken, 1.14 + NSSCKFWToken *fwToken, 1.15 + NSSCKMDInstance *mdInstance, 1.16 + NSSCKFWInstance *fwInstance 1.17 +) 1.18 +{ 1.19 + nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; 1.20 + CK_RV rv = CKR_OK; 1.21 + 1.22 + token->arena = NSSCKFWToken_GetArena(fwToken, &rv); 1.23 + token->session_db = nss_dbm_db_open(token->arena, fwInstance, (char *)NULL, 1.24 + O_RDWR|O_CREAT, &rv); 1.25 + if( (nss_dbm_db_t *)NULL == token->session_db ) { 1.26 + return rv; 1.27 + } 1.28 + 1.29 + /* Add a label record if there isn't one? */ 1.30 + 1.31 + return CKR_OK; 1.32 +} 1.33 + 1.34 +static void 1.35 +nss_dbm_mdToken_Invalidate 1.36 +( 1.37 + NSSCKMDToken *mdToken, 1.38 + NSSCKFWToken *fwToken, 1.39 + NSSCKMDInstance *mdInstance, 1.40 + NSSCKFWInstance *fwInstance 1.41 +) 1.42 +{ 1.43 + nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; 1.44 + 1.45 + if( (nss_dbm_db_t *)NULL != token->session_db ) { 1.46 + nss_dbm_db_close(token->session_db); 1.47 + token->session_db = (nss_dbm_db_t *)NULL; 1.48 + } 1.49 +} 1.50 + 1.51 +static CK_RV 1.52 +nss_dbm_mdToken_InitToken 1.53 +( 1.54 + NSSCKMDToken *mdToken, 1.55 + NSSCKFWToken *fwToken, 1.56 + NSSCKMDInstance *mdInstance, 1.57 + NSSCKFWInstance *fwInstance, 1.58 + NSSItem *pin, 1.59 + NSSUTF8 *label 1.60 +) 1.61 +{ 1.62 + nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; 1.63 + nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc; 1.64 + CK_RV rv; 1.65 + 1.66 + /* Wipe the session object data */ 1.67 + 1.68 + if( (nss_dbm_db_t *)NULL != token->session_db ) { 1.69 + nss_dbm_db_close(token->session_db); 1.70 + } 1.71 + 1.72 + token->session_db = nss_dbm_db_open(token->arena, fwInstance, (char *)NULL, 1.73 + O_RDWR|O_CREAT, &rv); 1.74 + if( (nss_dbm_db_t *)NULL == token->session_db ) { 1.75 + return rv; 1.76 + } 1.77 + 1.78 + /* Wipe the token object data */ 1.79 + 1.80 + if( token->slot->flags & O_RDWR ) { 1.81 + if( (nss_dbm_db_t *)NULL != token->slot->token_db ) { 1.82 + nss_dbm_db_close(token->slot->token_db); 1.83 + } 1.84 + 1.85 + token->slot->token_db = nss_dbm_db_open(instance->arena, fwInstance, 1.86 + token->slot->filename, 1.87 + token->slot->flags | O_CREAT | O_TRUNC, 1.88 + &rv); 1.89 + if( (nss_dbm_db_t *)NULL == token->slot->token_db ) { 1.90 + return rv; 1.91 + } 1.92 + 1.93 + /* PIN is irrelevant */ 1.94 + 1.95 + rv = nss_dbm_db_set_label(token->slot->token_db, label); 1.96 + if( CKR_OK != rv ) { 1.97 + return rv; 1.98 + } 1.99 + } 1.100 + 1.101 + return CKR_OK; 1.102 +} 1.103 + 1.104 +static NSSUTF8 * 1.105 +nss_dbm_mdToken_GetLabel 1.106 +( 1.107 + NSSCKMDToken *mdToken, 1.108 + NSSCKFWToken *fwToken, 1.109 + NSSCKMDInstance *mdInstance, 1.110 + NSSCKFWInstance *fwInstance, 1.111 + CK_RV *pError 1.112 +) 1.113 +{ 1.114 + nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; 1.115 + 1.116 + if( (NSSUTF8 *)NULL == token->label ) { 1.117 + token->label = nss_dbm_db_get_label(token->slot->token_db, token->arena, pError); 1.118 + } 1.119 + 1.120 + /* If no label has been set, return *something* */ 1.121 + if( (NSSUTF8 *)NULL == token->label ) { 1.122 + return token->slot->filename; 1.123 + } 1.124 + 1.125 + return token->label; 1.126 +} 1.127 + 1.128 +static NSSUTF8 * 1.129 +nss_dbm_mdToken_GetManufacturerID 1.130 +( 1.131 + NSSCKMDToken *mdToken, 1.132 + NSSCKFWToken *fwToken, 1.133 + NSSCKMDInstance *mdInstance, 1.134 + NSSCKFWInstance *fwInstance, 1.135 + CK_RV *pError 1.136 +) 1.137 +{ 1.138 + return "mozilla.org NSS"; 1.139 +} 1.140 + 1.141 +static NSSUTF8 * 1.142 +nss_dbm_mdToken_GetModel 1.143 +( 1.144 + NSSCKMDToken *mdToken, 1.145 + NSSCKFWToken *fwToken, 1.146 + NSSCKMDInstance *mdInstance, 1.147 + NSSCKFWInstance *fwInstance, 1.148 + CK_RV *pError 1.149 +) 1.150 +{ 1.151 + return "dbm"; 1.152 +} 1.153 + 1.154 +/* GetSerialNumber is irrelevant */ 1.155 +/* GetHasRNG defaults to CK_FALSE */ 1.156 + 1.157 +static CK_BBOOL 1.158 +nss_dbm_mdToken_GetIsWriteProtected 1.159 +( 1.160 + NSSCKMDToken *mdToken, 1.161 + NSSCKFWToken *fwToken, 1.162 + NSSCKMDInstance *mdInstance, 1.163 + NSSCKFWInstance *fwInstance 1.164 +) 1.165 +{ 1.166 + nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; 1.167 + 1.168 + if( token->slot->flags & O_RDWR ) { 1.169 + return CK_FALSE; 1.170 + } else { 1.171 + return CK_TRUE; 1.172 + } 1.173 +} 1.174 + 1.175 +/* GetLoginRequired defaults to CK_FALSE */ 1.176 +/* GetUserPinInitialized defaults to CK_FALSE */ 1.177 +/* GetRestoreKeyNotNeeded is irrelevant */ 1.178 +/* GetHasClockOnToken defaults to CK_FALSE */ 1.179 +/* GetHasProtectedAuthenticationPath defaults to CK_FALSE */ 1.180 +/* GetSupportsDualCryptoOperations is irrelevant */ 1.181 + 1.182 +static CK_ULONG 1.183 +nss_dbm_mdToken_effectively_infinite 1.184 +( 1.185 + NSSCKMDToken *mdToken, 1.186 + NSSCKFWToken *fwToken, 1.187 + NSSCKMDInstance *mdInstance, 1.188 + NSSCKFWInstance *fwInstance 1.189 +) 1.190 +{ 1.191 + return CK_EFFECTIVELY_INFINITE; 1.192 +} 1.193 + 1.194 +static CK_VERSION 1.195 +nss_dbm_mdToken_GetHardwareVersion 1.196 +( 1.197 + NSSCKMDToken *mdToken, 1.198 + NSSCKFWToken *fwToken, 1.199 + NSSCKMDInstance *mdInstance, 1.200 + NSSCKFWInstance *fwInstance 1.201 +) 1.202 +{ 1.203 + nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; 1.204 + return nss_dbm_db_get_format_version(token->slot->token_db); 1.205 +} 1.206 + 1.207 +/* GetFirmwareVersion is irrelevant */ 1.208 +/* GetUTCTime is irrelevant */ 1.209 + 1.210 +static NSSCKMDSession * 1.211 +nss_dbm_mdToken_OpenSession 1.212 +( 1.213 + NSSCKMDToken *mdToken, 1.214 + NSSCKFWToken *fwToken, 1.215 + NSSCKMDInstance *mdInstance, 1.216 + NSSCKFWInstance *fwInstance, 1.217 + NSSCKFWSession *fwSession, 1.218 + CK_BBOOL rw, 1.219 + CK_RV *pError 1.220 +) 1.221 +{ 1.222 + nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; 1.223 + return nss_dbm_mdSession_factory(token, fwSession, fwInstance, rw, pError); 1.224 +} 1.225 + 1.226 +/* GetMechanismCount defaults to zero */ 1.227 +/* GetMechanismTypes is irrelevant */ 1.228 +/* GetMechanism is irrelevant */ 1.229 + 1.230 +NSS_IMPLEMENT NSSCKMDToken * 1.231 +nss_dbm_mdToken_factory 1.232 +( 1.233 + nss_dbm_slot_t *slot, 1.234 + CK_RV *pError 1.235 +) 1.236 +{ 1.237 + nss_dbm_token_t *token; 1.238 + NSSCKMDToken *rv; 1.239 + 1.240 + token = nss_ZNEW(slot->instance->arena, nss_dbm_token_t); 1.241 + if( (nss_dbm_token_t *)NULL == token ) { 1.242 + *pError = CKR_HOST_MEMORY; 1.243 + return (NSSCKMDToken *)NULL; 1.244 + } 1.245 + 1.246 + rv = nss_ZNEW(slot->instance->arena, NSSCKMDToken); 1.247 + if( (NSSCKMDToken *)NULL == rv ) { 1.248 + *pError = CKR_HOST_MEMORY; 1.249 + return (NSSCKMDToken *)NULL; 1.250 + } 1.251 + 1.252 + token->slot = slot; 1.253 + 1.254 + rv->etc = (void *)token; 1.255 + rv->Setup = nss_dbm_mdToken_Setup; 1.256 + rv->Invalidate = nss_dbm_mdToken_Invalidate; 1.257 + rv->InitToken = nss_dbm_mdToken_InitToken; 1.258 + rv->GetLabel = nss_dbm_mdToken_GetLabel; 1.259 + rv->GetManufacturerID = nss_dbm_mdToken_GetManufacturerID; 1.260 + rv->GetModel = nss_dbm_mdToken_GetModel; 1.261 + /* GetSerialNumber is irrelevant */ 1.262 + /* GetHasRNG defaults to CK_FALSE */ 1.263 + rv->GetIsWriteProtected = nss_dbm_mdToken_GetIsWriteProtected; 1.264 + /* GetLoginRequired defaults to CK_FALSE */ 1.265 + /* GetUserPinInitialized defaults to CK_FALSE */ 1.266 + /* GetRestoreKeyNotNeeded is irrelevant */ 1.267 + /* GetHasClockOnToken defaults to CK_FALSE */ 1.268 + /* GetHasProtectedAuthenticationPath defaults to CK_FALSE */ 1.269 + /* GetSupportsDualCryptoOperations is irrelevant */ 1.270 + rv->GetMaxSessionCount = nss_dbm_mdToken_effectively_infinite; 1.271 + rv->GetMaxRwSessionCount = nss_dbm_mdToken_effectively_infinite; 1.272 + /* GetMaxPinLen is irrelevant */ 1.273 + /* GetMinPinLen is irrelevant */ 1.274 + /* GetTotalPublicMemory defaults to CK_UNAVAILABLE_INFORMATION */ 1.275 + /* GetFreePublicMemory defaults to CK_UNAVAILABLE_INFORMATION */ 1.276 + /* GetTotalPrivateMemory defaults to CK_UNAVAILABLE_INFORMATION */ 1.277 + /* GetFreePrivateMemory defaults to CK_UNAVAILABLE_INFORMATION */ 1.278 + rv->GetHardwareVersion = nss_dbm_mdToken_GetHardwareVersion; 1.279 + /* GetFirmwareVersion is irrelevant */ 1.280 + /* GetUTCTime is irrelevant */ 1.281 + rv->OpenSession = nss_dbm_mdToken_OpenSession; 1.282 + rv->null = NULL; 1.283 + 1.284 + return rv; 1.285 +}