summaryrefslogtreecommitdiff
path: root/ckcapi-cert.c
diff options
context:
space:
mode:
Diffstat (limited to 'ckcapi-cert.c')
-rw-r--r--ckcapi-cert.c32
1 files changed, 28 insertions, 4 deletions
diff --git a/ckcapi-cert.c b/ckcapi-cert.c
index 672e189..0162983 100644
--- a/ckcapi-cert.c
+++ b/ckcapi-cert.c
@@ -440,7 +440,7 @@ static const CkCapiObjectVtable cert_object_vtable = {
static CK_RV
register_cert_object(CkCapiSession* sess, const char* store, PCCERT_CONTEXT cert,
- CK_OBJECT_HANDLE_PTR id)
+ CkCapiObject** obj)
{
CertObject* cobj;
CK_RV ret;
@@ -485,21 +485,36 @@ register_cert_object(CkCapiSession* sess, const char* store, PCCERT_CONTEXT cert
}
ASSERT(cobj->obj.id != 0);
- *id = cobj->obj.id;
+ *obj = &cobj->obj;
return CKR_OK;
}
+static void
+clear_object_data_for_store(CkCapiSession* sess, CkCapiObject* obj,
+ CkCapiObjectData* data, void* arg)
+{
+ const char* store = (const char*) arg;
+ CertObject *cobj = (CertObject*)obj;
+
+ if(strcmp(cobj->store, store) == 0)
+ ckcapi_session_clear_object_data(sess, obj);
+}
+
CK_RV
ckcapi_cert_find_in_store(CkCapiSession* sess, const char* store_name,
CK_ATTRIBUTE_PTR match, CK_ULONG count, CkCapiArray* arr)
{
PCCERT_CONTEXT cert = NULL;
- CK_OBJECT_HANDLE obj;
+ CkCapiObject* obj;
HCERTSTORE store;
CkCapiObjectData objdata;
DWORD err;
CK_RV ret = CKR_OK;
+
+ /* Clear any loaded data for objects in this store */
+ ckcapi_session_enum_object_data(sess, clear_object_data_for_store, (void*)store_name);
+
store = CertOpenSystemStore((HCRYPTPROV)NULL, store_name);
if(store == NULL)
{
@@ -525,7 +540,16 @@ ckcapi_cert_find_in_store(CkCapiSession* sess, const char* store_name,
if(ret != CKR_OK)
break;
- ckcapi_array_append(arr, obj);
+ ASSERT(obj);
+
+ /* Store away the object data for performance reasons */
+ objdata.data = (void*)CertDuplicateCertificateContext(cert);
+ if(objdata.data) {
+ if(ckcapi_session_set_object_data(sess, obj, &objdata) != CKR_OK)
+ CertFreeCertificateContext((PCCERT_CONTEXT)objdata.data);
+ }
+
+ ckcapi_array_append(arr, obj->id);
}
}