KeyStore.java revision 5f1d965f7d7e1df50981ffed8faa11fbcc17ca22
144039172627d1c15737ea73836ad375559d76211Chia-chi Yeh/*
244039172627d1c15737ea73836ad375559d76211Chia-chi Yeh * Copyright (C) 2009 The Android Open Source Project
344039172627d1c15737ea73836ad375559d76211Chia-chi Yeh *
444039172627d1c15737ea73836ad375559d76211Chia-chi Yeh * Licensed under the Apache License, Version 2.0 (the "License");
544039172627d1c15737ea73836ad375559d76211Chia-chi Yeh * you may not use this file except in compliance with the License.
644039172627d1c15737ea73836ad375559d76211Chia-chi Yeh * You may obtain a copy of the License at
744039172627d1c15737ea73836ad375559d76211Chia-chi Yeh *
844039172627d1c15737ea73836ad375559d76211Chia-chi Yeh *      http://www.apache.org/licenses/LICENSE-2.0
944039172627d1c15737ea73836ad375559d76211Chia-chi Yeh *
1044039172627d1c15737ea73836ad375559d76211Chia-chi Yeh * Unless required by applicable law or agreed to in writing, software
1144039172627d1c15737ea73836ad375559d76211Chia-chi Yeh * distributed under the License is distributed on an "AS IS" BASIS,
1244039172627d1c15737ea73836ad375559d76211Chia-chi Yeh * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1344039172627d1c15737ea73836ad375559d76211Chia-chi Yeh * See the License for the specific language governing permissions and
1444039172627d1c15737ea73836ad375559d76211Chia-chi Yeh * limitations under the License.
1544039172627d1c15737ea73836ad375559d76211Chia-chi Yeh */
1644039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
1744039172627d1c15737ea73836ad375559d76211Chia-chi Yehpackage android.security;
1844039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
196b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Rootimport android.os.RemoteException;
206b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Rootimport android.os.ServiceManager;
216b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Rootimport android.util.Log;
2244039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
2344039172627d1c15737ea73836ad375559d76211Chia-chi Yeh/**
2446703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom * @hide This should not be made public in its present form because it
2546703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom * assumes that private and secret key bytes are available and would
2646703b099516c383a6882815bcf9cd4df0ec538dBrian Carlstrom * preclude the use of hardware crypto.
2744039172627d1c15737ea73836ad375559d76211Chia-chi Yeh */
2844039172627d1c15737ea73836ad375559d76211Chia-chi Yehpublic class KeyStore {
296b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root    private static final String TAG = "KeyStore";
305cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom
315cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom    // ResponseCodes
327e4b1a488dd02c4bf6156379e36834e9e01c5b1bBrian Carlstrom    public static final int NO_ERROR = 1;
337e4b1a488dd02c4bf6156379e36834e9e01c5b1bBrian Carlstrom    public static final int LOCKED = 2;
347e4b1a488dd02c4bf6156379e36834e9e01c5b1bBrian Carlstrom    public static final int UNINITIALIZED = 3;
357e4b1a488dd02c4bf6156379e36834e9e01c5b1bBrian Carlstrom    public static final int SYSTEM_ERROR = 4;
367e4b1a488dd02c4bf6156379e36834e9e01c5b1bBrian Carlstrom    public static final int PROTOCOL_ERROR = 5;
377e4b1a488dd02c4bf6156379e36834e9e01c5b1bBrian Carlstrom    public static final int PERMISSION_DENIED = 6;
387e4b1a488dd02c4bf6156379e36834e9e01c5b1bBrian Carlstrom    public static final int KEY_NOT_FOUND = 7;
397e4b1a488dd02c4bf6156379e36834e9e01c5b1bBrian Carlstrom    public static final int VALUE_CORRUPTED = 8;
407e4b1a488dd02c4bf6156379e36834e9e01c5b1bBrian Carlstrom    public static final int UNDEFINED_ACTION = 9;
417e4b1a488dd02c4bf6156379e36834e9e01c5b1bBrian Carlstrom    public static final int WRONG_PASSWORD = 10;
425cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom
435cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom    // States
445cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom    public enum State { UNLOCKED, LOCKED, UNINITIALIZED };
4544039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
4644039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    private int mError = NO_ERROR;
4744039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
486b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root    private final IKeystoreService mBinder;
496b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root
506b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root    private KeyStore(IKeystoreService binder) {
516b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        mBinder = binder;
526b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root    }
5344039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
5444039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    public static KeyStore getInstance() {
556b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        IKeystoreService keystore = IKeystoreService.Stub.asInterface(ServiceManager
566b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root                .getService("android.security.keystore"));
576b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        return new KeyStore(keystore);
5844039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
5944039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
605cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom    public State state() {
616b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        final int ret;
626b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
636b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            ret = mBinder.test();
646b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
656b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
666b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            throw new AssertionError(e);
676b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
686b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root
696b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        switch (ret) {
705cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom            case NO_ERROR: return State.UNLOCKED;
715cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom            case LOCKED: return State.LOCKED;
725cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom            case UNINITIALIZED: return State.UNINITIALIZED;
735cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom            default: throw new AssertionError(mError);
745cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom        }
75b9594ce9ebb3f5f303a280f04312ae5754ce3560Kenny Root    }
76b9594ce9ebb3f5f303a280f04312ae5754ce3560Kenny Root
77b9594ce9ebb3f5f303a280f04312ae5754ce3560Kenny Root    public boolean isUnlocked() {
78b9594ce9ebb3f5f303a280f04312ae5754ce3560Kenny Root        return state() == State.UNLOCKED;
7944039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
8044039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
815cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom    public byte[] get(String key) {
826b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
836b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mBinder.get(key);
846b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
856b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
866b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return null;
876b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
8844039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
8944039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
9078ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean put(String key, byte[] value, int uid) {
916b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
9278ad849163a7b01073b46fbd7d818392720005d1Kenny Root            return mBinder.insert(key, value, uid) == NO_ERROR;
936b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
946b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
956b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
966b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
9744039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
9844039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
9978ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean put(String key, byte[] value) {
10078ad849163a7b01073b46fbd7d818392720005d1Kenny Root        return put(key, value, -1);
10178ad849163a7b01073b46fbd7d818392720005d1Kenny Root    }
10278ad849163a7b01073b46fbd7d818392720005d1Kenny Root
10378ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean delete(String key, int uid) {
1046b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
10578ad849163a7b01073b46fbd7d818392720005d1Kenny Root            return mBinder.del(key, uid) == NO_ERROR;
1066b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
1076b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
1086b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
1096b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
11044039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
11144039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
11278ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean delete(String key) {
11378ad849163a7b01073b46fbd7d818392720005d1Kenny Root        return delete(key, -1);
11478ad849163a7b01073b46fbd7d818392720005d1Kenny Root    }
11578ad849163a7b01073b46fbd7d818392720005d1Kenny Root
11678ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean contains(String key, int uid) {
1176b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
11878ad849163a7b01073b46fbd7d818392720005d1Kenny Root            return mBinder.exist(key, uid) == NO_ERROR;
1196b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
1206b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
1216b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
1226b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
12344039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
12444039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
12578ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean contains(String key) {
12678ad849163a7b01073b46fbd7d818392720005d1Kenny Root        return contains(key, -1);
12778ad849163a7b01073b46fbd7d818392720005d1Kenny Root    }
12878ad849163a7b01073b46fbd7d818392720005d1Kenny Root
12978ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public String[] saw(String prefix, int uid) {
1306b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
13178ad849163a7b01073b46fbd7d818392720005d1Kenny Root            return mBinder.saw(prefix, uid);
1326b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
1336b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
13444039172627d1c15737ea73836ad375559d76211Chia-chi Yeh            return null;
13544039172627d1c15737ea73836ad375559d76211Chia-chi Yeh        }
13644039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
13744039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
13878ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public String[] saw(String prefix) {
13978ad849163a7b01073b46fbd7d818392720005d1Kenny Root        return saw(prefix, -1);
14078ad849163a7b01073b46fbd7d818392720005d1Kenny Root    }
14178ad849163a7b01073b46fbd7d818392720005d1Kenny Root
14244039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    public boolean reset() {
1436b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
1446b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mBinder.reset() == NO_ERROR;
1456b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
1466b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
1476b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
1486b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
14944039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
15044039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
15144039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    public boolean password(String password) {
1526b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
1536b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mBinder.password(password) == NO_ERROR;
1546b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
1556b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
1566b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
1576b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
15844039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
15944039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
16044039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    public boolean lock() {
1616b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
1626b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mBinder.lock() == NO_ERROR;
1636b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
1646b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
1656b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
1666b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
16744039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
16844039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
16944039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    public boolean unlock(String password) {
1706b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
1716b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            mError = mBinder.unlock(password);
1726b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mError == NO_ERROR;
1736b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
1746b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
1756b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
1766b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
17744039172627d1c15737ea73836ad375559d76211Chia-chi Yeh    }
17844039172627d1c15737ea73836ad375559d76211Chia-chi Yeh
1795cfee3fabb3482c6a6df1c8b6f21e843cf214527Brian Carlstrom    public boolean isEmpty() {
1806b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
1816b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mBinder.zero() == KEY_NOT_FOUND;
1826b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
1836b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
1846b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
1856b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
1865423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    }
1875423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root
18878ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean generate(String key, int uid) {
1896b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
19078ad849163a7b01073b46fbd7d818392720005d1Kenny Root            return mBinder.generate(key, uid) == NO_ERROR;
1916b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
1926b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
1936b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
1946b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
1955423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    }
1965423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root
19778ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean generate(String key) {
19878ad849163a7b01073b46fbd7d818392720005d1Kenny Root        return generate(key, -1);
19978ad849163a7b01073b46fbd7d818392720005d1Kenny Root    }
20078ad849163a7b01073b46fbd7d818392720005d1Kenny Root
20178ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean importKey(String keyName, byte[] key, int uid) {
2026b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
20378ad849163a7b01073b46fbd7d818392720005d1Kenny Root            return mBinder.import_key(keyName, key, uid) == NO_ERROR;
2046b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
2056b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
2066b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
2076b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
2085423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    }
2095423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root
21078ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean importKey(String keyName, byte[] key) {
21178ad849163a7b01073b46fbd7d818392720005d1Kenny Root        return importKey(keyName, key, -1);
21278ad849163a7b01073b46fbd7d818392720005d1Kenny Root    }
21378ad849163a7b01073b46fbd7d818392720005d1Kenny Root
2145423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    public byte[] getPubkey(String key) {
2156b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
2166b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mBinder.get_pubkey(key);
2176b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
2186b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
2196b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return null;
2206b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
2215423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    }
2225423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root
22378ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean delKey(String key, int uid) {
2246b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
22578ad849163a7b01073b46fbd7d818392720005d1Kenny Root            return mBinder.del_key(key, uid) == NO_ERROR;
2266b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
2276b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
2286b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
2296b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
2305423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    }
2315423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root
23278ad849163a7b01073b46fbd7d818392720005d1Kenny Root    public boolean delKey(String key) {
23378ad849163a7b01073b46fbd7d818392720005d1Kenny Root        return delKey(key, -1);
23478ad849163a7b01073b46fbd7d818392720005d1Kenny Root    }
23578ad849163a7b01073b46fbd7d818392720005d1Kenny Root
2365423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    public byte[] sign(String key, byte[] data) {
2376b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
2386b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mBinder.sign(key, data);
2396b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
2406b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
2416b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return null;
2426b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
2435423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    }
2445423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root
2455423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    public boolean verify(String key, byte[] data, byte[] signature) {
2466b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
2476b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mBinder.verify(key, data, signature) == NO_ERROR;
2486b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
2496b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
2506b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
2516b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
2525423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    }
2535423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root
2545423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    public boolean grant(String key, int uid) {
2556b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
2566b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mBinder.grant(key, uid) == NO_ERROR;
2576b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
2586b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
2596b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
2606b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        }
2615423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    }
2625423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root
2635423e68d5dbe048ec6f042cce52a33f94184e9fbKenny Root    public boolean ungrant(String key, int uid) {
2646b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        try {
2656b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return mBinder.ungrant(key, uid) == NO_ERROR;
2666b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
2676b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
2686b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return false;
269473c712b19bad992ab4eafcd43175fdce77b913dKenny Root        }
270473c712b19bad992ab4eafcd43175fdce77b913dKenny Root    }
271473c712b19bad992ab4eafcd43175fdce77b913dKenny Root
272473c712b19bad992ab4eafcd43175fdce77b913dKenny Root    /**
273473c712b19bad992ab4eafcd43175fdce77b913dKenny Root     * Returns the last modification time of the key in milliseconds since the
274473c712b19bad992ab4eafcd43175fdce77b913dKenny Root     * epoch. Will return -1L if the key could not be found or other error.
275473c712b19bad992ab4eafcd43175fdce77b913dKenny Root     */
276473c712b19bad992ab4eafcd43175fdce77b913dKenny Root    public long getmtime(String key) {
2775b1f037829bff93877a6257db69f4e7723a27e20Brian Carlstrom        try {
278e66769ad5194cb4533d1087416a2e804ac384285Kenny Root            final long millis = mBinder.getmtime(key);
279e66769ad5194cb4533d1087416a2e804ac384285Kenny Root            if (millis == -1L) {
280e66769ad5194cb4533d1087416a2e804ac384285Kenny Root                return -1L;
281e66769ad5194cb4533d1087416a2e804ac384285Kenny Root            }
282e66769ad5194cb4533d1087416a2e804ac384285Kenny Root
283e66769ad5194cb4533d1087416a2e804ac384285Kenny Root            return millis * 1000L;
2846b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        } catch (RemoteException e) {
2856b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
2866b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root            return -1L;
2875b1f037829bff93877a6257db69f4e7723a27e20Brian Carlstrom        }
2885b1f037829bff93877a6257db69f4e7723a27e20Brian Carlstrom    }
2895b1f037829bff93877a6257db69f4e7723a27e20Brian Carlstrom
2905f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root    public boolean duplicate(String srcKey, int srcUid, String destKey, int destUid) {
291bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root        try {
2925f1d965f7d7e1df50981ffed8faa11fbcc17ca22Kenny Root            return mBinder.duplicate(srcKey, srcUid, destKey, destUid) == NO_ERROR;
293bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root        } catch (RemoteException e) {
294bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root            Log.w(TAG, "Cannot connect to keystore", e);
295bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root            return false;
296bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root        }
297bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root    }
298bd79419ef84ae31f3765721b50aa413fa462d1d1Kenny Root
2996b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root    public int getLastError() {
3006b77645aa9ac51ce33ea67adba226aaf1a6e8846Kenny Root        return mError;
30134c47c855815d731e6deb55748ff690b0ec7b53fNick Kralevich    }
30244039172627d1c15737ea73836ad375559d76211Chia-chi Yeh}
303