From 54c3de0f8aa9e4eb2c95a368dcaa0b8cbb48403b Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Mon, 7 May 2018 20:10:06 +0200 Subject: [PATCH] Add test to validate SSLEngine does not zero out src buffer on wrap. (#7914) Motivation: We had a bug-report that claimed the src buffer used by OpenSslEngine will be zero out. Modifications: Add testcase to ensure correct behaviour Result: Testcase for https://github.com/netty/netty/issues/7753 --- .../io/netty/handler/ssl/SSLEngineTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/handler/src/test/java/io/netty/handler/ssl/SSLEngineTest.java b/handler/src/test/java/io/netty/handler/ssl/SSLEngineTest.java index bfaad7901f..7d86fa278e 100644 --- a/handler/src/test/java/io/netty/handler/ssl/SSLEngineTest.java +++ b/handler/src/test/java/io/netty/handler/ssl/SSLEngineTest.java @@ -2311,4 +2311,48 @@ public abstract class SSLEngineTest { assertEquals(0, result.bytesConsumed()); assertEquals(0, result.bytesProduced()); } + + @Test + public void testWrapDoesNotZeroOutSrc() throws Exception { + SelfSignedCertificate cert = new SelfSignedCertificate(); + + clientSslCtx = SslContextBuilder + .forClient() + .trustManager(cert.cert()) + .sslProvider(sslClientProvider()) + .build(); + SSLEngine client = clientSslCtx.newEngine(UnpooledByteBufAllocator.DEFAULT); + + serverSslCtx = SslContextBuilder + .forServer(cert.certificate(), cert.privateKey()) + .sslProvider(sslServerProvider()) + .build(); + SSLEngine server = serverSslCtx.newEngine(UnpooledByteBufAllocator.DEFAULT); + + try { + ByteBuffer plainServerOut = allocateBuffer(server.getSession().getApplicationBufferSize() / 2); + + handshake(client, server); + + // Fill the whole buffer and flip it. + for (int i = 0; i < plainServerOut.capacity(); i++) { + plainServerOut.put(i, (byte) i); + } + plainServerOut.position(plainServerOut.capacity()); + plainServerOut.flip(); + + ByteBuffer encryptedServerToClient = allocateBuffer(server.getSession().getPacketBufferSize()); + SSLEngineResult result = server.wrap(plainServerOut, encryptedServerToClient); + assertEquals(SSLEngineResult.Status.OK, result.getStatus()); + assertTrue(result.bytesConsumed() > 0); + + for (int i = 0; i < plainServerOut.capacity(); i++) { + assertEquals((byte) i, plainServerOut.get(i)); + } + } finally { + cleanupClientSslEngine(client); + cleanupServerSslEngine(server); + cert.delete(); + } + } }