diff options
| -rw-r--r-- | core/java/android/security/net/config/NetworkSecurityTrustManager.java | 12 | ||||
| -rw-r--r-- | core/java/android/security/net/config/TrustedCertificateStoreAdapter.java | 116 |
2 files changed, 120 insertions, 8 deletions
diff --git a/core/java/android/security/net/config/NetworkSecurityTrustManager.java b/core/java/android/security/net/config/NetworkSecurityTrustManager.java index 6013c1e4023e..982ed68f13da 100644 --- a/core/java/android/security/net/config/NetworkSecurityTrustManager.java +++ b/core/java/android/security/net/config/NetworkSecurityTrustManager.java @@ -46,17 +46,13 @@ public class NetworkSecurityTrustManager implements X509TrustManager { throw new NullPointerException("config must not be null"); } mNetworkSecurityConfig = config; - // TODO: Create our own better KeyStoreImpl try { + TrustedCertificateStoreAdapter certStore = new TrustedCertificateStoreAdapter(config); + // Provide an empty KeyStore since TrustManagerImpl doesn't support null KeyStores. + // TrustManagerImpl will use certStore to lookup certificates. KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType()); store.load(null); - int certNum = 0; - for (TrustAnchor anchor : mNetworkSecurityConfig.getTrustAnchors()) { - store.setEntry(String.valueOf(certNum++), - new KeyStore.TrustedCertificateEntry(anchor.certificate), - null); - } - mDelegate = new TrustManagerImpl(store); + mDelegate = new TrustManagerImpl(store, null, certStore); } catch (GeneralSecurityException | IOException e) { throw new RuntimeException(e); } diff --git a/core/java/android/security/net/config/TrustedCertificateStoreAdapter.java b/core/java/android/security/net/config/TrustedCertificateStoreAdapter.java new file mode 100644 index 000000000000..4a90f8223ad7 --- /dev/null +++ b/core/java/android/security/net/config/TrustedCertificateStoreAdapter.java @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.security.net.config; + +import java.io.File; +import java.security.cert.Certificate; +import java.security.cert.X509Certificate; +import java.util.Date; +import java.util.Set; + +import com.android.org.conscrypt.TrustedCertificateStore; + +/** @hide */ +public class TrustedCertificateStoreAdapter extends TrustedCertificateStore { + private final NetworkSecurityConfig mConfig; + + public TrustedCertificateStoreAdapter(NetworkSecurityConfig config) { + mConfig = config; + } + + @Override + public X509Certificate findIssuer(X509Certificate cert) { + TrustAnchor anchor = mConfig.findTrustAnchorByIssuerAndSignature(cert); + if (anchor == null) { + return null; + } + return anchor.certificate; + } + + @Override + public X509Certificate getTrustAnchor(X509Certificate cert) { + TrustAnchor anchor = mConfig.findTrustAnchorBySubjectAndPublicKey(cert); + if (anchor == null) { + return null; + } + return anchor.certificate; + } + + @Override + public boolean isUserAddedCertificate(X509Certificate cert) { + // isUserAddedCertificate is used only for pinning overrides, so use overridesPins here. + TrustAnchor anchor = mConfig.findTrustAnchorBySubjectAndPublicKey(cert); + if (anchor == null) { + return false; + } + return anchor.overridesPins; + } + + @Override + public File getCertificateFile(File dir, X509Certificate x) { + // getCertificateFile is only used for tests, do not support it here. + throw new UnsupportedOperationException(); + } + + // The methods below are exposed in TrustedCertificateStore but not used by conscrypt, do not + // support them. + + @Override + public Certificate getCertificate(String alias) { + throw new UnsupportedOperationException(); + } + + @Override + public Certificate getCertificate(String alias, boolean includeDeletedSystem) { + throw new UnsupportedOperationException(); + } + + @Override + public Date getCreationDate(String alias) { + throw new UnsupportedOperationException(); + } + + @Override + public Set<String> aliases() { + throw new UnsupportedOperationException(); + } + + @Override + public Set<String> userAliases() { + throw new UnsupportedOperationException(); + } + + @Override + public Set<String> allSystemAliases() { + throw new UnsupportedOperationException(); + } + + @Override + public boolean containsAlias(String alias) { + throw new UnsupportedOperationException(); + } + + @Override + public String getCertificateAlias(Certificate c) { + throw new UnsupportedOperationException(); + } + + @Override + public String getCertificateAlias(Certificate c, boolean includeDeletedSystem) { + throw new UnsupportedOperationException(); + } +} |