# HG changeset patch # User Elliott Sales de Andrade # Date 1324605909 0 # Node ID fb0c5aa0fe559edce694cb18104943d8ed687b5d # Parent 105202d802db93d58eac0f4f3fb579dce038d949 Add GnuTLS support for exporting DER data. diff -r 105202d802db -r fb0c5aa0fe55 libpurple/plugins/ssl/ssl-gnutls.c --- a/libpurple/plugins/ssl/ssl-gnutls.c Fri Dec 23 01:52:16 2011 +0000 +++ b/libpurple/plugins/ssl/ssl-gnutls.c Fri Dec 23 02:05:09 2011 +0000 @@ -1142,6 +1142,37 @@ return success; } +static GByteArray * +x509_get_der_data(PurpleCertificate *crt) +{ + gnutls_x509_crt crt_dat; + GByteArray *data; + size_t len; + int ret; + + crt_dat = X509_GET_GNUTLS_DATA(crt); + g_return_val_if_fail(crt_dat, NULL); + + /* Obtain the output size required */ + len = 0; + ret = gnutls_x509_crt_export(crt_dat, GNUTLS_X509_FMT_DER, NULL, &len); + g_return_val_if_fail(ret == GNUTLS_E_SHORT_MEMORY_BUFFER, NULL); + + /* Now allocate a buffer and *really* export it */ + data = g_byte_array_sized_new(len); + data->len = len; + ret = gnutls_x509_crt_export(crt_dat, GNUTLS_X509_FMT_DER, data->data, &len); + if (ret != 0) { + purple_debug_error("gnutls/x509", + "Failed to export cert to buffer with code %d\n", + ret); + g_byte_array_free(data, TRUE); + return NULL; + } + + return data; +} + /* X.509 certificate operations provided by this plugin */ static PurpleCertificateScheme x509_gnutls = { "x509", /* Scheme name */ @@ -1158,9 +1189,9 @@ x509_check_name, /* Check subject name */ x509_times, /* Activation/Expiration time */ x509_importcerts_from_file, /* Multiple certificates import function */ + x509_get_der_data, /* Binary DER data */ NULL, - NULL, NULL };