Add test for correctly handling SSLSessionBindingEvent when acting on th… (#8649)
Motivation: During some other work I noticed we do not have any tests to ensure we correctly use SSLSessionBindingEvent. We should add some testing. Modifications: - Added unit test to verify we correctly implement it. - Ignore the test when using Conscrypt as it not correctly implements it. Result: More tests for custom SSL impl.
This commit is contained in:
parent
d77bdeaa7d
commit
9947df4a74
@ -79,4 +79,11 @@ public class ConscryptJdkSslEngineInteropTest extends SSLEngineTest {
|
|||||||
// TODO(scott): work around for a JDK issue. The exception should be SSLHandshakeException.
|
// TODO(scott): work around for a JDK issue. The exception should be SSLHandshakeException.
|
||||||
return super.mySetupMutualAuthServerIsValidServerException(cause) || causedBySSLException(cause);
|
return super.mySetupMutualAuthServerIsValidServerException(cause) || causedBySSLException(cause);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Ignore("Ignore due bug in Conscrypt")
|
||||||
|
@Override
|
||||||
|
public void testSessionBindingEvent() throws Exception {
|
||||||
|
// Ignore due bug in Conscrypt where the incorrect SSLSession object is used in the SSLSessionBindingEvent.
|
||||||
|
// See https://github.com/google/conscrypt/issues/593
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,4 +77,11 @@ public class ConscryptSslEngineTest extends SSLEngineTest {
|
|||||||
@Override
|
@Override
|
||||||
public void testMutualAuthValidClientCertChainTooLongFailRequireClientAuth() {
|
public void testMutualAuthValidClientCertChainTooLongFailRequireClientAuth() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Ignore("Ignore due bug in Conscrypt")
|
||||||
|
@Override
|
||||||
|
public void testSessionBindingEvent() throws Exception {
|
||||||
|
// Ignore due bug in Conscrypt where the incorrect SSLSession object is used in the SSLSessionBindingEvent.
|
||||||
|
// See https://github.com/google/conscrypt/issues/593
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,8 @@ import javax.net.ssl.SSLHandshakeException;
|
|||||||
import javax.net.ssl.SSLParameters;
|
import javax.net.ssl.SSLParameters;
|
||||||
import javax.net.ssl.SSLPeerUnverifiedException;
|
import javax.net.ssl.SSLPeerUnverifiedException;
|
||||||
import javax.net.ssl.SSLSession;
|
import javax.net.ssl.SSLSession;
|
||||||
|
import javax.net.ssl.SSLSessionBindingEvent;
|
||||||
|
import javax.net.ssl.SSLSessionBindingListener;
|
||||||
import javax.net.ssl.SSLSocketFactory;
|
import javax.net.ssl.SSLSocketFactory;
|
||||||
import javax.net.ssl.TrustManager;
|
import javax.net.ssl.TrustManager;
|
||||||
import javax.net.ssl.TrustManagerFactory;
|
import javax.net.ssl.TrustManagerFactory;
|
||||||
@ -2730,6 +2732,86 @@ public abstract class SSLEngineTest {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSessionBindingEvent() throws Exception {
|
||||||
|
clientSslCtx = SslContextBuilder.forClient()
|
||||||
|
.trustManager(InsecureTrustManagerFactory.INSTANCE)
|
||||||
|
.sslProvider(sslClientProvider())
|
||||||
|
.sslContextProvider(clientSslContextProvider())
|
||||||
|
.protocols(protocols())
|
||||||
|
.ciphers(ciphers())
|
||||||
|
.build();
|
||||||
|
SelfSignedCertificate ssc = new SelfSignedCertificate();
|
||||||
|
serverSslCtx = SslContextBuilder.forServer(ssc.certificate(), ssc.privateKey())
|
||||||
|
.sslProvider(sslServerProvider())
|
||||||
|
.sslContextProvider(serverSslContextProvider())
|
||||||
|
.protocols(protocols())
|
||||||
|
.ciphers(ciphers())
|
||||||
|
.build();
|
||||||
|
SSLEngine clientEngine = null;
|
||||||
|
SSLEngine serverEngine = null;
|
||||||
|
try {
|
||||||
|
clientEngine = wrapEngine(clientSslCtx.newEngine(UnpooledByteBufAllocator.DEFAULT));
|
||||||
|
serverEngine = wrapEngine(serverSslCtx.newEngine(UnpooledByteBufAllocator.DEFAULT));
|
||||||
|
handshake(clientEngine, serverEngine);
|
||||||
|
SSLSession session = clientEngine.getSession();
|
||||||
|
assertEquals(0, session.getValueNames().length);
|
||||||
|
|
||||||
|
class SSLSessionBindingEventValue implements SSLSessionBindingListener {
|
||||||
|
SSLSessionBindingEvent boundEvent;
|
||||||
|
SSLSessionBindingEvent unboundEvent;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void valueBound(SSLSessionBindingEvent sslSessionBindingEvent) {
|
||||||
|
assertNull(boundEvent);
|
||||||
|
boundEvent = sslSessionBindingEvent;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void valueUnbound(SSLSessionBindingEvent sslSessionBindingEvent) {
|
||||||
|
assertNull(unboundEvent);
|
||||||
|
unboundEvent = sslSessionBindingEvent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String name = "name";
|
||||||
|
String name2 = "name2";
|
||||||
|
|
||||||
|
SSLSessionBindingEventValue value1 = new SSLSessionBindingEventValue();
|
||||||
|
session.putValue(name, value1);
|
||||||
|
assertSSLSessionBindingEventValue(name, session, value1.boundEvent);
|
||||||
|
assertNull(value1.unboundEvent);
|
||||||
|
assertEquals(1, session.getValueNames().length);
|
||||||
|
|
||||||
|
session.putValue(name2, "value");
|
||||||
|
|
||||||
|
SSLSessionBindingEventValue value2 = new SSLSessionBindingEventValue();
|
||||||
|
session.putValue(name, value2);
|
||||||
|
assertEquals(2, session.getValueNames().length);
|
||||||
|
|
||||||
|
assertSSLSessionBindingEventValue(name, session, value1.unboundEvent);
|
||||||
|
assertSSLSessionBindingEventValue(name, session, value2.boundEvent);
|
||||||
|
assertNull(value2.unboundEvent);
|
||||||
|
assertEquals(2, session.getValueNames().length);
|
||||||
|
|
||||||
|
session.removeValue(name);
|
||||||
|
assertSSLSessionBindingEventValue(name, session, value2.unboundEvent);
|
||||||
|
assertEquals(1, session.getValueNames().length);
|
||||||
|
session.removeValue(name2);
|
||||||
|
} finally {
|
||||||
|
cleanupClientSslEngine(clientEngine);
|
||||||
|
cleanupServerSslEngine(serverEngine);
|
||||||
|
ssc.delete();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void assertSSLSessionBindingEventValue(
|
||||||
|
String name, SSLSession session, SSLSessionBindingEvent event) {
|
||||||
|
assertEquals(name, event.getName());
|
||||||
|
assertEquals(session, event.getSession());
|
||||||
|
assertEquals(session, event.getSource());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSessionAfterHandshake() throws Exception {
|
public void testSessionAfterHandshake() throws Exception {
|
||||||
testSessionAfterHandshake0(false, false);
|
testSessionAfterHandshake0(false, false);
|
||||||
|
Loading…
Reference in New Issue
Block a user