mirror of
https://github.com/openjdk/jdk.git
synced 2025-08-28 07:14:30 +02:00
8284694: Avoid evaluating SSLAlgorithmConstraints twice
Reviewed-by: redestad, xuelei, coffeys
This commit is contained in:
parent
cb16e41089
commit
d8446b4f60
7 changed files with 429 additions and 45 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2018, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -164,7 +164,7 @@ abstract class HandshakeContext implements ConnectionContext {
|
|||
this.conContext = conContext;
|
||||
this.sslConfig = (SSLConfiguration)conContext.sslConfig.clone();
|
||||
|
||||
this.algorithmConstraints = new SSLAlgorithmConstraints(
|
||||
this.algorithmConstraints = SSLAlgorithmConstraints.wrap(
|
||||
sslConfig.userSpecifiedAlgorithmConstraints);
|
||||
this.activeProtocols = getActiveProtocols(sslConfig.enabledProtocols,
|
||||
sslConfig.enabledCipherSuites, algorithmConstraints);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2010, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -57,46 +57,98 @@ final class SSLAlgorithmConstraints implements AlgorithmConstraints {
|
|||
|
||||
// the default algorithm constraints
|
||||
static final AlgorithmConstraints DEFAULT =
|
||||
new SSLAlgorithmConstraints(null);
|
||||
new SSLAlgorithmConstraints(null, true);
|
||||
|
||||
// the default SSL only algorithm constraints
|
||||
static final AlgorithmConstraints DEFAULT_SSL_ONLY =
|
||||
new SSLAlgorithmConstraints((SSLSocket)null, false);
|
||||
new SSLAlgorithmConstraints(null, false);
|
||||
|
||||
SSLAlgorithmConstraints(AlgorithmConstraints userSpecifiedConstraints) {
|
||||
private SSLAlgorithmConstraints(AlgorithmConstraints userSpecifiedConstraints,
|
||||
boolean enabledX509DisabledAlgConstraints) {
|
||||
this(userSpecifiedConstraints, null, enabledX509DisabledAlgConstraints);
|
||||
}
|
||||
|
||||
private SSLAlgorithmConstraints(
|
||||
AlgorithmConstraints userSpecifiedConstraints,
|
||||
SupportedSignatureAlgorithmConstraints peerSpecifiedConstraints,
|
||||
boolean withDefaultCertPathConstraints) {
|
||||
this.userSpecifiedConstraints = userSpecifiedConstraints;
|
||||
this.peerSpecifiedConstraints = null;
|
||||
this.enabledX509DisabledAlgConstraints = true;
|
||||
}
|
||||
|
||||
SSLAlgorithmConstraints(SSLSocket socket,
|
||||
boolean withDefaultCertPathConstraints) {
|
||||
this.userSpecifiedConstraints = getUserSpecifiedConstraints(socket);
|
||||
this.peerSpecifiedConstraints = null;
|
||||
this.peerSpecifiedConstraints = peerSpecifiedConstraints;
|
||||
this.enabledX509DisabledAlgConstraints = withDefaultCertPathConstraints;
|
||||
}
|
||||
|
||||
SSLAlgorithmConstraints(SSLEngine engine,
|
||||
boolean withDefaultCertPathConstraints) {
|
||||
this.userSpecifiedConstraints = getUserSpecifiedConstraints(engine);
|
||||
this.peerSpecifiedConstraints = null;
|
||||
this.enabledX509DisabledAlgConstraints = withDefaultCertPathConstraints;
|
||||
/**
|
||||
* Returns a SSLAlgorithmConstraints instance that checks the provided
|
||||
* {@code userSpecifiedConstraints} in addition to standard checks.
|
||||
* Returns a singleton instance if parameter is null or DEFAULT.
|
||||
* @param userSpecifiedConstraints additional constraints to check
|
||||
* @return a SSLAlgorithmConstraints instance
|
||||
*/
|
||||
static AlgorithmConstraints wrap(AlgorithmConstraints userSpecifiedConstraints) {
|
||||
return wrap(userSpecifiedConstraints, true);
|
||||
}
|
||||
|
||||
SSLAlgorithmConstraints(SSLSocket socket, String[] supportedAlgorithms,
|
||||
private static AlgorithmConstraints wrap(
|
||||
AlgorithmConstraints userSpecifiedConstraints,
|
||||
boolean withDefaultCertPathConstraints) {
|
||||
this.userSpecifiedConstraints = getUserSpecifiedConstraints(socket);
|
||||
this.peerSpecifiedConstraints =
|
||||
new SupportedSignatureAlgorithmConstraints(supportedAlgorithms);
|
||||
this.enabledX509DisabledAlgConstraints = withDefaultCertPathConstraints;
|
||||
if (nullIfDefault(userSpecifiedConstraints) == null) {
|
||||
return withDefaultCertPathConstraints ? DEFAULT : DEFAULT_SSL_ONLY;
|
||||
}
|
||||
return new SSLAlgorithmConstraints(userSpecifiedConstraints,
|
||||
withDefaultCertPathConstraints);
|
||||
}
|
||||
|
||||
SSLAlgorithmConstraints(SSLEngine engine, String[] supportedAlgorithms,
|
||||
/**
|
||||
* Returns a SSLAlgorithmConstraints instance that checks the constraints
|
||||
* configured for the given {@code socket} in addition to standard checks.
|
||||
* Returns a singleton instance if the constraints are null or DEFAULT.
|
||||
* @param socket socket with configured constraints
|
||||
* @return a SSLAlgorithmConstraints instance
|
||||
*/
|
||||
static AlgorithmConstraints forSocket(SSLSocket socket,
|
||||
boolean withDefaultCertPathConstraints) {
|
||||
AlgorithmConstraints userSpecifiedConstraints =
|
||||
getUserSpecifiedConstraints(socket);
|
||||
return wrap(userSpecifiedConstraints, withDefaultCertPathConstraints);
|
||||
}
|
||||
|
||||
static SSLAlgorithmConstraints forSocket(
|
||||
SSLSocket socket,
|
||||
String[] supportedAlgorithms,
|
||||
boolean withDefaultCertPathConstraints) {
|
||||
this.userSpecifiedConstraints = getUserSpecifiedConstraints(engine);
|
||||
this.peerSpecifiedConstraints =
|
||||
new SupportedSignatureAlgorithmConstraints(supportedAlgorithms);
|
||||
this.enabledX509DisabledAlgConstraints = withDefaultCertPathConstraints;
|
||||
return new SSLAlgorithmConstraints(
|
||||
nullIfDefault(getUserSpecifiedConstraints(socket)),
|
||||
new SupportedSignatureAlgorithmConstraints(supportedAlgorithms),
|
||||
withDefaultCertPathConstraints);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a SSLAlgorithmConstraints instance that checks the constraints
|
||||
* configured for the given {@code engine} in addition to standard checks.
|
||||
* Returns a singleton instance if the constraints are null or DEFAULT.
|
||||
* @param engine engine with configured constraints
|
||||
* @return a SSLAlgorithmConstraints instance
|
||||
*/
|
||||
static AlgorithmConstraints forEngine(SSLEngine engine,
|
||||
boolean withDefaultCertPathConstraints) {
|
||||
AlgorithmConstraints userSpecifiedConstraints =
|
||||
getUserSpecifiedConstraints(engine);
|
||||
return wrap(userSpecifiedConstraints, withDefaultCertPathConstraints);
|
||||
}
|
||||
|
||||
static SSLAlgorithmConstraints forEngine(
|
||||
SSLEngine engine,
|
||||
String[] supportedAlgorithms,
|
||||
boolean withDefaultCertPathConstraints) {
|
||||
return new SSLAlgorithmConstraints(
|
||||
nullIfDefault(getUserSpecifiedConstraints(engine)),
|
||||
new SupportedSignatureAlgorithmConstraints(supportedAlgorithms),
|
||||
withDefaultCertPathConstraints);
|
||||
}
|
||||
|
||||
private static AlgorithmConstraints nullIfDefault(
|
||||
AlgorithmConstraints constraints) {
|
||||
return constraints == DEFAULT ? null : constraints;
|
||||
}
|
||||
|
||||
private static AlgorithmConstraints getUserSpecifiedConstraints(
|
||||
|
|
|
@ -1485,14 +1485,14 @@ final class AbstractTrustManagerWrapper extends X509ExtendedTrustManager
|
|||
String[] peerSupportedSignAlgs =
|
||||
extSession.getLocalSupportedSignatureAlgorithms();
|
||||
|
||||
constraints = new SSLAlgorithmConstraints(
|
||||
constraints = SSLAlgorithmConstraints.forSocket(
|
||||
sslSocket, peerSupportedSignAlgs, true);
|
||||
} else {
|
||||
constraints =
|
||||
new SSLAlgorithmConstraints(sslSocket, true);
|
||||
SSLAlgorithmConstraints.forSocket(sslSocket, true);
|
||||
}
|
||||
} else {
|
||||
constraints = new SSLAlgorithmConstraints(sslSocket, true);
|
||||
constraints = SSLAlgorithmConstraints.forSocket(sslSocket, true);
|
||||
}
|
||||
|
||||
checkAlgorithmConstraints(chain, constraints, checkClientTrusted);
|
||||
|
@ -1525,14 +1525,14 @@ final class AbstractTrustManagerWrapper extends X509ExtendedTrustManager
|
|||
String[] peerSupportedSignAlgs =
|
||||
extSession.getLocalSupportedSignatureAlgorithms();
|
||||
|
||||
constraints = new SSLAlgorithmConstraints(
|
||||
constraints = SSLAlgorithmConstraints.forEngine(
|
||||
engine, peerSupportedSignAlgs, true);
|
||||
} else {
|
||||
constraints =
|
||||
new SSLAlgorithmConstraints(engine, true);
|
||||
SSLAlgorithmConstraints.forEngine(engine, true);
|
||||
}
|
||||
} else {
|
||||
constraints = new SSLAlgorithmConstraints(engine, true);
|
||||
constraints = SSLAlgorithmConstraints.forEngine(engine, true);
|
||||
}
|
||||
|
||||
checkAlgorithmConstraints(chain, constraints, checkClientTrusted);
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2004, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
|
@ -199,15 +199,15 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager
|
|||
extSession.getPeerSupportedSignatureAlgorithms();
|
||||
}
|
||||
|
||||
return new SSLAlgorithmConstraints(
|
||||
return SSLAlgorithmConstraints.forSocket(
|
||||
sslSocket, peerSupportedSignAlgs, true);
|
||||
}
|
||||
}
|
||||
|
||||
return new SSLAlgorithmConstraints(sslSocket, true);
|
||||
return SSLAlgorithmConstraints.forSocket(sslSocket, true);
|
||||
}
|
||||
|
||||
return new SSLAlgorithmConstraints((SSLSocket)null, true);
|
||||
return SSLAlgorithmConstraints.DEFAULT;
|
||||
}
|
||||
|
||||
// Gets algorithm constraints of the engine.
|
||||
|
@ -225,13 +225,13 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager
|
|||
extSession.getPeerSupportedSignatureAlgorithms();
|
||||
}
|
||||
|
||||
return new SSLAlgorithmConstraints(
|
||||
return SSLAlgorithmConstraints.forEngine(
|
||||
engine, peerSupportedSignAlgs, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return new SSLAlgorithmConstraints(engine, true);
|
||||
return SSLAlgorithmConstraints.forEngine(engine, true);
|
||||
}
|
||||
|
||||
// we construct the alias we return to JSSE as seen in the code below
|
||||
|
|
|
@ -216,10 +216,10 @@ final class X509TrustManagerImpl extends X509ExtendedTrustManager
|
|||
String[] localSupportedSignAlgs =
|
||||
extSession.getLocalSupportedSignatureAlgorithms();
|
||||
|
||||
constraints = new SSLAlgorithmConstraints(
|
||||
constraints = SSLAlgorithmConstraints.forSocket(
|
||||
sslSocket, localSupportedSignAlgs, false);
|
||||
} else {
|
||||
constraints = new SSLAlgorithmConstraints(sslSocket, false);
|
||||
constraints = SSLAlgorithmConstraints.forSocket(sslSocket, false);
|
||||
}
|
||||
|
||||
// Grab any stapled OCSP responses for use in validation
|
||||
|
@ -270,10 +270,10 @@ final class X509TrustManagerImpl extends X509ExtendedTrustManager
|
|||
String[] localSupportedSignAlgs =
|
||||
extSession.getLocalSupportedSignatureAlgorithms();
|
||||
|
||||
constraints = new SSLAlgorithmConstraints(
|
||||
constraints = SSLAlgorithmConstraints.forEngine(
|
||||
engine, localSupportedSignAlgs, false);
|
||||
} else {
|
||||
constraints = new SSLAlgorithmConstraints(engine, false);
|
||||
constraints = SSLAlgorithmConstraints.forEngine(engine, false);
|
||||
}
|
||||
|
||||
// Grab any stapled OCSP responses for use in validation
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue