15#ifndef OPENVPN_OPENSSL_UTIL_ERROR_H
16#define OPENVPN_OPENSSL_UTIL_ERROR_H
19#include <openssl/err.h>
20#include <openssl/ssl.h>
56 const char *
what() const noexcept
override
73 throw ssl_exception_index();
88 return "SSL_ERROR_NONE";
89 case SSL_ERROR_ZERO_RETURN:
90 return "SSL_ERROR_ZERO_RETURN";
91 case SSL_ERROR_WANT_READ:
92 return "SSL_ERROR_WANT_READ";
93 case SSL_ERROR_WANT_WRITE:
94 return "SSL_ERROR_WANT_WRITE";
95 case SSL_ERROR_WANT_CONNECT:
96 return "SSL_ERROR_WANT_CONNECT";
97 case SSL_ERROR_WANT_ACCEPT:
98 return "SSL_ERROR_WANT_ACCEPT";
99 case SSL_ERROR_WANT_X509_LOOKUP:
100 return "SSL_ERROR_WANT_X509_LOOKUP";
101 case SSL_ERROR_SYSCALL:
102 return "SSL_ERROR_SYSCALL";
104 return "SSL_ERROR_SSL";
108 return "(unknown SSL error)";
115 std::string prefix =
": ";
121 while (
unsigned long err = ERR_get_error())
125 ERR_error_string_n(err, buf,
sizeof(buf));
126 auto reason = ERR_GET_REASON(err);
128 if (reason >= SSL_AD_REASON_OFFSET)
130 errtxt += std::string{
"["} + SSL_alert_desc_string_long(reason - SSL_AD_REASON_OFFSET) +
"]";
140 case SSL_R_CERTIFICATE_VERIFY_FAILED:
143 case PEM_R_BAD_PASSWORD_READ:
144 case PEM_R_BAD_DECRYPT:
147 case SSL_R_UNSUPPORTED_PROTOCOL:
150 case SSL_R_CA_MD_TOO_WEAK:
153 case SSL_R_CA_KEY_TOO_SMALL:
156#ifdef SSL_R_LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED
158 case SSL_R_LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED:
162 case SSL_R_DH_KEY_TOO_SMALL:
165 case SSL_R_TLSV1_ALERT_PROTOCOL_VERSION:
168 case SSL_R_TLSV1_ALERT_UNKNOWN_CA:
171 case SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE:
174 case SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED:
177 case SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED:
180 case SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED:
183 case SSL_R_SSLV3_ALERT_BAD_CERTIFICATE:
186 case SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE:
190 if (reason > SSL_AD_REASON_OFFSET)
201 bool unknown =
false;
241 while (ERR_get_error())
void set_code(const Error::Type code)
static const char * ssl_error_text(const int ssl_error, bool *unknown=nullptr)
OpenSSLException(const std::string &error_text) noexcept
static constexpr size_t MAX_ERRORS
virtual ~OpenSSLException() noexcept=default
std::string what_str() const
void init_ssl_error(const int ssl_error, const char *error_text)
OpenSSLException(const int ssl_error)
unsigned long errstack[MAX_ERRORS]
const char * what() const noexcept override
unsigned long operator[](const size_t i) const
OPENVPN_EXCEPTION(ssl_exception_index)
void init_error(const char *error_text)
OpenSSLException(const std::string &error_text, const int ssl_error)
@ TLS_ALERT_CERTIFICATE_REVOKED
@ TLS_ALERT_BAD_CERTIFICATE
@ TLS_ALERT_CERTIFICATE_EXPIRED
@ TLS_ALERT_UNSUPPORTED_CERTIFICATE
@ TLS_ALERT_PROTOCOL_VERSION
@ TLS_ALERT_HANDSHAKE_FAILURE
@ TLS_SIGALG_DISALLOWED_OR_UNSUPPORTED
@ TLS_ALERT_CERTIFICATE_REQUIRED
void openssl_clear_error_stack()
std::string openssl_error()