Home | History | Annotate | Download | only in conscrypt
      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 
     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.Socket;
     25 import java.net.SocketAddress;
     26 import java.net.SocketException;
     27 import java.nio.channels.SocketChannel;
     28 import java.security.PrivateKey;
     29 import java.security.cert.CertificateEncodingException;
     30 import java.security.cert.CertificateException;
     31 import javax.net.ssl.HandshakeCompletedEvent;
     32 import javax.net.ssl.HandshakeCompletedListener;
     33 import javax.net.ssl.SSLException;
     34 import javax.net.ssl.SSLParameters;
     35 import 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  */
     46 public 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