SSLSocket.java revision 0c131a2ca38465b7d1df4eaee63ac73ce4d5986d
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 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.InetAddress; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.Socket; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.UnknownHostException; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The extension of {@code Socket} providing secure protocols like SSL (Secure 27f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * Socket Layer") or TLS (Transport Layer Security). 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class SSLSocket extends Socket { 30f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Only to be used by subclasses. 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a TCP socket. 35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected SSLSocket() { 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Only to be used by subclasses. 42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a TCP socket connection to the specified host at the specified 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * port. 45f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param host 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the host name to connect to. 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number to connect to. 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if creating the socket fails. 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnknownHostException 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified host is not known. 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 55f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson protected SSLSocket(String host, int port) throws IOException, UnknownHostException { 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(host, port); 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Only to be used by subclasses. 61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a TCP socket connection to the specified address at the specified 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * port. 64f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param address 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the address to connect to. 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number to connect to. 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if creating the socket fails. 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected SSLSocket(InetAddress address, int port) throws IOException { 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(address, port); 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Only to be used by subclasses. 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a TCP socket connection to the specified host at the specified 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * port with the client side bound to the specified address and port. 81f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param host 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the host name to connect to. 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number to connect to. 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param clientAddress 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the client address to bind to 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param clientPort 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the client port number to bind to. 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if creating the socket fails. 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnknownHostException 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified host is not known. 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 95f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson protected SSLSocket(String host, int port, InetAddress clientAddress, int clientPort) 96f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson throws IOException, UnknownHostException { 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(host, port, clientAddress, clientPort); 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Only to be used by subclasses. 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates a TCP socket connection to the specified address at the specified 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * port with the client side bound to the specified address and port. 105f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param address 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the address to connect to. 108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param port 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the port number to connect to. 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param clientAddress 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the client address to bind to. 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param clientPort 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the client port number to bind to. 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if creating the socket fails. 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 117f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson protected SSLSocket(InetAddress address, int port, InetAddress clientAddress, int clientPort) 118f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson throws IOException { 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(address, port, clientAddress, clientPort); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the names of the supported cipher suites. 124f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the names of the supported cipher suites. 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String[] getSupportedCipherSuites(); 128f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the names of the enabled cipher suites. 131f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the names of the enabled cipher suites. 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String[] getEnabledCipherSuites(); 135f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the names of the cipher suites to be enabled. 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Only cipher suites returned by {@link #getSupportedCipherSuites()} are 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * allowed. 140f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param suites 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the names of the to be enabled cipher suites. 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if one of the cipher suite names is not supported. 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setEnabledCipherSuites(String[] suites); 147f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the names of the supported protocols. 150f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the names of the supported protocols. 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String[] getSupportedProtocols(); 154f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the names of the enabled protocols. 157f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the names of the enabled protocols. 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract String[] getEnabledProtocols(); 161f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets the names of the protocols to be enabled. Only 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * protocols returned by {@link #getSupportedProtocols()} are allowed. 165f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param protocols 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the names of the to be enabled protocols. 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if one of the protocols is not supported. 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setEnabledProtocols(String[] protocols); 172f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code SSLSession} for this connection. If necessary, a 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * handshake will be initiated, in which case this method will block until the handshake 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * has been established. If the handshake fails, an invalid session object 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * will be returned. 178f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the session object. 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract SSLSession getSession(); 182f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Registers the specified listener to receive notification on completion of a 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * handshake on this connection. 186f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param listener 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the listener to register. 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code listener} is {@code null}. 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void addHandshakeCompletedListener(HandshakeCompletedListener listener); 193f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Removes the specified handshake completion listener. 196f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param listener 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the listener to remove. 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified listener is not registered or {@code null}. 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void removeHandshakeCompletedListener(HandshakeCompletedListener listener); 203f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Starts a new SSL handshake on this connection. 206f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurs. 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void startHandshake() throws IOException; 211f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets whether this connection should act in client mode when handshaking. 214f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param mode 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code true} if this connection should act in client mode, 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if not. 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setUseClientMode(boolean mode); 220f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether this connection will act in client mode when handshaking. 223f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if this connections will act in client mode when 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * handshaking, {@code false} if not. 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean getUseClientMode(); 228f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets whether this connection should require client authentication. This 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is only useful for sockets in server mode. The client authentication is 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * one of the following: 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>authentication required</li> 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>authentication requested</li> 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>no authentication needed</li> 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This method overrides the setting of {@link #setWantClientAuth(boolean)}. 239f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param need 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code true} if client authentication is required, 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if no authentication is needed. 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setNeedClientAuth(boolean need); 245f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether this connection requires client authentication. 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This is only useful for sockets in server mode. 249f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if client authentication is required, {@code false} 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if no client authentication is needed. 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean getNeedClientAuth(); 254f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets whether this connections should request client authentication. This 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is only useful for sockets in server mode. The client authentication is 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * one of: 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul> 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>authentication required</li> 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>authentication requested</li> 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>no authentication needed</li> 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul> 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This method overrides the setting of {@link #setNeedClientAuth(boolean)}. 265f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param want 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code true} if client authentication should be requested, 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if not authentication is needed. 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setWantClientAuth(boolean want); 271f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether this connections will request client authentication. 274f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} is client authentication will be requested, 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false} if no client authentication is needed. 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean getWantClientAuth(); 279f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Sets whether new SSL sessions may be created by this socket or if 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * existing sessions must be reused. 283f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param flag 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code true} if new sessions may be created, otherwise 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false}. 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract void setEnableSessionCreation(boolean flag); 289f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns whether new SSL sessions may be created by this socket or if 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * existing sessions must be reused. 293f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson * 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if new sessions may be created, otherwise 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code false}. 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract boolean getEnableSessionCreation(); 298f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson 2990c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom /** 3000c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * Returns a new SSLParameters based on this SSLSocket's current 3010c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * cipher suites, protocols, and client authentication settings. 3020c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * 3030c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * @since 1.6 3040c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom */ 3050c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom public SSLParameters getSSLParameters() { 3060c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom SSLParameters p = new SSLParameters(); 3070c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom p.setCipherSuites(getEnabledCipherSuites()); 3080c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom p.setProtocols(getEnabledProtocols()); 3090c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom p.setNeedClientAuth(getNeedClientAuth()); 3100c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom p.setWantClientAuth(getWantClientAuth()); 3110c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom return p; 3120c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 3130c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom 3140c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom /** 3150c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * Sets various SSL handshake parameters based on the SSLParameter 3160c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * argument. Specifically, sets the SSLSocket's enabled cipher 3170c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * suites if the parameter's cipher suites are non-null. Similarly 3180c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * sets the enabled protocols. If the parameters specify the want 3190c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * or need for client authentication, those requirements are set 3200c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * on the SSLSocket, otherwise both are set to false. 3210c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom * @since 1.6 3220c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom */ 3230c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom public void setSSLParameters(SSLParameters p) { 3240c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom String[] cipherSuites = p.getCipherSuites(); 3250c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom if (cipherSuites != null) { 3260c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom setEnabledCipherSuites(cipherSuites); 3270c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 3280c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom String[] protocols = p.getProtocols(); 3290c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom if (protocols != null) { 3300c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom setEnabledProtocols(protocols); 3310c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 3320c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom if (p.getNeedClientAuth()) { 3330c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom setNeedClientAuth(true); 3340c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } else if (p.getWantClientAuth()) { 3350c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom setWantClientAuth(true); 3360c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } else { 3370c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom setWantClientAuth(false); 3380c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 3390c131a2ca38465b7d1df4eaee63ac73ce4d5986dBrian Carlstrom } 340f921579f87fa63204b4a4bef39ed27e7835aec45Jesse Wilson} 341