]> git.ipfire.org Git - people/ms/strongswan.git/commitdiff
Implemented a generic PKCS#11 object enumerator
authorMartin Willi <martin@revosec.ch>
Thu, 15 Jul 2010 13:43:30 +0000 (15:43 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 4 Aug 2010 07:26:20 +0000 (09:26 +0200)
src/libstrongswan/plugins/pkcs11/pkcs11_library.c
src/libstrongswan/plugins/pkcs11/pkcs11_library.h

index 76c09a6b4f8df38b3b78f923bb19ec99329aaf44..286b807eda2c24736c034fa8fc0f5839f6fb8de7 100644 (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,
index 5a0a6bcbb81e49f198d19ae96b84e8d1dc45ec8e..c1f7de0e66eba30782082d049103bb6d35d96268 100644 (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.
         */