blob: 0d181a5c9962c53e50a5da42c7eff4faabcff3f0 [file] [log] [blame]
// Copyright 2026 The BoringSSL Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//! TLS Errors
use alloc::boxed::Box;
use core::{
any::Any,
ffi::{CStr, c_int, c_uint},
fmt::{Debug, Display, Formatter, Result as FmtResult},
};
use bssl_macros::bssl_enum;
use bssl_sys::LibCode;
use bssl_x509::errors::{PemReason, PkiError};
use crate::config::ConfigurationError;
/// Top-level errors
#[derive(Debug)]
pub enum Error {
/// Error reported by the BoringSSL library
#[allow(private_interfaces)]
Library(u32, Option<LibCode>, Option<i32>),
/// Configuration errors
Configuration(ConfigurationError),
/// TLS retryable errors
TlsRetry(TlsRetryReason),
/// Other TLS errors with reason
TlsReason(TlsErrorReason),
/// PEM encoding failures
PemReason(PemReason),
/// Quic errors,
Quic(QuicError),
/// IO errors
Io(IoError),
/// PKI errors
Pki(PkiError),
/// Unknown error which should be reported as bug
Unknown(Box<dyn Any + Send + Sync>),
}
impl From<PkiError> for Error {
fn from(err: PkiError) -> Self {
Self::Pki(err)
}
}
impl Error {
#[allow(irrefutable_let_patterns)]
fn extract_err_from_code(packed_error: c_uint) -> Self {
let lib = unsafe {
// Safety: extracting error source does not have side-effect and only access static data.
bssl_sys::ERR_GET_LIB(packed_error)
};
let Ok(lib) = i32::try_from(lib) else {
return Self::Library(packed_error, None, None);
};
let Ok(lib) = LibCode::try_from(lib) else {
return Self::Library(packed_error, None, None);
};
let reason = unsafe {
// Safety: extracting error reason does not have side-effect and only access static data.
bssl_sys::ERR_GET_REASON(packed_error)
};
let Ok(reason) = i32::try_from(reason) else {
return Self::Library(packed_error, Some(lib), None);
};
let ret_unknown_reason = || Self::Library(packed_error, Some(lib), Some(reason));
match lib {
LibCode::Ssl => {
let Ok(reason) = TlsErrorReason::try_from(reason) else {
return ret_unknown_reason();
};
Self::TlsReason(reason)
}
LibCode::Pem => {
let Ok(reason) = PemReason::try_from(reason) else {
return ret_unknown_reason();
};
Self::PemReason(reason)
}
_ => Self::Library(packed_error, Some(lib), Some(reason)),
}
}
pub(crate) fn extract_lib_err() -> Self {
let packed_error = unsafe {
// Safety: extracting error code does not have side-effect
bssl_sys::ERR_get_error()
};
let error = Self::extract_err_from_code(packed_error);
unsafe {
// Safety: we only clear the error queue on the current thread.
bssl_sys::ERR_clear_error();
}
error
}
pub(crate) fn extract_tls_err(code: c_int) -> Self {
if code == bssl_sys::SSL_ERROR_SSL {
return Self::extract_lib_err();
}
if let Ok(err) = TlsRetryReason::try_from(code) {
return Self::TlsRetry(err);
}
Self::Unknown(Box::new(alloc::format!("unknown tls error ({code})")))
}
}
impl core::error::Error for Error {
fn source(&self) -> Option<&(dyn core::error::Error + 'static)> {
None
}
fn description(&self) -> &str {
"BoringSSL error; use Display for details"
}
fn cause(&self) -> Option<&dyn core::error::Error> {
self.source()
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
match self {
&Error::Library(code, _, _) => {
// Here the buffer is 120 bytes and BoringSSL uses this buffer size
// to hold the error string.
// Therefore, this ought to be sufficient for a human-readable message.
let mut err_str = [0; bssl_sys::ERR_ERROR_STRING_BUF_LEN as usize];
unsafe {
// Safety:
// - err_str is non-null and valid, so we do not need FFI-specific pointer conversion.
bssl_sys::ERR_error_string_n(code, err_str.as_mut_ptr(), err_str.len());
}
let err_str = unsafe {
// Safety:
// - err_str is still valid;
// - `ERR_error_string_n` guarantees that
CStr::from_ptr(err_str.as_ptr())
};
f.write_str(&err_str.to_string_lossy())
}
Error::Configuration(err) => Display::fmt(err, f),
Error::TlsRetry(err) => Display::fmt(err, f),
Error::TlsReason(err) => Display::fmt(err, f),
Error::PemReason(err) => Debug::fmt(err, f),
Error::Quic(err) => Display::fmt(err, f),
Error::Io(err) => Display::fmt(err, f),
Error::Pki(err) => Display::fmt(err, f),
Error::Unknown(err) => err.fmt(f),
}
}
}
bssl_enum! {
/// SSL reason codes.
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
pub enum TlsErrorReason: i32 {
/// `SSL_R_APP_DATA_IN_HANDSHAKE`
AppDataInHandshake = bssl_sys::SSL_R_APP_DATA_IN_HANDSHAKE as i32,
/// `SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT`
AttemptToReuseSessionInDifferentContext = bssl_sys::SSL_R_ATTEMPT_TO_REUSE_SESSION_IN_DIFFERENT_CONTEXT as i32,
/// `SSL_R_BAD_ALERT`
BadAlert = bssl_sys::SSL_R_BAD_ALERT as i32,
/// `SSL_R_BAD_CHANGE_CIPHER_SPEC`
BadChangeCipherSpec = bssl_sys::SSL_R_BAD_CHANGE_CIPHER_SPEC as i32,
/// `SSL_R_BAD_DATA_RETURNED_BY_CALLBACK`
BadDataReturnedByCallback = bssl_sys::SSL_R_BAD_DATA_RETURNED_BY_CALLBACK as i32,
/// `SSL_R_BAD_DH_P_LENGTH`
BadDhPLength = bssl_sys::SSL_R_BAD_DH_P_LENGTH as i32,
/// `SSL_R_BAD_DIGEST_LENGTH`
BadDigestLength = bssl_sys::SSL_R_BAD_DIGEST_LENGTH as i32,
/// `SSL_R_BAD_ECC_CERT`
BadEccCert = bssl_sys::SSL_R_BAD_ECC_CERT as i32,
/// `SSL_R_BAD_ECPOINT`
BadEcpoint = bssl_sys::SSL_R_BAD_ECPOINT as i32,
/// `SSL_R_BAD_HANDSHAKE_RECORD`
BadHandshakeRecord = bssl_sys::SSL_R_BAD_HANDSHAKE_RECORD as i32,
/// `SSL_R_BAD_HELLO_REQUEST`
BadHelloRequest = bssl_sys::SSL_R_BAD_HELLO_REQUEST as i32,
/// `SSL_R_BAD_LENGTH`
BadLength = bssl_sys::SSL_R_BAD_LENGTH as i32,
/// `SSL_R_BAD_PACKET_LENGTH`
BadPacketLength = bssl_sys::SSL_R_BAD_PACKET_LENGTH as i32,
/// `SSL_R_BAD_RSA_ENCRYPT`
BadRsaEncrypt = bssl_sys::SSL_R_BAD_RSA_ENCRYPT as i32,
/// `SSL_R_BAD_SIGNATURE`
BadSignature = bssl_sys::SSL_R_BAD_SIGNATURE as i32,
/// `SSL_R_BAD_SRTP_MKI_VALUE`
BadSrtpMkiValue = bssl_sys::SSL_R_BAD_SRTP_MKI_VALUE as i32,
/// `SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST`
BadSrtpProtectionProfileList = bssl_sys::SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST as i32,
/// `SSL_R_BAD_SSL_FILETYPE`
BadSslFiletype = bssl_sys::SSL_R_BAD_SSL_FILETYPE as i32,
/// `SSL_R_BAD_WRITE_RETRY`
BadWriteRetry = bssl_sys::SSL_R_BAD_WRITE_RETRY as i32,
/// `SSL_R_BIO_NOT_SET`
BioNotSet = bssl_sys::SSL_R_BIO_NOT_SET as i32,
/// `SSL_R_BN_LIB`
BnLib = bssl_sys::SSL_R_BN_LIB as i32,
/// `SSL_R_BUFFER_TOO_SMALL`
BufferTooSmall = bssl_sys::SSL_R_BUFFER_TOO_SMALL as i32,
/// `SSL_R_CA_DN_LENGTH_MISMATCH`
CaDnLengthMismatch = bssl_sys::SSL_R_CA_DN_LENGTH_MISMATCH as i32,
/// `SSL_R_CA_DN_TOO_LONG`
CaDnTooLong = bssl_sys::SSL_R_CA_DN_TOO_LONG as i32,
/// `SSL_R_CCS_RECEIVED_EARLY`
CcsReceivedEarly = bssl_sys::SSL_R_CCS_RECEIVED_EARLY as i32,
/// `SSL_R_CERTIFICATE_VERIFY_FAILED`
CertificateVerifyFailed = bssl_sys::SSL_R_CERTIFICATE_VERIFY_FAILED as i32,
/// `SSL_R_CERT_CB_ERROR`
CertCbError = bssl_sys::SSL_R_CERT_CB_ERROR as i32,
/// `SSL_R_CERT_LENGTH_MISMATCH`
CertLengthMismatch = bssl_sys::SSL_R_CERT_LENGTH_MISMATCH as i32,
/// `SSL_R_CHANNEL_ID_NOT_P256`
ChannelIdNotP256 = bssl_sys::SSL_R_CHANNEL_ID_NOT_P256 as i32,
/// `SSL_R_CHANNEL_ID_SIGNATURE_INVALID`
ChannelIdSignatureInvalid = bssl_sys::SSL_R_CHANNEL_ID_SIGNATURE_INVALID as i32,
/// `SSL_R_CIPHER_OR_HASH_UNAVAILABLE`
CipherOrHashUnavailable = bssl_sys::SSL_R_CIPHER_OR_HASH_UNAVAILABLE as i32,
/// `SSL_R_CLIENTHELLO_PARSE_FAILED`
ClienthelloParseFailed = bssl_sys::SSL_R_CLIENTHELLO_PARSE_FAILED as i32,
/// `SSL_R_CLIENTHELLO_TLSEXT`
ClienthelloTlsext = bssl_sys::SSL_R_CLIENTHELLO_TLSEXT as i32,
/// `SSL_R_CONNECTION_REJECTED`
ConnectionRejected = bssl_sys::SSL_R_CONNECTION_REJECTED as i32,
/// `SSL_R_CONNECTION_TYPE_NOT_SET`
ConnectionTypeNotSet = bssl_sys::SSL_R_CONNECTION_TYPE_NOT_SET as i32,
/// `SSL_R_CUSTOM_EXTENSION_ERROR`
CustomExtensionError = bssl_sys::SSL_R_CUSTOM_EXTENSION_ERROR as i32,
/// `SSL_R_DATA_LENGTH_TOO_LONG`
DataLengthTooLong = bssl_sys::SSL_R_DATA_LENGTH_TOO_LONG as i32,
/// `SSL_R_DECODE_ERROR`
DecodeError = bssl_sys::SSL_R_DECODE_ERROR as i32,
/// `SSL_R_DECRYPTION_FAILED`
DecryptionFailed = bssl_sys::SSL_R_DECRYPTION_FAILED as i32,
/// `SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC`
DecryptionFailedOrBadRecordMac = bssl_sys::SSL_R_DECRYPTION_FAILED_OR_BAD_RECORD_MAC as i32,
/// `SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG`
DhPublicValueLengthIsWrong = bssl_sys::SSL_R_DH_PUBLIC_VALUE_LENGTH_IS_WRONG as i32,
/// `SSL_R_DH_P_TOO_LONG`
DhPTooLong = bssl_sys::SSL_R_DH_P_TOO_LONG as i32,
/// `SSL_R_DIGEST_CHECK_FAILED`
DigestCheckFailed = bssl_sys::SSL_R_DIGEST_CHECK_FAILED as i32,
/// `SSL_R_DTLS_MESSAGE_TOO_BIG`
DtlsMessageTooBig = bssl_sys::SSL_R_DTLS_MESSAGE_TOO_BIG as i32,
/// `SSL_R_ECC_CERT_NOT_FOR_SIGNING`
EccCertNotForSigning = bssl_sys::SSL_R_ECC_CERT_NOT_FOR_SIGNING as i32,
/// `SSL_R_EMS_STATE_INCONSISTENT`
EmsStateInconsistent = bssl_sys::SSL_R_EMS_STATE_INCONSISTENT as i32,
/// `SSL_R_ENCRYPTED_LENGTH_TOO_LONG`
EncryptedLengthTooLong = bssl_sys::SSL_R_ENCRYPTED_LENGTH_TOO_LONG as i32,
/// `SSL_R_ERROR_ADDING_EXTENSION`
ErrorAddingExtension = bssl_sys::SSL_R_ERROR_ADDING_EXTENSION as i32,
/// `SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST`
ErrorInReceivedCipherList = bssl_sys::SSL_R_ERROR_IN_RECEIVED_CIPHER_LIST as i32,
/// `SSL_R_ERROR_PARSING_EXTENSION`
ErrorParsingExtension = bssl_sys::SSL_R_ERROR_PARSING_EXTENSION as i32,
/// `SSL_R_EXCESSIVE_MESSAGE_SIZE`
ExcessiveMessageSize = bssl_sys::SSL_R_EXCESSIVE_MESSAGE_SIZE as i32,
/// `SSL_R_EXTRA_DATA_IN_MESSAGE`
ExtraDataInMessage = bssl_sys::SSL_R_EXTRA_DATA_IN_MESSAGE as i32,
/// `SSL_R_FRAGMENT_MISMATCH`
FragmentMismatch = bssl_sys::SSL_R_FRAGMENT_MISMATCH as i32,
/// `SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION`
GotNextProtoWithoutExtension = bssl_sys::SSL_R_GOT_NEXT_PROTO_WITHOUT_EXTENSION as i32,
/// `SSL_R_HANDSHAKE_FAILURE_ON_CLIENT_HELLO`
HandshakeFailureOnClientHello = bssl_sys::SSL_R_HANDSHAKE_FAILURE_ON_CLIENT_HELLO as i32,
/// `SSL_R_HTTPS_PROXY_REQUEST`
HttpsProxyRequest = bssl_sys::SSL_R_HTTPS_PROXY_REQUEST as i32,
/// `SSL_R_HTTP_REQUEST`
HttpRequest = bssl_sys::SSL_R_HTTP_REQUEST as i32,
/// `SSL_R_INAPPROPRIATE_FALLBACK`
InappropriateFallback = bssl_sys::SSL_R_INAPPROPRIATE_FALLBACK as i32,
/// `SSL_R_INVALID_COMMAND`
InvalidCommand = bssl_sys::SSL_R_INVALID_COMMAND as i32,
/// `SSL_R_INVALID_MESSAGE`
InvalidMessage = bssl_sys::SSL_R_INVALID_MESSAGE as i32,
/// `SSL_R_INVALID_SSL_SESSION`
InvalidSslSession = bssl_sys::SSL_R_INVALID_SSL_SESSION as i32,
/// `SSL_R_INVALID_TICKET_KEYS_LENGTH`
InvalidTicketKeysLength = bssl_sys::SSL_R_INVALID_TICKET_KEYS_LENGTH as i32,
/// `SSL_R_LENGTH_MISMATCH`
LengthMismatch = bssl_sys::SSL_R_LENGTH_MISMATCH as i32,
/// `SSL_R_MISSING_EXTENSION`
MissingExtension = bssl_sys::SSL_R_MISSING_EXTENSION as i32,
/// `SSL_R_MISSING_RSA_CERTIFICATE`
MissingRsaCertificate = bssl_sys::SSL_R_MISSING_RSA_CERTIFICATE as i32,
/// `SSL_R_MISSING_TMP_DH_KEY`
MissingTmpDhKey = bssl_sys::SSL_R_MISSING_TMP_DH_KEY as i32,
/// `SSL_R_MISSING_TMP_ECDH_KEY`
MissingTmpEcdhKey = bssl_sys::SSL_R_MISSING_TMP_ECDH_KEY as i32,
/// `SSL_R_MIXED_SPECIAL_OPERATOR_WITH_GROUPS`
MixedSpecialOperatorWithGroups = bssl_sys::SSL_R_MIXED_SPECIAL_OPERATOR_WITH_GROUPS as i32,
/// `SSL_R_MTU_TOO_SMALL`
MtuTooSmall = bssl_sys::SSL_R_MTU_TOO_SMALL as i32,
/// `SSL_R_NEGOTIATED_BOTH_NPN_AND_ALPN`
NegotiatedBothNpnAndAlpn = bssl_sys::SSL_R_NEGOTIATED_BOTH_NPN_AND_ALPN as i32,
/// `SSL_R_NESTED_GROUP`
NestedGroup = bssl_sys::SSL_R_NESTED_GROUP as i32,
/// `SSL_R_NO_CERTIFICATES_RETURNED`
NoCertificatesReturned = bssl_sys::SSL_R_NO_CERTIFICATES_RETURNED as i32,
/// `SSL_R_NO_CERTIFICATE_ASSIGNED`
NoCertificateAssigned = bssl_sys::SSL_R_NO_CERTIFICATE_ASSIGNED as i32,
/// `SSL_R_NO_CERTIFICATE_SET`
NoCertificateSet = bssl_sys::SSL_R_NO_CERTIFICATE_SET as i32,
/// `SSL_R_NO_CIPHERS_AVAILABLE`
NoCiphersAvailable = bssl_sys::SSL_R_NO_CIPHERS_AVAILABLE as i32,
/// `SSL_R_NO_CIPHERS_PASSED`
NoCiphersPassed = bssl_sys::SSL_R_NO_CIPHERS_PASSED as i32,
/// `SSL_R_NO_CIPHER_MATCH`
NoCipherMatch = bssl_sys::SSL_R_NO_CIPHER_MATCH as i32,
/// `SSL_R_NO_COMPRESSION_SPECIFIED`
NoCompressionSpecified = bssl_sys::SSL_R_NO_COMPRESSION_SPECIFIED as i32,
/// `SSL_R_NO_METHOD_SPECIFIED`
NoMethodSpecified = bssl_sys::SSL_R_NO_METHOD_SPECIFIED as i32,
/// `SSL_R_NO_PRIVATE_KEY_ASSIGNED`
NoPrivateKeyAssigned = bssl_sys::SSL_R_NO_PRIVATE_KEY_ASSIGNED as i32,
/// `SSL_R_NO_RENEGOTIATION`
NoRenegotiation = bssl_sys::SSL_R_NO_RENEGOTIATION as i32,
/// `SSL_R_NO_REQUIRED_DIGEST`
NoRequiredDigest = bssl_sys::SSL_R_NO_REQUIRED_DIGEST as i32,
/// `SSL_R_NO_SHARED_CIPHER`
NoSharedCipher = bssl_sys::SSL_R_NO_SHARED_CIPHER as i32,
/// `SSL_R_NULL_SSL_CTX`
NullSslCtx = bssl_sys::SSL_R_NULL_SSL_CTX as i32,
/// `SSL_R_NULL_SSL_METHOD_PASSED`
NullSslMethodPassed = bssl_sys::SSL_R_NULL_SSL_METHOD_PASSED as i32,
/// `SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED`
OldSessionCipherNotReturned = bssl_sys::SSL_R_OLD_SESSION_CIPHER_NOT_RETURNED as i32,
/// `SSL_R_OLD_SESSION_VERSION_NOT_RETURNED`
OldSessionVersionNotReturned = bssl_sys::SSL_R_OLD_SESSION_VERSION_NOT_RETURNED as i32,
/// `SSL_R_OUTPUT_ALIASES_INPUT`
OutputAliasesInput = bssl_sys::SSL_R_OUTPUT_ALIASES_INPUT as i32,
/// `SSL_R_PARSE_TLSEXT`
ParseTlsext = bssl_sys::SSL_R_PARSE_TLSEXT as i32,
/// `SSL_R_PATH_TOO_LONG`
PathTooLong = bssl_sys::SSL_R_PATH_TOO_LONG as i32,
/// `SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE`
PeerDidNotReturnACertificate = bssl_sys::SSL_R_PEER_DID_NOT_RETURN_A_CERTIFICATE as i32,
/// `SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE`
PeerErrorUnsupportedCertificateType = bssl_sys::SSL_R_PEER_ERROR_UNSUPPORTED_CERTIFICATE_TYPE as i32,
/// `SSL_R_PROTOCOL_IS_SHUTDOWN`
ProtocolIsShutdown = bssl_sys::SSL_R_PROTOCOL_IS_SHUTDOWN as i32,
/// `SSL_R_PSK_IDENTITY_NOT_FOUND`
PskIdentityNotFound = bssl_sys::SSL_R_PSK_IDENTITY_NOT_FOUND as i32,
/// `SSL_R_PSK_NO_CLIENT_CB`
PskNoClientCb = bssl_sys::SSL_R_PSK_NO_CLIENT_CB as i32,
/// `SSL_R_PSK_NO_SERVER_CB`
PskNoServerCb = bssl_sys::SSL_R_PSK_NO_SERVER_CB as i32,
/// `SSL_R_READ_TIMEOUT_EXPIRED`
ReadTimeoutExpired = bssl_sys::SSL_R_READ_TIMEOUT_EXPIRED as i32,
/// `SSL_R_RECORD_LENGTH_MISMATCH`
RecordLengthMismatch = bssl_sys::SSL_R_RECORD_LENGTH_MISMATCH as i32,
/// `SSL_R_RECORD_TOO_LARGE`
RecordTooLarge = bssl_sys::SSL_R_RECORD_TOO_LARGE as i32,
/// `SSL_R_RENEGOTIATION_ENCODING_ERR`
RenegotiationEncodingErr = bssl_sys::SSL_R_RENEGOTIATION_ENCODING_ERR as i32,
/// `SSL_R_RENEGOTIATION_MISMATCH`
RenegotiationMismatch = bssl_sys::SSL_R_RENEGOTIATION_MISMATCH as i32,
/// `SSL_R_REQUIRED_CIPHER_MISSING`
RequiredCipherMissing = bssl_sys::SSL_R_REQUIRED_CIPHER_MISSING as i32,
/// `SSL_R_RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION`
ResumedEmsSessionWithoutEmsExtension = bssl_sys::SSL_R_RESUMED_EMS_SESSION_WITHOUT_EMS_EXTENSION as i32,
/// `SSL_R_RESUMED_NON_EMS_SESSION_WITH_EMS_EXTENSION`
ResumedNonEmsSessionWithEmsExtension = bssl_sys::SSL_R_RESUMED_NON_EMS_SESSION_WITH_EMS_EXTENSION as i32,
/// `SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING`
ScsvReceivedWhenRenegotiating = bssl_sys::SSL_R_SCSV_RECEIVED_WHEN_RENEGOTIATING as i32,
/// `SSL_R_SERVERHELLO_TLSEXT`
ServerhelloTlsext = bssl_sys::SSL_R_SERVERHELLO_TLSEXT as i32,
/// `SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED`
SessionIdContextUninitialized = bssl_sys::SSL_R_SESSION_ID_CONTEXT_UNINITIALIZED as i32,
/// `SSL_R_SESSION_MAY_NOT_BE_CREATED`
SessionMayNotBeCreated = bssl_sys::SSL_R_SESSION_MAY_NOT_BE_CREATED as i32,
/// `SSL_R_SIGNATURE_ALGORITHMS_EXTENSION_SENT_BY_SERVER`
SignatureAlgorithmsExtensionSentByServer = bssl_sys::SSL_R_SIGNATURE_ALGORITHMS_EXTENSION_SENT_BY_SERVER as i32,
/// `SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES`
SrtpCouldNotAllocateProfiles = bssl_sys::SSL_R_SRTP_COULD_NOT_ALLOCATE_PROFILES as i32,
/// `SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE`
SrtpUnknownProtectionProfile = bssl_sys::SSL_R_SRTP_UNKNOWN_PROTECTION_PROFILE as i32,
/// `SSL_R_SSL3_EXT_INVALID_SERVERNAME`
Ssl3ExtInvalidServername = bssl_sys::SSL_R_SSL3_EXT_INVALID_SERVERNAME as i32,
/// `SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION`
SslCtxHasNoDefaultSslVersion = bssl_sys::SSL_R_SSL_CTX_HAS_NO_DEFAULT_SSL_VERSION as i32,
/// `SSL_R_SSL_HANDSHAKE_FAILURE`
SslHandshakeFailure = bssl_sys::SSL_R_SSL_HANDSHAKE_FAILURE as i32,
/// `SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG`
SslSessionIdContextTooLong = bssl_sys::SSL_R_SSL_SESSION_ID_CONTEXT_TOO_LONG as i32,
/// `SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST`
TlsPeerDidNotRespondWithCertificateList = bssl_sys::SSL_R_TLS_PEER_DID_NOT_RESPOND_WITH_CERTIFICATE_LIST as i32,
/// `SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG`
TlsRsaEncryptedValueLengthIsWrong = bssl_sys::SSL_R_TLS_RSA_ENCRYPTED_VALUE_LENGTH_IS_WRONG as i32,
/// `SSL_R_TOO_MANY_EMPTY_FRAGMENTS`
TooManyEmptyFragments = bssl_sys::SSL_R_TOO_MANY_EMPTY_FRAGMENTS as i32,
/// `SSL_R_TOO_MANY_WARNING_ALERTS`
TooManyWarningAlerts = bssl_sys::SSL_R_TOO_MANY_WARNING_ALERTS as i32,
/// `SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS`
UnableToFindEcdhParameters = bssl_sys::SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS as i32,
/// `SSL_R_UNEXPECTED_EXTENSION`
UnexpectedExtension = bssl_sys::SSL_R_UNEXPECTED_EXTENSION as i32,
/// `SSL_R_UNEXPECTED_MESSAGE`
UnexpectedMessage = bssl_sys::SSL_R_UNEXPECTED_MESSAGE as i32,
/// `SSL_R_UNEXPECTED_OPERATOR_IN_GROUP`
UnexpectedOperatorInGroup = bssl_sys::SSL_R_UNEXPECTED_OPERATOR_IN_GROUP as i32,
/// `SSL_R_UNEXPECTED_RECORD`
UnexpectedRecord = bssl_sys::SSL_R_UNEXPECTED_RECORD as i32,
/// `SSL_R_UNINITIALIZED`
Uninitialized = bssl_sys::SSL_R_UNINITIALIZED as i32,
/// `SSL_R_UNKNOWN_ALERT_TYPE`
UnknownAlertType = bssl_sys::SSL_R_UNKNOWN_ALERT_TYPE as i32,
/// `SSL_R_UNKNOWN_CERTIFICATE_TYPE`
UnknownCertificateType = bssl_sys::SSL_R_UNKNOWN_CERTIFICATE_TYPE as i32,
/// `SSL_R_UNKNOWN_CIPHER_RETURNED`
UnknownCipherReturned = bssl_sys::SSL_R_UNKNOWN_CIPHER_RETURNED as i32,
/// `SSL_R_UNKNOWN_CIPHER_TYPE`
UnknownCipherType = bssl_sys::SSL_R_UNKNOWN_CIPHER_TYPE as i32,
/// `SSL_R_UNKNOWN_DIGEST`
UnknownDigest = bssl_sys::SSL_R_UNKNOWN_DIGEST as i32,
/// `SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE`
UnknownKeyExchangeType = bssl_sys::SSL_R_UNKNOWN_KEY_EXCHANGE_TYPE as i32,
/// `SSL_R_UNKNOWN_PROTOCOL`
UnknownProtocol = bssl_sys::SSL_R_UNKNOWN_PROTOCOL as i32,
/// `SSL_R_UNKNOWN_SSL_VERSION`
UnknownSslVersion = bssl_sys::SSL_R_UNKNOWN_SSL_VERSION as i32,
/// `SSL_R_UNKNOWN_STATE`
UnknownState = bssl_sys::SSL_R_UNKNOWN_STATE as i32,
/// `SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED`
UnsafeLegacyRenegotiationDisabled = bssl_sys::SSL_R_UNSAFE_LEGACY_RENEGOTIATION_DISABLED as i32,
/// `SSL_R_UNSUPPORTED_CIPHER`
UnsupportedCipher = bssl_sys::SSL_R_UNSUPPORTED_CIPHER as i32,
/// `SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM`
UnsupportedCompressionAlgorithm = bssl_sys::SSL_R_UNSUPPORTED_COMPRESSION_ALGORITHM as i32,
/// `SSL_R_UNSUPPORTED_ELLIPTIC_CURVE`
UnsupportedEllipticCurve = bssl_sys::SSL_R_UNSUPPORTED_ELLIPTIC_CURVE as i32,
/// `SSL_R_UNSUPPORTED_PROTOCOL`
UnsupportedProtocol = bssl_sys::SSL_R_UNSUPPORTED_PROTOCOL as i32,
/// `SSL_R_WRONG_CERTIFICATE_TYPE`
WrongCertificateType = bssl_sys::SSL_R_WRONG_CERTIFICATE_TYPE as i32,
/// `SSL_R_WRONG_CIPHER_RETURNED`
WrongCipherReturned = bssl_sys::SSL_R_WRONG_CIPHER_RETURNED as i32,
/// `SSL_R_WRONG_CURVE`
WrongCurve = bssl_sys::SSL_R_WRONG_CURVE as i32,
/// `SSL_R_WRONG_MESSAGE_TYPE`
WrongMessageType = bssl_sys::SSL_R_WRONG_MESSAGE_TYPE as i32,
/// `SSL_R_WRONG_SIGNATURE_TYPE`
WrongSignatureType = bssl_sys::SSL_R_WRONG_SIGNATURE_TYPE as i32,
/// `SSL_R_WRONG_SSL_VERSION`
WrongSslVersion = bssl_sys::SSL_R_WRONG_SSL_VERSION as i32,
/// `SSL_R_WRONG_VERSION_NUMBER`
WrongVersionNumber = bssl_sys::SSL_R_WRONG_VERSION_NUMBER as i32,
/// `SSL_R_X509_LIB`
X509Lib = bssl_sys::SSL_R_X509_LIB as i32,
/// `SSL_R_X509_VERIFICATION_SETUP_PROBLEMS`
X509VerificationSetupProblems = bssl_sys::SSL_R_X509_VERIFICATION_SETUP_PROBLEMS as i32,
/// `SSL_R_SHUTDOWN_WHILE_IN_INIT`
ShutdownWhileInInit = bssl_sys::SSL_R_SHUTDOWN_WHILE_IN_INIT as i32,
/// `SSL_R_INVALID_OUTER_RECORD_TYPE`
InvalidOuterRecordType = bssl_sys::SSL_R_INVALID_OUTER_RECORD_TYPE as i32,
/// `SSL_R_UNSUPPORTED_PROTOCOL_FOR_CUSTOM_KEY`
UnsupportedProtocolForCustomKey = bssl_sys::SSL_R_UNSUPPORTED_PROTOCOL_FOR_CUSTOM_KEY as i32,
/// `SSL_R_NO_COMMON_SIGNATURE_ALGORITHMS`
NoCommonSignatureAlgorithms = bssl_sys::SSL_R_NO_COMMON_SIGNATURE_ALGORITHMS as i32,
/// `SSL_R_DOWNGRADE_DETECTED`
DowngradeDetected = bssl_sys::SSL_R_DOWNGRADE_DETECTED as i32,
/// `SSL_R_EXCESS_HANDSHAKE_DATA`
ExcessHandshakeData = bssl_sys::SSL_R_EXCESS_HANDSHAKE_DATA as i32,
/// `SSL_R_INVALID_COMPRESSION_LIST`
InvalidCompressionList = bssl_sys::SSL_R_INVALID_COMPRESSION_LIST as i32,
/// `SSL_R_DUPLICATE_EXTENSION`
DuplicateExtension = bssl_sys::SSL_R_DUPLICATE_EXTENSION as i32,
/// `SSL_R_MISSING_KEY_SHARE`
MissingKeyShare = bssl_sys::SSL_R_MISSING_KEY_SHARE as i32,
/// `SSL_R_INVALID_ALPN_PROTOCOL`
InvalidAlpnProtocol = bssl_sys::SSL_R_INVALID_ALPN_PROTOCOL as i32,
/// `SSL_R_TOO_MANY_KEY_UPDATES`
TooManyKeyUpdates = bssl_sys::SSL_R_TOO_MANY_KEY_UPDATES as i32,
/// `SSL_R_BLOCK_CIPHER_PAD_IS_WRONG`
BlockCipherPadIsWrong = bssl_sys::SSL_R_BLOCK_CIPHER_PAD_IS_WRONG as i32,
/// `SSL_R_NO_CIPHERS_SPECIFIED`
NoCiphersSpecified = bssl_sys::SSL_R_NO_CIPHERS_SPECIFIED as i32,
/// `SSL_R_RENEGOTIATION_EMS_MISMATCH`
RenegotiationEmsMismatch = bssl_sys::SSL_R_RENEGOTIATION_EMS_MISMATCH as i32,
/// `SSL_R_DUPLICATE_KEY_SHARE`
DuplicateKeyShare = bssl_sys::SSL_R_DUPLICATE_KEY_SHARE as i32,
/// `SSL_R_NO_GROUPS_SPECIFIED`
NoGroupsSpecified = bssl_sys::SSL_R_NO_GROUPS_SPECIFIED as i32,
/// `SSL_R_NO_SHARED_GROUP`
NoSharedGroup = bssl_sys::SSL_R_NO_SHARED_GROUP as i32,
/// `SSL_R_PRE_SHARED_KEY_MUST_BE_LAST`
PreSharedKeyMustBeLast = bssl_sys::SSL_R_PRE_SHARED_KEY_MUST_BE_LAST as i32,
/// `SSL_R_OLD_SESSION_PRF_HASH_MISMATCH`
OldSessionPrfHashMismatch = bssl_sys::SSL_R_OLD_SESSION_PRF_HASH_MISMATCH as i32,
/// `SSL_R_INVALID_SCT_LIST`
InvalidSctList = bssl_sys::SSL_R_INVALID_SCT_LIST as i32,
/// `SSL_R_TOO_MUCH_SKIPPED_EARLY_DATA`
TooMuchSkippedEarlyData = bssl_sys::SSL_R_TOO_MUCH_SKIPPED_EARLY_DATA as i32,
/// `SSL_R_PSK_IDENTITY_BINDER_COUNT_MISMATCH`
PskIdentityBinderCountMismatch = bssl_sys::SSL_R_PSK_IDENTITY_BINDER_COUNT_MISMATCH as i32,
/// `SSL_R_CANNOT_PARSE_LEAF_CERT`
CannotParseLeafCert = bssl_sys::SSL_R_CANNOT_PARSE_LEAF_CERT as i32,
/// `SSL_R_SERVER_CERT_CHANGED`
ServerCertChanged = bssl_sys::SSL_R_SERVER_CERT_CHANGED as i32,
/// `SSL_R_CERTIFICATE_AND_PRIVATE_KEY_MISMATCH`
CertificateAndPrivateKeyMismatch = bssl_sys::SSL_R_CERTIFICATE_AND_PRIVATE_KEY_MISMATCH as i32,
/// `SSL_R_CANNOT_HAVE_BOTH_PRIVKEY_AND_METHOD`
CannotHaveBothPrivkeyAndMethod = bssl_sys::SSL_R_CANNOT_HAVE_BOTH_PRIVKEY_AND_METHOD as i32,
/// `SSL_R_TICKET_ENCRYPTION_FAILED`
TicketEncryptionFailed = bssl_sys::SSL_R_TICKET_ENCRYPTION_FAILED as i32,
/// `SSL_R_ALPN_MISMATCH_ON_EARLY_DATA`
AlpnMismatchOnEarlyData = bssl_sys::SSL_R_ALPN_MISMATCH_ON_EARLY_DATA as i32,
/// `SSL_R_WRONG_VERSION_ON_EARLY_DATA`
WrongVersionOnEarlyData = bssl_sys::SSL_R_WRONG_VERSION_ON_EARLY_DATA as i32,
/// `SSL_R_UNEXPECTED_EXTENSION_ON_EARLY_DATA`
UnexpectedExtensionOnEarlyData = bssl_sys::SSL_R_UNEXPECTED_EXTENSION_ON_EARLY_DATA as i32,
/// `SSL_R_NO_SUPPORTED_VERSIONS_ENABLED`
NoSupportedVersionsEnabled = bssl_sys::SSL_R_NO_SUPPORTED_VERSIONS_ENABLED as i32,
/// `SSL_R_EMPTY_HELLO_RETRY_REQUEST`
EmptyHelloRetryRequest = bssl_sys::SSL_R_EMPTY_HELLO_RETRY_REQUEST as i32,
/// `SSL_R_EARLY_DATA_NOT_IN_USE`
EarlyDataNotInUse = bssl_sys::SSL_R_EARLY_DATA_NOT_IN_USE as i32,
/// `SSL_R_HANDSHAKE_NOT_COMPLETE`
HandshakeNotComplete = bssl_sys::SSL_R_HANDSHAKE_NOT_COMPLETE as i32,
/// `SSL_R_NEGOTIATED_TB_WITHOUT_EMS_OR_RI`
NegotiatedTbWithoutEmsOrRi = bssl_sys::SSL_R_NEGOTIATED_TB_WITHOUT_EMS_OR_RI as i32,
/// `SSL_R_SERVER_ECHOED_INVALID_SESSION_ID`
ServerEchoedInvalidSessionId = bssl_sys::SSL_R_SERVER_ECHOED_INVALID_SESSION_ID as i32,
/// `SSL_R_PRIVATE_KEY_OPERATION_FAILED`
PrivateKeyOperationFailed = bssl_sys::SSL_R_PRIVATE_KEY_OPERATION_FAILED as i32,
/// `SSL_R_SECOND_SERVERHELLO_VERSION_MISMATCH`
SecondServerhelloVersionMismatch = bssl_sys::SSL_R_SECOND_SERVERHELLO_VERSION_MISMATCH as i32,
/// `SSL_R_OCSP_CB_ERROR`
OcspCbError = bssl_sys::SSL_R_OCSP_CB_ERROR as i32,
/// `SSL_R_SSL_SESSION_ID_TOO_LONG`
SslSessionIdTooLong = bssl_sys::SSL_R_SSL_SESSION_ID_TOO_LONG as i32,
/// `SSL_R_APPLICATION_DATA_ON_SHUTDOWN`
ApplicationDataOnShutdown = bssl_sys::SSL_R_APPLICATION_DATA_ON_SHUTDOWN as i32,
/// `SSL_R_CERT_DECOMPRESSION_FAILED`
CertDecompressionFailed = bssl_sys::SSL_R_CERT_DECOMPRESSION_FAILED as i32,
/// `SSL_R_UNCOMPRESSED_CERT_TOO_LARGE`
UncompressedCertTooLarge = bssl_sys::SSL_R_UNCOMPRESSED_CERT_TOO_LARGE as i32,
/// `SSL_R_UNKNOWN_CERT_COMPRESSION_ALG`
UnknownCertCompressionAlg = bssl_sys::SSL_R_UNKNOWN_CERT_COMPRESSION_ALG as i32,
/// `SSL_R_INVALID_SIGNATURE_ALGORITHM`
InvalidSignatureAlgorithm = bssl_sys::SSL_R_INVALID_SIGNATURE_ALGORITHM as i32,
/// `SSL_R_DUPLICATE_SIGNATURE_ALGORITHM`
DuplicateSignatureAlgorithm = bssl_sys::SSL_R_DUPLICATE_SIGNATURE_ALGORITHM as i32,
/// `SSL_R_TLS13_DOWNGRADE`
Tls13Downgrade = bssl_sys::SSL_R_TLS13_DOWNGRADE as i32,
/// `SSL_R_QUIC_INTERNAL_ERROR`
QuicInternalError = bssl_sys::SSL_R_QUIC_INTERNAL_ERROR as i32,
/// `SSL_R_WRONG_ENCRYPTION_LEVEL_RECEIVED`
WrongEncryptionLevelReceived = bssl_sys::SSL_R_WRONG_ENCRYPTION_LEVEL_RECEIVED as i32,
/// `SSL_R_TOO_MUCH_READ_EARLY_DATA`
TooMuchReadEarlyData = bssl_sys::SSL_R_TOO_MUCH_READ_EARLY_DATA as i32,
/// `SSL_R_INVALID_DELEGATED_CREDENTIAL`
InvalidDelegatedCredential = bssl_sys::SSL_R_INVALID_DELEGATED_CREDENTIAL as i32,
/// `SSL_R_KEY_USAGE_BIT_INCORRECT`
KeyUsageBitIncorrect = bssl_sys::SSL_R_KEY_USAGE_BIT_INCORRECT as i32,
/// `SSL_R_INCONSISTENT_CLIENT_HELLO`
InconsistentClientHello = bssl_sys::SSL_R_INCONSISTENT_CLIENT_HELLO as i32,
/// `SSL_R_CIPHER_MISMATCH_ON_EARLY_DATA`
CipherMismatchOnEarlyData = bssl_sys::SSL_R_CIPHER_MISMATCH_ON_EARLY_DATA as i32,
/// `SSL_R_QUIC_TRANSPORT_PARAMETERS_MISCONFIGURED`
QuicTransportParametersMisconfigured = bssl_sys::SSL_R_QUIC_TRANSPORT_PARAMETERS_MISCONFIGURED as i32,
/// `SSL_R_UNEXPECTED_COMPATIBILITY_MODE`
UnexpectedCompatibilityMode = bssl_sys::SSL_R_UNEXPECTED_COMPATIBILITY_MODE as i32,
/// `SSL_R_NO_APPLICATION_PROTOCOL`
NoApplicationProtocol = bssl_sys::SSL_R_NO_APPLICATION_PROTOCOL as i32,
/// `SSL_R_NEGOTIATED_ALPS_WITHOUT_ALPN`
NegotiatedAlpsWithoutAlpn = bssl_sys::SSL_R_NEGOTIATED_ALPS_WITHOUT_ALPN as i32,
/// `SSL_R_ALPS_MISMATCH_ON_EARLY_DATA`
AlpsMismatchOnEarlyData = bssl_sys::SSL_R_ALPS_MISMATCH_ON_EARLY_DATA as i32,
/// `SSL_R_ECH_SERVER_CONFIG_AND_PRIVATE_KEY_MISMATCH`
EchServerConfigAndPrivateKeyMismatch = bssl_sys::SSL_R_ECH_SERVER_CONFIG_AND_PRIVATE_KEY_MISMATCH as i32,
/// `SSL_R_ECH_SERVER_CONFIG_UNSUPPORTED_EXTENSION`
EchServerConfigUnsupportedExtension = bssl_sys::SSL_R_ECH_SERVER_CONFIG_UNSUPPORTED_EXTENSION as i32,
/// `SSL_R_UNSUPPORTED_ECH_SERVER_CONFIG`
UnsupportedEchServerConfig = bssl_sys::SSL_R_UNSUPPORTED_ECH_SERVER_CONFIG as i32,
/// `SSL_R_ECH_SERVER_WOULD_HAVE_NO_RETRY_CONFIGS`
EchServerWouldHaveNoRetryConfigs = bssl_sys::SSL_R_ECH_SERVER_WOULD_HAVE_NO_RETRY_CONFIGS as i32,
/// `SSL_R_INVALID_CLIENT_HELLO_INNER`
InvalidClientHelloInner = bssl_sys::SSL_R_INVALID_CLIENT_HELLO_INNER as i32,
/// `SSL_R_INVALID_ALPN_PROTOCOL_LIST`
InvalidAlpnProtocolList = bssl_sys::SSL_R_INVALID_ALPN_PROTOCOL_LIST as i32,
/// `SSL_R_COULD_NOT_PARSE_HINTS`
CouldNotParseHints = bssl_sys::SSL_R_COULD_NOT_PARSE_HINTS as i32,
/// `SSL_R_INVALID_ECH_PUBLIC_NAME`
InvalidEchPublicName = bssl_sys::SSL_R_INVALID_ECH_PUBLIC_NAME as i32,
/// `SSL_R_INVALID_ECH_CONFIG_LIST`
InvalidEchConfigList = bssl_sys::SSL_R_INVALID_ECH_CONFIG_LIST as i32,
/// `SSL_R_ECH_REJECTED`
EchRejected = bssl_sys::SSL_R_ECH_REJECTED as i32,
/// `SSL_R_INVALID_OUTER_EXTENSION`
InvalidOuterExtension = bssl_sys::SSL_R_INVALID_OUTER_EXTENSION as i32,
/// `SSL_R_INCONSISTENT_ECH_NEGOTIATION`
InconsistentEchNegotiation = bssl_sys::SSL_R_INCONSISTENT_ECH_NEGOTIATION as i32,
/// `SSL_R_INVALID_ALPS_CODEPOINT`
InvalidAlpsCodepoint = bssl_sys::SSL_R_INVALID_ALPS_CODEPOINT as i32,
/// `SSL_R_NO_MATCHING_ISSUER`
NoMatchingIssuer = bssl_sys::SSL_R_NO_MATCHING_ISSUER as i32,
/// `SSL_R_INVALID_SPAKE2PLUSV1_VALUE`
InvalidSpake2plusv1Value = bssl_sys::SSL_R_INVALID_SPAKE2PLUSV1_VALUE as i32,
/// `SSL_R_PAKE_EXHAUSTED`
PakeExhausted = bssl_sys::SSL_R_PAKE_EXHAUSTED as i32,
/// `SSL_R_PEER_PAKE_MISMATCH`
PeerPakeMismatch = bssl_sys::SSL_R_PEER_PAKE_MISMATCH as i32,
/// `SSL_R_UNSUPPORTED_CREDENTIAL_LIST`
UnsupportedCredentialList = bssl_sys::SSL_R_UNSUPPORTED_CREDENTIAL_LIST as i32,
/// `SSL_R_INVALID_TRUST_ANCHOR_LIST`
InvalidTrustAnchorList = bssl_sys::SSL_R_INVALID_TRUST_ANCHOR_LIST as i32,
/// `SSL_R_INVALID_CERTIFICATE_PROPERTY_LIST`
InvalidCertificatePropertyList = bssl_sys::SSL_R_INVALID_CERTIFICATE_PROPERTY_LIST as i32,
/// `SSL_R_DUPLICATE_GROUP`
DuplicateGroup = bssl_sys::SSL_R_DUPLICATE_GROUP as i32,
/// `SSL_R_SSLV3_ALERT_CLOSE_NOTIFY`
Sslv3AlertCloseNotify = bssl_sys::SSL_R_SSLV3_ALERT_CLOSE_NOTIFY as i32,
/// `SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE`
Sslv3AlertUnexpectedMessage = bssl_sys::SSL_R_SSLV3_ALERT_UNEXPECTED_MESSAGE as i32,
/// `SSL_R_SSLV3_ALERT_BAD_RECORD_MAC`
Sslv3AlertBadRecordMac = bssl_sys::SSL_R_SSLV3_ALERT_BAD_RECORD_MAC as i32,
/// `SSL_R_TLSV1_ALERT_DECRYPTION_FAILED`
Tlsv1AlertDecryptionFailed = bssl_sys::SSL_R_TLSV1_ALERT_DECRYPTION_FAILED as i32,
/// `SSL_R_TLSV1_ALERT_RECORD_OVERFLOW`
Tlsv1AlertRecordOverflow = bssl_sys::SSL_R_TLSV1_ALERT_RECORD_OVERFLOW as i32,
/// `SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE`
Sslv3AlertDecompressionFailure = bssl_sys::SSL_R_SSLV3_ALERT_DECOMPRESSION_FAILURE as i32,
/// `SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE`
Sslv3AlertHandshakeFailure = bssl_sys::SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE as i32,
/// `SSL_R_SSLV3_ALERT_NO_CERTIFICATE`
Sslv3AlertNoCertificate = bssl_sys::SSL_R_SSLV3_ALERT_NO_CERTIFICATE as i32,
/// `SSL_R_SSLV3_ALERT_BAD_CERTIFICATE`
Sslv3AlertBadCertificate = bssl_sys::SSL_R_SSLV3_ALERT_BAD_CERTIFICATE as i32,
/// `SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE`
Sslv3AlertUnsupportedCertificate = bssl_sys::SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE as i32,
/// `SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED`
Sslv3AlertCertificateRevoked = bssl_sys::SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED as i32,
/// `SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED`
Sslv3AlertCertificateExpired = bssl_sys::SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED as i32,
/// `SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN`
Sslv3AlertCertificateUnknown = bssl_sys::SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN as i32,
/// `SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER`
Sslv3AlertIllegalParameter = bssl_sys::SSL_R_SSLV3_ALERT_ILLEGAL_PARAMETER as i32,
/// `SSL_R_TLSV1_ALERT_UNKNOWN_CA`
Tlsv1AlertUnknownCa = bssl_sys::SSL_R_TLSV1_ALERT_UNKNOWN_CA as i32,
/// `SSL_R_TLSV1_ALERT_ACCESS_DENIED`
Tlsv1AlertAccessDenied = bssl_sys::SSL_R_TLSV1_ALERT_ACCESS_DENIED as i32,
/// `SSL_R_TLSV1_ALERT_DECODE_ERROR`
Tlsv1AlertDecodeError = bssl_sys::SSL_R_TLSV1_ALERT_DECODE_ERROR as i32,
/// `SSL_R_TLSV1_ALERT_DECRYPT_ERROR`
Tlsv1AlertDecryptError = bssl_sys::SSL_R_TLSV1_ALERT_DECRYPT_ERROR as i32,
/// `SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION`
Tlsv1AlertExportRestriction = bssl_sys::SSL_R_TLSV1_ALERT_EXPORT_RESTRICTION as i32,
/// `SSL_R_TLSV1_ALERT_PROTOCOL_VERSION`
Tlsv1AlertProtocolVersion = bssl_sys::SSL_R_TLSV1_ALERT_PROTOCOL_VERSION as i32,
/// `SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY`
Tlsv1AlertInsufficientSecurity = bssl_sys::SSL_R_TLSV1_ALERT_INSUFFICIENT_SECURITY as i32,
/// `SSL_R_TLSV1_ALERT_INTERNAL_ERROR`
Tlsv1AlertInternalError = bssl_sys::SSL_R_TLSV1_ALERT_INTERNAL_ERROR as i32,
/// `SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK`
Tlsv1AlertInappropriateFallback = bssl_sys::SSL_R_TLSV1_ALERT_INAPPROPRIATE_FALLBACK as i32,
/// `SSL_R_TLSV1_ALERT_USER_CANCELLED`
Tlsv1AlertUserCancelled = bssl_sys::SSL_R_TLSV1_ALERT_USER_CANCELLED as i32,
/// `SSL_R_TLSV1_ALERT_NO_RENEGOTIATION`
Tlsv1AlertNoRenegotiation = bssl_sys::SSL_R_TLSV1_ALERT_NO_RENEGOTIATION as i32,
/// `SSL_R_TLSV1_ALERT_UNSUPPORTED_EXTENSION`
Tlsv1AlertUnsupportedExtension = bssl_sys::SSL_R_TLSV1_ALERT_UNSUPPORTED_EXTENSION as i32,
/// `SSL_R_TLSV1_ALERT_CERTIFICATE_UNOBTAINABLE`
Tlsv1AlertCertificateUnobtainable = bssl_sys::SSL_R_TLSV1_ALERT_CERTIFICATE_UNOBTAINABLE as i32,
/// `SSL_R_TLSV1_ALERT_UNRECOGNIZED_NAME`
Tlsv1AlertUnrecognizedName = bssl_sys::SSL_R_TLSV1_ALERT_UNRECOGNIZED_NAME as i32,
/// `SSL_R_TLSV1_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE`
Tlsv1AlertBadCertificateStatusResponse = bssl_sys::SSL_R_TLSV1_ALERT_BAD_CERTIFICATE_STATUS_RESPONSE as i32,
/// `SSL_R_TLSV1_ALERT_BAD_CERTIFICATE_HASH_VALUE`
Tlsv1AlertBadCertificateHashValue = bssl_sys::SSL_R_TLSV1_ALERT_BAD_CERTIFICATE_HASH_VALUE as i32,
/// `SSL_R_TLSV1_ALERT_UNKNOWN_PSK_IDENTITY`
Tlsv1AlertUnknownPskIdentity = bssl_sys::SSL_R_TLSV1_ALERT_UNKNOWN_PSK_IDENTITY as i32,
/// `SSL_R_TLSV1_ALERT_CERTIFICATE_REQUIRED`
Tlsv1AlertCertificateRequired = bssl_sys::SSL_R_TLSV1_ALERT_CERTIFICATE_REQUIRED as i32,
/// `SSL_R_TLSV1_ALERT_NO_APPLICATION_PROTOCOL`
Tlsv1AlertNoApplicationProtocol = bssl_sys::SSL_R_TLSV1_ALERT_NO_APPLICATION_PROTOCOL as i32,
/// `SSL_R_TLSV1_ALERT_ECH_REQUIRED`
Tlsv1AlertEchRequired = bssl_sys::SSL_R_TLSV1_ALERT_ECH_REQUIRED as i32,
/// `SSL_R_PAKE_AND_KEY_SHARE_NOT_ALLOWED`
PakeAndKeyShareNotAllowed = bssl_sys::SSL_R_PAKE_AND_KEY_SHARE_NOT_ALLOWED as i32,
}
}
impl Display for TlsErrorReason {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
Debug::fmt(self, f)
}
}
bssl_enum! {
/// TLS errors
#[derive(Debug, Clone, Copy)]
pub enum TlsRetryReason: i32 {
/// TLS is blocked on read.
WantRead = bssl_sys::SSL_ERROR_WANT_READ as i32,
/// TLS is blocked on write.
WantWrite = bssl_sys::SSL_ERROR_WANT_WRITE as i32,
/// Pending session.
/// Caller may retry the last operation when the session lookup is ready.
PendingSession = bssl_sys::SSL_ERROR_PENDING_SESSION as i32,
/// Pending certificate.
/// Caller may retry the last operation when the certificate lookup is ready.
PendingCertificate = bssl_sys::SSL_ERROR_PENDING_CERTIFICATE as i32,
/// Pending certification verification.
/// Caller may retry the last operation when the certification verification is ready.
PendingCertificateVerify = bssl_sys::SSL_ERROR_WANT_CERTIFICATE_VERIFY as i32,
/// Pending ticket.
/// Caller may retry the last operation when the ticket decryption is ready.
PendingTicket = bssl_sys::SSL_ERROR_PENDING_TICKET as i32,
/// End of stream, due to peer close_notify.
PeerCloseNotify = bssl_sys::SSL_ERROR_ZERO_RETURN as i32,
/// Want to (re)connect.
/// Caller may retry the last operation when the transport becomes ready.
WantConnect = bssl_sys::SSL_ERROR_WANT_CONNECT as i32,
/// Want to (re)accept.
/// Caller may retry the last operation when the transport becomes ready.
WantAccept = bssl_sys::SSL_ERROR_WANT_ACCEPT as i32,
/// Pending private key operation.
/// Caller may retry the last operation when the private key operation might be ready.
PendingPrivateKeyOperation = bssl_sys::SSL_ERROR_WANT_PRIVATE_KEY_OPERATION as i32,
/// Early data was rejected.
/// Caller may call `reset_early_data_reject` to start from a clean state.
EarlyDataRejected = bssl_sys::SSL_ERROR_EARLY_DATA_REJECTED as i32,
/// Handshake Hints becomes ready.
HandshakeHintsReady = bssl_sys::SSL_ERROR_HANDSHAKE_HINTS_READY as i32,
}
}
impl Display for TlsRetryReason {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
match self {
TlsRetryReason::WantRead => f.write_str("want to read"),
TlsRetryReason::WantWrite => f.write_str("want to write"),
TlsRetryReason::PendingSession => f.write_str("pending session"),
TlsRetryReason::PendingCertificate => f.write_str("pending certificate"),
TlsRetryReason::PendingTicket => f.write_str("pending ticket"),
TlsRetryReason::PendingCertificateVerify => f.write_str("pending certificate verify"),
TlsRetryReason::WantConnect => f.write_str("want to (re)connect connection"),
TlsRetryReason::WantAccept => f.write_str("want to (re)accept connection"),
TlsRetryReason::PendingPrivateKeyOperation => {
f.write_str("pending private key operation")
}
TlsRetryReason::EarlyDataRejected => f.write_str("early data rejected"),
TlsRetryReason::HandshakeHintsReady => f.write_str("handshake hints ready"),
TlsRetryReason::PeerCloseNotify => f.write_str("peer close notify"),
}
}
}
/// QUIC errors.
#[derive(Debug)]
pub enum QuicError {}
impl Display for QuicError {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
f.write_str("quic error")
}
}
/// I/O errors
#[derive(Debug)]
pub enum IoError {
/// Buffer sizes are too long.
TooLong,
/// Reached the end of stream.
EndOfStream,
/// Error during I/O operation in the underlying transport.
Transport(Box<dyn core::error::Error + Send + Sync>),
}
impl Display for IoError {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
match self {
IoError::TooLong => f.write_str("data too long"),
IoError::EndOfStream => f.write_str("end of stream"),
IoError::Transport(e) => write!(f, "transport: {e}"),
}
}
}