author | darcy |
Thu, 29 Aug 2019 16:31:34 -0700 | |
changeset 57956 | e0b8b019d2f5 |
parent 49433 | b6671a111395 |
permissions | -rw-r--r-- |
14194
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
1 |
/* |
49433
b6671a111395
8199465: {@docRoot} references need to be updated to reflect new module/package structure
jjg
parents:
47216
diff
changeset
|
2 |
* Copyright (c) 2012, 2018, Oracle and/or its affiliates. All rights reserved. |
14194
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
3 |
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
4 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
5 |
* This code is free software; you can redistribute it and/or modify it |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
6 |
* under the terms of the GNU General Public License version 2 only, as |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
7 |
* published by the Free Software Foundation. Oracle designates this |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
8 |
* particular file as subject to the "Classpath" exception as provided |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
9 |
* by Oracle in the LICENSE file that accompanied this code. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
10 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
11 |
* This code is distributed in the hope that it will be useful, but WITHOUT |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
12 |
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
13 |
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
14 |
* version 2 for more details (a copy is included in the LICENSE file that |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
15 |
* accompanied this code). |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
16 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
17 |
* You should have received a copy of the GNU General Public License version |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
18 |
* 2 along with this work; if not, write to the Free Software Foundation, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
19 |
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
20 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
21 |
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
22 |
* or visit www.oracle.com if you need additional information or have any |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
23 |
* questions. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
24 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
25 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
26 |
package javax.net.ssl; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
27 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
28 |
import java.net.IDN; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
29 |
import java.nio.ByteBuffer; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
30 |
import java.nio.charset.CodingErrorAction; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
31 |
import java.nio.charset.StandardCharsets; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
32 |
import java.nio.charset.CharsetDecoder; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
33 |
import java.nio.charset.CharacterCodingException; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
34 |
import java.util.Locale; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
35 |
import java.util.Objects; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
36 |
import java.util.regex.Pattern; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
37 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
38 |
/** |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
39 |
* Instances of this class represent a server name of type |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
40 |
* {@link StandardConstants#SNI_HOST_NAME host_name} in a Server Name |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
41 |
* Indication (SNI) extension. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
42 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
43 |
* As described in section 3, "Server Name Indication", of |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
44 |
* <A HREF="http://www.ietf.org/rfc/rfc6066.txt">TLS Extensions (RFC 6066)</A>, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
45 |
* "HostName" contains the fully qualified DNS hostname of the server, as |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
46 |
* understood by the client. The encoded server name value of a hostname is |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
47 |
* represented as a byte string using ASCII encoding without a trailing dot. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
48 |
* This allows the support of Internationalized Domain Names (IDN) through |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
49 |
* the use of A-labels (the ASCII-Compatible Encoding (ACE) form of a valid |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
50 |
* string of Internationalized Domain Names for Applications (IDNA)) defined |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
51 |
* in <A HREF="http://www.ietf.org/rfc/rfc5890.txt">RFC 5890</A>. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
52 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
53 |
* Note that {@code SNIHostName} objects are immutable. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
54 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
55 |
* @see SNIServerName |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
56 |
* @see StandardConstants#SNI_HOST_NAME |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
57 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
58 |
* @since 1.8 |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
59 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
60 |
public final class SNIHostName extends SNIServerName { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
61 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
62 |
// the decoded string value of the server name |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
63 |
private final String hostname; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
64 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
65 |
/** |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
66 |
* Creates an {@code SNIHostName} using the specified hostname. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
67 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
68 |
* Note that per <A HREF="http://www.ietf.org/rfc/rfc6066.txt">RFC 6066</A>, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
69 |
* the encoded server name value of a hostname is |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
70 |
* {@link StandardCharsets#US_ASCII}-compliant. In this method, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
71 |
* {@code hostname} can be a user-friendly Internationalized Domain Name |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
72 |
* (IDN). {@link IDN#toASCII(String, int)} is used to enforce the |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
73 |
* restrictions on ASCII characters in hostnames (see |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
74 |
* <A HREF="http://www.ietf.org/rfc/rfc3490.txt">RFC 3490</A>, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
75 |
* <A HREF="http://www.ietf.org/rfc/rfc1122.txt">RFC 1122</A>, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
76 |
* <A HREF="http://www.ietf.org/rfc/rfc1123.txt">RFC 1123</A>) and |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
77 |
* translate the {@code hostname} into ASCII Compatible Encoding (ACE), as: |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
78 |
* <pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
79 |
* IDN.toASCII(hostname, IDN.USE_STD3_ASCII_RULES); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
80 |
* </pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
81 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
82 |
* The {@code hostname} argument is illegal if it: |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
83 |
* <ul> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
84 |
* <li> {@code hostname} is empty,</li> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
85 |
* <li> {@code hostname} ends with a trailing dot,</li> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
86 |
* <li> {@code hostname} is not a valid Internationalized |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
87 |
* Domain Name (IDN) compliant with the RFC 3490 specification.</li> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
88 |
* </ul> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
89 |
* @param hostname |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
90 |
* the hostname of this server name |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
91 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
92 |
* @throws NullPointerException if {@code hostname} is {@code null} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
93 |
* @throws IllegalArgumentException if {@code hostname} is illegal |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
94 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
95 |
public SNIHostName(String hostname) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
96 |
// IllegalArgumentException will be thrown if {@code hostname} is |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
97 |
// not a valid IDN. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
98 |
super(StandardConstants.SNI_HOST_NAME, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
99 |
(hostname = IDN.toASCII( |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
100 |
Objects.requireNonNull(hostname, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
101 |
"Server name value of host_name cannot be null"), |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
102 |
IDN.USE_STD3_ASCII_RULES)) |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
103 |
.getBytes(StandardCharsets.US_ASCII)); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
104 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
105 |
this.hostname = hostname; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
106 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
107 |
// check the validity of the string hostname |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
108 |
checkHostName(); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
109 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
110 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
111 |
/** |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
112 |
* Creates an {@code SNIHostName} using the specified encoded value. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
113 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
114 |
* This method is normally used to parse the encoded name value in a |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
115 |
* requested SNI extension. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
116 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
117 |
* Per <A HREF="http://www.ietf.org/rfc/rfc6066.txt">RFC 6066</A>, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
118 |
* the encoded name value of a hostname is |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
119 |
* {@link StandardCharsets#US_ASCII}-compliant. However, in the previous |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
120 |
* version of the SNI extension ( |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
121 |
* <A HREF="http://www.ietf.org/rfc/rfc4366.txt">RFC 4366</A>), |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
122 |
* the encoded hostname is represented as a byte string using UTF-8 |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
123 |
* encoding. For the purpose of version tolerance, this method allows |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
124 |
* that the charset of {@code encoded} argument can be |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
125 |
* {@link StandardCharsets#UTF_8}, as well as |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
126 |
* {@link StandardCharsets#US_ASCII}. {@link IDN#toASCII(String)} is used |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
127 |
* to translate the {@code encoded} argument into ASCII Compatible |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
128 |
* Encoding (ACE) hostname. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
129 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
130 |
* It is strongly recommended that this constructor is only used to parse |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
131 |
* the encoded name value in a requested SNI extension. Otherwise, to |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
132 |
* comply with <A HREF="http://www.ietf.org/rfc/rfc6066.txt">RFC 6066</A>, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
133 |
* please always use {@link StandardCharsets#US_ASCII}-compliant charset |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
134 |
* and enforce the restrictions on ASCII characters in hostnames (see |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
135 |
* <A HREF="http://www.ietf.org/rfc/rfc3490.txt">RFC 3490</A>, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
136 |
* <A HREF="http://www.ietf.org/rfc/rfc1122.txt">RFC 1122</A>, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
137 |
* <A HREF="http://www.ietf.org/rfc/rfc1123.txt">RFC 1123</A>) |
14663 | 138 |
* for {@code encoded} argument, or use |
139 |
* {@link SNIHostName#SNIHostName(String)} instead. |
|
14194
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
140 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
141 |
* The {@code encoded} argument is illegal if it: |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
142 |
* <ul> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
143 |
* <li> {@code encoded} is empty,</li> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
144 |
* <li> {@code encoded} ends with a trailing dot,</li> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
145 |
* <li> {@code encoded} is not encoded in |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
146 |
* {@link StandardCharsets#US_ASCII} or |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
147 |
* {@link StandardCharsets#UTF_8}-compliant charset,</li> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
148 |
* <li> {@code encoded} is not a valid Internationalized |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
149 |
* Domain Name (IDN) compliant with the RFC 3490 specification.</li> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
150 |
* </ul> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
151 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
152 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
153 |
* Note that the {@code encoded} byte array is cloned |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
154 |
* to protect against subsequent modification. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
155 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
156 |
* @param encoded |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
157 |
* the encoded hostname of this server name |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
158 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
159 |
* @throws NullPointerException if {@code encoded} is {@code null} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
160 |
* @throws IllegalArgumentException if {@code encoded} is illegal |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
161 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
162 |
public SNIHostName(byte[] encoded) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
163 |
// NullPointerException will be thrown if {@code encoded} is null |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
164 |
super(StandardConstants.SNI_HOST_NAME, encoded); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
165 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
166 |
// Compliance: RFC 4366 requires that the hostname is represented |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
167 |
// as a byte string using UTF_8 encoding [UTF8] |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
168 |
try { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
169 |
// Please don't use {@link String} constructors because they |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
170 |
// do not report coding errors. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
171 |
CharsetDecoder decoder = StandardCharsets.UTF_8.newDecoder() |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
172 |
.onMalformedInput(CodingErrorAction.REPORT) |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
173 |
.onUnmappableCharacter(CodingErrorAction.REPORT); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
174 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
175 |
this.hostname = IDN.toASCII( |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
176 |
decoder.decode(ByteBuffer.wrap(encoded)).toString()); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
177 |
} catch (RuntimeException | CharacterCodingException e) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
178 |
throw new IllegalArgumentException( |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
179 |
"The encoded server name value is invalid", e); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
180 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
181 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
182 |
// check the validity of the string hostname |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
183 |
checkHostName(); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
184 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
185 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
186 |
/** |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
187 |
* Returns the {@link StandardCharsets#US_ASCII}-compliant hostname of |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
188 |
* this {@code SNIHostName} object. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
189 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
190 |
* Note that, per |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
191 |
* <A HREF="http://www.ietf.org/rfc/rfc6066.txt">RFC 6066</A>, the |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
192 |
* returned hostname may be an internationalized domain name that |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
193 |
* contains A-labels. See |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
194 |
* <A HREF="http://www.ietf.org/rfc/rfc5890.txt">RFC 5890</A> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
195 |
* for more information about the detailed A-label specification. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
196 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
197 |
* @return the {@link StandardCharsets#US_ASCII}-compliant hostname |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
198 |
* of this {@code SNIHostName} object |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
199 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
200 |
public String getAsciiName() { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
201 |
return hostname; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
202 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
203 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
204 |
/** |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
205 |
* Compares this server name to the specified object. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
206 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
207 |
* Per <A HREF="http://www.ietf.org/rfc/rfc6066.txt">RFC 6066</A>, DNS |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
208 |
* hostnames are case-insensitive. Two server hostnames are equal if, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
209 |
* and only if, they have the same name type, and the hostnames are |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
210 |
* equal in a case-independent comparison. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
211 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
212 |
* @param other |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
213 |
* the other server name object to compare with. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
214 |
* @return true if, and only if, the {@code other} is considered |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
215 |
* equal to this instance |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
216 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
217 |
@Override |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
218 |
public boolean equals(Object other) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
219 |
if (this == other) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
220 |
return true; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
221 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
222 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
223 |
if (other instanceof SNIHostName) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
224 |
return hostname.equalsIgnoreCase(((SNIHostName)other).hostname); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
225 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
226 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
227 |
return false; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
228 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
229 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
230 |
/** |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
231 |
* Returns a hash code value for this {@code SNIHostName}. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
232 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
233 |
* The hash code value is generated using the case-insensitive hostname |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
234 |
* of this {@code SNIHostName}. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
235 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
236 |
* @return a hash code value for this {@code SNIHostName}. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
237 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
238 |
@Override |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
239 |
public int hashCode() { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
240 |
int result = 17; // 17/31: prime number to decrease collisions |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
241 |
result = 31 * result + hostname.toUpperCase(Locale.ENGLISH).hashCode(); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
242 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
243 |
return result; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
244 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
245 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
246 |
/** |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
247 |
* Returns a string representation of the object, including the DNS |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
248 |
* hostname in this {@code SNIHostName} object. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
249 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
250 |
* The exact details of the representation are unspecified and subject |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
251 |
* to change, but the following may be regarded as typical: |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
252 |
* <pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
253 |
* "type=host_name (0), value={@literal <hostname>}" |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
254 |
* </pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
255 |
* The "{@literal <hostname>}" is an ASCII representation of the hostname, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
256 |
* which may contains A-labels. For example, a returned value of an pseudo |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
257 |
* hostname may look like: |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
258 |
* <pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
259 |
* "type=host_name (0), value=www.example.com" |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
260 |
* </pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
261 |
* or |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
262 |
* <pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
263 |
* "type=host_name (0), value=xn--fsqu00a.xn--0zwm56d" |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
264 |
* </pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
265 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
266 |
* Please NOTE that the exact details of the representation are unspecified |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
267 |
* and subject to change. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
268 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
269 |
* @return a string representation of the object. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
270 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
271 |
@Override |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
272 |
public String toString() { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
273 |
return "type=host_name (0), value=" + hostname; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
274 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
275 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
276 |
/** |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
277 |
* Creates an {@link SNIMatcher} object for {@code SNIHostName}s. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
278 |
* <P> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
279 |
* This method can be used by a server to verify the acceptable |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
280 |
* {@code SNIHostName}s. For example, |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
281 |
* <pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
282 |
* SNIMatcher matcher = |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
283 |
* SNIHostName.createSNIMatcher("www\\.example\\.com"); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
284 |
* </pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
285 |
* will accept the hostname "www.example.com". |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
286 |
* <pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
287 |
* SNIMatcher matcher = |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
288 |
* SNIHostName.createSNIMatcher("www\\.example\\.(com|org)"); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
289 |
* </pre> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
290 |
* will accept hostnames "www.example.com" and "www.example.org". |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
291 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
292 |
* @param regex |
49433
b6671a111395
8199465: {@docRoot} references need to be updated to reflect new module/package structure
jjg
parents:
47216
diff
changeset
|
293 |
* the <a href="{@docRoot}/java.base/java/util/regex/Pattern.html#sum"> |
14194
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
294 |
* regular expression pattern</a> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
295 |
* representing the hostname(s) to match |
19602 | 296 |
* @return a {@code SNIMatcher} object for {@code SNIHostName}s |
14194
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
297 |
* @throws NullPointerException if {@code regex} is |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
298 |
* {@code null} |
18156 | 299 |
* @throws java.util.regex.PatternSyntaxException if the regular expression's |
300 |
* syntax is invalid |
|
14194
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
301 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
302 |
public static SNIMatcher createSNIMatcher(String regex) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
303 |
if (regex == null) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
304 |
throw new NullPointerException( |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
305 |
"The regular expression cannot be null"); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
306 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
307 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
308 |
return new SNIHostNameMatcher(regex); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
309 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
310 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
311 |
// check the validity of the string hostname |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
312 |
private void checkHostName() { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
313 |
if (hostname.isEmpty()) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
314 |
throw new IllegalArgumentException( |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
315 |
"Server name value of host_name cannot be empty"); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
316 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
317 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
318 |
if (hostname.endsWith(".")) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
319 |
throw new IllegalArgumentException( |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
320 |
"Server name value of host_name cannot have the trailing dot"); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
321 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
322 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
323 |
|
32649
2ee9017c7597
8136583: Core libraries should use blessed modifier order
martin
parents:
25859
diff
changeset
|
324 |
private static final class SNIHostNameMatcher extends SNIMatcher { |
14194
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
325 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
326 |
// the compiled representation of a regular expression. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
327 |
private final Pattern pattern; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
328 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
329 |
/** |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
330 |
* Creates an SNIHostNameMatcher object. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
331 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
332 |
* @param regex |
49433
b6671a111395
8199465: {@docRoot} references need to be updated to reflect new module/package structure
jjg
parents:
47216
diff
changeset
|
333 |
* the <a href="{@docRoot}/java.base/java/util/regex/Pattern.html#sum"> |
14194
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
334 |
* regular expression pattern</a> |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
335 |
* representing the hostname(s) to match |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
336 |
* @throws NullPointerException if {@code regex} is |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
337 |
* {@code null} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
338 |
* @throws PatternSyntaxException if the regular expression's syntax |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
339 |
* is invalid |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
340 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
341 |
SNIHostNameMatcher(String regex) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
342 |
super(StandardConstants.SNI_HOST_NAME); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
343 |
pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
344 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
345 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
346 |
/** |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
347 |
* Attempts to match the given {@link SNIServerName}. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
348 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
349 |
* @param serverName |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
350 |
* the {@link SNIServerName} instance on which this matcher |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
351 |
* performs match operations |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
352 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
353 |
* @return {@code true} if, and only if, the matcher matches the |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
354 |
* given {@code serverName} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
355 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
356 |
* @throws NullPointerException if {@code serverName} is {@code null} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
357 |
* @throws IllegalArgumentException if {@code serverName} is |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
358 |
* not of {@code StandardConstants#SNI_HOST_NAME} type |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
359 |
* |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
360 |
* @see SNIServerName |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
361 |
*/ |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
362 |
@Override |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
363 |
public boolean matches(SNIServerName serverName) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
364 |
if (serverName == null) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
365 |
throw new NullPointerException( |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
366 |
"The SNIServerName argument cannot be null"); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
367 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
368 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
369 |
SNIHostName hostname; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
370 |
if (!(serverName instanceof SNIHostName)) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
371 |
if (serverName.getType() != StandardConstants.SNI_HOST_NAME) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
372 |
throw new IllegalArgumentException( |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
373 |
"The server name type is not host_name"); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
374 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
375 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
376 |
try { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
377 |
hostname = new SNIHostName(serverName.getEncoded()); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
378 |
} catch (NullPointerException | IllegalArgumentException e) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
379 |
return false; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
380 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
381 |
} else { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
382 |
hostname = (SNIHostName)serverName; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
383 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
384 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
385 |
// Let's first try the ascii name matching |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
386 |
String asciiName = hostname.getAsciiName(); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
387 |
if (pattern.matcher(asciiName).matches()) { |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
388 |
return true; |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
389 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
390 |
|
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
391 |
// May be an internationalized domain name, check the Unicode |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
392 |
// representations. |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
393 |
return pattern.matcher(IDN.toUnicode(asciiName)).matches(); |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
394 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
395 |
} |
971f46db533d
7068321: Support TLS Server Name Indication (SNI) Extension in JSSE Server
xuelei
parents:
diff
changeset
|
396 |
} |