RFR[10] 8186057: TLS interoperability testing between different Java versions

Artem Smotrakov artem.smotrakov at oracle.com
Thu Sep 7 06:32:23 UTC 2017


Hi John,

Thanks for starting working on this. I believe this tool is going to be 
very helpful.

Let me skip some coding comments for a while, I have a couple of 
comments about the design. The main idea is that it should cover as many 
cases as it can. Even if it might look a bit redundant, I believe it is 
actually not redundant because we basically never know what's going to 
break down.

1. At the moment, you define cases in Compatibility.java

   59     private static final String[] CASE_TYPES = new String[] {
   60             Utils.CASE_HANDSHAKE,
   61             Utils.CASE_DATA_EXCHANGE,
   62             Utils.CASE_ALPN };

I believe there are much more many case which we can implement later. 
But this approach doesn't looks flexible. For example, let's consider 
that we'd like to use a couple of extensions in the same time. Let's say 
we'd like to use SNI and ALPN. It seems like we have to create a 
separate case for that, and add it manually to the array. Would it be 
possible to generate cases automatically? For example, you can define 
parameters of TLS connection, for example:
- handshake type: full, session-resumption
- use ALPN: true, false
- use SNI: true, false
- use client auth: true, false,
etc

Then you can build a Cartesian product of all parameters. Client and 
sever should take parameters, and say if they support all of the or not 
(for example, JDK 6 might not support all features that JDK 9 does). If 
it does, client and server can configure themselves with those 
parameters, and start handshaking.

2. With the approach above, it might be possible to avoid those nested 
loops:

   93       for (String caseType : CASE_TYPES) {
   94             for (String protocol : PROTOCOLS) {
   95                 for (String cipherSuite : CIPHER_SUITES) {
   96                     for (JdkInfo serverJdk : jdkInfos) {

3. I believe we should cover all supported cipher suites. Test run is 
going to take more time, but it think it's okay. Another option is to 
introduce two modes:
- light: run the test with a couple of cipher suites
- heavy: run the test with all supported cipher suites


A couple of comments about the code:
- What's the reason of using disabled SHA1 and RSA with 1024-bit keys? 
You might use stronger algorithms and key sizes, and avoid modifying 
java.security file
- Please use try-with-resources if possible (files, sockets, etc)

Artem

On 09/07/2017 08:52 AM, sha.jiang at oracle.com wrote:
> Hi,
> Please review this test for checking the interop compatibility on JSSE 
> among different JDK releases (from 6 to 10).
> It covers the cases, like handshake, data exchange, client 
> authentication and APLN, on all TLS versions (if possible).
> And the selected TLS cipher suites are: TLS_RSA_WITH_AES_128_CBC_SHA, 
> TLS_DHE_DSS_WITH_AES_128_CBC_SHA and 
> TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA.
> For more details, please look though the README.
>
> Webrev: http://cr.openjdk.java.net/~jjiang/8186057/webrev.00
> Issue: https://bugs.openjdk.java.net/browse/JDK-8186057
>
> Best regards,
> John Jiang
>



More information about the security-dev mailing list