1 /*
2  * Copyright (c) 2003, 2015, 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  * @test
26  * @bug 4495742
27  * @summary Add non-blocking SSL/TLS functionality, usable with any
28  *      I/O abstraction
29  * @ignore the dependent implementation details are changed
30  * @author Brad Wetmore
31  *
32  * @run main/othervm ConnectionTest
33  */
34 
35 /*
36  * This is a bit hacky, meant to test various conditions.  The main
37  * thing I wanted to do with this was to do buffer reads/writes
38  * when buffers were not empty.  (buffer.position() = 10)
39  * The code could certainly be tightened up a lot.
40  */
41 import javax.net.ssl.*;
42 import javax.net.ssl.SSLEngineResult.*;
43 import java.io.*;
44 import java.security.*;
45 import java.nio.*;
46 
47 public class ConnectionTest {
48 
49     private SSLContext sslc;
50     private SSLEngine ssle1;
51     private SSLEngine ssle2;
52 
53     private static String pathToStores = "../etc";
54     private static String keyStoreFile = "keystore";
55     private static String trustStoreFile = "truststore";
56     private static String passwd = "passphrase";
57 
58     private static String keyFilename =
59             System.getProperty("test.src", "./") + "/" + pathToStores +
60                 "/" + keyStoreFile;
61     private static String trustFilename =
62             System.getProperty("test.src", "./") + "/" + pathToStores +
63                 "/" + trustStoreFile;
64 
65     private ByteBuffer appIn1, appOut1;
66     private ByteBuffer appIn2, appOut2;
67     private ByteBuffer oneToTwo, twoToOne;
68     private ByteBuffer emptyBuffer;
69 
70     private ByteBuffer  oneToTwoShifter, twoToOneShifter;
71 
72     private String hostname = "hostname";
73     private int portNumber = 77;
74 
ConnectionTest()75     public ConnectionTest()
76             throws Exception {
77 
78         sslc = getSSLContext();
79         ssle1 = sslc.createSSLEngine(hostname, portNumber);
80         ssle2 = sslc.createSSLEngine();
81 
82         ssle1.setEnabledCipherSuites(new String [] {
83             "SSL_RSA_WITH_RC4_128_MD5"});
84 
85         ssle2.setEnabledCipherSuites(new String [] {
86             "SSL_RSA_WITH_RC4_128_MD5"});
87 
88         createBuffers();
89     }
90 
getSSLContext()91     private SSLContext getSSLContext() throws Exception {
92         KeyStore ks = KeyStore.getInstance("JKS");
93         KeyStore ts = KeyStore.getInstance("JKS");
94         char[] passphrase = "passphrase".toCharArray();
95 
96         ks.load(new FileInputStream(keyFilename), passphrase);
97         ts.load(new FileInputStream(trustFilename), passphrase);
98 
99         KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
100         kmf.init(ks, passphrase);
101 
102         TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
103         tmf.init(ts);
104 
105         SSLContext sslCtx = SSLContext.getInstance("TLS");
106 
107         sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
108 
109         return sslCtx;
110     }
111 
createBuffers()112     private void createBuffers() {
113         // Size the buffers as appropriate.
114         SSLSession session = ssle1.getSession();
115         int appBufferMax = session.getApplicationBufferSize();
116         int netBufferMax = session.getPacketBufferSize();
117 
118         appIn1 = ByteBuffer.allocateDirect(appBufferMax + 10);
119         appIn2 = ByteBuffer.allocateDirect(appBufferMax + 10);
120 
121         appIn1.position(10);
122         appIn2.position(10);
123 
124         oneToTwo = ByteBuffer.allocateDirect(netBufferMax + 10);
125         twoToOne = ByteBuffer.allocateDirect(netBufferMax + 10);
126 
127         oneToTwo.position(10);
128         twoToOne.position(10);
129         oneToTwoShifter = oneToTwo.slice();
130         twoToOneShifter = twoToOne.slice();
131 
132         appOut1 = ByteBuffer.wrap("Hi Engine2, I'm SSLEngine1".getBytes());
133         appOut2 = ByteBuffer.wrap("Hello Engine1, I'm SSLEngine2".getBytes());
134 
135         emptyBuffer = ByteBuffer.allocate(10);
136         emptyBuffer.limit(5);
137         emptyBuffer.position(emptyBuffer.limit());
138 
139         System.out.println("AppOut1 = " + appOut1);
140         System.out.println("AppOut2 = " + appOut2);
141         System.out.println();
142     }
143 
checkResult(SSLEngineResult result, Status status, HandshakeStatus hsStatus, int consumed, int produced, boolean done)144     private void checkResult(SSLEngineResult result, Status status,
145             HandshakeStatus hsStatus, int consumed, int produced,
146             boolean done) throws Exception {
147 
148         if ((status != null) && (result.getStatus() != status)) {
149             throw new Exception("Unexpected Status: need = " + status +
150                 " got = " + result.getStatus());
151         }
152 
153         if ((hsStatus != null) && (result.getHandshakeStatus() != hsStatus)) {
154             throw new Exception("Unexpected hsStatus: need = " + hsStatus +
155                 " got = " + result.getHandshakeStatus());
156         }
157 
158         if ((consumed != -1) && (consumed != result.bytesConsumed())) {
159             throw new Exception("Unexpected consumed: need = " + consumed +
160                 " got = " + result.bytesConsumed());
161         }
162 
163         if ((produced != -1) && (produced != result.bytesProduced())) {
164             throw new Exception("Unexpected produced: need = " + produced +
165                 " got = " + result.bytesProduced());
166         }
167 
168         if (done && (hsStatus == HandshakeStatus.FINISHED)) {
169             throw new Exception(
170                 "Handshake already reported finished");
171         }
172 
173     }
174 
isHandshaking(SSLEngine e)175     private boolean isHandshaking(SSLEngine e) {
176         return (e.getHandshakeStatus() != HandshakeStatus.NOT_HANDSHAKING);
177     }
178 
test()179     private void test() throws Exception {
180         ssle1.setUseClientMode(true);
181         ssle2.setUseClientMode(false);
182         ssle2.setNeedClientAuth(true);
183 
184         System.out.println("Testing for early unwrap/wrap");
185         SSLEngineResult result1 = ssle1.unwrap(twoToOne, appIn1);
186         SSLEngineResult result2 = ssle2.wrap(appOut2, oneToTwo);
187 
188         /*
189          * These should not consume/produce data, because they
190          * are client and server, respectively, and don't
191          * start handshaking this way.
192          */
193         checkResult(result1, Status.OK, HandshakeStatus.NEED_WRAP,
194             0, 0, false);
195         checkResult(result2, Status.OK, HandshakeStatus.NEED_UNWRAP,
196             0, 0, false);
197 
198         System.out.println("Doing Initial Handshake");
199 
200         boolean done1 = false;
201         boolean done2 = false;
202 
203         /*
204          * Do initial handshaking
205          */
206         while (isHandshaking(ssle1) ||
207                 isHandshaking(ssle2)) {
208 
209             System.out.println("================");
210 
211             result1 = ssle1.wrap(emptyBuffer, oneToTwo);
212             checkResult(result1, null, null, 0, -1, done1);
213             result2 = ssle2.wrap(emptyBuffer, twoToOne);
214             checkResult(result2, null, null, 0, -1, done2);
215 
216             if (result1.getHandshakeStatus() == HandshakeStatus.FINISHED) {
217                 done1 = true;
218             }
219 
220             if (result2.getHandshakeStatus() == HandshakeStatus.FINISHED) {
221                 done2 = true;
222             }
223 
224             System.out.println("wrap1 = " + result1);
225             System.out.println("wrap2 = " + result2);
226 
227             if (result1.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
228                 Runnable runnable;
229                 while ((runnable = ssle1.getDelegatedTask()) != null) {
230                     runnable.run();
231                 }
232             }
233 
234             if (result2.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
235                 Runnable runnable;
236                 while ((runnable = ssle2.getDelegatedTask()) != null) {
237                     runnable.run();
238                 }
239             }
240 
241             oneToTwo.flip();
242             twoToOne.flip();
243 
244             oneToTwo.position(10);
245             twoToOne.position(10);
246 
247             System.out.println("----");
248 
249             result1 = ssle1.unwrap(twoToOne, appIn1);
250             checkResult(result1, null, null, -1, 0, done1);
251             result2 = ssle2.unwrap(oneToTwo, appIn2);
252             checkResult(result2, null, null, -1, 0, done2);
253 
254             if (result1.getHandshakeStatus() == HandshakeStatus.FINISHED) {
255                 done1 = true;
256             }
257 
258             if (result2.getHandshakeStatus() == HandshakeStatus.FINISHED) {
259                 done2 = true;
260             }
261 
262             if (result1.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
263                 Runnable runnable;
264                 while ((runnable = ssle1.getDelegatedTask()) != null) {
265                     runnable.run();
266                 }
267             }
268 
269             if (result2.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
270                 Runnable runnable;
271                 while ((runnable = ssle2.getDelegatedTask()) != null) {
272                     runnable.run();
273                 }
274             }
275 
276             System.out.println("unwrap1 = " + result1);
277             System.out.println("unwrap2 = " + result2);
278 
279             oneToTwoShifter.position(oneToTwo.position() - 10);
280             oneToTwoShifter.limit(oneToTwo.limit() - 10);
281             twoToOneShifter.position(twoToOne.position() - 10);
282             twoToOneShifter.limit(twoToOne.limit() - 10);
283             oneToTwoShifter.compact();
284             twoToOneShifter.compact();
285             oneToTwo.position(oneToTwoShifter.position() + 10);
286             oneToTwo.limit(oneToTwoShifter.limit() + 10);
287             twoToOne.position(twoToOneShifter.position() + 10);
288             twoToOne.limit(twoToOneShifter.limit() + 10);
289         }
290 
291         System.out.println("\nDONE HANDSHAKING");
292         System.out.println("================");
293 
294         if (!done1 || !done2) {
295             throw new Exception("Both should be true:\n" +
296                 " done1 = " + done1 + " done2 = " + done2);
297         }
298 
299         String host = ssle1.getPeerHost();
300         int port = ssle1.getPeerPort();
301         if (!host.equals(hostname) || (port != portNumber)) {
302             throw new Exception("unexpected host/port " + host + ":" + port);
303         }
304 
305         host = ssle2.getPeerHost();
306         port = ssle2.getPeerPort();
307         if ((host != null) || (port != -1)) {
308             throw new Exception("unexpected host/port " + host + ":" + port);
309         }
310 
311         SSLSession ssls1 = ssle1.getSession();
312 
313         host = ssls1.getPeerHost();
314         port = ssls1.getPeerPort();
315         if (!host.equals(hostname) || (port != portNumber)) {
316             throw new Exception("unexpected host/port " + host + ":" + port);
317         }
318 
319         SSLSession ssls2 = ssle2.getSession();
320 
321         host = ssls2.getPeerHost();
322         port = ssls2.getPeerPort();
323         if ((host != null) || (port != -1)) {
324             throw new Exception("unexpected host/port " + host + ":" + port);
325         }
326 
327         /*
328          * Should be able to write/read a small buffer like this.
329          */
330         int appOut1Len = appOut1.remaining();
331         int appOut2Len = appOut2.remaining();
332         int net1Len;
333         int net2Len;
334 
335         result1 = ssle1.wrap(appOut1, oneToTwo);
336         checkResult(result1, Status.OK, HandshakeStatus.NOT_HANDSHAKING,
337             appOut1Len, -1, false);
338         result2 = ssle2.wrap(appOut2, twoToOne);
339         checkResult(result2, Status.OK, HandshakeStatus.NOT_HANDSHAKING,
340             appOut2Len, -1, false);
341         net1Len = result1.bytesProduced();
342         net2Len = result2.bytesProduced();
343 
344         System.out.println("wrap1 = " + result1);
345         System.out.println("wrap2 = " + result2);
346 
347         oneToTwo.flip();
348         twoToOne.flip();
349 
350         oneToTwo.position(10);
351         twoToOne.position(10);
352 
353         System.out.println("----");
354 
355         result1 = ssle1.unwrap(twoToOne, appIn1);
356         checkResult(result1, Status.OK, HandshakeStatus.NOT_HANDSHAKING,
357             net2Len, appOut2Len, false);
358         result2 = ssle2.unwrap(oneToTwo, appIn2);
359         checkResult(result2, Status.OK, HandshakeStatus.NOT_HANDSHAKING,
360             net1Len, appOut1Len, false);
361 
362         System.out.println("unwrap1 = " + result1);
363         System.out.println("unwrap2 = " + result2);
364 
365         oneToTwoShifter.position(oneToTwo.position() - 10);
366         oneToTwoShifter.limit(oneToTwo.limit() - 10);
367         twoToOneShifter.position(twoToOne.position() - 10);
368         twoToOneShifter.limit(twoToOne.limit() - 10);
369         oneToTwoShifter.compact();
370         twoToOneShifter.compact();
371         oneToTwo.position(oneToTwoShifter.position() + 10);
372         oneToTwo.limit(oneToTwoShifter.limit() + 10);
373         twoToOne.position(twoToOneShifter.position() + 10);
374         twoToOne.limit(twoToOneShifter.limit() + 10);
375 
376         ssls2.invalidate();
377         ssle2.beginHandshake();
378 
379         System.out.println("\nRENEGOTIATING");
380         System.out.println("=============");
381 
382         done1 = false;
383         done2 = false;
384 
385         appIn1.clear();
386         appIn2.clear();
387 
388         /*
389          * Do a quick test to see if this can do a switch
390          * into client mode, at this point, you shouldn't be able
391          * to switch back.
392          */
393         try {
394             System.out.println("Try to change client mode");
395             ssle2.setUseClientMode(true);
396             throw new Exception("Should have thrown IllegalArgumentException");
397         } catch (IllegalArgumentException e) {
398             System.out.println("Caught correct IllegalArgumentException");
399         }
400 
401         while (isHandshaking(ssle1) ||
402                 isHandshaking(ssle2)) {
403 
404             System.out.println("================");
405 
406             result1 = ssle1.wrap(emptyBuffer, oneToTwo);
407             checkResult(result1, null, null, 0, -1, done1);
408             result2 = ssle2.wrap(emptyBuffer, twoToOne);
409             checkResult(result2, null, null, 0, -1, done2);
410 
411             if (result1.getHandshakeStatus() == HandshakeStatus.FINISHED) {
412                 done1 = true;
413             }
414 
415             if (result2.getHandshakeStatus() == HandshakeStatus.FINISHED) {
416                 done2 = true;
417             }
418 
419             System.out.println("wrap1 = " + result1);
420             System.out.println("wrap2 = " + result2);
421 
422             if (result1.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
423                 Runnable runnable;
424                 while ((runnable = ssle1.getDelegatedTask()) != null) {
425                     runnable.run();
426                 }
427             }
428 
429             if (result2.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
430                 Runnable runnable;
431                 while ((runnable = ssle2.getDelegatedTask()) != null) {
432                     runnable.run();
433                 }
434             }
435 
436             oneToTwo.flip();
437             twoToOne.flip();
438 
439             oneToTwo.position(10);
440             twoToOne.position(10);
441 
442             System.out.println("----");
443 
444             result1 = ssle1.unwrap(twoToOne, appIn1);
445             checkResult(result1, null, null, -1, 0, done1);
446             result2 = ssle2.unwrap(oneToTwo, appIn2);
447             checkResult(result2, null, null, -1, 0, done2);
448 
449             if (result1.getHandshakeStatus() == HandshakeStatus.FINISHED) {
450                 done1 = true;
451             }
452 
453             if (result2.getHandshakeStatus() == HandshakeStatus.FINISHED) {
454                 done2 = true;
455             }
456 
457             System.out.println("unwrap1 = " + result1);
458             System.out.println("unwrap2 = " + result2);
459 
460             if (result1.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
461                 Runnable runnable;
462                 while ((runnable = ssle1.getDelegatedTask()) != null) {
463                     runnable.run();
464                 }
465             }
466 
467             if (result2.getHandshakeStatus() == HandshakeStatus.NEED_TASK) {
468                 Runnable runnable;
469                 while ((runnable = ssle2.getDelegatedTask()) != null) {
470                     runnable.run();
471                 }
472             }
473 
474             oneToTwoShifter.position(oneToTwo.position() - 10);
475             oneToTwoShifter.limit(oneToTwo.limit() - 10);
476             twoToOneShifter.position(twoToOne.position() - 10);
477             twoToOneShifter.limit(twoToOne.limit() - 10);
478             oneToTwoShifter.compact();
479             twoToOneShifter.compact();
480             oneToTwo.position(oneToTwoShifter.position() + 10);
481             oneToTwo.limit(oneToTwoShifter.limit() + 10);
482             twoToOne.position(twoToOneShifter.position() + 10);
483             twoToOne.limit(twoToOneShifter.limit() + 10);
484         }
485 
486         host = ssle1.getPeerHost();
487         port = ssle1.getPeerPort();
488         if (!host.equals(hostname) || (port != portNumber)) {
489             throw new Exception("unexpected host/port " + host + ":" + port);
490         }
491 
492         host = ssle2.getPeerHost();
493         port = ssle2.getPeerPort();
494         if ((host != null) || (port != -1)) {
495             throw new Exception("unexpected host/port " + host + ":" + port);
496         }
497 
498         SSLSession ssls3 = ssle2.getSession();
499 
500         host = ssls1.getPeerHost();
501         port = ssls1.getPeerPort();
502         if (!host.equals(hostname) || (port != portNumber)) {
503             throw new Exception("unexpected host/port " + host + ":" + port);
504         }
505 
506         SSLSession ssls4 = ssle2.getSession();
507 
508         host = ssls2.getPeerHost();
509         port = ssls2.getPeerPort();
510         if ((host != null) || (port != -1)) {
511             throw new Exception("unexpected host/port " + host + ":" + port);
512         }
513 
514         System.out.println("\nDoing close");
515         System.out.println("===========");
516 
517         ssle1.closeOutbound();
518         ssle2.closeOutbound();
519 
520         oneToTwo.flip();
521         twoToOne.flip();
522         oneToTwo.position(10);
523         twoToOne.position(10);
524 
525         appIn1.clear();
526         appIn2.clear();
527 
528         System.out.println("LAST UNWRAP");
529         result1 = ssle1.unwrap(twoToOne, appIn1);
530         checkResult(result1, Status.BUFFER_UNDERFLOW,
531             HandshakeStatus.NEED_WRAP, 0, 0, false);
532         result2 = ssle2.unwrap(oneToTwo, appIn2);
533         checkResult(result2, Status.BUFFER_UNDERFLOW,
534             HandshakeStatus.NEED_WRAP, 0, 0, false);
535 
536         System.out.println("unwrap1 = " + result1);
537         System.out.println("unwrap2 = " + result2);
538 
539         oneToTwoShifter.position(oneToTwo.position() - 10);
540         oneToTwoShifter.limit(oneToTwo.limit() - 10);
541         twoToOneShifter.position(twoToOne.position() - 10);
542         twoToOneShifter.limit(twoToOne.limit() - 10);
543         oneToTwoShifter.compact();
544         twoToOneShifter.compact();
545         oneToTwo.position(oneToTwoShifter.position() + 10);
546         oneToTwo.limit(oneToTwoShifter.limit() + 10);
547         twoToOne.position(twoToOneShifter.position() + 10);
548         twoToOne.limit(twoToOneShifter.limit() + 10);
549 
550         System.out.println("LAST WRAP");
551         result1 = ssle1.wrap(appOut1, oneToTwo);
552         checkResult(result1, Status.CLOSED, HandshakeStatus.NEED_UNWRAP,
553             0, -1, false);
554         result2 = ssle2.wrap(appOut2, twoToOne);
555         checkResult(result2, Status.CLOSED, HandshakeStatus.NEED_UNWRAP,
556             0, -1, false);
557 
558         System.out.println("wrap1 = " + result1);
559         System.out.println("wrap2 = " + result2);
560 
561         net1Len = result1.bytesProduced();
562         net2Len = result2.bytesProduced();
563 
564         oneToTwo.flip();
565         twoToOne.flip();
566 
567         oneToTwo.position(10);
568         twoToOne.position(10);
569 
570         result1 = ssle1.unwrap(twoToOne, appIn1);
571         checkResult(result1, Status.CLOSED, HandshakeStatus.NOT_HANDSHAKING,
572             net1Len, 0, false);
573         result2 = ssle2.unwrap(oneToTwo, appIn2);
574         checkResult(result2, Status.CLOSED, HandshakeStatus.NOT_HANDSHAKING,
575             net2Len, 0, false);
576 
577         System.out.println("unwrap1 = " + result1);
578         System.out.println("unwrap2 = " + result2);
579 
580         oneToTwoShifter.position(oneToTwo.position() - 10);
581         oneToTwoShifter.limit(oneToTwo.limit() - 10);
582         twoToOneShifter.position(twoToOne.position() - 10);
583         twoToOneShifter.limit(twoToOne.limit() - 10);
584         oneToTwoShifter.compact();
585         twoToOneShifter.compact();
586         oneToTwo.position(oneToTwoShifter.position() + 10);
587         oneToTwo.limit(oneToTwoShifter.limit() + 10);
588         twoToOne.position(twoToOneShifter.position() + 10);
589         twoToOne.limit(twoToOneShifter.limit() + 10);
590 
591         System.out.println("EXTRA WRAP");
592         result1 = ssle1.wrap(appOut1, oneToTwo);
593         checkResult(result1, Status.CLOSED, HandshakeStatus.NOT_HANDSHAKING,
594             0, 0, false);
595         result2 = ssle2.wrap(appOut2, twoToOne);
596         checkResult(result2, Status.CLOSED, HandshakeStatus.NOT_HANDSHAKING,
597             0, 0, false);
598 
599         System.out.println("wrap1 = " + result1);
600         System.out.println("wrap2 = " + result2);
601 
602         oneToTwo.flip();
603         twoToOne.flip();
604         oneToTwo.position(10);
605         twoToOne.position(10);
606 
607         System.out.println("EXTRA UNWRAP");
608         result1 = ssle1.unwrap(twoToOne, appIn1);
609         checkResult(result1, Status.CLOSED, HandshakeStatus.NOT_HANDSHAKING,
610             0, 0, false);
611         result2 = ssle2.unwrap(oneToTwo, appIn2);
612         checkResult(result2, Status.CLOSED, HandshakeStatus.NOT_HANDSHAKING,
613             0, 0, false);
614 
615         System.out.println("unwrap1 = " + result1);
616         System.out.println("unwrap2 = " + result2);
617 
618         checkSession(ssls1, ssls2, ssls3, ssls4);
619         System.out.println(ssle1);
620         System.out.println(ssle2);
621     }
622 
checkSession(SSLSession ssls1, SSLSession ssls2, SSLSession ssls3, SSLSession ssls4)623     private static void checkSession(SSLSession ssls1, SSLSession ssls2,
624             SSLSession ssls3, SSLSession ssls4) throws Exception {
625         System.out.println("\nSession Info for SSLEngine1");
626         System.out.println(ssls1);
627         System.out.println(ssls1.getCreationTime());
628         String peer1 = ssls1.getPeerHost();
629         System.out.println(peer1);
630         String protocol1 = ssls1.getProtocol();
631         System.out.println(protocol1);
632         java.security.cert.Certificate cert1 = ssls1.getPeerCertificates()[0];
633         System.out.println(cert1);
634         String ciphersuite1 = ssls1.getCipherSuite();
635         System.out.println(ciphersuite1);
636         System.out.println();
637 
638         System.out.println("\nSession Info for SSLEngine2");
639         System.out.println(ssls2);
640         System.out.println(ssls2.getCreationTime());
641         String peer2 = ssls2.getPeerHost();
642         System.out.println(peer2);
643         String protocol2 = ssls2.getProtocol();
644         System.out.println(protocol2);
645         java.security.cert.Certificate cert2 = ssls2.getPeerCertificates()[0];
646         System.out.println(cert2);
647         String ciphersuite2 = ssls2.getCipherSuite();
648         System.out.println(ciphersuite2);
649         System.out.println();
650 
651         if (peer1.equals(peer2)) {
652             throw new Exception("peer hostnames not equal");
653         }
654 
655         if (!protocol1.equals(protocol2)) {
656             throw new Exception("protocols not equal");
657         }
658 
659         if (!cert1.equals(cert2)) {
660             throw new Exception("certs not equal");
661         }
662 
663         if (!ciphersuite1.equals(ciphersuite2)) {
664             throw new Exception("ciphersuites not equal");
665         }
666 
667         System.out.println("\nSession Info for SSLEngine3");
668         System.out.println(ssls3);
669         System.out.println("\nSession Info for SSLEngine4");
670         System.out.println(ssls4);
671 
672         if (ssls3.equals(ssls1) || ssls4.equals(ssls2)) {
673             throw new Exception("sessions should not be equals");
674         }
675     }
676 
main(String args[])677     public static void main(String args[]) throws Exception {
678         // reset the security property to make sure that the algorithms
679         // and keys used in this test are not disabled.
680         Security.setProperty("jdk.tls.disabledAlgorithms", "");
681 
682         ConnectionTest ct = new ConnectionTest();
683         ct.test();
684     }
685 }
686