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