summaryrefslogtreecommitdiffstats
path: root/keystore
diff options
context:
space:
mode:
Diffstat (limited to 'keystore')
-rw-r--r--keystore/java/android/security/KeyStore.java70
-rwxr-xr-xkeystore/tests/src/android/security/KeyStoreTest.java67
2 files changed, 76 insertions, 61 deletions
diff --git a/keystore/java/android/security/KeyStore.java b/keystore/java/android/security/KeyStore.java
index 7183688..2a48834 100644
--- a/keystore/java/android/security/KeyStore.java
+++ b/keystore/java/android/security/KeyStore.java
@@ -32,16 +32,21 @@ import java.util.ArrayList;
* preclude the use of hardware crypto.
*/
public class KeyStore {
- public static final int NO_ERROR = 1;
- public static final int LOCKED = 2;
- public static final int UNINITIALIZED = 3;
- public static final int SYSTEM_ERROR = 4;
- public static final int PROTOCOL_ERROR = 5;
- public static final int PERMISSION_DENIED = 6;
- public static final int KEY_NOT_FOUND = 7;
- public static final int VALUE_CORRUPTED = 8;
- public static final int UNDEFINED_ACTION = 9;
- public static final int WRONG_PASSWORD = 10;
+
+ // ResponseCodes
+ private static final int NO_ERROR = 1;
+ private static final int LOCKED = 2;
+ private static final int UNINITIALIZED = 3;
+ private static final int SYSTEM_ERROR = 4;
+ private static final int PROTOCOL_ERROR = 5;
+ private static final int PERMISSION_DENIED = 6;
+ private static final int KEY_NOT_FOUND = 7;
+ private static final int VALUE_CORRUPTED = 8;
+ private static final int UNDEFINED_ACTION = 9;
+ private static final int WRONG_PASSWORD = 10;
+
+ // States
+ public enum State { UNLOCKED, LOCKED, UNINITIALIZED };
private static final LocalSocketAddress sAddress = new LocalSocketAddress(
"keystore", LocalSocketAddress.Namespace.RESERVED);
@@ -54,31 +59,35 @@ public class KeyStore {
return new KeyStore();
}
- public int test() {
+ public State state() {
execute('t');
- return mError;
+ switch (mError) {
+ case NO_ERROR: return State.UNLOCKED;
+ case LOCKED: return State.LOCKED;
+ case UNINITIALIZED: return State.UNINITIALIZED;
+ default: throw new AssertionError(mError);
+ }
}
- public byte[] get(byte[] key) {
+ private byte[] get(byte[] key) {
ArrayList<byte[]> values = execute('g', key);
return (values == null || values.isEmpty()) ? null : values.get(0);
}
- public String get(String key) {
- byte[] value = get(getBytes(key));
- return (value == null) ? null : toString(value);
+ public byte[] get(String key) {
+ return get(getBytes(key));
}
- public boolean put(byte[] key, byte[] value) {
+ private boolean put(byte[] key, byte[] value) {
execute('i', key, value);
return mError == NO_ERROR;
}
- public boolean put(String key, String value) {
- return put(getBytes(key), getBytes(value));
+ public boolean put(String key, byte[] value) {
+ return put(getBytes(key), value);
}
- public boolean delete(byte[] key) {
+ private boolean delete(byte[] key) {
execute('d', key);
return mError == NO_ERROR;
}
@@ -87,7 +96,7 @@ public class KeyStore {
return delete(getBytes(key));
}
- public boolean contains(byte[] key) {
+ private boolean contains(byte[] key) {
execute('e', key);
return mError == NO_ERROR;
}
@@ -118,19 +127,11 @@ public class KeyStore {
return mError == NO_ERROR;
}
- public boolean password(byte[] oldPassword, byte[] newPassword) {
- execute('p', oldPassword, newPassword);
+ private boolean password(byte[] password) {
+ execute('p', password);
return mError == NO_ERROR;
}
- public boolean password(String oldPassword, String newPassword) {
- return password(getBytes(oldPassword), getBytes(newPassword));
- }
-
- public boolean password(byte[] password) {
- return password(password, password);
- }
-
public boolean password(String password) {
return password(getBytes(password));
}
@@ -140,7 +141,7 @@ public class KeyStore {
return mError == NO_ERROR;
}
- public boolean unlock(byte[] password) {
+ private boolean unlock(byte[] password) {
execute('u', password);
return mError == NO_ERROR;
}
@@ -149,6 +150,11 @@ public class KeyStore {
return unlock(getBytes(password));
}
+ public boolean isEmpty() {
+ execute('z');
+ return mError == KEY_NOT_FOUND;
+ }
+
public int getLastError() {
return mError;
}
diff --git a/keystore/tests/src/android/security/KeyStoreTest.java b/keystore/tests/src/android/security/KeyStoreTest.java
index 6630a4f..4582aa0 100755
--- a/keystore/tests/src/android/security/KeyStoreTest.java
+++ b/keystore/tests/src/android/security/KeyStoreTest.java
@@ -20,6 +20,9 @@ import android.app.Activity;
import android.security.KeyStore;
import android.test.ActivityUnitTestCase;
import android.test.suitebuilder.annotation.MediumTest;
+import java.nio.charset.Charsets;
+import java.util.Arrays;
+import java.util.HashSet;
/**
* Junit / Instrumentation test case for KeyStore class
@@ -31,16 +34,15 @@ import android.test.suitebuilder.annotation.MediumTest;
@MediumTest
public class KeyStoreTest extends ActivityUnitTestCase<Activity> {
private static final String TEST_PASSWD = "12345678";
- private static final String TEST_EMPTY_PASSWD = "";
- private static final String TEST_SHORT_PASSWD = "short";
private static final String TEST_PASSWD2 = "87654321";
private static final String TEST_KEYNAME = "testkey";
private static final String TEST_KEYNAME1 = "testkey1";
private static final String TEST_KEYNAME2 = "testkey2";
- private static final String TEST_KEYVALUE = "test value";
+ private static final byte[] TEST_KEYVALUE = "test value".getBytes(Charsets.UTF_8);
// "Hello, World" in Chinese
- private static final String TEST_I18N = "\u4F60\u597D, \u4E16\u754C";
+ private static final String TEST_I18N_KEY = "\u4F60\u597D, \u4E16\u754C";
+ private static final byte[] TEST_I18N_VALUE = TEST_I18N_KEY.getBytes(Charsets.UTF_8);
private KeyStore mKeyStore = null;
@@ -51,8 +53,10 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> {
@Override
protected void setUp() throws Exception {
mKeyStore = KeyStore.getInstance();
- if (mKeyStore.test() != KeyStore.UNINITIALIZED) mKeyStore.reset();
- assertEquals(KeyStore.UNINITIALIZED, mKeyStore.test());
+ if (mKeyStore.state() != KeyStore.State.UNINITIALIZED) {
+ mKeyStore.reset();
+ }
+ assertEquals(KeyStore.State.UNINITIALIZED, mKeyStore.state());
super.setUp();
}
@@ -62,21 +66,13 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> {
super.tearDown();
}
- public void testTest() throws Exception {
- assertEquals(KeyStore.UNINITIALIZED, mKeyStore.test());
+ public void teststate() throws Exception {
+ assertEquals(KeyStore.State.UNINITIALIZED, mKeyStore.state());
}
public void testPassword() throws Exception {
- //assertFalse(mKeyStore.password(TEST_EMPTY_PASSWD));
- //assertFalse(mKeyStore.password(TEST_SHORT_PASSWD));
-
assertTrue(mKeyStore.password(TEST_PASSWD));
- assertEquals(KeyStore.NO_ERROR, mKeyStore.test());
-
- assertFalse(mKeyStore.password(TEST_PASSWD2, TEST_PASSWD2));
- //assertFalse(mKeyStore.password(TEST_PASSWD, TEST_SHORT_PASSWD));
-
- assertTrue(mKeyStore.password(TEST_PASSWD, TEST_PASSWD2));
+ assertEquals(KeyStore.State.UNLOCKED, mKeyStore.state());
}
public void testPut() throws Exception {
@@ -87,11 +83,11 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> {
}
public void testI18n() throws Exception {
- assertFalse(mKeyStore.put(TEST_I18N, TEST_I18N));
- assertFalse(mKeyStore.contains(TEST_I18N));
- mKeyStore.password(TEST_I18N);
- assertTrue(mKeyStore.put(TEST_I18N, TEST_I18N));
- assertTrue(mKeyStore.contains(TEST_I18N));
+ assertFalse(mKeyStore.put(TEST_I18N_KEY, TEST_I18N_VALUE));
+ assertFalse(mKeyStore.contains(TEST_I18N_KEY));
+ mKeyStore.password(TEST_I18N_KEY);
+ assertTrue(mKeyStore.put(TEST_I18N_KEY, TEST_I18N_VALUE));
+ assertTrue(mKeyStore.contains(TEST_I18N_KEY));
}
public void testDelete() throws Exception {
@@ -114,33 +110,46 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> {
}
public void testSaw() throws Exception {
- String[] results = mKeyStore.saw(TEST_KEYNAME);
- assertEquals(0, results.length);
+ String[] emptyResult = mKeyStore.saw(TEST_KEYNAME);
+ assertNotNull(emptyResult);
+ assertEquals(0, emptyResult.length);
mKeyStore.password(TEST_PASSWD);
mKeyStore.put(TEST_KEYNAME1, TEST_KEYVALUE);
mKeyStore.put(TEST_KEYNAME2, TEST_KEYVALUE);
- results = mKeyStore.saw(TEST_KEYNAME);
- assertEquals(2, results.length);
+ String[] results = mKeyStore.saw(TEST_KEYNAME);
+ assertEquals(new HashSet(Arrays.asList(TEST_KEYNAME1.substring(TEST_KEYNAME.length()),
+ TEST_KEYNAME2.substring(TEST_KEYNAME.length()))),
+ new HashSet(Arrays.asList(results)));
}
public void testLock() throws Exception {
assertFalse(mKeyStore.lock());
mKeyStore.password(TEST_PASSWD);
- assertEquals(KeyStore.NO_ERROR, mKeyStore.test());
+ assertEquals(KeyStore.State.UNLOCKED, mKeyStore.state());
assertTrue(mKeyStore.lock());
- assertEquals(KeyStore.LOCKED, mKeyStore.test());
+ assertEquals(KeyStore.State.LOCKED, mKeyStore.state());
}
public void testUnlock() throws Exception {
mKeyStore.password(TEST_PASSWD);
- assertEquals(KeyStore.NO_ERROR, mKeyStore.test());
+ assertEquals(KeyStore.State.UNLOCKED, mKeyStore.state());
mKeyStore.lock();
assertFalse(mKeyStore.unlock(TEST_PASSWD2));
assertTrue(mKeyStore.unlock(TEST_PASSWD));
}
+
+ public void testIsEmpty() throws Exception {
+ assertTrue(mKeyStore.isEmpty());
+ mKeyStore.password(TEST_PASSWD);
+ assertTrue(mKeyStore.isEmpty());
+ mKeyStore.put(TEST_KEYNAME, TEST_KEYVALUE);
+ assertFalse(mKeyStore.isEmpty());
+ mKeyStore.reset();
+ assertTrue(mKeyStore.isEmpty());
+ }
}