/* */ #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() : certCred_(0), peerVerificationEnabled_(false) { 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))); } } TLSContext::~TLSContext() { if(certCred_) { gnutls_certificate_free_credentials(certCred_); } } bool TLSContext::good() const { return good_; } bool TLSContext::bad() const { return !good_; } bool TLSContext::addClientKeyFile(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("Client Key File(cert=%s, key=%s) were successfully added.", certfile.c_str(), keyfile.c_str())); return true; } else { A2_LOG_ERROR(fmt("Failed to load client certificate from %s and" " private key from %s. Cause: %s", certfile.c_str(), keyfile.c_str(), gnutls_strerror(ret))); return false; } } bool TLSContext::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 TLSContext::getCertCred() const { return certCred_; } void TLSContext::enablePeerVerification() { peerVerificationEnabled_ = true; } void TLSContext::disablePeerVerification() { peerVerificationEnabled_ = false; } bool TLSContext::peerVerificationEnabled() const { return peerVerificationEnabled_; } } // namespace aria2