summaryrefslogtreecommitdiff
path: root/src/LibsslTLSContext.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/LibsslTLSContext.cc')
-rw-r--r--src/LibsslTLSContext.cc144
1 files changed, 74 insertions, 70 deletions
diff --git a/src/LibsslTLSContext.cc b/src/LibsslTLSContext.cc
index 70c13a60..675d77a6 100644
--- a/src/LibsslTLSContext.cc
+++ b/src/LibsslTLSContext.cc
@@ -47,36 +47,46 @@
#include "BufferedFile.h"
namespace {
- struct bio_deleter {
- void operator()(BIO *b) {
- if (b) BIO_free(b);
- }
- };
- typedef std::unique_ptr<BIO, bio_deleter> bio_t;
- struct p12_deleter {
- void operator()(PKCS12 *p) {
- if (p) PKCS12_free(p);
- }
- };
- typedef std::unique_ptr<PKCS12, p12_deleter> p12_t;
- struct pkey_deleter {
- void operator()(EVP_PKEY *x) {
- if (x) EVP_PKEY_free(x);
- }
- };
- typedef std::unique_ptr<EVP_PKEY, pkey_deleter> pkey_t;
- struct x509_deleter {
- void operator()(X509 *x) {
- if (x) X509_free(x);
- }
- };
- typedef std::unique_ptr<X509, x509_deleter> x509_t;
- struct x509_sk_deleter {
- void operator()(STACK_OF(X509) *x) {
- if (x) sk_X509_pop_free(x, X509_free);
- }
- };
- typedef std::unique_ptr<STACK_OF(X509), x509_sk_deleter> x509_sk_t;
+struct bio_deleter {
+ void operator()(BIO* b)
+ {
+ if (b)
+ BIO_free(b);
+ }
+};
+typedef std::unique_ptr<BIO, bio_deleter> bio_t;
+struct p12_deleter {
+ void operator()(PKCS12* p)
+ {
+ if (p)
+ PKCS12_free(p);
+ }
+};
+typedef std::unique_ptr<PKCS12, p12_deleter> p12_t;
+struct pkey_deleter {
+ void operator()(EVP_PKEY* x)
+ {
+ if (x)
+ EVP_PKEY_free(x);
+ }
+};
+typedef std::unique_ptr<EVP_PKEY, pkey_deleter> pkey_t;
+struct x509_deleter {
+ void operator()(X509* x)
+ {
+ if (x)
+ X509_free(x);
+ }
+};
+typedef std::unique_ptr<X509, x509_deleter> x509_t;
+struct x509_sk_deleter {
+ void operator()(STACK_OF(X509) * x)
+ {
+ if (x)
+ sk_X509_pop_free(x, X509_free);
+ }
+};
+typedef std::unique_ptr<STACK_OF(X509), x509_sk_deleter> x509_sk_t;
} // namespace
namespace aria2 {
@@ -87,14 +97,13 @@ TLSContext* TLSContext::make(TLSSessionSide side, TLSVersion minVer)
}
OpenSSLTLSContext::OpenSSLTLSContext(TLSSessionSide side, TLSVersion minVer)
- : sslCtx_(nullptr),
- side_(side),
- verifyPeer_(true)
+ : sslCtx_(nullptr), side_(side), verifyPeer_(true)
{
sslCtx_ = SSL_CTX_new(SSLv23_method());
- if(sslCtx_) {
+ if (sslCtx_) {
good_ = true;
- } else {
+ }
+ else {
good_ = false;
A2_LOG_ERROR(fmt("SSL_CTX_new() failed. Cause: %s",
ERR_error_string(ERR_get_error(), nullptr)));
@@ -102,13 +111,13 @@ OpenSSLTLSContext::OpenSSLTLSContext(TLSSessionSide side, TLSVersion minVer)
}
long ver_opts = 0;
- switch(minVer) {
+ switch (minVer) {
case TLS_PROTO_TLS12:
ver_opts |= SSL_OP_NO_TLSv1_1;
- // fall through
+ // fall through
case TLS_PROTO_TLS11:
ver_opts |= SSL_OP_NO_TLSv1;
- // fall through
+ // fall through
case TLS_PROTO_TLS10:
ver_opts |= SSL_OP_NO_SSLv3;
default:
@@ -118,10 +127,10 @@ OpenSSLTLSContext::OpenSSLTLSContext(TLSSessionSide side, TLSVersion minVer)
// Disable SSLv2 and enable all workarounds for buggy servers
SSL_CTX_set_options(sslCtx_, SSL_OP_ALL | SSL_OP_NO_SSLv2 | ver_opts
#ifdef SSL_OP_SINGLE_ECDH_USE
- | SSL_OP_SINGLE_ECDH_USE
+ | SSL_OP_SINGLE_ECDH_USE
#endif // SSL_OP_SINGLE_ECDH_USE
#ifdef SSL_OP_NO_COMPRESSION
- | SSL_OP_NO_COMPRESSION
+ | SSL_OP_NO_COMPRESSION
#endif // SSL_OP_NO_COMPRESSION
);
SSL_CTX_set_mode(sslCtx_, SSL_MODE_AUTO_RETRY);
@@ -130,7 +139,7 @@ OpenSSLTLSContext::OpenSSLTLSContext(TLSSessionSide side, TLSVersion minVer)
/* keep memory usage low */
SSL_CTX_set_mode(sslCtx_, SSL_MODE_RELEASE_BUFFERS);
#endif
- if(SSL_CTX_set_cipher_list(sslCtx_, "HIGH:!aNULL:!eNULL") == 0) {
+ if (SSL_CTX_set_cipher_list(sslCtx_, "HIGH:!aNULL:!eNULL") == 0) {
good_ = false;
A2_LOG_ERROR(fmt("SSL_CTX_set_cipher_list() failed. Cause: %s",
ERR_error_string(ERR_get_error(), nullptr)));
@@ -139,10 +148,11 @@ OpenSSLTLSContext::OpenSSLTLSContext(TLSSessionSide side, TLSVersion minVer)
#if OPENSSL_VERSION_NUMBER >= 0x0090800fL
#ifndef OPENSSL_NO_ECDH
auto ecdh = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
- if(ecdh == nullptr) {
+ if (ecdh == nullptr) {
A2_LOG_WARN(fmt("Failed to enable ECDHE cipher suites. Cause: %s",
ERR_error_string(ERR_get_error(), nullptr)));
- } else {
+ }
+ else {
SSL_CTX_set_tmp_ecdh(sslCtx_, ecdh);
EC_KEY_free(ecdh);
}
@@ -150,38 +160,31 @@ OpenSSLTLSContext::OpenSSLTLSContext(TLSSessionSide side, TLSVersion minVer)
#endif // OPENSSL_VERSION_NUMBER >= 0x0090800fL
}
-OpenSSLTLSContext::~OpenSSLTLSContext()
-{
- SSL_CTX_free(sslCtx_);
-}
+OpenSSLTLSContext::~OpenSSLTLSContext() { SSL_CTX_free(sslCtx_); }
-bool OpenSSLTLSContext::good() const
-{
- return good_;
-}
+bool OpenSSLTLSContext::good() const { return good_; }
bool OpenSSLTLSContext::addCredentialFile(const std::string& certfile,
- const std::string& keyfile)
+ const std::string& keyfile)
{
if (keyfile.empty()) {
return addP12CredentialFile(certfile);
}
- if(SSL_CTX_use_PrivateKey_file(sslCtx_, keyfile.c_str(),
- SSL_FILETYPE_PEM) != 1) {
+ if (SSL_CTX_use_PrivateKey_file(sslCtx_, keyfile.c_str(), SSL_FILETYPE_PEM) !=
+ 1) {
A2_LOG_ERROR(fmt("Failed to load private key from %s. Cause: %s",
keyfile.c_str(),
ERR_error_string(ERR_get_error(), nullptr)));
return false;
}
- if(SSL_CTX_use_certificate_chain_file(sslCtx_, certfile.c_str()) != 1) {
+ if (SSL_CTX_use_certificate_chain_file(sslCtx_, certfile.c_str()) != 1) {
A2_LOG_ERROR(fmt("Failed to load certificate from %s. Cause: %s",
certfile.c_str(),
ERR_error_string(ERR_get_error(), nullptr)));
return false;
}
A2_LOG_INFO(fmt("Credential files(cert=%s, key=%s) were successfully added.",
- certfile.c_str(),
- keyfile.c_str()));
+ certfile.c_str(), keyfile.c_str()));
return true;
}
bool OpenSSLTLSContext::addP12CredentialFile(const std::string& p12file)
@@ -190,7 +193,7 @@ bool OpenSSLTLSContext::addP12CredentialFile(const std::string& p12file)
BufferedFile(p12file.c_str(), BufferedFile::READ).transfer(ss);
auto data = ss.str();
- void *ptr = const_cast<char*>(data.c_str());
+ void* ptr = const_cast<char*>(data.c_str());
size_t len = data.length();
bio_t bio(BIO_new_mem_buf(ptr, len));
@@ -206,9 +209,9 @@ bool OpenSSLTLSContext::addP12CredentialFile(const std::string& p12file)
ERR_error_string(ERR_get_error(), nullptr)));
return false;
}
- EVP_PKEY *pkey;
- X509 *cert;
- STACK_OF(X509) *ca = nullptr;
+ EVP_PKEY* pkey;
+ X509* cert;
+ STACK_OF(X509)* ca = nullptr;
if (!PKCS12_parse(p12.get(), "", &pkey, &cert, &ca)) {
A2_LOG_ERROR(fmt("Failed to parse PKCS12 file: %s. "
"If you meant to use PEM, you'll also have to specify "
@@ -228,17 +231,17 @@ bool OpenSSLTLSContext::addP12CredentialFile(const std::string& p12file)
}
if (!SSL_CTX_use_PrivateKey(sslCtx_, pkey)) {
A2_LOG_ERROR(fmt("Failed to use PKCS12 file pkey: %s",
- ERR_error_string(ERR_get_error(), nullptr)));
+ ERR_error_string(ERR_get_error(), nullptr)));
return false;
}
if (!SSL_CTX_use_certificate(sslCtx_, cert)) {
A2_LOG_ERROR(fmt("Failed to use PKCS12 file cert: %s",
- ERR_error_string(ERR_get_error(), nullptr)));
+ ERR_error_string(ERR_get_error(), nullptr)));
return false;
}
if (ca && sk_X509_num(ca) && !SSL_CTX_add_extra_chain_cert(sslCtx_, ca)) {
A2_LOG_ERROR(fmt("Failed to use PKCS12 file chain: %s",
- ERR_error_string(ERR_get_error(), nullptr)));
+ ERR_error_string(ERR_get_error(), nullptr)));
return false;
}
@@ -248,11 +251,12 @@ bool OpenSSLTLSContext::addP12CredentialFile(const std::string& p12file)
bool OpenSSLTLSContext::addSystemTrustedCACerts()
{
- if(SSL_CTX_set_default_verify_paths(sslCtx_) != 1) {
+ if (SSL_CTX_set_default_verify_paths(sslCtx_) != 1) {
A2_LOG_INFO(fmt(MSG_LOADING_SYSTEM_TRUSTED_CA_CERTS_FAILED,
ERR_error_string(ERR_get_error(), nullptr)));
return false;
- } else {
+ }
+ else {
A2_LOG_INFO("System trusted CA certificates were successfully added.");
return true;
}
@@ -260,12 +264,12 @@ bool OpenSSLTLSContext::addSystemTrustedCACerts()
bool OpenSSLTLSContext::addTrustedCACertFile(const std::string& certfile)
{
- if(SSL_CTX_load_verify_locations(sslCtx_, certfile.c_str(), nullptr) != 1) {
- A2_LOG_ERROR(fmt(MSG_LOADING_TRUSTED_CA_CERT_FAILED,
- certfile.c_str(),
+ if (SSL_CTX_load_verify_locations(sslCtx_, certfile.c_str(), nullptr) != 1) {
+ A2_LOG_ERROR(fmt(MSG_LOADING_TRUSTED_CA_CERT_FAILED, certfile.c_str(),
ERR_error_string(ERR_get_error(), nullptr)));
return false;
- } else {
+ }
+ else {
A2_LOG_INFO("Trusted CA certificates were successfully added.");
return true;
}