summaryrefslogtreecommitdiff
path: root/lib/x509/x509.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/x509/x509.c')
-rw-r--r--lib/x509/x509.c30
1 files changed, 26 insertions, 4 deletions
diff --git a/lib/x509/x509.c b/lib/x509/x509.c
index 190a839baf..162a49be4e 100644
--- a/lib/x509/x509.c
+++ b/lib/x509/x509.c
@@ -2903,13 +2903,26 @@ gnutls_x509_crt_export(gnutls_x509_crt_t cert,
gnutls_x509_crt_fmt_t format, void *output_data,
size_t * output_data_size)
{
- if (cert == NULL) {
+ gnutls_datum_t out;
+ int ret;
+
+ ret = gnutls_x509_crt_export2(cert, format, &out);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
+ if (format == GNUTLS_X509_FMT_PEM)
+ ret = _gnutls_copy_string(&out, (uint8_t*)output_data, output_data_size);
+ else
+ ret = _gnutls_copy_data(&out, (uint8_t*)output_data, output_data_size);
+ if (ret < 0) {
gnutls_assert();
- return GNUTLS_E_INVALID_REQUEST;
+ goto cleanup;
}
- return _gnutls_x509_export_int(cert->cert, format, PEM_X509_CERT2,
- output_data, output_data_size);
+ ret = 0;
+ cleanup:
+ gnutls_free(out.data);
+ return ret;
}
/**
@@ -2938,6 +2951,15 @@ gnutls_x509_crt_export2(gnutls_x509_crt_t cert,
return GNUTLS_E_INVALID_REQUEST;
}
+ if (!cert->modified && cert->der.size) {
+ if (format == GNUTLS_X509_FMT_DER)
+ return _gnutls_set_datum(out, cert->der.data, cert->der.size);
+ else
+ return _gnutls_fbase64_encode(PEM_X509_CERT2, cert->der.data,
+ cert->der.size, out);
+
+ }
+
return _gnutls_x509_export_int2(cert->cert, format, PEM_X509_CERT2,
out);
}