From 5a1614cecdd57cab8b4ae3e9bc19dfff5ba77e80 Mon Sep 17 00:00:00 2001 From: Alessandro Ghedini Date: Sun, 8 Mar 2015 20:11:06 +0100 Subject: [PATCH] gtls: add support for CURLOPT_CAPATH --- acinclude.m4 | 4 ++-- docs/libcurl/opts/CURLOPT_CAPATH.3 | 5 ++--- lib/vtls/gtls.c | 22 ++++++++++++++++++++++ lib/vtls/gtls.h | 3 +++ 4 files changed, 29 insertions(+), 5 deletions(-) --- a/acinclude.m4 +++ b/acinclude.m4 @@ -2614,8 +2614,8 @@ AC_HELP_STRING([--without-ca-path], [Don capath="no" elif test "x$want_capath" != "xno" -a "x$want_capath" != "xunset"; then dnl --with-ca-path given - if test "x$OPENSSL_ENABLED" != "x1" -a "x$POLARSSL_ENABLED" != "x1"; then - AC_MSG_ERROR([--with-ca-path only works with openSSL or PolarSSL]) + if test "x$OPENSSL_ENABLED" != "x1" -a "x$GNUTLS_ENABLED" != "x1" -a "x$POLARSSL_ENABLED" != "x1"; then + AC_MSG_ERROR([--with-ca-path only works with OpenSSL, GnuTLS or PolarSSL]) fi capath="$want_capath" ca="no" --- a/docs/libcurl/opts/CURLOPT_CAPATH.3 +++ b/docs/libcurl/opts/CURLOPT_CAPATH.3 @@ -43,9 +43,8 @@ All TLS based protocols: HTTPS, FTPS, IM .SH EXAMPLE TODO .SH AVAILABILITY -This option is OpenSSL-specific and does nothing if libcurl is built to use -GnuTLS. NSS-powered libcurl provides the option only for backward -compatibility. +This option is supported by the OpenSSL, GnuTLS and PolarSSL backends. The NSS +backend provides the option only for backward compatibility. .SH RETURN VALUE Returns CURLE_OK if TLS enabled, and CURLE_UNKNOWN_OPTION if not, or CURLE_OUT_OF_MEMORY if there was insufficient heap space. --- a/lib/vtls/gtls.c +++ b/lib/vtls/gtls.c @@ -98,6 +98,10 @@ static bool gtls_inited = FALSE; # define HAS_ALPN # endif # endif + +# if (GNUTLS_VERSION_NUMBER >= 0x030306) +# define HAS_CAPATH +# endif #endif /* @@ -463,6 +467,24 @@ gtls_connect_step1(struct connectdata *c rc, data->set.ssl.CAfile); } +#ifdef HAS_CAPATH + if(data->set.ssl.CApath) { + /* set the trusted CA cert directory */ + rc = gnutls_certificate_set_x509_trust_dir(conn->ssl[sockindex].cred, + data->set.ssl.CApath, + GNUTLS_X509_FMT_PEM); + if(rc < 0) { + infof(data, "error reading ca cert file %s (%s)\n", + data->set.ssl.CAfile, gnutls_strerror(rc)); + if(data->set.ssl.verifypeer) + return CURLE_SSL_CACERT_BADFILE; + } + else + infof(data, "found %d certificates in %s\n", + rc, data->set.ssl.CApath); + } +#endif + if(data->set.ssl.CRLfile) { /* set the CRL list file */ rc = gnutls_certificate_set_x509_crl_file(conn->ssl[sockindex].cred, --- a/lib/vtls/gtls.h +++ b/lib/vtls/gtls.h @@ -53,6 +53,9 @@ void Curl_gtls_md5sum(unsigned char *tmp unsigned char *md5sum, /* output */ size_t md5len); +/* this backend supports the CAPATH option */ +#define have_curlssl_ca_path 1 + /* API setup for GnuTLS */ #define curlssl_init Curl_gtls_init #define curlssl_cleanup Curl_gtls_cleanup