• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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