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