1 /*
2  * Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
9  * This code is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12  * version 2 for more details (a copy is included in the LICENSE file that
13  * accompanied this code).
14  *
15  * You should have received a copy of the GNU General Public License version
16  * 2 along with this work; if not, write to the Free Software Foundation,
17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18  *
19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20  * or visit www.oracle.com if you need additional information or have any
21  * questions.
22  */
23 
24 /*
25  * @test
26  * @summary This is an interop compatibility test on SNI.
27  *
28  * @library /test/lib
29  *          ../TLSCommon
30  *          ../TLSCommon/interop
31  * @compile -source 1.8 -target 1.8
32  *          JdkInfoUtils.java
33  *          ../TLSCommon/interop/JdkProcServer.java
34  *          ../TLSCommon/interop/JdkProcClient.java
35  * @run main/manual SniTest true
36  * @run main/manual SniTest false
37  */
38 
39 import java.util.ArrayList;
40 import java.util.List;
41 import java.util.Set;
42 
43 public class SniTest extends ExtInteropTest {
44 
45     private JdkInfo serverJdkInfo;
46     private JdkInfo clientJdkInfo;
47 
SniTest(JdkInfo serverJdkInfo, JdkInfo clientJdkInfo)48     public SniTest(JdkInfo serverJdkInfo, JdkInfo clientJdkInfo) {
49         super(new Jdk(serverJdkInfo.version, serverJdkInfo.javaPath),
50               new Jdk(clientJdkInfo.version, clientJdkInfo.javaPath));
51 
52         this.serverJdkInfo = serverJdkInfo;
53         this.clientJdkInfo = clientJdkInfo;
54     }
55 
56     @Override
skipExecute()57     protected boolean skipExecute() {
58         return super.skipExecute() || !supportsSNI();
59     }
60 
supportsSNI()61     private boolean supportsSNI() {
62         boolean supported = true;
63 
64         if (!serverJdkInfo.supportsSNI) {
65             System.out.println("The server doesn't support SNI.");
66             supported = false;
67         }
68 
69         if (!clientJdkInfo.supportsSNI) {
70             System.out.println("The client doesn't support SNI.");
71             supported = false;
72         }
73 
74         return supported;
75     }
76 
77     @Override
getTestCases()78     protected List<TestCase<ExtUseCase>> getTestCases() {
79         List<TestCase<ExtUseCase>> testCases = new ArrayList<>();
80 
81         for (Protocol protocol : new Protocol[] {
82                 Protocol.TLSV1_2, Protocol.TLSV1_3 }) {
83             for (CipherSuite cipherSuite : Utilities.ALL_CIPHER_SUITES) {
84                 if (!cipherSuite.supportedByProtocol(protocol)) {
85                     continue;
86                 }
87 
88                 Cert cert = Utils.getCert(cipherSuite.keyExAlgorithm);
89                 CertTuple certTuple = new CertTuple(cert, cert);
90 
91                 ExtUseCase serverCase = ExtUseCase.newInstance();
92                 serverCase.setCertTuple(certTuple);
93                 serverCase.setServerNames("SNI");
94 
95                 ExtUseCase clientCase = ExtUseCase.newInstance();
96                 clientCase.setCertTuple(certTuple);
97                 clientCase.setProtocols(protocol);
98                 clientCase.setCipherSuites(cipherSuite);
99                 clientCase.setServerNames(serverCase.getServerNames());
100 
101                 testCases.add(
102                         new TestCase<ExtUseCase>(serverCase, clientCase));
103             }
104         }
105 
106         return testCases;
107     }
108 
109     @Override
ignoreTestCase(TestCase<ExtUseCase> testCase)110     protected boolean ignoreTestCase(TestCase<ExtUseCase> testCase) {
111         CipherSuite cipherSuite = testCase.clientCase.getCipherSuite();
112         return !serverJdkInfo.enablesCipherSuite(cipherSuite)
113                 || !clientJdkInfo.supportsCipherSuite(cipherSuite);
114     }
115 
116     @Override
createServerBuilder(ExtUseCase useCase)117     protected AbstractServer.Builder createServerBuilder(ExtUseCase useCase)
118             throws Exception {
119         return serverJdkInfo == JdkInfo.DEFAULT
120                ? createJdkServerBuilder(useCase)
121                : createAltJdkServerBuilder(useCase);
122     }
123 
createJdkServerBuilder(ExtUseCase useCase)124     private JdkServer.Builder createJdkServerBuilder(ExtUseCase useCase) {
125         JdkServer.Builder builder = new JdkServer.Builder();
126         builder.setCertTuple(useCase.getCertTuple());
127         builder.setProtocols(useCase.getProtocols());
128         builder.setCipherSuites(useCase.getCipherSuites());
129         builder.setServerNames(useCase.getServerNames());
130         return builder;
131     }
132 
createAltJdkServerBuilder(ExtUseCase useCase)133     private JdkProcServer.Builder createAltJdkServerBuilder(ExtUseCase useCase) {
134         JdkProcServer.Builder builder = new JdkProcServer.Builder();
135         builder.setJdk((Jdk) serverProduct);
136         builder.setCertTuple(useCase.getCertTuple());
137         builder.setProtocols(useCase.getProtocols());
138         builder.setCipherSuites(useCase.getCipherSuites());
139         builder.setServerNames(useCase.getServerNames());
140         return builder;
141     }
142 
143     @Override
createClientBuilder(ExtUseCase useCase)144     protected AbstractClient.Builder createClientBuilder(ExtUseCase useCase)
145             throws Exception {
146         return clientJdkInfo == JdkInfo.DEFAULT
147                ? createJdkClientBuilder(useCase)
148                : createAltJdkClientBuilder(useCase);
149     }
150 
createJdkClientBuilder(ExtUseCase useCase)151     private JdkClient.Builder createJdkClientBuilder(ExtUseCase useCase) {
152         JdkClient.Builder builder = new JdkClient.Builder();
153         builder.setCertTuple(useCase.getCertTuple());
154         builder.setProtocols(useCase.getProtocols());
155         builder.setCipherSuites(useCase.getCipherSuites());
156         builder.setServerNames(useCase.getServerNames());
157         return builder;
158     }
159 
createAltJdkClientBuilder(ExtUseCase useCase)160     private JdkProcClient.Builder createAltJdkClientBuilder(ExtUseCase useCase) {
161         JdkProcClient.Builder builder = new JdkProcClient.Builder();
162         builder.setJdk((Jdk) clientProduct);
163         builder.setCertTuple(useCase.getCertTuple());
164         builder.setProtocols(useCase.getProtocols());
165         builder.setCipherSuites(useCase.getCipherSuites());
166         builder.setServerNames(useCase.getServerNames());
167         return builder;
168     }
169 
main(String[] args)170     public static void main(String[] args) throws Exception {
171         Boolean defaultJdkAsServer = Boolean.valueOf(args[0]);
172 
173         Set<JdkInfo> jdkInfos = Utils.jdkInfoList();
174         for (JdkInfo jdkInfo : jdkInfos) {
175             SniTest test = new SniTest(
176                     defaultJdkAsServer ? JdkInfo.DEFAULT : jdkInfo,
177                     defaultJdkAsServer ? jdkInfo : JdkInfo.DEFAULT);
178             test.execute();
179         }
180     }
181 }
182