[gnome-keyring/trust-store] [xdg-store] Add support for storing certificates.



commit 4e014c7a5852d2d33935e29a4ec539d1584b09e5
Author: Stef Walter <stefw collabora co uk>
Date:   Wed Nov 24 21:14:31 2010 +0000

    [xdg-store] Add support for storing certificates.
    
     * Fix module problems related to object creation.
     * Make GkmCertificate handle loading empty data properly.
     * Testing.

 pkcs11/gkm/gkm-certificate.c                       |    6 ++-
 pkcs11/gkm/gkm-session.c                           |    9 +++-
 pkcs11/xdg-store/gkm-xdg-module.c                  |   15 ++---
 ...st-certificate-1.der => test-certificate-1.cer} |  Bin 813 -> 813 bytes
 ...st-certificate-1.der => test-certificate-2.cer} |  Bin 813 -> 813 bytes
 pkcs11/xdg-store/tests/test-xdg-module.c           |   63 ++++++++++++++------
 6 files changed, 65 insertions(+), 28 deletions(-)
---
diff --git a/pkcs11/gkm/gkm-certificate.c b/pkcs11/gkm/gkm-certificate.c
index 4c45340..7346454 100644
--- a/pkcs11/gkm/gkm-certificate.c
+++ b/pkcs11/gkm/gkm-certificate.c
@@ -369,7 +369,11 @@ gkm_certificate_real_load (GkmSerializable *base, GkmSecret *login, gconstpointe
 	GkmSexp *wrapper;
 
 	g_return_val_if_fail (GKM_IS_CERTIFICATE (self), FALSE);
-	g_return_val_if_fail (data, FALSE);
+
+	if (!data || !n_data) {
+		g_message ("cannot load empty certificate file");
+		return FALSE;
+	}
 
 	copy = g_memdup (data, n_data);
 
diff --git a/pkcs11/gkm/gkm-session.c b/pkcs11/gkm/gkm-session.c
index 854ca98..51ffed3 100644
--- a/pkcs11/gkm/gkm-session.c
+++ b/pkcs11/gkm/gkm-session.c
@@ -956,6 +956,7 @@ gkm_session_C_CreateObject (GkmSession* self, CK_ATTRIBUTE_PTR template,
                             CK_ULONG count, CK_OBJECT_HANDLE_PTR new_object)
 {
 	GkmObject *object = NULL;
+	CK_OBJECT_HANDLE handle;
 	GkmTransaction *transaction;
 	CK_RV rv;
 
@@ -973,7 +974,13 @@ gkm_session_C_CreateObject (GkmSession* self, CK_ATTRIBUTE_PTR template,
 
 	if (rv == CKR_OK) {
 		g_assert (object);
-		*new_object = gkm_object_get_handle (object);
+		handle = gkm_object_get_handle (object);
+		if (handle == 0) {
+			g_warning ("an object was not properly exposed its owner");
+			rv = CKR_GENERAL_ERROR;
+		} else {
+			*new_object = handle;
+		}
 		g_object_unref (object);
 	}
 
diff --git a/pkcs11/xdg-store/gkm-xdg-module.c b/pkcs11/xdg-store/gkm-xdg-module.c
index e173a5a..f6d20f4 100644
--- a/pkcs11/xdg-store/gkm-xdg-module.c
+++ b/pkcs11/xdg-store/gkm-xdg-module.c
@@ -33,6 +33,7 @@
 #include "egg/egg-hex.h"
 
 #include "gkm/gkm-assertion.h"
+#include "gkm/gkm-certificate.h"
 #include "gkm/gkm-file-tracker.h"
 #include "gkm/gkm-serializable.h"
 #include "gkm/gkm-transaction.h"
@@ -109,15 +110,8 @@ type_from_path (const gchar *path)
 
 	if (g_str_equal (ext, ".trust"))
 		return GKM_XDG_TYPE_TRUST;
-
-#if 0
-	else if (strcmp (extension, ".pkcs8") == 0)
-		return GKM_TYPE_GNOME2_PRIVATE_KEY;
-	else if (strcmp (extension, ".pub") == 0)
-		return GKM_TYPE_GNOME2_PUBLIC_KEY;
-	else if (strcmp (extension, ".cer") == 0)
+	else if (strcmp (ext, ".cer") == 0)
 		return GKM_TYPE_CERTIFICATE;
-#endif
 
 	return 0;
 }
@@ -137,11 +131,15 @@ add_object_to_module (GkmXdgModule *self, GkmObject *object, const gchar *filena
 	g_assert (!lookup_filename_for_object (object));
 	g_object_set_data_full (G_OBJECT (object), "xdg-module-filename",
 	                        g_strdup (filename), g_free);
+
+	gkm_object_expose (object, TRUE);
 }
 
 static void
 remove_object_from_module (GkmXdgModule *self, GkmObject *object, const gchar *filename)
 {
+	gkm_object_expose (object, FALSE);
+
 	g_assert (g_hash_table_lookup (self->objects_by_path, filename) == object);
 	g_hash_table_remove (self->objects_by_path, filename);
 }
@@ -446,6 +444,7 @@ gkm_xdg_module_init (GkmXdgModule *self)
 
 	/* For creating stored objects */
 	gkm_module_register_factory (GKM_MODULE (self), GKM_XDG_FACTORY_ASSERTION);
+	gkm_module_register_factory (GKM_MODULE (self), GKM_FACTORY_CERTIFICATE);
 }
 
 static void
diff --git a/pkcs11/xdg-store/tests/test-data/test-certificate-1.der b/pkcs11/xdg-store/tests/test-data/test-certificate-1.cer
similarity index 100%
copy from pkcs11/xdg-store/tests/test-data/test-certificate-1.der
copy to pkcs11/xdg-store/tests/test-data/test-certificate-1.cer
diff --git a/pkcs11/xdg-store/tests/test-data/test-certificate-1.der b/pkcs11/xdg-store/tests/test-data/test-certificate-2.cer
similarity index 100%
rename from pkcs11/xdg-store/tests/test-data/test-certificate-1.der
rename to pkcs11/xdg-store/tests/test-data/test-certificate-2.cer
diff --git a/pkcs11/xdg-store/tests/test-xdg-module.c b/pkcs11/xdg-store/tests/test-xdg-module.c
index 8419759..1fc0943 100644
--- a/pkcs11/xdg-store/tests/test-xdg-module.c
+++ b/pkcs11/xdg-store/tests/test-xdg-module.c
@@ -128,6 +128,7 @@ test_xdg_module_initialize_and_enter (void)
 
 	/* Copy files from test-data to scratch */
 	copy_scratch_file ("test-refer-1.trust");
+	copy_scratch_file ("test-certificate-1.cer");
 	empty_scratch_file ("invalid-without-ext");
 	empty_scratch_file ("test-file.unknown");
 	empty_scratch_file ("test-invalid.trust");
@@ -237,11 +238,11 @@ TESTING_TEST (xdg_module_find_twice_is_same)
 	CK_RV rv;
 
 	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_objects);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjectsFinal (session);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, >, 0);
 
@@ -249,11 +250,11 @@ TESTING_TEST (xdg_module_find_twice_is_same)
 	touch_scratch_file ("test-refer-1.trust", 1);
 
 	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_check);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjectsFinal (session);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Should have same objects after reload */
 	gkm_assert_cmpulong (n_check, ==, n_objects);
@@ -267,11 +268,11 @@ TESTING_TEST (xdg_module_file_becomes_invalid)
 	CK_RV rv;
 
 	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_objects);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjectsFinal (session);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, >, 0);
 
@@ -280,11 +281,11 @@ TESTING_TEST (xdg_module_file_becomes_invalid)
 	touch_scratch_file ("test-refer-1.trust", 2);
 
 	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_check);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjectsFinal (session);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Should have less objects */
 	gkm_assert_cmpulong (n_check, <, n_objects);
@@ -298,11 +299,11 @@ TESTING_TEST (xdg_module_file_remove)
 	CK_RV rv;
 
 	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_objects);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjectsFinal (session);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	gkm_assert_cmpulong (n_objects, >, 0);
 
@@ -310,12 +311,38 @@ TESTING_TEST (xdg_module_file_remove)
 	remove_scratch_file ("test-refer-1.trust");
 
 	rv = gkm_session_C_FindObjectsInit (session, NULL, 0);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjects (session, objects, G_N_ELEMENTS (objects), &n_check);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 	rv = gkm_session_C_FindObjectsFinal (session);
-	g_assert (rv == CKR_OK);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
 
 	/* Should have less objects */
 	gkm_assert_cmpulong (n_check, <, n_objects);
 }
+
+TESTING_TEST (xdg_create_and_add_object)
+{
+	CK_OBJECT_HANDLE object = 0;
+	CK_OBJECT_CLASS klass = CKO_CERTIFICATE;
+	CK_CERTIFICATE_TYPE ctype = CKC_X_509;
+	CK_BBOOL tval = CK_TRUE;
+	gpointer data;
+	gsize n_data;
+	CK_RV rv;
+
+	CK_ATTRIBUTE attrs[] = {
+		{ CKA_VALUE, NULL, 0 },
+		{ CKA_CLASS, &klass, sizeof (klass) },
+		{ CKA_TOKEN, &tval, sizeof (tval) },
+		{ CKA_CERTIFICATE_TYPE, &ctype, sizeof (ctype) }
+	};
+
+	data = testing_data_read ("test-certificate-2.cer", &n_data);
+	attrs[0].pValue = data;
+	attrs[0].ulValueLen = n_data;
+
+	rv = gkm_session_C_CreateObject (session, attrs, G_N_ELEMENTS (attrs), &object);
+	gkm_assert_cmprv (rv, ==, CKR_OK);
+	gkm_assert_cmpulong (object, !=, 0);
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]