Index: net/android/java/src/org/chromium/net/X509Util.java |
diff --git a/net/android/java/src/org/chromium/net/X509Util.java b/net/android/java/src/org/chromium/net/X509Util.java |
index 788f226b922a54e5f41eda91e6cbe9ec1aa8191a..18ab61333d56802f4151c0d1165a9125b15f27cd 100644 |
--- a/net/android/java/src/org/chromium/net/X509Util.java |
+++ b/net/android/java/src/org/chromium/net/X509Util.java |
@@ -157,7 +157,7 @@ public class X509Util { |
private static final Object sLock = new Object(); |
/* |
- * Allow disabling registering the observer for the certificat changes. Net unit tests do not |
+ * Allow disabling registering the observer for the certificate changes. Net unit tests do not |
* load native libraries which prevent this to succeed. Moreover, the system does not allow to |
* interact with the certificate store without user interaction. |
*/ |
@@ -176,7 +176,14 @@ public class X509Util { |
sDefaultTrustManager = X509Util.createTrustManager(null); |
} |
if (sSystemTrustRoots == null) { |
- sSystemTrustRoots = buildSystemTrustRootSet(); |
+ try { |
+ sSystemTrustRoots = buildSystemTrustRootSet(); |
+ } catch (KeyStoreException e) { |
+ // If the device does not have an "AndroidCAStore" KeyStore, don't make the |
+ // failure fatal. Instead default conservatively to setting isIssuedByKnownRoot |
+ // to false everywhere. |
+ Log.w(TAG, "Could not load system trust root set", e); |
+ } |
} |
if (sTestKeyStore == null) { |
sTestKeyStore = KeyStore.getInstance(KeyStore.getDefaultType()); |
@@ -240,7 +247,7 @@ public class X509Util { |
for (TrustManager tm : tmf.getTrustManagers()) { |
if (tm instanceof X509TrustManager) { |
try { |
- if (Build.VERSION.SDK_INT >= 17) { |
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { |
return new X509TrustManagerJellyBean((X509TrustManager) tm); |
} else { |
return new X509TrustManagerIceCreamSandwich((X509TrustManager) tm); |
@@ -404,13 +411,15 @@ public class X509Util { |
} |
boolean isIssuedByKnownRoot = false; |
- if (verifiedChain.size() > 0) { |
+ if (sSystemTrustRoots != null && verifiedChain.size() > 0) { |
X509Certificate root = verifiedChain.get(verifiedChain.size() - 1); |
isIssuedByKnownRoot = sSystemTrustRoots.contains( |
new Pair<X500Principal, PublicKey>(root.getSubjectX500Principal(), |
root.getPublicKey())); |
} |
+ nativeRecordCertVerifyCapabilitiesHistogram(sSystemTrustRoots != null); |
+ |
return new AndroidCertVerifyResult(CertVerifyStatusAndroid.VERIFY_OK, |
isIssuedByKnownRoot, verifiedChain); |
} |
@@ -425,6 +434,12 @@ public class X509Util { |
private static native void nativeNotifyKeyChainChanged(); |
/** |
+ * Record histograms on the platform's certificate verification capabilities. |
+ */ |
+ private static native void nativeRecordCertVerifyCapabilitiesHistogram( |
+ boolean foundSystemTrustRoots); |
+ |
+ /** |
* Returns the application context. |
*/ |
private static native Context nativeGetApplicationContext(); |