| 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 */  | 
 | 
 | 
 | 
package sun.security.ssl;  | 
 | 
 | 
 | 
import java.io.IOException;  | 
 | 
import java.nio.ByteBuffer;  | 
 | 
import java.text.MessageFormat;  | 
 | 
import java.util.Collection;  | 
 | 
import java.util.Collections;  | 
 | 
import java.util.LinkedList;  | 
 | 
import java.util.Locale;  | 
 | 
import sun.security.ssl.SSLHandshake.HandshakeMessage;  | 
 | 
import sun.misc.HexDumpEncoder;  | 
 | 
 | 
 | 
enum SSLExtension implements SSLStringizer { | 
 | 
      | 
 | 
    CH_SERVER_NAME          (0x0000,  "server_name",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_13,  | 
 | 
                                ServerNameExtension.chNetworkProducer,  | 
 | 
                                ServerNameExtension.chOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                ServerNameExtension.chStringizer),  | 
 | 
    SH_SERVER_NAME          (0x0000, "server_name",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                ServerNameExtension.shNetworkProducer,  | 
 | 
                                ServerNameExtension.shOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                ServerNameExtension.shStringizer),  | 
 | 
    EE_SERVER_NAME          (0x0000, "server_name",  | 
 | 
                                SSLHandshake.ENCRYPTED_EXTENSIONS,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                ServerNameExtension.eeNetworkProducer,  | 
 | 
                                ServerNameExtension.eeOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                ServerNameExtension.shStringizer),  | 
 | 
    CH_MAX_FRAGMENT_LENGTH (0x0001, "max_fragment_length",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_13,  | 
 | 
                                MaxFragExtension.chNetworkProducer,  | 
 | 
                                MaxFragExtension.chOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                MaxFragExtension.maxFragLenStringizer),  | 
 | 
    SH_MAX_FRAGMENT_LENGTH (0x0001, "max_fragment_length",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                MaxFragExtension.shNetworkProducer,  | 
 | 
                                MaxFragExtension.shOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                MaxFragExtension.shOnTradeConsumer,  | 
 | 
                                null,  | 
 | 
                                MaxFragExtension.maxFragLenStringizer),  | 
 | 
    EE_MAX_FRAGMENT_LENGTH (0x0001, "max_fragment_length",  | 
 | 
                                SSLHandshake.ENCRYPTED_EXTENSIONS,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                MaxFragExtension.eeNetworkProducer,  | 
 | 
                                MaxFragExtension.eeOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                MaxFragExtension.eeOnTradeConsumer,  | 
 | 
                                null,  | 
 | 
                                MaxFragExtension.maxFragLenStringizer),  | 
 | 
    CLIENT_CERTIFICATE_URL  (0x0002, "client_certificate_url"),  | 
 | 
    TRUSTED_CA_KEYS         (0x0003, "trusted_ca_keys"),  | 
 | 
    TRUNCATED_HMAC          (0x0004, "truncated_hmac"),  | 
 | 
 | 
 | 
    CH_STATUS_REQUEST       (0x0005, "status_request",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_13,  | 
 | 
                                CertStatusExtension.chNetworkProducer,  | 
 | 
                                CertStatusExtension.chOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                CertStatusExtension.certStatusReqStringizer),  | 
 | 
    SH_STATUS_REQUEST       (0x0005, "status_request",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                CertStatusExtension.shNetworkProducer,  | 
 | 
                                CertStatusExtension.shOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                CertStatusExtension.certStatusReqStringizer),  | 
 | 
    CR_STATUS_REQUEST       (0x0005, "status_request"),  | 
 | 
    CT_STATUS_REQUEST       (0x0005, "status_request",  | 
 | 
                                SSLHandshake.CERTIFICATE,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                CertStatusExtension.ctNetworkProducer,  | 
 | 
                                CertStatusExtension.ctOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                CertStatusExtension.certStatusRespStringizer),  | 
 | 
 | 
 | 
      | 
 | 
    USER_MAPPING            (0x0006, "user_mapping"),  | 
 | 
 | 
 | 
      | 
 | 
    CLIENT_AUTHZ            (0x0007, "client_authz"),  | 
 | 
    SERVER_AUTHZ            (0x0008, "server_authz"),  | 
 | 
 | 
 | 
      | 
 | 
    CERT_TYPE               (0x0009, "cert_type"),  | 
 | 
 | 
 | 
      | 
 | 
    CH_SUPPORTED_GROUPS     (0x000A, "supported_groups",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_13,  | 
 | 
                                SupportedGroupsExtension.chNetworkProducer,  | 
 | 
                                SupportedGroupsExtension.chOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                SupportedGroupsExtension.sgsStringizer),  | 
 | 
    EE_SUPPORTED_GROUPS     (0x000A, "supported_groups",  | 
 | 
                                SSLHandshake.ENCRYPTED_EXTENSIONS,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                SupportedGroupsExtension.eeNetworkProducer,  | 
 | 
                                SupportedGroupsExtension.eeOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                SupportedGroupsExtension.sgsStringizer),  | 
 | 
 | 
 | 
    CH_EC_POINT_FORMATS     (0x000B, "ec_point_formats",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                ECPointFormatsExtension.chNetworkProducer,  | 
 | 
                                ECPointFormatsExtension.chOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                ECPointFormatsExtension.epfStringizer),  | 
 | 
    SH_EC_POINT_FORMATS     (0x000B, "ec_point_formats",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                null,     | 
 | 
                                ECPointFormatsExtension.shOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                ECPointFormatsExtension.epfStringizer),  | 
 | 
 | 
 | 
      | 
 | 
    SRP                     (0x000C, "srp"),  | 
 | 
 | 
 | 
      | 
 | 
    CH_SIGNATURE_ALGORITHMS (0x000D, "signature_algorithms",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_12_13,  | 
 | 
                                SignatureAlgorithmsExtension.chNetworkProducer,  | 
 | 
                                SignatureAlgorithmsExtension.chOnLoadConsumer,  | 
 | 
                                SignatureAlgorithmsExtension.chOnLoadAbsence,  | 
 | 
                                SignatureAlgorithmsExtension.chOnTradeConsumer,  | 
 | 
                                SignatureAlgorithmsExtension.chOnTradeAbsence,  | 
 | 
                                SignatureAlgorithmsExtension.ssStringizer),  | 
 | 
    CR_SIGNATURE_ALGORITHMS (0x000D, "signature_algorithms",  | 
 | 
                                SSLHandshake.CERTIFICATE_REQUEST,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                SignatureAlgorithmsExtension.crNetworkProducer,  | 
 | 
                                SignatureAlgorithmsExtension.crOnLoadConsumer,  | 
 | 
                                SignatureAlgorithmsExtension.crOnLoadAbsence,  | 
 | 
                                SignatureAlgorithmsExtension.crOnTradeConsumer,  | 
 | 
                                null,  | 
 | 
                                SignatureAlgorithmsExtension.ssStringizer),  | 
 | 
 | 
 | 
    CH_SIGNATURE_ALGORITHMS_CERT (0x0032, "signature_algorithms_cert",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_12_13,  | 
 | 
                                CertSignAlgsExtension.chNetworkProducer,  | 
 | 
                                CertSignAlgsExtension.chOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                CertSignAlgsExtension.chOnTradeConsumer,  | 
 | 
                                null,  | 
 | 
                                CertSignAlgsExtension.ssStringizer),  | 
 | 
    CR_SIGNATURE_ALGORITHMS_CERT (0x0032, "signature_algorithms_cert",  | 
 | 
                                SSLHandshake.CERTIFICATE_REQUEST,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                CertSignAlgsExtension.crNetworkProducer,  | 
 | 
                                CertSignAlgsExtension.crOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                CertSignAlgsExtension.crOnTradeConsumer,  | 
 | 
                                null,  | 
 | 
                                CertSignAlgsExtension.ssStringizer),  | 
 | 
 | 
 | 
      | 
 | 
    USE_SRTP                (0x000E, "use_srtp"),  | 
 | 
 | 
 | 
      | 
 | 
    HEARTBEAT               (0x000E, "heartbeat"),  | 
 | 
 | 
 | 
      | 
 | 
    CH_ALPN                 (0x0010, "application_layer_protocol_negotiation",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_13,  | 
 | 
                                AlpnExtension.chNetworkProducer,  | 
 | 
                                AlpnExtension.chOnLoadConsumer,  | 
 | 
                                AlpnExtension.chOnLoadAbsence,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                AlpnExtension.alpnStringizer),  | 
 | 
    SH_ALPN                 (0x0010, "application_layer_protocol_negotiation",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                AlpnExtension.shNetworkProducer,  | 
 | 
                                AlpnExtension.shOnLoadConsumer,  | 
 | 
                                AlpnExtension.shOnLoadAbsence,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                AlpnExtension.alpnStringizer),  | 
 | 
    EE_ALPN                 (0x0010, "application_layer_protocol_negotiation",  | 
 | 
                                SSLHandshake.ENCRYPTED_EXTENSIONS,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                AlpnExtension.shNetworkProducer,  | 
 | 
                                AlpnExtension.shOnLoadConsumer,  | 
 | 
                                AlpnExtension.shOnLoadAbsence,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                AlpnExtension.alpnStringizer),  | 
 | 
 | 
 | 
      | 
 | 
    CH_STATUS_REQUEST_V2    (0x0011, "status_request_v2",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                CertStatusExtension.chV2NetworkProducer,  | 
 | 
                                CertStatusExtension.chV2OnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                CertStatusExtension.certStatusReqV2Stringizer),  | 
 | 
    SH_STATUS_REQUEST_V2    (0x0011, "status_request_v2",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                CertStatusExtension.shV2NetworkProducer,  | 
 | 
                                CertStatusExtension.shV2OnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                CertStatusExtension.certStatusReqV2Stringizer),  | 
 | 
 | 
 | 
      | 
 | 
    SIGNED_CERT_TIMESTAMP   (0x0012, "signed_certificate_timestamp"),  | 
 | 
 | 
 | 
      | 
 | 
    CLIENT_CERT_TYPE        (0x0013, "padding"),  | 
 | 
    SERVER_CERT_TYPE        (0x0014, "server_certificate_type"),  | 
 | 
 | 
 | 
      | 
 | 
    PADDING                 (0x0015, "client_certificate_type"),  | 
 | 
 | 
 | 
      | 
 | 
    ENCRYPT_THEN_MAC        (0x0016, "encrypt_then_mac"),  | 
 | 
 | 
 | 
      | 
 | 
    CH_EXTENDED_MASTER_SECRET  (0x0017, "extended_master_secret",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                ExtendedMasterSecretExtension.chNetworkProducer,  | 
 | 
                                ExtendedMasterSecretExtension.chOnLoadConsumer,  | 
 | 
                                ExtendedMasterSecretExtension.chOnLoadAbsence,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                ExtendedMasterSecretExtension.emsStringizer),  | 
 | 
    SH_EXTENDED_MASTER_SECRET  (0x0017, "extended_master_secret",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                ExtendedMasterSecretExtension.shNetworkProducer,  | 
 | 
                                ExtendedMasterSecretExtension.shOnLoadConsumer,  | 
 | 
                                ExtendedMasterSecretExtension.shOnLoadAbsence,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                ExtendedMasterSecretExtension.emsStringizer),  | 
 | 
 | 
 | 
      | 
 | 
    TOKEN_BINDING           (0x0018, "token_binding "),  | 
 | 
 | 
 | 
      | 
 | 
    CACHED_INFO             (0x0019, "cached_info"),  | 
 | 
 | 
 | 
      | 
 | 
    SESSION_TICKET          (0x0023, "session_ticket"),  | 
 | 
 | 
 | 
      | 
 | 
    CH_EARLY_DATA           (0x002A, "early_data"),  | 
 | 
    EE_EARLY_DATA           (0x002A, "early_data"),  | 
 | 
    NST_EARLY_DATA          (0x002A, "early_data"),  | 
 | 
 | 
 | 
    CH_SUPPORTED_VERSIONS   (0x002B, "supported_versions",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_13,  | 
 | 
                                SupportedVersionsExtension.chNetworkProducer,  | 
 | 
                                SupportedVersionsExtension.chOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                SupportedVersionsExtension.chStringizer),  | 
 | 
    SH_SUPPORTED_VERSIONS   (0x002B, "supported_versions",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                          | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                SupportedVersionsExtension.shNetworkProducer,  | 
 | 
                                SupportedVersionsExtension.shOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                SupportedVersionsExtension.shStringizer),  | 
 | 
    HRR_SUPPORTED_VERSIONS  (0x002B, "supported_versions",  | 
 | 
                                SSLHandshake.HELLO_RETRY_REQUEST,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                SupportedVersionsExtension.hrrNetworkProducer,  | 
 | 
                                SupportedVersionsExtension.hrrOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                SupportedVersionsExtension.hrrStringizer),  | 
 | 
    MH_SUPPORTED_VERSIONS   (0x002B, "supported_versions",  | 
 | 
                                SSLHandshake.MESSAGE_HASH,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                SupportedVersionsExtension.hrrReproducer,  | 
 | 
                                null, null, null,  | 
 | 
                                null,  | 
 | 
                                SupportedVersionsExtension.hrrStringizer),  | 
 | 
 | 
 | 
    CH_COOKIE               (0x002C, "cookie",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                CookieExtension.chNetworkProducer,  | 
 | 
                                CookieExtension.chOnLoadConsumer,  | 
 | 
                                null,  | 
 | 
                                CookieExtension.chOnTradeConsumer,  | 
 | 
                                null,  | 
 | 
                                CookieExtension.cookieStringizer),  | 
 | 
    HRR_COOKIE              (0x002C, "cookie",  | 
 | 
                                SSLHandshake.HELLO_RETRY_REQUEST,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                CookieExtension.hrrNetworkProducer,  | 
 | 
                                CookieExtension.hrrOnLoadConsumer,  | 
 | 
                                null, null,  | 
 | 
                                null,  | 
 | 
                                CookieExtension.cookieStringizer),  | 
 | 
    MH_COOKIE               (0x002C, "cookie",  | 
 | 
                                SSLHandshake.MESSAGE_HASH,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                CookieExtension.hrrNetworkReproducer,  | 
 | 
                                null, null, null,  | 
 | 
                                null,  | 
 | 
                                CookieExtension.cookieStringizer),  | 
 | 
 | 
 | 
    PSK_KEY_EXCHANGE_MODES  (0x002D, "psk_key_exchange_modes",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                PskKeyExchangeModesExtension.chNetworkProducer,  | 
 | 
                                PskKeyExchangeModesExtension.chOnLoadConsumer,  | 
 | 
                                PskKeyExchangeModesExtension.chOnLoadAbsence,  | 
 | 
                                null,  | 
 | 
                                PskKeyExchangeModesExtension.chOnTradeAbsence,  | 
 | 
                                PskKeyExchangeModesExtension.pkemStringizer),  | 
 | 
    CERTIFICATE_AUTHORITIES (0x002F, "certificate_authorities"),  | 
 | 
    OID_FILTERS             (0x0030, "oid_filters"),  | 
 | 
    POST_HANDSHAKE_AUTH     (0x0030, "post_handshake_auth"),  | 
 | 
 | 
 | 
    CH_KEY_SHARE            (0x0033, "key_share",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                KeyShareExtension.chNetworkProducer,  | 
 | 
                                KeyShareExtension.chOnLoadConsumer,  | 
 | 
                                null, null, null,  | 
 | 
                                KeyShareExtension.chStringizer),  | 
 | 
    SH_KEY_SHARE            (0x0033, "key_share",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                KeyShareExtension.shNetworkProducer,  | 
 | 
                                KeyShareExtension.shOnLoadConsumer,  | 
 | 
                                KeyShareExtension.shOnLoadAbsence,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                KeyShareExtension.shStringizer),  | 
 | 
    HRR_KEY_SHARE           (0x0033, "key_share",  | 
 | 
                                SSLHandshake.HELLO_RETRY_REQUEST,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                KeyShareExtension.hrrNetworkProducer,  | 
 | 
                                KeyShareExtension.hrrOnLoadConsumer,  | 
 | 
                                null, null, null,  | 
 | 
                                KeyShareExtension.hrrStringizer),  | 
 | 
    MH_KEY_SHARE            (0x0033, "key_share",  | 
 | 
                                SSLHandshake.MESSAGE_HASH,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                KeyShareExtension.hrrNetworkReproducer,  | 
 | 
                                null, null, null, null,  | 
 | 
                                KeyShareExtension.hrrStringizer),  | 
 | 
 | 
 | 
      | 
 | 
    CH_RENEGOTIATION_INFO   (0xff01, "renegotiation_info",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                RenegoInfoExtension.chNetworkProducer,  | 
 | 
                                RenegoInfoExtension.chOnLoadConsumer,  | 
 | 
                                RenegoInfoExtension.chOnLoadAbsence,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                RenegoInfoExtension.rniStringizer),  | 
 | 
    SH_RENEGOTIATION_INFO   (0xff01, "renegotiation_info",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_TO_12,  | 
 | 
                                RenegoInfoExtension.shNetworkProducer,  | 
 | 
                                RenegoInfoExtension.shOnLoadConsumer,  | 
 | 
                                RenegoInfoExtension.shOnLoadAbsence,  | 
 | 
                                null,  | 
 | 
                                null,  | 
 | 
                                RenegoInfoExtension.rniStringizer),  | 
 | 
 | 
 | 
      | 
 | 
    CH_PRE_SHARED_KEY       (0x0029, "pre_shared_key",  | 
 | 
                                SSLHandshake.CLIENT_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                PreSharedKeyExtension.chNetworkProducer,  | 
 | 
                                PreSharedKeyExtension.chOnLoadConsumer,  | 
 | 
                                PreSharedKeyExtension.chOnLoadAbsence,  | 
 | 
                                PreSharedKeyExtension.chOnTradeConsumer,  | 
 | 
                                null,  | 
 | 
                                PreSharedKeyExtension.chStringizer),  | 
 | 
    SH_PRE_SHARED_KEY       (0x0029, "pre_shared_key",  | 
 | 
                                SSLHandshake.SERVER_HELLO,  | 
 | 
                                ProtocolVersion.PROTOCOLS_OF_13,  | 
 | 
                                PreSharedKeyExtension.shNetworkProducer,  | 
 | 
                                PreSharedKeyExtension.shOnLoadConsumer,  | 
 | 
                                PreSharedKeyExtension.shOnLoadAbsence,  | 
 | 
                                null, null,  | 
 | 
                                PreSharedKeyExtension.shStringizer);  | 
 | 
 | 
 | 
    final int id;  | 
 | 
    final SSLHandshake handshakeType;  | 
 | 
    final String name;  | 
 | 
    final ProtocolVersion[] supportedProtocols;  | 
 | 
    final HandshakeProducer networkProducer;  | 
 | 
    final ExtensionConsumer onLoadConsumer;  | 
 | 
    final HandshakeAbsence  onLoadAbsence;  | 
 | 
    final HandshakeConsumer onTradeConsumer;  | 
 | 
    final HandshakeAbsence  onTradeAbsence;  | 
 | 
    final SSLStringizer stringizer;  | 
 | 
 | 
 | 
      | 
 | 
    private SSLExtension(int id, String name) { | 
 | 
        this.id = id;  | 
 | 
        this.handshakeType = SSLHandshake.NOT_APPLICABLE;  | 
 | 
        this.name = name;  | 
 | 
        this.supportedProtocols = new ProtocolVersion[0];  | 
 | 
        this.networkProducer = null;  | 
 | 
        this.onLoadConsumer = null;  | 
 | 
        this.onLoadAbsence = null;  | 
 | 
        this.onTradeConsumer = null;  | 
 | 
        this.onTradeAbsence = null;  | 
 | 
        this.stringizer = null;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    private SSLExtension(int id, String name, SSLHandshake handshakeType,  | 
 | 
            ProtocolVersion[] supportedProtocols,  | 
 | 
            HandshakeProducer producer,  | 
 | 
            ExtensionConsumer onLoadConsumer, HandshakeAbsence onLoadAbsence,  | 
 | 
            HandshakeConsumer onTradeConsumer, HandshakeAbsence onTradeAbsence,  | 
 | 
            SSLStringizer stringize) { | 
 | 
        this.id = id;  | 
 | 
        this.handshakeType = handshakeType;  | 
 | 
        this.name = name;  | 
 | 
        this.supportedProtocols = supportedProtocols;  | 
 | 
        this.networkProducer = producer;  | 
 | 
        this.onLoadConsumer = onLoadConsumer;  | 
 | 
        this.onLoadAbsence = onLoadAbsence;  | 
 | 
        this.onTradeConsumer = onTradeConsumer;  | 
 | 
        this.onTradeAbsence = onTradeAbsence;  | 
 | 
        this.stringizer = stringize;  | 
 | 
    }  | 
 | 
 | 
 | 
    static SSLExtension valueOf(SSLHandshake handshakeType, int extensionType) { | 
 | 
        for (SSLExtension ext : SSLExtension.values()) { | 
 | 
            if (ext.id == extensionType &&  | 
 | 
                    ext.handshakeType == handshakeType) { | 
 | 
                return ext;  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        return null;  | 
 | 
    }  | 
 | 
 | 
 | 
    static String nameOf(int extensionType) { | 
 | 
        for (SSLExtension ext : SSLExtension.values()) { | 
 | 
            if (ext.id == extensionType) { | 
 | 
                return ext.name;  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        return "unknown extension";  | 
 | 
    }  | 
 | 
 | 
 | 
    static boolean isConsumable(int extensionType) { | 
 | 
        for (SSLExtension ext : SSLExtension.values()) { | 
 | 
            if (ext.id == extensionType &&  | 
 | 
                    ext.onLoadConsumer != null) { | 
 | 
                return true;  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        return false;  | 
 | 
    }  | 
 | 
 | 
 | 
    public byte[] produce(ConnectionContext context,  | 
 | 
            HandshakeMessage message) throws IOException { | 
 | 
        if (networkProducer != null) { | 
 | 
            return networkProducer.produce(context, message);  | 
 | 
        } else { | 
 | 
            throw new UnsupportedOperationException(  | 
 | 
                    "Not yet supported extension producing.");  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    public void consumeOnLoad(ConnectionContext context,  | 
 | 
            HandshakeMessage message, ByteBuffer buffer) throws IOException { | 
 | 
        if (onLoadConsumer != null) { | 
 | 
            onLoadConsumer.consume(context, message, buffer);  | 
 | 
        } else { | 
 | 
            throw new UnsupportedOperationException(  | 
 | 
                    "Not yet supported extension loading.");  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    public void consumeOnTrade(ConnectionContext context,  | 
 | 
            HandshakeMessage message) throws IOException { | 
 | 
        if (onTradeConsumer != null) { | 
 | 
            onTradeConsumer.consume(context, message);  | 
 | 
        } else { | 
 | 
            throw new UnsupportedOperationException(  | 
 | 
                    "Not yet supported extension processing.");  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    void absentOnLoad(ConnectionContext context,  | 
 | 
            HandshakeMessage message) throws IOException { | 
 | 
        if (onLoadAbsence != null) { | 
 | 
            onLoadAbsence.absent(context, message);  | 
 | 
        } else { | 
 | 
            throw new UnsupportedOperationException(  | 
 | 
                    "Not yet supported extension absence processing.");  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    void absentOnTrade(ConnectionContext context,  | 
 | 
            HandshakeMessage message) throws IOException { | 
 | 
        if (onTradeAbsence != null) { | 
 | 
            onTradeAbsence.absent(context, message);  | 
 | 
        } else { | 
 | 
            throw new UnsupportedOperationException(  | 
 | 
                    "Not yet supported extension absence processing.");  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
    public boolean isAvailable(ProtocolVersion protocolVersion) { | 
 | 
        for (int i = 0; i < supportedProtocols.length; i++) { | 
 | 
            if (supportedProtocols[i] == protocolVersion) { | 
 | 
                return true;  | 
 | 
            }  | 
 | 
        }  | 
 | 
 | 
 | 
        return false;  | 
 | 
    }  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public String toString() { | 
 | 
        return name;  | 
 | 
    }  | 
 | 
 | 
 | 
    @Override  | 
 | 
    public String toString(ByteBuffer byteBuffer) { | 
 | 
        MessageFormat messageFormat = new MessageFormat(  | 
 | 
            "\"{0} ({1})\": '{'\n" + | 
 | 
            "{2}\n" + | 
 | 
            "'}'",  | 
 | 
            Locale.ENGLISH);  | 
 | 
 | 
 | 
        String extData;  | 
 | 
        if (stringizer == null) { | 
 | 
            HexDumpEncoder hexEncoder = new HexDumpEncoder();  | 
 | 
            String encoded = hexEncoder.encode(byteBuffer.duplicate());  | 
 | 
            extData = encoded;  | 
 | 
        } else { | 
 | 
            extData = stringizer.toString(byteBuffer);  | 
 | 
        }  | 
 | 
 | 
 | 
        Object[] messageFields = { | 
 | 
            this.name,  | 
 | 
            this.id,  | 
 | 
            Utilities.indent(extData)  | 
 | 
        };  | 
 | 
 | 
 | 
        return messageFormat.format(messageFields);  | 
 | 
    }  | 
 | 
 | 
 | 
    //////////////////////////////////////////////////////  | 
 | 
    // Nested extension, consumer and producer interfaces.  | 
 | 
 | 
 | 
    static interface ExtensionConsumer { | 
 | 
        void consume(ConnectionContext context,  | 
 | 
                HandshakeMessage message, ByteBuffer buffer) throws IOException;  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
 | 
     */  | 
 | 
    static interface SSLExtensionSpec { | 
 | 
        // blank  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    static final class ClientExtensions { | 
 | 
        static final Collection<SSLExtension> defaults;  | 
 | 
 | 
 | 
        static { | 
 | 
            Collection<SSLExtension> extensions = new LinkedList<>();  | 
 | 
            for (SSLExtension extension : SSLExtension.values()) { | 
 | 
                if (extension.handshakeType != SSLHandshake.NOT_APPLICABLE) { | 
 | 
                    extensions.add(extension);  | 
 | 
                }  | 
 | 
            }  | 
 | 
 | 
 | 
              | 
 | 
            boolean enableExtension =  | 
 | 
                Utilities.getBooleanProperty("jsse.enableSNIExtension", true); | 
 | 
            if (!enableExtension) { | 
 | 
                extensions.remove(CH_SERVER_NAME);  | 
 | 
            }  | 
 | 
 | 
 | 
            // To switch off the max_fragment_length extension.  | 
 | 
            //  | 
 | 
            // Note that "jsse.enableMFLNExtension" is the CSR approved  | 
 | 
            // property name.  However, "jsse.enableMFLExtension" was used  | 
 | 
            // in the original implementation.  Temporarily, if either of  | 
 | 
            // the two properties set to true, the extension is switch on.  | 
 | 
            // We may remove the "jsse.enableMFLExtension" property in the  | 
 | 
              | 
 | 
            enableExtension =  | 
 | 
                Utilities.getBooleanProperty(  | 
 | 
                        "jsse.enableMFLNExtension", false) ||  | 
 | 
                Utilities.getBooleanProperty(  | 
 | 
                        "jsse.enableMFLExtension", false);  | 
 | 
            if (!enableExtension) { | 
 | 
                extensions.remove(CH_MAX_FRAGMENT_LENGTH);  | 
 | 
            }  | 
 | 
 | 
 | 
            defaults = Collections.unmodifiableCollection(extensions);  | 
 | 
        }  | 
 | 
    }  | 
 | 
 | 
 | 
      | 
 | 
    static final class ServerExtensions { | 
 | 
        static final Collection<SSLExtension> defaults;  | 
 | 
 | 
 | 
        static { | 
 | 
            Collection<SSLExtension> extensions = new LinkedList<>();  | 
 | 
            for (SSLExtension extension : SSLExtension.values()) { | 
 | 
                if (extension.handshakeType != SSLHandshake.NOT_APPLICABLE) { | 
 | 
                    extensions.add(extension);  | 
 | 
                }  | 
 | 
            }  | 
 | 
 | 
 | 
            defaults = Collections.unmodifiableCollection(extensions);  | 
 | 
        }  | 
 | 
    }  | 
 | 
}  |