Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/jdk/javax/net/ssl/SSLSocket/ClientExcOnAlert.java
41152 views
1
/*
2
* Copyright (c) 2020, 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.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
//
25
// Please run in othervm mode. SunJSSE does not support dynamic system
26
// properties, no way to re-use system properties in samevm/agentvm mode.
27
//
28
29
/*
30
* @test
31
* @bug 8242294
32
* @summary JSSE Client does not throw SSLException when an alert occurs during
33
* handshaking.
34
* @run main/othervm ClientExcOnAlert TLSv1.2
35
* @run main/othervm ClientExcOnAlert TLSv1.3
36
*/
37
38
import java.io.BufferedReader;
39
import java.io.ByteArrayInputStream;
40
import java.io.IOException;
41
import java.io.InputStreamReader;
42
import java.io.PrintWriter;
43
import java.net.InetAddress;
44
import java.security.GeneralSecurityException;
45
import java.security.KeyStore;
46
import java.util.Base64;
47
import java.util.concurrent.locks.Condition;
48
import java.util.concurrent.locks.Lock;
49
import java.util.concurrent.locks.ReentrantLock;
50
import javax.net.ssl.KeyManagerFactory;
51
import javax.net.ssl.SSLContext;
52
import javax.net.ssl.SSLException;
53
import javax.net.ssl.SSLServerSocket;
54
import javax.net.ssl.SSLServerSocketFactory;
55
import javax.net.ssl.SSLSocket;
56
import javax.net.ssl.SSLSocketFactory;
57
58
public class ClientExcOnAlert {
59
// This is a PKCS#12 keystore created with the following command:
60
// keytool -genkeypair -alias testcert -keyalg rsa -keysize 2048
61
// -sigalg SHA256withRSA
62
// -dname "CN=Test TLS Self-Signed Cert, O=Test" -validity 365
63
// -storetype pkcs12 -keystore p12ks.p12
64
//
65
// The resulting keystore was then converted to PEM for inclusion in this
66
// file.
67
private static int serverPort = -1;
68
private static final String KEYSTORE_PASS = "password";
69
private static final String KEYSTORE_PEM =
70
"MIIJrwIBAzCCCWgGCSqGSIb3DQEHAaCCCVkEgglVMIIJUTCCBW0GCSqGSIb3DQEH\n" +
71
"AaCCBV4EggVaMIIFVjCCBVIGCyqGSIb3DQEMCgECoIIE+zCCBPcwKQYKKoZIhvcN\n" +
72
"AQwBAzAbBBRvyuWzvSCS62cWMeKOcF0JnaYRPgIDAMNQBIIEyMrZGW/sgjhW20Gz\n" +
73
"fdj/NkWYORRTPCopS/y0NvZpmQgcu5uSbJWsadClnFBMQ2aZDJ5jaa5G2ipcrVSo\n" +
74
"c7RYSi2vAh2fqGtm25spSKyV/t1q7Z07FBIQWVNMR9IczWmM5fQyeY7V9o2M3DtN\n" +
75
"3co0RjXEpVQbvxXc5UI3Tbv8q3WKoxadicvm3uMTQCV1/swObYZqHUAMrvwgkXSy\n" +
76
"omTsCr8JwKvI2ndPA1tD+63h9v+zHK7U6n24DBNJNxZOSmUO7L+WxgQ4COkTXhZj\n" +
77
"24sYJcBJcGb74p9rv7QQn5WmkJBh+lfCQU+cS0bL6VwRZOyAesniMBpytaR5/SQW\n" +
78
"UwAk230oy64x0WegG/q4uAIeczBlu2L1HDGJp3KbGwsu5Zwqs3psHjUZJEforWzR\n" +
79
"RGTU+eBGi0U/BSeyeyY3HRimRrXytmXGcGFy6KcgAGeDwu6tG4hblyK+Fd4+8vw0\n" +
80
"T3sYOsOPR3NjOFshtcnsTa/Q9lPCAAA3WNieJyWmnh+Zg0EU26GOEeagfZ8JLvfh\n" +
81
"U1tE6e2j7L4xTt03IR2Z0U1bq+dY9eqfZb4PAqW7Zgv16m586QIjeSUecjlDRrN4\n" +
82
"OYtOKAbO2qFjevgv/5e8ja4d5rM+xlT8vcOaoLXqGvBzgWvQcDOBp3Bd7I3KuWjZ\n" +
83
"+i//bK7dnahOJP4Y2swdTy4AYkbNDPRwPmQRi0uwQ+ALH5VOxwa/MslkbmEuxVqw\n" +
84
"t/F7IP150rIT2GeV3QTE4H6QtIGHcdib72zc3eer+GqxbSCqslaxOLKneSHuFCCo\n" +
85
"9/jxaYA1i8Gunn16DV19UP8DXsOaW4pHl8FOOvTMEvLNxuXHQrZpltxfibZXW8CL\n" +
86
"Yo6HX9dXmDsf+L9M0FKOJHwueT6+aWuUzy3Y2MSb2BdxTJYzXzwqaqnsFBVxtlzB\n" +
87
"WsAoCpmXISqzQcnobqkHJ5BURVGR6o1CM1X7SvxlHV/vMtIsfjiXdWb0oPhO0KHd\n" +
88
"agOOCg4N8t6vNkj3CXoePZC1n+2+Ldx89rIsebs7Y0PBmtcnW2Ez9q6BekxVNZVJ\n" +
89
"Mcg5fzZROgQyK5rgy5IuHAUlnK/peYyoIYDLV8uFico7Fx/oIcB44mkAhVyDoP5E\n" +
90
"FSCJxi5ory1nQ1kxhfVLEPUAbUq+0q2qhx/oagbEhWJxPgkYpqr5TaXG7w3Tf735\n" +
91
"JH22YvwgfmFp9gwObZY9Ea6cmJb+jgamETLCgo5A+ghg5ecdvg9ivLBxEK1Kmx8y\n" +
92
"DHlZxm/EQnSXYUD37E0UyFdYMoXmm39avOiOmZn4z22N//WWGvI2NH0B+R9x/i3A\n" +
93
"TwvpcbJfGx3eYJnizH71GPQZOG0EbU6ctMaZqv6zMijqBwDJadl3q7m4PadJClup\n" +
94
"NW1Y+J1hJ7XJIzcS/fBTu1GHFpQNkKCuv3Dly3XhkqINGRpunA02BX51mFU3SJM+\n" +
95
"78cSq4mYt0ej5fO8iaDUEz/izTawZVryW8VvVShfHp5KHBqZEbNsEY7d06DwT+Rk\n" +
96
"9990eywGasADs0TvNcuSguIfU1WcKaCYBK4fWmy34+aDkwBQalOmzk7fSnzugKBe\n" +
97
"0mpEDey2SkTOlhX0VkHUd0YDF2hg+FAgZmFkCDqgAE9jYIOdAIYsHFGMp4VebBoM\n" +
98
"Bg2zaxQ/CCeQ+f85zDFEMB8GCSqGSIb3DQEJFDESHhAAdABlAHMAdABjAGUAcgB0\n" +
99
"MCEGCSqGSIb3DQEJFTEUBBJUaW1lIDE1ODYxNTM1NzA3NTMwggPcBgkqhkiG9w0B\n" +
100
"BwagggPNMIIDyQIBADCCA8IGCSqGSIb3DQEHATApBgoqhkiG9w0BDAEGMBsEFJVD\n" +
101
"mSE6jHuKMglKP2/O43UfmAjUAgMAw1CAggOInN3Hutt24/8YoVksN2hrcqtITqk3\n" +
102
"mfMJkYg2GtKUoNwjpGC/RB0uyOkkyikupPlv3WmDqQr0Tzrqad3laBwGuN7OWxYh\n" +
103
"yvuKCyazNT/3rDVVG/pEuvZuyLvwAARhuCnIk1cJMsLiY+4sqz/j0GnIxbhOzN/k\n" +
104
"ST8lkIekNvE7H6yHZzZ+8TxMSJ3PwCc+oyhY88aHVssOu9oAmSHznJO2prA/vl1A\n" +
105
"JQ6oODNbslCF35IsajJ2CrJAXKHut0OiBbgioKmlGwyIsFR1GnsEEyV2CcCj1ui1\n" +
106
"gd7dI/QxJJ5PpEyw/BQi+rmvAmVGTOuBJuJUlHd0JBvZ78fjbMZU7SxWSKB2YVUW\n" +
107
"1Glxw+F1HVB6kMk/Ucqnzrwns2IuNUdrxFIMo7rpEpq5ySZkeHqvpwwHE2S2XEOg\n" +
108
"8yM5PYEq6b0/0rrmXL7eoYN0Atk0cUK9lAo19cfrD9GGc7D+lHAJzFY225UP9MfR\n" +
109
"pT9NAClIbAB7mQnEta3o+MaES9EC2S+8UtcWRlW42vXX80syL08aoZYXFlwJ+9wP\n" +
110
"oQ7jEC97jH3tEkAhpMcwvDf3C/ftRnX5iOMCdbhxOL8BUMfBPlj667TidJHTb/Lr\n" +
111
"n/fyxWq/7qPrUdX8/gYCcufexDv0a8HQ8a99HAw+GzQU57jwbrmA2UHVFp/N488Q\n" +
112
"3T3Ulw2AtrEHgUWPRMokcFAfO1U8/QObOheLGTIQ3VOjwrcxENLYJif4syyrYkOP\n" +
113
"m/5d/d5TpXtI5GBGOzXjUSbz3KmoYM3MlLHGNUciZufif2lhWVwzgE+P1XLqmo1Z\n" +
114
"sY3b7CGiRKOwFMvsYfFisen6xiIJdpurE2SypLA1UBmc9QoDGp5mxFG550pRCLGI\n" +
115
"Zpsrvg16VDqU+WXbzIIu2LaJNWrM3jHnFde1cn2MJEdXchbq5FiajoZ27COUcdp9\n" +
116
"sxvssAx7Ov9lfYqacWm+bZFOX2NdYUjz3VGk2YehCN7KnegV0a9f9L3eiY8hdfE6\n" +
117
"4uDw4vIML5wDED6sIPdmywWbWm1PxRHiusWuL8PbApJ5r8cfCAfCqhYJos5TL9VD\n" +
118
"IaI7jhWPHkiarlMzrpb8XwaY5/0lzYqUNj1/gZUQA2S4PLaQTBZZ8o3HQy91SvJr\n" +
119
"kVug/6q06Xzyrxm467Q/8xIeIXym26DMp03xHatFSTvpJDxfl14cnbr2vNbPSlEy\n" +
120
"fp6NbaSzKadTU3yqva1TrEdPlDA+MCEwCQYFKw4DAhoFAAQUtSDOH+RGJI6TAjl1\n" +
121
"R2HMhteRVSMEFKmTNz/98xQ6XxJiJF5P+7rli4x5AgMBhqA=";
122
123
static final Lock lock = new ReentrantLock();
124
static final Condition serverReady = lock.newCondition();
125
126
public static void main(String[] args) throws Exception {
127
Thread serverThread = new Thread(() -> {
128
try {
129
doServerSide();
130
}
131
catch (Exception exc) {
132
log("Caught exception: %s", exc);
133
}
134
}
135
);
136
serverThread.start();
137
138
try {
139
doClientSide((args == null || args.length < 1) ? null : args[0]);
140
throw new RuntimeException("Expected SSLException did not occur!");
141
} catch (SSLException ssle) {
142
log("Caught expected exception on client: " + ssle);
143
} finally {
144
serverThread.join();
145
}
146
147
}
148
149
static void doServerSide() throws Exception {
150
Thread.currentThread().setName("ServerThread");
151
SSLContext sslc = SSLContext.getInstance("TLS");
152
log("doServerSide start");
153
KeyManagerFactory kmf = createKeyManagerFactory(KEYSTORE_PEM,
154
KEYSTORE_PASS);
155
sslc.init(kmf.getKeyManagers(), null, null);
156
SSLServerSocketFactory ssf =
157
(SSLServerSocketFactory)sslc.getServerSocketFactory();
158
159
try (SSLServerSocket sslServerSocket =
160
(SSLServerSocket)ssf.createServerSocket(0)) {
161
sslServerSocket.setReuseAddress(true);
162
// Set the server port and wake up the client thread who is waiting
163
// for the port to be set.
164
lock.lock();
165
try {
166
serverPort = sslServerSocket.getLocalPort();
167
log("Server listening on port %d", serverPort);
168
serverReady.signalAll();
169
log("Server ready");
170
} finally {
171
lock.unlock();
172
}
173
174
// Go into the accept wait state until the client initiates the
175
// TLS handshake.
176
try (SSLSocket sslSocket = (SSLSocket)sslServerSocket.accept();
177
PrintWriter pw =
178
new PrintWriter(sslSocket.getOutputStream());
179
BufferedReader br = new BufferedReader(
180
new InputStreamReader(sslSocket.getInputStream()))) {
181
log("Incoming connection from %s",
182
sslSocket.getRemoteSocketAddress());
183
String data = br.readLine();
184
log("Got mesage from client: ", data);
185
pw.write("I am server\n");
186
pw.close();
187
}
188
}
189
}
190
191
private static KeyManagerFactory createKeyManagerFactory(
192
String ksPem, String ksAuth) throws IOException,
193
GeneralSecurityException {
194
KeyManagerFactory kmf = null;
195
if (ksPem != null && ksAuth != null) {
196
Base64.Decoder b64dec = Base64.getMimeDecoder();
197
ByteArrayInputStream bais =
198
new ByteArrayInputStream(b64dec.decode(ksPem));
199
KeyStore ks = KeyStore.getInstance("PKCS12");
200
char[] ksPass = ksAuth.toCharArray();
201
ks.load(bais, ksPass);
202
203
kmf = KeyManagerFactory.getInstance("PKIX");
204
kmf.init(ks, ksAuth.toCharArray());
205
}
206
207
return kmf;
208
}
209
210
static void doClientSide(String proto) throws Exception {
211
Thread.currentThread().setName("ClientThread");
212
log("doClientSide start");
213
214
// Wait for the server to be ready and wake up this thread
215
// so the client knows which port to communicate with
216
lock.lock();
217
try {
218
serverReady.await();
219
log("Client ready to contact port %d", serverPort);
220
} finally {
221
lock.unlock();
222
}
223
224
SSLSocketFactory sslsf =
225
(SSLSocketFactory)SSLSocketFactory.getDefault();
226
try (SSLSocket sslSocket = (SSLSocket)sslsf.createSocket(
227
InetAddress.getLocalHost(), serverPort);
228
BufferedReader br = new BufferedReader(
229
new InputStreamReader(sslSocket.getInputStream()));
230
PrintWriter pw = new PrintWriter(sslSocket.getOutputStream())) {
231
232
if (proto != null) {
233
sslSocket.setEnabledProtocols(new String[] { proto });
234
}
235
pw.write("I am client\n");
236
pw.flush();
237
238
String response = br.readLine();
239
System.out.println("response is: " + response);
240
}
241
}
242
243
private static void log(String msgFmt, Object ... args) {
244
StringBuilder sb = new StringBuilder();
245
sb.append(String.format("%d | %s | ",
246
System.currentTimeMillis(), Thread.currentThread().getName()));
247
sb.append(String.format(msgFmt, args));
248
System.out.println(sb.toString());
249
}
250
}
251
252