31
31
import org .bouncycastle .tls .ClientCertificateType ;
32
32
import org .bouncycastle .tls .DefaultTlsServer ;
33
33
import org .bouncycastle .tls .KeyExchangeAlgorithm ;
34
+ import org .bouncycastle .tls .NamedGroup ;
34
35
import org .bouncycastle .tls .ProtocolName ;
35
36
import org .bouncycastle .tls .ProtocolVersion ;
36
37
import org .bouncycastle .tls .SecurityParameters ;
@@ -62,10 +63,6 @@ class ProvTlsServer
62
63
// TODO[jsse] Integrate this into NamedGroupInfo
63
64
private static final int provEphemeralDHKeySize = PropertyUtils .getIntegerSystemProperty ("jdk.tls.ephemeralDHKeySize" , 2048 , 1024 , 8192 );
64
65
65
- /*
66
- * TODO[jsse] Does this selection override the restriction from 'jdk.tls.ephemeralDHKeySize'?
67
- * TODO[fips] Probably should be ignored in fips mode?
68
- */
69
66
private static final DHGroup [] provServerDefaultDHEParameters = getDefaultDHEParameters ();
70
67
71
68
private static final boolean provServerEnableCA = PropertyUtils
@@ -100,7 +97,7 @@ private static DHGroup[] getDefaultDHEParameters()
100
97
return null ;
101
98
}
102
99
103
- ArrayList <DHGroup > result = new ArrayList <DHGroup >();
100
+ ArrayList <DHGroup > dhGroups = new ArrayList <DHGroup >();
104
101
int outerComma = -1 ;
105
102
do
106
103
{
@@ -134,7 +131,7 @@ private static DHGroup[] getDefaultDHEParameters()
134
131
DHGroup dhGroup = TlsDHUtils .getStandardGroupForDHParameters (p , g );
135
132
if (null != dhGroup )
136
133
{
137
- result .add (dhGroup );
134
+ dhGroups .add (dhGroup );
138
135
}
139
136
else if (!p .isProbablePrime (120 ))
140
137
{
@@ -143,7 +140,7 @@ else if (!p.isProbablePrime(120))
143
140
}
144
141
else
145
142
{
146
- result .add (new DHGroup (p , null , g , 0 ));
143
+ dhGroups .add (new DHGroup (p , null , g , 0 ));
147
144
}
148
145
}
149
146
catch (Exception e )
@@ -154,15 +151,15 @@ else if (!p.isProbablePrime(120))
154
151
outerComma = closeBrace + 1 ;
155
152
if (outerComma >= limit )
156
153
{
157
- result .sort (new Comparator <DHGroup >()
154
+ DHGroup [] result = dhGroups .toArray (new DHGroup [dhGroups .size ()]);
155
+ java .util .Arrays .sort (result , new Comparator <DHGroup >()
158
156
{
159
- @ Override
160
157
public int compare (DHGroup a , DHGroup b )
161
158
{
162
159
return a .getP ().bitLength () - b .getP ().bitLength ();
163
160
}
164
161
});
165
- return result . toArray ( new DHGroup [ result . size ()]) ;
162
+ return result ;
166
163
}
167
164
}
168
165
while (',' == input .charAt (outerComma ));
@@ -268,13 +265,29 @@ protected String getDetailMessageNoCipherSuite()
268
265
@ Override
269
266
protected int getMaximumNegotiableCurveBits ()
270
267
{
271
- return NamedGroupInfo .getMaximumBitsServerECDH (jsseSecurityParameters .namedGroups );
268
+ NamedGroupInfo .DefaultedResult maxBitsResult = NamedGroupInfo .getMaximumBitsServerECDH (
269
+ jsseSecurityParameters .namedGroups );
270
+
271
+ int maxBits = maxBitsResult .getResult ();
272
+
273
+ return maxBits ;
272
274
}
273
275
274
276
@ Override
275
277
protected int getMaximumNegotiableFiniteFieldBits ()
276
278
{
277
- int maxBits = NamedGroupInfo .getMaximumBitsServerFFDHE (jsseSecurityParameters .namedGroups );
279
+ NamedGroupInfo .DefaultedResult maxBitsResult = NamedGroupInfo .getMaximumBitsServerFFDHE (
280
+ jsseSecurityParameters .namedGroups );
281
+
282
+ int maxBits = maxBitsResult .getResult ();
283
+
284
+ if (maxBitsResult .isDefaulted () &&
285
+ !TlsUtils .isNullOrEmpty (provServerDefaultDHEParameters ) &&
286
+ !manager .getContextData ().getContext ().isFips ())
287
+ {
288
+ DHGroup largest = provServerDefaultDHEParameters [provServerDefaultDHEParameters .length - 1 ];
289
+ maxBits = Math .max (maxBits , largest .getP ().bitLength ());
290
+ }
278
291
279
292
return maxBits >= provEphemeralDHKeySize ? maxBits : 0 ;
280
293
}
@@ -336,28 +349,39 @@ protected boolean selectCipherSuite(int cipherSuite) throws IOException
336
349
@ Override
337
350
public TlsDHConfig getDHConfig () throws IOException
338
351
{
339
- if (provServerDefaultDHEParameters != null )
340
- {
341
- int minimumFiniteFieldBits = Math .max (
342
- TlsDHUtils .getMinimumFiniteFieldBits (selectedCipherSuite ), provEphemeralDHKeySize );
352
+ int minimumFiniteFieldBits = TlsDHUtils .getMinimumFiniteFieldBits (selectedCipherSuite );
353
+ minimumFiniteFieldBits = Math .max (minimumFiniteFieldBits , provEphemeralDHKeySize );
354
+
355
+ NamedGroupInfo .DefaultedResult namedGroupResult = NamedGroupInfo .selectServerFFDHE (
356
+ jsseSecurityParameters .namedGroups , minimumFiniteFieldBits );
343
357
344
- for (DHGroup group : provServerDefaultDHEParameters )
358
+ int namedGroup = namedGroupResult .getResult ();
359
+
360
+ if (namedGroupResult .isDefaulted () &&
361
+ !TlsUtils .isNullOrEmpty (provServerDefaultDHEParameters ) &&
362
+ !manager .getContextData ().getContext ().isFips ())
363
+ {
364
+ for (DHGroup dhGroup : provServerDefaultDHEParameters )
345
365
{
346
- if (group .getP ().bitLength () >= minimumFiniteFieldBits )
366
+ int bits = dhGroup .getP ().bitLength ();
367
+ if (bits >= minimumFiniteFieldBits )
347
368
{
348
- return new TlsDHConfig (group );
369
+ if (namedGroup < 0 || bits <= NamedGroup .getFiniteFieldBits (namedGroup ))
370
+ {
371
+ return new TlsDHConfig (dhGroup );
372
+ }
373
+ break ;
349
374
}
350
375
}
351
376
}
352
- return super .getDHConfig ();
377
+
378
+ return TlsDHUtils .createNamedDHConfig (context , namedGroup );
353
379
}
354
380
355
381
@ Override
356
382
protected int selectDH (int minimumFiniteFieldBits )
357
383
{
358
- minimumFiniteFieldBits = Math .max (minimumFiniteFieldBits , provEphemeralDHKeySize );
359
-
360
- return NamedGroupInfo .selectServerFFDHE (jsseSecurityParameters .namedGroups , minimumFiniteFieldBits );
384
+ throw new UnsupportedOperationException ();
361
385
}
362
386
363
387
@ Override
@@ -369,7 +393,7 @@ protected int selectDHDefault(int minimumFiniteFieldBits)
369
393
@ Override
370
394
protected int selectECDH (int minimumCurveBits )
371
395
{
372
- return NamedGroupInfo .selectServerECDH (jsseSecurityParameters .namedGroups , minimumCurveBits );
396
+ return NamedGroupInfo .selectServerECDH (jsseSecurityParameters .namedGroups , minimumCurveBits ). getResult () ;
373
397
}
374
398
375
399
@ Override
0 commit comments