static GtkWidget *cert_presenter(SSLCertificate *cert) { GtkWidget *vbox = NULL; GtkWidget *hbox = NULL; GtkWidget *frame_owner = NULL; GtkWidget *frame_signer = NULL; GtkWidget *frame_status = NULL; GtkTable *owner_table = NULL; GtkTable *signer_table = NULL; GtkTable *status_table = NULL; GtkWidget *label = NULL; char *issuer_commonname, *issuer_location, *issuer_organization; char *subject_commonname, *subject_location, *subject_organization; char *sig_status, *exp_date; char *md5_fingerprint, *sha1_fingerprint, *fingerprint; size_t n; char buf[100]; unsigned char md[128]; char *tmp; time_t exp_time_t; struct tm lt; /* issuer */ issuer_commonname = g_malloc(BUFFSIZE); issuer_location = g_malloc(BUFFSIZE); issuer_organization = g_malloc(BUFFSIZE); subject_commonname = g_malloc(BUFFSIZE); subject_location = g_malloc(BUFFSIZE); subject_organization = g_malloc(BUFFSIZE); n = BUFFSIZE; if (gnutls_x509_crt_get_issuer_dn_by_oid(cert->x509_cert, GNUTLS_OID_X520_COMMON_NAME, 0, 0, issuer_commonname, &n)) strncpy(issuer_commonname, _("<not in certificate>"), BUFFSIZE); n = BUFFSIZE; if (gnutls_x509_crt_get_issuer_dn_by_oid(cert->x509_cert, GNUTLS_OID_X520_LOCALITY_NAME, 0, 0, issuer_location, &n)) { if (gnutls_x509_crt_get_issuer_dn_by_oid(cert->x509_cert, GNUTLS_OID_X520_COUNTRY_NAME, 0, 0, issuer_location, &n)) { strncpy(issuer_location, _("<not in certificate>"), BUFFSIZE); } } else { tmp = g_malloc(BUFFSIZE); if (gnutls_x509_crt_get_issuer_dn_by_oid(cert->x509_cert, GNUTLS_OID_X520_COUNTRY_NAME, 0, 0, tmp, &n) == 0) { strncat(issuer_location, ", ", BUFFSIZE-strlen(issuer_location)-1); strncat(issuer_location, tmp, BUFFSIZE-strlen(issuer_location)-1); } g_free(tmp); } n = BUFFSIZE; if (gnutls_x509_crt_get_issuer_dn_by_oid(cert->x509_cert, GNUTLS_OID_X520_ORGANIZATION_NAME, 0, 0, issuer_organization, &n)) strncpy(issuer_organization, _("<not in certificate>"), BUFFSIZE); n = BUFFSIZE; if (gnutls_x509_crt_get_dn_by_oid(cert->x509_cert, GNUTLS_OID_X520_COMMON_NAME, 0, 0, subject_commonname, &n)) strncpy(subject_commonname, _("<not in certificate>"), BUFFSIZE); n = BUFFSIZE; if (gnutls_x509_crt_get_dn_by_oid(cert->x509_cert, GNUTLS_OID_X520_LOCALITY_NAME, 0, 0, subject_location, &n)) { if (gnutls_x509_crt_get_dn_by_oid(cert->x509_cert, GNUTLS_OID_X520_COUNTRY_NAME, 0, 0, subject_location, &n)) { strncpy(subject_location, _("<not in certificate>"), BUFFSIZE); } } else { tmp = g_malloc(BUFFSIZE); if (gnutls_x509_crt_get_dn_by_oid(cert->x509_cert, GNUTLS_OID_X520_COUNTRY_NAME, 0, 0, tmp, &n) == 0) { strncat(subject_location, ", ", BUFFSIZE-strlen(subject_location)-1); strncat(subject_location, tmp, BUFFSIZE-strlen(subject_location)-1); } g_free(tmp); } n = BUFFSIZE; if (gnutls_x509_crt_get_dn_by_oid(cert->x509_cert, GNUTLS_OID_X520_ORGANIZATION_NAME, 0, 0, subject_organization, &n)) strncpy(subject_organization, _("<not in certificate>"), BUFFSIZE); exp_time_t = gnutls_x509_crt_get_expiration_time(cert->x509_cert); memset(buf, 0, sizeof(buf)); if (exp_time_t > 0) { fast_strftime(buf, sizeof(buf)-1, prefs_common.date_format, localtime_r(&exp_time_t, <)); exp_date = (*buf) ? g_strdup(buf):g_strdup("?"); } else exp_date = g_strdup(""); /* fingerprint */ n = 128; gnutls_x509_crt_get_fingerprint(cert->x509_cert, GNUTLS_DIG_MD5, md, &n); md5_fingerprint = readable_fingerprint(md, (int)n); n = 128; gnutls_x509_crt_get_fingerprint(cert->x509_cert, GNUTLS_DIG_SHA1, md, &n); sha1_fingerprint = readable_fingerprint(md, (int)n); /* signature */ sig_status = ssl_certificate_check_signer(cert->x509_cert, cert->status); if (sig_status==NULL) sig_status = g_strdup(_("Correct")); vbox = gtk_vbox_new(FALSE, 5); hbox = gtk_hbox_new(FALSE, 5); frame_owner = gtk_frame_new(_("Owner")); frame_signer = gtk_frame_new(_("Signer")); frame_status = gtk_frame_new(_("Status")); owner_table = GTK_TABLE(gtk_table_new(3, 2, FALSE)); signer_table = GTK_TABLE(gtk_table_new(3, 2, FALSE)); status_table = GTK_TABLE(gtk_table_new(3, 2, FALSE)); label = gtk_label_new(_("Name: ")); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_table_attach(owner_table, label, 0, 1, 0, 1, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(subject_commonname); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach(owner_table, label, 1, 2, 0, 1, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(_("Organization: ")); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_table_attach(owner_table, label, 0, 1, 1, 2, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(subject_organization); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach(owner_table, label, 1, 2, 1, 2, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(_("Location: ")); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_table_attach(owner_table, label, 0, 1, 2, 3, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(subject_location); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach(owner_table, label, 1, 2, 2, 3, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(_("Name: ")); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_table_attach(signer_table, label, 0, 1, 0, 1, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(issuer_commonname); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach(signer_table, label, 1, 2, 0, 1, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(_("Organization: ")); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_table_attach(signer_table, label, 0, 1, 1, 2, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(issuer_organization); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach(signer_table, label, 1, 2, 1, 2, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(_("Location: ")); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_table_attach(signer_table, label, 0, 1, 2, 3, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(issuer_location); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach(signer_table, label, 1, 2, 2, 3, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(_("Fingerprint: \n")); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_table_attach(status_table, label, 0, 1, 0, 1, GTK_EXPAND|GTK_FILL, 0, 0, 0); fingerprint = g_strdup_printf("MD5: %s\nSHA1: %s", md5_fingerprint, sha1_fingerprint); label = gtk_label_new(fingerprint); g_free(fingerprint); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach(status_table, label, 1, 2, 0, 1, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(_("Signature status: ")); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_table_attach(status_table, label, 0, 1, 1, 2, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(sig_status); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach(status_table, label, 1, 2, 1, 2, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(_("Expires on: ")); gtk_misc_set_alignment (GTK_MISC (label), 1, 0.5); gtk_table_attach(status_table, label, 0, 1, 2, 3, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(exp_date); gtk_label_set_selectable(GTK_LABEL(label), TRUE); gtk_misc_set_alignment (GTK_MISC (label), 0, 0.5); gtk_table_attach(status_table, label, 1, 2, 2, 3, GTK_EXPAND|GTK_FILL, 0, 0, 0); gtk_container_add(GTK_CONTAINER(frame_owner), GTK_WIDGET(owner_table)); gtk_container_add(GTK_CONTAINER(frame_signer), GTK_WIDGET(signer_table)); gtk_container_add(GTK_CONTAINER(frame_status), GTK_WIDGET(status_table)); gtk_box_pack_end(GTK_BOX(hbox), frame_signer, TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(hbox), frame_owner, TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(vbox), frame_status, TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(vbox), hbox, TRUE, TRUE, 0); gtk_widget_show_all(vbox); g_free(issuer_commonname); g_free(issuer_location); g_free(issuer_organization); g_free(subject_commonname); g_free(subject_location); g_free(subject_organization); g_free(md5_fingerprint); g_free(sha1_fingerprint); g_free(sig_status); g_free(exp_date); return vbox; }
char *ssl_certificate_to_string(SSLCertificate *cert) { char *ret, buf[100]; char *issuer_commonname, *issuer_location, *issuer_organization; char *subject_commonname, *subject_location, *subject_organization; char *fingerprint, *sig_status; unsigned int n; unsigned char md[EVP_MAX_MD_SIZE]; /* issuer */ if (X509_NAME_get_text_by_NID(X509_get_issuer_name(cert->x509_cert), NID_commonName, buf, 100) >= 0) issuer_commonname = g_strdup(buf); else issuer_commonname = g_strdup(_("(Unspecified)")); if (X509_NAME_get_text_by_NID(X509_get_issuer_name(cert->x509_cert), NID_localityName, buf, 100) >= 0) { issuer_location = g_strdup(buf); if (X509_NAME_get_text_by_NID(X509_get_issuer_name(cert-> x509_cert), NID_countryName, buf, 100) >= 0) issuer_location = g_strconcat(issuer_location, ", ", buf, NULL); } else if (X509_NAME_get_text_by_NID(X509_get_issuer_name(cert-> x509_cert), NID_countryName, buf, 100) >= 0) issuer_location = g_strdup(buf); else issuer_location = g_strdup(_("(Unspecified)")); if (X509_NAME_get_text_by_NID(X509_get_issuer_name(cert->x509_cert), NID_organizationName, buf, 100) >= 0) issuer_organization = g_strdup(buf); else issuer_organization = g_strdup(_("(Unspecified)")); /* subject */ if (X509_NAME_get_text_by_NID(X509_get_subject_name(cert->x509_cert), NID_commonName, buf, 100) >= 0) subject_commonname = g_strdup(buf); else subject_commonname = g_strdup(_("(Unspecified)")); if (X509_NAME_get_text_by_NID(X509_get_subject_name(cert->x509_cert), NID_localityName, buf, 100) >= 0) { subject_location = g_strdup(buf); if (X509_NAME_get_text_by_NID(X509_get_subject_name(cert-> x509_cert), NID_countryName, buf, 100) >= 0) subject_location = g_strconcat(subject_location, ", ", buf, NULL); } else if (X509_NAME_get_text_by_NID(X509_get_subject_name(cert-> x509_cert), NID_countryName, buf, 100) >= 0) subject_location = g_strdup(buf); else subject_location = g_strdup(_("(Unspecified)")); if (X509_NAME_get_text_by_NID(X509_get_subject_name(cert->x509_cert), NID_organizationName, buf, 100) >= 0) subject_organization = g_strdup(buf); else subject_organization = g_strdup(_("(Unspecified)")); /* fingerprint */ X509_digest(cert->x509_cert, EVP_md5(), md, &n); fingerprint = readable_fingerprint(md, (int)n); /* signature */ sig_status = ssl_certificate_check_signer(cert->x509_cert); ret = g_strdup_printf(_(" <b>Certificate Owner:</b> %s (%s) in %s\n " "<b>Signed by:</b> %s (%s) in %s\n " "<b>Fingerprint:</b> %s\n " "<b>Signature status:</b> %s"), subject_commonname, subject_organization, subject_location, issuer_commonname, issuer_organization, issuer_location, fingerprint, (sig_status == NULL ? "correct" : sig_status)); if (issuer_commonname) g_free(issuer_commonname); if (issuer_location) g_free(issuer_location); if (issuer_organization) g_free(issuer_organization); if (subject_commonname) g_free(subject_commonname); if (subject_location) g_free(subject_location); if (subject_organization) g_free(subject_organization); if (fingerprint) g_free(fingerprint); if (sig_status) g_free(sig_status); return ret; }