summaryrefslogtreecommitdiff
path: root/ckcapi-session.c
diff options
context:
space:
mode:
Diffstat (limited to 'ckcapi-session.c')
-rw-r--r--ckcapi-session.c64
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;