1ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root/*
2ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * Copyright 2015 The Android Open Source Project
3ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root *
4ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * you may not use this file except in compliance with the License.
6ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * You may obtain a copy of the License at
7ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root *
8ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root *
10ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * Unless required by applicable law or agreed to in writing, software
11ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * See the License for the specific language governing permissions and
14ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * limitations under the License.
15ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root */
16ce18fe693803e95ab627929b8e69d3362340dd06Kenny Rootpackage org.conscrypt;
17ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
18ce18fe693803e95ab627929b8e69d3362340dd06Kenny Rootimport java.security.Principal;
19ce18fe693803e95ab627929b8e69d3362340dd06Kenny Rootimport java.security.cert.Certificate;
205012f2dc5bf0a28a47cf9b01bd1a63c1ebdc232fKenny Rootimport java.util.Collections;
21ce18fe693803e95ab627929b8e69d3362340dd06Kenny Rootimport java.util.List;
22ce18fe693803e95ab627929b8e69d3362340dd06Kenny Rootimport javax.net.ssl.ExtendedSSLSession;
235012f2dc5bf0a28a47cf9b01bd1a63c1ebdc232fKenny Rootimport javax.net.ssl.SNIHostName;
24ce18fe693803e95ab627929b8e69d3362340dd06Kenny Rootimport javax.net.ssl.SNIServerName;
25ce18fe693803e95ab627929b8e69d3362340dd06Kenny Rootimport javax.net.ssl.SSLPeerUnverifiedException;
26ce18fe693803e95ab627929b8e69d3362340dd06Kenny Rootimport javax.net.ssl.SSLSessionContext;
27ce18fe693803e95ab627929b8e69d3362340dd06Kenny Rootimport javax.security.cert.X509Certificate;
28ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
29ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root/**
30ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * Implementation of the ExtendedSSLSession class for OpenSSL. Uses a delegate to maintain backward
31ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root * compatibility with previous versions of Android which don't have ExtendedSSLSession.
32ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root */
33ce18fe693803e95ab627929b8e69d3362340dd06Kenny Rootpublic class OpenSSLExtendedSessionImpl extends ExtendedSSLSession {
34ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    private final OpenSSLSessionImpl delegate;
35ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
36ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public OpenSSLExtendedSessionImpl(OpenSSLSessionImpl delegate) {
37ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        this.delegate = delegate;
38ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
39ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
40edfc6deb2d029636273cb92d3372448b480af354Kenny Root    public OpenSSLSessionImpl getDelegate() {
41edfc6deb2d029636273cb92d3372448b480af354Kenny Root        return delegate;
42edfc6deb2d029636273cb92d3372448b480af354Kenny Root    }
43edfc6deb2d029636273cb92d3372448b480af354Kenny Root
44ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public String[] getLocalSupportedSignatureAlgorithms() {
457d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root        // From src/ssl/t1_lib.c tls12_sigalgs
467d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root        // TODO: use BoringSSL API to actually fetch the real data
477d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root        return new String[] {
487d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA512withRSA",
497d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA512withECDSA",
507d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA384withRSA",
517d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA384withECDSA",
527d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA256withRSA",
537d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA256withECDSA",
547d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA224withRSA",
557d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA224withECDSA",
567d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA1withRSA",
577d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA1withECDSA",
587d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root        };
59ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
60ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
61ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public String[] getPeerSupportedSignatureAlgorithms() {
627d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root        // TODO: use BoringSSL API to actually fetch the real data
637d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root        return new String[] {
647d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA1withRSA",
657d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root                "SHA1withECDSA",
667d9ce0e2bd093c5f35fe13b12617b0be5ce56b1bKenny Root        };
67ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
68ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
69ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public List<SNIServerName> getRequestedServerNames() {
705012f2dc5bf0a28a47cf9b01bd1a63c1ebdc232fKenny Root        String requestedServerName = delegate.getRequestedServerName();
715012f2dc5bf0a28a47cf9b01bd1a63c1ebdc232fKenny Root        if (requestedServerName == null) {
725012f2dc5bf0a28a47cf9b01bd1a63c1ebdc232fKenny Root            return null;
735012f2dc5bf0a28a47cf9b01bd1a63c1ebdc232fKenny Root        }
745012f2dc5bf0a28a47cf9b01bd1a63c1ebdc232fKenny Root
755012f2dc5bf0a28a47cf9b01bd1a63c1ebdc232fKenny Root        return Collections.<SNIServerName> singletonList(new SNIHostName(requestedServerName));
76ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
77ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
78ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
79ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public byte[] getId() {
80ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getId();
81ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
82ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
83ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
84ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public SSLSessionContext getSessionContext() {
85ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getSessionContext();
86ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
87ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
88ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
89ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public long getCreationTime() {
90ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getCreationTime();
91ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
92ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
93ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
94ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public long getLastAccessedTime() {
95ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getLastAccessedTime();
96ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
97ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
98ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
99ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public void invalidate() {
100ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        delegate.invalidate();
101ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
102ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
103ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
104ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public boolean isValid() {
105ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.isValid();
106ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
107ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
108ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
109ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public void putValue(String name, Object value) {
110ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        delegate.putValue(name, value);
111ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
112ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
113ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
114ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public Object getValue(String name) {
115ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getValue(name);
116ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
117ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
118ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
119ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public void removeValue(String name) {
120ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        delegate.removeValue(name);
121ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
122ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
123ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
124ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public String[] getValueNames() {
125ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getValueNames();
126ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
127ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
128ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
129ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public Certificate[] getPeerCertificates() throws SSLPeerUnverifiedException {
130ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getPeerCertificates();
131ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
132ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
133ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
134ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public Certificate[] getLocalCertificates() {
135ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getLocalCertificates();
136ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
137ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
138ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
139ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public X509Certificate[] getPeerCertificateChain() throws SSLPeerUnverifiedException {
140ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getPeerCertificateChain();
141ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
142ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
143ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
144ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public Principal getPeerPrincipal() throws SSLPeerUnverifiedException {
145ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getPeerPrincipal();
146ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
147ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
148ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
149ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public Principal getLocalPrincipal() {
150ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getLocalPrincipal();
151ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
152ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
153ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
154ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public String getCipherSuite() {
155ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getCipherSuite();
156ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
157ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
158ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
159ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public String getProtocol() {
160ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getProtocol();
161ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
162ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
163ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
164ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public String getPeerHost() {
165ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getPeerHost();
166ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
167ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
168ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
169ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public int getPeerPort() {
170ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getPeerPort();
171ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
172ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
173ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
174ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public int getPacketBufferSize() {
175ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getPacketBufferSize();
176ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
177ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root
178ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    @Override
179ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    public int getApplicationBufferSize() {
180ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root        return delegate.getApplicationBufferSize();
181ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root    }
182ce18fe693803e95ab627929b8e69d3362340dd06Kenny Root}
183