[glib] Add certificate chain construction test



commit 516adb99c094fc2c4dcb95f97f9d251d7bba1716
Author: Michael Catanzaro <mcatanzaro gnome org>
Date:   Fri Aug 28 19:47:19 2015 -0500

    Add certificate chain construction test
    
    Enhance GTestTlsBackend to allow setting the issuer property of
    GTlsCertificates, and add a test to ensure certificate chain
    construction with g_tls_certificate_new_from_pem() works as expected.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=754264

 gio/tests/cert-tests/cert-list.pem |   16 ++++++++
 gio/tests/gtesttlsbackend.c        |    9 ++++-
 gio/tests/tls-certificate.c        |   69 ++++++++++++++++++++++++++++++++++++
 3 files changed, 93 insertions(+), 1 deletions(-)
---
diff --git a/gio/tests/cert-tests/cert-list.pem b/gio/tests/cert-tests/cert-list.pem
index bf2fb31..ffab3f4 100644
--- a/gio/tests/cert-tests/cert-list.pem
+++ b/gio/tests/cert-tests/cert-list.pem
@@ -50,3 +50,19 @@ E6GlY2rvjCf0BpW0t4zKL/wvA5tBmuOWYg93psHgIdSNgkmfbA1kvD6kXehQlt1F
 5yZJP91/VND5LHvXf5TcAmr/KeQAPYvqfiGYXuvHDLA9y9OOyTBMURLYfWuo9HZt
 xeI14sZ9udXwtUhgcvXrBFzlRfkbojuMZw==
 -----END CERTIFICATE-----
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQCslrTl+gp3lQsEGMegjhQMow5yhinpQ7yji36soGuUpUynQPs7
+P5tm3ojZPeQGNmYof3Csc2yTrMLrCidt8xFkcgtZydOJ9sQSEgwc2of4nlvffIZb
+dIR+13WOPVRmS5tBVkQWFrlSFtQ70BDhNK3SZfkAb4+QmLSR1MJFaUPWrQIDAQAB
+AoGAUTnskYAIhRdEQ/1Vlp7HmNr05bl26C3VDjOMvroRZ7gUR3MxykS5YsTBK10R
+gEsB8XVpFgCMzUO1yODShdCsEg9kCB3fzSWkunK8+TF2TKOM5uWlQwifKJvcNisR
+Nbg3r8WygMMXaWSFA3xWoRuZ5It0jOX18v+x5RHHon/kaRECQQDl6FSwgJLeNAkR
+pMNQGdRhmMesHWmNNBv3Wozqm6Wpkwo5ZXPsLt3pprd0GN5jX0IG7clT1/eMD9/G
++3UGqTj3AkEAwC0M2gv+QUhbaB+KSlOZDOi4gsnhnsnaM7HQGDJJ5no4y2EvnYI3
+Y5rPJWedeYlCV3ccMitjnjcIJHInRZBIewJBANgsamVDn9Ua7GQQni1U/COAek7V
+oQfKNXmRROrbyxr1TSnGwQcU0kf+IIUjVQfu67CEKUeSzAqAapM4oULQHuUCQQC9
+J9qdiO6DXXAzRdA9pplgHnT2rzV3sSEoft3f4yfgRu8+KHPQqkpQrSE1pQ5YgWUe
+aGwFabXNFkfab839562fAkBl8jPidQdKWEgSa6h5pm4++sXLdWl7p6jiyetH64W7
+HnhRryE3ptrRGO0hSV1v4bx3DKzeJiJRlWUWiSl7828t
+-----END RSA PRIVATE KEY-----
+>>>> Garbage to be ignore <<<<
diff --git a/gio/tests/gtesttlsbackend.c b/gio/tests/gtesttlsbackend.c
index d5417fd..b97e4ef 100644
--- a/gio/tests/gtesttlsbackend.c
+++ b/gio/tests/gtesttlsbackend.c
@@ -68,6 +68,7 @@ struct _GTestTlsCertificate {
   GTlsCertificate parent_instance;
   gchar *key_pem;
   gchar *cert_pem;
+  GTlsCertificate *issuer;
 };
 
 struct _GTestTlsCertificateClass {
@@ -117,6 +118,9 @@ g_test_tls_certificate_get_property (GObject    *object,
     case PROP_CERT_PRIVATE_KEY_PEM:
       g_value_set_string (value, cert->key_pem);
       break;
+    case PROP_CERT_ISSUER:
+      g_value_set_object (value, cert->issuer);
+      break;
     default:
       g_assert_not_reached ();
       break;
@@ -139,9 +143,11 @@ g_test_tls_certificate_set_property (GObject      *object,
     case PROP_CERT_PRIVATE_KEY_PEM:
       cert->key_pem = g_value_dup_string (value);
       break;
+    case PROP_CERT_ISSUER:
+      cert->issuer = g_value_dup_object (value);
+      break;
     case PROP_CERT_CERTIFICATE:
     case PROP_CERT_PRIVATE_KEY:
-    case PROP_CERT_ISSUER:
       /* ignore */
       break;
     default:
@@ -157,6 +163,7 @@ g_test_tls_certificate_finalize (GObject *object)
 
   g_free (cert->cert_pem);
   g_free (cert->key_pem);
+  g_clear_object (&cert->issuer);
 }
 
 static void
diff --git a/gio/tests/tls-certificate.c b/gio/tests/tls-certificate.c
index 4d1de1d..9770272 100644
--- a/gio/tests/tls-certificate.c
+++ b/gio/tests/tls-certificate.c
@@ -123,6 +123,73 @@ pem_parser (const Reference *ref)
 }
 
 static void
+pem_parser_handles_chain (const Reference *ref)
+{
+  GTlsCertificate *cert;
+  GTlsCertificate *issuer;
+  GTlsCertificate *original_cert;
+  gchar *pem;
+  gchar *parsed_cert_pem = NULL;
+  const gchar *parsed_key_pem = NULL;
+  GError *error = NULL;
+
+  /* Check that a chain with exactly three certificates is returned */
+  g_file_get_contents (g_test_get_filename (G_TEST_DIST, "cert-tests", "cert-list.pem", NULL), &pem, NULL, 
&error);
+  g_assert_no_error (error);
+  g_assert (pem);
+
+  cert = original_cert = g_tls_certificate_new_from_pem (pem, -1, &error);
+  g_free (pem);
+  g_assert_no_error (error);
+  g_assert (cert);
+
+  g_object_get (cert,
+      "certificate-pem", &parsed_cert_pem,
+      NULL);
+  g_assert_cmpstr (parsed_cert_pem, ==, ref->cert_pems[0]);
+  g_clear_pointer (&parsed_cert_pem, g_free);
+
+  /* Make sure the private key was parsed */
+  parsed_key_pem = g_test_tls_connection_get_private_key_pem (cert);
+  g_assert_cmpstr (parsed_key_pem, ==, ref->key_pem);
+  parsed_key_pem = NULL;
+
+  /* Now test the second cert */
+  issuer = g_tls_certificate_get_issuer (cert);
+  g_assert (issuer);
+
+  cert = issuer;
+  issuer = g_tls_certificate_get_issuer (cert);
+  g_assert (issuer);
+
+  g_object_get (cert,
+      "certificate-pem", &parsed_cert_pem,
+      NULL);
+  g_assert_cmpstr (parsed_cert_pem, ==, ref->cert_pems[1]);
+  g_clear_pointer (&parsed_cert_pem, g_free);
+
+  /* Only the first cert should have a private key */
+  parsed_key_pem = g_test_tls_connection_get_private_key_pem (cert);
+  g_assert (!parsed_key_pem);
+
+  /* Now test the final cert */
+  cert = issuer;
+  issuer = g_tls_certificate_get_issuer (cert);
+  g_assert (!issuer);
+
+  g_object_get (cert,
+      "certificate-pem", &parsed_cert_pem,
+      NULL);
+  g_assert_cmpstr (parsed_cert_pem, ==, ref->cert_pems[2]);
+  g_clear_pointer (&parsed_cert_pem, g_free);
+
+  parsed_key_pem = g_test_tls_connection_get_private_key_pem (cert);
+  g_assert (!parsed_key_pem);
+
+  g_object_unref (original_cert);
+}
+
+static void
 from_file (const Reference *ref)
 {
   GTlsCertificate *cert;
@@ -305,6 +372,8 @@ main (int   argc,
 
   g_test_add_data_func ("/tls-certificate/pem-parser",
                         &ref, (GTestDataFunc)pem_parser);
+  g_test_add_data_func ("/tls-certificate/pem-parser-handles-chain",
+                        &ref, (GTestDataFunc)pem_parser_handles_chain);
   g_test_add_data_func ("/tls-certificate/from_file",
                         &ref, (GTestDataFunc)from_file);
   g_test_add_data_func ("/tls-certificate/from_files",


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