diff options
Diffstat (limited to 'src/LibsslTLSContext.cc')
| -rw-r--r-- | src/LibsslTLSContext.cc | 144 |
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; } |
