DO NOT MERGE - Skip qt-dev-plus-aosp-without-vendor (5713463) in stage-aosp-master

Bug: 134405016
Change-Id: I1ae8c9276d33bdb9f78577426f85cf09ebc5e9fa
diff --git a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java
index db2f66c..d3d04db 100644
--- a/bcprov/src/main/java/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java
+++ b/bcprov/src/main/java/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java
@@ -454,7 +454,8 @@
         }
         */
         // END Android-removed: Unsupported modes
-        else if (modeName.startsWith("GCM"))
+        // Android-changed: Use equals instead of startsWith to not catch GCM-SIV
+        else if (modeName.equalsIgnoreCase("GCM"))
         {
             ivLength = baseEngine.getBlockSize();
             // BEGIN Android-removed: Unsupported algorithms
diff --git a/bcprov/src/main/java/org/bouncycastle/util/BigIntegers.java b/bcprov/src/main/java/org/bouncycastle/util/BigIntegers.java
index a118ba5..62be36e 100644
--- a/bcprov/src/main/java/org/bouncycastle/util/BigIntegers.java
+++ b/bcprov/src/main/java/org/bouncycastle/util/BigIntegers.java
@@ -141,6 +141,15 @@
         return new BigInteger(1, createRandom(bitLength, random));
     }
 
+    // Hexadecimal value of the product of the 131 smallest odd primes from 3 to 743
+    private static final BigInteger SMALL_PRIMES_PRODUCT = new BigInteger(
+              "8138e8a0fcf3a4e84a771d40fd305d7f4aa59306d7251de54d98af8fe95729a1f"
+            + "73d893fa424cd2edc8636a6c3285e022b0e3866a565ae8108eed8591cd4fe8d2"
+            + "ce86165a978d719ebf647f362d33fca29cd179fb42401cbaf3df0c614056f9c8"
+            + "f3cfd51e474afb6bc6974f78db8aba8e9e517fded658591ab7502bd41849462f",
+        16);
+    private static final int SQR_MAX_SMALL = 20; // bitlength of 743 * 743
+
     /**
      * Return a prime number candidate of the specified bit length.
      *
@@ -174,6 +183,13 @@
             base[base.length - 1] |= 0x01;
 
             rv = new BigInteger(1, base);
+            if (bitLength > SQR_MAX_SMALL)
+            {
+                while (!rv.gcd(SMALL_PRIMES_PRODUCT).equals(ONE))
+                {
+                    rv = rv.add(TWO);
+                }
+            }
         }
         while (!rv.isProbablePrime(certainty));
 
diff --git a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/GeneralDigest.java b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/GeneralDigest.java
index 8071466..690c63d 100644
--- a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/GeneralDigest.java
+++ b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/GeneralDigest.java
@@ -156,7 +156,7 @@
     {
         return BYTE_LENGTH;
     }
-
+    
     protected abstract void processWord(byte[] in, int inOff);
 
     protected abstract void processLength(long bitLength);
diff --git a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/SHA1Digest.java b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/SHA1Digest.java
index a101d40..78750ea 100644
--- a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/SHA1Digest.java
+++ b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/crypto/digests/SHA1Digest.java
@@ -102,7 +102,7 @@
         if (++xOff == 16)
         {
             processBlock();
-        }
+        }        
     }
 
     protected void processLength(
@@ -162,7 +162,7 @@
     private static final int    Y2 = 0x6ed9eba1;
     private static final int    Y3 = 0x8f1bbcdc;
     private static final int    Y4 = 0xca62c1d6;
-
+   
     private int f(
         int    u,
         int    v,
@@ -211,27 +211,27 @@
         // round 1
         //
         int idx = 0;
-
+        
         for (int j = 0; j < 4; j++)
         {
             // E = rotateLeft(A, 5) + f(B, C, D) + E + X[idx++] + Y1
             // B = rotateLeft(B, 30)
             E += (A << 5 | A >>> 27) + f(B, C, D) + X[idx++] + Y1;
             B = B << 30 | B >>> 2;
-
+        
             D += (E << 5 | E >>> 27) + f(A, B, C) + X[idx++] + Y1;
             A = A << 30 | A >>> 2;
-
+       
             C += (D << 5 | D >>> 27) + f(E, A, B) + X[idx++] + Y1;
             E = E << 30 | E >>> 2;
-
+       
             B += (C << 5 | C >>> 27) + f(D, E, A) + X[idx++] + Y1;
             D = D << 30 | D >>> 2;
 
             A += (B << 5 | B >>> 27) + f(C, D, E) + X[idx++] + Y1;
             C = C << 30 | C >>> 2;
         }
-
+        
         //
         // round 2
         //
@@ -240,21 +240,21 @@
             // E = rotateLeft(A, 5) + h(B, C, D) + E + X[idx++] + Y2
             // B = rotateLeft(B, 30)
             E += (A << 5 | A >>> 27) + h(B, C, D) + X[idx++] + Y2;
-            B = B << 30 | B >>> 2;
-
+            B = B << 30 | B >>> 2;   
+            
             D += (E << 5 | E >>> 27) + h(A, B, C) + X[idx++] + Y2;
             A = A << 30 | A >>> 2;
-
+            
             C += (D << 5 | D >>> 27) + h(E, A, B) + X[idx++] + Y2;
             E = E << 30 | E >>> 2;
-
+            
             B += (C << 5 | C >>> 27) + h(D, E, A) + X[idx++] + Y2;
             D = D << 30 | D >>> 2;
 
             A += (B << 5 | B >>> 27) + h(C, D, E) + X[idx++] + Y2;
             C = C << 30 | C >>> 2;
         }
-
+        
         //
         // round 3
         //
@@ -264,13 +264,13 @@
             // B = rotateLeft(B, 30)
             E += (A << 5 | A >>> 27) + g(B, C, D) + X[idx++] + Y3;
             B = B << 30 | B >>> 2;
-
+            
             D += (E << 5 | E >>> 27) + g(A, B, C) + X[idx++] + Y3;
             A = A << 30 | A >>> 2;
-
+            
             C += (D << 5 | D >>> 27) + g(E, A, B) + X[idx++] + Y3;
             E = E << 30 | E >>> 2;
-
+            
             B += (C << 5 | C >>> 27) + g(D, E, A) + X[idx++] + Y3;
             D = D << 30 | D >>> 2;
 
@@ -287,13 +287,13 @@
             // B = rotateLeft(B, 30)
             E += (A << 5 | A >>> 27) + h(B, C, D) + X[idx++] + Y4;
             B = B << 30 | B >>> 2;
-
+            
             D += (E << 5 | E >>> 27) + h(A, B, C) + X[idx++] + Y4;
             A = A << 30 | A >>> 2;
-
+            
             C += (D << 5 | D >>> 27) + h(E, A, B) + X[idx++] + Y4;
             E = E << 30 | E >>> 2;
-
+            
             B += (C << 5 | C >>> 27) + h(D, E, A) + X[idx++] + Y4;
             D = D << 30 | D >>> 2;
 
diff --git a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java
index 5c29fae..1351477 100644
--- a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java
+++ b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/jcajce/provider/symmetric/util/BaseBlockCipher.java
@@ -458,7 +458,8 @@
         }
         */
         // END Android-removed: Unsupported modes
-        else if (modeName.startsWith("GCM"))
+        // Android-changed: Use equals instead of startsWith to not catch GCM-SIV
+        else if (modeName.equalsIgnoreCase("GCM"))
         {
             ivLength = baseEngine.getBlockSize();
             // BEGIN Android-removed: Unsupported algorithms
diff --git a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/util/BigIntegers.java b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/util/BigIntegers.java
index fe7dbb8..93e1a77 100644
--- a/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/util/BigIntegers.java
+++ b/repackaged/bcprov/src/main/java/com/android/org/bouncycastle/util/BigIntegers.java
@@ -143,6 +143,15 @@
         return new BigInteger(1, createRandom(bitLength, random));
     }
 
+    // Hexadecimal value of the product of the 131 smallest odd primes from 3 to 743
+    private static final BigInteger SMALL_PRIMES_PRODUCT = new BigInteger(
+              "8138e8a0fcf3a4e84a771d40fd305d7f4aa59306d7251de54d98af8fe95729a1f"
+            + "73d893fa424cd2edc8636a6c3285e022b0e3866a565ae8108eed8591cd4fe8d2"
+            + "ce86165a978d719ebf647f362d33fca29cd179fb42401cbaf3df0c614056f9c8"
+            + "f3cfd51e474afb6bc6974f78db8aba8e9e517fded658591ab7502bd41849462f",
+        16);
+    private static final int SQR_MAX_SMALL = 20; // bitlength of 743 * 743
+
     /**
      * Return a prime number candidate of the specified bit length.
      *
@@ -176,6 +185,13 @@
             base[base.length - 1] |= 0x01;
 
             rv = new BigInteger(1, base);
+            if (bitLength > SQR_MAX_SMALL)
+            {
+                while (!rv.gcd(SMALL_PRIMES_PRODUCT).equals(ONE))
+                {
+                    rv = rv.add(TWO);
+                }
+            }
         }
         while (!rv.isProbablePrime(certainty));
 
diff --git a/srcgen/core-platform-api.txt b/srcgen/core-platform-api.txt
index 586bfa9..62c754b 100644
--- a/srcgen/core-platform-api.txt
+++ b/srcgen/core-platform-api.txt
@@ -78,8 +78,8 @@
 method:com.android.org.bouncycastle.crypto.digests.GeneralDigest#finish()
 method:com.android.org.bouncycastle.crypto.digests.GeneralDigest#processBlock()
 method:com.android.org.bouncycastle.crypto.digests.GeneralDigest#update(byte[],int,int)
-method:com.android.org.bouncycastle.crypto.digests.Sha1Digest#init()
-method:com.android.org.bouncycastle.crypto.digests.Sha1Digest#doFinal(byte[],int)
+method:com.android.org.bouncycastle.crypto.digests.SHA1Digest#SHA1Digest()
+method:com.android.org.bouncycastle.crypto.digests.SHA1Digest#doFinal(byte[],int)
 method:com.android.org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator#generateDerivedParameters(int)
 method:com.android.org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator#init(byte[],byte[])
 method:com.android.org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator#OpenSSLPBEParametersGenerator()
@@ -152,7 +152,7 @@
 type:com.android.org.bouncycastle.asn1.x9.X9ObjectIdentifiers
 type:com.android.org.bouncycastle.crypto.CipherParameters
 type:com.android.org.bouncycastle.crypto.digests.GeneralDigest
-type:com.android.org.bouncycastle.crypto.digests.Sha1Digest
+type:com.android.org.bouncycastle.crypto.digests.SHA1Digest
 type:com.android.org.bouncycastle.crypto.generators.OpenSSLPBEParametersGenerator
 type:com.android.org.bouncycastle.crypto.params.KeyParameter
 type:com.android.org.bouncycastle.crypto.PBEParametersGenerator