| /* 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; |
| } |