| 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 cbd4f4cf80f3a334bbc96aadb03708a49e539134..6bbf171d351ee38c45c5bba88ce12379b9ed3937 100644
|
| --- a/net/android/java/src/org/chromium/net/X509Util.java
|
| +++ b/net/android/java/src/org/chromium/net/X509Util.java
|
| @@ -6,12 +6,16 @@ package org.chromium.net;
|
|
|
| import android.util.Log;
|
|
|
| +import org.chromium.net.CertVerifyResultAndroid;
|
| +
|
| import java.io.ByteArrayInputStream;
|
| import java.io.IOException;
|
| import java.security.KeyStore;
|
| import java.security.KeyStoreException;
|
| import java.security.NoSuchAlgorithmException;
|
| import java.security.cert.CertificateException;
|
| +import java.security.cert.CertificateExpiredException;
|
| +import java.security.cert.CertificateNotYetValidException;
|
| import java.security.cert.CertificateFactory;
|
| import java.security.cert.X509Certificate;
|
|
|
| @@ -107,7 +111,7 @@ public class X509Util {
|
| KeyStoreException, NoSuchAlgorithmException {
|
| ensureInitialized();
|
| X509Certificate rootCert = createCertificateFromBytes(rootCertBytes);
|
| - synchronized(sLock) {
|
| + synchronized (sLock) {
|
| sTestKeyStore.setCertificateEntry(
|
| "root_cert_" + Integer.toString(sTestKeyStore.size()), rootCert);
|
| reloadTestTrustManager();
|
| @@ -117,45 +121,64 @@ public class X509Util {
|
| public static void clearTestRootCertificates() throws NoSuchAlgorithmException,
|
| CertificateException, KeyStoreException {
|
| ensureInitialized();
|
| - synchronized(sLock) {
|
| + synchronized (sLock) {
|
| try {
|
| sTestKeyStore.load(null);
|
| reloadTestTrustManager();
|
| - } catch(IOException e) {} // No IO operation is attempted.
|
| + } catch (IOException e) {} // No IO operation is attempted.
|
| }
|
| }
|
|
|
| - public static boolean verifyServerCertificates(byte[][] certChain, String authType)
|
| - throws CertificateException, KeyStoreException, NoSuchAlgorithmException {
|
| + public static int verifyServerCertificates(byte[][] certChain, String authType)
|
| + throws KeyStoreException, NoSuchAlgorithmException {
|
| if (certChain == null || certChain.length == 0 || certChain[0] == null) {
|
| throw new IllegalArgumentException("Expected non-null and non-empty certificate " +
|
| "chain passed as |certChain|. |certChain|=" + certChain);
|
| }
|
|
|
| - ensureInitialized();
|
| + try {
|
| + ensureInitialized();
|
| + } catch (CertificateException e) {
|
| + return CertVerifyResultAndroid.VERIFY_FAILED;
|
| + }
|
| +
|
| X509Certificate[] serverCertificates = new X509Certificate[certChain.length];
|
| - for (int i = 0; i < certChain.length; ++i) {
|
| - serverCertificates[i] = createCertificateFromBytes(certChain[i]);
|
| + try {
|
| + for (int i = 0; i < certChain.length; ++i) {
|
| + serverCertificates[i] = createCertificateFromBytes(certChain[i]);
|
| + }
|
| + } catch (CertificateException e) {
|
| + return CertVerifyResultAndroid.VERIFY_UNABLE_TO_PARSE;
|
| + }
|
| +
|
| + // Expired and not yet valid certificates would be rejected by the trust managers, but the
|
| + // trust managers report all certificate errors using the general CertificateException. In
|
| + // order to get more granular error information, cert validity time range is being checked
|
| + // separately.
|
| + try {
|
| + serverCertificates[0].checkValidity();
|
| + } catch (CertificateExpiredException e) {
|
| + return CertVerifyResultAndroid.VERIFY_EXPIRED;
|
| + } catch (CertificateNotYetValidException e) {
|
| + return CertVerifyResultAndroid.VERIFY_NOT_YET_VALID;
|
| }
|
|
|
| synchronized (sLock) {
|
| try {
|
| sDefaultTrustManager.checkServerTrusted(serverCertificates, authType);
|
| - return true;
|
| + return CertVerifyResultAndroid.VERIFY_OK;
|
| } catch (CertificateException eDefaultManager) {
|
| try {
|
| sTestTrustManager.checkServerTrusted(serverCertificates, authType);
|
| - return true;
|
| + return CertVerifyResultAndroid.VERIFY_OK;
|
| } catch (CertificateException eTestManager) {
|
| - /*
|
| - * Neither of the trust managers confirms the validity of the certificate
|
| - * chain, we emit the error message returned by the system trust manager.
|
| - */
|
| - Log.i(TAG, "failed to validate the certificate chain, error: " +
|
| - eDefaultManager.getMessage());
|
| + // Neither of the trust managers confirms the validity of the certificate chain,
|
| + // log the error message returned by the system trust manager.
|
| + Log.i(TAG, "Failed to validate the certificate chain, error: " +
|
| + eDefaultManager.getMessage());
|
| + return CertVerifyResultAndroid.VERIFY_NO_TRUSTED_ROOT;
|
| }
|
| }
|
| }
|
| - return false;
|
| }
|
| -}
|
| +}
|
|
|