can't pass data during rehandshake?
In the docs I read
"New handshaking data can be intermixed among the application data"
I can't seem to get that too work. Below is alot of code all of which works except the very last line. There are only two logs in this file and I paste those after the code too. Notice SSLEngine for some reason doesn't even read my encrypted data from the buffer while in handshake. What is gonig on? what do I have wrong?
MockSSLEngineFactory factory =new MockSSLEngineFactory();
SSLEngine server = factory.createEngineForServerSocket();
SSLEngine client = factory.createEngineForSocket();
client.beginHandshake();
SSLSession s = client.getSession();
ByteBuffer unencrPacket = ByteBuffer.allocate(s.getApplicationBufferSize());
ByteBuffer encPacket = ByteBuffer.allocate(s.getPacketBufferSize());
encPacket.clear();
unencrPacket.clear();
SSLEngineResult result = client.wrap(unencrPacket, encPacket);
assertEquals(result.getHandshakeStatus(), HandshakeStatus.NEED_UNWRAP);
assertEquals(result.getStatus(), Status.OK);
helper.doneFillingBuffer(encPacket);
result = server.unwrap(encPacket, unencrPacket);
assertEquals(HandshakeStatus.NEED_TASK, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
Runnable r = server.getDelegatedTask();
r.run();
assertEquals(HandshakeStatus.NEED_WRAP, server.getHandshakeStatus());
encPacket.clear();
result = server.wrap(unencrPacket, encPacket);
assertEquals(HandshakeStatus.NEED_UNWRAP, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
helper.doneFillingBuffer(encPacket);
result = client.unwrap(encPacket, unencrPacket);
assertEquals(HandshakeStatus.NEED_TASK, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
r = client.getDelegatedTask();
r.run();
assertEquals(HandshakeStatus.NEED_WRAP, client.getHandshakeStatus());
encPacket.clear();
result = client.wrap(unencrPacket, encPacket);
assertEquals(HandshakeStatus.NEED_WRAP, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
helper.doneFillingBuffer(encPacket);
result = server.unwrap(encPacket, unencrPacket);
assertEquals(HandshakeStatus.NEED_TASK, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
r = server.getDelegatedTask();
r.run();
assertEquals(HandshakeStatus.NEED_UNWRAP, server.getHandshakeStatus());
encPacket.clear();
result = client.wrap(unencrPacket, encPacket);
assertEquals(HandshakeStatus.NEED_WRAP, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
helper.doneFillingBuffer(encPacket);
result = server.unwrap(encPacket, unencrPacket);
assertEquals(HandshakeStatus.NEED_UNWRAP, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
encPacket.clear();
result = client.wrap(unencrPacket, encPacket);
assertEquals(HandshakeStatus.NEED_UNWRAP, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
helper.doneFillingBuffer(encPacket);
result = server.unwrap(encPacket, unencrPacket);
assertEquals(HandshakeStatus.NEED_WRAP, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
encPacket.clear();
result = server.wrap(unencrPacket, encPacket);
assertEquals(HandshakeStatus.NEED_WRAP, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
helper.doneFillingBuffer(encPacket);
result = client.unwrap(encPacket, unencrPacket);
assertEquals(HandshakeStatus.NEED_UNWRAP, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
encPacket.clear();
result = server.wrap(unencrPacket, encPacket);
assertEquals(HandshakeStatus.FINISHED, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
helper.doneFillingBuffer(encPacket);
result = client.unwrap(encPacket, unencrPacket);
assertEquals(HandshakeStatus.FINISHED, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
/*****************************************************
* REHANDSHAKE BEGINS HERE.............
*****************************************************/
client.beginHandshake();
assertEquals(HandshakeStatus.NEED_WRAP, client.getHandshakeStatus());
encPacket.clear();
result = client.wrap(unencrPacket, encPacket);//first handshake message
assertEquals(HandshakeStatus.NEED_UNWRAP, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
String expected ="abc";
ByteBuffer encData = ByteBuffer.allocate(s.getPacketBufferSize());
ByteBuffer data = ByteBuffer.allocate(10);
helper.putString(data, expected);
helper.doneFillingBuffer(data);
result = client.wrap(data, encData);
assertEquals(HandshakeStatus.NEED_UNWRAP, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
unencrPacket.clear();
helper.doneFillingBuffer(encPacket);
result = server.unwrap(encPacket, unencrPacket);
assertEquals(HandshakeStatus.NEED_TASK, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
r = server.getDelegatedTask();//get task but don't run it yet...wait until after decrypt of real data
ByteBuffer dataOut = ByteBuffer.allocate(server.getSession().getApplicationBufferSize());
dataOut.clear();
helper.doneFillingBuffer(encData);
log.fine("datain1="+encData+" out="+dataOut);
result = server.unwrap(encData, dataOut);
log.fine("datain2="+encData+" out="+dataOut);
assertEquals(HandshakeStatus.NEED_TASK, result.getHandshakeStatus());
assertEquals(Status.OK, result.getStatus());
helper.doneFillingBuffer(dataOut);
String actual = helper.readString(dataOut, dataOut.remaining());
assertEquals(expected, actual);
FINE: datain1=java.nio.HeapByteBuffer[pos=0 lim=37 cap=16665] out=java.nio.HeapByteBuffer[pos=0 lim=16384 cap=16384]
Jul 4, 2005 3:45:50 PM biz.xsoftware.impl.nio.secure.test.TestNewAsynchSSLEngine testRawSSLEngine
FINE: datain2=java.nio.HeapByteBuffer[pos=0 lim=37 cap=16665] out=java.nio.HeapByteBuffer[pos=0 lim=16384 cap=16384]

