From 856a057fc0a0807e9c0dd2b11c04e1f1312bdb12 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Sun, 29 Apr 2007 00:20:38 +0000 Subject: Fix tons of bugs and performance issues to better list the certificates. --- ckcapi-cert.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'ckcapi-cert.c') 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); } } -- cgit v1.2.3