package org.jboss.pitbull.internal.client; import org.jboss.pitbull.internal.nio.socket.SSLChannel; import javax.net.ssl.SSLEngine; import javax.net.ssl.SSLEngineResult; import java.io.IOException; import java.nio.channels.SocketChannel; /** * @author <a href="mailto:bill@burkecentral.com">Bill Burke</a> * @version $Revision: 1 $ */ public class ClientSSLChannel extends SSLChannel { public ClientSSLChannel(SocketChannel channel, SSLEngine engine) throws Exception { super(channel, engine); doHandshake(); } public void doHandshake() throws IOException { log.trace("client doHandshake()"); inputBuffer.clear(); appBuffer.clear(); SSLEngineResult res; try { for (; ; ) { handshakeStatus = engine.getHandshakeStatus(); switch (handshakeStatus) { case FINISHED: log.trace("client Handshake FINISHED"); return; case NEED_TASK: log.trace("client Handshake NEED_TASK"); executeEngineTasks(); break; case NEED_UNWRAP: log.trace("client Handshake NEED_UNWRAP"); if (inputBuffer.position() > 0 && engineStatus != SSLEngineResult.Status.BUFFER_UNDERFLOW) { log.trace("Calling needUnwrap"); if (needUnwrap()) { throw new IOException("Socket closed"); } } else { log.trace("client unwrap readBlockingSuper"); int read = this.readBlockingSuper(inputBuffer); if (read == -1) { log.trace("client aborting"); throw new IOException("Socket closed"); } else { log.trace("read {0}, inputBuffer.position() {1}", read, inputBuffer.position()); if (needUnwrap()) { throw new IOException("Socket closed"); } } } break; case NEED_WRAP: log.trace("client Handshake NEED_WRAP"); outputBuffer.clear(); res = engine.wrap(dummy, outputBuffer); handshakeStatus = res.getHandshakeStatus(); outputBuffer.flip(); if (super.writeBlockingSuper(outputBuffer) == -1) { throw new IOException("Error writing"); } break; case NOT_HANDSHAKING: log.trace("client Handshake NOT_HANDSHAKING"); return; } } } finally { appBuffer.flip(); handshakeStatus = engine.getHandshakeStatus(); log.trace("End doHandshake() : {0}", handshakeStatus); } } }