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