diff options
Diffstat (limited to 'ckcapi-session.c')
-rw-r--r-- | ckcapi-session.c | 64 |
1 files changed, 27 insertions, 37 deletions
diff --git a/ckcapi-session.c b/ckcapi-session.c index 9f9a6e6..8d00316 100644 --- a/ckcapi-session.c +++ b/ckcapi-session.c @@ -349,17 +349,6 @@ ckcapi_session_close_all() */ CK_RV -ckcapi_object_load_data(CkCapiObject* obj, CkCapiObjectData* objdata) -{ - ASSERT(obj); - ASSERT(obj->id); - ASSERT(obj->obj_funcs.load_data); - - memset(objdata, 0, sizeof(*objdata)); - return (obj->obj_funcs.load_data)(obj, objdata); -} - -CK_RV ckcapi_session_get_object_data(CkCapiSession* sess, CkCapiObject* obj, CkCapiObjectData** objdata) { @@ -384,12 +373,16 @@ ckcapi_session_get_object_data(CkCapiSession* sess, CkCapiObject* obj, return CKR_HOST_MEMORY; newdata->object = id; - ret = (obj->obj_funcs.load_data)(obj, newdata); + ret = (obj->obj_funcs.load_data)(sess, obj, newdata); if(ret != CKR_OK) { free(newdata); return ret; } + newdata->object = id; + ASSERT(newdata->data); + ASSERT(newdata->data_funcs.release); + if(!ckcapi_hash_set(sess->object_data, &newdata->object, sizeof(newdata->object), newdata)) { object_data_release(newdata); @@ -517,28 +510,25 @@ static CK_RV gather_objects(CkCapiSession* sess, CK_ATTRIBUTE_PTR match, CK_ULONG count, CkCapiArray* arr) { - CK_OBJECT_CLASS ocls = CK_INVALID_HANDLE; + CK_OBJECT_CLASS ocls = CKO_ANY; CK_RV ret = CKR_OK; - /* TODO: Reenable this once we have trust worked out - ret = ckcapi_builtin_find_all(sess, match, count, arr); + get_ulong_attribute(CKA_CLASS, match, count, &ocls); + + /* Search for builtins */ + ret = ckcapi_builtin_find(sess, ocls, match, count, arr); if(ret != CKR_OK) return ret; - */ - get_ulong_attribute(CKA_CLASS, match, count, &ocls); - switch(ocls) - { - /* all different classes */ - case CK_INVALID_HANDLE: - case CKO_CERTIFICATE: - ret = ckcapi_cert_find_all(sess, match, count, arr); - break; - case CKO_PUBLIC_KEY: - case CKO_PRIVATE_KEY: - default: - break; - }; + /* Search for certificates */ + ret = ckcapi_cert_find(sess, ocls, match, count, arr); + if(ret != CKR_OK) + return ret; + + /* Search through trust objects */ + ret = ckcapi_trust_find(sess, ocls, match, count, arr); + if(ret != CKR_OK) + return ret; return ret; } @@ -555,10 +545,10 @@ cleanup_find_operation(CkCapiSession* sess) } void -purge_duplicate_ulongs(CkCapiArray* arr) +purge_duplicate_objects(CkCapiArray* arr) { CkCapiHash* checks; - CK_ULONG* v; + CkCapiObject* v; size_t i; checks = ckcapi_hash_new(); @@ -567,15 +557,15 @@ purge_duplicate_ulongs(CkCapiArray* arr) for(i = 0; i < arr->len; ) { - v = &ckcapi_array_index(arr, CK_ULONG, i); - if(ckcapi_hash_get(checks, v, sizeof(CK_ULONG))) + v = ckcapi_array_index(arr, CkCapiObject*, i); + if(ckcapi_hash_get(checks, &v, sizeof(CkCapiObject*))) { ckcapi_array_remove_index(arr, i); /* Look at same i again */ } else { - if(!ckcapi_hash_set(checks, v, sizeof(CK_ULONG), v)) + if(!ckcapi_hash_set(checks, &v, sizeof(CkCapiObject*), &v)) break; ++i; } @@ -597,7 +587,7 @@ ckcapi_session_find_init(CkCapiSession* sess, CK_ATTRIBUTE_PTR match, if(sess->operation_type != OPERATION_NONE) return CKR_OPERATION_ACTIVE; - arr = ckcapi_array_new(0, 1, sizeof(CK_OBJECT_HANDLE)); + arr = ckcapi_array_new(0, 1, sizeof(CkCapiObject*)); if(!arr) return CKR_HOST_MEMORY; @@ -609,7 +599,7 @@ ckcapi_session_find_init(CkCapiSession* sess, CK_ATTRIBUTE_PTR match, } /* Cleanup all duplicates in the array */ - purge_duplicate_ulongs(arr); + purge_duplicate_objects(arr); sess->operation_type = OPERATION_FIND; sess->operation_data = arr; @@ -641,7 +631,7 @@ ckcapi_session_find(CkCapiSession* sess, CK_OBJECT_HANDLE_PTR objects, arr = (CkCapiArray*)sess->operation_data; *object_count = (max_object_count > arr->len ? arr->len : max_object_count); for(i = 0; i < *object_count; ++i) - objects[i] = ckcapi_array_index(arr, CK_OBJECT_HANDLE, i); + objects[i] = ckcapi_array_index(arr, CkCapiObject*, i)->id; ckcapi_array_remove_range(arr, 0, *object_count); return CKR_OK; |