Snap for 4632767 from 9e2c31d348381281031d0f28cefe74879514d714 to pi-release

Change-Id: I776c48561f212c082614fcc405810871ea21d487
diff --git a/Android.bp b/Android.bp
index 357fed3..8f1a364 100644
--- a/Android.bp
+++ b/Android.bp
@@ -45,7 +45,7 @@
 
 // non-jarjar version to build okhttp-tests
 java_library_static {
-    name: "bouncycastle-nojarjar",
+    name: "bouncycastle-unbundled",
     defaults: ["bouncycastle-defaults"],
 
     srcs: ["bcprov/src/main/java/**/*.java"],
@@ -53,22 +53,7 @@
         "bcprov/src/main/java/org/bouncycastle/asn1/ocsp/**/*.java",
     ],
 
-    target: {
-        android: {
-            // used for bouncycastle for target where we want to be sure to use OpenSSLDigest
-            exclude_srcs: [
-                "bcprov/src/main/java/org/bouncycastle/crypto/digests/AndroidDigestFactoryBouncyCastle.java",
-            ],
-        },
-        host: {
-            // used for bouncycastle for host where we can't use OpenSSLDigest
-            exclude_srcs: [
-                "bcprov/src/main/java/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL.java",
-                "bcprov/src/main/java/org/bouncycastle/crypto/digests/OpenSSLDigest.java",
-            ],
-        },
-    },
-    no_framework_libs: true,
+    sdk_version: "9",
     java_version: "1.7",
 }
 
@@ -76,7 +61,7 @@
     name: "bouncycastle",
     defaults: ["bouncycastle-defaults"],
 
-    static_libs: ["bouncycastle-nojarjar"],
+    static_libs: ["bouncycastle-unbundled"],
     no_framework_libs: true,
     java_version: "1.7",
 
@@ -94,47 +79,18 @@
     name: "bouncycastle-testdex",
     defaults: ["bouncycastle-defaults"],
 
-    static_libs: ["bouncycastle-nojarjar"],
+    static_libs: ["bouncycastle-unbundled"],
     no_framework_libs: true,
     jarjar_rules: "jarjar-rules.txt",
     java_version: "1.7",
 }
 
-// unbundled bouncycastle jar
-java_library_static {
-    name: "bouncycastle-unbundled",
-    defaults: [
-        "bouncycastle-errorprone-defaults",
-    ],
-
-    sdk_version: "9",
-    srcs: ["bcprov/src/main/java/**/*.java"],
-    exclude_srcs: [
-        "bcprov/src/main/java/org/bouncycastle/asn1/ocsp/**/*.java",
-        "bcprov/src/main/java/org/bouncycastle/crypto/digests/AndroidDigestFactoryOpenSSL.java",
-        "bcprov/src/main/java/org/bouncycastle/crypto/digests/OpenSSLDigest.java",
-    ],
-}
-
 // PKIX classes used for testing
 java_library_static {
-    name: "bouncycastle-bcpkix-nojarjar",
-    defaults: ["bouncycastle-defaults"],
-
-    srcs: ["bcpkix/src/main/java/**/*.java"],
-    exclude_srcs: ["bcpkix/src/main/java/org/bouncycastle/cert/ocsp/**/*.java"],
-    no_framework_libs: true,
-    java_version: "1.7",
-    libs: [
-        "bouncycastle-nojarjar",
-    ],
-}
-
-java_library_static {
     name: "bouncycastle-bcpkix",
     defaults: ["bouncycastle-defaults"],
 
-    static_libs: ["bouncycastle-bcpkix-nojarjar"],
+    static_libs: ["bouncycastle-bcpkix-unbundled"],
     no_framework_libs: true,
     java_version: "1.7",
 
@@ -145,33 +101,43 @@
     },
 }
 
-// OCSP classes used for testing
 java_library_static {
-    name: "bouncycastle-ocsp-nojarjar",
-    defaults: ["bouncycastle-defaults"],
-
-    srcs: [
-        "bcpkix/src/main/java/org/bouncycastle/cert/ocsp/**/*.java",
-        "bcprov/src/main/java/org/bouncycastle/asn1/ocsp/**/*.java",
+    name: "bouncycastle-bcpkix-unbundled",
+    defaults: [
+        "bouncycastle-defaults",
     ],
-    java_version: "1.7",
-    no_framework_libs: true,
-    libs: [
-        "bouncycastle-nojarjar",
-        "bouncycastle-bcpkix-nojarjar",
-    ],
+    libs: [ "bouncycastle-unbundled" ],
+    sdk_version: "9",
+    srcs: ["bcpkix/src/main/java/**/*.java"],
+    exclude_srcs: ["bcpkix/src/main/java/org/bouncycastle/cert/ocsp/**/*.java"],
 }
 
+
+// OCSP classes used for testing
 java_library_static {
     name: "bouncycastle-ocsp",
     defaults: ["bouncycastle-defaults"],
 
-    static_libs: ["bouncycastle-ocsp-nojarjar"],
+    static_libs: ["bouncycastle-ocsp-unbundled"],
     jarjar_rules: "jarjar-rules.txt",
     java_version: "1.7",
     no_framework_libs: true,
 }
 
+java_library_static {
+    name: "bouncycastle-ocsp-unbundled",
+    defaults: [
+        "bouncycastle-defaults",
+    ],
+    libs: [ "bouncycastle-unbundled",
+            "bouncycastle-bcpkix-unbundled" ],
+    sdk_version: "9",
+    srcs: [
+        "bcpkix/src/main/java/org/bouncycastle/cert/ocsp/**/*.java",
+        "bcprov/src/main/java/org/bouncycastle/asn1/ocsp/**/*.java",
+    ],
+}
+
 // For compatibilityy with old bouncycastle-host and bouncycastle-bcpkix-host names
 java_library_host {
     name: "bouncycastle-host",
diff --git a/bcprov/src/main/java/org/bouncycastle/crypto/digests/AndroidDigestFactory.java b/bcprov/src/main/java/org/bouncycastle/crypto/digests/AndroidDigestFactory.java
index cab9ca6..c8f0775 100644
--- a/bcprov/src/main/java/org/bouncycastle/crypto/digests/AndroidDigestFactory.java
+++ b/bcprov/src/main/java/org/bouncycastle/crypto/digests/AndroidDigestFactory.java
@@ -16,6 +16,9 @@
 
 package org.bouncycastle.crypto.digests;
 
+import java.security.Security;
+import java.util.Locale;
+
 import org.bouncycastle.crypto.Digest;
 
 /**
@@ -23,65 +26,84 @@
  * for libcore but fallback to BouncyCastle ones on the RI.
  */
 public final class AndroidDigestFactory {
-    private static final String OpenSSLFactoryClassName
-            = AndroidDigestFactory.class.getName() + "OpenSSL";
-    private static final String BouncyCastleFactoryClassName
-            = AndroidDigestFactory.class.getName() + "BouncyCastle";
+    private static final AndroidDigestFactoryInterface CONSCRYPT;
+    private static final AndroidDigestFactoryInterface BC;
 
-    private static final AndroidDigestFactoryInterface FACTORY;
     static {
-        Class factoryImplementationClass;
-        try {
-            factoryImplementationClass = Class.forName(OpenSSLFactoryClassName);
-            // Double check for NativeCrypto in case we are running on RI for testing
-            Class.forName("com.android.org.conscrypt.NativeCrypto");
-        } catch (ClassNotFoundException e1) {
-            try {
-                factoryImplementationClass = Class.forName(BouncyCastleFactoryClassName);
-            } catch (ClassNotFoundException e2) {
-                AssertionError e = new AssertionError("Failed to load "
-                                         + "AndroidDigestFactoryInterface "
-                                         + "implementation. Looked for "
-                                         + OpenSSLFactoryClassName + " and "
-                                         + BouncyCastleFactoryClassName);
-                e.initCause(e1);
-                throw e;
+        BC = new AndroidDigestFactoryBouncyCastle();
+        if (Security.getProvider("AndroidOpenSSL") != null) {
+            CONSCRYPT = new AndroidDigestFactoryOpenSSL();
+        } else {
+            if (System.getProperty("java.vendor", "").toLowerCase(Locale.US).contains("android")) {
+                throw new AssertionError("Provider AndroidOpenSSL must exist");
             }
-        }
-        if (!AndroidDigestFactoryInterface.class.isAssignableFrom(factoryImplementationClass)) {
-            throw new AssertionError(factoryImplementationClass
-                                     + "does not implement AndroidDigestFactoryInterface");
-        }
-        try {
-            FACTORY = (AndroidDigestFactoryInterface) factoryImplementationClass.newInstance();
-        } catch (InstantiationException e) {
-            throw new AssertionError(e);
-        } catch (IllegalAccessException e) {
-            throw new AssertionError(e);
+            CONSCRYPT = null;
         }
     }
 
     public static Digest getMD5() {
-        return FACTORY.getMD5();
+        if (CONSCRYPT != null) {
+            try {
+                return CONSCRYPT.getMD5();
+            } catch (Exception ignored) {
+            }
+        }
+
+        return BC.getMD5();
     }
 
     public static Digest getSHA1() {
-        return FACTORY.getSHA1();
+        if (CONSCRYPT != null) {
+            try {
+                return CONSCRYPT.getSHA1();
+            } catch (Exception ignored) {
+            }
+        }
+
+        return BC.getSHA1();
     }
 
     public static Digest getSHA224() {
-        return FACTORY.getSHA224();
+        if (CONSCRYPT != null) {
+            try {
+                return CONSCRYPT.getSHA224();
+            } catch (Exception ignored) {
+            }
+        }
+
+        return BC.getSHA224();
     }
 
     public static Digest getSHA256() {
-        return FACTORY.getSHA256();
+        if (CONSCRYPT != null) {
+            try {
+                return CONSCRYPT.getSHA256();
+            } catch (Exception ignored) {
+            }
+        }
+
+        return BC.getSHA256();
     }
 
     public static Digest getSHA384() {
-        return FACTORY.getSHA384();
+        if (CONSCRYPT != null) {
+            try {
+                return CONSCRYPT.getSHA384();
+            } catch (Exception ignored) {
+            }
+        }
+
+        return BC.getSHA384();
     }
 
     public static Digest getSHA512() {
-        return FACTORY.getSHA512();
+        if (CONSCRYPT != null) {
+            try {
+                return CONSCRYPT.getSHA512();
+            } catch (Exception ignored) {
+            }
+        }
+
+        return BC.getSHA512();
     }
 }