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