From 3442caf607220db0910d0191b0a95c866bed9d10 Mon Sep 17 00:00:00 2001 From: Vincent Richard Date: Sun, 21 Jun 2009 21:32:25 +0000 Subject: [PATCH] gnutls_x509_crt_list_import does not support multiple DER certificates (Georg Sauthoff). --- src/net/tls/TLSSocket.cpp | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/net/tls/TLSSocket.cpp b/src/net/tls/TLSSocket.cpp index 73af1da7..4f64967d 100644 --- a/src/net/tls/TLSSocket.cpp +++ b/src/net/tls/TLSSocket.cpp @@ -292,27 +292,26 @@ ref TLSSocket::getPeerCertificates() const // Try X.509 gnutls_x509_crt* x509Certs = new gnutls_x509_crt[certCount]; - unsigned int count = certCount; - - int res = gnutls_x509_crt_list_import - (x509Certs, &count, rawData, GNUTLS_X509_FMT_PEM, 0); - - if (res <= 0) + for (unsigned int i = 0; i < certCount; ++i) { - count = certCount; + gnutls_x509_crt_init(x509Certs + i); - res = gnutls_x509_crt_list_import - (x509Certs, &count, rawData, GNUTLS_X509_FMT_DER, 0); + int res = gnutls_x509_crt_import(x509Certs[i], rawData + i, + GNUTLS_X509_FMT_DER); + + if (res < 0) + { + // XXX more fine-grained error reporting? + delete [] x509Certs; + return NULL; + } } - if (res >= 1) { std::vector > certs; bool error = false; - count = static_cast (res); - - for (unsigned int i = 0 ; i < count ; ++i) + for (unsigned int i = 0 ; i < certCount ; ++i) { size_t dataSize = 0;