tor-browser

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

session.c (7418B)


      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 void
      8 nss_dbm_mdSession_Close(
      9    NSSCKMDSession *mdSession,
     10    NSSCKFWSession *fwSession,
     11    NSSCKMDToken *mdToken,
     12    NSSCKFWToken *fwToken,
     13    NSSCKMDInstance *mdInstance,
     14    NSSCKFWInstance *fwInstance)
     15 {
     16    nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc;
     17 
     18    struct nss_dbm_dbt_node *w;
     19 
     20    /* Lock */
     21    {
     22        if (CKR_OK != NSSCKFWMutex_Lock(session->list_lock)) {
     23            return;
     24        }
     25 
     26        w = session->session_objects;
     27        session->session_objects = (struct nss_dbm_dbt_node *)NULL; /* sanity */
     28 
     29        (void)NSSCKFWMutex_Unlock(session->list_lock);
     30    }
     31 
     32    for (; (struct nss_dbm_dbt_node *)NULL != w; w = w->next) {
     33        (void)nss_dbm_db_delete_object(w->dbt);
     34    }
     35 }
     36 
     37 static CK_ULONG
     38 nss_dbm_mdSession_GetDeviceError(
     39    NSSCKMDSession *mdSession,
     40    NSSCKFWSession *fwSession,
     41    NSSCKMDToken *mdToken,
     42    NSSCKFWToken *fwToken,
     43    NSSCKMDInstance *mdInstance,
     44    NSSCKFWInstance *fwInstance)
     45 {
     46    nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc;
     47    return session->deviceError;
     48 }
     49 
     50 /* Login isn't needed */
     51 /* Logout isn't needed */
     52 /* InitPIN is irrelevant */
     53 /* SetPIN is irrelevant */
     54 /* GetOperationStateLen is irrelevant */
     55 /* GetOperationState is irrelevant */
     56 /* SetOperationState is irrelevant */
     57 
     58 static NSSCKMDObject *
     59 nss_dbm_mdSession_CreateObject(
     60    NSSCKMDSession *mdSession,
     61    NSSCKFWSession *fwSession,
     62    NSSCKMDToken *mdToken,
     63    NSSCKFWToken *fwToken,
     64    NSSCKMDInstance *mdInstance,
     65    NSSCKFWInstance *fwInstance,
     66    NSSArena *handyArenaPointer,
     67    CK_ATTRIBUTE_PTR pTemplate,
     68    CK_ULONG ulAttributeCount,
     69    CK_RV *pError)
     70 {
     71    nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc;
     72    nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
     73    CK_ULONG i;
     74    CK_BBOOL isToken = CK_FALSE; /* defaults to false */
     75    NSSCKMDObject *rv;
     76    struct nss_dbm_dbt_node *node = (struct nss_dbm_dbt_node *)NULL;
     77    nss_dbm_object_t *object;
     78    nss_dbm_db_t *which_db;
     79 
     80    /* This framework should really pass this to me */
     81    for (i = 0; i < ulAttributeCount; i++) {
     82        if (CKA_TOKEN == pTemplate[i].type) {
     83            isToken = *(CK_BBOOL *)pTemplate[i].pValue;
     84            break;
     85        }
     86    }
     87 
     88    object = nss_ZNEW(handyArenaPointer, nss_dbm_object_t);
     89    if ((nss_dbm_object_t *)NULL == object) {
     90        *pError = CKR_HOST_MEMORY;
     91        return (NSSCKMDObject *)NULL;
     92    }
     93 
     94    object->arena = handyArenaPointer;
     95    which_db = isToken ? token->slot->token_db : token->session_db;
     96 
     97    /* Do this before the actual database call; it's easier to recover from */
     98    rv = nss_dbm_mdObject_factory(object, pError);
     99    if ((NSSCKMDObject *)NULL == rv) {
    100        return (NSSCKMDObject *)NULL;
    101    }
    102 
    103    if (CK_FALSE == isToken) {
    104        node = nss_ZNEW(session->arena, struct nss_dbm_dbt_node);
    105        if ((struct nss_dbm_dbt_node *)NULL == node) {
    106            *pError = CKR_HOST_MEMORY;
    107            return (NSSCKMDObject *)NULL;
    108        }
    109    }
    110 
    111    object->handle = nss_dbm_db_create_object(handyArenaPointer, which_db,
    112                                              pTemplate, ulAttributeCount,
    113                                              pError, &session->deviceError);
    114    if ((nss_dbm_dbt_t *)NULL == object->handle) {
    115        return (NSSCKMDObject *)NULL;
    116    }
    117 
    118    if (CK_FALSE == isToken) {
    119        node->dbt = object->handle;
    120        /* Lock */
    121        {
    122            *pError = NSSCKFWMutex_Lock(session->list_lock);
    123            if (CKR_OK != *pError) {
    124                (void)nss_dbm_db_delete_object(object->handle);
    125                return (NSSCKMDObject *)NULL;
    126            }
    127 
    128            node->next = session->session_objects;
    129            session->session_objects = node;
    130 
    131            *pError = NSSCKFWMutex_Unlock(session->list_lock);
    132        }
    133    }
    134 
    135    return rv;
    136 }
    137 
    138 /* CopyObject isn't needed; the framework will use CreateObject */
    139 
    140 static NSSCKMDFindObjects *
    141 nss_dbm_mdSession_FindObjectsInit(
    142    NSSCKMDSession *mdSession,
    143    NSSCKFWSession *fwSession,
    144    NSSCKMDToken *mdToken,
    145    NSSCKFWToken *fwToken,
    146    NSSCKMDInstance *mdInstance,
    147    NSSCKFWInstance *fwInstance,
    148    CK_ATTRIBUTE_PTR pTemplate,
    149    CK_ULONG ulAttributeCount,
    150    CK_RV *pError)
    151 {
    152    nss_dbm_session_t *session = (nss_dbm_session_t *)mdSession->etc;
    153    nss_dbm_token_t *token = (nss_dbm_token_t *)mdToken->etc;
    154    NSSArena *arena;
    155    nss_dbm_find_t *find;
    156    NSSCKMDFindObjects *rv;
    157 
    158    arena = NSSArena_Create();
    159    if ((NSSArena *)NULL == arena) {
    160        *pError = CKR_HOST_MEMORY;
    161        goto loser;
    162    }
    163 
    164    find = nss_ZNEW(arena, nss_dbm_find_t);
    165    if ((nss_dbm_find_t *)NULL == find) {
    166        *pError = CKR_HOST_MEMORY;
    167        goto loser;
    168    }
    169 
    170    find->arena = arena;
    171    find->list_lock = NSSCKFWInstance_CreateMutex(fwInstance, arena, pError);
    172    if ((NSSCKFWMutex *)NULL == find->list_lock) {
    173        goto loser;
    174    }
    175 
    176    *pError = nss_dbm_db_find_objects(find, token->slot->token_db, pTemplate,
    177                                      ulAttributeCount, &session->deviceError);
    178    if (CKR_OK != *pError) {
    179        goto loser;
    180    }
    181 
    182    *pError = nss_dbm_db_find_objects(find, token->session_db, pTemplate,
    183                                      ulAttributeCount, &session->deviceError);
    184    if (CKR_OK != *pError) {
    185        goto loser;
    186    }
    187 
    188    rv = nss_dbm_mdFindObjects_factory(find, pError);
    189    if ((NSSCKMDFindObjects *)NULL == rv) {
    190        goto loser;
    191    }
    192 
    193    return rv;
    194 
    195 loser:
    196    if ((NSSArena *)NULL != arena) {
    197        (void)NSSArena_Destroy(arena);
    198    }
    199 
    200    return (NSSCKMDFindObjects *)NULL;
    201 }
    202 
    203 /* SeedRandom is irrelevant */
    204 /* GetRandom is irrelevant */
    205 
    206 NSS_IMPLEMENT NSSCKMDSession *
    207 nss_dbm_mdSession_factory(
    208    nss_dbm_token_t *token,
    209    NSSCKFWSession *fwSession,
    210    NSSCKFWInstance *fwInstance,
    211    CK_BBOOL rw,
    212    CK_RV *pError)
    213 {
    214    NSSArena *arena;
    215    nss_dbm_session_t *session;
    216    NSSCKMDSession *rv;
    217 
    218    arena = NSSCKFWSession_GetArena(fwSession, pError);
    219 
    220    session = nss_ZNEW(arena, nss_dbm_session_t);
    221    if ((nss_dbm_session_t *)NULL == session) {
    222        *pError = CKR_HOST_MEMORY;
    223        return (NSSCKMDSession *)NULL;
    224    }
    225 
    226    rv = nss_ZNEW(arena, NSSCKMDSession);
    227    if ((NSSCKMDSession *)NULL == rv) {
    228        *pError = CKR_HOST_MEMORY;
    229        return (NSSCKMDSession *)NULL;
    230    }
    231 
    232    session->arena = arena;
    233    session->token = token;
    234    session->list_lock = NSSCKFWInstance_CreateMutex(fwInstance, arena, pError);
    235    if ((NSSCKFWMutex *)NULL == session->list_lock) {
    236        return (NSSCKMDSession *)NULL;
    237    }
    238 
    239    rv->etc = (void *)session;
    240    rv->Close = nss_dbm_mdSession_Close;
    241    rv->GetDeviceError = nss_dbm_mdSession_GetDeviceError;
    242    /*  Login isn't needed */
    243    /*  Logout isn't needed */
    244    /*  InitPIN is irrelevant */
    245    /*  SetPIN is irrelevant */
    246    /*  GetOperationStateLen is irrelevant */
    247    /*  GetOperationState is irrelevant */
    248    /*  SetOperationState is irrelevant */
    249    rv->CreateObject = nss_dbm_mdSession_CreateObject;
    250    /*  CopyObject isn't needed; the framework will use CreateObject */
    251    rv->FindObjectsInit = nss_dbm_mdSession_FindObjectsInit;
    252    rv->null = NULL;
    253 
    254    return rv;
    255 }