summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorjoe <joe@61a7d7f5-40b7-0310-9c16-bb0ea8cb1845>2011-06-23 12:40:30 +0000
committerjoe <joe@61a7d7f5-40b7-0310-9c16-bb0ea8cb1845>2011-06-23 12:40:30 +0000
commitc34742e433401f293957f52a854c071797f51bf8 (patch)
tree2eca823266cd5029379dcbfa0fd8c0efba3a0181 /src
parent2dc778e736e76e20b17066e9ae8502a0e375bb94 (diff)
downloadneon-c34742e433401f293957f52a854c071797f51bf8.tar.gz
* src/ne_ssl.h (ne_ssl_clicert_import): New function.
* src/ne_openssl.c (parse_client_cert): Factor out from ne_ssl_clicert_read. (ne_ssl_clicert_read): Reimplement using above. (ne_ssl_clicert_import): New function. * src/ne_gnutls.c (ne_ssl_clicert_import): Factor out from ne_ssl_clicert_read. (ne_ssl_clicert_import): Reimplement using above. * test/utils.c (file_to_buffer): Move to here... * test/compress.c (file2buf): ... from here. (do_fetch): Use it. * test/ssl.c (clicert_import): New test. git-svn-id: http://svn.webdav.org/repos/projects/neon/trunk@1847 61a7d7f5-40b7-0310-9c16-bb0ea8cb1845
Diffstat (limited to 'src')
-rw-r--r--src/ne_gnutls.c20
-rw-r--r--src/ne_openssl.c40
-rw-r--r--src/ne_ssl.h7
-rw-r--r--src/neon.vers4
4 files changed, 57 insertions, 14 deletions
diff --git a/src/ne_gnutls.c b/src/ne_gnutls.c
index eec5655..6fae2fd 100644
--- a/src/ne_gnutls.c
+++ b/src/ne_gnutls.c
@@ -1119,6 +1119,21 @@ static int pkcs12_parse(gnutls_pkcs12 p12, gnutls_x509_privkey *pkey,
ne_ssl_client_cert *ne_ssl_clicert_read(const char *filename)
{
+ gnutls_datum datum;
+ ne_ssl_client_cert *cc;
+
+ if (read_to_datum(filename, &datum))
+ return NULL;
+
+ cc = ne_ssl_clicert_import(datum.data, datum.size);
+
+ ne_free(datum.data);
+
+ return cc;
+}
+
+ne_ssl_client_cert *ne_ssl_clicert_import(const unsigned char *buffer, size_t buflen)
+{
int ret;
gnutls_datum data;
gnutls_pkcs12 p12;
@@ -1127,15 +1142,14 @@ ne_ssl_client_cert *ne_ssl_clicert_read(const char *filename)
gnutls_x509_crt cert = NULL;
gnutls_x509_privkey pkey = NULL;
- if (read_to_datum(filename, &data))
- return NULL;
+ data.data = buffer;
+ data.size = buflen;
if (gnutls_pkcs12_init(&p12) != 0) {
return NULL;
}
ret = gnutls_pkcs12_import(p12, &data, GNUTLS_X509_FMT_DER, 0);
- ne_free(data.data);
if (ret < 0) {
gnutls_pkcs12_deinit(p12);
return NULL;
diff --git a/src/ne_openssl.c b/src/ne_openssl.c
index 2b20ca0..1abef3e 100644
--- a/src/ne_openssl.c
+++ b/src/ne_openssl.c
@@ -814,22 +814,12 @@ static char *find_friendly_name(PKCS12 *p12)
return name;
}
-ne_ssl_client_cert *ne_ssl_clicert_read(const char *filename)
+static ne_ssl_client_cert *parse_client_cert(PKCS12 *p12)
{
- PKCS12 *p12;
- FILE *fp;
X509 *cert;
EVP_PKEY *pkey;
ne_ssl_client_cert *cc;
- fp = fopen(filename, "rb");
- if (fp == NULL)
- return NULL;
-
- p12 = d2i_PKCS12_fp(fp, NULL);
-
- fclose(fp);
-
if (p12 == NULL) {
ERR_clear_error();
return NULL;
@@ -875,6 +865,34 @@ ne_ssl_client_cert *ne_ssl_clicert_read(const char *filename)
}
}
+ne_ssl_client_cert *ne_ssl_clicert_import(const unsigned char *buffer,
+ size_t buflen)
+{
+ ne_d2i_uchar *p;
+ PKCS12 *p12;
+
+ p = buffer;
+ p12 = d2i_PKCS12(NULL, &p, buflen);
+
+ return parse_client_cert(p12);
+}
+
+ne_ssl_client_cert *ne_ssl_clicert_read(const char *filename)
+{
+ PKCS12 *p12;
+ FILE *fp;
+
+ fp = fopen(filename, "rb");
+ if (fp == NULL)
+ return NULL;
+
+ p12 = d2i_PKCS12_fp(fp, NULL);
+
+ fclose(fp);
+
+ return parse_client_cert(p12);
+}
+
#ifdef HAVE_PAKCHOIS
ne_ssl_client_cert *ne__ssl_clicert_exkey_import(const unsigned char *der,
size_t der_len,
diff --git a/src/ne_ssl.h b/src/ne_ssl.h
index cf9bbf5..f29751f 100644
--- a/src/ne_ssl.h
+++ b/src/ne_ssl.h
@@ -127,6 +127,13 @@ typedef struct ne_ssl_client_cert_s ne_ssl_client_cert;
* in either the encrypted or decrypted state. */
ne_ssl_client_cert *ne_ssl_clicert_read(const char *filename);
+/* Read a client certificate and private key from 'buffer', of length
+ * 'buflen', returning NULL if the certificate could not be parsed, or
+ * otherwise returning a client certificate object. The returned
+ * object may be in either the encrypted or decrypted state. */
+ne_ssl_client_cert *ne_ssl_clicert_import(const unsigned char *buffer,
+ size_t buflen);
+
/* Returns non-zero if client cert is in the encrypted state. */
int ne_ssl_clicert_encrypted(const ne_ssl_client_cert *ccert);
diff --git a/src/neon.vers b/src/neon.vers
index 391cb24..96fe13f 100644
--- a/src/neon.vers
+++ b/src/neon.vers
@@ -13,3 +13,7 @@ NEON_0_29 {
ne_buffer_qappend;
ne_strnqdup;
};
+
+NEON_0_30 {
+ ne_ssl_clicert_import;
+};