summaryrefslogtreecommitdiff
path: root/ckcapi-object.c
diff options
context:
space:
mode:
Diffstat (limited to 'ckcapi-object.c')
-rw-r--r--ckcapi-object.c73
1 files changed, 57 insertions, 16 deletions
diff --git a/ckcapi-object.c b/ckcapi-object.c
index c02c365..c620cc4 100644
--- a/ckcapi-object.c
+++ b/ckcapi-object.c
@@ -17,6 +17,34 @@ object_free(CkCapiObject* obj)
(obj->obj_funcs.release)(obj);
}
+void
+ckcapi_object_clear_all(void)
+{
+ size_t i;
+
+ ckcapi_lock_global();
+
+ if(object_hash)
+ {
+ ckcapi_hash_free(object_hash);
+ object_hash = NULL;
+ }
+
+ if(object_array)
+ {
+ for(i = 0; i < object_array->len; ++i)
+ {
+ ASSERT(ckcapi_array_index(object_array, CkCapiObject*, i));
+ object_free(ckcapi_array_index(object_array, CkCapiObject*, i));
+ }
+
+ ckcapi_array_free(object_array, TRUE);
+ object_array = NULL;
+ }
+
+ ckcapi_unlock_global();
+}
+
CkCapiObject*
ckcapi_object_lookup(CkCapiSession* sess, CK_OBJECT_HANDLE obj)
{
@@ -48,7 +76,7 @@ ckcapi_object_register(CkCapiSession* sess, CkCapiObject* obj)
ASSERT(obj->unique_key);
ASSERT(obj->unique_len);
- DBGS(sess, "registering new session");
+ DBGS(sess, "registering new object");
ckcapi_lock_global();
@@ -364,7 +392,7 @@ ckcapi_object_data_get_attrs(CkCapiObjectData* objdata, CK_ATTRIBUTE_PTR attrs,
break;
case DATA_ULONG:
rv = (objdata->data_funcs.get_ulong)(objdata->data, attrs[i].type,
- attrs[i].pValue, &attrs[i].ulValueLen);
+ attrs[i].pValue, &attrs[i].ulValueLen);
break;
case DATA_BYTES:
rv = (objdata->data_funcs.get_bytes)(objdata->data, attrs[i].type,
@@ -383,23 +411,36 @@ ckcapi_object_data_get_attrs(CkCapiObjectData* objdata, CK_ATTRIBUTE_PTR attrs,
};
/* Not an error if they were just requesting the size */
- if(rv == CKR_BUFFER_TOO_SMALL)
+ if(rv != CKR_OK)
{
- if(!attrs[i].pValue)
- rv = CKR_OK;
- }
+ if(rv == CKR_BUFFER_TOO_SMALL)
+ {
+ if(!attrs[i].pValue)
+ rv = CKR_OK;
+ }
- /* Is it a fatal error? */
- else if(rv != CKR_ATTRIBUTE_TYPE_INVALID)
- {
- ret = rv;
- break;
- }
+ /* Attribute is sensitive */
+ else if(rv == CKR_ATTRIBUTE_SENSITIVE)
+ {
+ attrs[i].ulValueLen = (CK_ULONG)-1;
+ }
- /* Transfer any non-fatal errors outward */
- if(rv != CKR_OK && ret == CKR_OK)
- {
- ret = rv;
+ /* Attribute doesn't exist */
+ else if(rv == CKR_ATTRIBUTE_TYPE_INVALID)
+ {
+ attrs[i].ulValueLen = (CK_ULONG)-1;
+ }
+
+ /* A fatal error? */
+ else
+ {
+ ret = rv;
+ break;
+ }
+
+ /* Transfer any non-fatal errors outward */
+ if(rv != CKR_OK && ret == CKR_OK)
+ ret = rv;
}
}