1 /* 2 * Copyright 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package org.conscrypt; 18 19 import static org.junit.Assert.assertArrayEquals; 20 import static org.junit.Assert.assertEquals; 21 import static org.junit.Assert.assertFalse; 22 23 import java.lang.reflect.Method; 24 import java.net.Socket; 25 import java.util.ArrayList; 26 import java.util.List; 27 import javax.net.ssl.SNIHostName; 28 import javax.net.ssl.SNIServerName; 29 import javax.net.ssl.SSLParameters; 30 import org.junit.Assume; 31 import org.junit.Test; 32 33 /** 34 * Test for Platform 35 */ 36 public class PlatformTest { 37 private static final Method SSL_PARAMETERS_GET_APPLICATION_PROTOCOLS_METHOD; 38 private static final Method SSL_PARAMETERS_SET_APPLICATION_PROTOCOLS_METHOD; 39 40 static { 41 Class<?> sslParameters = SSLParameters.class; 42 Method getApplicationProtocolsMethod; 43 Method setApplicationProtocolsMethod; 44 try { 45 getApplicationProtocolsMethod = sslParameters.getMethod("getApplicationProtocols"); 46 setApplicationProtocolsMethod = 47 sslParameters.getMethod("setApplicationProtocols", String[].class); 48 } catch (NoSuchMethodException e) { 49 getApplicationProtocolsMethod = null; 50 setApplicationProtocolsMethod = null; 51 } 52 53 SSL_PARAMETERS_GET_APPLICATION_PROTOCOLS_METHOD = getApplicationProtocolsMethod; 54 SSL_PARAMETERS_SET_APPLICATION_PROTOCOLS_METHOD = setApplicationProtocolsMethod; 55 } 56 isJavaVersion(int version)57 private static boolean isJavaVersion(int version) { 58 return Platform.javaVersion() >= version; 59 } 60 assumeJava8()61 private static void assumeJava8() { 62 Assume.assumeTrue("Require Java 8: " + Platform.javaVersion(), isJavaVersion(8)); 63 } 64 65 @Test test_setSSLParameters_Socket()66 public void test_setSSLParameters_Socket() throws Exception { 67 assumeJava8(); 68 Socket socket = new OpenSSLSocketFactoryImpl().createSocket(); 69 SSLParametersImpl impl = SSLParametersImpl.getDefault(); 70 SSLParameters params = new SSLParameters(); 71 List<SNIServerName> names = new ArrayList<SNIServerName>(); 72 names.add(new SNIHostName("some.host")); 73 params.setServerNames(names); 74 params.setUseCipherSuitesOrder(false); 75 params.setEndpointIdentificationAlgorithm("ABC"); 76 String[] applicationProtocols = new String[] {"foo", "bar"}; 77 if (isJavaVersion(9)) { 78 setApplicationProtocols(params, applicationProtocols); 79 } 80 Platform.setSSLParameters(params, impl, (AbstractConscryptSocket) socket); 81 assertEquals("some.host", ((AbstractConscryptSocket) socket).getHostname()); 82 assertFalse(impl.getUseCipherSuitesOrder()); 83 assertEquals("ABC", impl.getEndpointIdentificationAlgorithm()); 84 if (isJavaVersion(9)) { 85 assertArrayEquals(applicationProtocols, impl.getApplicationProtocols()); 86 } 87 } 88 89 @Test test_getSSLParameters_Socket()90 public void test_getSSLParameters_Socket() throws Exception { 91 assumeJava8(); 92 Socket socket = new OpenSSLSocketFactoryImpl().createSocket(); 93 SSLParametersImpl impl = SSLParametersImpl.getDefault(); 94 SSLParameters params = new SSLParameters(); 95 impl.setUseCipherSuitesOrder(false); 96 impl.setEndpointIdentificationAlgorithm("ABC"); 97 String[] applicationProtocols = new String[] {"foo", "bar"}; 98 if (isJavaVersion(9)) { 99 impl.setApplicationProtocols(applicationProtocols); 100 } 101 ((AbstractConscryptSocket) socket).setHostname("some.host"); 102 Platform.getSSLParameters(params, impl, (AbstractConscryptSocket) socket); 103 assertEquals("some.host", ((SNIHostName) params.getServerNames().get(0)).getAsciiName()); 104 assertFalse(params.getUseCipherSuitesOrder()); 105 assertEquals("ABC", params.getEndpointIdentificationAlgorithm()); 106 if (isJavaVersion(9)) { 107 assertArrayEquals(applicationProtocols, getApplicationProtocols(params)); 108 } 109 } 110 111 @Test test_setSSLParameters_Engine()112 public void test_setSSLParameters_Engine() throws Exception { 113 assumeJava8(); 114 SSLParametersImpl impl = SSLParametersImpl.getDefault(); 115 SSLParameters params = new SSLParameters(); 116 ConscryptEngine engine = new ConscryptEngine(impl); 117 List<SNIServerName> names = new ArrayList<SNIServerName>(); 118 names.add(new SNIHostName("some.host")); 119 params.setServerNames(names); 120 params.setUseCipherSuitesOrder(false); 121 params.setEndpointIdentificationAlgorithm("ABC"); 122 String[] applicationProtocols = new String[] {"foo", "bar"}; 123 if (isJavaVersion(9)) { 124 setApplicationProtocols(params, applicationProtocols); 125 } 126 Platform.setSSLParameters(params, impl, engine); 127 assertEquals("some.host", engine.getHostname()); 128 assertFalse(impl.getUseCipherSuitesOrder()); 129 assertEquals("ABC", impl.getEndpointIdentificationAlgorithm()); 130 if (isJavaVersion(9)) { 131 assertArrayEquals(applicationProtocols, impl.getApplicationProtocols()); 132 } 133 } 134 135 @Test test_getSSLParameters_Engine()136 public void test_getSSLParameters_Engine() throws Exception { 137 assumeJava8(); 138 SSLParametersImpl impl = SSLParametersImpl.getDefault(); 139 SSLParameters params = new SSLParameters(); 140 ConscryptEngine engine = new ConscryptEngine(impl); 141 impl.setUseCipherSuitesOrder(false); 142 impl.setEndpointIdentificationAlgorithm("ABC"); 143 engine.setHostname("some.host"); 144 String[] applicationProtocols = new String[] {"foo", "bar"}; 145 if (isJavaVersion(9)) { 146 impl.setApplicationProtocols(applicationProtocols); 147 } 148 Platform.getSSLParameters(params, impl, engine); 149 assertEquals("some.host", ((SNIHostName) params.getServerNames().get(0)).getAsciiName()); 150 assertFalse(params.getUseCipherSuitesOrder()); 151 assertEquals("ABC", params.getEndpointIdentificationAlgorithm()); 152 if (isJavaVersion(9)) { 153 assertArrayEquals(applicationProtocols, getApplicationProtocols(params)); 154 } 155 } 156 getApplicationProtocols(SSLParameters params)157 private static String[] getApplicationProtocols(SSLParameters params) { 158 if (SSL_PARAMETERS_GET_APPLICATION_PROTOCOLS_METHOD != null) { 159 try { 160 return (String[]) SSL_PARAMETERS_GET_APPLICATION_PROTOCOLS_METHOD.invoke(params); 161 } catch (Exception ignored) { 162 // TODO(nmittler): Should we throw here? 163 } 164 } 165 return EmptyArray.STRING; 166 } 167 setApplicationProtocols(SSLParameters params, String[] protocols)168 private static void setApplicationProtocols(SSLParameters params, String[] protocols) { 169 if (SSL_PARAMETERS_SET_APPLICATION_PROTOCOLS_METHOD != null) { 170 try { 171 SSL_PARAMETERS_SET_APPLICATION_PROTOCOLS_METHOD.invoke(params, (Object) protocols); 172 } catch (Exception ignored) { 173 // TODO(nmittler): Should we throw here? 174 } 175 } 176 } 177 } 178