15#ifndef OPENVPN_OPENSSL_UTIL_ERROR_H
16#define OPENVPN_OPENSSL_UTIL_ERROR_H
19#include <openssl/err.h>
20#include <openssl/ssl.h>
61 const char *
what() const noexcept
override
79 throw ssl_exception_index();
94 return "SSL_ERROR_NONE";
95 case SSL_ERROR_ZERO_RETURN:
96 return "SSL_ERROR_ZERO_RETURN";
97 case SSL_ERROR_WANT_READ:
98 return "SSL_ERROR_WANT_READ";
99 case SSL_ERROR_WANT_WRITE:
100 return "SSL_ERROR_WANT_WRITE";
101 case SSL_ERROR_WANT_CONNECT:
102 return "SSL_ERROR_WANT_CONNECT";
103 case SSL_ERROR_WANT_ACCEPT:
104 return "SSL_ERROR_WANT_ACCEPT";
105 case SSL_ERROR_WANT_X509_LOOKUP:
106 return "SSL_ERROR_WANT_X509_LOOKUP";
107 case SSL_ERROR_SYSCALL:
108 return "SSL_ERROR_SYSCALL";
110 return "SSL_ERROR_SSL";
114 return "(unknown SSL error)";
121 const char *prefix =
": ";
122 std::ostringstream tmp;
128 while (
unsigned long err = ERR_get_error())
132 ERR_error_string_n(err, buf,
sizeof(buf));
133 auto reason = ERR_GET_REASON(err);
134 tmp << prefix << buf;
135 if (reason >= SSL_AD_REASON_OFFSET)
137 tmp <<
"[" << SSL_alert_desc_string_long(reason - SSL_AD_REASON_OFFSET) <<
"]";
147 case SSL_R_CERTIFICATE_VERIFY_FAILED:
150 case PEM_R_BAD_PASSWORD_READ:
151 case PEM_R_BAD_DECRYPT:
154 case SSL_R_UNSUPPORTED_PROTOCOL:
157 case SSL_R_CA_MD_TOO_WEAK:
160 case SSL_R_CA_KEY_TOO_SMALL:
163#if defined(SSL_R_LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED)
165 case SSL_R_LEGACY_SIGALG_DISALLOWED_OR_UNSUPPORTED:
169 case SSL_R_DH_KEY_TOO_SMALL:
172 case SSL_R_TLSV1_ALERT_PROTOCOL_VERSION:
175 case SSL_R_TLSV1_ALERT_UNKNOWN_CA:
178 case SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE:
181 case SSL_R_TLSV13_ALERT_CERTIFICATE_REQUIRED:
184 case SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED:
187 case SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED:
190 case SSL_R_SSLV3_ALERT_BAD_CERTIFICATE:
193 case SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE:
197 if (reason > SSL_AD_REASON_OFFSET)
209 bool unknown =
false;
249 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
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
Support deferred server-side state creation when client connects.
void openssl_clear_error_stack()
std::string openssl_error()