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