1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage javax.net.ssl; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 200c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstromimport java.security.NoSuchAlgorithmException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Security; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.net.ServerSocketFactory; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The factory for SSL server sockets. 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class SSLServerSocketFactory extends ServerSocketFactory { 28f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson // TODO EXPORT CONTROL 29f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The default SSL socket factory 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static ServerSocketFactory defaultServerSocketFactory; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static String defaultName; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the default {@code SSLServerSocketFactory} instance. The default 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * implementation is defined by the security property 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * "ssl.ServerSocketFactory.provider". 39f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the default {@code SSLServerSocketFactory} instance. 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 42f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson public static synchronized ServerSocketFactory getDefault() { 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (defaultServerSocketFactory != null) { 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return defaultServerSocketFactory; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (defaultName == null) { 47ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes defaultName = Security.getProperty("ssl.ServerSocketFactory.provider"); 48ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes if (defaultName != null) { 49ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes ClassLoader cl = Thread.currentThread().getContextClassLoader(); 50ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes if (cl == null) { 51ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes cl = ClassLoader.getSystemClassLoader(); 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 53ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes try { 54ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes final Class<?> ssfc = Class.forName(defaultName, true, cl); 55ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes defaultServerSocketFactory = (ServerSocketFactory) ssfc.newInstance(); 56ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } catch (Exception e) { 57ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } 58ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (defaultServerSocketFactory == null) { 610c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom SSLContext context; 620c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom try { 630c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom context = SSLContext.getDefault(); 640c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } catch (NoSuchAlgorithmException e) { 650c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom context = null; 660c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (context != null) { 68f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson defaultServerSocketFactory = context.getServerSocketFactory(); 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (defaultServerSocketFactory == null) { 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Use internal dummy implementation 73f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson defaultServerSocketFactory = new DefaultSSLServerSocketFactory( 74f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson "No ServerSocketFactory installed"); 75f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson } 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return defaultServerSocketFactory; 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 78f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 79f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson /** 80f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * Creates a new {@code SSLServerSocketFactory} instance. 81f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson */ 82f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson protected SSLServerSocketFactory() { 83f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson } 84f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the names of the cipher suites that are enabled by default. 87f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the names of the cipher suites that are enabled by default 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String[] getDefaultCipherSuites(); 91f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the list of supported cipher suites that could be enabled for an 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * SSL connection created by this factory. 95f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the list of supported cipher suites 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String[] getSupportedCipherSuites(); 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 100