tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

slot.c (4490B)


      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_mdSlot_Initialize(
      9    NSSCKMDSlot *mdSlot,
     10    NSSCKFWSlot *fwSlot,
     11    NSSCKMDInstance *mdInstance,
     12    NSSCKFWInstance *fwInstance)
     13 {
     14    nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc;
     15    nss_dbm_instance_t *instance = (nss_dbm_instance_t *)mdInstance->etc;
     16    CK_RV rv = CKR_OK;
     17 
     18    slot->token_db = nss_dbm_db_open(instance->arena, fwInstance, slot->filename,
     19                                     slot->flags, &rv);
     20    if ((nss_dbm_db_t *)NULL == slot->token_db) {
     21        if (CKR_TOKEN_NOT_PRESENT == rv) {
     22            /* This is not an error-- just means "the token isn't there" */
     23            rv = CKR_OK;
     24        }
     25    }
     26 
     27    return rv;
     28 }
     29 
     30 static void
     31 nss_dbm_mdSlot_Destroy(
     32    NSSCKMDSlot *mdSlot,
     33    NSSCKFWSlot *fwSlot,
     34    NSSCKMDInstance *mdInstance,
     35    NSSCKFWInstance *fwInstance)
     36 {
     37    nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc;
     38 
     39    if ((nss_dbm_db_t *)NULL != slot->token_db) {
     40        nss_dbm_db_close(slot->token_db);
     41        slot->token_db = (nss_dbm_db_t *)NULL;
     42    }
     43 }
     44 
     45 static NSSUTF8 *
     46 nss_dbm_mdSlot_GetSlotDescription(
     47    NSSCKMDSlot *mdSlot,
     48    NSSCKFWSlot *fwSlot,
     49    NSSCKMDInstance *mdInstance,
     50    NSSCKFWInstance *fwInstance,
     51    CK_RV *pError)
     52 {
     53    return "Database";
     54 }
     55 
     56 static NSSUTF8 *
     57 nss_dbm_mdSlot_GetManufacturerID(
     58    NSSCKMDSlot *mdSlot,
     59    NSSCKFWSlot *fwSlot,
     60    NSSCKMDInstance *mdInstance,
     61    NSSCKFWInstance *fwInstance,
     62    CK_RV *pError)
     63 {
     64    return "Berkeley";
     65 }
     66 
     67 static CK_BBOOL
     68 nss_dbm_mdSlot_GetTokenPresent(
     69    NSSCKMDSlot *mdSlot,
     70    NSSCKFWSlot *fwSlot,
     71    NSSCKMDInstance *mdInstance,
     72    NSSCKFWInstance *fwInstance)
     73 {
     74    nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc;
     75 
     76    if ((nss_dbm_db_t *)NULL == slot->token_db) {
     77        return CK_FALSE;
     78    } else {
     79        return CK_TRUE;
     80    }
     81 }
     82 
     83 static CK_BBOOL
     84 nss_dbm_mdSlot_GetRemovableDevice(
     85    NSSCKMDSlot *mdSlot,
     86    NSSCKFWSlot *fwSlot,
     87    NSSCKMDInstance *mdInstance,
     88    NSSCKFWInstance *fwInstance)
     89 {
     90    /*
     91     * Well, this supports "tokens" (databases) that aren't there, so in
     92     * that sense they're removable.  It'd be nice to handle databases
     93     * that suddenly disappear (NFS-mounted home directories and network
     94     * errors, for instance) but that's a harder problem.  We'll say
     95     * we support removable devices, badly.
     96     */
     97 
     98    return CK_TRUE;
     99 }
    100 
    101 /* nss_dbm_mdSlot_GetHardwareSlot defaults to CK_FALSE */
    102 /*
    103 * nss_dbm_mdSlot_GetHardwareVersion
    104 * nss_dbm_mdSlot_GetFirmwareVersion
    105 *
    106 * These are kinda fuzzy concepts here.  I suppose we could return the
    107 * Berkeley DB version for one of them, if we had an actual number we
    108 * were confident in.  But mcom's "dbm" has been hacked enough that I
    109 * don't really know from what "real" version it stems..
    110 */
    111 
    112 static NSSCKMDToken *
    113 nss_dbm_mdSlot_GetToken(
    114    NSSCKMDSlot *mdSlot,
    115    NSSCKFWSlot *fwSlot,
    116    NSSCKMDInstance *mdInstance,
    117    NSSCKFWInstance *fwInstance,
    118    CK_RV *pError)
    119 {
    120    nss_dbm_slot_t *slot = (nss_dbm_slot_t *)mdSlot->etc;
    121    return nss_dbm_mdToken_factory(slot, pError);
    122 }
    123 
    124 NSS_IMPLEMENT NSSCKMDSlot *
    125 nss_dbm_mdSlot_factory(
    126    nss_dbm_instance_t *instance,
    127    char *filename,
    128    int flags,
    129    CK_RV *pError)
    130 {
    131    nss_dbm_slot_t *slot;
    132    NSSCKMDSlot *rv;
    133 
    134    slot = nss_ZNEW(instance->arena, nss_dbm_slot_t);
    135    if ((nss_dbm_slot_t *)NULL == slot) {
    136        *pError = CKR_HOST_MEMORY;
    137        return (NSSCKMDSlot *)NULL;
    138    }
    139 
    140    slot->instance = instance;
    141    slot->filename = filename;
    142    slot->flags = flags;
    143    slot->token_db = (nss_dbm_db_t *)NULL;
    144 
    145    rv = nss_ZNEW(instance->arena, NSSCKMDSlot);
    146    if ((NSSCKMDSlot *)NULL == rv) {
    147        *pError = CKR_HOST_MEMORY;
    148        return (NSSCKMDSlot *)NULL;
    149    }
    150 
    151    rv->etc = (void *)slot;
    152    rv->Initialize = nss_dbm_mdSlot_Initialize;
    153    rv->Destroy = nss_dbm_mdSlot_Destroy;
    154    rv->GetSlotDescription = nss_dbm_mdSlot_GetSlotDescription;
    155    rv->GetManufacturerID = nss_dbm_mdSlot_GetManufacturerID;
    156    rv->GetTokenPresent = nss_dbm_mdSlot_GetTokenPresent;
    157    rv->GetRemovableDevice = nss_dbm_mdSlot_GetRemovableDevice;
    158    /*  GetHardwareSlot */
    159    /*  GetHardwareVersion */
    160    /*  GetFirmwareVersion */
    161    rv->GetToken = nss_dbm_mdSlot_GetToken;
    162    rv->null = (void *)NULL;
    163 
    164    return rv;
    165 }