From: Martin Willi Date: Thu, 15 Jul 2010 13:43:30 +0000 (+0200) Subject: Implemented a generic PKCS#11 object enumerator X-Git-Tag: 4.5.0~611 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9baa41c52de80f158bf44e391514e724292113db;p=thirdparty%2Fstrongswan.git Implemented a generic PKCS#11 object enumerator --- diff --git a/src/libstrongswan/plugins/pkcs11/pkcs11_library.c b/src/libstrongswan/plugins/pkcs11/pkcs11_library.c index 76c09a6b4f..286b807eda 100644 --- a/src/libstrongswan/plugins/pkcs11/pkcs11_library.c +++ b/src/libstrongswan/plugins/pkcs11/pkcs11_library.c @@ -473,6 +473,71 @@ METHOD(pkcs11_library_t, get_name, char*, return this->name; } +/** + * Object enumerator + */ +typedef struct { + /* implements enumerator_t */ + enumerator_t public; + /* session */ + CK_SESSION_HANDLE session; + /* pkcs11 library */ + pkcs11_library_t *lib; +} object_enumerator_t; + +METHOD(enumerator_t, object_enumerate, bool, + object_enumerator_t *this, CK_OBJECT_HANDLE *out) +{ + CK_OBJECT_HANDLE object; + CK_ULONG found; + CK_RV rv; + + rv = this->lib->f->C_FindObjects(this->session, &object, 1, &found); + if (rv != CKR_OK) + { + DBG1(DBG_CFG, "C_FindObjects() failed: %N", ck_rv_names, rv); + return FALSE; + } + if (found) + { + *out = object; + return TRUE; + } + return FALSE; +} + +METHOD(enumerator_t, object_destroy, void, + object_enumerator_t *this) +{ + this->lib->f->C_FindObjectsFinal(this->session); + free(this); +} + +METHOD(pkcs11_library_t, create_object_enumerator, enumerator_t*, + private_pkcs11_library_t *this, CK_SESSION_HANDLE session, + CK_ATTRIBUTE_PTR tmpl, CK_ULONG count) +{ + object_enumerator_t *enumerator; + CK_RV rv; + + rv = this->public.f->C_FindObjectsInit(session, tmpl, count); + if (rv != CKR_OK) + { + DBG1(DBG_CFG, "C_FindObjectsInit() failed: %N", ck_rv_names, rv); + return enumerator_create_empty(); + } + + INIT(enumerator, + .public = { + .enumerate = (void*)_object_enumerate, + .destroy = _object_destroy, + }, + .session = session, + .lib = &this->public, + ); + return &enumerator->public; +} + METHOD(pkcs11_library_t, destroy, void, private_pkcs11_library_t *this) { @@ -620,6 +685,7 @@ pkcs11_library_t *pkcs11_library_create(char *name, char *file) INIT(this, .public = { .get_name = _get_name, + .create_object_enumerator = _create_object_enumerator, .destroy = _destroy, }, .name = name, diff --git a/src/libstrongswan/plugins/pkcs11/pkcs11_library.h b/src/libstrongswan/plugins/pkcs11/pkcs11_library.h index 5a0a6bcbb8..c1f7de0e66 100644 --- a/src/libstrongswan/plugins/pkcs11/pkcs11_library.h +++ b/src/libstrongswan/plugins/pkcs11/pkcs11_library.h @@ -26,6 +26,7 @@ typedef struct pkcs11_library_t pkcs11_library_t; #include "pkcs11.h" #include +#include /** * A loaded and initialized PKCS#11 library. @@ -40,10 +41,20 @@ struct pkcs11_library_t { /** * Get the name this instance was created with. * - * @return name, as passed to constructor + * @return name, as passed to constructor */ char* (*get_name)(pkcs11_library_t *this); + /** + * Create an enumerator over CK_OBJECT_HANDLE using a search template. + * + * @param session session to use + * @param tmpl search template + * @param count number of attributes in the search template + */ + enumerator_t* (*create_object_enumerator)(pkcs11_library_t *this, + CK_SESSION_HANDLE session, CK_ATTRIBUTE_PTR tmpl, CK_ULONG count); + /** * Destroy a pkcs11_library_t. */