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