Skip to content

Commit aaef48b

Browse files
committed
Merge remote-tracking branch 'origin/master'
2 parents fc0fb4e + 2a1686f commit aaef48b

File tree

11 files changed

+185
-138
lines changed

11 files changed

+185
-138
lines changed

core/src/main/java/org/bouncycastle/crypto/tls/DefaultTlsClient.java

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,23 @@
55
public abstract class DefaultTlsClient
66
extends AbstractTlsClient
77
{
8+
protected TlsDHVerifier dhVerifier;
9+
810
public DefaultTlsClient()
911
{
10-
super();
12+
this(new DefaultTlsCipherFactory());
1113
}
1214

1315
public DefaultTlsClient(TlsCipherFactory cipherFactory)
16+
{
17+
this(cipherFactory, new DefaultTlsDHVerifier());
18+
}
19+
20+
public DefaultTlsClient(TlsCipherFactory cipherFactory, TlsDHVerifier dhVerifier)
1421
{
1522
super(cipherFactory);
23+
24+
this.dhVerifier = dhVerifier;
1625
}
1726

1827
public int[] getCipherSuites()
@@ -77,12 +86,12 @@ public TlsKeyExchange getKeyExchange()
7786

7887
protected TlsKeyExchange createDHKeyExchange(int keyExchange)
7988
{
80-
return new TlsDHKeyExchange(keyExchange, supportedSignatureAlgorithms, null);
89+
return new TlsDHKeyExchange(keyExchange, supportedSignatureAlgorithms, dhVerifier, null);
8190
}
8291

8392
protected TlsKeyExchange createDHEKeyExchange(int keyExchange)
8493
{
85-
return new TlsDHEKeyExchange(keyExchange, supportedSignatureAlgorithms, null);
94+
return new TlsDHEKeyExchange(keyExchange, supportedSignatureAlgorithms, dhVerifier, null);
8695
}
8796

8897
protected TlsKeyExchange createECDHKeyExchange(int keyExchange)
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package org.bouncycastle.crypto.tls;
2+
3+
import java.math.BigInteger;
4+
import java.util.Vector;
5+
6+
import org.bouncycastle.crypto.agreement.DHStandardGroups;
7+
import org.bouncycastle.crypto.params.DHParameters;
8+
9+
public class DefaultTlsDHVerifier
10+
implements TlsDHVerifier
11+
{
12+
public static final int DEFAULT_MINIMUM_PRIME_BITS = 2048;
13+
14+
protected static final Vector DEFAULT_GROUPS = new Vector();
15+
16+
private static void addDefaultGroup(DHParameters dhParameters)
17+
{
18+
DEFAULT_GROUPS.addElement(dhParameters);
19+
}
20+
21+
static
22+
{
23+
addDefaultGroup(DHStandardGroups.rfc7919_ffdhe2048);
24+
addDefaultGroup(DHStandardGroups.rfc7919_ffdhe3072);
25+
addDefaultGroup(DHStandardGroups.rfc7919_ffdhe4096);
26+
addDefaultGroup(DHStandardGroups.rfc7919_ffdhe6144);
27+
addDefaultGroup(DHStandardGroups.rfc7919_ffdhe8192);
28+
29+
addDefaultGroup(DHStandardGroups.rfc3526_1536);
30+
addDefaultGroup(DHStandardGroups.rfc3526_2048);
31+
addDefaultGroup(DHStandardGroups.rfc3526_3072);
32+
addDefaultGroup(DHStandardGroups.rfc3526_4096);
33+
addDefaultGroup(DHStandardGroups.rfc3526_6144);
34+
addDefaultGroup(DHStandardGroups.rfc3526_8192);
35+
}
36+
37+
// Vector is (DHParameters)
38+
protected Vector groups;
39+
protected int minimumPrimeBits;
40+
41+
/**
42+
* Accept various standard DH groups with 'P' at least {@link #DEFAULT_MINIMUM_PRIME_BITS} bits.
43+
*/
44+
public DefaultTlsDHVerifier()
45+
{
46+
this(DEFAULT_MINIMUM_PRIME_BITS);
47+
}
48+
49+
/**
50+
* Accept various standard DH groups with 'P' at least the specified number of bits.
51+
*/
52+
public DefaultTlsDHVerifier(int minimumPrimeBits)
53+
{
54+
this(DEFAULT_GROUPS, minimumPrimeBits);
55+
}
56+
57+
/**
58+
* Accept a custom set of group parameters, subject to a minimum bitlength for 'P'.
59+
*
60+
* @param groups a {@link Vector} of acceptable {@link DHParameters}.
61+
*/
62+
public DefaultTlsDHVerifier(Vector groups, int minimumPrimeBits)
63+
{
64+
this.groups = groups;
65+
this.minimumPrimeBits = minimumPrimeBits;
66+
}
67+
68+
public boolean accept(DHParameters dhParameters)
69+
{
70+
return checkMinimumPrimeBits(dhParameters) && checkGroup(dhParameters);
71+
}
72+
73+
public int getMinimumPrimeBits()
74+
{
75+
return minimumPrimeBits;
76+
}
77+
78+
protected boolean areGroupsEqual(DHParameters a, DHParameters b)
79+
{
80+
return a == b || (areParametersEqual(a.getP(), b.getP()) && areParametersEqual(a.getG(), b.getG()));
81+
}
82+
83+
protected boolean areParametersEqual(BigInteger a, BigInteger b)
84+
{
85+
return a == b || a.equals(b);
86+
}
87+
88+
protected boolean checkGroup(DHParameters dhParameters)
89+
{
90+
for (int i = 0; i < groups.size(); ++i)
91+
{
92+
if (areGroupsEqual(dhParameters, (DHParameters)groups.elementAt(i)))
93+
{
94+
return true;
95+
}
96+
}
97+
return false;
98+
}
99+
100+
protected boolean checkMinimumPrimeBits(DHParameters dhParameters)
101+
{
102+
return dhParameters.getP().bitLength() >= getMinimumPrimeBits();
103+
}
104+
}

core/src/main/java/org/bouncycastle/crypto/tls/DefaultTlsServer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,12 +142,12 @@ public TlsKeyExchange getKeyExchange()
142142

143143
protected TlsKeyExchange createDHKeyExchange(int keyExchange)
144144
{
145-
return new TlsDHKeyExchange(keyExchange, supportedSignatureAlgorithms, getDHParameters());
145+
return new TlsDHKeyExchange(keyExchange, supportedSignatureAlgorithms, null, getDHParameters());
146146
}
147147

148148
protected TlsKeyExchange createDHEKeyExchange(int keyExchange)
149149
{
150-
return new TlsDHEKeyExchange(keyExchange, supportedSignatureAlgorithms, getDHParameters());
150+
return new TlsDHEKeyExchange(keyExchange, supportedSignatureAlgorithms, null, getDHParameters());
151151
}
152152

153153
protected TlsKeyExchange createECDHKeyExchange(int keyExchange)

core/src/main/java/org/bouncycastle/crypto/tls/PSKTlsClient.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
public class PSKTlsClient
66
extends AbstractTlsClient
77
{
8+
protected TlsDHVerifier dhVerifier;
89
protected TlsPSKIdentity pskIdentity;
910

1011
public PSKTlsClient(TlsPSKIdentity pskIdentity)
@@ -13,8 +14,15 @@ public PSKTlsClient(TlsPSKIdentity pskIdentity)
1314
}
1415

1516
public PSKTlsClient(TlsCipherFactory cipherFactory, TlsPSKIdentity pskIdentity)
17+
{
18+
this(cipherFactory, new DefaultTlsDHVerifier(), pskIdentity);
19+
}
20+
21+
public PSKTlsClient(TlsCipherFactory cipherFactory, TlsDHVerifier dhVerifier, TlsPSKIdentity pskIdentity)
1622
{
1723
super(cipherFactory);
24+
25+
this.dhVerifier = dhVerifier;
1826
this.pskIdentity = pskIdentity;
1927
}
2028

@@ -62,7 +70,7 @@ public TlsAuthentication getAuthentication() throws IOException
6270

6371
protected TlsKeyExchange createPSKKeyExchange(int keyExchange)
6472
{
65-
return new TlsPSKKeyExchange(keyExchange, supportedSignatureAlgorithms, pskIdentity, null, null, namedCurves,
66-
clientECPointFormats, serverECPointFormats);
73+
return new TlsPSKKeyExchange(keyExchange, supportedSignatureAlgorithms, pskIdentity, null, dhVerifier, null,
74+
namedCurves, clientECPointFormats, serverECPointFormats);
6775
}
6876
}

core/src/main/java/org/bouncycastle/crypto/tls/PSKTlsServer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,6 @@ public TlsKeyExchange getKeyExchange() throws IOException
8787
protected TlsKeyExchange createPSKKeyExchange(int keyExchange)
8888
{
8989
return new TlsPSKKeyExchange(keyExchange, supportedSignatureAlgorithms, null, pskIdentityManager,
90-
getDHParameters(), namedCurves, clientECPointFormats, serverECPointFormats);
90+
null, getDHParameters(), namedCurves, clientECPointFormats, serverECPointFormats);
9191
}
9292
}

core/src/main/java/org/bouncycastle/crypto/tls/ServerDHParams.java

Lines changed: 0 additions & 63 deletions
This file was deleted.

core/src/main/java/org/bouncycastle/crypto/tls/TlsDHEKeyExchange.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,17 @@
77
import org.bouncycastle.crypto.Digest;
88
import org.bouncycastle.crypto.Signer;
99
import org.bouncycastle.crypto.params.DHParameters;
10+
import org.bouncycastle.crypto.params.DHPublicKeyParameters;
1011
import org.bouncycastle.util.io.TeeInputStream;
1112

1213
public class TlsDHEKeyExchange
1314
extends TlsDHKeyExchange
1415
{
1516
protected TlsSignerCredentials serverCredentials = null;
1617

17-
public TlsDHEKeyExchange(int keyExchange, Vector supportedSignatureAlgorithms, DHParameters dhParameters)
18+
public TlsDHEKeyExchange(int keyExchange, Vector supportedSignatureAlgorithms, TlsDHVerifier dhVerifier, DHParameters dhParameters)
1819
{
19-
super(keyExchange, supportedSignatureAlgorithms, dhParameters);
20+
super(keyExchange, supportedSignatureAlgorithms, dhVerifier, dhParameters);
2021
}
2122

2223
public void processServerCredentials(TlsCredentials serverCredentials)
@@ -77,7 +78,8 @@ public void processServerKeyExchange(InputStream input)
7778
SignerInputBuffer buf = new SignerInputBuffer();
7879
InputStream teeIn = new TeeInputStream(input, buf);
7980

80-
ServerDHParams dhParams = ServerDHParams.parse(teeIn);
81+
this.dhParameters = TlsDHUtils.receiveDHParameters(dhVerifier, teeIn);
82+
this.dhAgreePublicKey = new DHPublicKeyParameters(TlsDHUtils.readDHParameter(teeIn), dhParameters);
8183

8284
DigitallySigned signed_params = parseSignature(input);
8385

@@ -87,9 +89,6 @@ public void processServerKeyExchange(InputStream input)
8789
{
8890
throw new TlsFatalAlert(AlertDescription.decrypt_error);
8991
}
90-
91-
this.dhAgreePublicKey = TlsDHUtils.validateDHPublicKey(dhParams.getPublicKey());
92-
this.dhParameters = validateDHParameters(dhAgreePublicKey.getParameters());
9392
}
9493

9594
protected Signer initVerifyer(TlsSigner tlsSigner, SignatureAndHashAlgorithm algorithm, SecurityParameters securityParameters)

core/src/main/java/org/bouncycastle/crypto/tls/TlsDHKeyExchange.java

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
import java.io.IOException;
55
import java.io.InputStream;
66
import java.io.OutputStream;
7-
import java.math.BigInteger;
87
import java.util.Vector;
98

109
import org.bouncycastle.asn1.x509.KeyUsage;
@@ -22,6 +21,7 @@ public class TlsDHKeyExchange
2221
extends AbstractTlsKeyExchange
2322
{
2423
protected TlsSigner tlsSigner;
24+
protected TlsDHVerifier dhVerifier;
2525
protected DHParameters dhParameters;
2626

2727
protected AsymmetricKeyParameter serverPublicKey;
@@ -30,7 +30,7 @@ public class TlsDHKeyExchange
3030
protected DHPrivateKeyParameters dhAgreePrivateKey;
3131
protected DHPublicKeyParameters dhAgreePublicKey;
3232

33-
public TlsDHKeyExchange(int keyExchange, Vector supportedSignatureAlgorithms, DHParameters dhParameters)
33+
public TlsDHKeyExchange(int keyExchange, Vector supportedSignatureAlgorithms, TlsDHVerifier dhVerifier, DHParameters dhParameters)
3434
{
3535
super(keyExchange, supportedSignatureAlgorithms);
3636

@@ -51,6 +51,7 @@ public TlsDHKeyExchange(int keyExchange, Vector supportedSignatureAlgorithms, DH
5151
throw new IllegalArgumentException("unsupported key exchange algorithm");
5252
}
5353

54+
this.dhVerifier = dhVerifier;
5455
this.dhParameters = dhParameters;
5556
}
5657

@@ -101,8 +102,8 @@ public void processServerCertificate(Certificate serverCertificate)
101102
{
102103
try
103104
{
104-
this.dhAgreePublicKey = TlsDHUtils.validateDHPublicKey((DHPublicKeyParameters)this.serverPublicKey);
105-
this.dhParameters = validateDHParameters(dhAgreePublicKey.getParameters());
105+
this.dhAgreePublicKey = (DHPublicKeyParameters)this.serverPublicKey;
106+
this.dhParameters = dhAgreePublicKey.getParameters();
106107
}
107108
catch (ClassCastException e)
108109
{
@@ -161,10 +162,8 @@ public void processServerKeyExchange(InputStream input) throws IOException
161162

162163
// DH_anon is handled here, DHE_* in a subclass
163164

164-
ServerDHParams dhParams = ServerDHParams.parse(input);
165-
166-
this.dhAgreePublicKey = TlsDHUtils.validateDHPublicKey(dhParams.getPublicKey());
167-
this.dhParameters = validateDHParameters(dhAgreePublicKey.getParameters());
165+
this.dhParameters = TlsDHUtils.receiveDHParameters(dhVerifier, input);
166+
this.dhAgreePublicKey = new DHPublicKeyParameters(TlsDHUtils.readDHParameter(input), dhParameters);
168167
}
169168

170169
public void validateCertificateRequest(CertificateRequest certificateRequest)
@@ -250,9 +249,7 @@ public void processClientKeyExchange(InputStream input) throws IOException
250249
return;
251250
}
252251

253-
BigInteger Yc = TlsDHUtils.readDHParameter(input);
254-
255-
this.dhAgreePublicKey = TlsDHUtils.validateDHPublicKey(new DHPublicKeyParameters(Yc, dhParameters));
252+
this.dhAgreePublicKey = new DHPublicKeyParameters(TlsDHUtils.readDHParameter(input), dhParameters);
256253
}
257254

258255
public byte[] generatePremasterSecret()
@@ -270,19 +267,4 @@ public byte[] generatePremasterSecret()
270267

271268
throw new TlsFatalAlert(AlertDescription.internal_error);
272269
}
273-
274-
protected int getMinimumPrimeBits()
275-
{
276-
return 1024;
277-
}
278-
279-
protected DHParameters validateDHParameters(DHParameters params) throws IOException
280-
{
281-
if (params.getP().bitLength() < getMinimumPrimeBits())
282-
{
283-
throw new TlsFatalAlert(AlertDescription.insufficient_security);
284-
}
285-
286-
return TlsDHUtils.validateDHParameters(params);
287-
}
288270
}

0 commit comments

Comments
 (0)