1 /*
   2  * Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package sun.security.ssl;
  27 
  28 import java.util.ArrayList;
  29 import java.util.List;
  30 
  31 final class ExtensionType {
  32 
  33     final int id;
  34     final String name;
  35 
  36     private ExtensionType(int id, String name) {
  37         this.id = id;
  38         this.name = name;
  39     }
  40 
  41     @Override
  42     public String toString() {
  43         return name;
  44     }
  45 
  46     static List<ExtensionType> knownExtensions = new ArrayList<>(15);
  47 
  48     static ExtensionType get(int id) {
  49         for (ExtensionType ext : knownExtensions) {
  50             if (ext.id == id) {
  51                 return ext;
  52             }
  53         }
  54         return new ExtensionType(id, "type_" + id);
  55     }
  56 
  57     private static ExtensionType e(int id, String name) {
  58         ExtensionType ext = new ExtensionType(id, name);
  59         knownExtensions.add(ext);
  60         return ext;
  61     }
  62 
  63     // extensions defined in RFC 3546
  64     static final ExtensionType EXT_SERVER_NAME =
  65             e(0x0000, "server_name");            // IANA registry value: 0
  66     static final ExtensionType EXT_MAX_FRAGMENT_LENGTH =
  67             e(0x0001, "max_fragment_length");    // IANA registry value: 1
  68     static final ExtensionType EXT_CLIENT_CERTIFICATE_URL =
  69             e(0x0002, "client_certificate_url"); // IANA registry value: 2
  70     static final ExtensionType EXT_TRUSTED_CA_KEYS =
  71             e(0x0003, "trusted_ca_keys");        // IANA registry value: 3
  72     static final ExtensionType EXT_TRUNCATED_HMAC =
  73             e(0x0004, "truncated_hmac");         // IANA registry value: 4
  74     static final ExtensionType EXT_STATUS_REQUEST =
  75             e(0x0005, "status_request");         // IANA registry value: 5
  76 
  77     // extensions defined in RFC 4681
  78     static final ExtensionType EXT_USER_MAPPING =
  79             e(0x0006, "user_mapping");           // IANA registry value: 6
  80 
  81     // extensions defined in RFC 5081
  82     static final ExtensionType EXT_CERT_TYPE =
  83             e(0x0009, "cert_type");              // IANA registry value: 9
  84 
  85     // extensions defined in RFC 4492 (ECC) and RFC 7919 (FFDHE)
  86     static final ExtensionType EXT_SUPPORTED_GROUPS =
  87             e(0x000A, "supported_groups");       // IANA registry value: 10
  88     static final ExtensionType EXT_EC_POINT_FORMATS =
  89             e(0x000B, "ec_point_formats");       // IANA registry value: 11
  90 
  91     // extensions defined in RFC 5054
  92     static final ExtensionType EXT_SRP =
  93             e(0x000C, "srp");                    // IANA registry value: 12
  94 
  95     // extensions defined in RFC 5246
  96     static final ExtensionType EXT_SIGNATURE_ALGORITHMS =
  97             e(0x000D, "signature_algorithms");   // IANA registry value: 13
  98 
  99     // extension defined in RFC 7301 (ALPN)
 100     static final ExtensionType EXT_ALPN =
 101             e(0x0010, "application_layer_protocol_negotiation");
 102                                                  // IANA registry value: 16
 103 
 104     // extensions defined in RFC 6961
 105     static final ExtensionType EXT_STATUS_REQUEST_V2 =
 106             e(0x0011, "status_request_v2");      // IANA registry value: 17
 107 
 108     // extensions defined in RFC 5746
 109     static final ExtensionType EXT_RENEGOTIATION_INFO =
 110             e(0xff01, "renegotiation_info");     // IANA registry value: 65281
 111 }