mirror of
https://github.com/strongswan/strongswan.git
synced 2025-10-06 00:00:47 -04:00
Implemented a generic PKCS#11 object enumerator
This commit is contained in:
parent
cd251d9a21
commit
9baa41c52d
@ -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,
|
||||
|
@ -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.
|
||||
*/
|
||||
|
Loading…
x
Reference in New Issue
Block a user