3131import org .bouncycastle .tls .ClientCertificateType ;
3232import org .bouncycastle .tls .DefaultTlsServer ;
3333import org .bouncycastle .tls .KeyExchangeAlgorithm ;
34+ import org .bouncycastle .tls .NamedGroup ;
3435import org .bouncycastle .tls .ProtocolName ;
3536import org .bouncycastle .tls .ProtocolVersion ;
3637import org .bouncycastle .tls .SecurityParameters ;
@@ -62,10 +63,6 @@ class ProvTlsServer
6263 // TODO[jsse] Integrate this into NamedGroupInfo
6364 private static final int provEphemeralDHKeySize = PropertyUtils .getIntegerSystemProperty ("jdk.tls.ephemeralDHKeySize" , 2048 , 1024 , 8192 );
6465
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- */
6966 private static final DHGroup [] provServerDefaultDHEParameters = getDefaultDHEParameters ();
7067
7168 private static final boolean provServerEnableCA = PropertyUtils
@@ -100,7 +97,7 @@ private static DHGroup[] getDefaultDHEParameters()
10097 return null ;
10198 }
10299
103- ArrayList <DHGroup > result = new ArrayList <DHGroup >();
100+ ArrayList <DHGroup > dhGroups = new ArrayList <DHGroup >();
104101 int outerComma = -1 ;
105102 do
106103 {
@@ -134,7 +131,7 @@ private static DHGroup[] getDefaultDHEParameters()
134131 DHGroup dhGroup = TlsDHUtils .getStandardGroupForDHParameters (p , g );
135132 if (null != dhGroup )
136133 {
137- result .add (dhGroup );
134+ dhGroups .add (dhGroup );
138135 }
139136 else if (!p .isProbablePrime (120 ))
140137 {
@@ -143,7 +140,7 @@ else if (!p.isProbablePrime(120))
143140 }
144141 else
145142 {
146- result .add (new DHGroup (p , null , g , 0 ));
143+ dhGroups .add (new DHGroup (p , null , g , 0 ));
147144 }
148145 }
149146 catch (Exception e )
@@ -154,15 +151,15 @@ else if (!p.isProbablePrime(120))
154151 outerComma = closeBrace + 1 ;
155152 if (outerComma >= limit )
156153 {
157- result .sort (new Comparator <DHGroup >()
154+ DHGroup [] result = dhGroups .toArray (new DHGroup [dhGroups .size ()]);
155+ java .util .Arrays .sort (result , new Comparator <DHGroup >()
158156 {
159- @ Override
160157 public int compare (DHGroup a , DHGroup b )
161158 {
162159 return a .getP ().bitLength () - b .getP ().bitLength ();
163160 }
164161 });
165- return result . toArray ( new DHGroup [ result . size ()]) ;
162+ return result ;
166163 }
167164 }
168165 while (',' == input .charAt (outerComma ));
@@ -268,13 +265,29 @@ protected String getDetailMessageNoCipherSuite()
268265 @ Override
269266 protected int getMaximumNegotiableCurveBits ()
270267 {
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 ;
272274 }
273275
274276 @ Override
275277 protected int getMaximumNegotiableFiniteFieldBits ()
276278 {
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+ }
278291
279292 return maxBits >= provEphemeralDHKeySize ? maxBits : 0 ;
280293 }
@@ -336,28 +349,39 @@ protected boolean selectCipherSuite(int cipherSuite) throws IOException
336349 @ Override
337350 public TlsDHConfig getDHConfig () throws IOException
338351 {
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 );
343357
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 )
345365 {
346- if (group .getP ().bitLength () >= minimumFiniteFieldBits )
366+ int bits = dhGroup .getP ().bitLength ();
367+ if (bits >= minimumFiniteFieldBits )
347368 {
348- return new TlsDHConfig (group );
369+ if (namedGroup < 0 || bits <= NamedGroup .getFiniteFieldBits (namedGroup ))
370+ {
371+ return new TlsDHConfig (dhGroup );
372+ }
373+ break ;
349374 }
350375 }
351376 }
352- return super .getDHConfig ();
377+
378+ return TlsDHUtils .createNamedDHConfig (context , namedGroup );
353379 }
354380
355381 @ Override
356382 protected int selectDH (int minimumFiniteFieldBits )
357383 {
358- minimumFiniteFieldBits = Math .max (minimumFiniteFieldBits , provEphemeralDHKeySize );
359-
360- return NamedGroupInfo .selectServerFFDHE (jsseSecurityParameters .namedGroups , minimumFiniteFieldBits );
384+ throw new UnsupportedOperationException ();
361385 }
362386
363387 @ Override
@@ -369,7 +393,7 @@ protected int selectDHDefault(int minimumFiniteFieldBits)
369393 @ Override
370394 protected int selectECDH (int minimumCurveBits )
371395 {
372- return NamedGroupInfo .selectServerECDH (jsseSecurityParameters .namedGroups , minimumCurveBits );
396+ return NamedGroupInfo .selectServerECDH (jsseSecurityParameters .namedGroups , minimumCurveBits ). getResult () ;
373397 }
374398
375399 @ Override
0 commit comments