michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "ckdbm.h" michael@0: michael@0: static CK_RV michael@0: nss_dbm_mdToken_Setup michael@0: ( michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance michael@0: ) michael@0: { michael@0: nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; michael@0: CK_RV rv = CKR_OK; michael@0: michael@0: token->arena = NSSCKFWToken_GetArena(fwToken, &rv); michael@0: token->session_db = nss_dbm_db_open(token->arena, fwInstance, (char *)NULL, michael@0: O_RDWR|O_CREAT, &rv); michael@0: if( (nss_dbm_db_t *)NULL == token->session_db ) { michael@0: return rv; michael@0: } michael@0: michael@0: /* Add a label record if there isn't one? */ michael@0: michael@0: return CKR_OK; michael@0: } michael@0: michael@0: static void michael@0: nss_dbm_mdToken_Invalidate michael@0: ( michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance michael@0: ) michael@0: { michael@0: nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; michael@0: michael@0: if( (nss_dbm_db_t *)NULL != token->session_db ) { michael@0: nss_dbm_db_close(token->session_db); michael@0: token->session_db = (nss_dbm_db_t *)NULL; michael@0: } michael@0: } michael@0: michael@0: static CK_RV michael@0: nss_dbm_mdToken_InitToken michael@0: ( michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance, michael@0: NSSItem *pin, michael@0: NSSUTF8 *label michael@0: ) michael@0: { michael@0: nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; michael@0: nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc; michael@0: CK_RV rv; michael@0: michael@0: /* Wipe the session object data */ michael@0: michael@0: if( (nss_dbm_db_t *)NULL != token->session_db ) { michael@0: nss_dbm_db_close(token->session_db); michael@0: } michael@0: michael@0: token->session_db = nss_dbm_db_open(token->arena, fwInstance, (char *)NULL, michael@0: O_RDWR|O_CREAT, &rv); michael@0: if( (nss_dbm_db_t *)NULL == token->session_db ) { michael@0: return rv; michael@0: } michael@0: michael@0: /* Wipe the token object data */ michael@0: michael@0: if( token->slot->flags & O_RDWR ) { michael@0: if( (nss_dbm_db_t *)NULL != token->slot->token_db ) { michael@0: nss_dbm_db_close(token->slot->token_db); michael@0: } michael@0: michael@0: token->slot->token_db = nss_dbm_db_open(instance->arena, fwInstance, michael@0: token->slot->filename, michael@0: token->slot->flags | O_CREAT | O_TRUNC, michael@0: &rv); michael@0: if( (nss_dbm_db_t *)NULL == token->slot->token_db ) { michael@0: return rv; michael@0: } michael@0: michael@0: /* PIN is irrelevant */ michael@0: michael@0: rv = nss_dbm_db_set_label(token->slot->token_db, label); michael@0: if( CKR_OK != rv ) { michael@0: return rv; michael@0: } michael@0: } michael@0: michael@0: return CKR_OK; michael@0: } michael@0: michael@0: static NSSUTF8 * michael@0: nss_dbm_mdToken_GetLabel michael@0: ( michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance, michael@0: CK_RV *pError michael@0: ) michael@0: { michael@0: nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; michael@0: michael@0: if( (NSSUTF8 *)NULL == token->label ) { michael@0: token->label = nss_dbm_db_get_label(token->slot->token_db, token->arena, pError); michael@0: } michael@0: michael@0: /* If no label has been set, return *something* */ michael@0: if( (NSSUTF8 *)NULL == token->label ) { michael@0: return token->slot->filename; michael@0: } michael@0: michael@0: return token->label; michael@0: } michael@0: michael@0: static NSSUTF8 * michael@0: nss_dbm_mdToken_GetManufacturerID michael@0: ( michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance, michael@0: CK_RV *pError michael@0: ) michael@0: { michael@0: return "mozilla.org NSS"; michael@0: } michael@0: michael@0: static NSSUTF8 * michael@0: nss_dbm_mdToken_GetModel michael@0: ( michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance, michael@0: CK_RV *pError michael@0: ) michael@0: { michael@0: return "dbm"; michael@0: } michael@0: michael@0: /* GetSerialNumber is irrelevant */ michael@0: /* GetHasRNG defaults to CK_FALSE */ michael@0: michael@0: static CK_BBOOL michael@0: nss_dbm_mdToken_GetIsWriteProtected michael@0: ( michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance michael@0: ) michael@0: { michael@0: nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; michael@0: michael@0: if( token->slot->flags & O_RDWR ) { michael@0: return CK_FALSE; michael@0: } else { michael@0: return CK_TRUE; michael@0: } michael@0: } michael@0: michael@0: /* GetLoginRequired defaults to CK_FALSE */ michael@0: /* GetUserPinInitialized defaults to CK_FALSE */ michael@0: /* GetRestoreKeyNotNeeded is irrelevant */ michael@0: /* GetHasClockOnToken defaults to CK_FALSE */ michael@0: /* GetHasProtectedAuthenticationPath defaults to CK_FALSE */ michael@0: /* GetSupportsDualCryptoOperations is irrelevant */ michael@0: michael@0: static CK_ULONG michael@0: nss_dbm_mdToken_effectively_infinite michael@0: ( michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance michael@0: ) michael@0: { michael@0: return CK_EFFECTIVELY_INFINITE; michael@0: } michael@0: michael@0: static CK_VERSION michael@0: nss_dbm_mdToken_GetHardwareVersion michael@0: ( michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance michael@0: ) michael@0: { michael@0: nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; michael@0: return nss_dbm_db_get_format_version(token->slot->token_db); michael@0: } michael@0: michael@0: /* GetFirmwareVersion is irrelevant */ michael@0: /* GetUTCTime is irrelevant */ michael@0: michael@0: static NSSCKMDSession * michael@0: nss_dbm_mdToken_OpenSession michael@0: ( michael@0: NSSCKMDToken *mdToken, michael@0: NSSCKFWToken *fwToken, michael@0: NSSCKMDInstance *mdInstance, michael@0: NSSCKFWInstance *fwInstance, michael@0: NSSCKFWSession *fwSession, michael@0: CK_BBOOL rw, michael@0: CK_RV *pError michael@0: ) michael@0: { michael@0: nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc; michael@0: return nss_dbm_mdSession_factory(token, fwSession, fwInstance, rw, pError); michael@0: } michael@0: michael@0: /* GetMechanismCount defaults to zero */ michael@0: /* GetMechanismTypes is irrelevant */ michael@0: /* GetMechanism is irrelevant */ michael@0: michael@0: NSS_IMPLEMENT NSSCKMDToken * michael@0: nss_dbm_mdToken_factory michael@0: ( michael@0: nss_dbm_slot_t *slot, michael@0: CK_RV *pError michael@0: ) michael@0: { michael@0: nss_dbm_token_t *token; michael@0: NSSCKMDToken *rv; michael@0: michael@0: token = nss_ZNEW(slot->instance->arena, nss_dbm_token_t); michael@0: if( (nss_dbm_token_t *)NULL == token ) { michael@0: *pError = CKR_HOST_MEMORY; michael@0: return (NSSCKMDToken *)NULL; michael@0: } michael@0: michael@0: rv = nss_ZNEW(slot->instance->arena, NSSCKMDToken); michael@0: if( (NSSCKMDToken *)NULL == rv ) { michael@0: *pError = CKR_HOST_MEMORY; michael@0: return (NSSCKMDToken *)NULL; michael@0: } michael@0: michael@0: token->slot = slot; michael@0: michael@0: rv->etc = (void *)token; michael@0: rv->Setup = nss_dbm_mdToken_Setup; michael@0: rv->Invalidate = nss_dbm_mdToken_Invalidate; michael@0: rv->InitToken = nss_dbm_mdToken_InitToken; michael@0: rv->GetLabel = nss_dbm_mdToken_GetLabel; michael@0: rv->GetManufacturerID = nss_dbm_mdToken_GetManufacturerID; michael@0: rv->GetModel = nss_dbm_mdToken_GetModel; michael@0: /* GetSerialNumber is irrelevant */ michael@0: /* GetHasRNG defaults to CK_FALSE */ michael@0: rv->GetIsWriteProtected = nss_dbm_mdToken_GetIsWriteProtected; michael@0: /* GetLoginRequired defaults to CK_FALSE */ michael@0: /* GetUserPinInitialized defaults to CK_FALSE */ michael@0: /* GetRestoreKeyNotNeeded is irrelevant */ michael@0: /* GetHasClockOnToken defaults to CK_FALSE */ michael@0: /* GetHasProtectedAuthenticationPath defaults to CK_FALSE */ michael@0: /* GetSupportsDualCryptoOperations is irrelevant */ michael@0: rv->GetMaxSessionCount = nss_dbm_mdToken_effectively_infinite; michael@0: rv->GetMaxRwSessionCount = nss_dbm_mdToken_effectively_infinite; michael@0: /* GetMaxPinLen is irrelevant */ michael@0: /* GetMinPinLen is irrelevant */ michael@0: /* GetTotalPublicMemory defaults to CK_UNAVAILABLE_INFORMATION */ michael@0: /* GetFreePublicMemory defaults to CK_UNAVAILABLE_INFORMATION */ michael@0: /* GetTotalPrivateMemory defaults to CK_UNAVAILABLE_INFORMATION */ michael@0: /* GetFreePrivateMemory defaults to CK_UNAVAILABLE_INFORMATION */ michael@0: rv->GetHardwareVersion = nss_dbm_mdToken_GetHardwareVersion; michael@0: /* GetFirmwareVersion is irrelevant */ michael@0: /* GetUTCTime is irrelevant */ michael@0: rv->OpenSession = nss_dbm_mdToken_OpenSession; michael@0: rv->null = NULL; michael@0: michael@0: return rv; michael@0: }