Apps on SD card.
Added support for retrieving and generating keys as Hex Strings.
diff --git a/keystore/java/android/security/SystemKeyStore.java b/keystore/java/android/security/SystemKeyStore.java
index 452125a4..61a4293 100644
--- a/keystore/java/android/security/SystemKeyStore.java
+++ b/keystore/java/android/security/SystemKeyStore.java
@@ -35,6 +35,7 @@
 public class SystemKeyStore {
 
     private static final String SYSTEM_KEYSTORE_DIRECTORY = "misc/systemkeys";
+    private static final String KEY_FILE_EXTENSION = ".sks";
     private static SystemKeyStore mInstance = new SystemKeyStore();
 
     private SystemKeyStore() { }
@@ -43,6 +44,28 @@
         return mInstance;
     }
 
+    public static String toHexString(byte[] keyData) {
+        if (keyData == null) {
+            return null;
+        }
+        int keyLen = keyData.length;
+        int expectedStringLen = keyData.length * 2;
+        StringBuilder sb = new StringBuilder(expectedStringLen);
+        for (int i = 0; i < keyData.length; i++) {
+            String hexStr = Integer.toString(keyData[i] & 0x00FF, 16);
+            if (hexStr.length() == 1) {
+                hexStr = "0" + hexStr;
+            }
+            sb.append(hexStr);
+        }
+        return sb.toString();
+    }
+
+    public String generateNewKeyHexString(int numBits, String algName, String keyName)
+            throws NoSuchAlgorithmException {
+        return toHexString(generateNewKey(numBits, algName, keyName));
+    }
+
     public byte[] generateNewKey(int numBits, String algName, String keyName)
             throws NoSuchAlgorithmException {
 
@@ -78,10 +101,14 @@
     private File getKeyFile(String keyName) {
         File sysKeystoreDir = new File(Environment.getDataDirectory(),
                 SYSTEM_KEYSTORE_DIRECTORY);
-        File keyFile = new File(sysKeystoreDir, keyName);
+        File keyFile = new File(sysKeystoreDir, keyName + KEY_FILE_EXTENSION);
         return keyFile;
     }
 
+    public String retrieveKeyHexString(String keyName) {
+        return toHexString(retrieveKey(keyName));
+    }
+
     public byte[] retrieveKey(String keyName) {
 
         File keyFile = getKeyFile(keyName);
diff --git a/keystore/tests/src/android/security/SystemKeyStoreTest.java b/keystore/tests/src/android/security/SystemKeyStoreTest.java
index a85f889..bbeceeb7 100644
--- a/keystore/tests/src/android/security/SystemKeyStoreTest.java
+++ b/keystore/tests/src/android/security/SystemKeyStoreTest.java
@@ -32,6 +32,7 @@
 public class SystemKeyStoreTest extends ActivityUnitTestCase<Activity> {
 
     private static final String keyName = "TestKey";
+    private static final String keyName2 = "TestKey2";
     private SystemKeyStore mSysKeyStore = null;
 
     public SystemKeyStoreTest() {
@@ -43,6 +44,7 @@
         mSysKeyStore = SystemKeyStore.getInstance();
         try {
             mSysKeyStore.deleteKey(keyName);
+            mSysKeyStore.deleteKey(keyName2);
         } catch (Exception e) { }
         super.setUp();
     }
@@ -51,6 +53,7 @@
     protected void tearDown() throws Exception {
         try {
             mSysKeyStore.deleteKey(keyName);
+            mSysKeyStore.deleteKey(keyName2);
         } catch (Exception e) { }
         super.tearDown();
     }
@@ -67,6 +70,14 @@
             mSysKeyStore.deleteKey(keyName);
             byte[] nullKey = mSysKeyStore.retrieveKey(keyName);
             assertNull(nullKey);
+
+            String newKeyStr = mSysKeyStore.generateNewKeyHexString(128, "AES", keyName2);
+            assertNotNull(newKeyStr);
+            String recKeyStr = mSysKeyStore.retrieveKeyHexString(keyName2);
+            assertEquals(newKeyStr, recKeyStr);
+            mSysKeyStore.deleteKey(keyName2);
+            String nullKey2 = mSysKeyStore.retrieveKeyHexString(keyName);
+            assertNull(nullKey2);
         } catch (Exception e) {
             fail();
         }