Merge "Change KeyStore to use Modified UTF-8 to match NativeCrypto"
This commit is contained in:
@ -22,8 +22,9 @@ import android.net.LocalSocket;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UTFDataFormatException;
|
||||||
import java.nio.charset.Charsets;
|
import java.nio.charset.Charsets;
|
||||||
|
import java.nio.charset.ModifiedUtf8;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -75,7 +76,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public byte[] get(String key) {
|
public byte[] get(String key) {
|
||||||
return get(getBytes(key));
|
return get(getKeyBytes(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean put(byte[] key, byte[] value) {
|
private boolean put(byte[] key, byte[] value) {
|
||||||
@ -84,7 +85,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean put(String key, byte[] value) {
|
public boolean put(String key, byte[] value) {
|
||||||
return put(getBytes(key), value);
|
return put(getKeyBytes(key), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean delete(byte[] key) {
|
private boolean delete(byte[] key) {
|
||||||
@ -93,7 +94,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean delete(String key) {
|
public boolean delete(String key) {
|
||||||
return delete(getBytes(key));
|
return delete(getKeyBytes(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean contains(byte[] key) {
|
private boolean contains(byte[] key) {
|
||||||
@ -102,7 +103,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean contains(String key) {
|
public boolean contains(String key) {
|
||||||
return contains(getBytes(key));
|
return contains(getKeyBytes(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
public byte[][] saw(byte[] prefix) {
|
public byte[][] saw(byte[] prefix) {
|
||||||
@ -111,13 +112,13 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public String[] saw(String prefix) {
|
public String[] saw(String prefix) {
|
||||||
byte[][] values = saw(getBytes(prefix));
|
byte[][] values = saw(getKeyBytes(prefix));
|
||||||
if (values == null) {
|
if (values == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
String[] strings = new String[values.length];
|
String[] strings = new String[values.length];
|
||||||
for (int i = 0; i < values.length; ++i) {
|
for (int i = 0; i < values.length; ++i) {
|
||||||
strings[i] = toString(values[i]);
|
strings[i] = toKeyString(values[i]);
|
||||||
}
|
}
|
||||||
return strings;
|
return strings;
|
||||||
}
|
}
|
||||||
@ -133,7 +134,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean password(String password) {
|
public boolean password(String password) {
|
||||||
return password(getBytes(password));
|
return password(getPasswordBytes(password));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean lock() {
|
public boolean lock() {
|
||||||
@ -147,7 +148,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean unlock(String password) {
|
public boolean unlock(String password) {
|
||||||
return unlock(getBytes(password));
|
return unlock(getPasswordBytes(password));
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isEmpty() {
|
public boolean isEmpty() {
|
||||||
@ -161,7 +162,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean generate(String key) {
|
public boolean generate(String key) {
|
||||||
return generate(getBytes(key));
|
return generate(getKeyBytes(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean importKey(byte[] keyName, byte[] key) {
|
private boolean importKey(byte[] keyName, byte[] key) {
|
||||||
@ -170,7 +171,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean importKey(String keyName, byte[] key) {
|
public boolean importKey(String keyName, byte[] key) {
|
||||||
return importKey(getBytes(keyName), key);
|
return importKey(getKeyBytes(keyName), key);
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] getPubkey(byte[] key) {
|
private byte[] getPubkey(byte[] key) {
|
||||||
@ -179,7 +180,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public byte[] getPubkey(String key) {
|
public byte[] getPubkey(String key) {
|
||||||
return getPubkey(getBytes(key));
|
return getPubkey(getKeyBytes(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean delKey(byte[] key) {
|
private boolean delKey(byte[] key) {
|
||||||
@ -188,7 +189,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean delKey(String key) {
|
public boolean delKey(String key) {
|
||||||
return delKey(getBytes(key));
|
return delKey(getKeyBytes(key));
|
||||||
}
|
}
|
||||||
|
|
||||||
private byte[] sign(byte[] keyName, byte[] data) {
|
private byte[] sign(byte[] keyName, byte[] data) {
|
||||||
@ -197,7 +198,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public byte[] sign(String key, byte[] data) {
|
public byte[] sign(String key, byte[] data) {
|
||||||
return sign(getBytes(key), data);
|
return sign(getKeyBytes(key), data);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean verify(byte[] keyName, byte[] data, byte[] signature) {
|
private boolean verify(byte[] keyName, byte[] data, byte[] signature) {
|
||||||
@ -206,7 +207,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean verify(String key, byte[] data, byte[] signature) {
|
public boolean verify(String key, byte[] data, byte[] signature) {
|
||||||
return verify(getBytes(key), data, signature);
|
return verify(getKeyBytes(key), data, signature);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean grant(byte[] key, byte[] uid) {
|
private boolean grant(byte[] key, byte[] uid) {
|
||||||
@ -215,7 +216,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean grant(String key, int uid) {
|
public boolean grant(String key, int uid) {
|
||||||
return grant(getBytes(key), Integer.toString(uid).getBytes());
|
return grant(getKeyBytes(key), getUidBytes(uid));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean ungrant(byte[] key, byte[] uid) {
|
private boolean ungrant(byte[] key, byte[] uid) {
|
||||||
@ -224,7 +225,7 @@ public class KeyStore {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean ungrant(String key, int uid) {
|
public boolean ungrant(String key, int uid) {
|
||||||
return ungrant(getBytes(key), Integer.toString(uid).getBytes());
|
return ungrant(getKeyBytes(key), getUidBytes(uid));
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getLastError() {
|
public int getLastError() {
|
||||||
@ -291,11 +292,34 @@ public class KeyStore {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static byte[] getBytes(String string) {
|
/**
|
||||||
return string.getBytes(Charsets.UTF_8);
|
* ModifiedUtf8 is used for key encoding to match the
|
||||||
|
* implementation of NativeCrypto.ENGINE_load_private_key.
|
||||||
|
*/
|
||||||
|
private static byte[] getKeyBytes(String string) {
|
||||||
|
try {
|
||||||
|
int utfCount = (int) ModifiedUtf8.countBytes(string, false);
|
||||||
|
byte[] result = new byte[utfCount];
|
||||||
|
ModifiedUtf8.encode(result, 0, string);
|
||||||
|
return result;
|
||||||
|
} catch (UTFDataFormatException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String toString(byte[] bytes) {
|
private static String toKeyString(byte[] bytes) {
|
||||||
return new String(bytes, Charsets.UTF_8);
|
try {
|
||||||
|
return ModifiedUtf8.decode(bytes, new char[bytes.length], 0, bytes.length);
|
||||||
|
} catch (UTFDataFormatException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] getPasswordBytes(String password) {
|
||||||
|
return password.getBytes(Charsets.UTF_8);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static byte[] getUidBytes(int uid) {
|
||||||
|
return Integer.toString(uid).getBytes(Charsets.UTF_8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ public class KeyStoreTest extends ActivityUnitTestCase<Activity> {
|
|||||||
private static final String TEST_PASSWD2 = "87654321";
|
private static final String TEST_PASSWD2 = "87654321";
|
||||||
private static final String TEST_KEYNAME = "test-key";
|
private static final String TEST_KEYNAME = "test-key";
|
||||||
private static final String TEST_KEYNAME1 = "test-key.1";
|
private static final String TEST_KEYNAME1 = "test-key.1";
|
||||||
private static final String TEST_KEYNAME2 = "test-key.2";
|
private static final String TEST_KEYNAME2 = "test-key\02";
|
||||||
private static final byte[] TEST_KEYVALUE = "test value".getBytes(Charsets.UTF_8);
|
private static final byte[] TEST_KEYVALUE = "test value".getBytes(Charsets.UTF_8);
|
||||||
|
|
||||||
// "Hello, World" in Chinese
|
// "Hello, World" in Chinese
|
||||||
|
Reference in New Issue
Block a user