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