/* */ #include "LibgnutlsTLSContext.h" #ifdef HAVE_LIBGNUTLS # include #endif // HAVE_LIBGNUTLS #include "LogFactory.h" #include "Logger.h" #include "fmt.h" #include "message.h" namespace aria2 { TLSContext* TLSContext::make(TLSSessionSide side) { return new GnuTLSContext(side); } GnuTLSContext::GnuTLSContext(TLSSessionSide side) : certCred_(0), side_(side), verifyPeer_(true) { int r = gnutls_certificate_allocate_credentials(&certCred_); if(r == GNUTLS_E_SUCCESS) { good_ = true; gnutls_certificate_set_verify_flags(certCred_, GNUTLS_VERIFY_ALLOW_X509_V1_CA_CRT); } else { good_ =false; A2_LOG_ERROR(fmt("gnutls_certificate_allocate_credentials() failed." " Cause: %s", gnutls_strerror(r))); } } GnuTLSContext::~GnuTLSContext() { if(certCred_) { gnutls_certificate_free_credentials(certCred_); } } bool GnuTLSContext::good() const { return good_; } bool GnuTLSContext::addCredentialFile(const std::string& certfile, const std::string& keyfile) { int ret = gnutls_certificate_set_x509_key_file(certCred_, certfile.c_str(), keyfile.c_str(), GNUTLS_X509_FMT_PEM); if(ret == GNUTLS_E_SUCCESS) { A2_LOG_INFO(fmt ("Credential files(cert=%s, key=%s) were successfully added.", certfile.c_str(), keyfile.c_str())); return true; } else { A2_LOG_ERROR(fmt("Failed to load certificate from %s and" " private key from %s. Cause: %s", certfile.c_str(), keyfile.c_str(), gnutls_strerror(ret))); return false; } } bool GnuTLSContext::addSystemTrustedCACerts() { #ifdef HAVE_GNUTLS_CERTIFICATE_SET_X509_SYSTEM_TRUST int ret = gnutls_certificate_set_x509_system_trust(certCred_); if(ret < 0) { A2_LOG_INFO(fmt(MSG_LOADING_SYSTEM_TRUSTED_CA_CERTS_FAILED, gnutls_strerror(ret))); return false; } else { A2_LOG_INFO(fmt("%d certificate(s) were imported.", ret)); return true; } #else A2_LOG_INFO("System certificates not supported"); return false; #endif } bool GnuTLSContext::addTrustedCACertFile(const std::string& certfile) { int ret = gnutls_certificate_set_x509_trust_file(certCred_, certfile.c_str(), GNUTLS_X509_FMT_PEM); if(ret < 0) { A2_LOG_ERROR(fmt(MSG_LOADING_TRUSTED_CA_CERT_FAILED, certfile.c_str(), gnutls_strerror(ret))); return false; } else { A2_LOG_INFO(fmt("%d certificate(s) were imported.", ret)); return true; } } gnutls_certificate_credentials_t GnuTLSContext::getCertCred() const { return certCred_; } } // namespace aria2