| OLD | NEW |
| 1 /* This Source Code Form is subject to the terms of the Mozilla Public | 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 | 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/. */ | 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
| 4 | 4 |
| 5 /* | 5 /* |
| 6 * object.c | 6 * object.c |
| 7 * | 7 * |
| 8 * This file implements the NSSCKFWObject type and methods. | 8 * This file implements the NSSCKFWObject type and methods. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 * nssCKFWObject_IsTokenObject | 43 * nssCKFWObject_IsTokenObject |
| 44 * nssCKFWObject_GetAttributeCount | 44 * nssCKFWObject_GetAttributeCount |
| 45 * nssCKFWObject_GetAttributeTypes | 45 * nssCKFWObject_GetAttributeTypes |
| 46 * nssCKFWObject_GetAttributeSize | 46 * nssCKFWObject_GetAttributeSize |
| 47 * nssCKFWObject_GetAttribute | 47 * nssCKFWObject_GetAttribute |
| 48 * nssCKFWObject_SetAttribute | 48 * nssCKFWObject_SetAttribute |
| 49 * nssCKFWObject_GetObjectSize | 49 * nssCKFWObject_GetObjectSize |
| 50 */ | 50 */ |
| 51 | 51 |
| 52 struct NSSCKFWObjectStr { | 52 struct NSSCKFWObjectStr { |
| 53 NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */ | 53 NSSCKFWMutex *mutex; /* merely to serialise the MDObject calls */ |
| 54 NSSArena *arena; | 54 NSSArena *arena; |
| 55 NSSCKMDObject *mdObject; | 55 NSSCKMDObject *mdObject; |
| 56 NSSCKMDSession *mdSession; | 56 NSSCKMDSession *mdSession; |
| 57 NSSCKFWSession *fwSession; | 57 NSSCKFWSession *fwSession; |
| 58 NSSCKMDToken *mdToken; | 58 NSSCKMDToken *mdToken; |
| 59 NSSCKFWToken *fwToken; | 59 NSSCKFWToken *fwToken; |
| 60 NSSCKMDInstance *mdInstance; | 60 NSSCKMDInstance *mdInstance; |
| 61 NSSCKFWInstance *fwInstance; | 61 NSSCKFWInstance *fwInstance; |
| 62 CK_OBJECT_HANDLE hObject; | 62 CK_OBJECT_HANDLE hObject; |
| 63 }; | 63 }; |
| 64 | 64 |
| 65 #ifdef DEBUG | 65 #ifdef DEBUG |
| 66 /* | 66 /* |
| 67 * But first, the pointer-tracking stuff. | 67 * But first, the pointer-tracking stuff. |
| 68 * | 68 * |
| 69 * NOTE: the pointer-tracking support in NSS/base currently relies | 69 * NOTE: the pointer-tracking support in NSS/base currently relies |
| 70 * upon NSPR's CallOnce support. That, however, relies upon NSPR's | 70 * upon NSPR's CallOnce support. That, however, relies upon NSPR's |
| 71 * locking, which is tied into the runtime. We need a pointer-tracker | 71 * locking, which is tied into the runtime. We need a pointer-tracker |
| 72 * implementation that uses the locks supplied through C_Initialize. | 72 * implementation that uses the locks supplied through C_Initialize. |
| 73 * That support, however, can be filled in later. So for now, I'll | 73 * That support, however, can be filled in later. So for now, I'll |
| 74 * just do this routines as no-ops. | 74 * just do this routines as no-ops. |
| 75 */ | 75 */ |
| 76 | 76 |
| 77 static CK_RV | 77 static CK_RV |
| 78 object_add_pointer | 78 object_add_pointer( |
| 79 ( | 79 const NSSCKFWObject *fwObject) |
| 80 const NSSCKFWObject *fwObject | |
| 81 ) | |
| 82 { | 80 { |
| 83 return CKR_OK; | 81 return CKR_OK; |
| 84 } | 82 } |
| 85 | 83 |
| 86 static CK_RV | 84 static CK_RV |
| 87 object_remove_pointer | 85 object_remove_pointer( |
| 88 ( | 86 const NSSCKFWObject *fwObject) |
| 89 const NSSCKFWObject *fwObject | |
| 90 ) | |
| 91 { | 87 { |
| 92 return CKR_OK; | 88 return CKR_OK; |
| 93 } | 89 } |
| 94 | 90 |
| 95 NSS_IMPLEMENT CK_RV | 91 NSS_IMPLEMENT CK_RV |
| 96 nssCKFWObject_verifyPointer | 92 nssCKFWObject_verifyPointer( |
| 97 ( | 93 const NSSCKFWObject *fwObject) |
| 98 const NSSCKFWObject *fwObject | |
| 99 ) | |
| 100 { | 94 { |
| 101 return CKR_OK; | 95 return CKR_OK; |
| 102 } | 96 } |
| 103 | 97 |
| 104 #endif /* DEBUG */ | 98 #endif /* DEBUG */ |
| 105 | 99 |
| 106 | |
| 107 /* | 100 /* |
| 108 * nssCKFWObject_Create | 101 * nssCKFWObject_Create |
| 109 * | 102 * |
| 110 */ | 103 */ |
| 111 NSS_IMPLEMENT NSSCKFWObject * | 104 NSS_IMPLEMENT NSSCKFWObject * |
| 112 nssCKFWObject_Create | 105 nssCKFWObject_Create( |
| 113 ( | 106 NSSArena *arena, |
| 114 NSSArena *arena, | 107 NSSCKMDObject *mdObject, |
| 115 NSSCKMDObject *mdObject, | 108 NSSCKFWSession *fwSession, |
| 116 NSSCKFWSession *fwSession, | 109 NSSCKFWToken *fwToken, |
| 117 NSSCKFWToken *fwToken, | 110 NSSCKFWInstance *fwInstance, |
| 118 NSSCKFWInstance *fwInstance, | 111 CK_RV *pError) |
| 119 CK_RV *pError | |
| 120 ) | |
| 121 { | 112 { |
| 122 NSSCKFWObject *fwObject; | 113 NSSCKFWObject *fwObject; |
| 123 nssCKFWHash *mdObjectHash; | 114 nssCKFWHash *mdObjectHash; |
| 124 | 115 |
| 125 #ifdef NSSDEBUG | 116 #ifdef NSSDEBUG |
| 126 if (!pError) { | 117 if (!pError) { |
| 127 return (NSSCKFWObject *)NULL; | 118 return (NSSCKFWObject *)NULL; |
| 128 } | 119 } |
| 129 | 120 |
| 130 if( PR_SUCCESS != nssArena_verifyPointer(arena) ) { | 121 if (PR_SUCCESS != nssArena_verifyPointer(arena)) { |
| 131 *pError = CKR_ARGUMENTS_BAD; | 122 *pError = CKR_ARGUMENTS_BAD; |
| 132 return (NSSCKFWObject *)NULL; | 123 return (NSSCKFWObject *)NULL; |
| 133 } | 124 } |
| 134 #endif /* NSSDEBUG */ | 125 #endif /* NSSDEBUG */ |
| 135 | 126 |
| 136 if (!fwToken) { | 127 if (!fwToken) { |
| 137 *pError = CKR_ARGUMENTS_BAD; | 128 *pError = CKR_ARGUMENTS_BAD; |
| 138 return (NSSCKFWObject *)NULL; | 129 return (NSSCKFWObject *)NULL; |
| 139 } | 130 } |
| 140 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwToken); | 131 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwToken); |
| 141 if (!mdObjectHash) { | 132 if (!mdObjectHash) { |
| 142 *pError = CKR_GENERAL_ERROR; | 133 *pError = CKR_GENERAL_ERROR; |
| 143 return (NSSCKFWObject *)NULL; | 134 return (NSSCKFWObject *)NULL; |
| 144 } | 135 } |
| 145 | 136 |
| 146 if( nssCKFWHash_Exists(mdObjectHash, mdObject) ) { | 137 if (nssCKFWHash_Exists(mdObjectHash, mdObject)) { |
| 147 fwObject = nssCKFWHash_Lookup(mdObjectHash, mdObject); | 138 fwObject = nssCKFWHash_Lookup(mdObjectHash, mdObject); |
| 148 return fwObject; | 139 return fwObject; |
| 149 } | 140 } |
| 150 | 141 |
| 151 fwObject = nss_ZNEW(arena, NSSCKFWObject); | 142 fwObject = nss_ZNEW(arena, NSSCKFWObject); |
| 152 if (!fwObject) { | 143 if (!fwObject) { |
| 153 *pError = CKR_HOST_MEMORY; | 144 *pError = CKR_HOST_MEMORY; |
| 154 return (NSSCKFWObject *)NULL; | 145 return (NSSCKFWObject *)NULL; |
| 155 } | 146 } |
| 156 | 147 |
| 157 fwObject->arena = arena; | 148 fwObject->arena = arena; |
| 158 fwObject->mdObject = mdObject; | 149 fwObject->mdObject = mdObject; |
| 159 fwObject->fwSession = fwSession; | 150 fwObject->fwSession = fwSession; |
| 160 | 151 |
| 161 if (fwSession) { | 152 if (fwSession) { |
| 162 fwObject->mdSession = nssCKFWSession_GetMDSession(fwSession); | 153 fwObject->mdSession = nssCKFWSession_GetMDSession(fwSession); |
| 163 } | 154 } |
| 164 | 155 |
| 165 fwObject->fwToken = fwToken; | 156 fwObject->fwToken = fwToken; |
| 166 fwObject->mdToken = nssCKFWToken_GetMDToken(fwToken); | 157 fwObject->mdToken = nssCKFWToken_GetMDToken(fwToken); |
| 167 fwObject->fwInstance = fwInstance; | 158 fwObject->fwInstance = fwInstance; |
| 168 fwObject->mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); | 159 fwObject->mdInstance = nssCKFWInstance_GetMDInstance(fwInstance); |
| 169 fwObject->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError); | 160 fwObject->mutex = nssCKFWInstance_CreateMutex(fwInstance, arena, pError); |
| 170 if (!fwObject->mutex) { | 161 if (!fwObject->mutex) { |
| 171 if( CKR_OK == *pError ) { | 162 if (CKR_OK == *pError) { |
| 172 *pError = CKR_GENERAL_ERROR; | 163 *pError = CKR_GENERAL_ERROR; |
| 164 } |
| 165 nss_ZFreeIf(fwObject); |
| 166 return (NSSCKFWObject *)NULL; |
| 173 } | 167 } |
| 174 nss_ZFreeIf(fwObject); | |
| 175 return (NSSCKFWObject *)NULL; | |
| 176 } | |
| 177 | 168 |
| 178 *pError = nssCKFWHash_Add(mdObjectHash, mdObject, fwObject); | 169 *pError = nssCKFWHash_Add(mdObjectHash, mdObject, fwObject); |
| 179 if( CKR_OK != *pError ) { | 170 if (CKR_OK != *pError) { |
| 180 nss_ZFreeIf(fwObject); | 171 nss_ZFreeIf(fwObject); |
| 181 return (NSSCKFWObject *)NULL; | 172 return (NSSCKFWObject *)NULL; |
| 182 } | 173 } |
| 183 | 174 |
| 184 #ifdef DEBUG | 175 #ifdef DEBUG |
| 185 *pError = object_add_pointer(fwObject); | 176 *pError = object_add_pointer(fwObject); |
| 186 if( CKR_OK != *pError ) { | 177 if (CKR_OK != *pError) { |
| 187 nssCKFWHash_Remove(mdObjectHash, mdObject); | 178 nssCKFWHash_Remove(mdObjectHash, mdObject); |
| 188 nss_ZFreeIf(fwObject); | 179 nss_ZFreeIf(fwObject); |
| 189 return (NSSCKFWObject *)NULL; | 180 return (NSSCKFWObject *)NULL; |
| 190 } | 181 } |
| 191 #endif /* DEBUG */ | 182 #endif /* DEBUG */ |
| 192 | 183 |
| 193 *pError = CKR_OK; | 184 *pError = CKR_OK; |
| 194 return fwObject; | 185 return fwObject; |
| 195 } | 186 } |
| 196 | 187 |
| 197 /* | 188 /* |
| 198 * nssCKFWObject_Finalize | 189 * nssCKFWObject_Finalize |
| 199 * | 190 * |
| 200 */ | 191 */ |
| 201 NSS_IMPLEMENT void | 192 NSS_IMPLEMENT void |
| 202 nssCKFWObject_Finalize | 193 nssCKFWObject_Finalize( |
| 203 ( | 194 NSSCKFWObject *fwObject, |
| 204 NSSCKFWObject *fwObject, | 195 PRBool removeFromHash) |
| 205 PRBool removeFromHash | |
| 206 ) | |
| 207 { | 196 { |
| 208 nssCKFWHash *mdObjectHash; | 197 nssCKFWHash *mdObjectHash; |
| 209 | 198 |
| 210 #ifdef NSSDEBUG | 199 #ifdef NSSDEBUG |
| 211 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 200 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
| 212 return; | 201 return; |
| 213 } | 202 } |
| 214 #endif /* NSSDEBUG */ | 203 #endif /* NSSDEBUG */ |
| 215 | 204 |
| 216 (void)nssCKFWMutex_Destroy(fwObject->mutex); | 205 (void)nssCKFWMutex_Destroy(fwObject->mutex); |
| 217 | 206 |
| 218 if (fwObject->mdObject->Finalize) { | 207 if (fwObject->mdObject->Finalize) { |
| 219 fwObject->mdObject->Finalize(fwObject->mdObject, fwObject, | 208 fwObject->mdObject->Finalize(fwObject->mdObject, fwObject, |
| 220 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 209 fwObject->mdSession, fwObject->fwSession, f
wObject->mdToken, |
| 221 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance); | 210 fwObject->fwToken, fwObject->mdInstance, fw
Object->fwInstance); |
| 222 } | 211 } |
| 223 | 212 |
| 224 if (removeFromHash) { | 213 if (removeFromHash) { |
| 225 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken); | 214 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken); |
| 226 if (mdObjectHash) { | 215 if (mdObjectHash) { |
| 227 nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject); | 216 nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject); |
| 217 } |
| 228 } | 218 } |
| 229 } | |
| 230 | 219 |
| 231 if (fwObject->fwSession) { | 220 if (fwObject->fwSession) { |
| 232 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); | 221 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); |
| 233 } | 222 } |
| 234 nss_ZFreeIf(fwObject); | 223 nss_ZFreeIf(fwObject); |
| 235 | 224 |
| 236 #ifdef DEBUG | 225 #ifdef DEBUG |
| 237 (void)object_remove_pointer(fwObject); | 226 (void)object_remove_pointer(fwObject); |
| 238 #endif /* DEBUG */ | 227 #endif /* DEBUG */ |
| 239 | 228 |
| 240 return; | 229 return; |
| 241 } | 230 } |
| 242 | 231 |
| 243 /* | 232 /* |
| 244 * nssCKFWObject_Destroy | 233 * nssCKFWObject_Destroy |
| 245 * | 234 * |
| 246 */ | 235 */ |
| 247 NSS_IMPLEMENT void | 236 NSS_IMPLEMENT void |
| 248 nssCKFWObject_Destroy | 237 nssCKFWObject_Destroy( |
| 249 ( | 238 NSSCKFWObject *fwObject) |
| 250 NSSCKFWObject *fwObject | |
| 251 ) | |
| 252 { | 239 { |
| 253 nssCKFWHash *mdObjectHash; | 240 nssCKFWHash *mdObjectHash; |
| 254 | 241 |
| 255 #ifdef NSSDEBUG | 242 #ifdef NSSDEBUG |
| 256 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 243 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
| 257 return; | 244 return; |
| 258 } | 245 } |
| 259 #endif /* NSSDEBUG */ | 246 #endif /* NSSDEBUG */ |
| 260 | 247 |
| 261 (void)nssCKFWMutex_Destroy(fwObject->mutex); | 248 (void)nssCKFWMutex_Destroy(fwObject->mutex); |
| 262 | 249 |
| 263 if (fwObject->mdObject->Destroy) { | 250 if (fwObject->mdObject->Destroy) { |
| 264 fwObject->mdObject->Destroy(fwObject->mdObject, fwObject, | 251 fwObject->mdObject->Destroy(fwObject->mdObject, fwObject, |
| 265 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 252 fwObject->mdSession, fwObject->fwSession, fw
Object->mdToken, |
| 266 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance); | 253 fwObject->fwToken, fwObject->mdInstance, fwO
bject->fwInstance); |
| 267 } | 254 } |
| 268 | 255 |
| 269 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken); | 256 mdObjectHash = nssCKFWToken_GetMDObjectHash(fwObject->fwToken); |
| 270 if (mdObjectHash) { | 257 if (mdObjectHash) { |
| 271 nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject); | 258 nssCKFWHash_Remove(mdObjectHash, fwObject->mdObject); |
| 272 } | 259 } |
| 273 | 260 |
| 274 if (fwObject->fwSession) { | 261 if (fwObject->fwSession) { |
| 275 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); | 262 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); |
| 276 } | 263 } |
| 277 nss_ZFreeIf(fwObject); | 264 nss_ZFreeIf(fwObject); |
| 278 | 265 |
| 279 #ifdef DEBUG | 266 #ifdef DEBUG |
| 280 (void)object_remove_pointer(fwObject); | 267 (void)object_remove_pointer(fwObject); |
| 281 #endif /* DEBUG */ | 268 #endif /* DEBUG */ |
| 282 | 269 |
| 283 return; | 270 return; |
| 284 } | 271 } |
| 285 | 272 |
| 286 /* | 273 /* |
| 287 * nssCKFWObject_GetMDObject | 274 * nssCKFWObject_GetMDObject |
| 288 * | 275 * |
| 289 */ | 276 */ |
| 290 NSS_IMPLEMENT NSSCKMDObject * | 277 NSS_IMPLEMENT NSSCKMDObject * |
| 291 nssCKFWObject_GetMDObject | 278 nssCKFWObject_GetMDObject( |
| 292 ( | 279 NSSCKFWObject *fwObject) |
| 293 NSSCKFWObject *fwObject | |
| 294 ) | |
| 295 { | 280 { |
| 296 #ifdef NSSDEBUG | 281 #ifdef NSSDEBUG |
| 297 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 282 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
| 298 return (NSSCKMDObject *)NULL; | 283 return (NSSCKMDObject *)NULL; |
| 299 } | 284 } |
| 300 #endif /* NSSDEBUG */ | 285 #endif /* NSSDEBUG */ |
| 301 | 286 |
| 302 return fwObject->mdObject; | 287 return fwObject->mdObject; |
| 303 } | 288 } |
| 304 | 289 |
| 305 /* | 290 /* |
| 306 * nssCKFWObject_GetArena | 291 * nssCKFWObject_GetArena |
| 307 * | 292 * |
| 308 */ | 293 */ |
| 309 NSS_IMPLEMENT NSSArena * | 294 NSS_IMPLEMENT NSSArena * |
| 310 nssCKFWObject_GetArena | 295 nssCKFWObject_GetArena( |
| 311 ( | 296 NSSCKFWObject *fwObject, |
| 312 NSSCKFWObject *fwObject, | 297 CK_RV *pError) |
| 313 CK_RV *pError | |
| 314 ) | |
| 315 { | 298 { |
| 316 #ifdef NSSDEBUG | 299 #ifdef NSSDEBUG |
| 317 if (!pError) { | 300 if (!pError) { |
| 318 return (NSSArena *)NULL; | 301 return (NSSArena *)NULL; |
| 319 } | 302 } |
| 320 | 303 |
| 321 *pError = nssCKFWObject_verifyPointer(fwObject); | 304 *pError = nssCKFWObject_verifyPointer(fwObject); |
| 322 if( CKR_OK != *pError ) { | 305 if (CKR_OK != *pError) { |
| 323 return (NSSArena *)NULL; | 306 return (NSSArena *)NULL; |
| 324 } | 307 } |
| 325 #endif /* NSSDEBUG */ | 308 #endif /* NSSDEBUG */ |
| 326 | 309 |
| 327 return fwObject->arena; | 310 return fwObject->arena; |
| 328 } | 311 } |
| 329 | 312 |
| 330 /* | 313 /* |
| 331 * nssCKFWObject_SetHandle | 314 * nssCKFWObject_SetHandle |
| 332 * | 315 * |
| 333 */ | 316 */ |
| 334 NSS_IMPLEMENT CK_RV | 317 NSS_IMPLEMENT CK_RV |
| 335 nssCKFWObject_SetHandle | 318 nssCKFWObject_SetHandle( |
| 336 ( | 319 NSSCKFWObject *fwObject, |
| 337 NSSCKFWObject *fwObject, | 320 CK_OBJECT_HANDLE hObject) |
| 338 CK_OBJECT_HANDLE hObject | |
| 339 ) | |
| 340 { | 321 { |
| 341 #ifdef NSSDEBUG | 322 #ifdef NSSDEBUG |
| 342 CK_RV error = CKR_OK; | 323 CK_RV error = CKR_OK; |
| 343 #endif /* NSSDEBUG */ | 324 #endif /* NSSDEBUG */ |
| 344 | 325 |
| 345 #ifdef NSSDEBUG | 326 #ifdef NSSDEBUG |
| 346 error = nssCKFWObject_verifyPointer(fwObject); | 327 error = nssCKFWObject_verifyPointer(fwObject); |
| 347 if( CKR_OK != error ) { | 328 if (CKR_OK != error) { |
| 348 return error; | 329 return error; |
| 349 } | 330 } |
| 350 #endif /* NSSDEBUG */ | 331 #endif /* NSSDEBUG */ |
| 351 | 332 |
| 352 if( (CK_OBJECT_HANDLE)0 != fwObject->hObject ) { | 333 if ((CK_OBJECT_HANDLE)0 != fwObject->hObject) { |
| 353 return CKR_GENERAL_ERROR; | 334 return CKR_GENERAL_ERROR; |
| 354 } | 335 } |
| 355 | 336 |
| 356 fwObject->hObject = hObject; | 337 fwObject->hObject = hObject; |
| 357 | 338 |
| 358 return CKR_OK; | 339 return CKR_OK; |
| 359 } | 340 } |
| 360 | 341 |
| 361 /* | 342 /* |
| 362 * nssCKFWObject_GetHandle | 343 * nssCKFWObject_GetHandle |
| 363 * | 344 * |
| 364 */ | 345 */ |
| 365 NSS_IMPLEMENT CK_OBJECT_HANDLE | 346 NSS_IMPLEMENT CK_OBJECT_HANDLE |
| 366 nssCKFWObject_GetHandle | 347 nssCKFWObject_GetHandle( |
| 367 ( | 348 NSSCKFWObject *fwObject) |
| 368 NSSCKFWObject *fwObject | |
| 369 ) | |
| 370 { | 349 { |
| 371 #ifdef NSSDEBUG | 350 #ifdef NSSDEBUG |
| 372 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 351 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
| 373 return (CK_OBJECT_HANDLE)0; | 352 return (CK_OBJECT_HANDLE)0; |
| 374 } | 353 } |
| 375 #endif /* NSSDEBUG */ | 354 #endif /* NSSDEBUG */ |
| 376 | 355 |
| 377 return fwObject->hObject; | 356 return fwObject->hObject; |
| 378 } | 357 } |
| 379 | 358 |
| 380 /* | 359 /* |
| 381 * nssCKFWObject_IsTokenObject | 360 * nssCKFWObject_IsTokenObject |
| 382 * | 361 * |
| 383 */ | 362 */ |
| 384 NSS_IMPLEMENT CK_BBOOL | 363 NSS_IMPLEMENT CK_BBOOL |
| 385 nssCKFWObject_IsTokenObject | 364 nssCKFWObject_IsTokenObject( |
| 386 ( | 365 NSSCKFWObject *fwObject) |
| 387 NSSCKFWObject *fwObject | |
| 388 ) | |
| 389 { | 366 { |
| 390 CK_BBOOL b = CK_FALSE; | 367 CK_BBOOL b = CK_FALSE; |
| 391 | 368 |
| 392 #ifdef NSSDEBUG | 369 #ifdef NSSDEBUG |
| 393 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 370 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
| 394 return CK_FALSE; | 371 return CK_FALSE; |
| 395 } | 372 } |
| 396 #endif /* NSSDEBUG */ | 373 #endif /* NSSDEBUG */ |
| 397 | 374 |
| 398 if (!fwObject->mdObject->IsTokenObject) { | 375 if (!fwObject->mdObject->IsTokenObject) { |
| 399 NSSItem item; | 376 NSSItem item; |
| 400 NSSItem *pItem; | 377 NSSItem *pItem; |
| 401 CK_RV rv = CKR_OK; | 378 CK_RV rv = CKR_OK; |
| 402 | 379 |
| 403 item.data = (void *)&b; | 380 item.data = (void *)&b; |
| 404 item.size = sizeof(b); | 381 item.size = sizeof(b); |
| 405 | 382 |
| 406 pItem = nssCKFWObject_GetAttribute(fwObject, CKA_TOKEN, &item, | 383 pItem = nssCKFWObject_GetAttribute(fwObject, CKA_TOKEN, &item, |
| 407 (NSSArena *)NULL, &rv); | 384 (NSSArena *)NULL, &rv); |
| 408 if (!pItem) { | 385 if (!pItem) { |
| 409 /* Error of some type */ | 386 /* Error of some type */ |
| 410 b = CK_FALSE; | 387 b = CK_FALSE; |
| 411 goto done; | 388 goto done; |
| 389 } |
| 390 |
| 391 goto done; |
| 412 } | 392 } |
| 413 | 393 |
| 414 goto done; | 394 b = fwObject->mdObject->IsTokenObject(fwObject->mdObject, fwObject, |
| 415 } | 395 fwObject->mdSession, fwObject->fwSessi
on, fwObject->mdToken, |
| 396 fwObject->fwToken, fwObject->mdInstanc
e, fwObject->fwInstance); |
| 416 | 397 |
| 417 b = fwObject->mdObject->IsTokenObject(fwObject->mdObject, fwObject, | 398 done: |
| 418 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 399 return b; |
| 419 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance); | |
| 420 | |
| 421 done: | |
| 422 return b; | |
| 423 } | 400 } |
| 424 | 401 |
| 425 /* | 402 /* |
| 426 * nssCKFWObject_GetAttributeCount | 403 * nssCKFWObject_GetAttributeCount |
| 427 * | 404 * |
| 428 */ | 405 */ |
| 429 NSS_IMPLEMENT CK_ULONG | 406 NSS_IMPLEMENT CK_ULONG |
| 430 nssCKFWObject_GetAttributeCount | 407 nssCKFWObject_GetAttributeCount( |
| 431 ( | 408 NSSCKFWObject *fwObject, |
| 432 NSSCKFWObject *fwObject, | 409 CK_RV *pError) |
| 433 CK_RV *pError | |
| 434 ) | |
| 435 { | 410 { |
| 436 CK_ULONG rv; | 411 CK_ULONG rv; |
| 437 | 412 |
| 438 #ifdef NSSDEBUG | 413 #ifdef NSSDEBUG |
| 439 if (!pError) { | 414 if (!pError) { |
| 440 return (CK_ULONG)0; | 415 return (CK_ULONG)0; |
| 441 } | 416 } |
| 442 | 417 |
| 443 *pError = nssCKFWObject_verifyPointer(fwObject); | 418 *pError = nssCKFWObject_verifyPointer(fwObject); |
| 444 if( CKR_OK != *pError ) { | 419 if (CKR_OK != *pError) { |
| 445 return (CK_ULONG)0; | 420 return (CK_ULONG)0; |
| 446 } | 421 } |
| 447 #endif /* NSSDEBUG */ | 422 #endif /* NSSDEBUG */ |
| 448 | 423 |
| 449 if (!fwObject->mdObject->GetAttributeCount) { | 424 if (!fwObject->mdObject->GetAttributeCount) { |
| 450 *pError = CKR_GENERAL_ERROR; | 425 *pError = CKR_GENERAL_ERROR; |
| 451 return (CK_ULONG)0; | 426 return (CK_ULONG)0; |
| 452 } | 427 } |
| 453 | 428 |
| 454 *pError = nssCKFWMutex_Lock(fwObject->mutex); | 429 *pError = nssCKFWMutex_Lock(fwObject->mutex); |
| 455 if( CKR_OK != *pError ) { | 430 if (CKR_OK != *pError) { |
| 456 return (CK_ULONG)0; | 431 return (CK_ULONG)0; |
| 457 } | 432 } |
| 458 | 433 |
| 459 rv = fwObject->mdObject->GetAttributeCount(fwObject->mdObject, fwObject, | 434 rv = fwObject->mdObject->GetAttributeCount(fwObject->mdObject, fwObject, |
| 460 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 435 fwObject->mdSession, fwObject->fw
Session, fwObject->mdToken, |
| 461 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | 436 fwObject->fwToken, fwObject->mdIn
stance, fwObject->fwInstance, |
| 462 pError); | 437 pError); |
| 463 | 438 |
| 464 (void)nssCKFWMutex_Unlock(fwObject->mutex); | 439 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
| 465 return rv; | 440 return rv; |
| 466 } | 441 } |
| 467 | 442 |
| 468 /* | 443 /* |
| 469 * nssCKFWObject_GetAttributeTypes | 444 * nssCKFWObject_GetAttributeTypes |
| 470 * | 445 * |
| 471 */ | 446 */ |
| 472 NSS_IMPLEMENT CK_RV | 447 NSS_IMPLEMENT CK_RV |
| 473 nssCKFWObject_GetAttributeTypes | 448 nssCKFWObject_GetAttributeTypes( |
| 474 ( | 449 NSSCKFWObject *fwObject, |
| 475 NSSCKFWObject *fwObject, | 450 CK_ATTRIBUTE_TYPE_PTR typeArray, |
| 476 CK_ATTRIBUTE_TYPE_PTR typeArray, | 451 CK_ULONG ulCount) |
| 477 CK_ULONG ulCount | |
| 478 ) | |
| 479 { | 452 { |
| 480 CK_RV error = CKR_OK; | 453 CK_RV error = CKR_OK; |
| 481 | 454 |
| 482 #ifdef NSSDEBUG | 455 #ifdef NSSDEBUG |
| 483 error = nssCKFWObject_verifyPointer(fwObject); | 456 error = nssCKFWObject_verifyPointer(fwObject); |
| 484 if( CKR_OK != error ) { | 457 if (CKR_OK != error) { |
| 485 return error; | 458 return error; |
| 486 } | 459 } |
| 487 | 460 |
| 488 if( (CK_ATTRIBUTE_TYPE_PTR)NULL == typeArray ) { | 461 if ((CK_ATTRIBUTE_TYPE_PTR)NULL == typeArray) { |
| 489 return CKR_ARGUMENTS_BAD; | 462 return CKR_ARGUMENTS_BAD; |
| 490 } | 463 } |
| 491 #endif /* NSSDEBUG */ | 464 #endif /* NSSDEBUG */ |
| 492 | 465 |
| 493 if (!fwObject->mdObject->GetAttributeTypes) { | 466 if (!fwObject->mdObject->GetAttributeTypes) { |
| 494 return CKR_GENERAL_ERROR; | 467 return CKR_GENERAL_ERROR; |
| 495 } | 468 } |
| 496 | 469 |
| 497 error = nssCKFWMutex_Lock(fwObject->mutex); | 470 error = nssCKFWMutex_Lock(fwObject->mutex); |
| 498 if( CKR_OK != error ) { | 471 if (CKR_OK != error) { |
| 472 return error; |
| 473 } |
| 474 |
| 475 error = fwObject->mdObject->GetAttributeTypes(fwObject->mdObject, fwObject, |
| 476 fwObject->mdSession, fwObject-
>fwSession, fwObject->mdToken, |
| 477 fwObject->fwToken, fwObject->m
dInstance, fwObject->fwInstance, |
| 478 typeArray, ulCount); |
| 479 |
| 480 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
| 499 return error; | 481 return error; |
| 500 } | |
| 501 | |
| 502 error = fwObject->mdObject->GetAttributeTypes(fwObject->mdObject, fwObject, | |
| 503 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | |
| 504 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | |
| 505 typeArray, ulCount); | |
| 506 | |
| 507 (void)nssCKFWMutex_Unlock(fwObject->mutex); | |
| 508 return error; | |
| 509 } | 482 } |
| 510 | 483 |
| 511 /* | 484 /* |
| 512 * nssCKFWObject_GetAttributeSize | 485 * nssCKFWObject_GetAttributeSize |
| 513 * | 486 * |
| 514 */ | 487 */ |
| 515 NSS_IMPLEMENT CK_ULONG | 488 NSS_IMPLEMENT CK_ULONG |
| 516 nssCKFWObject_GetAttributeSize | 489 nssCKFWObject_GetAttributeSize( |
| 517 ( | 490 NSSCKFWObject *fwObject, |
| 518 NSSCKFWObject *fwObject, | 491 CK_ATTRIBUTE_TYPE attribute, |
| 519 CK_ATTRIBUTE_TYPE attribute, | 492 CK_RV *pError) |
| 520 CK_RV *pError | |
| 521 ) | |
| 522 { | 493 { |
| 523 CK_ULONG rv; | 494 CK_ULONG rv; |
| 524 | 495 |
| 525 #ifdef NSSDEBUG | 496 #ifdef NSSDEBUG |
| 526 if (!pError) { | 497 if (!pError) { |
| 527 return (CK_ULONG)0; | 498 return (CK_ULONG)0; |
| 528 } | 499 } |
| 529 | 500 |
| 530 *pError = nssCKFWObject_verifyPointer(fwObject); | 501 *pError = nssCKFWObject_verifyPointer(fwObject); |
| 531 if( CKR_OK != *pError ) { | 502 if (CKR_OK != *pError) { |
| 532 return (CK_ULONG)0; | 503 return (CK_ULONG)0; |
| 533 } | 504 } |
| 534 #endif /* NSSDEBUG */ | 505 #endif /* NSSDEBUG */ |
| 535 | 506 |
| 536 if (!fwObject->mdObject->GetAttributeSize) { | 507 if (!fwObject->mdObject->GetAttributeSize) { |
| 537 *pError = CKR_GENERAL_ERROR; | 508 *pError = CKR_GENERAL_ERROR; |
| 538 return (CK_ULONG )0; | 509 return (CK_ULONG)0; |
| 539 } | 510 } |
| 540 | 511 |
| 541 *pError = nssCKFWMutex_Lock(fwObject->mutex); | 512 *pError = nssCKFWMutex_Lock(fwObject->mutex); |
| 542 if( CKR_OK != *pError ) { | 513 if (CKR_OK != *pError) { |
| 543 return (CK_ULONG)0; | 514 return (CK_ULONG)0; |
| 544 } | 515 } |
| 545 | 516 |
| 546 rv = fwObject->mdObject->GetAttributeSize(fwObject->mdObject, fwObject, | 517 rv = fwObject->mdObject->GetAttributeSize(fwObject->mdObject, fwObject, |
| 547 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 518 fwObject->mdSession, fwObject->fwS
ession, fwObject->mdToken, |
| 548 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | 519 fwObject->fwToken, fwObject->mdIns
tance, fwObject->fwInstance, |
| 549 attribute, pError); | 520 attribute, pError); |
| 550 | 521 |
| 551 (void)nssCKFWMutex_Unlock(fwObject->mutex); | 522 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
| 552 return rv; | 523 return rv; |
| 553 } | 524 } |
| 554 | 525 |
| 555 /* | 526 /* |
| 556 * nssCKFWObject_GetAttribute | 527 * nssCKFWObject_GetAttribute |
| 557 * | 528 * |
| 558 * Usual NSS allocation rules: | 529 * Usual NSS allocation rules: |
| 559 * If itemOpt is not NULL, it will be returned; otherwise an NSSItem | 530 * If itemOpt is not NULL, it will be returned; otherwise an NSSItem |
| 560 * will be allocated. If itemOpt is not NULL but itemOpt->data is, | 531 * will be allocated. If itemOpt is not NULL but itemOpt->data is, |
| 561 * the buffer will be allocated; otherwise, the buffer will be used. | 532 * the buffer will be allocated; otherwise, the buffer will be used. |
| 562 * Any allocations will come from the optional arena, if one is | 533 * Any allocations will come from the optional arena, if one is |
| 563 * specified. | 534 * specified. |
| 564 */ | 535 */ |
| 565 NSS_IMPLEMENT NSSItem * | 536 NSS_IMPLEMENT NSSItem * |
| 566 nssCKFWObject_GetAttribute | 537 nssCKFWObject_GetAttribute( |
| 567 ( | 538 NSSCKFWObject *fwObject, |
| 568 NSSCKFWObject *fwObject, | 539 CK_ATTRIBUTE_TYPE attribute, |
| 569 CK_ATTRIBUTE_TYPE attribute, | 540 NSSItem *itemOpt, |
| 570 NSSItem *itemOpt, | 541 NSSArena *arenaOpt, |
| 571 NSSArena *arenaOpt, | 542 CK_RV *pError) |
| 572 CK_RV *pError | |
| 573 ) | |
| 574 { | 543 { |
| 575 NSSItem *rv = (NSSItem *)NULL; | 544 NSSItem *rv = (NSSItem *)NULL; |
| 576 NSSCKFWItem mdItem; | 545 NSSCKFWItem mdItem; |
| 577 | 546 |
| 578 #ifdef NSSDEBUG | 547 #ifdef NSSDEBUG |
| 579 if (!pError) { | 548 if (!pError) { |
| 580 return (NSSItem *)NULL; | 549 return (NSSItem *)NULL; |
| 581 } | 550 } |
| 582 | 551 |
| 583 *pError = nssCKFWObject_verifyPointer(fwObject); | 552 *pError = nssCKFWObject_verifyPointer(fwObject); |
| 584 if( CKR_OK != *pError ) { | 553 if (CKR_OK != *pError) { |
| 585 return (NSSItem *)NULL; | 554 return (NSSItem *)NULL; |
| 586 } | 555 } |
| 587 #endif /* NSSDEBUG */ | 556 #endif /* NSSDEBUG */ |
| 588 | 557 |
| 589 if (!fwObject->mdObject->GetAttribute) { | 558 if (!fwObject->mdObject->GetAttribute) { |
| 590 *pError = CKR_GENERAL_ERROR; | 559 *pError = CKR_GENERAL_ERROR; |
| 591 return (NSSItem *)NULL; | 560 return (NSSItem *)NULL; |
| 592 } | |
| 593 | |
| 594 *pError = nssCKFWMutex_Lock(fwObject->mutex); | |
| 595 if( CKR_OK != *pError ) { | |
| 596 return (NSSItem *)NULL; | |
| 597 } | |
| 598 | |
| 599 mdItem = fwObject->mdObject->GetAttribute(fwObject->mdObject, fwObject, | |
| 600 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | |
| 601 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | |
| 602 attribute, pError); | |
| 603 | |
| 604 if (!mdItem.item) { | |
| 605 if( CKR_OK == *pError ) { | |
| 606 *pError = CKR_GENERAL_ERROR; | |
| 607 } | 561 } |
| 608 | 562 |
| 609 goto done; | 563 *pError = nssCKFWMutex_Lock(fwObject->mutex); |
| 610 } | 564 if (CKR_OK != *pError) { |
| 565 return (NSSItem *)NULL; |
| 566 } |
| 611 | 567 |
| 612 if (!itemOpt) { | 568 mdItem = fwObject->mdObject->GetAttribute(fwObject->mdObject, fwObject, |
| 613 rv = nss_ZNEW(arenaOpt, NSSItem); | 569 fwObject->mdSession, fwObject->fwS
ession, fwObject->mdToken, |
| 614 if (!rv) { | 570 fwObject->fwToken, fwObject->mdIns
tance, fwObject->fwInstance, |
| 615 *pError = CKR_HOST_MEMORY; | 571 attribute, pError); |
| 616 goto done; | 572 |
| 573 if (!mdItem.item) { |
| 574 if (CKR_OK == *pError) { |
| 575 *pError = CKR_GENERAL_ERROR; |
| 576 } |
| 577 |
| 578 goto done; |
| 617 } | 579 } |
| 618 } else { | |
| 619 rv = itemOpt; | |
| 620 } | |
| 621 | 580 |
| 622 if (!rv->data) { | 581 if (!itemOpt) { |
| 623 rv->size = mdItem.item->size; | 582 rv = nss_ZNEW(arenaOpt, NSSItem); |
| 624 rv->data = nss_ZAlloc(arenaOpt, rv->size); | 583 if (!rv) { |
| 584 *pError = CKR_HOST_MEMORY; |
| 585 goto done; |
| 586 } |
| 587 } else { |
| 588 rv = itemOpt; |
| 589 } |
| 590 |
| 625 if (!rv->data) { | 591 if (!rv->data) { |
| 626 *pError = CKR_HOST_MEMORY; | 592 rv->size = mdItem.item->size; |
| 627 if (!itemOpt) { | 593 rv->data = nss_ZAlloc(arenaOpt, rv->size); |
| 628 nss_ZFreeIf(rv); | 594 if (!rv->data) { |
| 629 } | 595 *pError = CKR_HOST_MEMORY; |
| 630 rv = (NSSItem *)NULL; | 596 if (!itemOpt) { |
| 631 goto done; | 597 nss_ZFreeIf(rv); |
| 598 } |
| 599 rv = (NSSItem *)NULL; |
| 600 goto done; |
| 601 } |
| 602 } else { |
| 603 if (rv->size >= mdItem.item->size) { |
| 604 rv->size = mdItem.item->size; |
| 605 } else { |
| 606 *pError = CKR_BUFFER_TOO_SMALL; |
| 607 /* Should we set rv->size to mdItem->size? */ |
| 608 /* rv can't have been allocated */ |
| 609 rv = (NSSItem *)NULL; |
| 610 goto done; |
| 611 } |
| 632 } | 612 } |
| 633 } else { | 613 |
| 634 if( rv->size >= mdItem.item->size ) { | 614 (void)nsslibc_memcpy(rv->data, mdItem.item->data, rv->size); |
| 635 rv->size = mdItem.item->size; | 615 |
| 636 } else { | 616 if (PR_TRUE == mdItem.needsFreeing) { |
| 637 *pError = CKR_BUFFER_TOO_SMALL; | 617 PR_ASSERT(fwObject->mdObject->FreeAttribute); |
| 638 /* Should we set rv->size to mdItem->size? */ | 618 if (fwObject->mdObject->FreeAttribute) { |
| 639 /* rv can't have been allocated */ | 619 *pError = fwObject->mdObject->FreeAttribute(&mdItem); |
| 640 rv = (NSSItem *)NULL; | 620 } |
| 641 goto done; | |
| 642 } | 621 } |
| 643 } | |
| 644 | 622 |
| 645 (void)nsslibc_memcpy(rv->data, mdItem.item->data, rv->size); | 623 done: |
| 646 | 624 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
| 647 if (PR_TRUE == mdItem.needsFreeing) { | 625 return rv; |
| 648 PR_ASSERT(fwObject->mdObject->FreeAttribute); | |
| 649 if (fwObject->mdObject->FreeAttribute) { | |
| 650 *pError = fwObject->mdObject->FreeAttribute(&mdItem); | |
| 651 } | |
| 652 } | |
| 653 | |
| 654 done: | |
| 655 (void)nssCKFWMutex_Unlock(fwObject->mutex); | |
| 656 return rv; | |
| 657 } | 626 } |
| 658 | 627 |
| 659 /* | 628 /* |
| 660 * nssCKFWObject_SetAttribute | 629 * nssCKFWObject_SetAttribute |
| 661 * | 630 * |
| 662 */ | 631 */ |
| 663 NSS_IMPLEMENT CK_RV | 632 NSS_IMPLEMENT CK_RV |
| 664 nssCKFWObject_SetAttribute | 633 nssCKFWObject_SetAttribute( |
| 665 ( | 634 NSSCKFWObject *fwObject, |
| 666 NSSCKFWObject *fwObject, | 635 NSSCKFWSession *fwSession, |
| 667 NSSCKFWSession *fwSession, | 636 CK_ATTRIBUTE_TYPE attribute, |
| 668 CK_ATTRIBUTE_TYPE attribute, | 637 NSSItem *value) |
| 669 NSSItem *value | |
| 670 ) | |
| 671 { | 638 { |
| 672 CK_RV error = CKR_OK; | 639 CK_RV error = CKR_OK; |
| 673 | 640 |
| 674 #ifdef NSSDEBUG | 641 #ifdef NSSDEBUG |
| 675 error = nssCKFWObject_verifyPointer(fwObject); | 642 error = nssCKFWObject_verifyPointer(fwObject); |
| 676 if( CKR_OK != error ) { | 643 if (CKR_OK != error) { |
| 677 return error; | 644 return error; |
| 678 } | 645 } |
| 679 #endif /* NSSDEBUG */ | 646 #endif /* NSSDEBUG */ |
| 680 | 647 |
| 681 if( CKA_TOKEN == attribute ) { | 648 if (CKA_TOKEN == attribute) { |
| 682 /* | 649 /* |
| 683 * We're changing from a session object to a token object or | 650 * We're changing from a session object to a token object or |
| 684 * vice-versa. | 651 * vice-versa. |
| 685 */ | 652 */ |
| 686 | 653 |
| 687 CK_ATTRIBUTE a; | 654 CK_ATTRIBUTE a; |
| 688 NSSCKFWObject *newFwObject; | 655 NSSCKFWObject *newFwObject; |
| 689 NSSCKFWObject swab; | 656 NSSCKFWObject swab; |
| 690 | 657 |
| 691 a.type = CKA_TOKEN; | 658 a.type = CKA_TOKEN; |
| 692 a.pValue = value->data; | 659 a.pValue = value->data; |
| 693 a.ulValueLen = value->size; | 660 a.ulValueLen = value->size; |
| 694 | 661 |
| 695 newFwObject = nssCKFWSession_CopyObject(fwSession, fwObject, | 662 newFwObject = nssCKFWSession_CopyObject(fwSession, fwObject, |
| 696 &a, 1, &error); | 663 &a, 1, &error); |
| 697 if (!newFwObject) { | 664 if (!newFwObject) { |
| 698 if( CKR_OK == error ) { | 665 if (CKR_OK == error) { |
| 699 error = CKR_GENERAL_ERROR; | 666 error = CKR_GENERAL_ERROR; |
| 700 } | 667 } |
| 701 return error; | 668 return error; |
| 669 } |
| 670 |
| 671 /* |
| 672 * Actually, I bet the locking is worse than this.. this part of |
| 673 * the code could probably use some scrutiny and reworking. |
| 674 */ |
| 675 error = nssCKFWMutex_Lock(fwObject->mutex); |
| 676 if (CKR_OK != error) { |
| 677 nssCKFWObject_Destroy(newFwObject); |
| 678 return error; |
| 679 } |
| 680 |
| 681 error = nssCKFWMutex_Lock(newFwObject->mutex); |
| 682 if (CKR_OK != error) { |
| 683 nssCKFWMutex_Unlock(fwObject->mutex); |
| 684 nssCKFWObject_Destroy(newFwObject); |
| 685 return error; |
| 686 } |
| 687 |
| 688 /* |
| 689 * Now, we have our new object, but it has a new fwObject pointer, |
| 690 * while we have to keep the existing one. So quick swap the contents. |
| 691 */ |
| 692 swab = *fwObject; |
| 693 *fwObject = *newFwObject; |
| 694 *newFwObject = swab; |
| 695 |
| 696 /* But keep the mutexes the same */ |
| 697 swab.mutex = fwObject->mutex; |
| 698 fwObject->mutex = newFwObject->mutex; |
| 699 newFwObject->mutex = swab.mutex; |
| 700 |
| 701 (void)nssCKFWMutex_Unlock(newFwObject->mutex); |
| 702 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
| 703 |
| 704 /* |
| 705 * Either remove or add this to the list of session objects |
| 706 */ |
| 707 |
| 708 if (CK_FALSE == *(CK_BBOOL *)value->data) { |
| 709 /* |
| 710 * New one is a session object, except since we "stole" the fwObject
, it's |
| 711 * not in the list. Add it. |
| 712 */ |
| 713 nssCKFWSession_RegisterSessionObject(fwSession, fwObject); |
| 714 } else { |
| 715 /* |
| 716 * New one is a token object, except since we "stole" the fwObject,
it's |
| 717 * in the list. Remove it. |
| 718 */ |
| 719 if (fwObject->fwSession) { |
| 720 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwOb
ject); |
| 721 } |
| 722 } |
| 723 |
| 724 /* |
| 725 * Now delete the old object. Remember the names have changed. |
| 726 */ |
| 727 nssCKFWObject_Destroy(newFwObject); |
| 728 |
| 729 return CKR_OK; |
| 730 } else { |
| 731 /* |
| 732 * An "ordinary" change. |
| 733 */ |
| 734 if (!fwObject->mdObject->SetAttribute) { |
| 735 /* We could fake it with copying, like above.. later */ |
| 736 return CKR_ATTRIBUTE_READ_ONLY; |
| 737 } |
| 738 |
| 739 error = nssCKFWMutex_Lock(fwObject->mutex); |
| 740 if (CKR_OK != error) { |
| 741 return error; |
| 742 } |
| 743 |
| 744 error = fwObject->mdObject->SetAttribute(fwObject->mdObject, fwObject, |
| 745 fwObject->mdSession, fwObject->
fwSession, fwObject->mdToken, |
| 746 fwObject->fwToken, fwObject->md
Instance, fwObject->fwInstance, |
| 747 attribute, value); |
| 748 |
| 749 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
| 750 |
| 751 return error; |
| 702 } | 752 } |
| 703 | |
| 704 /* | |
| 705 * Actually, I bet the locking is worse than this.. this part of | |
| 706 * the code could probably use some scrutiny and reworking. | |
| 707 */ | |
| 708 error = nssCKFWMutex_Lock(fwObject->mutex); | |
| 709 if( CKR_OK != error ) { | |
| 710 nssCKFWObject_Destroy(newFwObject); | |
| 711 return error; | |
| 712 } | |
| 713 | |
| 714 error = nssCKFWMutex_Lock(newFwObject->mutex); | |
| 715 if( CKR_OK != error ) { | |
| 716 nssCKFWMutex_Unlock(fwObject->mutex); | |
| 717 nssCKFWObject_Destroy(newFwObject); | |
| 718 return error; | |
| 719 } | |
| 720 | |
| 721 /* | |
| 722 * Now, we have our new object, but it has a new fwObject pointer, | |
| 723 * while we have to keep the existing one. So quick swap the contents. | |
| 724 */ | |
| 725 swab = *fwObject; | |
| 726 *fwObject = *newFwObject; | |
| 727 *newFwObject = swab; | |
| 728 | |
| 729 /* But keep the mutexes the same */ | |
| 730 swab.mutex = fwObject->mutex; | |
| 731 fwObject->mutex = newFwObject->mutex; | |
| 732 newFwObject->mutex = swab.mutex; | |
| 733 | |
| 734 (void)nssCKFWMutex_Unlock(newFwObject->mutex); | |
| 735 (void)nssCKFWMutex_Unlock(fwObject->mutex); | |
| 736 | |
| 737 /* | |
| 738 * Either remove or add this to the list of session objects | |
| 739 */ | |
| 740 | |
| 741 if( CK_FALSE == *(CK_BBOOL *)value->data ) { | |
| 742 /* | |
| 743 * New one is a session object, except since we "stole" the fwObject, it's | |
| 744 * not in the list. Add it. | |
| 745 */ | |
| 746 nssCKFWSession_RegisterSessionObject(fwSession, fwObject); | |
| 747 } else { | |
| 748 /* | |
| 749 * New one is a token object, except since we "stole" the fwObject, it's | |
| 750 * in the list. Remove it. | |
| 751 */ | |
| 752 if (fwObject->fwSession) { | |
| 753 nssCKFWSession_DeregisterSessionObject(fwObject->fwSession, fwObject); | |
| 754 } | |
| 755 } | |
| 756 | |
| 757 /* | |
| 758 * Now delete the old object. Remember the names have changed. | |
| 759 */ | |
| 760 nssCKFWObject_Destroy(newFwObject); | |
| 761 | |
| 762 return CKR_OK; | |
| 763 } else { | |
| 764 /* | |
| 765 * An "ordinary" change. | |
| 766 */ | |
| 767 if (!fwObject->mdObject->SetAttribute) { | |
| 768 /* We could fake it with copying, like above.. later */ | |
| 769 return CKR_ATTRIBUTE_READ_ONLY; | |
| 770 } | |
| 771 | |
| 772 error = nssCKFWMutex_Lock(fwObject->mutex); | |
| 773 if( CKR_OK != error ) { | |
| 774 return error; | |
| 775 } | |
| 776 | |
| 777 error = fwObject->mdObject->SetAttribute(fwObject->mdObject, fwObject, | |
| 778 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | |
| 779 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | |
| 780 attribute, value); | |
| 781 | |
| 782 (void)nssCKFWMutex_Unlock(fwObject->mutex); | |
| 783 | |
| 784 return error; | |
| 785 } | |
| 786 } | 753 } |
| 787 | 754 |
| 788 /* | 755 /* |
| 789 * nssCKFWObject_GetObjectSize | 756 * nssCKFWObject_GetObjectSize |
| 790 * | 757 * |
| 791 */ | 758 */ |
| 792 NSS_IMPLEMENT CK_ULONG | 759 NSS_IMPLEMENT CK_ULONG |
| 793 nssCKFWObject_GetObjectSize | 760 nssCKFWObject_GetObjectSize( |
| 794 ( | 761 NSSCKFWObject *fwObject, |
| 795 NSSCKFWObject *fwObject, | 762 CK_RV *pError) |
| 796 CK_RV *pError | |
| 797 ) | |
| 798 { | 763 { |
| 799 CK_ULONG rv; | 764 CK_ULONG rv; |
| 800 | 765 |
| 801 #ifdef NSSDEBUG | 766 #ifdef NSSDEBUG |
| 802 if (!pError) { | 767 if (!pError) { |
| 803 return (CK_ULONG)0; | 768 return (CK_ULONG)0; |
| 804 } | 769 } |
| 805 | 770 |
| 806 *pError = nssCKFWObject_verifyPointer(fwObject); | 771 *pError = nssCKFWObject_verifyPointer(fwObject); |
| 807 if( CKR_OK != *pError ) { | 772 if (CKR_OK != *pError) { |
| 808 return (CK_ULONG)0; | 773 return (CK_ULONG)0; |
| 809 } | 774 } |
| 810 #endif /* NSSDEBUG */ | 775 #endif /* NSSDEBUG */ |
| 811 | 776 |
| 812 if (!fwObject->mdObject->GetObjectSize) { | 777 if (!fwObject->mdObject->GetObjectSize) { |
| 813 *pError = CKR_INFORMATION_SENSITIVE; | 778 *pError = CKR_INFORMATION_SENSITIVE; |
| 814 return (CK_ULONG)0; | 779 return (CK_ULONG)0; |
| 815 } | 780 } |
| 816 | 781 |
| 817 *pError = nssCKFWMutex_Lock(fwObject->mutex); | 782 *pError = nssCKFWMutex_Lock(fwObject->mutex); |
| 818 if( CKR_OK != *pError ) { | 783 if (CKR_OK != *pError) { |
| 819 return (CK_ULONG)0; | 784 return (CK_ULONG)0; |
| 820 } | 785 } |
| 821 | 786 |
| 822 rv = fwObject->mdObject->GetObjectSize(fwObject->mdObject, fwObject, | 787 rv = fwObject->mdObject->GetObjectSize(fwObject->mdObject, fwObject, |
| 823 fwObject->mdSession, fwObject->fwSession, fwObject->mdToken, | 788 fwObject->mdSession, fwObject->fwSess
ion, fwObject->mdToken, |
| 824 fwObject->fwToken, fwObject->mdInstance, fwObject->fwInstance, | 789 fwObject->fwToken, fwObject->mdInstan
ce, fwObject->fwInstance, |
| 825 pError); | 790 pError); |
| 826 | 791 |
| 827 (void)nssCKFWMutex_Unlock(fwObject->mutex); | 792 (void)nssCKFWMutex_Unlock(fwObject->mutex); |
| 828 return rv; | 793 return rv; |
| 829 } | 794 } |
| 830 | 795 |
| 831 /* | 796 /* |
| 832 * NSSCKFWObject_GetMDObject | 797 * NSSCKFWObject_GetMDObject |
| 833 * | 798 * |
| 834 */ | 799 */ |
| 835 NSS_IMPLEMENT NSSCKMDObject * | 800 NSS_IMPLEMENT NSSCKMDObject * |
| 836 NSSCKFWObject_GetMDObject | 801 NSSCKFWObject_GetMDObject( |
| 837 ( | 802 NSSCKFWObject *fwObject) |
| 838 NSSCKFWObject *fwObject | |
| 839 ) | |
| 840 { | 803 { |
| 841 #ifdef DEBUG | 804 #ifdef DEBUG |
| 842 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 805 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
| 843 return (NSSCKMDObject *)NULL; | 806 return (NSSCKMDObject *)NULL; |
| 844 } | 807 } |
| 845 #endif /* DEBUG */ | 808 #endif /* DEBUG */ |
| 846 | 809 |
| 847 return nssCKFWObject_GetMDObject(fwObject); | 810 return nssCKFWObject_GetMDObject(fwObject); |
| 848 } | 811 } |
| 849 | 812 |
| 850 /* | 813 /* |
| 851 * NSSCKFWObject_GetArena | 814 * NSSCKFWObject_GetArena |
| 852 * | 815 * |
| 853 */ | 816 */ |
| 854 NSS_IMPLEMENT NSSArena * | 817 NSS_IMPLEMENT NSSArena * |
| 855 NSSCKFWObject_GetArena | 818 NSSCKFWObject_GetArena( |
| 856 ( | 819 NSSCKFWObject *fwObject, |
| 857 NSSCKFWObject *fwObject, | 820 CK_RV *pError) |
| 858 CK_RV *pError | |
| 859 ) | |
| 860 { | 821 { |
| 861 #ifdef DEBUG | 822 #ifdef DEBUG |
| 862 if (!pError) { | 823 if (!pError) { |
| 863 return (NSSArena *)NULL; | 824 return (NSSArena *)NULL; |
| 864 } | 825 } |
| 865 | 826 |
| 866 *pError = nssCKFWObject_verifyPointer(fwObject); | 827 *pError = nssCKFWObject_verifyPointer(fwObject); |
| 867 if( CKR_OK != *pError ) { | 828 if (CKR_OK != *pError) { |
| 868 return (NSSArena *)NULL; | 829 return (NSSArena *)NULL; |
| 869 } | 830 } |
| 870 #endif /* DEBUG */ | 831 #endif /* DEBUG */ |
| 871 | 832 |
| 872 return nssCKFWObject_GetArena(fwObject, pError); | 833 return nssCKFWObject_GetArena(fwObject, pError); |
| 873 } | 834 } |
| 874 | 835 |
| 875 /* | 836 /* |
| 876 * NSSCKFWObject_IsTokenObject | 837 * NSSCKFWObject_IsTokenObject |
| 877 * | 838 * |
| 878 */ | 839 */ |
| 879 NSS_IMPLEMENT CK_BBOOL | 840 NSS_IMPLEMENT CK_BBOOL |
| 880 NSSCKFWObject_IsTokenObject | 841 NSSCKFWObject_IsTokenObject( |
| 881 ( | 842 NSSCKFWObject *fwObject) |
| 882 NSSCKFWObject *fwObject | |
| 883 ) | |
| 884 { | 843 { |
| 885 #ifdef DEBUG | 844 #ifdef DEBUG |
| 886 if( CKR_OK != nssCKFWObject_verifyPointer(fwObject) ) { | 845 if (CKR_OK != nssCKFWObject_verifyPointer(fwObject)) { |
| 887 return CK_FALSE; | 846 return CK_FALSE; |
| 888 } | 847 } |
| 889 #endif /* DEBUG */ | 848 #endif /* DEBUG */ |
| 890 | 849 |
| 891 return nssCKFWObject_IsTokenObject(fwObject); | 850 return nssCKFWObject_IsTokenObject(fwObject); |
| 892 } | 851 } |
| 893 | 852 |
| 894 /* | 853 /* |
| 895 * NSSCKFWObject_GetAttributeCount | 854 * NSSCKFWObject_GetAttributeCount |
| 896 * | 855 * |
| 897 */ | 856 */ |
| 898 NSS_IMPLEMENT CK_ULONG | 857 NSS_IMPLEMENT CK_ULONG |
| 899 NSSCKFWObject_GetAttributeCount | 858 NSSCKFWObject_GetAttributeCount( |
| 900 ( | 859 NSSCKFWObject *fwObject, |
| 901 NSSCKFWObject *fwObject, | 860 CK_RV *pError) |
| 902 CK_RV *pError | |
| 903 ) | |
| 904 { | 861 { |
| 905 #ifdef DEBUG | 862 #ifdef DEBUG |
| 906 if (!pError) { | 863 if (!pError) { |
| 907 return (CK_ULONG)0; | 864 return (CK_ULONG)0; |
| 908 } | 865 } |
| 909 | 866 |
| 910 *pError = nssCKFWObject_verifyPointer(fwObject); | 867 *pError = nssCKFWObject_verifyPointer(fwObject); |
| 911 if( CKR_OK != *pError ) { | 868 if (CKR_OK != *pError) { |
| 912 return (CK_ULONG)0; | 869 return (CK_ULONG)0; |
| 913 } | 870 } |
| 914 #endif /* DEBUG */ | 871 #endif /* DEBUG */ |
| 915 | 872 |
| 916 return nssCKFWObject_GetAttributeCount(fwObject, pError); | 873 return nssCKFWObject_GetAttributeCount(fwObject, pError); |
| 917 } | 874 } |
| 918 | 875 |
| 919 /* | 876 /* |
| 920 * NSSCKFWObject_GetAttributeTypes | 877 * NSSCKFWObject_GetAttributeTypes |
| 921 * | 878 * |
| 922 */ | 879 */ |
| 923 NSS_IMPLEMENT CK_RV | 880 NSS_IMPLEMENT CK_RV |
| 924 NSSCKFWObject_GetAttributeTypes | 881 NSSCKFWObject_GetAttributeTypes( |
| 925 ( | 882 NSSCKFWObject *fwObject, |
| 926 NSSCKFWObject *fwObject, | 883 CK_ATTRIBUTE_TYPE_PTR typeArray, |
| 927 CK_ATTRIBUTE_TYPE_PTR typeArray, | 884 CK_ULONG ulCount) |
| 928 CK_ULONG ulCount | |
| 929 ) | |
| 930 { | 885 { |
| 931 #ifdef DEBUG | 886 #ifdef DEBUG |
| 932 CK_RV error = CKR_OK; | 887 CK_RV error = CKR_OK; |
| 933 | 888 |
| 934 error = nssCKFWObject_verifyPointer(fwObject); | 889 error = nssCKFWObject_verifyPointer(fwObject); |
| 935 if( CKR_OK != error ) { | 890 if (CKR_OK != error) { |
| 936 return error; | 891 return error; |
| 937 } | 892 } |
| 938 | 893 |
| 939 if( (CK_ATTRIBUTE_TYPE_PTR)NULL == typeArray ) { | 894 if ((CK_ATTRIBUTE_TYPE_PTR)NULL == typeArray) { |
| 940 return CKR_ARGUMENTS_BAD; | 895 return CKR_ARGUMENTS_BAD; |
| 941 } | 896 } |
| 942 #endif /* DEBUG */ | 897 #endif /* DEBUG */ |
| 943 | 898 |
| 944 return nssCKFWObject_GetAttributeTypes(fwObject, typeArray, ulCount); | 899 return nssCKFWObject_GetAttributeTypes(fwObject, typeArray, ulCount); |
| 945 } | 900 } |
| 946 | 901 |
| 947 /* | 902 /* |
| 948 * NSSCKFWObject_GetAttributeSize | 903 * NSSCKFWObject_GetAttributeSize |
| 949 * | 904 * |
| 950 */ | 905 */ |
| 951 NSS_IMPLEMENT CK_ULONG | 906 NSS_IMPLEMENT CK_ULONG |
| 952 NSSCKFWObject_GetAttributeSize | 907 NSSCKFWObject_GetAttributeSize( |
| 953 ( | 908 NSSCKFWObject *fwObject, |
| 954 NSSCKFWObject *fwObject, | 909 CK_ATTRIBUTE_TYPE attribute, |
| 955 CK_ATTRIBUTE_TYPE attribute, | 910 CK_RV *pError) |
| 956 CK_RV *pError | |
| 957 ) | |
| 958 { | 911 { |
| 959 #ifdef DEBUG | 912 #ifdef DEBUG |
| 960 if (!pError) { | 913 if (!pError) { |
| 961 return (CK_ULONG)0; | 914 return (CK_ULONG)0; |
| 962 } | 915 } |
| 963 | 916 |
| 964 *pError = nssCKFWObject_verifyPointer(fwObject); | 917 *pError = nssCKFWObject_verifyPointer(fwObject); |
| 965 if( CKR_OK != *pError ) { | 918 if (CKR_OK != *pError) { |
| 966 return (CK_ULONG)0; | 919 return (CK_ULONG)0; |
| 967 } | 920 } |
| 968 #endif /* DEBUG */ | 921 #endif /* DEBUG */ |
| 969 | 922 |
| 970 return nssCKFWObject_GetAttributeSize(fwObject, attribute, pError); | 923 return nssCKFWObject_GetAttributeSize(fwObject, attribute, pError); |
| 971 } | 924 } |
| 972 | 925 |
| 973 /* | 926 /* |
| 974 * NSSCKFWObject_GetAttribute | 927 * NSSCKFWObject_GetAttribute |
| 975 * | 928 * |
| 976 */ | 929 */ |
| 977 NSS_IMPLEMENT NSSItem * | 930 NSS_IMPLEMENT NSSItem * |
| 978 NSSCKFWObject_GetAttribute | 931 NSSCKFWObject_GetAttribute( |
| 979 ( | 932 NSSCKFWObject *fwObject, |
| 980 NSSCKFWObject *fwObject, | 933 CK_ATTRIBUTE_TYPE attribute, |
| 981 CK_ATTRIBUTE_TYPE attribute, | 934 NSSItem *itemOpt, |
| 982 NSSItem *itemOpt, | 935 NSSArena *arenaOpt, |
| 983 NSSArena *arenaOpt, | 936 CK_RV *pError) |
| 984 CK_RV *pError | |
| 985 ) | |
| 986 { | 937 { |
| 987 #ifdef DEBUG | 938 #ifdef DEBUG |
| 988 if (!pError) { | 939 if (!pError) { |
| 989 return (NSSItem *)NULL; | 940 return (NSSItem *)NULL; |
| 990 } | 941 } |
| 991 | 942 |
| 992 *pError = nssCKFWObject_verifyPointer(fwObject); | 943 *pError = nssCKFWObject_verifyPointer(fwObject); |
| 993 if( CKR_OK != *pError ) { | 944 if (CKR_OK != *pError) { |
| 994 return (NSSItem *)NULL; | 945 return (NSSItem *)NULL; |
| 995 } | 946 } |
| 996 #endif /* DEBUG */ | 947 #endif /* DEBUG */ |
| 997 | 948 |
| 998 return nssCKFWObject_GetAttribute(fwObject, attribute, itemOpt, arenaOpt, pErr
or); | 949 return nssCKFWObject_GetAttribute(fwObject, attribute, itemOpt, arenaOpt, pE
rror); |
| 999 } | 950 } |
| 1000 | 951 |
| 1001 /* | 952 /* |
| 1002 * NSSCKFWObject_GetObjectSize | 953 * NSSCKFWObject_GetObjectSize |
| 1003 * | 954 * |
| 1004 */ | 955 */ |
| 1005 NSS_IMPLEMENT CK_ULONG | 956 NSS_IMPLEMENT CK_ULONG |
| 1006 NSSCKFWObject_GetObjectSize | 957 NSSCKFWObject_GetObjectSize( |
| 1007 ( | 958 NSSCKFWObject *fwObject, |
| 1008 NSSCKFWObject *fwObject, | 959 CK_RV *pError) |
| 1009 CK_RV *pError | |
| 1010 ) | |
| 1011 { | 960 { |
| 1012 #ifdef DEBUG | 961 #ifdef DEBUG |
| 1013 if (!pError) { | 962 if (!pError) { |
| 1014 return (CK_ULONG)0; | 963 return (CK_ULONG)0; |
| 1015 } | 964 } |
| 1016 | 965 |
| 1017 *pError = nssCKFWObject_verifyPointer(fwObject); | 966 *pError = nssCKFWObject_verifyPointer(fwObject); |
| 1018 if( CKR_OK != *pError ) { | 967 if (CKR_OK != *pError) { |
| 1019 return (CK_ULONG)0; | 968 return (CK_ULONG)0; |
| 1020 } | 969 } |
| 1021 #endif /* DEBUG */ | 970 #endif /* DEBUG */ |
| 1022 | 971 |
| 1023 return nssCKFWObject_GetObjectSize(fwObject, pError); | 972 return nssCKFWObject_GetObjectSize(fwObject, pError); |
| 1024 } | 973 } |
| OLD | NEW |