void Gobby::CertificateManager::set_certificates(gnutls_x509_crt_t* certs, guint n_certs, const char* filename, const GError* error) { if(error != NULL) { g_assert(n_certs == 0); set_certificates(NULL, 0, error); } else { GError* local_error = NULL; if(filename != NULL) { m_conn_certificate_file.block(); m_preferences.security.certificate_file = filename; m_conn_certificate_file.unblock(); if(n_certs > 0) { inf_cert_util_write_certificate( certs, n_certs, filename, &local_error); } } if(local_error != NULL) { set_certificates(NULL, 0, local_error); for(guint i = 0; i < n_certs; ++i) gnutls_x509_crt_deinit(certs[i]); g_error_free(local_error); } else { set_certificates(certs, n_certs, NULL); } } }
static gnutls_x509_crt_t* infinoted_startup_load_certificate(InfinotedLog* log, gboolean create_self_signed_certificate, gnutls_x509_privkey_t key, const gchar* certificate_file, const gchar* certificate_chain_file, guint* n_certificates, GError** error) { InfCertUtilDescription desc; gnutls_x509_crt_t* result; gnutls_x509_crt_t cert; GPtrArray* certs; GPtrArray* chain_certs; gboolean res; if(create_self_signed_certificate == TRUE) { if(infinoted_util_create_dirname(certificate_file, error) == FALSE) return NULL; infinoted_log_info(log, _("Generating self-signed certificate...")); desc.validity = 365 * 24 * 3600; desc.dn_common_name = g_get_host_name(); desc.san_dnsname = g_get_host_name(); cert = inf_cert_util_create_self_signed_certificate(key, &desc, error); if(cert == NULL) return NULL; res = inf_cert_util_write_certificate(&cert, 1, certificate_file, error); if(res == FALSE) { gnutls_x509_crt_deinit(cert); return NULL; } else { result = g_malloc(sizeof(gnutls_x509_crt_t)); *result = cert; *n_certificates = 1; } } else { certs = inf_cert_util_read_certificate(certificate_file, NULL, error); if(certs == NULL) return NULL; if(certificate_chain_file != NULL) { chain_certs = inf_cert_util_read_certificate(certificate_chain_file, certs, error); if(chain_certs == NULL) { result = (gnutls_x509_crt_t*)g_ptr_array_free(certs, FALSE); infinoted_startup_free_certificate_array(result, *n_certificates); return NULL; } } *n_certificates = certs->len; result = (gnutls_x509_crt_t*)g_ptr_array_free(certs, FALSE); } return result; }