Skip to content

Commit 65c3dc4

Browse files
committed
BCJSSE: Fix supported_versions creation for renegotiation handshake
1 parent d0d4345 commit 65c3dc4

File tree

2 files changed

+38
-33
lines changed

2 files changed

+38
-33
lines changed

tls/src/main/java/org/bouncycastle/jsse/provider/ProvTlsClient.java

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ protected Vector<ServerName> getSNIServerNames()
214214
@Override
215215
protected int[] getSupportedCipherSuites()
216216
{
217-
return manager.getContextData().getActiveCipherSuites(getCrypto(), sslParameters, getProtocolVersions());
217+
return null;
218218
}
219219

220220
@Override
@@ -240,7 +240,7 @@ protected Vector<SignatureAndHashAlgorithm> getSupportedSignatureAlgorithmsCert(
240240
@Override
241241
protected ProtocolVersion[] getSupportedVersions()
242242
{
243-
return manager.getContextData().getActiveProtocolVersions(sslParameters);
243+
return null;
244244
}
245245

246246
@Override
@@ -492,13 +492,30 @@ public void notifyHandshakeBeginning() throws IOException
492492
{
493493
super.notifyHandshakeBeginning();
494494

495-
if (LOG.isLoggable(Level.FINE))
495+
ContextData contextData = manager.getContextData();
496+
ProtocolVersion[] activeProtocolVersions;
497+
498+
if (context.getSecurityParametersHandshake().isRenegotiating())
496499
{
497-
LOG.fine(clientID + " opening connection to " + JsseUtils.getPeerReport(manager));
500+
if (LOG.isLoggable(Level.FINE))
501+
{
502+
LOG.fine(clientID + " renegotiating connection to " + JsseUtils.getPeerReport(manager));
503+
}
504+
505+
activeProtocolVersions = context.getSecurityParametersConnection().getNegotiatedVersion().only();
498506
}
507+
else
508+
{
509+
if (LOG.isLoggable(Level.FINE))
510+
{
511+
LOG.fine(clientID + " opening connection to " + JsseUtils.getPeerReport(manager));
512+
}
499513

500-
ContextData contextData = manager.getContextData();
501-
ProtocolVersion[] activeProtocolVersions = getProtocolVersions();
514+
activeProtocolVersions = contextData.getActiveProtocolVersions(sslParameters);
515+
}
516+
517+
this.protocolVersions = activeProtocolVersions;
518+
this.cipherSuites = contextData.getActiveCipherSuites(getCrypto(), sslParameters, activeProtocolVersions);
502519

503520
jsseSecurityParameters.namedGroups = contextData.getNamedGroupsClient(sslParameters, activeProtocolVersions);
504521

tls/src/main/java/org/bouncycastle/tls/TlsClientProtocol.java

Lines changed: 15 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1142,6 +1142,11 @@ protected void processServerHello(ServerHello serverHello)
11421142
server_version = supported_version;
11431143
}
11441144

1145+
if (!ProtocolVersion.contains(tlsClientContext.getClientSupportedVersions(), server_version))
1146+
{
1147+
throw new TlsFatalAlert(AlertDescription.protocol_version);
1148+
}
1149+
11451150
final SecurityParameters securityParameters = tlsClientContext.getSecurityParametersHandshake();
11461151

11471152
if (securityParameters.isRenegotiating())
@@ -1154,11 +1159,6 @@ protected void processServerHello(ServerHello serverHello)
11541159
}
11551160
else
11561161
{
1157-
if (!ProtocolVersion.contains(tlsClientContext.getClientSupportedVersions(), server_version))
1158-
{
1159-
throw new TlsFatalAlert(AlertDescription.protocol_version);
1160-
}
1161-
11621162
ProtocolVersion legacy_record_version = server_version.isLaterVersionOf(ProtocolVersion.TLSv12)
11631163
? ProtocolVersion.TLSv12
11641164
: server_version;
@@ -1764,21 +1764,10 @@ protected void sendClientHello()
17641764
{
17651765
SecurityParameters securityParameters = tlsClientContext.getSecurityParametersHandshake();
17661766

1767-
ProtocolVersion[] supportedVersions;
1768-
ProtocolVersion earliestVersion, latestVersion;
1767+
ProtocolVersion[] supportedVersions = tlsClient.getProtocolVersions();
17691768

1770-
if (securityParameters.isRenegotiating())
1771-
{
1772-
ProtocolVersion clientVersion = tlsClientContext.getClientVersion();
1773-
1774-
supportedVersions = clientVersion.only();
1775-
earliestVersion = clientVersion;
1776-
latestVersion = clientVersion;
1777-
}
1778-
else
1769+
if (!securityParameters.isRenegotiating())
17791770
{
1780-
supportedVersions = tlsClient.getProtocolVersions();
1781-
17821771
if (ProtocolVersion.contains(supportedVersions, ProtocolVersion.SSLv3))
17831772
{
17841773
// TODO[tls13] Prevent offering SSLv3 AND TLSv13?
@@ -1788,18 +1777,17 @@ protected void sendClientHello()
17881777
{
17891778
recordStream.setWriteVersion(ProtocolVersion.TLSv10);
17901779
}
1780+
}
17911781

1792-
earliestVersion = ProtocolVersion.getEarliestTLS(supportedVersions);
1793-
latestVersion = ProtocolVersion.getLatestTLS(supportedVersions);
1794-
1795-
if (!ProtocolVersion.isSupportedTLSVersionClient(latestVersion))
1796-
{
1797-
throw new TlsFatalAlert(AlertDescription.internal_error);
1798-
}
1782+
ProtocolVersion earliestVersion = ProtocolVersion.getEarliestTLS(supportedVersions);
1783+
ProtocolVersion latestVersion = ProtocolVersion.getLatestTLS(supportedVersions);
17991784

1800-
tlsClientContext.setClientVersion(latestVersion);
1785+
if (!ProtocolVersion.isSupportedTLSVersionClient(latestVersion))
1786+
{
1787+
throw new TlsFatalAlert(AlertDescription.internal_error);
18011788
}
1802-
1789+
1790+
tlsClientContext.setClientVersion(latestVersion);
18031791
tlsClientContext.setClientSupportedVersions(supportedVersions);
18041792

18051793
final boolean offeringTLSv12Minus = ProtocolVersion.TLSv12.isEqualOrLaterVersionOf(earliestVersion);

0 commit comments

Comments
 (0)