Implemented a generic PKCS#11 object enumerator

This commit is contained in:
Martin Willi 2010-07-15 15:43:30 +02:00
parent cd251d9a21
commit 9baa41c52d
2 changed files with 78 additions and 1 deletions

View File

@ -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,

View File

@ -26,6 +26,7 @@ typedef struct pkcs11_library_t pkcs11_library_t;
#include "pkcs11.h"
#include <enum.h>
#include <utils/enumerator.h>
/**
* 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.
*/