security/nss/lib/ckfw/dbm/session.c

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

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

mercurial