Merge "Fix KeyPairGenerator test for DH"
diff --git a/expectations/brokentests.txt b/expectations/brokentests.txt
index e1bac64..dfc65e7 100644
--- a/expectations/brokentests.txt
+++ b/expectations/brokentests.txt
@@ -18,11 +18,6 @@
   bug: 5534202
 },
 {
-  description: "libcore.java.security.KeyPairGeneratorTest long test is too long",
-  name: "libcore.java.security.KeyPairGeneratorTest#test_getInstance",
-  bug: 5513723
-},
-{
   description: "Support digest authentication in HttpURLConnection",
   name: "libcore.net.http.ParsedHeadersTest#testParseChallengesWithManyParameters",
   bug: 6156454
diff --git a/luni/src/test/java/libcore/java/security/KeyPairGeneratorTest.java b/luni/src/test/java/libcore/java/security/KeyPairGeneratorTest.java
index 93b58df..e8bd1aa 100644
--- a/luni/src/test/java/libcore/java/security/KeyPairGeneratorTest.java
+++ b/luni/src/test/java/libcore/java/security/KeyPairGeneratorTest.java
@@ -34,6 +34,7 @@
 import java.security.interfaces.DSAParams;
 import java.security.interfaces.DSAPrivateKey;
 import java.security.interfaces.DSAPublicKey;
+import java.security.spec.AlgorithmParameterSpec;
 import java.security.spec.DSAParameterSpec;
 import java.security.spec.PKCS8EncodedKeySpec;
 import java.security.spec.X509EncodedKeySpec;
@@ -43,6 +44,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import javax.crypto.spec.DHParameterSpec;
 
 import junit.framework.TestCase;
 
@@ -58,16 +60,29 @@
                     continue;
                 }
                 String algorithm = service.getAlgorithm();
+                AlgorithmParameterSpec params = null;
+
+                // TODO: detect if we're running in vogar and run the full test
+                if ("DH".equals(algorithm)) {
+                    params = getDHParams();
+                }
+
                 try {
                     // KeyPairGenerator.getInstance(String)
                     KeyPairGenerator kpg1 = KeyPairGenerator.getInstance(algorithm);
                     assertEquals(algorithm, kpg1.getAlgorithm());
+                    if (params != null) {
+                        kpg1.initialize(params);
+                    }
                     test_KeyPairGenerator(kpg1);
 
                     // KeyPairGenerator.getInstance(String, Provider)
                     KeyPairGenerator kpg2 = KeyPairGenerator.getInstance(algorithm, provider);
                     assertEquals(algorithm, kpg2.getAlgorithm());
                     assertEquals(provider, kpg2.getProvider());
+                    if (params != null) {
+                        kpg2.initialize(params);
+                    }
                     test_KeyPairGenerator(kpg2);
 
                     // KeyPairGenerator.getInstance(String, String)
@@ -75,6 +90,9 @@
                                                                         provider.getName());
                     assertEquals(algorithm, kpg3.getAlgorithm());
                     assertEquals(provider, kpg3.getProvider());
+                    if (params != null) {
+                        kpg3.initialize(params);
+                    }
                     test_KeyPairGenerator(kpg3);
                 } catch (Exception e) {
                     throw new Exception("Problem testing KeyPairGenerator." + algorithm, e);
@@ -202,6 +220,18 @@
         }
     }
 
+    /**
+     * DH parameters pre-generated so that the test doesn't take too long.
+     * These parameters were generated with:
+     *
+     * openssl gendh 512 | openssl dhparams -C
+     */
+    private static AlgorithmParameterSpec getDHParams() {
+        BigInteger p = new BigInteger("E7AB1768BD75CD24700960FFA32D3F1557344E587101237532CC641646ED7A7C104743377F6D46251698B665CE2A6CBAB6714C2569A7D2CA22C0CF03FA40AC93", 16);
+        BigInteger g = new BigInteger("02", 16);
+        return new DHParameterSpec(p, g, 512);
+    }
+
     private static final BigInteger DSA_P = new BigInteger(new byte[] {
         (byte) 0x00, (byte) 0x9e, (byte) 0x61, (byte) 0xc2, (byte) 0x89, (byte) 0xef, (byte) 0x77, (byte) 0xa9,
         (byte) 0x4e, (byte) 0x13, (byte) 0x67, (byte) 0x64, (byte) 0x1f, (byte) 0x09, (byte) 0x01, (byte) 0xfe,