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