try {
out = new BufferedOutputStream(s.getOutputStream());
try {
- action(server ? serverVersion : clientVersion);
+ // Negotiate version
+ Version version;
+ if (server) {
+ String HELLO = recString();
+ if (HELLO == null || !HELLO.startsWith("VERSION ")) {
+ throw new SSLException(
+ "Client used bad encryption key");
+ }
+ version = negotiateVersion(new Version(
+ HELLO.substring("VERSION ".length())));
+ sendString("VERSION " + version);
+ } else {
+ String HELLO = sendString("VERSION " + clientVersion);
+ if (HELLO == null || !HELLO.startsWith("VERSION ")) {
+ throw new SSLException(
+ "Server did not accept the encryption key");
+ }
+ version = new Version(HELLO.substring("VERSION "
+ .length()));
+ }
+
+ // Actual code
+ action(version);
} finally {
out.close();
}
import java.net.Socket;
import java.net.UnknownHostException;
-import javax.net.ssl.SSLException;
-
import be.nikiroo.utils.Version;
/**
action = new ConnectAction(s, false, key, clientVersion) {
@Override
protected void action(Version serverVersion) throws Exception {
- ConnectActionClient.this.clientHello();
ConnectActionClient.this.action(serverVersion);
}
};
}
- /**
- * Send the HELLO message (send a String "HELLO" to the server, to check I/O
- * and encryption modes).
- * <p>
- * Will automatically handle the answer (the server must answer "HELLO" in
- * kind).
- *
- * @throws IOException
- * in case of I/O error
- * @throws SSLException
- * in case of encryption error
- */
- protected void clientHello() throws IOException {
- String HELLO = action.sendString("HELLO");
- if (!"HELLO".equals(HELLO)) {
- throw new SSLException("Server did not accept the encryption key");
- }
- }
-
/**
* Actually start the process and call the action (synchronous).
*/
package be.nikiroo.utils.serial.server;
-import java.io.IOException;
import java.net.Socket;
-import javax.net.ssl.SSLException;
-
import be.nikiroo.utils.Version;
/**
action = new ConnectAction(s, true, key, serverVersion) {
@Override
protected void action(Version clientVersion) throws Exception {
- ConnectActionServer.this.serverHello();
ConnectActionServer.this.action(clientVersion);
}
};
}
- /**
- * Send the HELLO message (check that the client sends a String "HELLO" and
- * send it back, to check I/O and encryption modes).
- *
- * @throws IOException
- * in case of I/O error
- * @throws SSLException
- * in case of encryption error
- */
- protected void serverHello() throws IOException, SSLException {
- String HELLO = action.recString();
- if (!"HELLO".equals(HELLO)) {
- throw new SSLException("Server did not accept the encryption key");
- }
- action.sendString(HELLO);
- }
-
/**
* Actually start the process and call the action (synchronous).
*/