use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
#[non_exhaustive]
pub enum AlertDescription {
CloseNotify,
UnexpectedMessage,
BadRecordMac,
RecordOverflow,
HandshakeFailure,
BadCertificate,
UnsupportedCertificate,
CertificateRevoked,
CertificateExpired,
CertificateUnknown,
IllegalParameter,
UnknownCa,
AccessDenied,
DecodeError,
DecryptError,
ProtocolVersion,
InsufficientSecurity,
InternalError,
InappropriateFallback,
UserCanceled,
MissingExtension,
UnsupportedExtension,
UnrecognizedName,
BadCertificateStatusResponse,
UnknownPskIdentity,
CertificateRequired,
NoApplicationProtocol,
Unknown(u8),
}
impl AlertDescription {
pub fn to_u8(&self) -> u8 {
match self {
AlertDescription::CloseNotify => 0,
AlertDescription::UnexpectedMessage => 10,
AlertDescription::BadRecordMac => 20,
AlertDescription::RecordOverflow => 22,
AlertDescription::HandshakeFailure => 40,
AlertDescription::BadCertificate => 42,
AlertDescription::UnsupportedCertificate => 43,
AlertDescription::CertificateRevoked => 44,
AlertDescription::CertificateExpired => 45,
AlertDescription::CertificateUnknown => 46,
AlertDescription::IllegalParameter => 47,
AlertDescription::UnknownCa => 48,
AlertDescription::AccessDenied => 49,
AlertDescription::DecodeError => 50,
AlertDescription::DecryptError => 51,
AlertDescription::ProtocolVersion => 70,
AlertDescription::InsufficientSecurity => 71,
AlertDescription::InternalError => 80,
AlertDescription::InappropriateFallback => 86,
AlertDescription::UserCanceled => 90,
AlertDescription::MissingExtension => 109,
AlertDescription::UnsupportedExtension => 110,
AlertDescription::UnrecognizedName => 112,
AlertDescription::BadCertificateStatusResponse => 113,
AlertDescription::UnknownPskIdentity => 115,
AlertDescription::CertificateRequired => 116,
AlertDescription::NoApplicationProtocol => 120,
AlertDescription::Unknown(code) => *code,
}
}
}
impl From<u8> for AlertDescription {
fn from(code: u8) -> Self {
match code {
0 => AlertDescription::CloseNotify,
10 => AlertDescription::UnexpectedMessage,
20 => AlertDescription::BadRecordMac,
22 => AlertDescription::RecordOverflow,
40 => AlertDescription::HandshakeFailure,
42 => AlertDescription::BadCertificate,
43 => AlertDescription::UnsupportedCertificate,
44 => AlertDescription::CertificateRevoked,
45 => AlertDescription::CertificateExpired,
46 => AlertDescription::CertificateUnknown,
47 => AlertDescription::IllegalParameter,
48 => AlertDescription::UnknownCa,
49 => AlertDescription::AccessDenied,
50 => AlertDescription::DecodeError,
51 => AlertDescription::DecryptError,
70 => AlertDescription::ProtocolVersion,
71 => AlertDescription::InsufficientSecurity,
80 => AlertDescription::InternalError,
86 => AlertDescription::InappropriateFallback,
90 => AlertDescription::UserCanceled,
109 => AlertDescription::MissingExtension,
110 => AlertDescription::UnsupportedExtension,
112 => AlertDescription::UnrecognizedName,
113 => AlertDescription::BadCertificateStatusResponse,
115 => AlertDescription::UnknownPskIdentity,
116 => AlertDescription::CertificateRequired,
120 => AlertDescription::NoApplicationProtocol,
other => AlertDescription::Unknown(other),
}
}
}
impl fmt::Display for AlertDescription {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
AlertDescription::CloseNotify => write!(f, "close_notify"),
AlertDescription::UnexpectedMessage => write!(f, "unexpected_message"),
AlertDescription::BadRecordMac => write!(f, "bad_record_mac"),
AlertDescription::RecordOverflow => write!(f, "record_overflow"),
AlertDescription::HandshakeFailure => write!(f, "handshake_failure"),
AlertDescription::BadCertificate => write!(f, "bad_certificate"),
AlertDescription::UnsupportedCertificate => write!(f, "unsupported_certificate"),
AlertDescription::CertificateRevoked => write!(f, "certificate_revoked"),
AlertDescription::CertificateExpired => write!(f, "certificate_expired"),
AlertDescription::CertificateUnknown => write!(f, "certificate_unknown"),
AlertDescription::IllegalParameter => write!(f, "illegal_parameter"),
AlertDescription::UnknownCa => write!(f, "unknown_ca"),
AlertDescription::AccessDenied => write!(f, "access_denied"),
AlertDescription::DecodeError => write!(f, "decode_error"),
AlertDescription::DecryptError => write!(f, "decrypt_error"),
AlertDescription::ProtocolVersion => write!(f, "protocol_version"),
AlertDescription::InsufficientSecurity => write!(f, "insufficient_security"),
AlertDescription::InternalError => write!(f, "internal_error"),
AlertDescription::InappropriateFallback => write!(f, "inappropriate_fallback"),
AlertDescription::UserCanceled => write!(f, "user_canceled"),
AlertDescription::MissingExtension => write!(f, "missing_extension"),
AlertDescription::UnsupportedExtension => write!(f, "unsupported_extension"),
AlertDescription::UnrecognizedName => write!(f, "unrecognized_name"),
AlertDescription::BadCertificateStatusResponse => {
write!(f, "bad_certificate_status_response")
}
AlertDescription::UnknownPskIdentity => write!(f, "unknown_psk_identity"),
AlertDescription::CertificateRequired => write!(f, "certificate_required"),
AlertDescription::NoApplicationProtocol => write!(f, "no_application_protocol"),
AlertDescription::Unknown(code) => write!(f, "unknown_alert({code})"),
}
}
}