162190cd439f163c7a53604b01836a576ef88013aChad Brubaker/*
262190cd439f163c7a53604b01836a576ef88013aChad Brubaker * Copyright 2015 The Android Open Source Project
362190cd439f163c7a53604b01836a576ef88013aChad Brubaker *
462190cd439f163c7a53604b01836a576ef88013aChad Brubaker * Licensed under the Apache License, Version 2.0 (the "License");
562190cd439f163c7a53604b01836a576ef88013aChad Brubaker * you may not use this file except in compliance with the License.
662190cd439f163c7a53604b01836a576ef88013aChad Brubaker * You may obtain a copy of the License at
762190cd439f163c7a53604b01836a576ef88013aChad Brubaker *
862190cd439f163c7a53604b01836a576ef88013aChad Brubaker *      http://www.apache.org/licenses/LICENSE-2.0
962190cd439f163c7a53604b01836a576ef88013aChad Brubaker *
1062190cd439f163c7a53604b01836a576ef88013aChad Brubaker * Unless required by applicable law or agreed to in writing, software
1162190cd439f163c7a53604b01836a576ef88013aChad Brubaker * distributed under the License is distributed on an "AS IS" BASIS,
1262190cd439f163c7a53604b01836a576ef88013aChad Brubaker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1362190cd439f163c7a53604b01836a576ef88013aChad Brubaker * See the License for the specific language governing permissions and
1462190cd439f163c7a53604b01836a576ef88013aChad Brubaker * limitations under the License.
1562190cd439f163c7a53604b01836a576ef88013aChad Brubaker */
1662190cd439f163c7a53604b01836a576ef88013aChad Brubaker
1762190cd439f163c7a53604b01836a576ef88013aChad Brubakerpackage org.conscrypt;
1862190cd439f163c7a53604b01836a576ef88013aChad Brubaker
1962190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.io.FileDescriptor;
2062190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.io.IOException;
2162190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.io.InputStream;
2262190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.io.OutputStream;
2362190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.net.InetAddress;
2462190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.net.Socket;
2562190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.net.SocketAddress;
2662190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.net.SocketException;
2762190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.nio.channels.SocketChannel;
2862190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.security.PrivateKey;
2962190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.security.cert.CertificateEncodingException;
3062190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport java.security.cert.CertificateException;
3162190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport javax.net.ssl.HandshakeCompletedEvent;
3262190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport javax.net.ssl.HandshakeCompletedListener;
3362190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport javax.net.ssl.SSLException;
3462190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport javax.net.ssl.SSLParameters;
3562190cd439f163c7a53604b01836a576ef88013aChad Brubakerimport javax.net.ssl.SSLSession;
3662190cd439f163c7a53604b01836a576ef88013aChad Brubaker
3762190cd439f163c7a53604b01836a576ef88013aChad Brubaker/**
3862190cd439f163c7a53604b01836a576ef88013aChad Brubaker * This class delegates all calls to an {@code org.conscrypt.OpenSSLSocketImpl}.
3962190cd439f163c7a53604b01836a576ef88013aChad Brubaker * This is to work around code that checks that the socket is an
4062190cd439f163c7a53604b01836a576ef88013aChad Brubaker * {@code org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl} before
4162190cd439f163c7a53604b01836a576ef88013aChad Brubaker * calling methods, such as setting SNI. This is only for Pre-Kitkat devices.
4262190cd439f163c7a53604b01836a576ef88013aChad Brubaker *
4362190cd439f163c7a53604b01836a576ef88013aChad Brubaker * It delegates all public methods in Socket, SSLSocket, and OpenSSLSocket from
4462190cd439f163c7a53604b01836a576ef88013aChad Brubaker * JB.
4562190cd439f163c7a53604b01836a576ef88013aChad Brubaker */
4662190cd439f163c7a53604b01836a576ef88013aChad Brubakerpublic class PreKitKatPlatformOpenSSLSocketImplAdapter
4762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        extends org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl {
4862190cd439f163c7a53604b01836a576ef88013aChad Brubaker
4962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
5062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    private final org.conscrypt.OpenSSLSocketImpl delegate;
5162190cd439f163c7a53604b01836a576ef88013aChad Brubaker
5262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public PreKitKatPlatformOpenSSLSocketImplAdapter(org.conscrypt.OpenSSLSocketImpl delegate)
5362190cd439f163c7a53604b01836a576ef88013aChad Brubaker            throws IOException {
5462190cd439f163c7a53604b01836a576ef88013aChad Brubaker        super(null);
5562190cd439f163c7a53604b01836a576ef88013aChad Brubaker        this.delegate = delegate;
5662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
5762190cd439f163c7a53604b01836a576ef88013aChad Brubaker
5862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    // Socket methods.
5962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
6062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
6162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void close() throws IOException {
6262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.close();
6362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
6462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
6562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
6662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public InputStream getInputStream() throws IOException {
6762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getInputStream();
6862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
6962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
7062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
7162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public int getLocalPort() {
7262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getLocalPort();
7362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
7462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
7562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
7662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public OutputStream getOutputStream() throws IOException {
7762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getOutputStream();
7862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
7962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
8062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
8162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public int getPort() {
8262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getPort();
8362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
8462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
8562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
8662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void connect(SocketAddress sockaddr, int timeout) throws IOException {
8762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.connect(sockaddr, timeout);
8862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
8962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
9062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
9162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void connect(SocketAddress sockaddr) throws IOException {
9262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.connect(sockaddr);
9362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
9462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
9562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
9662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void bind(SocketAddress sockaddr) throws IOException {
9762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.bind(sockaddr);
9862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
9962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
10062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
10162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public SocketAddress getRemoteSocketAddress() {
10262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getRemoteSocketAddress();
10362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
10462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
10562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
10662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public SocketAddress getLocalSocketAddress() {
10762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getLocalSocketAddress();
10862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
10962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
11062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
11162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public InetAddress getLocalAddress() {
11262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getLocalAddress();
11362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
11462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
11562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
11662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public InetAddress getInetAddress() {
11762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getInetAddress();
11862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
11962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
12062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
12162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public String toString() {
12262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.toString();
12362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
12462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
12562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
12662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setSoLinger(boolean on, int linger) throws SocketException {
12762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setSoLinger(on, linger);
12862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
12962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
13062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
13162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setTcpNoDelay(boolean on) throws SocketException {
13262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setTcpNoDelay(on);
13362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
13462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
13562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
13662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setReuseAddress(boolean on) throws SocketException {
13762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setReuseAddress(on);
13862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
13962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
14062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
14162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setKeepAlive(boolean on) throws SocketException {
14262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setKeepAlive(on);
14362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
14462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
14562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
14662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setTrafficClass(int tos) throws SocketException {
14762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setTrafficClass(tos);
14862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
14962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
15062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
15162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setSoTimeout(int to) throws SocketException {
15262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setSoTimeout(to);
15362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
15462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
15562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
15662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setSendBufferSize(int size) throws SocketException {
15762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setSendBufferSize(size);
15862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
15962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
16062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
16162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setReceiveBufferSize(int size) throws SocketException {
16262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setReceiveBufferSize(size);
16362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
16462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
16562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
16662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean getTcpNoDelay() throws SocketException {
16762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getTcpNoDelay();
16862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
16962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
17062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
17162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean getReuseAddress() throws SocketException {
17262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getReuseAddress();
17362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
17462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
17562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
17662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean getKeepAlive() throws SocketException {
17762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getKeepAlive();
17862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
17962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
18062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
18162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public int getSoTimeout() throws SocketException {
18262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getSoTimeout();
18362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
18462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
18562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
18662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public int getSoLinger() throws SocketException {
18762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getSoLinger();
18862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
18962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
19062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
19162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public int getSendBufferSize() throws SocketException {
19262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getSendBufferSize();
19362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
19462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
19562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
19662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public int getReceiveBufferSize() throws SocketException {
19762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getReceiveBufferSize();
19862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
19962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
20062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
20162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean isConnected() {
20262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.isConnected();
20362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
20462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
20562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
20662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean isClosed() {
20762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.isClosed();
20862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
20962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
21062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
21162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean isBound() {
21262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.isBound();
21362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
21462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
21562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
21662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean isOutputShutdown() {
21762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.isOutputShutdown();
21862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
21962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
22062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
22162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean isInputShutdown() {
22262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.isInputShutdown();
22362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
22462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
22562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
22662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void shutdownInput() throws IOException {
22762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.shutdownInput();
22862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
22962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
23062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
23162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void shutdownOutput() throws IOException {
23262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.shutdownOutput();
23362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
23462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
23562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
23662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setOOBInline(boolean oobinline) throws SocketException {
23762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setOOBInline(oobinline);
23862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
23962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
24062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
24162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean getOOBInline() throws SocketException {
24262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getOOBInline();
24362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
24462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
24562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
24662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public int getTrafficClass() throws SocketException {
24762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getTrafficClass();
24862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
24962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
25062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
25162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void sendUrgentData(int value) throws IOException {
25262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.sendUrgentData(value);
25362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
25462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
25562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
25662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public SocketChannel getChannel() {
25762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getChannel();
25862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
25962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
26062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
26162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public FileDescriptor getFileDescriptor$() {
26262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getFileDescriptor$();
26362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
26462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
26562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
26662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setPerformancePreferences(int connectionTime, int latency, int bandwidth) {
26762190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setPerformancePreferences(connectionTime, latency, bandwidth);
26862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
26962190cd439f163c7a53604b01836a576ef88013aChad Brubaker
27062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    // SSLSocket methods.
27162190cd439f163c7a53604b01836a576ef88013aChad Brubaker
27262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
27362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public String[] getSupportedCipherSuites() {
27462190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getSupportedCipherSuites();
27562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
27662190cd439f163c7a53604b01836a576ef88013aChad Brubaker
27762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
27862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public String[] getEnabledCipherSuites() {
27962190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getEnabledCipherSuites();
28062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
28162190cd439f163c7a53604b01836a576ef88013aChad Brubaker
28262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
28362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setEnabledCipherSuites(String[] suites) {
28462190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setEnabledCipherSuites(suites);
28562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
28662190cd439f163c7a53604b01836a576ef88013aChad Brubaker
28762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
28862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public String[] getSupportedProtocols() {
28962190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getSupportedProtocols();
29062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
29162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
29262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public String[] getEnabledProtocols() {
29362190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getEnabledProtocols();
29462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
29562190cd439f163c7a53604b01836a576ef88013aChad Brubaker
29662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
29762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setEnabledProtocols(String[] protocols) {
29862190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setEnabledProtocols(protocols);
29962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
30062190cd439f163c7a53604b01836a576ef88013aChad Brubaker
30162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
30262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public SSLSession getSession() {
30362190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getSession();
30462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
30562190cd439f163c7a53604b01836a576ef88013aChad Brubaker
30662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
30762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void addHandshakeCompletedListener(HandshakeCompletedListener listener) {
30862190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.addHandshakeCompletedListener(listener);
30962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
31062190cd439f163c7a53604b01836a576ef88013aChad Brubaker
31162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
31262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void removeHandshakeCompletedListener(HandshakeCompletedListener listener) {
31362190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.removeHandshakeCompletedListener(listener);
31462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
31562190cd439f163c7a53604b01836a576ef88013aChad Brubaker
31662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
31762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void startHandshake() throws IOException {
31862190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.startHandshake();
31962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
32062190cd439f163c7a53604b01836a576ef88013aChad Brubaker
32162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
32262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setUseClientMode(boolean mode) {
32362190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setUseClientMode(mode);
32462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
32562190cd439f163c7a53604b01836a576ef88013aChad Brubaker
32662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
32762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean getUseClientMode() {
32862190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getUseClientMode();
32962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
33062190cd439f163c7a53604b01836a576ef88013aChad Brubaker
33162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
33262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setNeedClientAuth(boolean need) {
33362190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setNeedClientAuth(need);
33462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
33562190cd439f163c7a53604b01836a576ef88013aChad Brubaker
33662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
33762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setWantClientAuth(boolean want) {
33862190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setWantClientAuth(want);
33962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
34062190cd439f163c7a53604b01836a576ef88013aChad Brubaker
34162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
34262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean getNeedClientAuth() {
34362190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getNeedClientAuth();
34462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
34562190cd439f163c7a53604b01836a576ef88013aChad Brubaker
34662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
34762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean getWantClientAuth() {
34862190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getWantClientAuth();
34962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
35062190cd439f163c7a53604b01836a576ef88013aChad Brubaker
35162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
35262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setEnableSessionCreation(boolean flag) {
35362190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setEnableSessionCreation(flag);
35462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
35562190cd439f163c7a53604b01836a576ef88013aChad Brubaker
35662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
35762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public boolean getEnableSessionCreation() {
35862190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getEnableSessionCreation();
35962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
36062190cd439f163c7a53604b01836a576ef88013aChad Brubaker
36162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
36262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public SSLParameters getSSLParameters() {
36362190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getSSLParameters();
36462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
36562190cd439f163c7a53604b01836a576ef88013aChad Brubaker
36662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
36762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setSSLParameters(SSLParameters p) {
36862190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setSSLParameters(p);
36962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
37062190cd439f163c7a53604b01836a576ef88013aChad Brubaker
37162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    // OpenSSLSocket methods.
37262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
37362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void clientCertificateRequested(byte[] keyTypeBytes, byte[][] asn1DerEncodedPrincipals)
37462190cd439f163c7a53604b01836a576ef88013aChad Brubaker            throws CertificateEncodingException, SSLException {
37562190cd439f163c7a53604b01836a576ef88013aChad Brubaker        throw new RuntimeException("Shouldn't be here!");
37662190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
37762190cd439f163c7a53604b01836a576ef88013aChad Brubaker
37862190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
37962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void handshakeCompleted() {
38062190cd439f163c7a53604b01836a576ef88013aChad Brubaker        throw new RuntimeException("Shouldn't be here!");
38162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
38262190cd439f163c7a53604b01836a576ef88013aChad Brubaker
38362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
38462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void verifyCertificateChain(byte[][] bytes, String authMethod)
38562190cd439f163c7a53604b01836a576ef88013aChad Brubaker            throws CertificateException {
38662190cd439f163c7a53604b01836a576ef88013aChad Brubaker        throw new RuntimeException("Shouldn't be here!");
38762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
38862190cd439f163c7a53604b01836a576ef88013aChad Brubaker
38962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
39062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setUseSessionTickets(boolean useSessionTickets) {
39162190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setUseSessionTickets(useSessionTickets);
39262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
39362190cd439f163c7a53604b01836a576ef88013aChad Brubaker
39462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
39562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setHostname(String hostname) {
39662190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setHostname(hostname);
39762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
39862190cd439f163c7a53604b01836a576ef88013aChad Brubaker
39962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
40062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setChannelIdEnabled(boolean enabled) {
40162190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setChannelIdEnabled(enabled);
40262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
40362190cd439f163c7a53604b01836a576ef88013aChad Brubaker
40462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
40562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public byte[] getChannelId() throws SSLException {
40662190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getChannelId();
40762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
40862190cd439f163c7a53604b01836a576ef88013aChad Brubaker
40962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
41062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setChannelIdPrivateKey(PrivateKey privateKey) {
41162190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setChannelIdPrivateKey(privateKey);
41262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
41362190cd439f163c7a53604b01836a576ef88013aChad Brubaker
41462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
41562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setSoWriteTimeout(int writeTimeoutMilliseconds) throws SocketException {
41662190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setSoWriteTimeout(writeTimeoutMilliseconds);
41762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
41862190cd439f163c7a53604b01836a576ef88013aChad Brubaker
41962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
42062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public int getSoWriteTimeout() throws SocketException {
42162190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getSoWriteTimeout();
42262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
42362190cd439f163c7a53604b01836a576ef88013aChad Brubaker
42462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
42562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setHandshakeTimeout(int handshakeTimeoutMilliseconds) throws SocketException {
42662190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setHandshakeTimeout(handshakeTimeoutMilliseconds);
42762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
42862190cd439f163c7a53604b01836a576ef88013aChad Brubaker
42962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
43062190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public byte[] getNpnSelectedProtocol() {
43162190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getNpnSelectedProtocol();
43262190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
43362190cd439f163c7a53604b01836a576ef88013aChad Brubaker
43462190cd439f163c7a53604b01836a576ef88013aChad Brubaker    @Override
43562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setNpnProtocols(byte[] npnProtocols) {
43662190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setNpnProtocols(npnProtocols);
43762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
43862190cd439f163c7a53604b01836a576ef88013aChad Brubaker
43962190cd439f163c7a53604b01836a576ef88013aChad Brubaker    // These aren't in the Platform's OpenSSLSocketImpl but we have them to support duck typing.
44062190cd439f163c7a53604b01836a576ef88013aChad Brubaker
44162190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public byte[] getAlpnSelectedProtocol() {
44262190cd439f163c7a53604b01836a576ef88013aChad Brubaker        return delegate.getAlpnSelectedProtocol();
44362190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
44462190cd439f163c7a53604b01836a576ef88013aChad Brubaker
44562190cd439f163c7a53604b01836a576ef88013aChad Brubaker    public void setAlpnProtocols(byte[] alpnProtocols) {
44662190cd439f163c7a53604b01836a576ef88013aChad Brubaker        delegate.setAlpnProtocols(alpnProtocols);
44762190cd439f163c7a53604b01836a576ef88013aChad Brubaker    }
44862190cd439f163c7a53604b01836a576ef88013aChad Brubaker}
449