CipherTest: add assertions about GCM parameters

Before we were not enforcing that the parameters returned were
GCMParameterSpec or not. This adds a check to make sure that GCM
implementations are doing the right thing.

Bug:  22319986
Change-Id: If5eb1f9624a286b8feb0c303643aca9caac0d807
diff --git a/luni/src/test/java/libcore/javax/crypto/CipherTest.java b/luni/src/test/java/libcore/javax/crypto/CipherTest.java
index 68545c9..13d54b4 100644
--- a/luni/src/test/java/libcore/javax/crypto/CipherTest.java
+++ b/luni/src/test/java/libcore/javax/crypto/CipherTest.java
@@ -1268,6 +1268,57 @@
                     c.doFinal(new byte[1]).length);
         }
 
+        if (isPBE(algorithm)) {
+            if (algorithm.endsWith("RC4")) {
+                assertNull(cipherID + " getIV()", c.getIV());
+            } else {
+                assertNotNull(cipherID + " getIV()", c.getIV());
+            }
+        } else if (encryptSpec instanceof IvParameterSpec) {
+            assertEquals(cipherID + " getIV()",
+                    Arrays.toString(((IvParameterSpec) encryptSpec).getIV()),
+                    Arrays.toString(c.getIV()));
+        } else if (encryptSpec instanceof GCMParameterSpec) {
+            assertNotNull(c.getIV());
+            assertEquals(cipherID + " getIV()",
+                    Arrays.toString(((GCMParameterSpec) encryptSpec).getIV()),
+                    Arrays.toString(c.getIV()));
+        } else {
+            try {
+                assertNull(cipherID + " getIV()", c.getIV());
+            } catch (NullPointerException e) {
+                // Bouncycastle apparently has a bug here with AESWRAP, et al.
+                if (!("BC".equals(providerName) && isOnlyWrappingAlgorithm(algorithm))) {
+                    throw e;
+                }
+            }
+        }
+
+        AlgorithmParameters encParams = c.getParameters();
+        if (encryptSpec == null) {
+            assertNull(cipherID + " getParameters()", encParams);
+        } else if (encryptSpec instanceof GCMParameterSpec) {
+            GCMParameterSpec gcmDecryptSpec = (GCMParameterSpec) encParams
+                    .getParameterSpec(GCMParameterSpec.class);
+            assertEquals(cipherID + " getIV()",
+                    Arrays.toString(((GCMParameterSpec) encryptSpec).getIV()),
+                    Arrays.toString(gcmDecryptSpec.getIV()));
+            assertEquals(cipherID + " getTLen()", ((GCMParameterSpec) encryptSpec).getTLen(),
+                    gcmDecryptSpec.getTLen());
+        } else if (encryptSpec instanceof IvParameterSpec) {
+            IvParameterSpec ivDecryptSpec = (IvParameterSpec) encParams
+                    .getParameterSpec(IvParameterSpec.class);
+            assertEquals(cipherID + " getIV()",
+                    Arrays.toString(((IvParameterSpec) encryptSpec).getIV()),
+                    Arrays.toString(ivDecryptSpec.getIV()));
+        } else if (encryptSpec instanceof PBEParameterSpec) {
+            // Bouncycastle seems to be undecided about whether it returns this
+            // or not
+            if (!"BC".equals(providerName)) {
+                assertNotNull(cipherID + " getParameters()", encParams);
+            }
+        }
+
         final AlgorithmParameterSpec decryptSpec = getDecryptAlgorithmParameterSpec(encryptSpec, c);
         int decryptMode = getDecryptMode(algorithm);
 
@@ -1305,18 +1356,27 @@
             }
         }
 
-        AlgorithmParameters params = c.getParameters();
+        AlgorithmParameters decParams = c.getParameters();
         if (decryptSpec == null) {
-            assertNull(cipherID + " getParameters()", params);
+            assertNull(cipherID + " getParameters()", decParams);
+        } else if (decryptSpec instanceof GCMParameterSpec) {
+            GCMParameterSpec gcmDecryptSpec = (GCMParameterSpec) decParams
+                    .getParameterSpec(GCMParameterSpec.class);
+            assertEquals(cipherID + " getIV()",
+                    Arrays.toString(((GCMParameterSpec) decryptSpec).getIV()),
+                    Arrays.toString(gcmDecryptSpec.getIV()));
+            assertEquals(cipherID + " getTLen()", ((GCMParameterSpec) decryptSpec).getTLen(),
+                    gcmDecryptSpec.getTLen());
         } else if (decryptSpec instanceof IvParameterSpec) {
-            IvParameterSpec ivDecryptSpec = (IvParameterSpec) params.getParameterSpec(IvParameterSpec.class);
+            IvParameterSpec ivDecryptSpec = (IvParameterSpec) decParams
+                    .getParameterSpec(IvParameterSpec.class);
             assertEquals(cipherID + " getIV()",
                     Arrays.toString(((IvParameterSpec) decryptSpec).getIV()),
                     Arrays.toString(ivDecryptSpec.getIV()));
         } else if (decryptSpec instanceof PBEParameterSpec) {
-            // Bouncycastle seems to be schizophrenic about whther it returns this or not
+            // Bouncycastle seems to be undecided about whether it returns this or not
             if (!"BC".equals(providerName)) {
-                assertNotNull(cipherID + " getParameters()", params);
+                assertNotNull(cipherID + " getParameters()", decParams);
             }
         }