help: caution users about using Ignore SSL Errors
[empathy-mirror.git] / tests / empathy-tls-test.c
blob91b05761f9b9ebb44157bc40ffb4606c4f3650e7
1 #include "config.h"
3 #include <gnutls/gnutls.h>
4 #include <telepathy-glib/telepathy-glib.h>
5 #include <telepathy-glib/telepathy-glib-dbus.h>
7 #include "empathy-tls-verifier.h"
8 #include "mock-pkcs11.h"
9 #include "test-helper.h"
11 #define MOCK_TLS_CERTIFICATE_PATH "/mock/certificate"
13 /* Forward decl */
14 GType mock_tls_certificate_get_type (void);
16 #define MOCK_TLS_CERTIFICATE(obj) \
17 (G_TYPE_CHECK_INSTANCE_CAST((obj), mock_tls_certificate_get_type (), \
18 MockTLSCertificate))
20 typedef struct _MockTLSCertificate {
21 GObject parent;
22 guint state;
23 GPtrArray *rejections;
24 gchar *cert_type;
25 GPtrArray *cert_data;
26 } MockTLSCertificate;
28 typedef struct _MockTLSCertificateClass {
29 GObjectClass parent;
30 TpDBusPropertiesMixinClass dbus_props_class;
31 } MockTLSCertificateClass;
33 enum {
34 PROP_0,
35 PROP_STATE,
36 PROP_REJECTIONS,
37 PROP_CERTIFICATE_TYPE,
38 PROP_CERTIFICATE_CHAIN_DATA
41 static void mock_tls_certificate_iface_init (gpointer, gpointer);
43 G_DEFINE_TYPE_WITH_CODE(MockTLSCertificate, mock_tls_certificate, G_TYPE_OBJECT,
44 G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_AUTHENTICATION_TLS_CERTIFICATE,
45 mock_tls_certificate_iface_init)
46 G_IMPLEMENT_INTERFACE (TP_TYPE_SVC_DBUS_PROPERTIES,
47 tp_dbus_properties_mixin_iface_init)
50 static void
51 mock_tls_certificate_init (MockTLSCertificate *self)
53 self->state = TP_TLS_CERTIFICATE_STATE_PENDING;
54 self->cert_type = g_strdup ("x509");
55 self->cert_data = g_ptr_array_new_with_free_func ((GDestroyNotify)
56 g_array_unref);
57 self->rejections = g_ptr_array_new ();
60 static void
61 mock_tls_certificate_get_property (GObject *object,
62 guint property_id,
63 GValue *value,
64 GParamSpec *pspec)
66 MockTLSCertificate *self = MOCK_TLS_CERTIFICATE (object);
68 switch (property_id)
70 case PROP_STATE:
71 g_value_set_uint (value, self->state);
72 break;
73 case PROP_REJECTIONS:
74 g_value_set_boxed (value, self->rejections);
75 break;
76 case PROP_CERTIFICATE_TYPE:
77 g_value_set_string (value, self->cert_type);
78 break;
79 case PROP_CERTIFICATE_CHAIN_DATA:
80 g_value_set_boxed (value, self->cert_data);
81 break;
82 default:
83 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
84 break;
88 static void
89 mock_tls_certificate_finalize (GObject *object)
91 MockTLSCertificate *self = MOCK_TLS_CERTIFICATE (object);
93 tp_clear_boxed (TP_ARRAY_TYPE_TLS_CERTIFICATE_REJECTION_LIST,
94 &self->rejections);
95 g_free (self->cert_type);
96 self->cert_type = NULL;
97 g_ptr_array_unref (self->cert_data);
98 self->cert_data = NULL;
100 G_OBJECT_CLASS (mock_tls_certificate_parent_class)->finalize (object);
103 static void
104 mock_tls_certificate_class_init (MockTLSCertificateClass *klass)
106 GObjectClass *oclass = G_OBJECT_CLASS (klass);
107 GParamSpec *pspec;
109 static TpDBusPropertiesMixinPropImpl object_props[] = {
110 { "State", "state", NULL },
111 { "Rejections", "rejections", NULL },
112 { "CertificateType", "certificate-type", NULL },
113 { "CertificateChainData", "certificate-chain-data", NULL },
114 { NULL }
117 static TpDBusPropertiesMixinIfaceImpl prop_interfaces[] = {
118 { TP_IFACE_AUTHENTICATION_TLS_CERTIFICATE,
119 tp_dbus_properties_mixin_getter_gobject_properties,
120 NULL,
121 object_props,
123 { NULL }
126 oclass->get_property = mock_tls_certificate_get_property;
127 oclass->finalize = mock_tls_certificate_finalize;
129 pspec = g_param_spec_uint ("state",
130 "State of this certificate",
131 "The state of this TLS certificate.",
132 0, TP_NUM_TLS_CERTIFICATE_STATES - 1,
133 TP_TLS_CERTIFICATE_STATE_PENDING,
134 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
135 g_object_class_install_property (oclass, PROP_STATE, pspec);
137 pspec = g_param_spec_boxed ("rejections",
138 "The reject reasons",
139 "The reasons why this TLS certificate has been rejected",
140 TP_ARRAY_TYPE_TLS_CERTIFICATE_REJECTION_LIST,
141 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
142 g_object_class_install_property (oclass, PROP_REJECTIONS, pspec);
144 pspec = g_param_spec_string ("certificate-type",
145 "The certificate type",
146 "The type of this certificate.",
147 NULL,
148 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
149 g_object_class_install_property (oclass, PROP_CERTIFICATE_TYPE, pspec);
151 pspec = g_param_spec_boxed ("certificate-chain-data",
152 "The certificate chain data",
153 "The raw PEM-encoded trust chain of this certificate.",
154 TP_ARRAY_TYPE_UCHAR_ARRAY_LIST,
155 G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
156 g_object_class_install_property (oclass, PROP_CERTIFICATE_CHAIN_DATA, pspec);
158 klass->dbus_props_class.interfaces = prop_interfaces;
159 tp_dbus_properties_mixin_class_init (oclass,
160 G_STRUCT_OFFSET (MockTLSCertificateClass, dbus_props_class));
163 static void
164 mock_tls_certificate_accept (TpSvcAuthenticationTLSCertificate *base,
165 DBusGMethodInvocation *context)
167 MockTLSCertificate *self = MOCK_TLS_CERTIFICATE (base);
168 self->state = TP_TLS_CERTIFICATE_STATE_ACCEPTED;
169 tp_svc_authentication_tls_certificate_emit_accepted (self);
170 tp_svc_authentication_tls_certificate_return_from_accept (context);
173 static void
174 mock_tls_certificate_reject (TpSvcAuthenticationTLSCertificate *base,
175 const GPtrArray *in_Rejections,
176 DBusGMethodInvocation *context)
178 MockTLSCertificate *self = MOCK_TLS_CERTIFICATE (base);
179 self->state = TP_TLS_CERTIFICATE_STATE_REJECTED;
180 tp_svc_authentication_tls_certificate_emit_rejected (self, in_Rejections);
181 tp_svc_authentication_tls_certificate_return_from_reject (context);
184 static void
185 mock_tls_certificate_iface_init (gpointer g_iface,
186 gpointer iface_data)
188 TpSvcAuthenticationTLSCertificateClass *klass =
189 (TpSvcAuthenticationTLSCertificateClass *) g_iface;
191 tp_svc_authentication_tls_certificate_implement_accept (klass,
192 mock_tls_certificate_accept);
193 tp_svc_authentication_tls_certificate_implement_reject (klass,
194 mock_tls_certificate_reject);
197 #if 0
198 static void
199 mock_tls_certificate_assert_rejected (MockTLSCertificate *self,
200 TpTLSCertificateRejectReason reason)
202 GValueArray *rejection;
203 TpTLSCertificateRejectReason rejection_reason;
204 gchar *rejection_error;
205 GHashTable *rejection_details;
206 guint i;
208 g_assert (self->state == TP_TLS_CERTIFICATE_STATE_REJECTED);
209 g_assert (self->rejections);
210 g_assert (self->rejections->len > 0);
212 for (i = 0; i < self->rejections->len; ++i)
214 rejection = g_ptr_array_index (self->rejections, i);
215 tp_value_array_unpack (rejection, 3,
216 G_TYPE_UINT, &rejection_reason,
217 G_TYPE_STRING, &rejection_error,
218 TP_HASH_TYPE_STRING_VARIANT_MAP, &rejection_details,
219 NULL);
220 g_free (rejection_error);
221 g_hash_table_unref (rejection_details);
223 if (rejection_reason == reason)
224 return;
227 g_assert ("Certificate was not rejected for right reason" && 0);
229 #endif
231 static MockTLSCertificate *
232 mock_tls_certificate_new_and_register (TpDBusDaemon *dbus,
233 const gchar *path,
234 ...)
236 MockTLSCertificate *cert;
237 GError *error = NULL;
238 gchar *filename, *contents;
239 GArray *der;
240 gsize length;
241 va_list va;
243 cert = g_object_new (mock_tls_certificate_get_type (), NULL);
245 va_start (va, path);
246 while (path != NULL) {
247 filename = g_build_filename (g_getenv ("EMPATHY_SRCDIR"),
248 "tests", "certificates", path, NULL);
249 g_file_get_contents (filename, &contents, &length, &error);
250 g_assert_no_error (error);
252 der = g_array_sized_new (TRUE, TRUE, sizeof (guchar), length);
253 g_array_append_vals (der, contents, length);
254 g_ptr_array_add (cert->cert_data, der);
256 g_free (contents);
257 g_free (filename);
259 path = va_arg (va, gchar*);
261 va_end (va);
263 tp_dbus_daemon_register_object (dbus, MOCK_TLS_CERTIFICATE_PATH, cert);
264 return cert;
267 /* ----------------------------------------------------------------------------
268 * TESTS
271 typedef struct {
272 GMainLoop *loop;
273 TpDBusDaemon *dbus;
274 const gchar *dbus_name;
275 MockTLSCertificate *mock;
276 TpTLSCertificate *cert;
277 GAsyncResult *result;
278 } Test;
280 static void
281 setup (Test *test, gconstpointer data)
283 GError *error = NULL;
284 GckModule *module;
285 const gchar *trust_uris[2] = { MOCK_SLOT_ONE_URI, NULL };
287 test->loop = g_main_loop_new (NULL, FALSE);
289 test->dbus = tp_dbus_daemon_dup (&error);
290 g_assert_no_error (error);
292 test->dbus_name = tp_dbus_daemon_get_unique_name (test->dbus);
294 test->result = NULL;
295 test->cert = NULL;
297 /* Add our mock module as the only PKCS#11 module */
298 module = gck_module_new (&mock_default_functions);
299 mock_C_Initialize (NULL);
301 gcr_pkcs11_set_modules (NULL);
302 gcr_pkcs11_add_module (module);
303 gcr_pkcs11_set_trust_lookup_uris (trust_uris);
306 static void
307 teardown (Test *test, gconstpointer data)
309 mock_C_Finalize (NULL);
311 test->dbus_name = NULL;
313 if (test->mock)
315 tp_dbus_daemon_unregister_object (test->dbus, test->mock);
316 g_object_unref (test->mock);
317 test->mock = NULL;
320 if (test->result)
321 g_object_unref (test->result);
322 test->result = NULL;
324 if (test->cert)
325 g_object_unref (test->cert);
326 test->cert = NULL;
328 g_main_loop_unref (test->loop);
329 test->loop = NULL;
331 g_object_unref (test->dbus);
332 test->dbus = NULL;
335 static void
336 add_certificate_to_mock (Test *test,
337 const gchar *certificate,
338 const gchar *peer)
340 GError *error = NULL;
341 GcrCertificate *cert;
342 gchar *contents;
343 gsize length;
344 gchar *path;
346 path = g_build_filename (g_getenv ("EMPATHY_SRCDIR"),
347 "tests", "certificates", certificate, NULL);
349 g_file_get_contents (path, &contents, &length, &error);
350 g_assert_no_error (error);
352 cert = gcr_simple_certificate_new ((const guchar *)contents, length);
353 mock_module_add_certificate (cert);
354 mock_module_add_assertion (cert,
355 peer ? CKT_X_PINNED_CERTIFICATE : CKT_X_ANCHORED_CERTIFICATE,
356 GCR_PURPOSE_SERVER_AUTH, peer);
357 g_object_unref (cert);
359 g_free (contents);
360 g_free (path);
363 static void
364 fetch_callback_result (GObject *object,
365 GAsyncResult *res,
366 gpointer user_data)
368 Test *test = user_data;
369 g_assert (!test->result);
370 test->result = g_object_ref (res);
371 g_main_loop_quit (test->loop);
374 static void
375 ensure_certificate_proxy (Test *test)
377 GError *error = NULL;
378 GQuark features[] = { TP_TLS_CERTIFICATE_FEATURE_CORE, 0 };
380 if (test->cert)
381 return;
383 /* Create and prepare a certificate */
384 /* We don't use tp_tls_certificate_new() as we don't pass a parent */
385 test->cert = g_object_new (TP_TYPE_TLS_CERTIFICATE,
386 "dbus-daemon", test->dbus,
387 "bus-name", test->dbus_name,
388 "object-path", MOCK_TLS_CERTIFICATE_PATH,
389 NULL);
391 tp_proxy_prepare_async (test->cert, features, fetch_callback_result, test);
392 g_main_loop_run (test->loop);
393 tp_proxy_prepare_finish (test->cert, test->result, &error);
394 g_assert_no_error (error);
396 /* Clear for any future async stuff */
397 g_object_unref (test->result);
398 test->result = NULL;
401 /* A simple test to make sure the test infrastructure is working */
402 static void
403 test_certificate_mock_basics (Test *test,
404 gconstpointer data G_GNUC_UNUSED)
406 GError *error = NULL;
408 test->mock = mock_tls_certificate_new_and_register (test->dbus,
409 "server-cert.cer", NULL);
411 ensure_certificate_proxy (test);
413 tp_tls_certificate_accept_async (test->cert, fetch_callback_result, test);
414 g_main_loop_run (test->loop);
415 tp_tls_certificate_accept_finish (test->cert, test->result, &error);
416 g_assert_no_error (error);
418 g_assert (test->mock->state == TP_TLS_CERTIFICATE_STATE_ACCEPTED);
421 static void
422 test_certificate_verify_success_with_pkcs11_lookup (Test *test,
423 gconstpointer data G_GNUC_UNUSED)
425 TpTLSCertificateRejectReason reason = 0;
426 GError *error = NULL;
427 EmpathyTLSVerifier *verifier;
428 const gchar *reference_identities[] = {
429 "test-server.empathy.gnome.org",
430 NULL
434 * In this test the mock TLS connection only has one certificate
435 * not a full certificat echain. The root anchor certificate is
436 * retrieved from PKCS#11 storage.
439 test->mock = mock_tls_certificate_new_and_register (test->dbus,
440 "server-cert.cer", NULL);
442 /* We add the collabora directory with the collabora root */
443 add_certificate_to_mock (test, "certificate-authority.cer", NULL);
445 ensure_certificate_proxy (test);
447 verifier = empathy_tls_verifier_new (test->cert, "test-server.empathy.gnome.org",
448 reference_identities);
449 empathy_tls_verifier_verify_async (verifier, fetch_callback_result, test);
450 g_main_loop_run (test->loop);
452 empathy_tls_verifier_verify_finish (verifier, test->result, &reason,
453 NULL, &error);
454 g_assert_no_error (error);
456 /* Yay the verification was a success! */
458 g_clear_error (&error);
459 g_object_unref (verifier);
462 static void
463 test_certificate_verify_success_with_full_chain (Test *test,
464 gconstpointer data G_GNUC_UNUSED)
466 TpTLSCertificateRejectReason reason = 0;
467 GError *error = NULL;
468 EmpathyTLSVerifier *verifier;
469 const gchar *reference_identities[] = {
470 "test-server.empathy.gnome.org",
471 NULL
475 * In this test the mock TLS connection has a full certificate
476 * chain. We look for an anchor certificate in the chain.
479 test->mock = mock_tls_certificate_new_and_register (test->dbus,
480 "server-cert.cer", "certificate-authority.cer", NULL);
482 /* We add the collabora directory with the collabora root */
483 add_certificate_to_mock (test, "certificate-authority.cer", NULL);
485 ensure_certificate_proxy (test);
487 verifier = empathy_tls_verifier_new (test->cert, "test-server.empathy.gnome.org",
488 reference_identities);
489 empathy_tls_verifier_verify_async (verifier, fetch_callback_result, test);
490 g_main_loop_run (test->loop);
491 empathy_tls_verifier_verify_finish (verifier, test->result, &reason,
492 NULL, &error);
493 g_assert_no_error (error);
495 /* Yay the verification was a success! */
497 g_clear_error (&error);
498 g_object_unref (verifier);
501 static void
502 test_certificate_verify_root_not_found (Test *test,
503 gconstpointer data G_GNUC_UNUSED)
505 TpTLSCertificateRejectReason reason = 0;
506 GError *error = NULL;
507 EmpathyTLSVerifier *verifier;
508 const gchar *reference_identities[] = {
509 "test-server.empathy.gnome.org",
510 NULL
513 test->mock = mock_tls_certificate_new_and_register (test->dbus,
514 "server-cert.cer", NULL);
516 /* Note that we're not adding any place to find root certs */
518 ensure_certificate_proxy (test);
520 verifier = empathy_tls_verifier_new (test->cert, "test-server.empathy.gnome.org",
521 reference_identities);
522 empathy_tls_verifier_verify_async (verifier, fetch_callback_result, test);
523 g_main_loop_run (test->loop);
525 empathy_tls_verifier_verify_finish (verifier, test->result, &reason,
526 NULL, &error);
528 /* And it should say we're self-signed (oddly enough) */
529 g_assert_error (error, G_IO_ERROR,
530 TP_TLS_CERTIFICATE_REJECT_REASON_SELF_SIGNED);
532 g_clear_error (&error);
533 g_object_unref (verifier);
536 static void
537 test_certificate_verify_root_not_anchored (Test *test,
538 gconstpointer data G_GNUC_UNUSED)
540 TpTLSCertificateRejectReason reason = 0;
541 GError *error = NULL;
542 EmpathyTLSVerifier *verifier;
543 const gchar *reference_identities[] = {
544 "test-server.empathy.gnome.org",
545 NULL
548 test->mock = mock_tls_certificate_new_and_register (test->dbus,
549 "server-cert.cer", "certificate-authority.cer", NULL);
551 /* Note that we're not adding any place to find root certs */
553 ensure_certificate_proxy (test);
555 verifier = empathy_tls_verifier_new (test->cert, "test-server.empathy.gnome.org",
556 reference_identities);
557 empathy_tls_verifier_verify_async (verifier, fetch_callback_result, test);
558 g_main_loop_run (test->loop);
560 empathy_tls_verifier_verify_finish (verifier, test->result, &reason,
561 NULL, &error);
563 /* And it should say we're self-signed (oddly enough) */
564 g_assert_error (error, G_IO_ERROR,
565 TP_TLS_CERTIFICATE_REJECT_REASON_SELF_SIGNED);
567 g_clear_error (&error);
568 g_object_unref (verifier);
571 static void
572 test_certificate_verify_identities_invalid (Test *test,
573 gconstpointer data G_GNUC_UNUSED)
575 TpTLSCertificateRejectReason reason = 0;
576 GError *error = NULL;
577 EmpathyTLSVerifier *verifier;
578 const gchar *reference_identities[] = {
579 "invalid.host.name",
580 NULL
583 test->mock = mock_tls_certificate_new_and_register (test->dbus,
584 "server-cert.cer", "certificate-authority.cer", NULL);
586 /* We add the collabora directory with the collabora root */
587 add_certificate_to_mock (test, "certificate-authority.cer", NULL);
589 ensure_certificate_proxy (test);
591 verifier = empathy_tls_verifier_new (test->cert, "invalid.host.name",
592 reference_identities);
593 empathy_tls_verifier_verify_async (verifier, fetch_callback_result, test);
594 g_main_loop_run (test->loop);
596 empathy_tls_verifier_verify_finish (verifier, test->result, &reason,
597 NULL, &error);
599 /* And it should say we're self-signed (oddly enough) */
600 g_assert_error (error, G_IO_ERROR,
601 TP_TLS_CERTIFICATE_REJECT_REASON_HOSTNAME_MISMATCH);
603 g_clear_error (&error);
604 g_object_unref (verifier);
607 static void
608 test_certificate_verify_uses_reference_identities (Test *test,
609 gconstpointer data G_GNUC_UNUSED)
611 TpTLSCertificateRejectReason reason = 0;
612 GError *error = NULL;
613 EmpathyTLSVerifier *verifier;
614 const gchar *reference_identities[] = {
615 "invalid.host.name",
616 NULL
619 test->mock = mock_tls_certificate_new_and_register (test->dbus,
620 "server-cert.cer", "certificate-authority.cer", NULL);
622 /* We add the collabora directory with the collabora root */
623 add_certificate_to_mock (test, "certificate-authority.cer", NULL);
625 ensure_certificate_proxy (test);
627 /* Should be using the reference_identities and not host name for checks */
628 verifier = empathy_tls_verifier_new (test->cert, "test-server.empathy.gnome.org",
629 reference_identities);
630 empathy_tls_verifier_verify_async (verifier, fetch_callback_result, test);
631 g_main_loop_run (test->loop);
633 empathy_tls_verifier_verify_finish (verifier, test->result, &reason,
634 NULL, &error);
636 /* And it should say we're self-signed (oddly enough) */
637 g_assert_error (error, G_IO_ERROR,
638 TP_TLS_CERTIFICATE_REJECT_REASON_HOSTNAME_MISMATCH);
640 g_clear_error (&error);
641 g_object_unref (verifier);
644 static void
645 test_certificate_verify_success_with_pinned (Test *test,
646 gconstpointer data G_GNUC_UNUSED)
648 TpTLSCertificateRejectReason reason = 0;
649 GError *error = NULL;
650 EmpathyTLSVerifier *verifier;
651 const gchar *reference_identities[] = {
652 "test-server.empathy.gnome.org",
653 NULL
657 * In this test the mock TLS connection has a full certificate
658 * chain. We look for an anchor certificate in the chain.
661 test->mock = mock_tls_certificate_new_and_register (test->dbus,
662 "server-cert.cer", NULL);
664 /* We add the collabora directory with the collabora root */
665 add_certificate_to_mock (test, "server-cert.cer", "test-server.empathy.gnome.org");
667 ensure_certificate_proxy (test);
669 verifier = empathy_tls_verifier_new (test->cert, "test-server.empathy.gnome.org",
670 reference_identities);
671 empathy_tls_verifier_verify_async (verifier, fetch_callback_result, test);
672 g_main_loop_run (test->loop);
673 empathy_tls_verifier_verify_finish (verifier, test->result, &reason,
674 NULL, &error);
675 g_assert_no_error (error);
677 /* Yay the verification was a success! */
679 g_clear_error (&error);
680 g_object_unref (verifier);
683 static void
684 test_certificate_verify_pinned_wrong_host (Test *test,
685 gconstpointer data G_GNUC_UNUSED)
687 TpTLSCertificateRejectReason reason = 0;
688 GError *error = NULL;
689 EmpathyTLSVerifier *verifier;
690 const gchar *reference_identities[] = {
691 "test-server.empathy.gnome.org",
692 NULL
695 test->mock = mock_tls_certificate_new_and_register (test->dbus,
696 "server-cert.cer", NULL);
698 /* Note that we're not adding any place to find root certs */
700 ensure_certificate_proxy (test);
702 verifier = empathy_tls_verifier_new (test->cert, "another.gnome.org",
703 reference_identities);
704 empathy_tls_verifier_verify_async (verifier, fetch_callback_result, test);
705 g_main_loop_run (test->loop);
707 empathy_tls_verifier_verify_finish (verifier, test->result, &reason,
708 NULL, &error);
710 /* And it should say we're self-signed */
711 g_assert_error (error, G_IO_ERROR,
712 TP_TLS_CERTIFICATE_REJECT_REASON_SELF_SIGNED);
714 g_clear_error (&error);
715 g_object_unref (verifier);
719 main (int argc,
720 char **argv)
722 int result;
724 test_init (argc, argv);
725 gnutls_global_init ();
727 g_test_add ("/tls/certificate_basics", Test, NULL,
728 setup, test_certificate_mock_basics, teardown);
729 g_test_add ("/tls/certificate_verify_success_with_pkcs11_lookup", Test, NULL,
730 setup, test_certificate_verify_success_with_pkcs11_lookup, teardown);
731 g_test_add ("/tls/certificate_verify_success_with_full_chain", Test, NULL,
732 setup, test_certificate_verify_success_with_full_chain, teardown);
733 g_test_add ("/tls/certificate_verify_root_not_found", Test, NULL,
734 setup, test_certificate_verify_root_not_found, teardown);
735 g_test_add ("/tls/certificate_verify_root_not_anchored", Test, NULL,
736 setup, test_certificate_verify_root_not_anchored, teardown);
737 g_test_add ("/tls/certificate_verify_identities_invalid", Test, NULL,
738 setup, test_certificate_verify_identities_invalid, teardown);
739 g_test_add ("/tls/certificate_verify_uses_reference_identities", Test, NULL,
740 setup, test_certificate_verify_uses_reference_identities, teardown);
741 g_test_add ("/tls/certificate_verify_success_with_pinned", Test, NULL,
742 setup, test_certificate_verify_success_with_pinned, teardown);
743 g_test_add ("/tls/certificate_verify_pinned_wrong_host", Test, NULL,
744 setup, test_certificate_verify_pinned_wrong_host, teardown);
746 result = g_test_run ();
747 test_deinit ();
748 return result;