--- a/libpurple/certificate.c Mon Oct 08 18:02:10 2012 -0400
+++ b/libpurple/certificate.c Mon Oct 08 19:02:54 2012 -0400
@@ -686,6 +686,7 @@
+/* TODO: Broken since we added the crt serial number to unqiue_id */ is_valid_crt_chain(GList *crts)
@@ -738,7 +739,7 @@
g_return_val_if_fail(NULL != pool, FALSE);
g_return_val_if_fail(NULL != id, FALSE);
g_return_val_if_fail(NULL != crts, FALSE);
- g_return_val_if_fail(is_valid_crt_chain(crts), FALSE);
+// g_return_val_if_fail(is_valid_crt_chain(crts), FALSE); item = g_list_first(crts);
crt = (PurpleCertificate*)item->data;
--- a/libpurple/plugins/ssl/ssl-gnutls.c Mon Oct 08 18:02:10 2012 -0400
+++ b/libpurple/plugins/ssl/ssl-gnutls.c Mon Oct 08 19:02:54 2012 -0400
@@ -93,9 +93,9 @@
- retval = g_new (gchar, len + 1);
- for (i = 0; i < len; i++)
+ retval = g_new0 (gchar, len + 1); + for (i = 0; i < buf_len; i++) @@ -1119,12 +1119,28 @@
gnutls_x509_crt cert_dat;
+ uint8_t *serial = NULL; g_return_val_if_fail(crt, NULL);
g_return_val_if_fail(crt->scheme == &x509_gnutls, NULL);
cert_dat = X509_GET_GNUTLS_DATA(crt);
+ gnutls_x509_crt_get_serial(cert_dat, serial, &serial_size); + serial = g_new0(uint8_t, serial_size); + if (0 != gnutls_x509_crt_get_serial(cert_dat, serial, &serial_size)) { + purple_debug_error("gnutls/x509", + "Failed to get cert serial\n"); /* Figure out the length of the Distinguished Name */
/* Claim that the buffer is size 0 so GnuTLS just tells us how much
@@ -1142,8 +1158,15 @@
+ /* XXX Hack to get a real unique id. The DN does not unique id a cert! */ + hserial = hex_encode(serial, serial_size); + id = g_strdup_printf("%s_%s", dn, hserial); @@ -1527,7 +1550,7 @@
/* TODO: Again we seem to randomly get a "just not quite big enough" size above. */
out_buf = g_new0(gchar, out_size);
ret = gnutls_x509_privkey_export_pkcs8(key_dat, GNUTLS_X509_FMT_PEM,