1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/security/nss/lib/ckfw/find.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,379 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.6 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +/* 1.9 + * find.c 1.10 + * 1.11 + * This file implements the nssCKFWFindObjects type and methods. 1.12 + */ 1.13 + 1.14 +#ifndef CK_H 1.15 +#include "ck.h" 1.16 +#endif /* CK_H */ 1.17 + 1.18 +/* 1.19 + * NSSCKFWFindObjects 1.20 + * 1.21 + * -- create/destroy -- 1.22 + * nssCKFWFindObjects_Create 1.23 + * nssCKFWFindObjects_Destroy 1.24 + * 1.25 + * -- public accessors -- 1.26 + * NSSCKFWFindObjects_GetMDFindObjects 1.27 + * 1.28 + * -- implement public accessors -- 1.29 + * nssCKFWFindObjects_GetMDFindObjects 1.30 + * 1.31 + * -- private accessors -- 1.32 + * 1.33 + * -- module fronts -- 1.34 + * nssCKFWFindObjects_Next 1.35 + */ 1.36 + 1.37 +struct NSSCKFWFindObjectsStr { 1.38 + NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */ 1.39 + NSSCKMDFindObjects *mdfo1; 1.40 + NSSCKMDFindObjects *mdfo2; 1.41 + NSSCKFWSession *fwSession; 1.42 + NSSCKMDSession *mdSession; 1.43 + NSSCKFWToken *fwToken; 1.44 + NSSCKMDToken *mdToken; 1.45 + NSSCKFWInstance *fwInstance; 1.46 + NSSCKMDInstance *mdInstance; 1.47 + 1.48 + NSSCKMDFindObjects *mdFindObjects; /* varies */ 1.49 +}; 1.50 + 1.51 +#ifdef DEBUG 1.52 +/* 1.53 + * But first, the pointer-tracking stuff. 1.54 + * 1.55 + * NOTE: the pointer-tracking support in NSS/base currently relies 1.56 + * upon NSPR's CallOnce support. That, however, relies upon NSPR's 1.57 + * locking, which is tied into the runtime. We need a pointer-tracker 1.58 + * implementation that uses the locks supplied through C_Initialize. 1.59 + * That support, however, can be filled in later. So for now, I'll 1.60 + * just do these routines as no-ops. 1.61 + */ 1.62 + 1.63 +static CK_RV 1.64 +findObjects_add_pointer 1.65 +( 1.66 + const NSSCKFWFindObjects *fwFindObjects 1.67 +) 1.68 +{ 1.69 + return CKR_OK; 1.70 +} 1.71 + 1.72 +static CK_RV 1.73 +findObjects_remove_pointer 1.74 +( 1.75 + const NSSCKFWFindObjects *fwFindObjects 1.76 +) 1.77 +{ 1.78 + return CKR_OK; 1.79 +} 1.80 + 1.81 +NSS_IMPLEMENT CK_RV 1.82 +nssCKFWFindObjects_verifyPointer 1.83 +( 1.84 + const NSSCKFWFindObjects *fwFindObjects 1.85 +) 1.86 +{ 1.87 + return CKR_OK; 1.88 +} 1.89 + 1.90 +#endif /* DEBUG */ 1.91 + 1.92 +/* 1.93 + * nssCKFWFindObjects_Create 1.94 + * 1.95 + */ 1.96 +NSS_EXTERN NSSCKFWFindObjects * 1.97 +nssCKFWFindObjects_Create 1.98 +( 1.99 + NSSCKFWSession *fwSession, 1.100 + NSSCKFWToken *fwToken, 1.101 + NSSCKFWInstance *fwInstance, 1.102 + NSSCKMDFindObjects *mdFindObjects1, 1.103 + NSSCKMDFindObjects *mdFindObjects2, 1.104 + CK_RV *pError 1.105 +) 1.106 +{ 1.107 + NSSCKFWFindObjects *fwFindObjects = NULL; 1.108 + NSSCKMDSession *mdSession; 1.109 + NSSCKMDToken *mdToken; 1.110 + NSSCKMDInstance *mdInstance; 1.111 + 1.112 + mdSession = nssCKFWSession_GetMDSession(fwSession); 1.113 + mdToken = nssCKFWToken_GetMDToken(fwToken); 1.114 + mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); 1.115 + 1.116 + fwFindObjects = nss_ZNEW(NULL, NSSCKFWFindObjects); 1.117 + if (!fwFindObjects) { 1.118 + *pError = CKR_HOST_MEMORY; 1.119 + goto loser; 1.120 + } 1.121 + 1.122 + fwFindObjects->mdfo1 = mdFindObjects1; 1.123 + fwFindObjects->mdfo2 = mdFindObjects2; 1.124 + fwFindObjects->fwSession = fwSession; 1.125 + fwFindObjects->mdSession = mdSession; 1.126 + fwFindObjects->fwToken = fwToken; 1.127 + fwFindObjects->mdToken = mdToken; 1.128 + fwFindObjects->fwInstance = fwInstance; 1.129 + fwFindObjects->mdInstance = mdInstance; 1.130 + 1.131 + fwFindObjects->mutex = nssCKFWInstance_CreateMutex(fwInstance, NULL, pError); 1.132 + if (!fwFindObjects->mutex) { 1.133 + goto loser; 1.134 + } 1.135 + 1.136 +#ifdef DEBUG 1.137 + *pError = findObjects_add_pointer(fwFindObjects); 1.138 + if( CKR_OK != *pError ) { 1.139 + goto loser; 1.140 + } 1.141 +#endif /* DEBUG */ 1.142 + 1.143 + return fwFindObjects; 1.144 + 1.145 + loser: 1.146 + if( fwFindObjects ) { 1.147 + if( NULL != mdFindObjects1 ) { 1.148 + if( NULL != mdFindObjects1->Final ) { 1.149 + fwFindObjects->mdFindObjects = mdFindObjects1; 1.150 + mdFindObjects1->Final(mdFindObjects1, fwFindObjects, mdSession, 1.151 + fwSession, mdToken, fwToken, mdInstance, fwInstance); 1.152 + } 1.153 + } 1.154 + 1.155 + if( NULL != mdFindObjects2 ) { 1.156 + if( NULL != mdFindObjects2->Final ) { 1.157 + fwFindObjects->mdFindObjects = mdFindObjects2; 1.158 + mdFindObjects2->Final(mdFindObjects2, fwFindObjects, mdSession, 1.159 + fwSession, mdToken, fwToken, mdInstance, fwInstance); 1.160 + } 1.161 + } 1.162 + 1.163 + nss_ZFreeIf(fwFindObjects); 1.164 + } 1.165 + 1.166 + if( CKR_OK == *pError ) { 1.167 + *pError = CKR_GENERAL_ERROR; 1.168 + } 1.169 + 1.170 + return (NSSCKFWFindObjects *)NULL; 1.171 +} 1.172 + 1.173 + 1.174 +/* 1.175 + * nssCKFWFindObjects_Destroy 1.176 + * 1.177 + */ 1.178 +NSS_EXTERN void 1.179 +nssCKFWFindObjects_Destroy 1.180 +( 1.181 + NSSCKFWFindObjects *fwFindObjects 1.182 +) 1.183 +{ 1.184 +#ifdef NSSDEBUG 1.185 + if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { 1.186 + return; 1.187 + } 1.188 +#endif /* NSSDEBUG */ 1.189 + 1.190 + (void)nssCKFWMutex_Destroy(fwFindObjects->mutex); 1.191 + 1.192 + if (fwFindObjects->mdfo1) { 1.193 + if (fwFindObjects->mdfo1->Final) { 1.194 + fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; 1.195 + fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, 1.196 + fwFindObjects->mdSession, fwFindObjects->fwSession, 1.197 + fwFindObjects->mdToken, fwFindObjects->fwToken, 1.198 + fwFindObjects->mdInstance, fwFindObjects->fwInstance); 1.199 + } 1.200 + } 1.201 + 1.202 + if (fwFindObjects->mdfo2) { 1.203 + if (fwFindObjects->mdfo2->Final) { 1.204 + fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; 1.205 + fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, 1.206 + fwFindObjects->mdSession, fwFindObjects->fwSession, 1.207 + fwFindObjects->mdToken, fwFindObjects->fwToken, 1.208 + fwFindObjects->mdInstance, fwFindObjects->fwInstance); 1.209 + } 1.210 + } 1.211 + 1.212 + nss_ZFreeIf(fwFindObjects); 1.213 + 1.214 +#ifdef DEBUG 1.215 + (void)findObjects_remove_pointer(fwFindObjects); 1.216 +#endif /* DEBUG */ 1.217 + 1.218 + return; 1.219 +} 1.220 + 1.221 +/* 1.222 + * nssCKFWFindObjects_GetMDFindObjects 1.223 + * 1.224 + */ 1.225 +NSS_EXTERN NSSCKMDFindObjects * 1.226 +nssCKFWFindObjects_GetMDFindObjects 1.227 +( 1.228 + NSSCKFWFindObjects *fwFindObjects 1.229 +) 1.230 +{ 1.231 +#ifdef NSSDEBUG 1.232 + if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { 1.233 + return (NSSCKMDFindObjects *)NULL; 1.234 + } 1.235 +#endif /* NSSDEBUG */ 1.236 + 1.237 + return fwFindObjects->mdFindObjects; 1.238 +} 1.239 + 1.240 +/* 1.241 + * nssCKFWFindObjects_Next 1.242 + * 1.243 + */ 1.244 +NSS_EXTERN NSSCKFWObject * 1.245 +nssCKFWFindObjects_Next 1.246 +( 1.247 + NSSCKFWFindObjects *fwFindObjects, 1.248 + NSSArena *arenaOpt, 1.249 + CK_RV *pError 1.250 +) 1.251 +{ 1.252 + NSSCKMDObject *mdObject; 1.253 + NSSCKFWObject *fwObject = (NSSCKFWObject *)NULL; 1.254 + NSSArena *objArena; 1.255 + 1.256 +#ifdef NSSDEBUG 1.257 + if (!pError) { 1.258 + return (NSSCKFWObject *)NULL; 1.259 + } 1.260 + 1.261 + *pError = nssCKFWFindObjects_verifyPointer(fwFindObjects); 1.262 + if( CKR_OK != *pError ) { 1.263 + return (NSSCKFWObject *)NULL; 1.264 + } 1.265 +#endif /* NSSDEBUG */ 1.266 + 1.267 + *pError = nssCKFWMutex_Lock(fwFindObjects->mutex); 1.268 + if( CKR_OK != *pError ) { 1.269 + return (NSSCKFWObject *)NULL; 1.270 + } 1.271 + 1.272 + if (fwFindObjects->mdfo1) { 1.273 + if (fwFindObjects->mdfo1->Next) { 1.274 + fwFindObjects->mdFindObjects = fwFindObjects->mdfo1; 1.275 + mdObject = fwFindObjects->mdfo1->Next(fwFindObjects->mdfo1, 1.276 + fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, 1.277 + fwFindObjects->mdToken, fwFindObjects->fwToken, 1.278 + fwFindObjects->mdInstance, fwFindObjects->fwInstance, 1.279 + arenaOpt, pError); 1.280 + if (!mdObject) { 1.281 + if( CKR_OK != *pError ) { 1.282 + goto done; 1.283 + } 1.284 + 1.285 + /* All done. */ 1.286 + fwFindObjects->mdfo1->Final(fwFindObjects->mdfo1, fwFindObjects, 1.287 + fwFindObjects->mdSession, fwFindObjects->fwSession, 1.288 + fwFindObjects->mdToken, fwFindObjects->fwToken, 1.289 + fwFindObjects->mdInstance, fwFindObjects->fwInstance); 1.290 + fwFindObjects->mdfo1 = (NSSCKMDFindObjects *)NULL; 1.291 + } else { 1.292 + goto wrap; 1.293 + } 1.294 + } 1.295 + } 1.296 + 1.297 + if (fwFindObjects->mdfo2) { 1.298 + if (fwFindObjects->mdfo2->Next) { 1.299 + fwFindObjects->mdFindObjects = fwFindObjects->mdfo2; 1.300 + mdObject = fwFindObjects->mdfo2->Next(fwFindObjects->mdfo2, 1.301 + fwFindObjects, fwFindObjects->mdSession, fwFindObjects->fwSession, 1.302 + fwFindObjects->mdToken, fwFindObjects->fwToken, 1.303 + fwFindObjects->mdInstance, fwFindObjects->fwInstance, 1.304 + arenaOpt, pError); 1.305 + if (!mdObject) { 1.306 + if( CKR_OK != *pError ) { 1.307 + goto done; 1.308 + } 1.309 + 1.310 + /* All done. */ 1.311 + fwFindObjects->mdfo2->Final(fwFindObjects->mdfo2, fwFindObjects, 1.312 + fwFindObjects->mdSession, fwFindObjects->fwSession, 1.313 + fwFindObjects->mdToken, fwFindObjects->fwToken, 1.314 + fwFindObjects->mdInstance, fwFindObjects->fwInstance); 1.315 + fwFindObjects->mdfo2 = (NSSCKMDFindObjects *)NULL; 1.316 + } else { 1.317 + goto wrap; 1.318 + } 1.319 + } 1.320 + } 1.321 + 1.322 + /* No more objects */ 1.323 + *pError = CKR_OK; 1.324 + goto done; 1.325 + 1.326 + wrap: 1.327 + /* 1.328 + * This seems is less than ideal-- we should determine if it's a token 1.329 + * object or a session object, and use the appropriate arena. 1.330 + * But that duplicates logic in nssCKFWObject_IsTokenObject. 1.331 + * Also we should lookup the real session the object was created on 1.332 + * if the object was a session object... however this code is actually 1.333 + * correct because nssCKFWObject_Create will return a cached version of 1.334 + * the object from it's hash. This is necessary because 1) we don't want 1.335 + * to create an arena style leak (where our arena grows with every search), 1.336 + * and 2) we want the same object to always have the same ID. This means 1.337 + * the only case the nssCKFWObject_Create() will need the objArena and the 1.338 + * Session is in the case of token objects (session objects should already 1.339 + * exist in the cache from their initial creation). So this code is correct, 1.340 + * but it depends on nssCKFWObject_Create caching all objects. 1.341 + */ 1.342 + objArena = nssCKFWToken_GetArena(fwFindObjects->fwToken, pError); 1.343 + if (!objArena) { 1.344 + if( CKR_OK == *pError ) { 1.345 + *pError = CKR_HOST_MEMORY; 1.346 + } 1.347 + goto done; 1.348 + } 1.349 + 1.350 + fwObject = nssCKFWObject_Create(objArena, mdObject, 1.351 + NULL, fwFindObjects->fwToken, 1.352 + fwFindObjects->fwInstance, pError); 1.353 + if (!fwObject) { 1.354 + if( CKR_OK == *pError ) { 1.355 + *pError = CKR_GENERAL_ERROR; 1.356 + } 1.357 + } 1.358 + 1.359 + done: 1.360 + (void)nssCKFWMutex_Unlock(fwFindObjects->mutex); 1.361 + return fwObject; 1.362 +} 1.363 + 1.364 +/* 1.365 + * NSSCKFWFindObjects_GetMDFindObjects 1.366 + * 1.367 + */ 1.368 + 1.369 +NSS_EXTERN NSSCKMDFindObjects * 1.370 +NSSCKFWFindObjects_GetMDFindObjects 1.371 +( 1.372 + NSSCKFWFindObjects *fwFindObjects 1.373 +) 1.374 +{ 1.375 +#ifdef DEBUG 1.376 + if( CKR_OK != nssCKFWFindObjects_verifyPointer(fwFindObjects) ) { 1.377 + return (NSSCKMDFindObjects *)NULL; 1.378 + } 1.379 +#endif /* DEBUG */ 1.380 + 1.381 + return nssCKFWFindObjects_GetMDFindObjects(fwFindObjects); 1.382 +}