3789983e89
Reviewed-by: darcy, ihse
193 lines
6.1 KiB
Java
193 lines
6.1 KiB
Java
/*
|
|
* Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved.
|
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
*
|
|
* This code is free software; you can redistribute it and/or modify it
|
|
* under the terms of the GNU General Public License version 2 only, as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
* version 2 for more details (a copy is included in the LICENSE file that
|
|
* accompanied this code).
|
|
*
|
|
* You should have received a copy of the GNU General Public License version
|
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
*
|
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
* or visit www.oracle.com if you need additional information or have any
|
|
* questions.
|
|
*/
|
|
|
|
/*
|
|
* This class may have some race conditions that I haven't
|
|
* accounted for. I've tried to put in sufficient sleeps and triggers
|
|
* that should cause everything to run correctly.
|
|
*
|
|
* This was hackish, but to make sure that there were no problems
|
|
* with permissions.
|
|
*
|
|
* Create a client, server, and interested party thread. The
|
|
* client and interested threads should receive the same
|
|
* session notification.
|
|
*/
|
|
package com;
|
|
|
|
import java.net.*;
|
|
import java.io.*;
|
|
import javax.net.ssl.*;
|
|
import java.security.cert.*;
|
|
import java.security.*;
|
|
|
|
public class NotifyHandshakeTest implements HandshakeCompletedListener {
|
|
|
|
static String pathToStores = "../../../../javax/net/ssl/etc";
|
|
static String keyStoreFile = "keystore";
|
|
static String trustStoreFile = "truststore";
|
|
static String passwd = "passphrase";
|
|
volatile static int serverPort = 0;
|
|
|
|
public boolean set;
|
|
SSLSession sess;
|
|
|
|
static public int triggerState = 0;
|
|
|
|
static public void trigger() {
|
|
triggerState++;
|
|
}
|
|
|
|
public void handshakeCompleted(HandshakeCompletedEvent event) {
|
|
set = true;
|
|
sess = event.getSession();
|
|
trigger();
|
|
}
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
|
|
String keyFilename =
|
|
System.getProperty("test.src", "./") + "/" + pathToStores +
|
|
"/" + keyStoreFile;
|
|
String trustFilename =
|
|
System.getProperty("test.src", "./") + "/" + pathToStores +
|
|
"/" + trustStoreFile;
|
|
|
|
System.setProperty("javax.net.ssl.keyStore", keyFilename);
|
|
System.setProperty("javax.net.ssl.keyStorePassword", passwd);
|
|
System.setProperty("javax.net.ssl.trustStore", trustFilename);
|
|
System.setProperty("javax.net.ssl.trustStorePassword", passwd);
|
|
|
|
SSLSocketFactory sslsf =
|
|
(SSLSocketFactory)SSLSocketFactory.getDefault();
|
|
SSLServerSocketFactory sslssf =
|
|
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
|
|
|
|
/*
|
|
* Start off the Server, give time to initialize.
|
|
*/
|
|
SSLServerSocket sslss =
|
|
(SSLServerSocket)sslssf.createServerSocket(serverPort);
|
|
sslss.setSoTimeout(30000); // 30 seconds
|
|
serverPort = sslss.getLocalPort();
|
|
Server server = new Server(sslss);
|
|
server.start();
|
|
|
|
System.out.println("Server started...");
|
|
|
|
/*
|
|
* Create the socket.
|
|
*/
|
|
SSLSocket socket =
|
|
(SSLSocket)sslsf.createSocket("localhost", serverPort);
|
|
|
|
/*
|
|
* Create a second thread also interested in this socket
|
|
*/
|
|
edu.NotifyHandshakeTestHeyYou heyYou =
|
|
new edu.NotifyHandshakeTestHeyYou(socket);
|
|
heyYou.start();
|
|
while (triggerState < 1) {
|
|
Thread.sleep(500);
|
|
}
|
|
System.out.println("HeyYou thread ready...");
|
|
|
|
NotifyHandshakeTest listener = new NotifyHandshakeTest();
|
|
socket.addHandshakeCompletedListener(listener);
|
|
|
|
System.out.println("Client starting handshake...");
|
|
socket.startHandshake();
|
|
System.out.println("Client done handshaking...");
|
|
|
|
InputStream is = socket.getInputStream();
|
|
if ((byte)is.read() != (byte)0x77) {
|
|
throw new Exception("problem reading byte");
|
|
}
|
|
|
|
/*
|
|
* Wait for HeyYou and the client to get a slice, so
|
|
* they can receive their SSLSessions.
|
|
*/
|
|
while (triggerState < 3) {
|
|
Thread.sleep(500);
|
|
}
|
|
|
|
/*
|
|
* Grab the variables before reaping the thread.
|
|
*/
|
|
boolean heyYouSet = heyYou.set;
|
|
AccessControlContext heyYouACC = heyYou.acc;
|
|
SSLSession heyYouSess = heyYou.ssls;
|
|
|
|
heyYou.interrupt();
|
|
heyYou.join();
|
|
server.join();
|
|
|
|
socket.close();
|
|
|
|
if (!heyYouSet) {
|
|
throw new Exception("HeyYou's wasn't set");
|
|
}
|
|
if (!listener.set) {
|
|
throw new Exception("This' wasn't set");
|
|
}
|
|
|
|
if (heyYouACC.equals(AccessController.getContext())) {
|
|
throw new Exception("Access Control Contexts were the same");
|
|
}
|
|
|
|
if (!heyYouSess.equals(listener.sess)) {
|
|
throw new Exception("SSLSessions were not equal");
|
|
}
|
|
|
|
System.out.println("Everything Passed");
|
|
}
|
|
|
|
static class Server extends Thread {
|
|
|
|
SSLServerSocket ss;
|
|
|
|
Server(SSLServerSocket ss) {
|
|
this.ss = ss;
|
|
}
|
|
|
|
public void run() {
|
|
try {
|
|
System.out.println("Server accepting socket...");
|
|
SSLSocket s = (SSLSocket) ss.accept();
|
|
System.out.println(
|
|
"Server accepted socket...starting handshake");
|
|
s.startHandshake();
|
|
System.out.println("Server done handshaking");
|
|
OutputStream os = s.getOutputStream();
|
|
os.write(0x77);
|
|
os.flush();
|
|
System.out.println("Server returning");
|
|
} catch (Exception e) {
|
|
System.out.println("Server died");
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
}
|