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