1/*
2 * Copyright 2015 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
17package org.conscrypt;
18
19import java.io.FileDescriptor;
20import java.io.IOException;
21import java.io.InputStream;
22import java.io.OutputStream;
23import java.net.InetAddress;
24import java.net.Socket;
25import java.net.SocketAddress;
26import java.net.SocketException;
27import java.nio.channels.SocketChannel;
28import java.security.PrivateKey;
29import java.security.cert.CertificateEncodingException;
30import java.security.cert.CertificateException;
31import javax.net.ssl.HandshakeCompletedEvent;
32import javax.net.ssl.HandshakeCompletedListener;
33import javax.net.ssl.SSLException;
34import javax.net.ssl.SSLParameters;
35import javax.net.ssl.SSLSession;
36
37/**
38 * This class delegates all calls to an {@code org.conscrypt.OpenSSLSocketImpl}.
39 * This is to work around code that checks that the socket is an
40 * {@code org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl} before
41 * calling methods, such as setting SNI. This is only for Pre-Kitkat devices.
42 *
43 * It delegates all public methods in Socket, SSLSocket, and OpenSSLSocket from
44 * JB.
45 */
46public class PreKitKatPlatformOpenSSLSocketImplAdapter
47        extends org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl {
48
49
50    private final org.conscrypt.OpenSSLSocketImpl delegate;
51
52    public PreKitKatPlatformOpenSSLSocketImplAdapter(org.conscrypt.OpenSSLSocketImpl delegate)
53            throws IOException {
54        super(null);
55        this.delegate = delegate;
56    }
57
58    // Socket methods.
59
60    @Override
61    public void close() throws IOException {
62        delegate.close();
63    }
64
65    @Override
66    public InputStream getInputStream() throws IOException {
67        return delegate.getInputStream();
68    }
69
70    @Override
71    public int getLocalPort() {
72        return delegate.getLocalPort();
73    }
74
75    @Override
76    public OutputStream getOutputStream() throws IOException {
77        return delegate.getOutputStream();
78    }
79
80    @Override
81    public int getPort() {
82        return delegate.getPort();
83    }
84
85    @Override
86    public void connect(SocketAddress sockaddr, int timeout) throws IOException {
87        delegate.connect(sockaddr, timeout);
88    }
89
90    @Override
91    public void connect(SocketAddress sockaddr) throws IOException {
92        delegate.connect(sockaddr);
93    }
94
95    @Override
96    public void bind(SocketAddress sockaddr) throws IOException {
97        delegate.bind(sockaddr);
98    }
99
100    @Override
101    public SocketAddress getRemoteSocketAddress() {
102        return delegate.getRemoteSocketAddress();
103    }
104
105    @Override
106    public SocketAddress getLocalSocketAddress() {
107        return delegate.getLocalSocketAddress();
108    }
109
110    @Override
111    public InetAddress getLocalAddress() {
112        return delegate.getLocalAddress();
113    }
114
115    @Override
116    public InetAddress getInetAddress() {
117        return delegate.getInetAddress();
118    }
119
120    @Override
121    public String toString() {
122        return delegate.toString();
123    }
124
125    @Override
126    public void setSoLinger(boolean on, int linger) throws SocketException {
127        delegate.setSoLinger(on, linger);
128    }
129
130    @Override
131    public void setTcpNoDelay(boolean on) throws SocketException {
132        delegate.setTcpNoDelay(on);
133    }
134
135    @Override
136    public void setReuseAddress(boolean on) throws SocketException {
137        delegate.setReuseAddress(on);
138    }
139
140    @Override
141    public void setKeepAlive(boolean on) throws SocketException {
142        delegate.setKeepAlive(on);
143    }
144
145    @Override
146    public void setTrafficClass(int tos) throws SocketException {
147        delegate.setTrafficClass(tos);
148    }
149
150    @Override
151    public void setSoTimeout(int to) throws SocketException {
152        delegate.setSoTimeout(to);
153    }
154
155    @Override
156    public void setSendBufferSize(int size) throws SocketException {
157        delegate.setSendBufferSize(size);
158    }
159
160    @Override
161    public void setReceiveBufferSize(int size) throws SocketException {
162        delegate.setReceiveBufferSize(size);
163    }
164
165    @Override
166    public boolean getTcpNoDelay() throws SocketException {
167        return delegate.getTcpNoDelay();
168    }
169
170    @Override
171    public boolean getReuseAddress() throws SocketException {
172        return delegate.getReuseAddress();
173    }
174
175    @Override
176    public boolean getKeepAlive() throws SocketException {
177        return delegate.getKeepAlive();
178    }
179
180    @Override
181    public int getSoTimeout() throws SocketException {
182        return delegate.getSoTimeout();
183    }
184
185    @Override
186    public int getSoLinger() throws SocketException {
187        return delegate.getSoLinger();
188    }
189
190    @Override
191    public int getSendBufferSize() throws SocketException {
192        return delegate.getSendBufferSize();
193    }
194
195    @Override
196    public int getReceiveBufferSize() throws SocketException {
197        return delegate.getReceiveBufferSize();
198    }
199
200    @Override
201    public boolean isConnected() {
202        return delegate.isConnected();
203    }
204
205    @Override
206    public boolean isClosed() {
207        return delegate.isClosed();
208    }
209
210    @Override
211    public boolean isBound() {
212        return delegate.isBound();
213    }
214
215    @Override
216    public boolean isOutputShutdown() {
217        return delegate.isOutputShutdown();
218    }
219
220    @Override
221    public boolean isInputShutdown() {
222        return delegate.isInputShutdown();
223    }
224
225    @Override
226    public void shutdownInput() throws IOException {
227        delegate.shutdownInput();
228    }
229
230    @Override
231    public void shutdownOutput() throws IOException {
232        delegate.shutdownOutput();
233    }
234
235    @Override
236    public void setOOBInline(boolean oobinline) throws SocketException {
237        delegate.setOOBInline(oobinline);
238    }
239
240    @Override
241    public boolean getOOBInline() throws SocketException {
242        return delegate.getOOBInline();
243    }
244
245    @Override
246    public int getTrafficClass() throws SocketException {
247        return delegate.getTrafficClass();
248    }
249
250    @Override
251    public void sendUrgentData(int value) throws IOException {
252        delegate.sendUrgentData(value);
253    }
254
255    @Override
256    public SocketChannel getChannel() {
257        return delegate.getChannel();
258    }
259
260    @Override
261    public FileDescriptor getFileDescriptor$() {
262        return delegate.getFileDescriptor$();
263    }
264
265    @Override
266    public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
267        delegate.setPerformancePreferences(connectionTime, latency, bandwidth);
268    }
269
270    // SSLSocket methods.
271
272    @Override
273    public String[] getSupportedCipherSuites() {
274        return delegate.getSupportedCipherSuites();
275    }
276
277    @Override
278    public String[] getEnabledCipherSuites() {
279        return delegate.getEnabledCipherSuites();
280    }
281
282    @Override
283    public void setEnabledCipherSuites(String[] suites) {
284        delegate.setEnabledCipherSuites(suites);
285    }
286
287    @Override
288    public String[] getSupportedProtocols() {
289        return delegate.getSupportedProtocols();
290    }
291    @Override
292    public String[] getEnabledProtocols() {
293        return delegate.getEnabledProtocols();
294    }
295
296    @Override
297    public void setEnabledProtocols(String[] protocols) {
298        delegate.setEnabledProtocols(protocols);
299    }
300
301    @Override
302    public SSLSession getSession() {
303        return delegate.getSession();
304    }
305
306    @Override
307    public void addHandshakeCompletedListener(HandshakeCompletedListener listener) {
308        delegate.addHandshakeCompletedListener(listener);
309    }
310
311    @Override
312    public void removeHandshakeCompletedListener(HandshakeCompletedListener listener) {
313        delegate.removeHandshakeCompletedListener(listener);
314    }
315
316    @Override
317    public void startHandshake() throws IOException {
318        delegate.startHandshake();
319    }
320
321    @Override
322    public void setUseClientMode(boolean mode) {
323        delegate.setUseClientMode(mode);
324    }
325
326    @Override
327    public boolean getUseClientMode() {
328        return delegate.getUseClientMode();
329    }
330
331    @Override
332    public void setNeedClientAuth(boolean need) {
333        delegate.setNeedClientAuth(need);
334    }
335
336    @Override
337    public void setWantClientAuth(boolean want) {
338        delegate.setWantClientAuth(want);
339    }
340
341    @Override
342    public boolean getNeedClientAuth() {
343        return delegate.getNeedClientAuth();
344    }
345
346    @Override
347    public boolean getWantClientAuth() {
348        return delegate.getWantClientAuth();
349    }
350
351    @Override
352    public void setEnableSessionCreation(boolean flag) {
353        delegate.setEnableSessionCreation(flag);
354    }
355
356    @Override
357    public boolean getEnableSessionCreation() {
358        return delegate.getEnableSessionCreation();
359    }
360
361    @Override
362    public SSLParameters getSSLParameters() {
363        return delegate.getSSLParameters();
364    }
365
366    @Override
367    public void setSSLParameters(SSLParameters p) {
368        delegate.setSSLParameters(p);
369    }
370
371    // OpenSSLSocket methods.
372    @Override
373    public void clientCertificateRequested(byte[] keyTypeBytes, byte[][] asn1DerEncodedPrincipals)
374            throws CertificateEncodingException, SSLException {
375        throw new RuntimeException("Shouldn't be here!");
376    }
377
378    @Override
379    public void handshakeCompleted() {
380        throw new RuntimeException("Shouldn't be here!");
381    }
382
383    @Override
384    public void verifyCertificateChain(byte[][] bytes, String authMethod)
385            throws CertificateException {
386        throw new RuntimeException("Shouldn't be here!");
387    }
388
389    @Override
390    public void setUseSessionTickets(boolean useSessionTickets) {
391        delegate.setUseSessionTickets(useSessionTickets);
392    }
393
394    @Override
395    public void setHostname(String hostname) {
396        delegate.setHostname(hostname);
397    }
398
399    @Override
400    public void setChannelIdEnabled(boolean enabled) {
401        delegate.setChannelIdEnabled(enabled);
402    }
403
404    @Override
405    public byte[] getChannelId() throws SSLException {
406        return delegate.getChannelId();
407    }
408
409    @Override
410    public void setChannelIdPrivateKey(PrivateKey privateKey) {
411        delegate.setChannelIdPrivateKey(privateKey);
412    }
413
414    @Override
415    public void setSoWriteTimeout(int writeTimeoutMilliseconds) throws SocketException {
416        delegate.setSoWriteTimeout(writeTimeoutMilliseconds);
417    }
418
419    @Override
420    public int getSoWriteTimeout() throws SocketException {
421        return delegate.getSoWriteTimeout();
422    }
423
424    @Override
425    public void setHandshakeTimeout(int handshakeTimeoutMilliseconds) throws SocketException {
426        delegate.setHandshakeTimeout(handshakeTimeoutMilliseconds);
427    }
428
429    @Override
430    public byte[] getNpnSelectedProtocol() {
431        return delegate.getNpnSelectedProtocol();
432    }
433
434    @Override
435    public void setNpnProtocols(byte[] npnProtocols) {
436        delegate.setNpnProtocols(npnProtocols);
437    }
438
439    // These aren't in the Platform's OpenSSLSocketImpl but we have them to support duck typing.
440
441    public byte[] getAlpnSelectedProtocol() {
442        return delegate.getAlpnSelectedProtocol();
443    }
444
445    public void setAlpnProtocols(byte[] alpnProtocols) {
446        delegate.setAlpnProtocols(alpnProtocols);
447    }
448}
449