OSDN Git Service

Switch from getSpi to getCurrentSpi.
authorAlex Klyubin <klyubin@google.com>
Mon, 18 May 2015 19:59:43 +0000 (12:59 -0700)
committerAlex Klyubin <klyubin@google.com>
Mon, 18 May 2015 19:59:43 +0000 (12:59 -0700)
Crypto primitives' getSpi has a side-effect which modifies the state
of the primitive: it selects an SPI implementation if it hasn't been
selected yet (e.g., Cipher.getInstance("AES") doesn't select an SPI
implementation until Cipher.init). The new method getCurrentSpi has
no side-effects: it simply returns null if no SPI implementation is
selected. The switch to getCurrentSpi lets us avoid side-effects and
throw a more pertinent exception when no SPI is yet selected.

(cherry-picked from bdc1382ac575a06c98cab69117700e081c90c595)

Bug: 18088752
Change-Id: Ib369c7e988329315075aa4e18f720d86f3d96a93

keystore/java/android/security/keystore/AndroidKeyStoreProvider.java

index b20a122..71fdb69 100644 (file)
@@ -111,6 +111,7 @@ public class AndroidKeyStoreProvider extends Provider {
      *
      * @throws IllegalArgumentException if the provided primitive is not supported or is not backed
      *         by AndroidKeyStore provider.
+     * @throws IllegalStateException if the provided primitive is not initialized.
      */
     public static long getKeyStoreOperationHandle(Object cryptoPrimitive) {
         if (cryptoPrimitive == null) {
@@ -118,15 +119,17 @@ public class AndroidKeyStoreProvider extends Provider {
         }
         Object spi;
         if (cryptoPrimitive instanceof Mac) {
-            spi = ((Mac) cryptoPrimitive).getSpi();
+            spi = ((Mac) cryptoPrimitive).getCurrentSpi();
         } else if (cryptoPrimitive instanceof Cipher) {
-            spi = ((Cipher) cryptoPrimitive).getSpi();
+            spi = ((Cipher) cryptoPrimitive).getCurrentSpi();
         } else {
             throw new IllegalArgumentException("Unsupported crypto primitive: " + cryptoPrimitive);
         }
-        if (!(spi instanceof KeyStoreCryptoOperation)) {
+        if (spi == null) {
+            throw new IllegalStateException("Crypto primitive not initialized");
+        } else if (!(spi instanceof KeyStoreCryptoOperation)) {
             throw new IllegalArgumentException(
-                    "Crypto primitive not backed by AndroidKeyStore: " + cryptoPrimitive
+                    "Crypto primitive not backed by AndroidKeyStore provider: " + cryptoPrimitive
                     + ", spi: " + spi);
         }
         return ((KeyStoreCryptoOperation) spi).getOperationHandle();