From 31ad926b70b87654052a0d1af284fd992b85afd9 Mon Sep 17 00:00:00 2001 From: Stef Walter Date: Sun, 1 Aug 2010 12:02:56 +0200 Subject: [PATCH] [gck] Add methods for listing and initializing registered modules. * We use the concept of a PKCS #11 registry as outlined here: http://wiki.cacert.org/Pkcs11TaskForce --- gck/Makefile.am | 3 ++- gck/gck-modules.c | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ gck/gck.h | 4 ++++ 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/gck/Makefile.am b/gck/Makefile.am index b6ed66d..a860f71 100644 --- a/gck/Makefile.am +++ b/gck/Makefile.am @@ -8,7 +8,8 @@ INCLUDES = \ -I$(top_srcdir) \ $(GOBJECT_CFLAGS) \ $(GTHREAD_CFLAGS) \ - $(GLIB_CFLAGS) + $(GLIB_CFLAGS) \ + -DPKCS11_REGISTRY_DIR=\"$(libdir)/pkcs11\" BUILT_SOURCES = \ gck-marshal.c gck-marshal.h diff --git a/gck/gck-modules.c b/gck/gck-modules.c index bf13de1..c27062d 100644 --- a/gck/gck-modules.c +++ b/gck/gck-modules.c @@ -37,6 +37,71 @@ * Xxxxx */ +gchar** +gck_modules_list_registered_paths (GError **err) +{ + const gchar *name; + gchar *path; + GDir *dir; + GArray *paths; + + g_return_val_if_fail (!err || !*err, NULL); + + dir = g_dir_open (PKCS11_REGISTRY_DIR, 0, err); + if (dir == NULL) + return NULL; + + paths = g_array_new (TRUE, TRUE, sizeof (gchar*)); + + for (;;) { + name = g_dir_read_name (dir); + if (!name) + break; + + path = g_build_filename (PKCS11_REGISTRY_DIR, name, NULL); + if (g_file_test (path, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) + g_array_append_val (paths, path); + else + g_free (path); + } + + g_dir_close (dir); + + return (gchar**)g_array_free (paths, FALSE); +} + +GList* +gck_modules_initialize_registered (guint options) +{ + GError *err = NULL; + gchar **paths, **p; + GckModule *module; + GList *results = NULL; + + paths = gck_modules_list_registered_paths (&err); + if (!paths && err) { + g_warning ("couldn't list registered PKCS#11 module paths: %s", + err && err->message ? err->message : ""); + g_clear_error (&err); + return NULL; + } + + for (p = paths; *p; ++p) { + module = gck_module_initialize (*p, NULL, 0, &err); + if (module) { + results = g_list_prepend (results, module); + + } else { + g_warning ("couldn't load PKCS#11 module: %s: %s", + *p, err && err->message ? err->message : ""); + g_clear_error (&err); + } + } + + g_strfreev (paths); + return results; +} + GList* gck_modules_get_slots (GList *modules, gboolean token_present) { diff --git a/gck/gck.h b/gck/gck.h index f4a2fc4..d804071 100644 --- a/gck/gck.h +++ b/gck/gck.h @@ -299,6 +299,10 @@ GList* gck_module_get_slots (GckModule *self, guint gck_module_get_options (GckModule *self); +gchar** gck_modules_list_registered_paths (GError **err); + +GList* gck_modules_initialize_registered (guint options); + GList* gck_modules_get_slots (GList *modules, gboolean token_present); -- 2.7.4