using System; namespace Org.BouncyCastle.Tls { /// RFC 5246 7.2. public abstract class AlertDescription { /// This message notifies the recipient that the sender will not send any more messages on this /// connection. /// /// Note that as of TLS 1.1, failure to properly close a connection no longer requires that a session not be /// resumed. This is a change from TLS 1.0 ("The session becomes unresumable if any connection is terminated /// without proper close_notify messages with level equal to warning.") to conform with widespread /// implementation practice. /// public const short close_notify = 0; /// An inappropriate message was received. /// /// This alert is always fatal and should never be observed in communication between proper implementations. /// public const short unexpected_message = 10; /// This alert is returned if a record is received with an incorrect MAC. /// /// This alert also MUST be returned if an alert is sent because a TLSCiphertext decrypted in an invalid way: /// either it wasn't an even multiple of the block length, or its padding values, when checked, weren't /// correct. This message is always fatal and should never be observed in communication between proper /// implementations (except when messages were corrupted in the network). /// public const short bad_record_mac = 20; /// /// This alert was used in some earlier versions of TLS, and may have permitted certain attacks against the CBC /// mode [CBCATT]. It MUST NOT be sent by compliant implementations. /// public const short decryption_failed = 21; /// A TLSCiphertext record was received that had a length more than 2^14+2048 bytes, or a record /// decrypted to a TLSCompressed record with more than 2^14+1024 bytes. /// /// This message is always fatal and should never be observed in communication between proper implementations /// (except when messages were corrupted in the network). /// public const short record_overflow = 22; /// The decompression function received improper input (e.g., data that would expand to excessive /// length). /// /// This message is always fatal and should never be observed in communication between proper implementations. /// public const short decompression_failure = 30; /// Reception of a handshake_failure alert message indicates that the sender was unable to negotiate /// an acceptable set of security parameters given the options available. /// /// This is a fatal error. /// public const short handshake_failure = 40; /// /// This alert was used in SSLv3 but not any version of TLS. It MUST NOT be sent by compliant implementations. /// public const short no_certificate = 41; /// A certificate was corrupt, contained signatures that did not verify correctly, etc. public const short bad_certificate = 42; /// A certificate was of an unsupported type. public const short unsupported_certificate = 43; /// A certificate was revoked by its signer. public const short certificate_revoked = 44; /// A certificate has expired or is not currently valid. public const short certificate_expired = 45; /// Some other (unspecified) issue arose in processing the certificate, rendering it unacceptable. /// public const short certificate_unknown = 46; /// A field in the handshake was out of range or inconsistent with other fields. /// /// This message is always fatal. /// public const short illegal_parameter = 47; /// A valid certificate chain or partial chain was received, but the certificate was not accepted /// because the CA certificate could not be located or couldn't be matched with a known, trusted CA. /// /// This message is always fatal. /// public const short unknown_ca = 48; /// A valid certificate was received, but when access control was applied, the sender decided not to /// proceed with negotiation. /// /// This message is always fatal. /// public const short access_denied = 49; /// A message could not be decoded because some field was out of the specified range or the length of /// the message was incorrect. /// /// This message is always fatal and should never be observed in communication between proper /// implementations (except when messages were corrupted in the network). /// public const short decode_error = 50; /// A handshake cryptographic operation failed, including being unable to correctly verify a signature /// or validate a Finished message. /// /// This message is always fatal. /// public const short decrypt_error = 51; /// /// This alert was used in some earlier versions of TLS. It MUST NOT be sent by compliant implementations. /// public const short export_restriction = 60; /// The protocol version the client has attempted to negotiate is recognized but not supported. /// /// /// (For example, old protocol versions might be avoided for security reasons.) This message is always fatal. /// public const short protocol_version = 70; /// Returned instead of handshake_failure when a negotiation has failed specifically because the /// server requires ciphers more secure than those supported by the client. /// /// This message is always fatal. /// public const short insufficient_security = 71; /// An internal error unrelated to the peer or the correctness of the protocol (such as a memory /// allocation failure) makes it impossible to continue. /// /// This message is always fatal. /// public const short internal_error = 80; /// This handshake is being canceled for some reason unrelated to a protocol failure. /// /// If the user cancels an operation after the handshake is complete, just closing the connection by sending a /// close_notify is more appropriate. This alert should be followed by a close_notify. This message is /// generally a warning. /// public const short user_canceled = 90; /// Sent by the client in response to a hello request or by the server in response to a client hello /// after initial handshaking. /// /// Either of these would normally lead to renegotiation; when that is not appropriate, the recipient should /// respond with this alert. At that point, the original requester can decide whether to proceed with the /// connection. One case where this would be appropriate is where a server has spawned a process to satisfy a /// request; the process might receive security parameters (key length, authentication, etc.) at startup, and /// it might be difficult to communicate changes to these parameters after that point. This message is always a /// warning. /// public const short no_renegotiation = 100; /// Sent by clients that receive an extended server hello containing an extension that they did not /// put in the corresponding client hello. /// /// This message is always fatal. /// public const short unsupported_extension = 110; /* * RFC 3546 */ /// This alert is sent by servers who are unable to retrieve a certificate chain from the URL supplied /// by the client(see Section 3.3). /// /// This message MAY be fatal - for example if client authentication is required by the server for the /// handshake to continue and the server is unable to retrieve the certificate chain, it may send a fatal /// alert. /// public const short certificate_unobtainable = 111; /// This alert is sent by servers that receive a server_name extension request, but do not recognize /// the server name. /// /// This message MAY be fatal. /// public const short unrecognized_name = 112; /// This alert is sent by clients that receive an invalid certificate status response (see Section 3.6 /// ). /// /// This message is always fatal. /// public const short bad_certificate_status_response = 113; /// This alert is sent by servers when a certificate hash does not match a client provided /// certificate_hash. /// /// This message is always fatal. /// public const short bad_certificate_hash_value = 114; /* * RFC 4279 */ /// If the server does not recognize the PSK identity, it MAY respond with an "unknown_psk_identity" /// alert message. public const short unknown_psk_identity = 115; /* * RFC 7301 */ /// In the event that the server supports no protocols that the client advertises, then the server /// SHALL respond with a fatal "no_application_protocol" alert. public const short no_application_protocol = 120; /* * RFC 7507 */ /// If TLS_FALLBACK_SCSV appears in ClientHello.cipher_suites and the highest protocol version /// supported by the server is higher than the version indicated in ClientHello.client_version, the server MUST /// respond with a fatal inappropriate_fallback alert[..]. public const short inappropriate_fallback = 86; /* * RFC 8446 */ /// Sent by endpoints that receive a handshake message not containing an extension that is mandatory /// to send for the offered TLS version or other negotiated parameters. public const short missing_extension = 109; /// Sent by servers when a client certificate is desired but none was provided by the client. /// public const short certificate_required = 116; public static string GetName(short alertDescription) { switch (alertDescription) { case close_notify: return "close_notify"; case unexpected_message: return "unexpected_message"; case bad_record_mac: return "bad_record_mac"; case decryption_failed: return "decryption_failed"; case record_overflow: return "record_overflow"; case decompression_failure: return "decompression_failure"; case handshake_failure: return "handshake_failure"; case no_certificate: return "no_certificate"; case bad_certificate: return "bad_certificate"; case unsupported_certificate: return "unsupported_certificate"; case certificate_revoked: return "certificate_revoked"; case certificate_expired: return "certificate_expired"; case certificate_unknown: return "certificate_unknown"; case illegal_parameter: return "illegal_parameter"; case unknown_ca: return "unknown_ca"; case access_denied: return "access_denied"; case decode_error: return "decode_error"; case decrypt_error: return "decrypt_error"; case export_restriction: return "export_restriction"; case protocol_version: return "protocol_version"; case insufficient_security: return "insufficient_security"; case internal_error: return "internal_error"; case user_canceled: return "user_canceled"; case no_renegotiation: return "no_renegotiation"; case unsupported_extension: return "unsupported_extension"; case certificate_unobtainable: return "certificate_unobtainable"; case unrecognized_name: return "unrecognized_name"; case bad_certificate_status_response: return "bad_certificate_status_response"; case bad_certificate_hash_value: return "bad_certificate_hash_value"; case unknown_psk_identity: return "unknown_psk_identity"; case no_application_protocol: return "no_application_protocol"; case inappropriate_fallback: return "inappropriate_fallback"; case missing_extension: return "missing_extension"; case certificate_required: return "certificate_required"; default: return "UNKNOWN"; } } public static string GetText(short alertDescription) { return GetName(alertDescription) + "(" + alertDescription + ")"; } } }