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"
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 (), \
20 typedef struct _MockTLSCertificate
{
23 GPtrArray
*rejections
;
28 typedef struct _MockTLSCertificateClass
{
30 TpDBusPropertiesMixinClass dbus_props_class
;
31 } MockTLSCertificateClass
;
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
)
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
)
57 self
->rejections
= g_ptr_array_new ();
61 mock_tls_certificate_get_property (GObject
*object
,
66 MockTLSCertificate
*self
= MOCK_TLS_CERTIFICATE (object
);
71 g_value_set_uint (value
, self
->state
);
74 g_value_set_boxed (value
, self
->rejections
);
76 case PROP_CERTIFICATE_TYPE
:
77 g_value_set_string (value
, self
->cert_type
);
79 case PROP_CERTIFICATE_CHAIN_DATA
:
80 g_value_set_boxed (value
, self
->cert_data
);
83 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, property_id
, pspec
);
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
,
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
);
104 mock_tls_certificate_class_init (MockTLSCertificateClass
*klass
)
106 GObjectClass
*oclass
= G_OBJECT_CLASS (klass
);
109 static TpDBusPropertiesMixinPropImpl object_props
[] = {
110 { "State", "state", NULL
},
111 { "Rejections", "rejections", NULL
},
112 { "CertificateType", "certificate-type", NULL
},
113 { "CertificateChainData", "certificate-chain-data", NULL
},
117 static TpDBusPropertiesMixinIfaceImpl prop_interfaces
[] = {
118 { TP_IFACE_AUTHENTICATION_TLS_CERTIFICATE
,
119 tp_dbus_properties_mixin_getter_gobject_properties
,
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.",
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
));
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
);
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
);
185 mock_tls_certificate_iface_init (gpointer g_iface
,
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
);
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
;
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
,
220 g_free (rejection_error
);
221 g_hash_table_unref (rejection_details
);
223 if (rejection_reason
== reason
)
227 g_assert ("Certificate was not rejected for right reason" && 0);
231 static MockTLSCertificate
*
232 mock_tls_certificate_new_and_register (TpDBusDaemon
*dbus
,
236 MockTLSCertificate
*cert
;
237 GError
*error
= NULL
;
238 gchar
*filename
, *contents
;
243 cert
= g_object_new (mock_tls_certificate_get_type (), NULL
);
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
);
259 path
= va_arg (va
, gchar
*);
263 tp_dbus_daemon_register_object (dbus
, MOCK_TLS_CERTIFICATE_PATH
, cert
);
267 /* ----------------------------------------------------------------------------
274 const gchar
*dbus_name
;
275 MockTLSCertificate
*mock
;
276 TpTLSCertificate
*cert
;
277 GAsyncResult
*result
;
281 setup (Test
*test
, gconstpointer data
)
283 GError
*error
= NULL
;
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
);
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
);
307 teardown (Test
*test
, gconstpointer data
)
309 mock_C_Finalize (NULL
);
311 test
->dbus_name
= NULL
;
315 tp_dbus_daemon_unregister_object (test
->dbus
, test
->mock
);
316 g_object_unref (test
->mock
);
321 g_object_unref (test
->result
);
325 g_object_unref (test
->cert
);
328 g_main_loop_unref (test
->loop
);
331 g_object_unref (test
->dbus
);
336 add_certificate_to_mock (Test
*test
,
337 const gchar
*certificate
,
340 GError
*error
= NULL
;
341 GcrCertificate
*cert
;
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
);
364 fetch_callback_result (GObject
*object
,
368 Test
*test
= user_data
;
369 g_assert (!test
->result
);
370 test
->result
= g_object_ref (res
);
371 g_main_loop_quit (test
->loop
);
375 ensure_certificate_proxy (Test
*test
)
377 GError
*error
= NULL
;
378 GQuark features
[] = { TP_TLS_CERTIFICATE_FEATURE_CORE
, 0 };
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
,
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
);
401 /* A simple test to make sure the test infrastructure is working */
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
);
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",
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
,
454 g_assert_no_error (error
);
456 /* Yay the verification was a success! */
458 g_clear_error (&error
);
459 g_object_unref (verifier
);
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",
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
,
493 g_assert_no_error (error
);
495 /* Yay the verification was a success! */
497 g_clear_error (&error
);
498 g_object_unref (verifier
);
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",
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
,
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
);
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",
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
,
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
);
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
[] = {
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
,
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
);
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
[] = {
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
,
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
);
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",
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
,
675 g_assert_no_error (error
);
677 /* Yay the verification was a success! */
679 g_clear_error (&error
);
680 g_object_unref (verifier
);
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",
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
,
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
);
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 ();