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