mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 22:02:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			981 lines
		
	
	
	
		
			55 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			981 lines
		
	
	
	
		
			55 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /*
 | |
|  * Copyright (c) 2020, Ali Mohammad Pur <mpfard@serenityos.org>
 | |
|  * Copyright (c) 2023, stelar7 <dudedbz@gmail.com>
 | |
|  *
 | |
|  * SPDX-License-Identifier: BSD-2-Clause
 | |
|  */
 | |
| 
 | |
| #pragma once
 | |
| 
 | |
| #include <AK/Types.h>
 | |
| 
 | |
| namespace TLS {
 | |
| 
 | |
| #define _ENUM_KEY(name) name,
 | |
| #define _ENUM_KEY_VALUE(name, value) name = value,
 | |
| 
 | |
| // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-5
 | |
| #define __ENUM_CONTENT_TYPES                \
 | |
|     _ENUM_KEY_VALUE(CHANGE_CIPHER_SPEC, 20) \
 | |
|     _ENUM_KEY_VALUE(ALERT, 21)              \
 | |
|     _ENUM_KEY_VALUE(HANDSHAKE, 22)          \
 | |
|     _ENUM_KEY_VALUE(APPLICATION_DATA, 23)   \
 | |
|     _ENUM_KEY_VALUE(HEARTBEAT, 24)          \
 | |
|     _ENUM_KEY_VALUE(TLS12_CID, 25)          \
 | |
|     _ENUM_KEY_VALUE(ACK, 26)
 | |
| 
 | |
| enum class ContentType : u8 {
 | |
|     __ENUM_CONTENT_TYPES
 | |
| };
 | |
| 
 | |
| #define __ENUM_PROTOCOL_VERSIONS         \
 | |
|     _ENUM_KEY_VALUE(VERSION_1_3, 0x0304) \
 | |
|     _ENUM_KEY_VALUE(VERSION_1_2, 0x0303) \
 | |
|     _ENUM_KEY_VALUE(VERSION_1_1, 0x0302) \
 | |
|     _ENUM_KEY_VALUE(VERSION_1_0, 0x0301) \
 | |
|     _ENUM_KEY_VALUE(GREASE_0, 0x0A0A)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_1, 0x1A1A)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_2, 0x2A2A)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_3, 0x3A3A)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_4, 0x4A4A)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_5, 0x5A5A)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_6, 0x6A6A)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_7, 0x7A7A)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_8, 0x8A8A)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_9, 0x9A9A)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_A, 0xAAAA)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_B, 0xBABA)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_C, 0xCACA)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_D, 0xDADA)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_E, 0xEAEA)    \
 | |
|     _ENUM_KEY_VALUE(GREASE_F, 0xFAFA)
 | |
| 
 | |
| enum class ProtocolVersion : u16 {
 | |
|     __ENUM_PROTOCOL_VERSIONS
 | |
| };
 | |
| 
 | |
| #define __ENUM_ALERT_LEVELS     \
 | |
|     _ENUM_KEY_VALUE(WARNING, 1) \
 | |
|     _ENUM_KEY_VALUE(FATAL, 2)
 | |
| 
 | |
| enum class AlertLevel : u8 {
 | |
|     __ENUM_ALERT_LEVELS
 | |
| };
 | |
| 
 | |
| // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-7
 | |
| #define __ENUM_HANDSHAKE_TYPES                        \
 | |
|     _ENUM_KEY_VALUE(HELLO_REQUEST_RESERVED, 0)        \
 | |
|     _ENUM_KEY_VALUE(CLIENT_HELLO, 1)                  \
 | |
|     _ENUM_KEY_VALUE(SERVER_HELLO, 2)                  \
 | |
|     _ENUM_KEY_VALUE(HELLO_VERIFY_REQUEST_RESERVED, 3) \
 | |
|     _ENUM_KEY_VALUE(NEW_SESSION_TICKET, 4)            \
 | |
|     _ENUM_KEY_VALUE(END_OF_EARLY_DATA, 5)             \
 | |
|     _ENUM_KEY_VALUE(HELLO_RETRY_REQUEST_RESERVED, 6)  \
 | |
|     _ENUM_KEY_VALUE(ENCRYPTED_EXTENSIONS, 8)          \
 | |
|     _ENUM_KEY_VALUE(REQUEST_CONNECTION_ID, 9)         \
 | |
|     _ENUM_KEY_VALUE(NEW_CONNECTION_ID, 10)            \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE, 11)                  \
 | |
|     _ENUM_KEY_VALUE(SERVER_KEY_EXCHANGE_RESERVED, 12) \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE_REQUEST, 13)          \
 | |
|     _ENUM_KEY_VALUE(SERVER_HELLO_DONE_RESERVED, 14)   \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE_VERIFY, 15)           \
 | |
|     _ENUM_KEY_VALUE(CLIENT_KEY_EXCHANGE_RESERVED, 16) \
 | |
|     _ENUM_KEY_VALUE(FINISHED, 20)                     \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE_URL_RESERVED, 21)     \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE_STATUS_RESERVED, 22)  \
 | |
|     _ENUM_KEY_VALUE(SUPPLEMENTAL_DATA_RESERVED, 23)   \
 | |
|     _ENUM_KEY_VALUE(KEY_UPDATE, 24)                   \
 | |
|     _ENUM_KEY_VALUE(COMPRESSED_CERTIFICATE, 25)       \
 | |
|     _ENUM_KEY_VALUE(EKT_KEY, 26)                      \
 | |
|     _ENUM_KEY_VALUE(MESSAGE_HASH, 254)
 | |
| 
 | |
| enum class HandshakeType : u8 {
 | |
|     __ENUM_HANDSHAKE_TYPES
 | |
| };
 | |
| 
 | |
| // https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#tls-extensiontype-values-1
 | |
| #define __ENUM_EXTENSION_TYPES                                  \
 | |
|     _ENUM_KEY_VALUE(SERVER_NAME, 0)                             \
 | |
|     _ENUM_KEY_VALUE(MAX_FRAGMENT_LENGTH, 1)                     \
 | |
|     _ENUM_KEY_VALUE(CLIENT_CERTIFICATE_URL, 2)                  \
 | |
|     _ENUM_KEY_VALUE(TRUSTED_CA_KEYS, 3)                         \
 | |
|     _ENUM_KEY_VALUE(TRUNCATED_HMAC, 4)                          \
 | |
|     _ENUM_KEY_VALUE(STATUS_REQUEST, 5)                          \
 | |
|     _ENUM_KEY_VALUE(USER_MAPPING, 6)                            \
 | |
|     _ENUM_KEY_VALUE(CLIENT_AUTHZ, 7)                            \
 | |
|     _ENUM_KEY_VALUE(SERVER_AUTHZ, 8)                            \
 | |
|     _ENUM_KEY_VALUE(CERT_TYPE, 9)                               \
 | |
|     _ENUM_KEY_VALUE(SUPPORTED_GROUPS, 10)                       \
 | |
|     _ENUM_KEY_VALUE(EC_POINT_FORMATS, 11)                       \
 | |
|     _ENUM_KEY_VALUE(SRP, 12)                                    \
 | |
|     _ENUM_KEY_VALUE(SIGNATURE_ALGORITHMS, 13)                   \
 | |
|     _ENUM_KEY_VALUE(USE_SRTP, 14)                               \
 | |
|     _ENUM_KEY_VALUE(HEARTBEAT, 15)                              \
 | |
|     _ENUM_KEY_VALUE(APPLICATION_LAYER_PROTOCOL_NEGOTIATION, 16) \
 | |
|     _ENUM_KEY_VALUE(STATUS_REQUEST_V2, 17)                      \
 | |
|     _ENUM_KEY_VALUE(SIGNED_CERTIFICATE_TIMESTAMP, 18)           \
 | |
|     _ENUM_KEY_VALUE(CLIENT_CERTIFICATE_TYPE, 19)                \
 | |
|     _ENUM_KEY_VALUE(SERVER_CERTIFICATE_TYPE, 20)                \
 | |
|     _ENUM_KEY_VALUE(PADDING, 21)                                \
 | |
|     _ENUM_KEY_VALUE(ENCRYPT_THEN_MAC, 22)                       \
 | |
|     _ENUM_KEY_VALUE(EXTENDED_MASTER_SECRET, 23)                 \
 | |
|     _ENUM_KEY_VALUE(TOKEN_BINDING, 24)                          \
 | |
|     _ENUM_KEY_VALUE(CACHED_INFO, 25)                            \
 | |
|     _ENUM_KEY_VALUE(TLS_LTS, 26)                                \
 | |
|     _ENUM_KEY_VALUE(COMPRESS_CERTIFICATE, 27)                   \
 | |
|     _ENUM_KEY_VALUE(RECORD_SIZE_LIMIT, 28)                      \
 | |
|     _ENUM_KEY_VALUE(PWD_PROTECT, 29)                            \
 | |
|     _ENUM_KEY_VALUE(PWD_CLEAR, 30)                              \
 | |
|     _ENUM_KEY_VALUE(PASSWORD_SALT, 31)                          \
 | |
|     _ENUM_KEY_VALUE(TICKET_PINNING, 32)                         \
 | |
|     _ENUM_KEY_VALUE(TLS_CERT_WITH_EXTERN_PSK, 33)               \
 | |
|     _ENUM_KEY_VALUE(DELEGATED_CREDENTIALS, 34)                  \
 | |
|     _ENUM_KEY_VALUE(SESSION_TICKET, 35)                         \
 | |
|     _ENUM_KEY_VALUE(TLMSP, 36)                                  \
 | |
|     _ENUM_KEY_VALUE(TLMSP_PROXYING, 37)                         \
 | |
|     _ENUM_KEY_VALUE(TLMSP_DELEGATE, 38)                         \
 | |
|     _ENUM_KEY_VALUE(SUPPORTED_EKT_CIPHERS, 39)                  \
 | |
|     _ENUM_KEY_VALUE(PRE_SHARED_KEY, 41)                         \
 | |
|     _ENUM_KEY_VALUE(EARLY_DATA, 42)                             \
 | |
|     _ENUM_KEY_VALUE(SUPPORTED_VERSIONS, 43)                     \
 | |
|     _ENUM_KEY_VALUE(COOKIE, 44)                                 \
 | |
|     _ENUM_KEY_VALUE(PSK_KEY_EXCHANGE_MODES, 45)                 \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE_AUTHORITIES, 47)                \
 | |
|     _ENUM_KEY_VALUE(OID_FILTERS, 48)                            \
 | |
|     _ENUM_KEY_VALUE(POST_HANDSHAKE_AUTH, 49)                    \
 | |
|     _ENUM_KEY_VALUE(SIGNATURE_ALGORITHMS_CERT, 50)              \
 | |
|     _ENUM_KEY_VALUE(KEY_SHARE, 51)                              \
 | |
|     _ENUM_KEY_VALUE(TRANSPARENCY_INFO, 52)                      \
 | |
|     _ENUM_KEY_VALUE(CONNECTION_ID_DEPRECATED, 53)               \
 | |
|     _ENUM_KEY_VALUE(CONNECTION_ID, 54)                          \
 | |
|     _ENUM_KEY_VALUE(EXTERNAL_ID_HASH, 55)                       \
 | |
|     _ENUM_KEY_VALUE(EXTERNAL_SESSION_ID, 56)                    \
 | |
|     _ENUM_KEY_VALUE(QUIC_TRANSPORT_PARAMETERS, 57)              \
 | |
|     _ENUM_KEY_VALUE(TICKET_REQUEST, 58)                         \
 | |
|     _ENUM_KEY_VALUE(DNSSEC_CHAIN, 59)                           \
 | |
|     _ENUM_KEY_VALUE(RENEGOTIATION_INFO, 65281)
 | |
| 
 | |
| enum class ExtensionType : u16 {
 | |
|     __ENUM_EXTENSION_TYPES
 | |
| };
 | |
| 
 | |
| #define __ENUM_NAME_TYPES \
 | |
|     _ENUM_KEY_VALUE(HOST_NAME, 0)
 | |
| 
 | |
| enum class NameType : u8 {
 | |
|     __ENUM_NAME_TYPES
 | |
| };
 | |
| 
 | |
| // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-10
 | |
| #define __ENUM_EC_CURVE_TYPES          \
 | |
|     _ENUM_KEY_VALUE(EXPLICIT_PRIME, 1) \
 | |
|     _ENUM_KEY_VALUE(EXPLICIT_CHAR2, 2) \
 | |
|     _ENUM_KEY_VALUE(NAMED_CURVE, 3)
 | |
| 
 | |
| enum class ECCurveType : u8 {
 | |
|     __ENUM_EC_CURVE_TYPES
 | |
| };
 | |
| 
 | |
| // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8
 | |
| #define __ENUM_SUPPORTED_GROUPS                              \
 | |
|     _ENUM_KEY_VALUE(SECT163K1, 0x0001)                       \
 | |
|     _ENUM_KEY_VALUE(SECT163R1, 0x0002)                       \
 | |
|     _ENUM_KEY_VALUE(SECT163R2, 0x0003)                       \
 | |
|     _ENUM_KEY_VALUE(SECT193R1, 0x0004)                       \
 | |
|     _ENUM_KEY_VALUE(SECT193R2, 0x0005)                       \
 | |
|     _ENUM_KEY_VALUE(SECT233K1, 0x0006)                       \
 | |
|     _ENUM_KEY_VALUE(SECT233R1, 0x0007)                       \
 | |
|     _ENUM_KEY_VALUE(SECT239K1, 0x0008)                       \
 | |
|     _ENUM_KEY_VALUE(SECT283K1, 0x0009)                       \
 | |
|     _ENUM_KEY_VALUE(SECT283R1, 0x000a)                       \
 | |
|     _ENUM_KEY_VALUE(SECT409K1, 0x000b)                       \
 | |
|     _ENUM_KEY_VALUE(SECT409R1, 0x000c)                       \
 | |
|     _ENUM_KEY_VALUE(SECT571K1, 0x000d)                       \
 | |
|     _ENUM_KEY_VALUE(SECT571R1, 0x000e)                       \
 | |
|     _ENUM_KEY_VALUE(SECP160K1, 0x000f)                       \
 | |
|     _ENUM_KEY_VALUE(SECP160R1, 0x0010)                       \
 | |
|     _ENUM_KEY_VALUE(SECP160R2, 0x0011)                       \
 | |
|     _ENUM_KEY_VALUE(SECP192K1, 0x0012)                       \
 | |
|     _ENUM_KEY_VALUE(SECP192R1, 0x0013)                       \
 | |
|     _ENUM_KEY_VALUE(SECP224K1, 0x0014)                       \
 | |
|     _ENUM_KEY_VALUE(SECP224R1, 0x0015)                       \
 | |
|     _ENUM_KEY_VALUE(SECP256K1, 0x0016)                       \
 | |
|     _ENUM_KEY_VALUE(SECP256R1, 0x0017)                       \
 | |
|     _ENUM_KEY_VALUE(SECP384R1, 0x0018)                       \
 | |
|     _ENUM_KEY_VALUE(SECP521R1, 0x0019)                       \
 | |
|     _ENUM_KEY_VALUE(BRAINPOOLP256R1, 0x001a)                 \
 | |
|     _ENUM_KEY_VALUE(BRAINPOOLP384R1, 0x001b)                 \
 | |
|     _ENUM_KEY_VALUE(BRAINPOOLP512R1, 0x001c)                 \
 | |
|     _ENUM_KEY_VALUE(X25519, 0x001d)                          \
 | |
|     _ENUM_KEY_VALUE(X448, 0x001e)                            \
 | |
|     _ENUM_KEY_VALUE(BRAINPOOLP256R1TLS13, 0x001f)            \
 | |
|     _ENUM_KEY_VALUE(BRAINPOOLP384R1TLS13, 0x0020)            \
 | |
|     _ENUM_KEY_VALUE(BRAINPOOLP512R1TLS13, 0x0021)            \
 | |
|     _ENUM_KEY_VALUE(GC256A, 0x0022)                          \
 | |
|     _ENUM_KEY_VALUE(GC256B, 0x0023)                          \
 | |
|     _ENUM_KEY_VALUE(GC256C, 0x0024)                          \
 | |
|     _ENUM_KEY_VALUE(GC256D, 0x0025)                          \
 | |
|     _ENUM_KEY_VALUE(GC512A, 0x0026)                          \
 | |
|     _ENUM_KEY_VALUE(GC512B, 0x0027)                          \
 | |
|     _ENUM_KEY_VALUE(GC512C, 0x0028)                          \
 | |
|     _ENUM_KEY_VALUE(CURVESM2, 0x0029)                        \
 | |
|     _ENUM_KEY_VALUE(FFDHE2048, 0x0100)                       \
 | |
|     _ENUM_KEY_VALUE(FFDHE3072, 0x0101)                       \
 | |
|     _ENUM_KEY_VALUE(FFDHE4096, 0x0102)                       \
 | |
|     _ENUM_KEY_VALUE(FFDHE6144, 0x0103)                       \
 | |
|     _ENUM_KEY_VALUE(FFDHE8192, 0x0104)                       \
 | |
|     _ENUM_KEY_VALUE(ARBITRARY_EXPLICIT_PRIME_CURVES, 0xff01) \
 | |
|     _ENUM_KEY_VALUE(ARBITRARY_EXPLICIT_CHAR2_CURVES, 0xff02) \
 | |
|     _ENUM_KEY_VALUE(GREASE_0, 0x0A0A)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_1, 0x1A1A)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_2, 0x2A2A)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_3, 0x3A3A)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_4, 0x4A4A)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_5, 0x5A5A)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_6, 0x6A6A)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_7, 0x7A7A)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_8, 0x8A8A)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_9, 0x9A9A)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_A, 0xAAAA)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_B, 0xBABA)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_C, 0xCACA)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_D, 0xDADA)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_E, 0xEAEA)                        \
 | |
|     _ENUM_KEY_VALUE(GREASE_F, 0xFAFA)
 | |
| 
 | |
| enum class SupportedGroup : u16 {
 | |
|     __ENUM_SUPPORTED_GROUPS
 | |
| };
 | |
| 
 | |
| // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-9
 | |
| #define __ENUM_EC_POINT_FORMATS                   \
 | |
|     _ENUM_KEY_VALUE(UNCOMPRESSED, 0)              \
 | |
|     _ENUM_KEY_VALUE(ANSIX962_COMPRESSED_PRIME, 1) \
 | |
|     _ENUM_KEY_VALUE(ANSIX962_COMPRESSED_CHAR2, 2)
 | |
| 
 | |
| enum class ECPointFormat : u8 {
 | |
|     __ENUM_EC_POINT_FORMATS
 | |
| };
 | |
| 
 | |
| // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-16
 | |
| #define __ENUM_SIGNATURE_ALGORITHM         \
 | |
|     _ENUM_KEY_VALUE(ANONYMOUS, 0)          \
 | |
|     _ENUM_KEY_VALUE(RSA, 1)                \
 | |
|     _ENUM_KEY_VALUE(DSA, 2)                \
 | |
|     _ENUM_KEY_VALUE(ECDSA, 3)              \
 | |
|     _ENUM_KEY_VALUE(ED25519, 7)            \
 | |
|     _ENUM_KEY_VALUE(ED448, 8)              \
 | |
|     _ENUM_KEY_VALUE(GOSTR34102012_256, 64) \
 | |
|     _ENUM_KEY_VALUE(GOSTR34102012_512, 65)
 | |
| 
 | |
| enum class SignatureAlgorithm : u8 {
 | |
|     __ENUM_SIGNATURE_ALGORITHM
 | |
| };
 | |
| 
 | |
| // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-18
 | |
| #define __ENUM_HASH_ALGORITHM  \
 | |
|     _ENUM_KEY_VALUE(NONE, 0)   \
 | |
|     _ENUM_KEY_VALUE(MD5, 1)    \
 | |
|     _ENUM_KEY_VALUE(SHA1, 2)   \
 | |
|     _ENUM_KEY_VALUE(SHA224, 3) \
 | |
|     _ENUM_KEY_VALUE(SHA256, 4) \
 | |
|     _ENUM_KEY_VALUE(SHA384, 5) \
 | |
|     _ENUM_KEY_VALUE(SHA512, 6) \
 | |
|     _ENUM_KEY_VALUE(INTRINSIC, 8)
 | |
| 
 | |
| enum class HashAlgorithm : u8 {
 | |
|     __ENUM_HASH_ALGORITHM
 | |
| };
 | |
| 
 | |
| // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4
 | |
| #define __ENUM_CIPHER_SUITES                                               \
 | |
|     _ENUM_KEY_VALUE(TLS_NULL_WITH_NULL_NULL, 0x0000)                       \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_NULL_MD5, 0x0001)                         \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_NULL_SHA, 0x0002)                         \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_EXPORT_WITH_RC4_40_MD5, 0x0003)                \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_RC4_128_MD5, 0x0004)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_RC4_128_SHA, 0x0005)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5, 0x0006)            \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_IDEA_CBC_SHA, 0x0007)                     \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_EXPORT_WITH_DES40_CBC_SHA, 0x0008)             \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_DES_CBC_SHA, 0x0009)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_3DES_EDE_CBC_SHA, 0x000A)                 \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA, 0x000B)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_DES_CBC_SHA, 0x000C)                   \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA, 0x000D)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA, 0x000E)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_DES_CBC_SHA, 0x000F)                   \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA, 0x0010)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, 0x0011)         \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_DES_CBC_SHA, 0x0012)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 0x0013)             \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, 0x0014)         \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_DES_CBC_SHA, 0x0015)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 0x0016)             \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_EXPORT_WITH_RC4_40_MD5, 0x0017)            \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_RC4_128_MD5, 0x0018)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA, 0x0019)         \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_DES_CBC_SHA, 0x001A)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_3DES_EDE_CBC_SHA, 0x001B)             \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_WITH_DES_CBC_SHA, 0x001E)                     \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_WITH_3DES_EDE_CBC_SHA, 0x001F)                \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_WITH_RC4_128_SHA, 0x0020)                     \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_WITH_IDEA_CBC_SHA, 0x0021)                    \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_WITH_DES_CBC_MD5, 0x0022)                     \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_WITH_3DES_EDE_CBC_MD5, 0x0023)                \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_WITH_RC4_128_MD5, 0x0024)                     \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_WITH_IDEA_CBC_MD5, 0x0025)                    \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA, 0x0026)           \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA, 0x0027)           \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_EXPORT_WITH_RC4_40_SHA, 0x0028)               \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5, 0x0029)           \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5, 0x002A)           \
 | |
|     _ENUM_KEY_VALUE(TLS_KRB5_EXPORT_WITH_RC4_40_MD5, 0x002B)               \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_NULL_SHA, 0x002C)                         \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_NULL_SHA, 0x002D)                     \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_NULL_SHA, 0x002E)                     \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_AES_128_CBC_SHA, 0x002F)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_AES_128_CBC_SHA, 0x0030)               \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_AES_128_CBC_SHA, 0x0031)               \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 0x0032)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 0x0033)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_AES_128_CBC_SHA, 0x0034)              \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_AES_256_CBC_SHA, 0x0035)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_AES_256_CBC_SHA, 0x0036)               \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_AES_256_CBC_SHA, 0x0037)               \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_AES_256_CBC_SHA, 0x0038)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_AES_256_CBC_SHA, 0x0039)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_AES_256_CBC_SHA, 0x003A)              \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_NULL_SHA256, 0x003B)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_AES_128_CBC_SHA256, 0x003C)               \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_AES_256_CBC_SHA256, 0x003D)               \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_AES_128_CBC_SHA256, 0x003E)            \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_AES_128_CBC_SHA256, 0x003F)            \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_AES_128_CBC_SHA256, 0x0040)           \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_CAMELLIA_128_CBC_SHA, 0x0041)             \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA, 0x0042)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA, 0x0043)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA, 0x0044)         \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA, 0x0045)         \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA, 0x0046)         \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, 0x0067)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_AES_256_CBC_SHA256, 0x0068)            \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_AES_256_CBC_SHA256, 0x0069)            \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_AES_256_CBC_SHA256, 0x006A)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, 0x006B)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_AES_128_CBC_SHA256, 0x006C)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_AES_256_CBC_SHA256, 0x006D)           \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_CAMELLIA_256_CBC_SHA, 0x0084)             \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA, 0x0085)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA, 0x0086)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA, 0x0087)         \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA, 0x0088)         \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA, 0x0089)         \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_RC4_128_SHA, 0x008A)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_3DES_EDE_CBC_SHA, 0x008B)                 \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_AES_128_CBC_SHA, 0x008C)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_AES_256_CBC_SHA, 0x008D)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_RC4_128_SHA, 0x008E)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA, 0x008F)             \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_AES_128_CBC_SHA, 0x0090)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_AES_256_CBC_SHA, 0x0091)              \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_RC4_128_SHA, 0x0092)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA, 0x0093)             \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_AES_128_CBC_SHA, 0x0094)              \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_AES_256_CBC_SHA, 0x0095)              \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_SEED_CBC_SHA, 0x0096)                     \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_SEED_CBC_SHA, 0x0097)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_SEED_CBC_SHA, 0x0098)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_SEED_CBC_SHA, 0x0099)                 \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_SEED_CBC_SHA, 0x009A)                 \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_SEED_CBC_SHA, 0x009B)                 \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_AES_128_GCM_SHA256, 0x009C)               \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_AES_256_GCM_SHA384, 0x009D)               \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, 0x009E)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, 0x009F)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_AES_128_GCM_SHA256, 0x00A0)            \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_AES_256_GCM_SHA384, 0x00A1)            \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_AES_128_GCM_SHA256, 0x00A2)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_AES_256_GCM_SHA384, 0x00A3)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_AES_128_GCM_SHA256, 0x00A4)            \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_AES_256_GCM_SHA384, 0x00A5)            \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_AES_128_GCM_SHA256, 0x00A6)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_AES_256_GCM_SHA384, 0x00A7)           \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_AES_128_GCM_SHA256, 0x00A8)               \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_AES_256_GCM_SHA384, 0x00A9)               \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_AES_128_GCM_SHA256, 0x00AA)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_AES_256_GCM_SHA384, 0x00AB)           \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_AES_128_GCM_SHA256, 0x00AC)           \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_AES_256_GCM_SHA384, 0x00AD)           \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_AES_128_CBC_SHA256, 0x00AE)               \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_AES_256_CBC_SHA384, 0x00AF)               \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_NULL_SHA256, 0x00B0)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_NULL_SHA384, 0x00B1)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_AES_128_CBC_SHA256, 0x00B2)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_AES_256_CBC_SHA384, 0x00B3)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_NULL_SHA256, 0x00B4)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_NULL_SHA384, 0x00B5)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_AES_128_CBC_SHA256, 0x00B6)           \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_AES_256_CBC_SHA384, 0x00B7)           \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_NULL_SHA256, 0x00B8)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_NULL_SHA384, 0x00B9)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256, 0x00BA)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256, 0x00BB)       \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256, 0x00BC)       \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256, 0x00BD)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, 0x00BE)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256, 0x00BF)      \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256, 0x00C0)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256, 0x00C1)       \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256, 0x00C2)       \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256, 0x00C3)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256, 0x00C4)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256, 0x00C5)      \
 | |
|     _ENUM_KEY_VALUE(TLS_SM4_GCM_SM3, 0x00C6)                               \
 | |
|     _ENUM_KEY_VALUE(TLS_SM4_CCM_SM3, 0x00C7)                               \
 | |
|     _ENUM_KEY_VALUE(TLS_EMPTY_RENEGOTIATION_INFO_SCSV, 0x00FF)             \
 | |
|     _ENUM_KEY_VALUE(TLS_AES_128_GCM_SHA256, 0x1301)                        \
 | |
|     _ENUM_KEY_VALUE(TLS_AES_256_GCM_SHA384, 0x1302)                        \
 | |
|     _ENUM_KEY_VALUE(TLS_CHACHA20_POLY1305_SHA256, 0x1303)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_AES_128_CCM_SHA256, 0x1304)                        \
 | |
|     _ENUM_KEY_VALUE(TLS_AES_128_CCM_8_SHA256, 0x1305)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_FALLBACK_SCSV, 0x5600)                             \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_NULL_SHA, 0xC001)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_RC4_128_SHA, 0xC002)               \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA, 0xC003)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA, 0xC004)           \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA, 0xC005)           \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_NULL_SHA, 0xC006)                 \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_RC4_128_SHA, 0xC007)              \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, 0xC008)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, 0xC009)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, 0xC00A)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_NULL_SHA, 0xC00B)                    \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_RC4_128_SHA, 0xC00C)                 \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA, 0xC00D)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_AES_128_CBC_SHA, 0xC00E)             \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_AES_256_CBC_SHA, 0xC00F)             \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_NULL_SHA, 0xC010)                   \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_RC4_128_SHA, 0xC011)                \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, 0xC012)           \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, 0xC013)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, 0xC014)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_anon_WITH_NULL_SHA, 0xC015)                   \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_anon_WITH_RC4_128_SHA, 0xC016)                \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA, 0xC017)           \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_anon_WITH_AES_128_CBC_SHA, 0xC018)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_anon_WITH_AES_256_CBC_SHA, 0xC019)            \
 | |
|     _ENUM_KEY_VALUE(TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA, 0xC01A)             \
 | |
|     _ENUM_KEY_VALUE(TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA, 0xC01B)         \
 | |
|     _ENUM_KEY_VALUE(TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA, 0xC01C)         \
 | |
|     _ENUM_KEY_VALUE(TLS_SRP_SHA_WITH_AES_128_CBC_SHA, 0xC01D)              \
 | |
|     _ENUM_KEY_VALUE(TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA, 0xC01E)          \
 | |
|     _ENUM_KEY_VALUE(TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA, 0xC01F)          \
 | |
|     _ENUM_KEY_VALUE(TLS_SRP_SHA_WITH_AES_256_CBC_SHA, 0xC020)              \
 | |
|     _ENUM_KEY_VALUE(TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA, 0xC021)          \
 | |
|     _ENUM_KEY_VALUE(TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA, 0xC022)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, 0xC023)       \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, 0xC024)       \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256, 0xC025)        \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384, 0xC026)        \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, 0xC027)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, 0xC028)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256, 0xC029)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384, 0xC02A)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, 0xC02B)       \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, 0xC02C)       \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256, 0xC02D)        \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384, 0xC02E)        \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, 0xC02F)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, 0xC030)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256, 0xC031)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384, 0xC032)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_RC4_128_SHA, 0xC033)                \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA, 0xC034)           \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA, 0xC035)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA, 0xC036)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256, 0xC037)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384, 0xC038)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_NULL_SHA, 0xC039)                   \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_NULL_SHA256, 0xC03A)                \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_NULL_SHA384, 0xC03B)                \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_ARIA_128_CBC_SHA256, 0xC03C)              \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_ARIA_256_CBC_SHA384, 0xC03D)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256, 0xC03E)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384, 0xC03F)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256, 0xC040)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384, 0xC041)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256, 0xC042)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384, 0xC043)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256, 0xC044)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384, 0xC045)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_ARIA_128_CBC_SHA256, 0xC046)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_ARIA_256_CBC_SHA384, 0xC047)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256, 0xC048)      \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384, 0xC049)      \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256, 0xC04A)       \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384, 0xC04B)       \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256, 0xC04C)        \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384, 0xC04D)        \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256, 0xC04E)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384, 0xC04F)         \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_ARIA_128_GCM_SHA256, 0xC050)              \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_ARIA_256_GCM_SHA384, 0xC051)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256, 0xC052)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384, 0xC053)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256, 0xC054)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384, 0xC055)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256, 0xC056)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384, 0xC057)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256, 0xC058)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384, 0xC059)           \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_ARIA_128_GCM_SHA256, 0xC05A)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_ARIA_256_GCM_SHA384, 0xC05B)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256, 0xC05C)      \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384, 0xC05D)      \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256, 0xC05E)       \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384, 0xC05F)       \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256, 0xC060)        \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384, 0xC061)        \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256, 0xC062)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384, 0xC063)         \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_ARIA_128_CBC_SHA256, 0xC064)              \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_ARIA_256_CBC_SHA384, 0xC065)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256, 0xC066)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384, 0xC067)          \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256, 0xC068)          \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384, 0xC069)          \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_ARIA_128_GCM_SHA256, 0xC06A)              \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_ARIA_256_GCM_SHA384, 0xC06B)              \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256, 0xC06C)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384, 0xC06D)          \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256, 0xC06E)          \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384, 0xC06F)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256, 0xC070)        \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384, 0xC071)        \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, 0xC072)  \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, 0xC073)  \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256, 0xC074)   \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384, 0xC075)   \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256, 0xC076)    \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384, 0xC077)    \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256, 0xC078)     \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384, 0xC079)     \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256, 0xC07A)          \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384, 0xC07B)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, 0xC07C)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, 0xC07D)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256, 0xC07E)       \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384, 0xC07F)       \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256, 0xC080)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384, 0xC081)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256, 0xC082)       \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384, 0xC083)       \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256, 0xC084)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384, 0xC085)      \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, 0xC086)  \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, 0xC087)  \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256, 0xC088)   \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384, 0xC089)   \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256, 0xC08A)    \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384, 0xC08B)    \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256, 0xC08C)     \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384, 0xC08D)     \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256, 0xC08E)          \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384, 0xC08F)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256, 0xC090)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384, 0xC091)      \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256, 0xC092)      \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384, 0xC093)      \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256, 0xC094)          \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384, 0xC095)          \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, 0xC096)      \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, 0xC097)      \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256, 0xC098)      \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384, 0xC099)      \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256, 0xC09A)    \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384, 0xC09B)    \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_AES_128_CCM, 0xC09C)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_AES_256_CCM, 0xC09D)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_AES_128_CCM, 0xC09E)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_AES_256_CCM, 0xC09F)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_AES_128_CCM_8, 0xC0A0)                    \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_WITH_AES_256_CCM_8, 0xC0A1)                    \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_AES_128_CCM_8, 0xC0A2)                \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_AES_256_CCM_8, 0xC0A3)                \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_AES_128_CCM, 0xC0A4)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_AES_256_CCM, 0xC0A5)                      \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_AES_128_CCM, 0xC0A6)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_AES_256_CCM, 0xC0A7)                  \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_AES_128_CCM_8, 0xC0A8)                    \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_AES_256_CCM_8, 0xC0A9)                    \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_DHE_WITH_AES_128_CCM_8, 0xC0AA)                \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_DHE_WITH_AES_256_CCM_8, 0xC0AB)                \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_AES_128_CCM, 0xC0AC)              \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_AES_256_CCM, 0xC0AD)              \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8, 0xC0AE)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8, 0xC0AF)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECCPWD_WITH_AES_128_GCM_SHA256, 0xC0B0)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECCPWD_WITH_AES_256_GCM_SHA384, 0xC0B1)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECCPWD_WITH_AES_128_CCM_SHA256, 0xC0B2)            \
 | |
|     _ENUM_KEY_VALUE(TLS_ECCPWD_WITH_AES_256_CCM_SHA384, 0xC0B3)            \
 | |
|     _ENUM_KEY_VALUE(TLS_SHA256_SHA256, 0xC0B4)                             \
 | |
|     _ENUM_KEY_VALUE(TLS_SHA384_SHA384, 0xC0B5)                             \
 | |
|     _ENUM_KEY_VALUE(TLS_GOSTR341112_256_WITH_KUZNYECHIK_CTR_OMAC, 0xC100)  \
 | |
|     _ENUM_KEY_VALUE(TLS_GOSTR341112_256_WITH_MAGMA_CTR_OMAC, 0xC101)       \
 | |
|     _ENUM_KEY_VALUE(TLS_GOSTR341112_256_WITH_28147_CNT_IMIT, 0xC102)       \
 | |
|     _ENUM_KEY_VALUE(TLS_GOSTR341112_256_WITH_KUZNYECHIK_MGM_L, 0xC103)     \
 | |
|     _ENUM_KEY_VALUE(TLS_GOSTR341112_256_WITH_MAGMA_MGM_L, 0xC104)          \
 | |
|     _ENUM_KEY_VALUE(TLS_GOSTR341112_256_WITH_KUZNYECHIK_MGM_S, 0xC105)     \
 | |
|     _ENUM_KEY_VALUE(TLS_GOSTR341112_256_WITH_MAGMA_MGM_S, 0xC106)          \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0xCCA8)   \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, 0xCCA9) \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256, 0xCCAA)     \
 | |
|     _ENUM_KEY_VALUE(TLS_PSK_WITH_CHACHA20_POLY1305_SHA256, 0xCCAB)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256, 0xCCAC)   \
 | |
|     _ENUM_KEY_VALUE(TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256, 0xCCAD)     \
 | |
|     _ENUM_KEY_VALUE(TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256, 0xCCAE)     \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_AES_128_GCM_SHA256, 0xD001)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_AES_256_GCM_SHA384, 0xD002)         \
 | |
|     _ENUM_KEY_VALUE(TLS_ECDHE_PSK_WITH_AES_128_CCM_8_SHA256, 0xD003)       \
 | |
|     _ENUM_KEY_VALUE(GREASE_0, 0x0A0A)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_1, 0x1A1A)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_2, 0x2A2A)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_3, 0x3A3A)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_4, 0x4A4A)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_5, 0x5A5A)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_6, 0x6A6A)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_7, 0x7A7A)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_8, 0x8A8A)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_9, 0x9A9A)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_A, 0xAAAA)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_B, 0xBABA)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_C, 0xCACA)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_D, 0XDADA)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_E, 0xEAEA)                                      \
 | |
|     _ENUM_KEY_VALUE(GREASE_F, 0xFAFA)
 | |
| 
 | |
| enum class CipherSuite : u16 {
 | |
|     __ENUM_CIPHER_SUITES
 | |
| };
 | |
| 
 | |
| // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-6
 | |
| #define __ENUM_ALERT_DESCRIPTIONS                             \
 | |
|     _ENUM_KEY_VALUE(CLOSE_NOTIFY, 0)                          \
 | |
|     _ENUM_KEY_VALUE(UNEXPECTED_MESSAGE, 10)                   \
 | |
|     _ENUM_KEY_VALUE(BAD_RECORD_MAC, 20)                       \
 | |
|     _ENUM_KEY_VALUE(DECRYPTION_FAILED_RESERVED, 21)           \
 | |
|     _ENUM_KEY_VALUE(RECORD_OVERFLOW, 22)                      \
 | |
|     _ENUM_KEY_VALUE(DECOMPRESSION_FAILURE_RESERVED, 30)       \
 | |
|     _ENUM_KEY_VALUE(HANDSHAKE_FAILURE, 40)                    \
 | |
|     _ENUM_KEY_VALUE(NO_CERTIFICATE_RESERVED, 41)              \
 | |
|     _ENUM_KEY_VALUE(BAD_CERTIFICATE, 42)                      \
 | |
|     _ENUM_KEY_VALUE(UNSUPPORTED_CERTIFICATE, 43)              \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE_REVOKED, 44)                  \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE_EXPIRED, 45)                  \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE_UNKNOWN, 46)                  \
 | |
|     _ENUM_KEY_VALUE(ILLEGAL_PARAMETER, 47)                    \
 | |
|     _ENUM_KEY_VALUE(UNKNOWN_CA, 48)                           \
 | |
|     _ENUM_KEY_VALUE(ACCESS_DENIED, 49)                        \
 | |
|     _ENUM_KEY_VALUE(DECODE_ERROR, 50)                         \
 | |
|     _ENUM_KEY_VALUE(DECRYPT_ERROR, 51)                        \
 | |
|     _ENUM_KEY_VALUE(TOO_MANY_CIDS_REQUESTED, 52)              \
 | |
|     _ENUM_KEY_VALUE(EXPORT_RESTRICTION_RESERVED, 60)          \
 | |
|     _ENUM_KEY_VALUE(PROTOCOL_VERSION, 70)                     \
 | |
|     _ENUM_KEY_VALUE(INSUFFICIENT_SECURITY, 71)                \
 | |
|     _ENUM_KEY_VALUE(INTERNAL_ERROR, 80)                       \
 | |
|     _ENUM_KEY_VALUE(INAPPROPRIATE_FALLBACK, 86)               \
 | |
|     _ENUM_KEY_VALUE(USER_CANCELED, 90)                        \
 | |
|     _ENUM_KEY_VALUE(NO_RENEGOTIATION_RESERVED, 100)           \
 | |
|     _ENUM_KEY_VALUE(MISSING_EXTENSION, 109)                   \
 | |
|     _ENUM_KEY_VALUE(UNSUPPORTED_EXTENSION, 110)               \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE_UNOBTAINABLE_RESERVED, 111)   \
 | |
|     _ENUM_KEY_VALUE(UNRECOGNIZED_NAME, 112)                   \
 | |
|     _ENUM_KEY_VALUE(BAD_CERTIFICATE_STATUS_RESPONSE, 113)     \
 | |
|     _ENUM_KEY_VALUE(BAD_CERTIFICATE_HASH_VALUE_RESERVED, 114) \
 | |
|     _ENUM_KEY_VALUE(UNKNOWN_PSK_IDENTITY, 115)                \
 | |
|     _ENUM_KEY_VALUE(CERTIFICATE_REQUIRED, 116)                \
 | |
|     _ENUM_KEY_VALUE(NO_APPLICATION_PROTOCOL, 120)
 | |
| 
 | |
| enum class AlertDescription : u8 {
 | |
|     __ENUM_ALERT_DESCRIPTIONS
 | |
| };
 | |
| 
 | |
| #undef _ENUM_KEY
 | |
| #undef _ENUM_KEY_VALUE
 | |
| 
 | |
| constexpr static StringView enum_to_string(CipherSuite descriptor)
 | |
| {
 | |
| #define _ENUM_KEY_VALUE(name, value) \
 | |
|     case CipherSuite::name:          \
 | |
|         return #name##sv;
 | |
| 
 | |
|     switch (descriptor) {
 | |
|         __ENUM_CIPHER_SUITES
 | |
|     }
 | |
| 
 | |
|     return "Unknown"sv;
 | |
| #undef _ENUM_KEY_VALUE
 | |
| }
 | |
| 
 | |
| constexpr static StringView enum_to_string(ExtensionType descriptor)
 | |
| {
 | |
| #define _ENUM_KEY_VALUE(name, value) \
 | |
|     case ExtensionType::name:        \
 | |
|         return #name##sv;
 | |
| 
 | |
|     switch (descriptor) {
 | |
|         __ENUM_EXTENSION_TYPES
 | |
|     }
 | |
| 
 | |
|     return "Unknown"sv;
 | |
| #undef _ENUM_KEY_VALUE
 | |
| }
 | |
| 
 | |
| constexpr static StringView enum_to_string(ContentType descriptor)
 | |
| {
 | |
| #define _ENUM_KEY_VALUE(name, value) \
 | |
|     case ContentType::name:          \
 | |
|         return #name##sv;
 | |
| 
 | |
|     switch (descriptor) {
 | |
|         __ENUM_CONTENT_TYPES
 | |
|     }
 | |
| 
 | |
|     return "Unknown"sv;
 | |
| #undef _ENUM_KEY_VALUE
 | |
| }
 | |
| 
 | |
| constexpr static StringView enum_to_string(ProtocolVersion descriptor)
 | |
| {
 | |
| #define _ENUM_KEY_VALUE(name, value) \
 | |
|     case ProtocolVersion::name:      \
 | |
|         return #name##sv;
 | |
| 
 | |
|     switch (descriptor) {
 | |
|         __ENUM_PROTOCOL_VERSIONS
 | |
|     }
 | |
| 
 | |
|     return "Unknown"sv;
 | |
| #undef _ENUM_KEY_VALUE
 | |
| }
 | |
| 
 | |
| constexpr static StringView enum_to_string(HandshakeType descriptor)
 | |
| {
 | |
| #define _ENUM_KEY_VALUE(name, value) \
 | |
|     case HandshakeType::name:        \
 | |
|         return #name##sv;
 | |
| 
 | |
|     switch (descriptor) {
 | |
|         __ENUM_HANDSHAKE_TYPES
 | |
|     }
 | |
| 
 | |
|     return "Unknown"sv;
 | |
| #undef _ENUM_KEY_VALUE
 | |
| }
 | |
| 
 | |
| constexpr static StringView enum_to_string(SignatureAlgorithm descriptor)
 | |
| {
 | |
| #define _ENUM_KEY_VALUE(name, value) \
 | |
|     case SignatureAlgorithm::name:   \
 | |
|         return #name##sv;
 | |
| 
 | |
|     switch (descriptor) {
 | |
|         __ENUM_SIGNATURE_ALGORITHM
 | |
|     }
 | |
| 
 | |
|     return "Unknown"sv;
 | |
| #undef _ENUM_KEY_VALUE
 | |
| }
 | |
| constexpr static StringView enum_to_string(AlertDescription descriptor)
 | |
| {
 | |
| #define _ENUM_KEY_VALUE(name, value) \
 | |
|     case AlertDescription::name:     \
 | |
|         return #name##sv;
 | |
| 
 | |
|     switch (descriptor) {
 | |
|         __ENUM_ALERT_DESCRIPTIONS
 | |
|     }
 | |
| 
 | |
|     return "Unknown"sv;
 | |
| #undef _ENUM_KEY_VALUE
 | |
| }
 | |
| 
 | |
| constexpr static const StringView enum_to_value(AlertDescription descriptor)
 | |
| {
 | |
|     switch (descriptor) {
 | |
|     case AlertDescription::UNEXPECTED_MESSAGE:
 | |
|         return "An inappropriate message was received. "
 | |
|                "This alert is always fatal and should never be observed in communication between proper implementations."sv;
 | |
| 
 | |
|     case AlertDescription::BAD_RECORD_MAC:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::DECRYPTION_FAILED_RESERVED:
 | |
|         return "This alert MAY be returned if 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."sv;
 | |
| 
 | |
|     case AlertDescription::RECORD_OVERFLOW:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::DECOMPRESSION_FAILURE_RESERVED:
 | |
|         return "The decompression function received improper input (e.g., data that would expand to excessive length). "
 | |
|                "This message is always fatal."sv;
 | |
| 
 | |
|     case AlertDescription::HANDSHAKE_FAILURE:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::NO_CERTIFICATE_RESERVED:
 | |
|         return "This alert was used in SSLv3 but not in TLS. It should not be sent by compliant implementations."sv;
 | |
| 
 | |
|     case AlertDescription::BAD_CERTIFICATE:
 | |
|         return "A certificate was corrupt, contained signatures that did not verify correctly, etc."sv;
 | |
| 
 | |
|     case AlertDescription::UNSUPPORTED_CERTIFICATE:
 | |
|         return "A certificate was of an unsupported type."sv;
 | |
| 
 | |
|     case AlertDescription::CERTIFICATE_REVOKED:
 | |
|         return "A certificate was revoked by its signer."sv;
 | |
| 
 | |
|     case AlertDescription::CERTIFICATE_EXPIRED:
 | |
|         return "A certificate has expired or is not currently valid."sv;
 | |
| 
 | |
|     case AlertDescription::CERTIFICATE_UNKNOWN:
 | |
|         return "Some other (unspecified) issue arose in processing the certificate, rendering it unacceptable."sv;
 | |
| 
 | |
|     case AlertDescription::ILLEGAL_PARAMETER:
 | |
|         return "A field in the handshake was out of range or inconsistent with other fields. "
 | |
|                "This is always fatal."sv;
 | |
| 
 | |
|     case AlertDescription::UNKNOWN_CA:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::ACCESS_DENIED:
 | |
|         return "A valid certificate was received, but when access control was applied, "
 | |
|                "the sender decided not to proceed with negotiation. "
 | |
|                "This message is always fatal."sv;
 | |
| 
 | |
|     case AlertDescription::DECODE_ERROR:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::DECRYPT_ERROR:
 | |
|         return "A handshake cryptographic operation failed, "
 | |
|                "including being unable to correctly verify a signature, "
 | |
|                "decrypt a key exchange, or validate a finished message."sv;
 | |
| 
 | |
|     case AlertDescription::EXPORT_RESTRICTION_RESERVED:
 | |
|         return "This alert was used in TLS 1.0 but not TLS 1.1."sv;
 | |
| 
 | |
|     case AlertDescription::PROTOCOL_VERSION:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::INSUFFICIENT_SECURITY:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::INTERNAL_ERROR:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::USER_CANCELED:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::NO_RENEGOTIATION_RESERVED:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::CLOSE_NOTIFY:
 | |
|         return "This alert notifies the recipient that the sender will not send any more messages on this connection. "
 | |
|                "Any data received after a closure alert has been received MUST be ignored."sv;
 | |
| 
 | |
|     case AlertDescription::INAPPROPRIATE_FALLBACK:
 | |
|         return "Sent by a server in response to an invalid connection retry attempt from a client (see [RFC7507])."sv;
 | |
| 
 | |
|     case AlertDescription::MISSING_EXTENSION:
 | |
|         return "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."sv;
 | |
| 
 | |
|     case AlertDescription::CERTIFICATE_REQUIRED:
 | |
|         return "Sent by servers when a client certificate is desired but none was provided by the client."sv;
 | |
| 
 | |
|     case AlertDescription::NO_APPLICATION_PROTOCOL:
 | |
|         return "Sent by servers when a client \"application_layer_protocol_negotiation\" extension "
 | |
|                "advertises only protocols that the server does not support (see [RFC7301])."sv;
 | |
| 
 | |
|     case AlertDescription::UNSUPPORTED_EXTENSION:
 | |
|         return "Sent by endpoints receiving any handshake message containing an extension known to be prohibited "
 | |
|                "for inclusion in the given handshake message, "
 | |
|                "or including any extensions in a ServerHello "
 | |
|                "or Certificate not first offered in the corresponding ClientHello or CertificateRequest."sv;
 | |
| 
 | |
|     case AlertDescription::CERTIFICATE_UNOBTAINABLE_RESERVED:
 | |
|         return "If a server is unable to obtain certificates in a given CertificateURL, "
 | |
|                "it MUST send a fatal certificate_unobtainable(111) alert "
 | |
|                "if it requires the certificates to complete the handshake."sv;
 | |
| 
 | |
|     case AlertDescription::TOO_MANY_CIDS_REQUESTED:
 | |
|         return "Endpoints MAY handle an excessive number of RequestConnectionId messages by terminating the connection."sv;
 | |
| 
 | |
|     case AlertDescription::UNRECOGNIZED_NAME:
 | |
|         return "The ServerNameList MUST NOT contain more than one name of the same name_type. "
 | |
|                "If the server understood the ClientHello extension but does not recognize the server name, "
 | |
|                "the server SHOULD take one of two actions: "
 | |
|                "either abort the handshake by sending a fatal-level unrecognized_name(112) alert or continue the handshake. "
 | |
|                "It is NOT RECOMMENDED to send a warning-level unrecognized_name(112) alert, "
 | |
|                "because the client's behavior in response to warning-level alerts is unpredictable."sv;
 | |
| 
 | |
|     case AlertDescription::BAD_CERTIFICATE_STATUS_RESPONSE:
 | |
|         return "Clients requesting an OCSP response and receiving an OCSP response "
 | |
|                "in a \"CertificateStatus\" message MUST check the OCSP response "
 | |
|                "and abort the handshake if the response is not satisfactory. "
 | |
|                "This alert is always fatal."sv;
 | |
| 
 | |
|     case AlertDescription::BAD_CERTIFICATE_HASH_VALUE_RESERVED:
 | |
|         return "The server MUST check that the SHA-1 hash of the contents of the object retrieved from that URL "
 | |
|                "(after decoding any MIME Content-Transfer-Encoding) matches the given hash. "
 | |
|                "If any retrieved object does not have the correct SHA-1 hash, "
 | |
|                "the server MUST abort the handshake. "
 | |
|                "This alert is always fatal."sv;
 | |
| 
 | |
|     case AlertDescription::UNKNOWN_PSK_IDENTITY:
 | |
|         return "If the server does not recognize the PSK identity, it MAY respond with this message."
 | |
|                "Alternatively, if the server wishes to hide the fact that the PSK identity was not known, "
 | |
|                "it MAY continue the protocol as if the PSK identity existed but the key was incorrect: "
 | |
|                "that is, respond with a \"DECRYPT_ERROR\" alert."sv;
 | |
|     }
 | |
| 
 | |
|     return "Unknown alert"sv;
 | |
| }
 | |
| 
 | |
| }
 | 
