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 }