keystore.cpp revision 72593ee807e89239d98ae08d32c733ecc08203ba
1a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root/*
2a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * Copyright (C) 2009 The Android Open Source Project
3a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root *
4a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * Licensed under the Apache License, Version 2.0 (the "License");
5a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * you may not use this file except in compliance with the License.
6a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * You may obtain a copy of the License at
7a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root *
8a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root *      http://www.apache.org/licenses/LICENSE-2.0
9a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root *
10a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * Unless required by applicable law or agreed to in writing, software
11a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * distributed under the License is distributed on an "AS IS" BASIS,
12a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * See the License for the specific language governing permissions and
14a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * limitations under the License.
15a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root */
16a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root//#define LOG_NDEBUG 0
1807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root#define LOG_TAG "keystore"
1907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
20a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <stdio.h>
21a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <stdint.h>
22a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <string.h>
23aaf9802da6cea710e0777abb852724e1825cad63Elliott Hughes#include <strings.h>
24a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <unistd.h>
25a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <signal.h>
26a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <errno.h>
27a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <dirent.h>
28655b958eb2180c7c06889f83f606d23421bf038cKenny Root#include <errno.h>
29a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <fcntl.h>
30a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <limits.h>
31822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root#include <assert.h>
32a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <sys/types.h>
33a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <sys/socket.h>
34a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <sys/stat.h>
35a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <sys/time.h>
36a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <arpa/inet.h>
37a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
38a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <openssl/aes.h>
39822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root#include <openssl/bio.h>
40a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <openssl/evp.h>
41a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <openssl/md5.h>
42822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root#include <openssl/pem.h>
43a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
4480843db63ed6b61c953a1243801117a15c9e8c38Shawn Willden#include <hardware/keymaster0.h>
4570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
4667d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker#include <keymaster/soft_keymaster_device.h>
470400675b20e36b976ec13b63e290e6d5d19bf654Shawn Willden#include <keymaster/soft_keymaster_logger.h>
480400675b20e36b976ec13b63e290e6d5d19bf654Shawn Willden#include <keymaster/softkeymaster.h>
4917208e0de5a42722901d803118745cca25fd10c1Kenny Root
5026cfc08add3966eca5892e3387cf5ed6dc3068fbKenny Root#include <UniquePtr.h>
51655b958eb2180c7c06889f83f606d23421bf038cKenny Root#include <utils/String8.h>
52655b958eb2180c7c06889f83f606d23421bf038cKenny Root#include <utils/Vector.h>
5370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
5407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root#include <keystore/IKeystoreService.h>
5507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root#include <binder/IPCThreadState.h>
5607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root#include <binder/IServiceManager.h>
5707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
58a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <cutils/log.h>
59a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <cutils/sockets.h>
60a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <private/android_filesystem_config.h>
61a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
6207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root#include <keystore/keystore.h>
63a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
64eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn#include <selinux/android.h>
65eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
66d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker#include "auth_token_table.h"
6796427baf0094d50047049d329b0779c3c910402cKenny Root#include "defaults.h"
6840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker#include "operation.h"
6996427baf0094d50047049d329b0779c3c910402cKenny Root
70a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root/* KeyStore is a secured storage for key-value pairs. In this implementation,
71a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * each file stores one key-value pair. Keys are encoded in file names, and
72a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * values are encrypted with checksums. The encryption key is protected by a
73a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * user-defined password. To keep things simple, buffers are always larger than
74a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * the maximum space we needed, so boundary checks on buffers are omitted. */
75a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
76a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#define KEY_SIZE        ((NAME_MAX - 15) / 2)
77a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#define VALUE_SIZE      32768
78a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#define PASSWORD_SIZE   VALUE_SIZE
79a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
80822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
8196427baf0094d50047049d329b0779c3c910402cKenny Rootstruct BIGNUM_Delete {
8296427baf0094d50047049d329b0779c3c910402cKenny Root    void operator()(BIGNUM* p) const {
8396427baf0094d50047049d329b0779c3c910402cKenny Root        BN_free(p);
8496427baf0094d50047049d329b0779c3c910402cKenny Root    }
8596427baf0094d50047049d329b0779c3c910402cKenny Root};
8696427baf0094d50047049d329b0779c3c910402cKenny Roottypedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
8796427baf0094d50047049d329b0779c3c910402cKenny Root
88822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Rootstruct BIO_Delete {
89822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    void operator()(BIO* p) const {
90822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        BIO_free(p);
91822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
92822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root};
93822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Roottypedef UniquePtr<BIO, BIO_Delete> Unique_BIO;
94822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
95822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Rootstruct EVP_PKEY_Delete {
96822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    void operator()(EVP_PKEY* p) const {
97822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        EVP_PKEY_free(p);
98822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
99822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root};
100822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Roottypedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
101822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
102822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Rootstruct PKCS8_PRIV_KEY_INFO_Delete {
103822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    void operator()(PKCS8_PRIV_KEY_INFO* p) const {
104822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        PKCS8_PRIV_KEY_INFO_free(p);
105822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
106822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root};
107822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Roottypedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
108822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
10980843db63ed6b61c953a1243801117a15c9e8c38Shawn Willdenstatic int keymaster_device_initialize(keymaster0_device_t** dev) {
11070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    int rc;
11170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
11270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    const hw_module_t* mod;
11370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    rc = hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod);
11470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    if (rc) {
11570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        ALOGE("could not find any keystore module");
11670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        goto out;
11770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
11870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
11980843db63ed6b61c953a1243801117a15c9e8c38Shawn Willden    rc = keymaster0_open(mod, dev);
12070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    if (rc) {
12170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        ALOGE("could not open keymaster device in %s (%s)",
12270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root            KEYSTORE_HARDWARE_MODULE_ID, strerror(-rc));
12370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        goto out;
12470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
12570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
12670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    return 0;
12770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
12870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Rootout:
12970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    *dev = NULL;
13070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    return rc;
13170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root}
13270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1330400675b20e36b976ec13b63e290e6d5d19bf654Shawn Willden// softkeymaster_logger appears not to be used in keystore, but it installs itself as the
1340400675b20e36b976ec13b63e290e6d5d19bf654Shawn Willden// logger used by SoftKeymasterDevice.
1350400675b20e36b976ec13b63e290e6d5d19bf654Shawn Willdenstatic keymaster::SoftKeymasterLogger softkeymaster_logger;
1360400675b20e36b976ec13b63e290e6d5d19bf654Shawn Willden
13767d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubakerstatic int fallback_keymaster_device_initialize(keymaster1_device_t** dev) {
13867d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster::SoftKeymasterDevice* softkeymaster =
13967d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker            new keymaster::SoftKeymasterDevice();
1409fd05a9a6299e9688c8fcf755516ea254868d187Shawn Willden    *dev = softkeymaster->keymaster_device();
1419fd05a9a6299e9688c8fcf755516ea254868d187Shawn Willden    // softkeymaster will be freed by *dev->close_device; don't delete here.
142fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker    return 0;
143fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker}
144fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker
14580843db63ed6b61c953a1243801117a15c9e8c38Shawn Willdenstatic void keymaster_device_release(keymaster0_device_t* dev) {
14680843db63ed6b61c953a1243801117a15c9e8c38Shawn Willden    keymaster0_close(dev);
14770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root}
14870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
14907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root/***************
15007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root * PERMISSIONS *
15107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root ***************/
15207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
15307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root/* Here are the permissions, actions, users, and the main function. */
15407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Roottypedef enum {
1554e865753346fc6a075966972a7a98051818859dbRobin Lee    P_TEST          = 1 << 0,
1564e865753346fc6a075966972a7a98051818859dbRobin Lee    P_GET           = 1 << 1,
1574e865753346fc6a075966972a7a98051818859dbRobin Lee    P_INSERT        = 1 << 2,
1584e865753346fc6a075966972a7a98051818859dbRobin Lee    P_DELETE        = 1 << 3,
1594e865753346fc6a075966972a7a98051818859dbRobin Lee    P_EXIST         = 1 << 4,
1604e865753346fc6a075966972a7a98051818859dbRobin Lee    P_SAW           = 1 << 5,
1614e865753346fc6a075966972a7a98051818859dbRobin Lee    P_RESET         = 1 << 6,
1624e865753346fc6a075966972a7a98051818859dbRobin Lee    P_PASSWORD      = 1 << 7,
1634e865753346fc6a075966972a7a98051818859dbRobin Lee    P_LOCK          = 1 << 8,
1644e865753346fc6a075966972a7a98051818859dbRobin Lee    P_UNLOCK        = 1 << 9,
1654e865753346fc6a075966972a7a98051818859dbRobin Lee    P_ZERO          = 1 << 10,
1664e865753346fc6a075966972a7a98051818859dbRobin Lee    P_SIGN          = 1 << 11,
1674e865753346fc6a075966972a7a98051818859dbRobin Lee    P_VERIFY        = 1 << 12,
1684e865753346fc6a075966972a7a98051818859dbRobin Lee    P_GRANT         = 1 << 13,
1694e865753346fc6a075966972a7a98051818859dbRobin Lee    P_DUPLICATE     = 1 << 14,
1704e865753346fc6a075966972a7a98051818859dbRobin Lee    P_CLEAR_UID     = 1 << 15,
1714e865753346fc6a075966972a7a98051818859dbRobin Lee    P_RESET_UID     = 1 << 16,
1724e865753346fc6a075966972a7a98051818859dbRobin Lee    P_SYNC_UID      = 1 << 17,
1734e865753346fc6a075966972a7a98051818859dbRobin Lee    P_PASSWORD_UID  = 1 << 18,
174d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker    P_ADD_AUTH      = 1 << 19,
17507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root} perm_t;
17607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
17707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic struct user_euid {
17807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    uid_t uid;
17907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    uid_t euid;
18007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root} user_euids[] = {
18107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_VPN, AID_SYSTEM},
18207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_WIFI, AID_SYSTEM},
18307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_ROOT, AID_SYSTEM},
18407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root};
18507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
186eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn/* perm_labels associcated with keystore_key SELinux class verbs. */
187eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahnconst char *perm_labels[] = {
188eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "test",
189eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "get",
190eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "insert",
191eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "delete",
192eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "exist",
193eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "saw",
194eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "reset",
195eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "password",
196eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "lock",
197eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "unlock",
198eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "zero",
199eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "sign",
200eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "verify",
201eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "grant",
202eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "duplicate",
2034e865753346fc6a075966972a7a98051818859dbRobin Lee    "clear_uid",
2044e865753346fc6a075966972a7a98051818859dbRobin Lee    "reset_uid",
2054e865753346fc6a075966972a7a98051818859dbRobin Lee    "sync_uid",
2064e865753346fc6a075966972a7a98051818859dbRobin Lee    "password_uid",
207d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker    "add_auth",
208eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn};
209eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
21007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic struct user_perm {
21107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    uid_t uid;
21207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    perm_t perms;
21307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root} user_perms[] = {
21407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_SYSTEM, static_cast<perm_t>((uint32_t)(~0)) },
21507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_VPN,    static_cast<perm_t>(P_GET | P_SIGN | P_VERIFY) },
21607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_WIFI,   static_cast<perm_t>(P_GET | P_SIGN | P_VERIFY) },
21707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_ROOT,   static_cast<perm_t>(P_GET) },
21807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root};
21907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
22007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic const perm_t DEFAULT_PERMS = static_cast<perm_t>(P_TEST | P_GET | P_INSERT | P_DELETE | P_EXIST | P_SAW | P_SIGN
22107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        | P_VERIFY);
22207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
223eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahnstatic char *tctx;
224eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahnstatic int ks_is_selinux_enabled;
225eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
226eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahnstatic const char *get_perm_label(perm_t perm) {
227eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    unsigned int index = ffs(perm);
228eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    if (index > 0 && index <= (sizeof(perm_labels) / sizeof(perm_labels[0]))) {
229eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        return perm_labels[index - 1];
230eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    } else {
231eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        ALOGE("Keystore: Failed to retrieve permission label.\n");
232eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        abort();
233eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    }
234eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn}
235eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
236655b958eb2180c7c06889f83f606d23421bf038cKenny Root/**
237655b958eb2180c7c06889f83f606d23421bf038cKenny Root * Returns the app ID (in the Android multi-user sense) for the current
238655b958eb2180c7c06889f83f606d23421bf038cKenny Root * UNIX UID.
239655b958eb2180c7c06889f83f606d23421bf038cKenny Root */
240655b958eb2180c7c06889f83f606d23421bf038cKenny Rootstatic uid_t get_app_id(uid_t uid) {
241655b958eb2180c7c06889f83f606d23421bf038cKenny Root    return uid % AID_USER;
242655b958eb2180c7c06889f83f606d23421bf038cKenny Root}
243655b958eb2180c7c06889f83f606d23421bf038cKenny Root
244655b958eb2180c7c06889f83f606d23421bf038cKenny Root/**
245655b958eb2180c7c06889f83f606d23421bf038cKenny Root * Returns the user ID (in the Android multi-user sense) for the current
246655b958eb2180c7c06889f83f606d23421bf038cKenny Root * UNIX UID.
247655b958eb2180c7c06889f83f606d23421bf038cKenny Root */
248655b958eb2180c7c06889f83f606d23421bf038cKenny Rootstatic uid_t get_user_id(uid_t uid) {
249655b958eb2180c7c06889f83f606d23421bf038cKenny Root    return uid / AID_USER;
250655b958eb2180c7c06889f83f606d23421bf038cKenny Root}
251655b958eb2180c7c06889f83f606d23421bf038cKenny Root
252a25b2a397fff48dea7bce16af2065e6f5f043956Chih-Hung Hsiehstatic bool keystore_selinux_check_access(uid_t /*uid*/, perm_t perm, pid_t spid) {
253eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    if (!ks_is_selinux_enabled) {
254eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        return true;
255eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    }
256eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
257eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    char *sctx = NULL;
258eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    const char *selinux_class = "keystore_key";
259eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    const char *str_perm = get_perm_label(perm);
260eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
261eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    if (!str_perm) {
262eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        return false;
263eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    }
264eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
265eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    if (getpidcon(spid, &sctx) != 0) {
266eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        ALOGE("SELinux: Failed to get source pid context.\n");
267eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        return false;
268eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    }
26966dbf67dd65b4808a15ef64f0ffde1275bdd58a9Nick Kralevich
270eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    bool allowed = selinux_check_access(sctx, tctx, selinux_class, str_perm,
271eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn            NULL) == 0;
272eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    freecon(sctx);
273eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    return allowed;
274eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn}
275eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
276eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahnstatic bool has_permission(uid_t uid, perm_t perm, pid_t spid) {
277655b958eb2180c7c06889f83f606d23421bf038cKenny Root    // All system users are equivalent for multi-user support.
278655b958eb2180c7c06889f83f606d23421bf038cKenny Root    if (get_app_id(uid) == AID_SYSTEM) {
279655b958eb2180c7c06889f83f606d23421bf038cKenny Root        uid = AID_SYSTEM;
280655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
281655b958eb2180c7c06889f83f606d23421bf038cKenny Root
28207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    for (size_t i = 0; i < sizeof(user_perms)/sizeof(user_perms[0]); i++) {
28307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        struct user_perm user = user_perms[i];
28407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (user.uid == uid) {
285eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn            return (user.perms & perm) &&
286eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn                keystore_selinux_check_access(uid, perm, spid);
28707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
28807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
28907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
290eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    return (DEFAULT_PERMS & perm) &&
291eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        keystore_selinux_check_access(uid, perm, spid);
29207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root}
29307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
294494689083467ec372a58f094f041c8f102f39393Kenny Root/**
295494689083467ec372a58f094f041c8f102f39393Kenny Root * Returns the UID that the callingUid should act as. This is here for
296494689083467ec372a58f094f041c8f102f39393Kenny Root * legacy support of the WiFi and VPN systems and should be removed
297494689083467ec372a58f094f041c8f102f39393Kenny Root * when WiFi can operate in its own namespace.
298494689083467ec372a58f094f041c8f102f39393Kenny Root */
29907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic uid_t get_keystore_euid(uid_t uid) {
30007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    for (size_t i = 0; i < sizeof(user_euids)/sizeof(user_euids[0]); i++) {
30107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        struct user_euid user = user_euids[i];
30207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (user.uid == uid) {
30307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return user.euid;
30407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
30507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
30607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
30707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    return uid;
30807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root}
30907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
310494689083467ec372a58f094f041c8f102f39393Kenny Root/**
311494689083467ec372a58f094f041c8f102f39393Kenny Root * Returns true if the callingUid is allowed to interact in the targetUid's
312494689083467ec372a58f094f041c8f102f39393Kenny Root * namespace.
313494689083467ec372a58f094f041c8f102f39393Kenny Root */
314494689083467ec372a58f094f041c8f102f39393Kenny Rootstatic bool is_granted_to(uid_t callingUid, uid_t targetUid) {
3159489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    if (callingUid == targetUid) {
3169489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return true;
3179489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    }
318494689083467ec372a58f094f041c8f102f39393Kenny Root    for (size_t i = 0; i < sizeof(user_euids)/sizeof(user_euids[0]); i++) {
319494689083467ec372a58f094f041c8f102f39393Kenny Root        struct user_euid user = user_euids[i];
320494689083467ec372a58f094f041c8f102f39393Kenny Root        if (user.euid == callingUid && user.uid == targetUid) {
321494689083467ec372a58f094f041c8f102f39393Kenny Root            return true;
322494689083467ec372a58f094f041c8f102f39393Kenny Root        }
323494689083467ec372a58f094f041c8f102f39393Kenny Root    }
324494689083467ec372a58f094f041c8f102f39393Kenny Root
325494689083467ec372a58f094f041c8f102f39393Kenny Root    return false;
326494689083467ec372a58f094f041c8f102f39393Kenny Root}
327494689083467ec372a58f094f041c8f102f39393Kenny Root
328a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root/* Here is the encoding of keys. This is necessary in order to allow arbitrary
329a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * characters in keys. Characters in [0-~] are not encoded. Others are encoded
330a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * into two bytes. The first byte is one of [+-.] which represents the first
331a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * two bits of the character. The second byte encodes the rest of the bits into
332a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * [0-o]. Therefore in the worst case the length of a key gets doubled. Note
333a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * that Base64 cannot be used here due to the need of prefix match on keys. */
334a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
335655b958eb2180c7c06889f83f606d23421bf038cKenny Rootstatic size_t encode_key_length(const android::String8& keyName) {
336655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const uint8_t* in = reinterpret_cast<const uint8_t*>(keyName.string());
337655b958eb2180c7c06889f83f606d23421bf038cKenny Root    size_t length = keyName.length();
338655b958eb2180c7c06889f83f606d23421bf038cKenny Root    for (int i = length; i > 0; --i, ++in) {
339655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (*in < '0' || *in > '~') {
340655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ++length;
341655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
342655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
343655b958eb2180c7c06889f83f606d23421bf038cKenny Root    return length;
344655b958eb2180c7c06889f83f606d23421bf038cKenny Root}
345655b958eb2180c7c06889f83f606d23421bf038cKenny Root
34607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic int encode_key(char* out, const android::String8& keyName) {
34707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    const uint8_t* in = reinterpret_cast<const uint8_t*>(keyName.string());
34807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    size_t length = keyName.length();
349a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    for (int i = length; i > 0; --i, ++in, ++out) {
350655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (*in < '0' || *in > '~') {
351a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            *out = '+' + (*in >> 6);
352a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            *++out = '0' + (*in & 0x3F);
353a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            ++length;
354655b958eb2180c7c06889f83f606d23421bf038cKenny Root        } else {
355655b958eb2180c7c06889f83f606d23421bf038cKenny Root            *out = *in;
356a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
357a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
358a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    *out = '\0';
35970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    return length;
36070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root}
36170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
36207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root/*
36307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root * Converts from the "escaped" format on disk to actual name.
36407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root * This will be smaller than the input string.
36507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root *
36607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root * Characters that should combine with the next at the end will be truncated.
36707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root */
36807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic size_t decode_key_length(const char* in, size_t length) {
36907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    size_t outLength = 0;
37007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
37107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    for (const char* end = in + length; in < end; in++) {
37207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        /* This combines with the next character. */
37307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (*in < '0' || *in > '~') {
37407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            continue;
37507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
37607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
37707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        outLength++;
37807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
37907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    return outLength;
38007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root}
38107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
38207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic void decode_key(char* out, const char* in, size_t length) {
38307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    for (const char* end = in + length; in < end; in++) {
38407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (*in < '0' || *in > '~') {
38507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            /* Truncate combining characters at the end. */
38607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            if (in + 1 >= end) {
38707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root                break;
38807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            }
38907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
39007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            *out = (*in++ - '+') << 6;
39107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            *out++ |= (*in - '0') & 0x3F;
392a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        } else {
39307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            *out++ = *in;
394a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
395a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
396a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    *out = '\0';
397a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root}
398a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
399a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootstatic size_t readFully(int fd, uint8_t* data, size_t size) {
400a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    size_t remaining = size;
401a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    while (remaining > 0) {
402150ca934edb745de3666a6492b039900df228ff0Kenny Root        ssize_t n = TEMP_FAILURE_RETRY(read(fd, data, remaining));
4035281edbc9445065479e92a6c86da462f3943c2caKenny Root        if (n <= 0) {
404150ca934edb745de3666a6492b039900df228ff0Kenny Root            return size - remaining;
405a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
406a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        data += n;
407a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        remaining -= n;
408a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
409a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    return size;
410a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root}
411a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
412a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootstatic size_t writeFully(int fd, uint8_t* data, size_t size) {
413a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    size_t remaining = size;
414a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    while (remaining > 0) {
415150ca934edb745de3666a6492b039900df228ff0Kenny Root        ssize_t n = TEMP_FAILURE_RETRY(write(fd, data, remaining));
416150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (n < 0) {
417150ca934edb745de3666a6492b039900df228ff0Kenny Root            ALOGW("write failed: %s", strerror(errno));
418150ca934edb745de3666a6492b039900df228ff0Kenny Root            return size - remaining;
419a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
420a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        data += n;
421a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        remaining -= n;
422a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
423a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    return size;
424a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root}
425a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
426a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootclass Entropy {
427a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootpublic:
428a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    Entropy() : mRandom(-1) {}
429a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    ~Entropy() {
430150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (mRandom >= 0) {
431a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            close(mRandom);
432a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
433a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
434a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
435a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    bool open() {
436a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        const char* randomDevice = "/dev/urandom";
437150ca934edb745de3666a6492b039900df228ff0Kenny Root        mRandom = TEMP_FAILURE_RETRY(::open(randomDevice, O_RDONLY));
438150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (mRandom < 0) {
439a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            ALOGE("open: %s: %s", randomDevice, strerror(errno));
440a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return false;
441a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
442a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return true;
443a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
444a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
4455187818895c4c5f650a611c40531b1dff7764c18Kenny Root    bool generate_random_data(uint8_t* data, size_t size) const {
446a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return (readFully(mRandom, data, size) == size);
447a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
448a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
449a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootprivate:
450a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    int mRandom;
451a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root};
452a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
453a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root/* Here is the file format. There are two parts in blob.value, the secret and
454a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * the description. The secret is stored in ciphertext, and its original size
455a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * can be found in blob.length. The description is stored after the secret in
456a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * plaintext, and its size is specified in blob.info. The total size of the two
457822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root * parts must be no more than VALUE_SIZE bytes. The first field is the version,
458f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root * the second is the blob's type, and the third byte is flags. Fields other
459a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * than blob.info, blob.length, and blob.value are modified by encryptBlob()
460a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * and decryptBlob(). Thus they should not be accessed from outside. */
461a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
462822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root/* ** Note to future implementors of encryption: **
463822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root * Currently this is the construction:
464822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *   metadata || Enc(MD5(data) || data)
465822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *
466822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root * This should be the construction used for encrypting if re-implementing:
467822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *
468822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *   Derive independent keys for encryption and MAC:
469822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *     Kenc = AES_encrypt(masterKey, "Encrypt")
470822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *     Kmac = AES_encrypt(masterKey, "MAC")
471822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *
472822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *   Store this:
473822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *     metadata || AES_CTR_encrypt(Kenc, rand_IV, data) ||
474822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *             HMAC(Kmac, metadata || Enc(data))
475822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root */
476a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootstruct __attribute__((packed)) blob {
477822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    uint8_t version;
478822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    uint8_t type;
479f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    uint8_t flags;
480a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    uint8_t info;
481a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    uint8_t vector[AES_BLOCK_SIZE];
482822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    uint8_t encrypted[0]; // Marks offset to encrypted data.
483a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    uint8_t digest[MD5_DIGEST_LENGTH];
484822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    uint8_t digested[0]; // Marks offset to digested data.
485a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    int32_t length; // in network byte order when encrypted
486a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    uint8_t value[VALUE_SIZE + AES_BLOCK_SIZE];
487a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root};
488a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
489822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Roottypedef enum {
490d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root    TYPE_ANY = 0, // meta type that matches anything
491822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    TYPE_GENERIC = 1,
492822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    TYPE_MASTER_KEY = 2,
493822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    TYPE_KEY_PAIR = 3,
49417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker    TYPE_KEYMASTER_10 = 4,
495822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root} BlobType;
496822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
497f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Rootstatic const uint8_t CURRENT_BLOB_VERSION = 2;
498822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
499a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootclass Blob {
500a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootpublic:
50107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    Blob(const uint8_t* value, int32_t valueLength, const uint8_t* info, uint8_t infoLength,
50207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            BlobType type) {
5031773b442b16098c6d111d6371d4a986a0747992bAlex Klyubin        memset(&mBlob, 0, sizeof(mBlob));
504a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        mBlob.length = valueLength;
505a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        memcpy(mBlob.value, value, valueLength);
506a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
507a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        mBlob.info = infoLength;
508a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        memcpy(mBlob.value + valueLength, info, infoLength);
509822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
51007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        mBlob.version = CURRENT_BLOB_VERSION;
511822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        mBlob.type = uint8_t(type);
512f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
513ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root        if (type == TYPE_MASTER_KEY) {
514ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root            mBlob.flags = KEYSTORE_FLAG_ENCRYPTED;
515ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root        } else {
516ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root            mBlob.flags = KEYSTORE_FLAG_NONE;
517ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root        }
518a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
519a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
520a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    Blob(blob b) {
521a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        mBlob = b;
522a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
523a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
5241773b442b16098c6d111d6371d4a986a0747992bAlex Klyubin    Blob() {
5251773b442b16098c6d111d6371d4a986a0747992bAlex Klyubin        memset(&mBlob, 0, sizeof(mBlob));
5261773b442b16098c6d111d6371d4a986a0747992bAlex Klyubin    }
527a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
5285187818895c4c5f650a611c40531b1dff7764c18Kenny Root    const uint8_t* getValue() const {
529a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return mBlob.value;
530a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
531a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
5325187818895c4c5f650a611c40531b1dff7764c18Kenny Root    int32_t getLength() const {
533a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return mBlob.length;
534a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
535a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
5365187818895c4c5f650a611c40531b1dff7764c18Kenny Root    const uint8_t* getInfo() const {
5375187818895c4c5f650a611c40531b1dff7764c18Kenny Root        return mBlob.value + mBlob.length;
5385187818895c4c5f650a611c40531b1dff7764c18Kenny Root    }
5395187818895c4c5f650a611c40531b1dff7764c18Kenny Root
5405187818895c4c5f650a611c40531b1dff7764c18Kenny Root    uint8_t getInfoLength() const {
541a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return mBlob.info;
542a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
543a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
544822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    uint8_t getVersion() const {
545822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        return mBlob.version;
546822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
547822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
548f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    bool isEncrypted() const {
549f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (mBlob.version < 2) {
550f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            return true;
551f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        }
552f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
553f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        return mBlob.flags & KEYSTORE_FLAG_ENCRYPTED;
554f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    }
555f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
556f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    void setEncrypted(bool encrypted) {
557f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (encrypted) {
558f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            mBlob.flags |= KEYSTORE_FLAG_ENCRYPTED;
559f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        } else {
560f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            mBlob.flags &= ~KEYSTORE_FLAG_ENCRYPTED;
561f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        }
562f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    }
563f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
56417208e0de5a42722901d803118745cca25fd10c1Kenny Root    bool isFallback() const {
56517208e0de5a42722901d803118745cca25fd10c1Kenny Root        return mBlob.flags & KEYSTORE_FLAG_FALLBACK;
56617208e0de5a42722901d803118745cca25fd10c1Kenny Root    }
56717208e0de5a42722901d803118745cca25fd10c1Kenny Root
56817208e0de5a42722901d803118745cca25fd10c1Kenny Root    void setFallback(bool fallback) {
56917208e0de5a42722901d803118745cca25fd10c1Kenny Root        if (fallback) {
57017208e0de5a42722901d803118745cca25fd10c1Kenny Root            mBlob.flags |= KEYSTORE_FLAG_FALLBACK;
57117208e0de5a42722901d803118745cca25fd10c1Kenny Root        } else {
57217208e0de5a42722901d803118745cca25fd10c1Kenny Root            mBlob.flags &= ~KEYSTORE_FLAG_FALLBACK;
57317208e0de5a42722901d803118745cca25fd10c1Kenny Root        }
57417208e0de5a42722901d803118745cca25fd10c1Kenny Root    }
57517208e0de5a42722901d803118745cca25fd10c1Kenny Root
576822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    void setVersion(uint8_t version) {
577822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        mBlob.version = version;
578822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
579822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
580822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    BlobType getType() const {
581822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        return BlobType(mBlob.type);
582822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
583822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
584822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    void setType(BlobType type) {
585822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        mBlob.type = uint8_t(type);
586822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
587822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
588f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    ResponseCode writeBlob(const char* filename, AES_KEY *aes_key, State state, Entropy* entropy) {
589f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ALOGV("writing blob %s", filename);
590f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (isEncrypted()) {
591f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            if (state != STATE_NO_ERROR) {
592f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                ALOGD("couldn't insert encrypted blob while not unlocked");
593f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                return LOCKED;
594f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            }
595f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
596f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            if (!entropy->generate_random_data(mBlob.vector, AES_BLOCK_SIZE)) {
597f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                ALOGW("Could not read random data for: %s", filename);
598f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                return SYSTEM_ERROR;
599f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            }
600a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
601a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
602a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // data includes the value and the value's length
603a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t dataLength = mBlob.length + sizeof(mBlob.length);
604a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // pad data to the AES_BLOCK_SIZE
605a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t digestedLength = ((dataLength + AES_BLOCK_SIZE - 1)
606a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root                                 / AES_BLOCK_SIZE * AES_BLOCK_SIZE);
607a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // encrypted data includes the digest value
608a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t encryptedLength = digestedLength + MD5_DIGEST_LENGTH;
609a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // move info after space for padding
610a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        memmove(&mBlob.encrypted[encryptedLength], &mBlob.value[mBlob.length], mBlob.info);
611a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // zero padding area
612a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        memset(mBlob.value + mBlob.length, 0, digestedLength - dataLength);
613a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
614a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        mBlob.length = htonl(mBlob.length);
615a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
616f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (isEncrypted()) {
617f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            MD5(mBlob.digested, digestedLength, mBlob.digest);
618f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
619f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            uint8_t vector[AES_BLOCK_SIZE];
620f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            memcpy(vector, mBlob.vector, AES_BLOCK_SIZE);
621f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            AES_cbc_encrypt(mBlob.encrypted, mBlob.encrypted, encryptedLength,
622f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                            aes_key, vector, AES_ENCRYPT);
623f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        }
624a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
625a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t headerLength = (mBlob.encrypted - (uint8_t*) &mBlob);
626a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t fileLength = encryptedLength + headerLength + mBlob.info;
627a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
628a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        const char* tmpFileName = ".tmp";
629150ca934edb745de3666a6492b039900df228ff0Kenny Root        int out = TEMP_FAILURE_RETRY(open(tmpFileName,
630150ca934edb745de3666a6492b039900df228ff0Kenny Root                O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR));
631150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (out < 0) {
632150ca934edb745de3666a6492b039900df228ff0Kenny Root            ALOGW("could not open file: %s: %s", tmpFileName, strerror(errno));
633a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
634a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
635a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t writtenBytes = writeFully(out, (uint8_t*) &mBlob, fileLength);
636a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (close(out) != 0) {
637a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
638a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
639a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (writtenBytes != fileLength) {
640150ca934edb745de3666a6492b039900df228ff0Kenny Root            ALOGW("blob not fully written %zu != %zu", writtenBytes, fileLength);
641a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            unlink(tmpFileName);
642a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
643a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
644150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (rename(tmpFileName, filename) == -1) {
645150ca934edb745de3666a6492b039900df228ff0Kenny Root            ALOGW("could not rename blob to %s: %s", filename, strerror(errno));
646150ca934edb745de3666a6492b039900df228ff0Kenny Root            return SYSTEM_ERROR;
647150ca934edb745de3666a6492b039900df228ff0Kenny Root        }
648150ca934edb745de3666a6492b039900df228ff0Kenny Root        return NO_ERROR;
649a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
650a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
651f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    ResponseCode readBlob(const char* filename, AES_KEY *aes_key, State state) {
652f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ALOGV("reading blob %s", filename);
653150ca934edb745de3666a6492b039900df228ff0Kenny Root        int in = TEMP_FAILURE_RETRY(open(filename, O_RDONLY));
654150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (in < 0) {
655a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return (errno == ENOENT) ? KEY_NOT_FOUND : SYSTEM_ERROR;
656a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
657a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // fileLength may be less than sizeof(mBlob) since the in
658a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // memory version has extra padding to tolerate rounding up to
659a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // the AES_BLOCK_SIZE
660a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t fileLength = readFully(in, (uint8_t*) &mBlob, sizeof(mBlob));
661a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (close(in) != 0) {
662a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
663a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
664f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
665f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (isEncrypted() && (state != STATE_NO_ERROR)) {
666f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            return LOCKED;
667f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        }
668f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
669a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t headerLength = (mBlob.encrypted - (uint8_t*) &mBlob);
670a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (fileLength < headerLength) {
671a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return VALUE_CORRUPTED;
672a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
673a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
674a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        ssize_t encryptedLength = fileLength - (headerLength + mBlob.info);
675f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (encryptedLength < 0) {
676a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return VALUE_CORRUPTED;
677a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
678f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
679f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ssize_t digestedLength;
680f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (isEncrypted()) {
681f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            if (encryptedLength % AES_BLOCK_SIZE != 0) {
682f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                return VALUE_CORRUPTED;
683f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            }
684f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
685f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            AES_cbc_encrypt(mBlob.encrypted, mBlob.encrypted, encryptedLength, aes_key,
686f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                            mBlob.vector, AES_DECRYPT);
687f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            digestedLength = encryptedLength - MD5_DIGEST_LENGTH;
688f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            uint8_t computedDigest[MD5_DIGEST_LENGTH];
689f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            MD5(mBlob.digested, digestedLength, computedDigest);
690f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            if (memcmp(mBlob.digest, computedDigest, MD5_DIGEST_LENGTH) != 0) {
691f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                return VALUE_CORRUPTED;
692f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            }
693f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        } else {
694f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            digestedLength = encryptedLength;
695a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
696a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
697a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        ssize_t maxValueLength = digestedLength - sizeof(mBlob.length);
698a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        mBlob.length = ntohl(mBlob.length);
699a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (mBlob.length < 0 || mBlob.length > maxValueLength) {
700a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return VALUE_CORRUPTED;
701a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
702a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (mBlob.info != 0) {
703a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            // move info from after padding to after data
704a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            memmove(&mBlob.value[mBlob.length], &mBlob.value[maxValueLength], mBlob.info);
705a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
70607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
707a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
708a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
709a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootprivate:
710a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    struct blob mBlob;
711a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root};
712a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
713655b958eb2180c7c06889f83f606d23421bf038cKenny Rootclass UserState {
714655b958eb2180c7c06889f83f606d23421bf038cKenny Rootpublic:
715655b958eb2180c7c06889f83f606d23421bf038cKenny Root    UserState(uid_t userId) : mUserId(userId), mRetry(MAX_RETRY) {
716655b958eb2180c7c06889f83f606d23421bf038cKenny Root        asprintf(&mUserDir, "user_%u", mUserId);
717655b958eb2180c7c06889f83f606d23421bf038cKenny Root        asprintf(&mMasterKeyFile, "%s/.masterkey", mUserDir);
718655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
71970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
720655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ~UserState() {
721655b958eb2180c7c06889f83f606d23421bf038cKenny Root        free(mUserDir);
722655b958eb2180c7c06889f83f606d23421bf038cKenny Root        free(mMasterKeyFile);
723655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
72470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
725655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool initialize() {
726655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if ((mkdir(mUserDir, S_IRUSR | S_IWUSR | S_IXUSR) < 0) && (errno != EEXIST)) {
727655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGE("Could not create directory '%s'", mUserDir);
728655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return false;
729655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
730655b958eb2180c7c06889f83f606d23421bf038cKenny Root
731655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(mMasterKeyFile, R_OK) == 0) {
732a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            setState(STATE_LOCKED);
733a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        } else {
734a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            setState(STATE_UNINITIALIZED);
735a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
73670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
737655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return true;
738655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
739655b958eb2180c7c06889f83f606d23421bf038cKenny Root
740655b958eb2180c7c06889f83f606d23421bf038cKenny Root    uid_t getUserId() const {
741655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mUserId;
742655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
743655b958eb2180c7c06889f83f606d23421bf038cKenny Root
744655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const char* getUserDirName() const {
745655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mUserDir;
746655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
747655b958eb2180c7c06889f83f606d23421bf038cKenny Root
748655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const char* getMasterKeyFileName() const {
749655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mMasterKeyFile;
750655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
751655b958eb2180c7c06889f83f606d23421bf038cKenny Root
752655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void setState(State state) {
753655b958eb2180c7c06889f83f606d23421bf038cKenny Root        mState = state;
754655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (mState == STATE_NO_ERROR || mState == STATE_UNINITIALIZED) {
755655b958eb2180c7c06889f83f606d23421bf038cKenny Root            mRetry = MAX_RETRY;
756655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
757a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
758a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
7595187818895c4c5f650a611c40531b1dff7764c18Kenny Root    State getState() const {
760a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return mState;
761a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
762a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
7635187818895c4c5f650a611c40531b1dff7764c18Kenny Root    int8_t getRetry() const {
764a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return mRetry;
765a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
766a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
767655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void zeroizeMasterKeysInMemory() {
768655b958eb2180c7c06889f83f606d23421bf038cKenny Root        memset(mMasterKey, 0, sizeof(mMasterKey));
769655b958eb2180c7c06889f83f606d23421bf038cKenny Root        memset(mSalt, 0, sizeof(mSalt));
770655b958eb2180c7c06889f83f606d23421bf038cKenny Root        memset(&mMasterKeyEncryption, 0, sizeof(mMasterKeyEncryption));
771655b958eb2180c7c06889f83f606d23421bf038cKenny Root        memset(&mMasterKeyDecryption, 0, sizeof(mMasterKeyDecryption));
77270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
77370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
77496d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker    bool deleteMasterKey() {
77596d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        setState(STATE_UNINITIALIZED);
77696d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        zeroizeMasterKeysInMemory();
77796d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        return unlink(mMasterKeyFile) == 0 || errno == ENOENT;
77896d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker    }
77996d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker
780655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode initialize(const android::String8& pw, Entropy* entropy) {
781655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (!generateMasterKey(entropy)) {
782a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
783a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
784655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode response = writeMasterKey(pw, entropy);
785a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (response != NO_ERROR) {
786a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return response;
787a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
788a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        setupMasterKeys();
78907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
790a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
791a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
7924e865753346fc6a075966972a7a98051818859dbRobin Lee    ResponseCode copyMasterKey(UserState* src) {
7934e865753346fc6a075966972a7a98051818859dbRobin Lee        if (mState != STATE_UNINITIALIZED) {
7944e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::SYSTEM_ERROR;
7954e865753346fc6a075966972a7a98051818859dbRobin Lee        }
7964e865753346fc6a075966972a7a98051818859dbRobin Lee        if (src->getState() != STATE_NO_ERROR) {
7974e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::SYSTEM_ERROR;
7984e865753346fc6a075966972a7a98051818859dbRobin Lee        }
7994e865753346fc6a075966972a7a98051818859dbRobin Lee        memcpy(mMasterKey, src->mMasterKey, MASTER_KEY_SIZE_BYTES);
8004e865753346fc6a075966972a7a98051818859dbRobin Lee        setupMasterKeys();
8014e865753346fc6a075966972a7a98051818859dbRobin Lee        return ::NO_ERROR;
8024e865753346fc6a075966972a7a98051818859dbRobin Lee    }
8034e865753346fc6a075966972a7a98051818859dbRobin Lee
804655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode writeMasterKey(const android::String8& pw, Entropy* entropy) {
805a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        uint8_t passwordKey[MASTER_KEY_SIZE_BYTES];
806a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        generateKeyFromPassword(passwordKey, MASTER_KEY_SIZE_BYTES, pw, mSalt);
807a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        AES_KEY passwordAesKey;
808a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        AES_set_encrypt_key(passwordKey, MASTER_KEY_SIZE_BITS, &passwordAesKey);
809822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        Blob masterKeyBlob(mMasterKey, sizeof(mMasterKey), mSalt, sizeof(mSalt), TYPE_MASTER_KEY);
810f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        return masterKeyBlob.writeBlob(mMasterKeyFile, &passwordAesKey, STATE_NO_ERROR, entropy);
811a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
812a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
813655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode readMasterKey(const android::String8& pw, Entropy* entropy) {
814655b958eb2180c7c06889f83f606d23421bf038cKenny Root        int in = TEMP_FAILURE_RETRY(open(mMasterKeyFile, O_RDONLY));
815150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (in < 0) {
816a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
817a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
818a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
819a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // we read the raw blob to just to get the salt to generate
820a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // the AES key, then we create the Blob to use with decryptBlob
821a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        blob rawBlob;
822a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t length = readFully(in, (uint8_t*) &rawBlob, sizeof(rawBlob));
823a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (close(in) != 0) {
824a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
825a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
826a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // find salt at EOF if present, otherwise we have an old file
827a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        uint8_t* salt;
828a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (length > SALT_SIZE && rawBlob.info == SALT_SIZE) {
829a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            salt = (uint8_t*) &rawBlob + length - SALT_SIZE;
830a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        } else {
831a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            salt = NULL;
832a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
833a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        uint8_t passwordKey[MASTER_KEY_SIZE_BYTES];
834a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        generateKeyFromPassword(passwordKey, MASTER_KEY_SIZE_BYTES, pw, salt);
835a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        AES_KEY passwordAesKey;
836a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        AES_set_decrypt_key(passwordKey, MASTER_KEY_SIZE_BITS, &passwordAesKey);
837a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        Blob masterKeyBlob(rawBlob);
838f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ResponseCode response = masterKeyBlob.readBlob(mMasterKeyFile, &passwordAesKey,
839f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                STATE_NO_ERROR);
840a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (response == SYSTEM_ERROR) {
841f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            return response;
842a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
843a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (response == NO_ERROR && masterKeyBlob.getLength() == MASTER_KEY_SIZE_BYTES) {
844a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            // if salt was missing, generate one and write a new master key file with the salt.
845a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            if (salt == NULL) {
846655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (!generateSalt(entropy)) {
847a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root                    return SYSTEM_ERROR;
848a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root                }
849655b958eb2180c7c06889f83f606d23421bf038cKenny Root                response = writeMasterKey(pw, entropy);
850a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            }
851a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            if (response == NO_ERROR) {
852a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root                memcpy(mMasterKey, masterKeyBlob.getValue(), MASTER_KEY_SIZE_BYTES);
853a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root                setupMasterKeys();
854a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            }
855a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return response;
856a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
857a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (mRetry <= 0) {
858a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            reset();
859a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return UNINITIALIZED;
860a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
861a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        --mRetry;
862a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        switch (mRetry) {
863a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            case 0: return WRONG_PASSWORD_0;
864a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            case 1: return WRONG_PASSWORD_1;
865a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            case 2: return WRONG_PASSWORD_2;
866a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            case 3: return WRONG_PASSWORD_3;
867a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            default: return WRONG_PASSWORD_3;
868a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
869a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
870a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
871655b958eb2180c7c06889f83f606d23421bf038cKenny Root    AES_KEY* getEncryptionKey() {
872655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return &mMasterKeyEncryption;
873655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
874a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
875655b958eb2180c7c06889f83f606d23421bf038cKenny Root    AES_KEY* getDecryptionKey() {
876655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return &mMasterKeyDecryption;
877655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
878a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
879655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool reset() {
880655b958eb2180c7c06889f83f606d23421bf038cKenny Root        DIR* dir = opendir(getUserDirName());
881a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (!dir) {
88296d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            // If the directory doesn't exist then nothing to do.
88396d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            if (errno == ENOENT) {
88496d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                return true;
88596d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            }
886655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGW("couldn't open user directory: %s", strerror(errno));
887a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return false;
888a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
889655b958eb2180c7c06889f83f606d23421bf038cKenny Root
890655b958eb2180c7c06889f83f606d23421bf038cKenny Root        struct dirent* file;
891a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        while ((file = readdir(dir)) != NULL) {
89296d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            // skip . and ..
89396d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            if (!strcmp(".", file->d_name) || !strcmp("..", file->d_name)) {
894655b958eb2180c7c06889f83f606d23421bf038cKenny Root                continue;
895655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
896655b958eb2180c7c06889f83f606d23421bf038cKenny Root
897655b958eb2180c7c06889f83f606d23421bf038cKenny Root            unlinkat(dirfd(dir), file->d_name, 0);
898a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
899a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        closedir(dir);
900a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return true;
901a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
902a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
903655b958eb2180c7c06889f83f606d23421bf038cKenny Rootprivate:
904655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const int MASTER_KEY_SIZE_BYTES = 16;
905655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const int MASTER_KEY_SIZE_BITS = MASTER_KEY_SIZE_BYTES * 8;
906655b958eb2180c7c06889f83f606d23421bf038cKenny Root
907655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const int MAX_RETRY = 4;
908655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const size_t SALT_SIZE = 16;
909655b958eb2180c7c06889f83f606d23421bf038cKenny Root
910655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void generateKeyFromPassword(uint8_t* key, ssize_t keySize, const android::String8& pw,
911655b958eb2180c7c06889f83f606d23421bf038cKenny Root            uint8_t* salt) {
912655b958eb2180c7c06889f83f606d23421bf038cKenny Root        size_t saltSize;
913655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (salt != NULL) {
914655b958eb2180c7c06889f83f606d23421bf038cKenny Root            saltSize = SALT_SIZE;
915655b958eb2180c7c06889f83f606d23421bf038cKenny Root        } else {
916655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // pre-gingerbread used this hardwired salt, readMasterKey will rewrite these when found
917655b958eb2180c7c06889f83f606d23421bf038cKenny Root            salt = (uint8_t*) "keystore";
918655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // sizeof = 9, not strlen = 8
919655b958eb2180c7c06889f83f606d23421bf038cKenny Root            saltSize = sizeof("keystore");
920655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
921655b958eb2180c7c06889f83f606d23421bf038cKenny Root
922655b958eb2180c7c06889f83f606d23421bf038cKenny Root        PKCS5_PBKDF2_HMAC_SHA1(reinterpret_cast<const char*>(pw.string()), pw.length(), salt,
923655b958eb2180c7c06889f83f606d23421bf038cKenny Root                saltSize, 8192, keySize, key);
924655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
925655b958eb2180c7c06889f83f606d23421bf038cKenny Root
926655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool generateSalt(Entropy* entropy) {
927655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return entropy->generate_random_data(mSalt, sizeof(mSalt));
928655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
929655b958eb2180c7c06889f83f606d23421bf038cKenny Root
930655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool generateMasterKey(Entropy* entropy) {
931655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (!entropy->generate_random_data(mMasterKey, sizeof(mMasterKey))) {
932655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return false;
933655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
934655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (!generateSalt(entropy)) {
935655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return false;
936655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
937655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return true;
938655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
939655b958eb2180c7c06889f83f606d23421bf038cKenny Root
940655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void setupMasterKeys() {
941655b958eb2180c7c06889f83f606d23421bf038cKenny Root        AES_set_encrypt_key(mMasterKey, MASTER_KEY_SIZE_BITS, &mMasterKeyEncryption);
942655b958eb2180c7c06889f83f606d23421bf038cKenny Root        AES_set_decrypt_key(mMasterKey, MASTER_KEY_SIZE_BITS, &mMasterKeyDecryption);
943655b958eb2180c7c06889f83f606d23421bf038cKenny Root        setState(STATE_NO_ERROR);
944655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
945655b958eb2180c7c06889f83f606d23421bf038cKenny Root
946655b958eb2180c7c06889f83f606d23421bf038cKenny Root    uid_t mUserId;
947655b958eb2180c7c06889f83f606d23421bf038cKenny Root
948655b958eb2180c7c06889f83f606d23421bf038cKenny Root    char* mUserDir;
949655b958eb2180c7c06889f83f606d23421bf038cKenny Root    char* mMasterKeyFile;
950655b958eb2180c7c06889f83f606d23421bf038cKenny Root
951655b958eb2180c7c06889f83f606d23421bf038cKenny Root    State mState;
952655b958eb2180c7c06889f83f606d23421bf038cKenny Root    int8_t mRetry;
953655b958eb2180c7c06889f83f606d23421bf038cKenny Root
954655b958eb2180c7c06889f83f606d23421bf038cKenny Root    uint8_t mMasterKey[MASTER_KEY_SIZE_BYTES];
955655b958eb2180c7c06889f83f606d23421bf038cKenny Root    uint8_t mSalt[SALT_SIZE];
956655b958eb2180c7c06889f83f606d23421bf038cKenny Root
957655b958eb2180c7c06889f83f606d23421bf038cKenny Root    AES_KEY mMasterKeyEncryption;
958655b958eb2180c7c06889f83f606d23421bf038cKenny Root    AES_KEY mMasterKeyDecryption;
959655b958eb2180c7c06889f83f606d23421bf038cKenny Root};
960655b958eb2180c7c06889f83f606d23421bf038cKenny Root
961655b958eb2180c7c06889f83f606d23421bf038cKenny Roottypedef struct {
962655b958eb2180c7c06889f83f606d23421bf038cKenny Root    uint32_t uid;
963655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const uint8_t* filename;
964655b958eb2180c7c06889f83f606d23421bf038cKenny Root} grant_t;
965655b958eb2180c7c06889f83f606d23421bf038cKenny Root
966655b958eb2180c7c06889f83f606d23421bf038cKenny Rootclass KeyStore {
967655b958eb2180c7c06889f83f606d23421bf038cKenny Rootpublic:
96867d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    KeyStore(Entropy* entropy, keymaster1_device_t* device, keymaster1_device_t* fallback)
969655b958eb2180c7c06889f83f606d23421bf038cKenny Root        : mEntropy(entropy)
970655b958eb2180c7c06889f83f606d23421bf038cKenny Root        , mDevice(device)
971fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        , mFallbackDevice(fallback)
972655b958eb2180c7c06889f83f606d23421bf038cKenny Root    {
973655b958eb2180c7c06889f83f606d23421bf038cKenny Root        memset(&mMetaData, '\0', sizeof(mMetaData));
974655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
975655b958eb2180c7c06889f83f606d23421bf038cKenny Root
976655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ~KeyStore() {
977655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<grant_t*>::iterator it(mGrants.begin());
978655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mGrants.end(); it++) {
979655b958eb2180c7c06889f83f606d23421bf038cKenny Root            delete *it;
980655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
981c35d4eb3e66aa69ca17dd83b1bcdcc19276bf8e5haitao fang        mGrants.clear();
982655b958eb2180c7c06889f83f606d23421bf038cKenny Root
983655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<UserState*>::iterator it(mMasterKeys.begin());
984655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mMasterKeys.end(); it++) {
985655b958eb2180c7c06889f83f606d23421bf038cKenny Root            delete *it;
986655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
987c35d4eb3e66aa69ca17dd83b1bcdcc19276bf8e5haitao fang        mMasterKeys.clear();
988655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
989655b958eb2180c7c06889f83f606d23421bf038cKenny Root
99067d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    /**
99167d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker     * Depending on the hardware keymaster version is this may return a
99267d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker     * keymaster0_device_t* cast to a keymaster1_device_t*. All methods from
99367d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker     * keymaster0 are safe to call, calls to keymaster1_device_t methods should
99467d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker     * be guarded by a check on the device's version.
99567d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker     */
99667d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t *getDevice() const {
997655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mDevice;
998655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
999655b958eb2180c7c06889f83f606d23421bf038cKenny Root
100067d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t *getFallbackDevice() const {
1001fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        return mFallbackDevice;
1002fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker    }
1003fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker
100467d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t *getDeviceForBlob(const Blob& blob) const {
1005fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        return blob.isFallback() ? mFallbackDevice: mDevice;
1006fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker    }
1007fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker
1008655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode initialize() {
1009655b958eb2180c7c06889f83f606d23421bf038cKenny Root        readMetaData();
1010655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (upgradeKeystore()) {
1011655b958eb2180c7c06889f83f606d23421bf038cKenny Root            writeMetaData();
1012655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1013655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1014655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return ::NO_ERROR;
1015655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1016655b958eb2180c7c06889f83f606d23421bf038cKenny Root
101772593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    State getState(uid_t userId) {
101872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return getUserState(userId)->getState();
1019655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1020655b958eb2180c7c06889f83f606d23421bf038cKenny Root
102172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    ResponseCode initializeUser(const android::String8& pw, uid_t userId) {
102272593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        UserState* userState = getUserState(userId);
1023655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return userState->initialize(pw, mEntropy);
1024655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1025655b958eb2180c7c06889f83f606d23421bf038cKenny Root
102672593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    ResponseCode copyMasterKey(uid_t srcUser, uid_t dstUser) {
102772593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        UserState *userState = getUserState(dstUser);
102872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        UserState *initState = getUserState(srcUser);
10294e865753346fc6a075966972a7a98051818859dbRobin Lee        return userState->copyMasterKey(initState);
10304e865753346fc6a075966972a7a98051818859dbRobin Lee    }
10314e865753346fc6a075966972a7a98051818859dbRobin Lee
103272593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    ResponseCode writeMasterKey(const android::String8& pw, uid_t userId) {
103372593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        UserState* userState = getUserState(userId);
1034655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return userState->writeMasterKey(pw, mEntropy);
1035655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1036655b958eb2180c7c06889f83f606d23421bf038cKenny Root
103772593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    ResponseCode readMasterKey(const android::String8& pw, uid_t userId) {
103872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        UserState* userState = getUserState(userId);
1039655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return userState->readMasterKey(pw, mEntropy);
1040655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1041655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1042655b958eb2180c7c06889f83f606d23421bf038cKenny Root    android::String8 getKeyName(const android::String8& keyName) {
1043a77e809ecff5190790906fb7a3c527259c735071Douglas Leung        char encoded[encode_key_length(keyName) + 1];	// add 1 for null char
1044655b958eb2180c7c06889f83f606d23421bf038cKenny Root        encode_key(encoded, keyName);
1045655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return android::String8(encoded);
1046655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1047655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1048655b958eb2180c7c06889f83f606d23421bf038cKenny Root    android::String8 getKeyNameForUid(const android::String8& keyName, uid_t uid) {
1049a77e809ecff5190790906fb7a3c527259c735071Douglas Leung        char encoded[encode_key_length(keyName) + 1];	// add 1 for null char
1050655b958eb2180c7c06889f83f606d23421bf038cKenny Root        encode_key(encoded, keyName);
1051655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return android::String8::format("%u_%s", uid, encoded);
1052655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1053655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1054655b958eb2180c7c06889f83f606d23421bf038cKenny Root    android::String8 getKeyNameForUidWithDir(const android::String8& keyName, uid_t uid) {
1055a77e809ecff5190790906fb7a3c527259c735071Douglas Leung        char encoded[encode_key_length(keyName) + 1];	// add 1 for null char
1056655b958eb2180c7c06889f83f606d23421bf038cKenny Root        encode_key(encoded, keyName);
105772593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return android::String8::format("%s/%u_%s", getUserStateByUid(uid)->getUserDirName(), uid,
1058655b958eb2180c7c06889f83f606d23421bf038cKenny Root                encoded);
1059655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1060655b958eb2180c7c06889f83f606d23421bf038cKenny Root
106196d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker    /*
106296d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker     * Delete entries owned by userId. If keepUnencryptedEntries is true
106396d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker     * then only encrypted entries will be removed, otherwise all entries will
106496d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker     * be removed.
106596d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker     */
106696d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker    void resetUser(uid_t userId, bool keepUnenryptedEntries) {
10674b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        android::String8 prefix("");
10684b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        android::Vector<android::String16> aliases;
106972593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        UserState* userState = getUserState(userId);
107072593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        if (saw(prefix, &aliases, userId) != ::NO_ERROR) {
107196d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            return;
10724b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
10734b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        for (uint32_t i = 0; i < aliases.size(); i++) {
10744b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            android::String8 filename(aliases[i]);
10754b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            filename = android::String8::format("%s/%s", userState->getUserDirName(),
107696d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                                                getKeyName(filename).string());
107796d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            bool shouldDelete = true;
107896d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            if (keepUnenryptedEntries) {
107996d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                Blob blob;
108072593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                ResponseCode rc = get(filename, &blob, ::TYPE_ANY, userId);
108196d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker
108296d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                /* get can fail if the blob is encrypted and the state is
108396d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                 * not unlocked, only skip deleting blobs that were loaded and
108496d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                 * who are not encrypted. If there are blobs we fail to read for
108596d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                 * other reasons err on the safe side and delete them since we
108696d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                 * can't tell if they're encrypted.
108796d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                 */
108896d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                shouldDelete = !(rc == ::NO_ERROR && !blob.isEncrypted());
108996d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            }
109096d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            if (shouldDelete) {
109172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                del(filename, ::TYPE_ANY, userId);
109296d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            }
109396d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        }
109496d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        if (!userState->deleteMasterKey()) {
109596d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            ALOGE("Failed to delete user %d's master key", userId);
109696d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        }
109796d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        if (!keepUnenryptedEntries) {
109896d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            if(!userState->reset()) {
109996d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                ALOGE("Failed to remove user %d's directory", userId);
110096d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            }
11014b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
1102655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1103655b958eb2180c7c06889f83f606d23421bf038cKenny Root
110472593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    bool isEmpty(uid_t userId) const {
110572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        const UserState* userState = getUserState(userId);
110696d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        if (userState == NULL) {
1107655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return true;
1108655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1109655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1110655b958eb2180c7c06889f83f606d23421bf038cKenny Root        DIR* dir = opendir(userState->getUserDirName());
1111a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (!dir) {
1112a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return true;
1113a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
1114655b958eb2180c7c06889f83f606d23421bf038cKenny Root
111531e27468b6d822adbd2aec9219a68c206aa6957cKenny Root        bool result = true;
111631e27468b6d822adbd2aec9219a68c206aa6957cKenny Root        struct dirent* file;
1117a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        while ((file = readdir(dir)) != NULL) {
1118655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // We only care about files.
1119655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (file->d_type != DT_REG) {
1120655b958eb2180c7c06889f83f606d23421bf038cKenny Root                continue;
1121655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1122655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1123655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Skip anything that starts with a "."
1124655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (file->d_name[0] == '.') {
1125655b958eb2180c7c06889f83f606d23421bf038cKenny Root                continue;
1126655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1127655b958eb2180c7c06889f83f606d23421bf038cKenny Root
112831e27468b6d822adbd2aec9219a68c206aa6957cKenny Root            result = false;
112931e27468b6d822adbd2aec9219a68c206aa6957cKenny Root            break;
1130a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
1131a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        closedir(dir);
1132a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return result;
1133a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1134a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
113572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    void lock(uid_t userId) {
113672593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        UserState* userState = getUserState(userId);
1137655b958eb2180c7c06889f83f606d23421bf038cKenny Root        userState->zeroizeMasterKeysInMemory();
1138655b958eb2180c7c06889f83f606d23421bf038cKenny Root        userState->setState(STATE_LOCKED);
1139a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1140a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
114172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    ResponseCode get(const char* filename, Blob* keyBlob, const BlobType type, uid_t userId) {
114272593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        UserState* userState = getUserState(userId);
1143f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ResponseCode rc = keyBlob->readBlob(filename, userState->getDecryptionKey(),
1144f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                userState->getState());
1145822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (rc != NO_ERROR) {
1146822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return rc;
1147822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1148822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1149822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        const uint8_t version = keyBlob->getVersion();
115007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (version < CURRENT_BLOB_VERSION) {
1151cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root            /* If we upgrade the key, we need to write it to disk again. Then
1152cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root             * it must be read it again since the blob is encrypted each time
1153cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root             * it's written.
1154cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root             */
115572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker            if (upgradeBlob(filename, keyBlob, version, type, userId)) {
115672593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                if ((rc = this->put(filename, keyBlob, userId)) != NO_ERROR
1157f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                        || (rc = keyBlob->readBlob(filename, userState->getDecryptionKey(),
1158f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                                userState->getState())) != NO_ERROR) {
1159cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root                    return rc;
1160cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root                }
1161cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root            }
1162822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1163822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
116417208e0de5a42722901d803118745cca25fd10c1Kenny Root        /*
116517208e0de5a42722901d803118745cca25fd10c1Kenny Root         * This will upgrade software-backed keys to hardware-backed keys when
116617208e0de5a42722901d803118745cca25fd10c1Kenny Root         * the HAL for the device supports the newer key types.
116717208e0de5a42722901d803118745cca25fd10c1Kenny Root         */
116817208e0de5a42722901d803118745cca25fd10c1Kenny Root        if (rc == NO_ERROR && type == TYPE_KEY_PAIR
116917208e0de5a42722901d803118745cca25fd10c1Kenny Root                && mDevice->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_0_2
117017208e0de5a42722901d803118745cca25fd10c1Kenny Root                && keyBlob->isFallback()) {
117117208e0de5a42722901d803118745cca25fd10c1Kenny Root            ResponseCode imported = importKey(keyBlob->getValue(), keyBlob->getLength(), filename,
117272593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                    userId, keyBlob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
117317208e0de5a42722901d803118745cca25fd10c1Kenny Root
117417208e0de5a42722901d803118745cca25fd10c1Kenny Root            // The HAL allowed the import, reget the key to have the "fresh"
117517208e0de5a42722901d803118745cca25fd10c1Kenny Root            // version.
117617208e0de5a42722901d803118745cca25fd10c1Kenny Root            if (imported == NO_ERROR) {
117772593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                rc = get(filename, keyBlob, TYPE_KEY_PAIR, userId);
117817208e0de5a42722901d803118745cca25fd10c1Kenny Root            }
117917208e0de5a42722901d803118745cca25fd10c1Kenny Root        }
118017208e0de5a42722901d803118745cca25fd10c1Kenny Root
1181d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        if (type != TYPE_ANY && keyBlob->getType() != type) {
1182822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGW("key found but type doesn't match: %d vs %d", keyBlob->getType(), type);
1183822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return KEY_NOT_FOUND;
1184822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1185822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1186822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        return rc;
1187a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1188a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
118972593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    ResponseCode put(const char* filename, Blob* keyBlob, uid_t userId) {
119072593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        UserState* userState = getUserState(userId);
1191f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        return keyBlob->writeBlob(filename, userState->getEncryptionKey(), userState->getState(),
1192f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                mEntropy);
1193a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1194a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
119572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    ResponseCode del(const char *filename, const BlobType type, uid_t userId) {
11964b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        Blob keyBlob;
119772593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        ResponseCode rc = get(filename, &keyBlob, type, userId);
11984b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (rc != ::NO_ERROR) {
11994b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            return rc;
12004b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
12014b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12024b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (keyBlob.getType() == ::TYPE_KEY_PAIR) {
12034b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            // A device doesn't have to implement delete_keypair.
12044b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            if (mDevice->delete_keypair != NULL && !keyBlob.isFallback()) {
12054b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                if (mDevice->delete_keypair(mDevice, keyBlob.getValue(), keyBlob.getLength())) {
12064b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    rc = ::SYSTEM_ERROR;
12074b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                }
12084b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            }
12094b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
121017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (keyBlob.getType() == ::TYPE_KEYMASTER_10) {
121117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            keymaster1_device_t* dev = getDeviceForBlob(keyBlob);
121217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            if (dev->delete_key) {
121317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                keymaster_key_blob_t blob;
121417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                blob.key_material = keyBlob.getValue();
121517d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                blob.key_material_size = keyBlob.getLength();
121617d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                dev->delete_key(dev, &blob);
121717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            }
121817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
12194b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (rc != ::NO_ERROR) {
12204b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            return rc;
12214b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
12224b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12234b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        return (unlink(filename) && errno != ENOENT) ? ::SYSTEM_ERROR : ::NO_ERROR;
12244b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee    }
12254b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12264b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee    ResponseCode saw(const android::String8& prefix, android::Vector<android::String16> *matches,
122772593ee807e89239d98ae08d32c733ecc08203baChad Brubaker            uid_t userId) {
12284b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
122972593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        UserState* userState = getUserState(userId);
12304b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        size_t n = prefix.length();
12314b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12324b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        DIR* dir = opendir(userState->getUserDirName());
12334b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (!dir) {
12344b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            ALOGW("can't open directory for user: %s", strerror(errno));
12354b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            return ::SYSTEM_ERROR;
12364b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
12374b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12384b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        struct dirent* file;
12394b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        while ((file = readdir(dir)) != NULL) {
12404b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            // We only care about files.
12414b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            if (file->d_type != DT_REG) {
12424b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                continue;
12434b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            }
12444b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12454b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            // Skip anything that starts with a "."
12464b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            if (file->d_name[0] == '.') {
12474b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                continue;
12484b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            }
12494b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12504b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            if (!strncmp(prefix.string(), file->d_name, n)) {
12514b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                const char* p = &file->d_name[n];
12524b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                size_t plen = strlen(p);
12534b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12544b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                size_t extra = decode_key_length(p, plen);
12554b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                char *match = (char*) malloc(extra + 1);
12564b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                if (match != NULL) {
12574b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    decode_key(match, p, plen);
12584b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    matches->push(android::String16(match, extra));
12594b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    free(match);
12604b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                } else {
12614b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    ALOGW("could not allocate match of size %zd", extra);
12624b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                }
12634b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            }
12644b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
12654b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        closedir(dir);
12664b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        return ::NO_ERROR;
12674b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee    }
12684b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
126907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    void addGrant(const char* filename, uid_t granteeUid) {
1270655b958eb2180c7c06889f83f606d23421bf038cKenny Root        const grant_t* existing = getGrant(filename, granteeUid);
1271655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (existing == NULL) {
1272655b958eb2180c7c06889f83f606d23421bf038cKenny Root            grant_t* grant = new grant_t;
127307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            grant->uid = granteeUid;
1274a8c703d9fdd98e3caefb6e74cd03c2878cecd0a1Brian Carlstrom            grant->filename = reinterpret_cast<const uint8_t*>(strdup(filename));
1275655b958eb2180c7c06889f83f606d23421bf038cKenny Root            mGrants.add(grant);
127670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        }
127770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
127870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
127907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    bool removeGrant(const char* filename, uid_t granteeUid) {
1280655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<grant_t*>::iterator it(mGrants.begin());
1281655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mGrants.end(); it++) {
1282655b958eb2180c7c06889f83f606d23421bf038cKenny Root            grant_t* grant = *it;
1283655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (grant->uid == granteeUid
1284655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    && !strcmp(reinterpret_cast<const char*>(grant->filename), filename)) {
1285655b958eb2180c7c06889f83f606d23421bf038cKenny Root                mGrants.erase(it);
1286655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return true;
1287655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
128870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        }
128970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        return false;
129070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
129170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1292a8c703d9fdd98e3caefb6e74cd03c2878cecd0a1Brian Carlstrom    bool hasGrant(const char* filename, const uid_t uid) const {
1293a8c703d9fdd98e3caefb6e74cd03c2878cecd0a1Brian Carlstrom        return getGrant(filename, uid) != NULL;
129470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
129570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
129672593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    ResponseCode importKey(const uint8_t* key, size_t keyLen, const char* filename, uid_t userId,
1297f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            int32_t flags) {
1298822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        uint8_t* data;
1299822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        size_t dataLength;
1300822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        int rc;
1301822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1302822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (mDevice->import_keypair == NULL) {
1303822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGE("Keymaster doesn't support import!");
1304822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return SYSTEM_ERROR;
1305822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1306822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
130717208e0de5a42722901d803118745cca25fd10c1Kenny Root        bool isFallback = false;
130807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        rc = mDevice->import_keypair(mDevice, key, keyLen, &data, &dataLength);
1309822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (rc) {
1310a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root            /*
1311a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root             * Maybe the device doesn't support this type of key. Try to use the
1312a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root             * software fallback keymaster implementation. This is a little bit
1313a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root             * lazier than checking the PKCS#8 key type, but the software
1314a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root             * implementation will do that anyway.
1315a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root             */
13167c1eb75a6898452867ca28a4d7fad2d91edca615Chad Brubaker            rc = mFallbackDevice->import_keypair(mFallbackDevice, key, keyLen, &data, &dataLength);
1317a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root            isFallback = true;
131817208e0de5a42722901d803118745cca25fd10c1Kenny Root
131917208e0de5a42722901d803118745cca25fd10c1Kenny Root            if (rc) {
132017208e0de5a42722901d803118745cca25fd10c1Kenny Root                ALOGE("Error while importing keypair: %d", rc);
132117208e0de5a42722901d803118745cca25fd10c1Kenny Root                return SYSTEM_ERROR;
132217208e0de5a42722901d803118745cca25fd10c1Kenny Root            }
1323822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1324822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1325822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);
1326822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        free(data);
1327822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1328f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
132917208e0de5a42722901d803118745cca25fd10c1Kenny Root        keyBlob.setFallback(isFallback);
1330f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
133172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return put(filename, &keyBlob, userId);
1332822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
1333822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
13341b0e3933900c7ea21189704d5db64e7346aee7afKenny Root    bool isHardwareBacked(const android::String16& keyType) const {
13351b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        if (mDevice == NULL) {
13361b0e3933900c7ea21189704d5db64e7346aee7afKenny Root            ALOGW("can't get keymaster device");
13371b0e3933900c7ea21189704d5db64e7346aee7afKenny Root            return false;
13381b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        }
13391b0e3933900c7ea21189704d5db64e7346aee7afKenny Root
13401b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        if (sRSAKeyType == keyType) {
13411b0e3933900c7ea21189704d5db64e7346aee7afKenny Root            return (mDevice->flags & KEYMASTER_SOFTWARE_ONLY) == 0;
13421b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        } else {
13431b0e3933900c7ea21189704d5db64e7346aee7afKenny Root            return (mDevice->flags & KEYMASTER_SOFTWARE_ONLY) == 0
13441b0e3933900c7ea21189704d5db64e7346aee7afKenny Root                    && (mDevice->common.module->module_api_version
13451b0e3933900c7ea21189704d5db64e7346aee7afKenny Root                            >= KEYMASTER_MODULE_API_VERSION_0_2);
13461b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        }
13478ddf35a6e1fd80a7d0685041d2bfc77078277c9dKenny Root    }
13488ddf35a6e1fd80a7d0685041d2bfc77078277c9dKenny Root
1349655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode getKeyForName(Blob* keyBlob, const android::String8& keyName, const uid_t uid,
1350655b958eb2180c7c06889f83f606d23421bf038cKenny Root            const BlobType type) {
135186b16e8c0d353af97f0411917789308dba417295Kenny Root        android::String8 filepath8(getKeyNameForUidWithDir(keyName, uid));
135272593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        uid_t userId = get_user_id(uid);
1353a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
135472593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        ResponseCode responseCode = get(filepath8.string(), keyBlob, type, userId);
1355655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (responseCode == NO_ERROR) {
1356655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return responseCode;
1357655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1358a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1359655b958eb2180c7c06889f83f606d23421bf038cKenny Root        // If this is one of the legacy UID->UID mappings, use it.
1360655b958eb2180c7c06889f83f606d23421bf038cKenny Root        uid_t euid = get_keystore_euid(uid);
1361655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (euid != uid) {
136286b16e8c0d353af97f0411917789308dba417295Kenny Root            filepath8 = getKeyNameForUidWithDir(keyName, euid);
136372593ee807e89239d98ae08d32c733ecc08203baChad Brubaker            responseCode = get(filepath8.string(), keyBlob, type, userId);
1364655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (responseCode == NO_ERROR) {
1365655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return responseCode;
1366655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1367655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
136870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1369655b958eb2180c7c06889f83f606d23421bf038cKenny Root        // They might be using a granted key.
137086b16e8c0d353af97f0411917789308dba417295Kenny Root        android::String8 filename8 = getKeyName(keyName);
1371655b958eb2180c7c06889f83f606d23421bf038cKenny Root        char* end;
137286b16e8c0d353af97f0411917789308dba417295Kenny Root        strtoul(filename8.string(), &end, 10);
1373655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (end[0] != '_' || end[1] == 0) {
1374655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return KEY_NOT_FOUND;
1375655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
137672593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        filepath8 = android::String8::format("%s/%s", getUserState(userId)->getUserDirName(),
137786b16e8c0d353af97f0411917789308dba417295Kenny Root                filename8.string());
1378655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (!hasGrant(filepath8.string(), uid)) {
1379655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return responseCode;
1380a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
1381a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1382655b958eb2180c7c06889f83f606d23421bf038cKenny Root        // It is a granted key. Try to load it.
138372593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return get(filepath8.string(), keyBlob, type, userId);
1384a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1385a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1386655b958eb2180c7c06889f83f606d23421bf038cKenny Root    /**
1387655b958eb2180c7c06889f83f606d23421bf038cKenny Root     * Returns any existing UserState or creates it if it doesn't exist.
1388655b958eb2180c7c06889f83f606d23421bf038cKenny Root     */
138972593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    UserState* getUserState(uid_t userId) {
1390655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<UserState*>::iterator it(mMasterKeys.begin());
1391655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mMasterKeys.end(); it++) {
1392655b958eb2180c7c06889f83f606d23421bf038cKenny Root            UserState* state = *it;
1393655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (state->getUserId() == userId) {
1394655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return state;
1395655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1396a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
1397655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1398655b958eb2180c7c06889f83f606d23421bf038cKenny Root        UserState* userState = new UserState(userId);
1399655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (!userState->initialize()) {
1400655b958eb2180c7c06889f83f606d23421bf038cKenny Root            /* There's not much we can do if initialization fails. Trying to
1401655b958eb2180c7c06889f83f606d23421bf038cKenny Root             * unlock the keystore for that user will fail as well, so any
1402655b958eb2180c7c06889f83f606d23421bf038cKenny Root             * subsequent request for this user will just return SYSTEM_ERROR.
1403655b958eb2180c7c06889f83f606d23421bf038cKenny Root             */
1404655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGE("User initialization failed for %u; subsuquent operations will fail", userId);
1405a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
1406655b958eb2180c7c06889f83f606d23421bf038cKenny Root        mMasterKeys.add(userState);
1407655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return userState;
1408a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1409a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1410655b958eb2180c7c06889f83f606d23421bf038cKenny Root    /**
141172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker     * Returns any existing UserState or creates it if it doesn't exist.
1412655b958eb2180c7c06889f83f606d23421bf038cKenny Root     */
141372593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    UserState* getUserStateByUid(uid_t uid) {
1414655b958eb2180c7c06889f83f606d23421bf038cKenny Root        uid_t userId = get_user_id(uid);
141572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return getUserState(userId);
141672593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    }
1417655b958eb2180c7c06889f83f606d23421bf038cKenny Root
141872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    /**
141972593ee807e89239d98ae08d32c733ecc08203baChad Brubaker     * Returns NULL if the UserState doesn't already exist.
142072593ee807e89239d98ae08d32c733ecc08203baChad Brubaker     */
142172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    const UserState* getUserState(uid_t userId) const {
1422655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<UserState*>::const_iterator it(mMasterKeys.begin());
1423655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mMasterKeys.end(); it++) {
1424655b958eb2180c7c06889f83f606d23421bf038cKenny Root            UserState* state = *it;
1425655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (state->getUserId() == userId) {
1426655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return state;
1427655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1428655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1429a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1430655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return NULL;
1431a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1432a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
143372593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    /**
143472593ee807e89239d98ae08d32c733ecc08203baChad Brubaker     * Returns NULL if the UserState doesn't already exist.
143572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker     */
143672593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    const UserState* getUserStateByUid(uid_t uid) const {
143772593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        uid_t userId = get_user_id(uid);
143872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return getUserState(userId);
143972593ee807e89239d98ae08d32c733ecc08203baChad Brubaker    }
144072593ee807e89239d98ae08d32c733ecc08203baChad Brubaker
1441655b958eb2180c7c06889f83f606d23421bf038cKenny Rootprivate:
1442655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const char* sOldMasterKey;
1443655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const char* sMetaDataFile;
14441b0e3933900c7ea21189704d5db64e7346aee7afKenny Root    static const android::String16 sRSAKeyType;
1445655b958eb2180c7c06889f83f606d23421bf038cKenny Root    Entropy* mEntropy;
144607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
144767d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t* mDevice;
144867d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t* mFallbackDevice;
1449a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1450655b958eb2180c7c06889f83f606d23421bf038cKenny Root    android::Vector<UserState*> mMasterKeys;
1451655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1452655b958eb2180c7c06889f83f606d23421bf038cKenny Root    android::Vector<grant_t*> mGrants;
145370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1454655b958eb2180c7c06889f83f606d23421bf038cKenny Root    typedef struct {
1455655b958eb2180c7c06889f83f606d23421bf038cKenny Root        uint32_t version;
1456655b958eb2180c7c06889f83f606d23421bf038cKenny Root    } keystore_metadata_t;
145770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1458655b958eb2180c7c06889f83f606d23421bf038cKenny Root    keystore_metadata_t mMetaData;
1459655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1460655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const grant_t* getGrant(const char* filename, uid_t uid) const {
1461655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<grant_t*>::const_iterator it(mGrants.begin());
1462655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mGrants.end(); it++) {
1463655b958eb2180c7c06889f83f606d23421bf038cKenny Root            grant_t* grant = *it;
146470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root            if (grant->uid == uid
1465655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    && !strcmp(reinterpret_cast<const char*>(grant->filename), filename)) {
146670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root                return grant;
146770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root            }
146870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        }
146970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        return NULL;
147070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
147170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1472822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    /**
1473822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * Upgrade code. This will upgrade the key from the current version
1474822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * to whatever is newest.
1475822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     */
1476655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool upgradeBlob(const char* filename, Blob* blob, const uint8_t oldVersion,
1477655b958eb2180c7c06889f83f606d23421bf038cKenny Root            const BlobType type, uid_t uid) {
1478822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        bool updated = false;
1479822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        uint8_t version = oldVersion;
1480822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1481822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        /* From V0 -> V1: All old types were unknown */
1482822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (version == 0) {
1483822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGV("upgrading to version 1 and setting type %d", type);
1484822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1485822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            blob->setType(type);
1486822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            if (type == TYPE_KEY_PAIR) {
1487655b958eb2180c7c06889f83f606d23421bf038cKenny Root                importBlobAsKey(blob, filename, uid);
1488822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            }
1489822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            version = 1;
1490822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            updated = true;
1491822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1492822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1493f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        /* From V1 -> V2: All old keys were encrypted */
1494f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (version == 1) {
1495f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            ALOGV("upgrading to version 2");
1496f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
1497f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            blob->setEncrypted(true);
1498f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            version = 2;
1499f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            updated = true;
1500f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        }
1501f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
1502822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        /*
1503822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root         * If we've updated, set the key blob to the right version
1504822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root         * and write it.
1505cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root         */
1506822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (updated) {
1507822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGV("updated and writing file %s", filename);
1508822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            blob->setVersion(version);
1509822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1510cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root
1511cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root        return updated;
1512822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
1513822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1514822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    /**
1515822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * Takes a blob that is an PEM-encoded RSA key as a byte array and
1516822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * converts it to a DER-encoded PKCS#8 for import into a keymaster.
1517822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * Then it overwrites the original blob with the new blob
1518822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * format that is returned from the keymaster.
1519822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     */
1520655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode importBlobAsKey(Blob* blob, const char* filename, uid_t uid) {
1521822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        // We won't even write to the blob directly with this BIO, so const_cast is okay.
1522822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        Unique_BIO b(BIO_new_mem_buf(const_cast<uint8_t*>(blob->getValue()), blob->getLength()));
1523822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (b.get() == NULL) {
1524822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGE("Problem instantiating BIO");
1525822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return SYSTEM_ERROR;
1526822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1527822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1528822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        Unique_EVP_PKEY pkey(PEM_read_bio_PrivateKey(b.get(), NULL, NULL, NULL));
1529822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (pkey.get() == NULL) {
1530822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGE("Couldn't read old PEM file");
1531822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return SYSTEM_ERROR;
1532822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1533822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1534822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        Unique_PKCS8_PRIV_KEY_INFO pkcs8(EVP_PKEY2PKCS8(pkey.get()));
1535822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        int len = i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), NULL);
1536822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (len < 0) {
1537822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGE("Couldn't measure PKCS#8 length");
1538822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return SYSTEM_ERROR;
1539822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1540822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
154170c9889c5ca912e7c492580e1999f18ab65b267bKenny Root        UniquePtr<unsigned char[]> pkcs8key(new unsigned char[len]);
154270c9889c5ca912e7c492580e1999f18ab65b267bKenny Root        uint8_t* tmp = pkcs8key.get();
1543822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), &tmp) != len) {
1544822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGE("Couldn't convert to PKCS#8");
1545822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return SYSTEM_ERROR;
1546822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1547822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
154872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        ResponseCode rc = importKey(pkcs8key.get(), len, filename, get_user_id(uid),
1549f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                blob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
1550822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (rc != NO_ERROR) {
1551822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return rc;
1552822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1553822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1554655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return get(filename, blob, TYPE_KEY_PAIR, uid);
1555822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
155670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1557655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void readMetaData() {
1558655b958eb2180c7c06889f83f606d23421bf038cKenny Root        int in = TEMP_FAILURE_RETRY(open(sMetaDataFile, O_RDONLY));
1559655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (in < 0) {
1560655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return;
1561655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1562655b958eb2180c7c06889f83f606d23421bf038cKenny Root        size_t fileLength = readFully(in, (uint8_t*) &mMetaData, sizeof(mMetaData));
1563655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (fileLength != sizeof(mMetaData)) {
1564655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGI("Metadata file is %zd bytes (%zd experted); upgrade?", fileLength,
1565655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    sizeof(mMetaData));
1566655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1567655b958eb2180c7c06889f83f606d23421bf038cKenny Root        close(in);
156870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
156970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1570655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void writeMetaData() {
1571655b958eb2180c7c06889f83f606d23421bf038cKenny Root        const char* tmpFileName = ".metadata.tmp";
1572655b958eb2180c7c06889f83f606d23421bf038cKenny Root        int out = TEMP_FAILURE_RETRY(open(tmpFileName,
1573655b958eb2180c7c06889f83f606d23421bf038cKenny Root                O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR));
1574655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (out < 0) {
1575655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGE("couldn't write metadata file: %s", strerror(errno));
1576655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return;
1577655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1578655b958eb2180c7c06889f83f606d23421bf038cKenny Root        size_t fileLength = writeFully(out, (uint8_t*) &mMetaData, sizeof(mMetaData));
1579655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (fileLength != sizeof(mMetaData)) {
1580655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGI("Could only write %zd bytes to metadata file (%zd expected)", fileLength,
1581655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    sizeof(mMetaData));
158270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        }
1583655b958eb2180c7c06889f83f606d23421bf038cKenny Root        close(out);
1584655b958eb2180c7c06889f83f606d23421bf038cKenny Root        rename(tmpFileName, sMetaDataFile);
158570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
158670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1587655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool upgradeKeystore() {
1588655b958eb2180c7c06889f83f606d23421bf038cKenny Root        bool upgraded = false;
1589655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1590655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (mMetaData.version == 0) {
159172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker            UserState* userState = getUserStateByUid(0);
1592655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1593655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Initialize first so the directory is made.
1594655b958eb2180c7c06889f83f606d23421bf038cKenny Root            userState->initialize();
1595655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1596655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Migrate the old .masterkey file to user 0.
1597655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (access(sOldMasterKey, R_OK) == 0) {
1598655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (rename(sOldMasterKey, userState->getMasterKeyFileName()) < 0) {
1599655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    ALOGE("couldn't migrate old masterkey: %s", strerror(errno));
1600655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    return false;
1601655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1602655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1603655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1604655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Initialize again in case we had a key.
1605655b958eb2180c7c06889f83f606d23421bf038cKenny Root            userState->initialize();
1606655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1607655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Try to migrate existing keys.
1608655b958eb2180c7c06889f83f606d23421bf038cKenny Root            DIR* dir = opendir(".");
1609655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (!dir) {
1610655b958eb2180c7c06889f83f606d23421bf038cKenny Root                // Give up now; maybe we can upgrade later.
1611655b958eb2180c7c06889f83f606d23421bf038cKenny Root                ALOGE("couldn't open keystore's directory; something is wrong");
1612655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return false;
1613655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1614655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1615655b958eb2180c7c06889f83f606d23421bf038cKenny Root            struct dirent* file;
1616655b958eb2180c7c06889f83f606d23421bf038cKenny Root            while ((file = readdir(dir)) != NULL) {
1617655b958eb2180c7c06889f83f606d23421bf038cKenny Root                // We only care about files.
1618655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (file->d_type != DT_REG) {
1619655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    continue;
1620655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1621655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1622655b958eb2180c7c06889f83f606d23421bf038cKenny Root                // Skip anything that starts with a "."
1623655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (file->d_name[0] == '.') {
1624655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    continue;
1625655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1626655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1627655b958eb2180c7c06889f83f606d23421bf038cKenny Root                // Find the current file's user.
1628655b958eb2180c7c06889f83f606d23421bf038cKenny Root                char* end;
1629655b958eb2180c7c06889f83f606d23421bf038cKenny Root                unsigned long thisUid = strtoul(file->d_name, &end, 10);
1630655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (end[0] != '_' || end[1] == 0) {
1631655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    continue;
1632655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
163372593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                UserState* otherUser = getUserStateByUid(thisUid);
1634655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (otherUser->getUserId() != 0) {
1635655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    unlinkat(dirfd(dir), file->d_name, 0);
1636655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1637655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1638655b958eb2180c7c06889f83f606d23421bf038cKenny Root                // Rename the file into user directory.
1639655b958eb2180c7c06889f83f606d23421bf038cKenny Root                DIR* otherdir = opendir(otherUser->getUserDirName());
1640655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (otherdir == NULL) {
1641655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    ALOGW("couldn't open user directory for rename");
1642655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    continue;
1643655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1644655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (renameat(dirfd(dir), file->d_name, dirfd(otherdir), file->d_name) < 0) {
1645655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    ALOGW("couldn't rename blob: %s: %s", file->d_name, strerror(errno));
1646655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1647655b958eb2180c7c06889f83f606d23421bf038cKenny Root                closedir(otherdir);
1648655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1649655b958eb2180c7c06889f83f606d23421bf038cKenny Root            closedir(dir);
1650655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1651655b958eb2180c7c06889f83f606d23421bf038cKenny Root            mMetaData.version = 1;
1652655b958eb2180c7c06889f83f606d23421bf038cKenny Root            upgraded = true;
1653655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1654655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1655655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return upgraded;
165670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
1657655b958eb2180c7c06889f83f606d23421bf038cKenny Root};
165870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1659655b958eb2180c7c06889f83f606d23421bf038cKenny Rootconst char* KeyStore::sOldMasterKey = ".masterkey";
1660655b958eb2180c7c06889f83f606d23421bf038cKenny Rootconst char* KeyStore::sMetaDataFile = ".metadata";
166170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
16621b0e3933900c7ea21189704d5db64e7346aee7afKenny Rootconst android::String16 KeyStore::sRSAKeyType("RSA");
16631b0e3933900c7ea21189704d5db64e7346aee7afKenny Root
166407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootnamespace android {
166507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootclass KeyStoreProxy : public BnKeystoreService, public IBinder::DeathRecipient {
166607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootpublic:
166707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    KeyStoreProxy(KeyStore* keyStore)
166840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        : mKeyStore(keyStore),
166940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker          mOperationMap(this)
167007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {
167107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
1672a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
167340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    void binderDied(const wp<IBinder>& who) {
167440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        auto operations = mOperationMap.getOperationsForToken(who.unsafe_get());
167540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        for (auto token: operations) {
167640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            abort(token);
167740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
167807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
1679a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
168007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t test() {
16819489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_TEST)) {
168207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
168307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
1684a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
168572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->getState(get_user_id(IPCThreadState::self()->getCallingUid()));
1686a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1687a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
168807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t get(const String16& name, uint8_t** item, size_t* itemLength) {
16899489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_GET)) {
169007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
169107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
1692a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
16939489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
169407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
169507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob;
169666dbf67dd65b4808a15ef64f0ffde1275bdd58a9Nick Kralevich
1697655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
1698494689083467ec372a58f094f041c8f102f39393Kenny Root                TYPE_GENERIC);
169907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (responseCode != ::NO_ERROR) {
1700655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGW("Could not read %s", name8.string());
170107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            *item = NULL;
170207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            *itemLength = 0;
170307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return responseCode;
170407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
170507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
170607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        *item = (uint8_t*) malloc(keyBlob.getLength());
170707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        memcpy(*item, keyBlob.getValue(), keyBlob.getLength());
170807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        *itemLength = keyBlob.getLength();
170907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
171007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
1711a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1712a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1713f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    int32_t insert(const String16& name, const uint8_t* item, size_t itemLength, int targetUid,
1714f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            int32_t flags) {
17159489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
17169489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int32_t result = checkBinderPermissionAndKeystoreState(P_INSERT, targetUid,
17179489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                    flags & KEYSTORE_FLAG_ENCRYPTED);
17189489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (result != ::NO_ERROR) {
17199489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return result;
1720b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root        }
1721b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root
172207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
1723655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
172407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
172507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob(item, itemLength, NULL, 0, ::TYPE_GENERIC);
1726ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root        keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
1727ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root
172872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->put(filename.string(), &keyBlob, get_user_id(targetUid));
1729a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1730a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1731494689083467ec372a58f094f041c8f102f39393Kenny Root    int32_t del(const String16& name, int targetUid) {
17329489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
17339489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_DELETE, targetUid)) {
1734b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root            return ::PERMISSION_DENIED;
1735b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root        }
173607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
1737655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
173872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->del(filename.string(), ::TYPE_ANY, get_user_id(targetUid));
1739298e7b1b0f9116e2054d594d7538379d86585035Kenny Root    }
1740298e7b1b0f9116e2054d594d7538379d86585035Kenny Root
1741494689083467ec372a58f094f041c8f102f39393Kenny Root    int32_t exist(const String16& name, int targetUid) {
17429489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
17439489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_EXIST, targetUid)) {
1744b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root            return ::PERMISSION_DENIED;
1745b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root        }
1746b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root
174707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
1748655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
174907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
1750655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(filename.string(), R_OK) == -1) {
175107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
175207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
175307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
1754298e7b1b0f9116e2054d594d7538379d86585035Kenny Root    }
1755298e7b1b0f9116e2054d594d7538379d86585035Kenny Root
1756494689083467ec372a58f094f041c8f102f39393Kenny Root    int32_t saw(const String16& prefix, int targetUid, Vector<String16>* matches) {
17579489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
17589489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_SAW, targetUid)) {
1759b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root            return ::PERMISSION_DENIED;
1760b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root        }
176107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        const String8 prefix8(prefix);
1762655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUid(prefix8, targetUid));
176307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
176472593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        if (mKeyStore->saw(filename, matches, get_user_id(targetUid)) != ::NO_ERROR) {
17654b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            return ::SYSTEM_ERROR;
176607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
176707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
1768298e7b1b0f9116e2054d594d7538379d86585035Kenny Root    }
1769298e7b1b0f9116e2054d594d7538379d86585035Kenny Root
177007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t reset() {
17719489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_RESET)) {
177207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
177307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
1774a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
17759489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
177696d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        mKeyStore->resetUser(get_user_id(callingUid), false);
177796d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        return ::NO_ERROR;
1778a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1779a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
178096d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker    int32_t onUserPasswordChanged(int32_t userId, const String16& password) {
17819489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_PASSWORD)) {
178207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
178307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
1784a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
178507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        const String8 password8(password);
178696d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        // Flush the auth token table to prevent stale tokens from sticking
178796d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        // around.
178896d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        mAuthTokenTable.Clear();
178996d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker
179096d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        if (password.size() == 0) {
179196d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            ALOGI("Secure lockscreen for user %d removed, deleting encrypted entries", userId);
179272593ee807e89239d98ae08d32c733ecc08203baChad Brubaker            mKeyStore->resetUser(userId, true);
179396d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            return ::NO_ERROR;
179496d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        } else {
179572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker            switch (mKeyStore->getState(userId)) {
179696d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                case ::STATE_UNINITIALIZED: {
179796d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                    // generate master key, encrypt with password, write to file,
179896d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                    // initialize mMasterKey*.
179972593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                    return mKeyStore->initializeUser(password8, userId);
180096d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                }
180196d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                case ::STATE_NO_ERROR: {
180296d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                    // rewrite master key with new password.
180372593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                    return mKeyStore->writeMasterKey(password8, userId);
180496d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                }
180596d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                case ::STATE_LOCKED: {
180696d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                    ALOGE("Changing user %d's password while locked, clearing old encryption",
180796d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                          userId);
180872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                    mKeyStore->resetUser(userId, true);
180972593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                    return mKeyStore->initializeUser(password8, userId);
181096d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker                }
181107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            }
181296d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            return ::SYSTEM_ERROR;
181307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
181407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
1815a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
181607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t lock() {
18179489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_LOCK)) {
181807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
181907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
182007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
182172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        uid_t userId = get_user_id(IPCThreadState::self()->getCallingUid());
182272593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        State state = mKeyStore->getState(userId);
18239d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        if (state != ::STATE_NO_ERROR) {
182407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGD("calling lock in state: %d", state);
182507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return state;
182607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
182770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
182872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        mKeyStore->lock(userId);
182907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
183070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
1831a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
183296d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker    int32_t unlock(int32_t userId, const String16& pw) {
18339489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_UNLOCK)) {
183407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
183507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
183607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
183772593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        State state = mKeyStore->getState(userId);
18389d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        if (state != ::STATE_LOCKED) {
183996d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker            ALOGI("calling unlock when not locked, ignoring.");
184007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return state;
184107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
184207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
184307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        const String8 password8(pw);
184496d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        // read master key, decrypt with password, initialize mMasterKey*.
184572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->readMasterKey(password8, userId);
184670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
184770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
184807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t zero() {
18499489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_ZERO)) {
185007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return -1;
185107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
185270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
18539489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
185472593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->isEmpty(get_user_id(callingUid)) ? ::KEY_NOT_FOUND : ::NO_ERROR;
185570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
185670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
185796427baf0094d50047049d329b0779c3c910402cKenny Root    int32_t generate(const String16& name, int32_t targetUid, int32_t keyType, int32_t keySize,
185896427baf0094d50047049d329b0779c3c910402cKenny Root            int32_t flags, Vector<sp<KeystoreArg> >* args) {
18599489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
18609489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int32_t result = checkBinderPermissionAndKeystoreState(P_INSERT, targetUid,
18619489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                       flags & KEYSTORE_FLAG_ENCRYPTED);
18629489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (result != ::NO_ERROR) {
18639489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return result;
186407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
186507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        uint8_t* data;
186607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        size_t dataLength;
186707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        int rc;
186817208e0de5a42722901d803118745cca25fd10c1Kenny Root        bool isFallback = false;
186970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
187067d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker        const keymaster1_device_t* device = mKeyStore->getDevice();
187167d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker        const keymaster1_device_t* fallback = mKeyStore->getFallbackDevice();
187207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device == NULL) {
187307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
187407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
187570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
187607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device->generate_keypair == NULL) {
187707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
187807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
187970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
188017208e0de5a42722901d803118745cca25fd10c1Kenny Root        if (keyType == EVP_PKEY_DSA) {
188196427baf0094d50047049d329b0779c3c910402cKenny Root            keymaster_dsa_keygen_params_t dsa_params;
188296427baf0094d50047049d329b0779c3c910402cKenny Root            memset(&dsa_params, '\0', sizeof(dsa_params));
188396427baf0094d50047049d329b0779c3c910402cKenny Root
188496427baf0094d50047049d329b0779c3c910402cKenny Root            if (keySize == -1) {
188596427baf0094d50047049d329b0779c3c910402cKenny Root                keySize = DSA_DEFAULT_KEY_SIZE;
188696427baf0094d50047049d329b0779c3c910402cKenny Root            } else if ((keySize % 64) != 0 || keySize < DSA_MIN_KEY_SIZE
188796427baf0094d50047049d329b0779c3c910402cKenny Root                    || keySize > DSA_MAX_KEY_SIZE) {
188896427baf0094d50047049d329b0779c3c910402cKenny Root                ALOGI("invalid key size %d", keySize);
188996427baf0094d50047049d329b0779c3c910402cKenny Root                return ::SYSTEM_ERROR;
189096427baf0094d50047049d329b0779c3c910402cKenny Root            }
189196427baf0094d50047049d329b0779c3c910402cKenny Root            dsa_params.key_size = keySize;
189296427baf0094d50047049d329b0779c3c910402cKenny Root
189396427baf0094d50047049d329b0779c3c910402cKenny Root            if (args->size() == 3) {
189496427baf0094d50047049d329b0779c3c910402cKenny Root                sp<KeystoreArg> gArg = args->itemAt(0);
189596427baf0094d50047049d329b0779c3c910402cKenny Root                sp<KeystoreArg> pArg = args->itemAt(1);
189696427baf0094d50047049d329b0779c3c910402cKenny Root                sp<KeystoreArg> qArg = args->itemAt(2);
189796427baf0094d50047049d329b0779c3c910402cKenny Root
189896427baf0094d50047049d329b0779c3c910402cKenny Root                if (gArg != NULL && pArg != NULL && qArg != NULL) {
189996427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.generator = reinterpret_cast<const uint8_t*>(gArg->data());
190096427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.generator_len = gArg->size();
190196427baf0094d50047049d329b0779c3c910402cKenny Root
190296427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.prime_p = reinterpret_cast<const uint8_t*>(pArg->data());
190396427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.prime_p_len = pArg->size();
190496427baf0094d50047049d329b0779c3c910402cKenny Root
190596427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.prime_q = reinterpret_cast<const uint8_t*>(qArg->data());
190696427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.prime_q_len = qArg->size();
190796427baf0094d50047049d329b0779c3c910402cKenny Root                } else {
190896427baf0094d50047049d329b0779c3c910402cKenny Root                    ALOGI("not all DSA parameters were read");
190996427baf0094d50047049d329b0779c3c910402cKenny Root                    return ::SYSTEM_ERROR;
191096427baf0094d50047049d329b0779c3c910402cKenny Root                }
191196427baf0094d50047049d329b0779c3c910402cKenny Root            } else if (args->size() != 0) {
191296427baf0094d50047049d329b0779c3c910402cKenny Root                ALOGI("DSA args must be 3");
191396427baf0094d50047049d329b0779c3c910402cKenny Root                return ::SYSTEM_ERROR;
191496427baf0094d50047049d329b0779c3c910402cKenny Root            }
191596427baf0094d50047049d329b0779c3c910402cKenny Root
19161d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            if (isKeyTypeSupported(device, TYPE_DSA)) {
191717208e0de5a42722901d803118745cca25fd10c1Kenny Root                rc = device->generate_keypair(device, TYPE_DSA, &dsa_params, &data, &dataLength);
191817208e0de5a42722901d803118745cca25fd10c1Kenny Root            } else {
191917208e0de5a42722901d803118745cca25fd10c1Kenny Root                isFallback = true;
1920fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                rc = fallback->generate_keypair(fallback, TYPE_DSA, &dsa_params, &data,
1921fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                                                &dataLength);
192217208e0de5a42722901d803118745cca25fd10c1Kenny Root            }
192317208e0de5a42722901d803118745cca25fd10c1Kenny Root        } else if (keyType == EVP_PKEY_EC) {
192496427baf0094d50047049d329b0779c3c910402cKenny Root            keymaster_ec_keygen_params_t ec_params;
192596427baf0094d50047049d329b0779c3c910402cKenny Root            memset(&ec_params, '\0', sizeof(ec_params));
192696427baf0094d50047049d329b0779c3c910402cKenny Root
192796427baf0094d50047049d329b0779c3c910402cKenny Root            if (keySize == -1) {
192896427baf0094d50047049d329b0779c3c910402cKenny Root                keySize = EC_DEFAULT_KEY_SIZE;
192996427baf0094d50047049d329b0779c3c910402cKenny Root            } else if (keySize < EC_MIN_KEY_SIZE || keySize > EC_MAX_KEY_SIZE) {
193096427baf0094d50047049d329b0779c3c910402cKenny Root                ALOGI("invalid key size %d", keySize);
193196427baf0094d50047049d329b0779c3c910402cKenny Root                return ::SYSTEM_ERROR;
193296427baf0094d50047049d329b0779c3c910402cKenny Root            }
193396427baf0094d50047049d329b0779c3c910402cKenny Root            ec_params.field_size = keySize;
193496427baf0094d50047049d329b0779c3c910402cKenny Root
19351d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            if (isKeyTypeSupported(device, TYPE_EC)) {
193617208e0de5a42722901d803118745cca25fd10c1Kenny Root                rc = device->generate_keypair(device, TYPE_EC, &ec_params, &data, &dataLength);
193717208e0de5a42722901d803118745cca25fd10c1Kenny Root            } else {
193817208e0de5a42722901d803118745cca25fd10c1Kenny Root                isFallback = true;
1939fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                rc = fallback->generate_keypair(fallback, TYPE_EC, &ec_params, &data, &dataLength);
194017208e0de5a42722901d803118745cca25fd10c1Kenny Root            }
194196427baf0094d50047049d329b0779c3c910402cKenny Root        } else if (keyType == EVP_PKEY_RSA) {
194296427baf0094d50047049d329b0779c3c910402cKenny Root            keymaster_rsa_keygen_params_t rsa_params;
194396427baf0094d50047049d329b0779c3c910402cKenny Root            memset(&rsa_params, '\0', sizeof(rsa_params));
194496427baf0094d50047049d329b0779c3c910402cKenny Root            rsa_params.public_exponent = RSA_DEFAULT_EXPONENT;
194596427baf0094d50047049d329b0779c3c910402cKenny Root
194696427baf0094d50047049d329b0779c3c910402cKenny Root            if (keySize == -1) {
194796427baf0094d50047049d329b0779c3c910402cKenny Root                keySize = RSA_DEFAULT_KEY_SIZE;
194896427baf0094d50047049d329b0779c3c910402cKenny Root            } else if (keySize < RSA_MIN_KEY_SIZE || keySize > RSA_MAX_KEY_SIZE) {
194996427baf0094d50047049d329b0779c3c910402cKenny Root                ALOGI("invalid key size %d", keySize);
195096427baf0094d50047049d329b0779c3c910402cKenny Root                return ::SYSTEM_ERROR;
195196427baf0094d50047049d329b0779c3c910402cKenny Root            }
195296427baf0094d50047049d329b0779c3c910402cKenny Root            rsa_params.modulus_size = keySize;
195396427baf0094d50047049d329b0779c3c910402cKenny Root
195496427baf0094d50047049d329b0779c3c910402cKenny Root            if (args->size() > 1) {
19556489e02e134e4779d35c4a340ff68ad445fde133Matteo Franchin                ALOGI("invalid number of arguments: %zu", args->size());
195696427baf0094d50047049d329b0779c3c910402cKenny Root                return ::SYSTEM_ERROR;
195796427baf0094d50047049d329b0779c3c910402cKenny Root            } else if (args->size() == 1) {
195896427baf0094d50047049d329b0779c3c910402cKenny Root                sp<KeystoreArg> pubExpBlob = args->itemAt(0);
195996427baf0094d50047049d329b0779c3c910402cKenny Root                if (pubExpBlob != NULL) {
196096427baf0094d50047049d329b0779c3c910402cKenny Root                    Unique_BIGNUM pubExpBn(
196196427baf0094d50047049d329b0779c3c910402cKenny Root                            BN_bin2bn(reinterpret_cast<const unsigned char*>(pubExpBlob->data()),
196296427baf0094d50047049d329b0779c3c910402cKenny Root                                    pubExpBlob->size(), NULL));
196396427baf0094d50047049d329b0779c3c910402cKenny Root                    if (pubExpBn.get() == NULL) {
196496427baf0094d50047049d329b0779c3c910402cKenny Root                        ALOGI("Could not convert public exponent to BN");
196596427baf0094d50047049d329b0779c3c910402cKenny Root                        return ::SYSTEM_ERROR;
196696427baf0094d50047049d329b0779c3c910402cKenny Root                    }
196796427baf0094d50047049d329b0779c3c910402cKenny Root                    unsigned long pubExp = BN_get_word(pubExpBn.get());
196896427baf0094d50047049d329b0779c3c910402cKenny Root                    if (pubExp == 0xFFFFFFFFL) {
196996427baf0094d50047049d329b0779c3c910402cKenny Root                        ALOGI("cannot represent public exponent as a long value");
197096427baf0094d50047049d329b0779c3c910402cKenny Root                        return ::SYSTEM_ERROR;
197196427baf0094d50047049d329b0779c3c910402cKenny Root                    }
197296427baf0094d50047049d329b0779c3c910402cKenny Root                    rsa_params.public_exponent = pubExp;
197396427baf0094d50047049d329b0779c3c910402cKenny Root                }
197496427baf0094d50047049d329b0779c3c910402cKenny Root            }
197596427baf0094d50047049d329b0779c3c910402cKenny Root
197696427baf0094d50047049d329b0779c3c910402cKenny Root            rc = device->generate_keypair(device, TYPE_RSA, &rsa_params, &data, &dataLength);
197796427baf0094d50047049d329b0779c3c910402cKenny Root        } else {
197896427baf0094d50047049d329b0779c3c910402cKenny Root            ALOGW("Unsupported key type %d", keyType);
197996427baf0094d50047049d329b0779c3c910402cKenny Root            rc = -1;
198096427baf0094d50047049d329b0779c3c910402cKenny Root        }
198170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
198207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (rc) {
198307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
198407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
198570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1986655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 name8(name);
19879489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
198870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
198907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);
199007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        free(data);
199107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
1992ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root        keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
199317208e0de5a42722901d803118745cca25fd10c1Kenny Root        keyBlob.setFallback(isFallback);
199417208e0de5a42722901d803118745cca25fd10c1Kenny Root
199572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->put(filename.string(), &keyBlob, get_user_id(targetUid));
199670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
199770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1998f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    int32_t import(const String16& name, const uint8_t* data, size_t length, int targetUid,
1999f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            int32_t flags) {
20009489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
20019489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int32_t result = checkBinderPermissionAndKeystoreState(P_INSERT, targetUid,
20029489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                       flags & KEYSTORE_FLAG_ENCRYPTED);
20039489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (result != ::NO_ERROR) {
20049489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return result;
200507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
200607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
200760898896c3f3b2245d10076cac64346c956dbaa5Kenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
200870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
200972593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->importKey(data, length, filename.string(), get_user_id(targetUid),
201072593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                                    flags);
201170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
201270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
201307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t sign(const String16& name, const uint8_t* data, size_t length, uint8_t** out,
201407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            size_t* outLength) {
20159489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_SIGN)) {
201607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
201707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
20189a53d3eaf42104ddf02feeccec3cf7f5c1a34baeKenny Root
20199489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
202007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob;
202107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
202270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
2023d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        ALOGV("sign %s from uid %d", name8.string(), callingUid);
202470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
2025655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
2026d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root                ::TYPE_KEY_PAIR);
202707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (responseCode != ::NO_ERROR) {
202807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return responseCode;
202907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
203070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
203167d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker        const keymaster1_device_t* device = mKeyStore->getDeviceForBlob(keyBlob);
203207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device == NULL) {
203307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGE("no keymaster device; cannot sign");
203407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
203507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
203670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
203707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device->sign_data == NULL) {
203807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGE("device doesn't implement signing");
203907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
204007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
204170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
204207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        keymaster_rsa_sign_params_t params;
204307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        params.digest_type = DIGEST_NONE;
204407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        params.padding_type = PADDING_NONE;
20459489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int rc = device->sign_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2046fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                length, out, outLength);
204707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (rc) {
204807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGW("device couldn't sign data");
204907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
205007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
205170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
205207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
205370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
205470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
205507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t verify(const String16& name, const uint8_t* data, size_t dataLength,
205607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            const uint8_t* signature, size_t signatureLength) {
20579489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_VERIFY)) {
205807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
205907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
206070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
20619489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
206207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob;
206307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
206407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        int rc;
206570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
2066655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
2067494689083467ec372a58f094f041c8f102f39393Kenny Root                TYPE_KEY_PAIR);
206807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (responseCode != ::NO_ERROR) {
206907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return responseCode;
207007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
207170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
207267d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker        const keymaster1_device_t* device = mKeyStore->getDeviceForBlob(keyBlob);
207307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device == NULL) {
207407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
207507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
207670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
207707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device->verify_data == NULL) {
207807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
207907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
208007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
208107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        keymaster_rsa_sign_params_t params;
208207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        params.digest_type = DIGEST_NONE;
208307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        params.padding_type = PADDING_NONE;
208470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
2085fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        rc = device->verify_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2086fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                dataLength, signature, signatureLength);
208707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (rc) {
208807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
208907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        } else {
209007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::NO_ERROR;
209107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
209270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
209370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
209407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    /*
209507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * TODO: The abstraction between things stored in hardware and regular blobs
209607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * of data stored on the filesystem should be moved down to keystore itself.
209707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * Unfortunately the Java code that calls this has naming conventions that it
209807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * knows about. Ideally keystore shouldn't be used to store random blobs of
209907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * data.
210007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     *
210107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * Until that happens, it's necessary to have a separate "get_pubkey" and
210207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * "del_key" since the Java code doesn't really communicate what it's
210307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * intentions are.
210407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     */
210507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t get_pubkey(const String16& name, uint8_t** pubkey, size_t* pubkeyLength) {
2106d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        uid_t callingUid = IPCThreadState::self()->getCallingUid();
21079489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_GET)) {
2108d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root            ALOGW("permission denied for %d: get_pubkey", callingUid);
210907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
211007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
211170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
211207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob;
211307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
211470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
2115d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        ALOGV("get_pubkey '%s' from uid %d", name8.string(), callingUid);
211670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
2117655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
211807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root                TYPE_KEY_PAIR);
211907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (responseCode != ::NO_ERROR) {
212007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return responseCode;
212107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
212270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
212367d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker        const keymaster1_device_t* device = mKeyStore->getDeviceForBlob(keyBlob);
212407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device == NULL) {
212507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
212607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
212770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
212807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device->get_keypair_public == NULL) {
212907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGE("device has no get_keypair_public implementation!");
213007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
213107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
2132344e0bc23ca46b9acec97ac8bcd87949bde0ccabKenny Root
213317208e0de5a42722901d803118745cca25fd10c1Kenny Root        int rc;
2134fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        rc = device->get_keypair_public(device, keyBlob.getValue(), keyBlob.getLength(), pubkey,
2135fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                pubkeyLength);
213607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (rc) {
213707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
213807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
2139344e0bc23ca46b9acec97ac8bcd87949bde0ccabKenny Root
214007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
2141344e0bc23ca46b9acec97ac8bcd87949bde0ccabKenny Root    }
2142344e0bc23ca46b9acec97ac8bcd87949bde0ccabKenny Root
2143494689083467ec372a58f094f041c8f102f39393Kenny Root    int32_t del_key(const String16& name, int targetUid) {
21449489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return del(name, targetUid);
2145a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
214607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
214707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t grant(const String16& name, int32_t granteeUid) {
2148d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        uid_t callingUid = IPCThreadState::self()->getCallingUid();
21499489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int32_t result = checkBinderPermissionAndKeystoreState(P_GRANT);
21509489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (result != ::NO_ERROR) {
21519489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return result;
215207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
215307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
215407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
2155655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
215607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2157655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(filename.string(), R_OK) == -1) {
215807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
215907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
216007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2161655b958eb2180c7c06889f83f606d23421bf038cKenny Root        mKeyStore->addGrant(filename.string(), granteeUid);
216207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
2163a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
216407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
216507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t ungrant(const String16& name, int32_t granteeUid) {
2166d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        uid_t callingUid = IPCThreadState::self()->getCallingUid();
21679489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int32_t result = checkBinderPermissionAndKeystoreState(P_GRANT);
21689489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (result != ::NO_ERROR) {
21699489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return result;
217007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
217107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
217207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
2173655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
217407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2175655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(filename.string(), R_OK) == -1) {
217607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
217707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
217807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2179655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mKeyStore->removeGrant(filename.string(), granteeUid) ? ::NO_ERROR : ::KEY_NOT_FOUND;
2180a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
218107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
218207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int64_t getmtime(const String16& name) {
2183d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        uid_t callingUid = IPCThreadState::self()->getCallingUid();
21849489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_GET)) {
2185d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root            ALOGW("permission denied for %d: getmtime", callingUid);
218636a9e231e03734cd2143383d26388455c1764e17Kenny Root            return -1L;
218707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
218807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
218907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
2190655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
219107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2192655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(filename.string(), R_OK) == -1) {
2193655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGW("could not access %s for getmtime", filename.string());
219436a9e231e03734cd2143383d26388455c1764e17Kenny Root            return -1L;
2195a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
219607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2197655b958eb2180c7c06889f83f606d23421bf038cKenny Root        int fd = TEMP_FAILURE_RETRY(open(filename.string(), O_NOFOLLOW, O_RDONLY));
219807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (fd < 0) {
2199655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGW("could not open %s for getmtime", filename.string());
220036a9e231e03734cd2143383d26388455c1764e17Kenny Root            return -1L;
220107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
220207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
220307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        struct stat s;
220407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        int ret = fstat(fd, &s);
220507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        close(fd);
220607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (ret == -1) {
2207655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGW("could not stat %s for getmtime", filename.string());
220836a9e231e03734cd2143383d26388455c1764e17Kenny Root            return -1L;
220907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
221007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
221136a9e231e03734cd2143383d26388455c1764e17Kenny Root        return static_cast<int64_t>(s.st_mtime);
2212a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
221307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2214d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root    int32_t duplicate(const String16& srcKey, int32_t srcUid, const String16& destKey,
2215d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            int32_t destUid) {
22160225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        uid_t callingUid = IPCThreadState::self()->getCallingUid();
2217eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        pid_t spid = IPCThreadState::self()->getCallingPid();
2218eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        if (!has_permission(callingUid, P_DUPLICATE, spid)) {
2219d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            ALOGW("permission denied for %d: duplicate", callingUid);
22200225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root            return -1L;
22210225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
22220225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
222372593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        State state = mKeyStore->getState(get_user_id(callingUid));
22240225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        if (!isKeystoreUnlocked(state)) {
2225d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            ALOGD("calling duplicate in state: %d", state);
22260225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root            return state;
22270225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
22280225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2229d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        if (srcUid == -1 || static_cast<uid_t>(srcUid) == callingUid) {
2230d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            srcUid = callingUid;
2231d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        } else if (!is_granted_to(callingUid, srcUid)) {
2232d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            ALOGD("migrate not granted from source: %d -> %d", callingUid, srcUid);
22330225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root            return ::PERMISSION_DENIED;
22340225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
22350225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2236d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        if (destUid == -1) {
2237d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            destUid = callingUid;
2238d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        }
22390225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2240d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        if (srcUid != destUid) {
2241d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            if (static_cast<uid_t>(srcUid) != callingUid) {
2242d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root                ALOGD("can only duplicate from caller to other or to same uid: "
2243d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root                      "calling=%d, srcUid=%d, destUid=%d", callingUid, srcUid, destUid);
2244d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root                return ::PERMISSION_DENIED;
2245d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            }
22460225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2247d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            if (!is_granted_to(callingUid, destUid)) {
2248d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root                ALOGD("duplicate not granted to dest: %d -> %d", callingUid, destUid);
2249d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root                return ::PERMISSION_DENIED;
2250d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            }
22510225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
22520225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2253d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        String8 source8(srcKey);
2254655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 sourceFile(mKeyStore->getKeyNameForUidWithDir(source8, srcUid));
2255d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root
2256d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        String8 target8(destKey);
2257fa27d5bbc366e4ecb45aee5ae08565ab3ad3dcbcKenny Root        String8 targetFile(mKeyStore->getKeyNameForUidWithDir(target8, destUid));
22580225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2259655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(targetFile.string(), W_OK) != -1 || errno != ENOENT) {
2260655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGD("destination already exists: %s", targetFile.string());
22610225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root            return ::SYSTEM_ERROR;
22620225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
22630225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2264d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        Blob keyBlob;
2265655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = mKeyStore->get(sourceFile.string(), &keyBlob, TYPE_ANY,
226672593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                get_user_id(srcUid));
2267d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        if (responseCode != ::NO_ERROR) {
2268d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            return responseCode;
22690225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
2270d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root
227172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->put(targetFile.string(), &keyBlob, get_user_id(destUid));
22720225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root    }
22730225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
22741b0e3933900c7ea21189704d5db64e7346aee7afKenny Root    int32_t is_hardware_backed(const String16& keyType) {
22751b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        return mKeyStore->isHardwareBacked(keyType) ? 1 : 0;
22768ddf35a6e1fd80a7d0685041d2bfc77078277c9dKenny Root    }
22778ddf35a6e1fd80a7d0685041d2bfc77078277c9dKenny Root
2278fa27d5bbc366e4ecb45aee5ae08565ab3ad3dcbcKenny Root    int32_t clear_uid(int64_t targetUid64) {
22799489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t targetUid = getEffectiveUid(targetUid64);
2280b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker        if (!checkBinderPermissionSelfOrSystem(P_CLEAR_UID, targetUid)) {
2281a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root            return ::PERMISSION_DENIED;
2282a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root        }
2283a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root
22844b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        String8 prefix = String8::format("%u_", targetUid);
22854b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        Vector<String16> aliases;
228672593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        if (mKeyStore->saw(prefix, &aliases, get_user_id(targetUid)) != ::NO_ERROR) {
2287a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root            return ::SYSTEM_ERROR;
2288a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root        }
2289a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root
22904b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        for (uint32_t i = 0; i < aliases.size(); i++) {
22914b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            String8 name8(aliases[i]);
22924b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
229372593ee807e89239d98ae08d32c733ecc08203baChad Brubaker            mKeyStore->del(filename.string(), ::TYPE_ANY, get_user_id(targetUid));
2294a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root        }
22954b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        return ::NO_ERROR;
2296a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root    }
2297a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root
22984b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee    int32_t reset_uid(int32_t targetUid) {
229996d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        // TODO: Remove this method from the binder interface
23009489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
230196d6d7868303ad87f1f408c40d3c44bcb39f561eChad Brubaker        return onUserPasswordChanged(get_user_id(targetUid), String16(""));
23024e865753346fc6a075966972a7a98051818859dbRobin Lee    }
23034e865753346fc6a075966972a7a98051818859dbRobin Lee
23044e865753346fc6a075966972a7a98051818859dbRobin Lee    int32_t sync_uid(int32_t sourceUid, int32_t targetUid) {
23059489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_SYNC_UID, targetUid)) {
23064e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::PERMISSION_DENIED;
23074e865753346fc6a075966972a7a98051818859dbRobin Lee        }
230872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        uid_t sourceUser = get_user_id(sourceUid);
230972593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        uid_t targetUser = get_user_id(targetUid);
23109489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
231172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        if (sourceUser == targetUser) {
23124e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::SYSTEM_ERROR;
23134e865753346fc6a075966972a7a98051818859dbRobin Lee        }
23144e865753346fc6a075966972a7a98051818859dbRobin Lee
23154e865753346fc6a075966972a7a98051818859dbRobin Lee        // Initialise user keystore with existing master key held in-memory
231672593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->copyMasterKey(sourceUser, targetUser);
23174e865753346fc6a075966972a7a98051818859dbRobin Lee    }
23184e865753346fc6a075966972a7a98051818859dbRobin Lee
23194e865753346fc6a075966972a7a98051818859dbRobin Lee    int32_t password_uid(const String16& pw, int32_t targetUid) {
23209489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
23219489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_PASSWORD, targetUid)) {
23224e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::PERMISSION_DENIED;
23234e865753346fc6a075966972a7a98051818859dbRobin Lee        }
23244e865753346fc6a075966972a7a98051818859dbRobin Lee        const String8 password8(pw);
232572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        uid_t userId = get_user_id(targetUid);
23264e865753346fc6a075966972a7a98051818859dbRobin Lee
232772593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        switch (mKeyStore->getState(userId)) {
23284e865753346fc6a075966972a7a98051818859dbRobin Lee            case ::STATE_UNINITIALIZED: {
23294e865753346fc6a075966972a7a98051818859dbRobin Lee                // generate master key, encrypt with password, write to file, initialize mMasterKey*.
233072593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                return mKeyStore->initializeUser(password8, userId);
23314e865753346fc6a075966972a7a98051818859dbRobin Lee            }
23324e865753346fc6a075966972a7a98051818859dbRobin Lee            case ::STATE_NO_ERROR: {
23334e865753346fc6a075966972a7a98051818859dbRobin Lee                // rewrite master key with new password.
233472593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                return mKeyStore->writeMasterKey(password8, userId);
23354e865753346fc6a075966972a7a98051818859dbRobin Lee            }
23364e865753346fc6a075966972a7a98051818859dbRobin Lee            case ::STATE_LOCKED: {
23374e865753346fc6a075966972a7a98051818859dbRobin Lee                // read master key, decrypt with password, initialize mMasterKey*.
233872593ee807e89239d98ae08d32c733ecc08203baChad Brubaker                return mKeyStore->readMasterKey(password8, userId);
23394e865753346fc6a075966972a7a98051818859dbRobin Lee            }
23404e865753346fc6a075966972a7a98051818859dbRobin Lee        }
23414e865753346fc6a075966972a7a98051818859dbRobin Lee        return ::SYSTEM_ERROR;
23424e865753346fc6a075966972a7a98051818859dbRobin Lee    }
23434e865753346fc6a075966972a7a98051818859dbRobin Lee
23449c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker    int32_t addRngEntropy(const uint8_t* data, size_t dataLength) {
23459c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        const keymaster1_device_t* device = mKeyStore->getDevice();
23469c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        const keymaster1_device_t* fallback = mKeyStore->getFallbackDevice();
23479c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        int32_t devResult = KM_ERROR_UNIMPLEMENTED;
23489c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        int32_t fallbackResult = KM_ERROR_UNIMPLEMENTED;
23499c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        if (device->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_1_0 &&
23509c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker                device->add_rng_entropy != NULL) {
23519c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker            devResult = device->add_rng_entropy(device, data, dataLength);
23529c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        }
23539c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        if (fallback->add_rng_entropy) {
23549c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker            fallbackResult = fallback->add_rng_entropy(fallback, data, dataLength);
23559c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        }
23569c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        if (devResult) {
23579c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker            return devResult;
23589c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        }
23599c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        if (fallbackResult) {
23609c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker            return fallbackResult;
23619c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        }
23629c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        return ::NO_ERROR;
23639899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
23649899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
236517d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker    int32_t generateKey(const String16& name, const KeymasterArguments& params,
2366154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                        const uint8_t* entropy, size_t entropyLength, int uid, int flags,
2367154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                        KeyCharacteristics* outCharacteristics) {
23689489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid = getEffectiveUid(uid);
23699489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int rc = checkBinderPermissionAndKeystoreState(P_INSERT, uid,
23709489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                       flags & KEYSTORE_FLAG_ENCRYPTED);
23719489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (rc != ::NO_ERROR) {
23729489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return rc;
237317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
237417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
23759489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        rc = KM_ERROR_UNIMPLEMENTED;
237617d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        bool isFallback = false;
237717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        keymaster_key_blob_t blob;
237817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        keymaster_key_characteristics_t *out = NULL;
237917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
238017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        const keymaster1_device_t* device = mKeyStore->getDevice();
238117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        const keymaster1_device_t* fallback = mKeyStore->getFallbackDevice();
238217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (device == NULL) {
238317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            return ::SYSTEM_ERROR;
238417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
2385154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker        // TODO: Seed from Linux RNG before this.
238617d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (device->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_1_0 &&
238717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                device->generate_key != NULL) {
2388154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (!entropy) {
2389154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = KM_ERROR_OK;
2390154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            } else if (device->add_rng_entropy) {
2391154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = device->add_rng_entropy(device, entropy, entropyLength);
2392154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            } else {
2393154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = KM_ERROR_UNIMPLEMENTED;
2394154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
2395154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (rc == KM_ERROR_OK) {
2396154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = device->generate_key(device, params.params.data(), params.params.size(),
2397154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                                          &blob, &out);
2398154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
239917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
240017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        // If the HW device didn't support generate_key or generate_key failed
240117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        // fall back to the software implementation.
240217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (rc && fallback->generate_key != NULL) {
240317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            isFallback = true;
2404154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (!entropy) {
2405154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = KM_ERROR_OK;
2406154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            } else if (fallback->add_rng_entropy) {
2407154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = fallback->add_rng_entropy(fallback, entropy, entropyLength);
2408154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            } else {
2409154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = KM_ERROR_UNIMPLEMENTED;
2410154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
2411154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (rc == KM_ERROR_OK) {
2412154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = fallback->generate_key(fallback, params.params.data(), params.params.size(),
2413154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                                            &blob,
2414154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                                            &out);
2415154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
241617d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
241717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
241817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (out) {
241917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            if (outCharacteristics) {
242017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                outCharacteristics->characteristics = *out;
242117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            } else {
242217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                keymaster_free_characteristics(out);
242317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            }
242417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            free(out);
242517d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
242617d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
242717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (rc) {
242817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            return rc;
242917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
243017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
243117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        String8 name8(name);
243217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, uid));
243317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
243417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        Blob keyBlob(blob.key_material, blob.key_material_size, NULL, 0, ::TYPE_KEYMASTER_10);
243517d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        keyBlob.setFallback(isFallback);
243617d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
243717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
243817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        free(const_cast<uint8_t*>(blob.key_material));
243917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
244072593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->put(filename.string(), &keyBlob, get_user_id(uid));
24419899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
24429899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
2443f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker    int32_t getKeyCharacteristics(const String16& name,
2444d663442b590b59250062335cc057478001b8e439Chad Brubaker                                  const keymaster_blob_t* clientId,
2445d663442b590b59250062335cc057478001b8e439Chad Brubaker                                  const keymaster_blob_t* appData,
2446f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker                                  KeyCharacteristics* outCharacteristics) {
2447f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        if (!outCharacteristics) {
2448f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            return KM_ERROR_UNEXPECTED_NULL_POINTER;
2449f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        }
2450f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker
2451f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
2452f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker
2453f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        Blob keyBlob;
2454f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        String8 name8(name);
2455f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        int rc;
2456f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker
2457f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
2458f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker                TYPE_KEYMASTER_10);
2459f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        if (responseCode != ::NO_ERROR) {
2460f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            return responseCode;
2461f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        }
2462f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        keymaster_key_blob_t key;
2463f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        key.key_material_size = keyBlob.getLength();
2464f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        key.key_material = keyBlob.getValue();
2465f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        keymaster1_device_t* dev = mKeyStore->getDeviceForBlob(keyBlob);
2466f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        keymaster_key_characteristics_t *out = NULL;
2467f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        if (!dev->get_key_characteristics) {
2468f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            ALOGW("device does not implement get_key_characteristics");
2469f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            return KM_ERROR_UNIMPLEMENTED;
2470f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        }
2471d663442b590b59250062335cc057478001b8e439Chad Brubaker        rc = dev->get_key_characteristics(dev, &key, clientId, appData, &out);
2472f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        if (out) {
2473f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            outCharacteristics->characteristics = *out;
2474f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            free(out);
2475f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        }
2476f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        return rc ? rc : ::NO_ERROR;
24779899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
24789899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
24794c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker    int32_t importKey(const String16& name, const KeymasterArguments& params,
24804c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                                keymaster_key_format_t format, const uint8_t *keyData,
24814c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                                size_t keyLength, int uid, int flags,
24824c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                                KeyCharacteristics* outCharacteristics) {
24839489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid = getEffectiveUid(uid);
24849489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int rc = checkBinderPermissionAndKeystoreState(P_INSERT, uid,
24859489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                       flags & KEYSTORE_FLAG_ENCRYPTED);
24869489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (rc != ::NO_ERROR) {
24879489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return rc;
24884c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
24894c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
24909489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        rc = KM_ERROR_UNIMPLEMENTED;
24914c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        bool isFallback = false;
24924c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        keymaster_key_blob_t blob;
24934c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        keymaster_key_characteristics_t *out = NULL;
24944c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
24954c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        const keymaster1_device_t* device = mKeyStore->getDevice();
24964c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        const keymaster1_device_t* fallback = mKeyStore->getFallbackDevice();
24974c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        if (device == NULL) {
24984c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            return ::SYSTEM_ERROR;
24994c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
25004c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        if (device->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_1_0 &&
25014c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                device->import_key != NULL) {
25024c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            rc = device->import_key(device, params.params.data(), params.params.size(),
25034c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                                    format, keyData, keyLength, &blob, &out);
25044c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
25054c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        if (rc && fallback->import_key != NULL) {
25064c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            isFallback = true;
25074c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            rc = fallback->import_key(fallback, params.params.data(), params.params.size(),
25084c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                                      format, keyData, keyLength, &blob, &out);
25094c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
25104c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        if (out) {
25114c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            if (outCharacteristics) {
25124c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                outCharacteristics->characteristics = *out;
25134c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            } else {
25144c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                keymaster_free_characteristics(out);
25154c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            }
25164c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            free(out);
25174c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
25184c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        if (rc) {
25194c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            return rc;
25204c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
25214c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
25224c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        String8 name8(name);
25234c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, uid));
25244c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
25254c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        Blob keyBlob(blob.key_material, blob.key_material_size, NULL, 0, ::TYPE_KEYMASTER_10);
25264c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        keyBlob.setFallback(isFallback);
25274c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
25284c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
25294c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        free((void*) blob.key_material);
25304c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
253172593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        return mKeyStore->put(filename.string(), &keyBlob, get_user_id(uid));
25329899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
25339899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
253407b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker    void exportKey(const String16& name, keymaster_key_format_t format,
2535d663442b590b59250062335cc057478001b8e439Chad Brubaker                           const keymaster_blob_t* clientId,
2536d663442b590b59250062335cc057478001b8e439Chad Brubaker                           const keymaster_blob_t* appData, ExportResult* result) {
253707b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker
253807b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
253907b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker
254007b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        Blob keyBlob;
254107b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        String8 name8(name);
254207b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        int rc;
254307b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker
254407b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
254507b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker                TYPE_KEYMASTER_10);
254607b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        if (responseCode != ::NO_ERROR) {
254707b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker            result->resultCode = responseCode;
254807b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker            return;
254907b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        }
255007b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        keymaster_key_blob_t key;
255107b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        key.key_material_size = keyBlob.getLength();
255207b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        key.key_material = keyBlob.getValue();
255307b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        keymaster1_device_t* dev = mKeyStore->getDeviceForBlob(keyBlob);
255407b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        if (!dev->export_key) {
255507b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker            result->resultCode = KM_ERROR_UNIMPLEMENTED;
255607b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker            return;
255707b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        }
255807b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        uint8_t* ptr = NULL;
2559d663442b590b59250062335cc057478001b8e439Chad Brubaker        rc = dev->export_key(dev, format, &key, clientId, appData,
256007b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker                                             &ptr, &result->dataLength);
256107b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        result->exportData.reset(ptr);
256207b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        result->resultCode = rc ? rc : ::NO_ERROR;
25639899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
25649899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
2565ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker
256640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    void begin(const sp<IBinder>& appToken, const String16& name, keymaster_purpose_t purpose,
2567154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker               bool pruneable, const KeymasterArguments& params, const uint8_t* entropy,
2568154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker               size_t entropyLength, KeymasterArguments* outParams, OperationResult* result) {
256940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (!result || !outParams) {
257040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            ALOGE("Unexpected null arguments to begin()");
257140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
257240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
257340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
257440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (!pruneable && get_app_id(callingUid) != AID_SYSTEM) {
257540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            ALOGE("Non-system uid %d trying to start non-pruneable operation", callingUid);
257640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            result->resultCode = ::PERMISSION_DENIED;
257740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
257840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
25790cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!checkAllowedOperationParams(params.params)) {
25800cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            result->resultCode = KM_ERROR_INVALID_ARGUMENT;
25810cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            return;
25820cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
258340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        Blob keyBlob;
258440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        String8 name8(name);
258540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
258640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker                TYPE_KEYMASTER_10);
258740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (responseCode != ::NO_ERROR) {
258840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            result->resultCode = responseCode;
258940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
259040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
259140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_key_blob_t key;
259240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        key.key_material_size = keyBlob.getLength();
259340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        key.key_material = keyBlob.getValue();
259440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_key_param_t* out;
259540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        size_t outSize;
259640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_operation_handle_t handle;
259740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster1_device_t* dev = mKeyStore->getDeviceForBlob(keyBlob);
2598154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker        keymaster_error_t err = KM_ERROR_UNIMPLEMENTED;
259906801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        std::vector<keymaster_key_param_t> opParams(params.params);
2600ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        Unique_keymaster_key_characteristics characteristics;
2601ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        characteristics.reset(new keymaster_key_characteristics_t);
2602ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        err = getOperationCharacteristics(key, dev, opParams, characteristics.get());
2603ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        if (err) {
2604ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker            result->resultCode = err;
2605ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker            return;
2606ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        }
26070cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        const hw_auth_token_t* authToken = NULL;
26080cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        int32_t authResult = getAuthToken(characteristics.get(), 0, &authToken,
260906801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                                                /*failOnTokenMissing*/ false);
26100cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // If per-operation auth is needed we need to begin the operation and
26110cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // the client will need to authorize that operation before calling
26120cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // update. Any other auth issues stop here.
26130cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (authResult != ::NO_ERROR && authResult != ::OP_AUTH_NEEDED) {
26140cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            result->resultCode = authResult;
261506801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            return;
261606801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        }
26170cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        addAuthToParams(&opParams, authToken);
2618154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker        // Add entropy to the device first.
2619154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker        if (entropy) {
2620154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (dev->add_rng_entropy) {
2621154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                err = dev->add_rng_entropy(dev, entropy, entropyLength);
2622154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            } else {
2623154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                err = KM_ERROR_UNIMPLEMENTED;
2624154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
2625154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (err) {
2626154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                result->resultCode = err;
2627154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                return;
2628154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
2629154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker        }
263006801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        err = dev->begin(dev, purpose, &key, opParams.data(), opParams.size(), &out, &outSize,
263106801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                         &handle);
263240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker
263340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        // If there are too many operations abort the oldest operation that was
263440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        // started as pruneable and try again.
263540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        while (err == KM_ERROR_TOO_MANY_OPERATIONS && mOperationMap.hasPruneableOperation()) {
263640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            sp<IBinder> oldest = mOperationMap.getOldestPruneableOperation();
263740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            ALOGD("Ran out of operation handles, trying to prune %p", oldest.get());
263840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            if (abort(oldest) != ::NO_ERROR) {
263940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker                break;
264040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            }
26410cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            err = dev->begin(dev, purpose, &key, opParams.data(), opParams.size(), &out, &outSize,
264240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker                             &handle);
264340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
264440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (err) {
264540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            result->resultCode = err;
264640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
264740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
264840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (out) {
264940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            outParams->params.assign(out, out + outSize);
265040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            free(out);
265140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
26529899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
2653ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        sp<IBinder> operationToken = mOperationMap.addOperation(handle, dev, appToken,
2654ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker                                                                characteristics.release(),
265506801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                                                                pruneable);
26560cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (authToken) {
26570cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            mOperationMap.setOperationAuthToken(operationToken, authToken);
26580cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
26590cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // Return the authentication lookup result. If this is a per operation
26600cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // auth'd key then the resultCode will be ::OP_AUTH_NEEDED and the
26610cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // application should get an auth token using the handle before the
26620cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // first call to update, which will fail if keystore hasn't received the
26630cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // auth token.
26640cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        result->resultCode = authResult;
266540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->token = operationToken;
2666c3a1856bbe2e39d5b3430f5f088b12fd710a159fChad Brubaker        result->handle = handle;
26679899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
26689899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
266940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    void update(const sp<IBinder>& token, const KeymasterArguments& params, const uint8_t* data,
267040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker                size_t dataLength, OperationResult* result) {
26710cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!checkAllowedOperationParams(params.params)) {
26720cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            result->resultCode = KM_ERROR_INVALID_ARGUMENT;
26730cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            return;
26740cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
267540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        const keymaster1_device_t* dev;
267640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_operation_handle_t handle;
26770cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!mOperationMap.getOperation(token, &handle, &dev, NULL)) {
267840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            result->resultCode = KM_ERROR_INVALID_OPERATION_HANDLE;
267940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
268040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
268140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        uint8_t* output_buf = NULL;
268240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        size_t output_length = 0;
268340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        size_t consumed = 0;
268406801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        std::vector<keymaster_key_param_t> opParams(params.params);
26850cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        int32_t authResult = addOperationAuthTokenIfNeeded(token, &opParams);
26860cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (authResult != ::NO_ERROR) {
268706801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            result->resultCode = authResult;
268806801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            return;
268906801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        }
269006801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        keymaster_error_t err = dev->update(dev, handle, opParams.data(), opParams.size(), data,
269106801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                                            dataLength, &consumed, &output_buf, &output_length);
269240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->data.reset(output_buf);
269340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->dataLength = output_length;
269440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->inputConsumed = consumed;
269540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->resultCode = err ? (int32_t) err : ::NO_ERROR;
269640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    }
269740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker
269840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    void finish(const sp<IBinder>& token, const KeymasterArguments& params,
269940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker                const uint8_t* signature, size_t signatureLength, OperationResult* result) {
27000cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!checkAllowedOperationParams(params.params)) {
27010cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            result->resultCode = KM_ERROR_INVALID_ARGUMENT;
27020cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            return;
27030cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
270440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        const keymaster1_device_t* dev;
270540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_operation_handle_t handle;
27060cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!mOperationMap.getOperation(token, &handle, &dev, NULL)) {
270740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            result->resultCode = KM_ERROR_INVALID_OPERATION_HANDLE;
270840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
270940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
271040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        uint8_t* output_buf = NULL;
271140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        size_t output_length = 0;
271206801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        std::vector<keymaster_key_param_t> opParams(params.params);
27130cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        int32_t authResult = addOperationAuthTokenIfNeeded(token, &opParams);
27140cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (authResult != ::NO_ERROR) {
271506801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            result->resultCode = authResult;
271606801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            return;
271706801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        }
27180cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
271906801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        keymaster_error_t err = dev->finish(dev, handle, opParams.data(), opParams.size(),
272006801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                                            signature, signatureLength, &output_buf,
272106801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                                            &output_length);
272240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        // Remove the operation regardless of the result
272340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        mOperationMap.removeOperation(token);
272406801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        mAuthTokenTable.MarkCompleted(handle);
272540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->data.reset(output_buf);
272640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->dataLength = output_length;
272740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->resultCode = err ? (int32_t) err : ::NO_ERROR;
272840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    }
272940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker
273040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    int32_t abort(const sp<IBinder>& token) {
273140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        const keymaster1_device_t* dev;
273240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_operation_handle_t handle;
273306801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        if (!mOperationMap.getOperation(token, &handle, &dev, NULL)) {
273440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return KM_ERROR_INVALID_OPERATION_HANDLE;
273540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
273640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        mOperationMap.removeOperation(token);
273706801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        int32_t rc;
273840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (!dev->abort) {
273906801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            rc = KM_ERROR_UNIMPLEMENTED;
274006801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        } else {
274106801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            rc = dev->abort(dev, handle);
274240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
274306801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        mAuthTokenTable.MarkCompleted(handle);
274440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (rc) {
274540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return rc;
274640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
274740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        return ::NO_ERROR;
27489899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
27499899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
27502ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker    bool isOperationAuthorized(const sp<IBinder>& token) {
27512ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker        const keymaster1_device_t* dev;
27522ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker        keymaster_operation_handle_t handle;
2753ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        const keymaster_key_characteristics_t* characteristics;
2754ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        if (!mOperationMap.getOperation(token, &handle, &dev, &characteristics)) {
27552ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker            return false;
27562ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker        }
27570cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        const hw_auth_token_t* authToken = NULL;
27580cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        mOperationMap.getOperationAuthToken(token, &authToken);
275906801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        std::vector<keymaster_key_param_t> ignored;
27600cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        int32_t authResult = addOperationAuthTokenIfNeeded(token, &ignored);
27610cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        return authResult == ::NO_ERROR;
27622ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker    }
27632ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker
2764d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker    int32_t addAuthToken(const uint8_t* token, size_t length) {
27659489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_ADD_AUTH)) {
27669489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            ALOGW("addAuthToken: permission denied for %d",
27679489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                  IPCThreadState::self()->getCallingUid());
2768d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker            return ::PERMISSION_DENIED;
2769d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        }
2770d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        if (length != sizeof(hw_auth_token_t)) {
2771d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker            return KM_ERROR_INVALID_ARGUMENT;
2772d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        }
2773d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        hw_auth_token_t* authToken = new hw_auth_token_t;
2774d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        memcpy(reinterpret_cast<void*>(authToken), token, sizeof(hw_auth_token_t));
2775d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        // The table takes ownership of authToken.
2776d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        mAuthTokenTable.AddAuthenticationToken(authToken);
2777d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        return ::NO_ERROR;
27782ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker    }
27792ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker
278007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootprivate:
27819489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    static const int32_t UID_SELF = -1;
27829489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
27839489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    /**
27849489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * Get the effective target uid for a binder operation that takes an
27859489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * optional uid as the target.
27869489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     */
27879489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    inline uid_t getEffectiveUid(int32_t targetUid) {
27889489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (targetUid == UID_SELF) {
27899489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return IPCThreadState::self()->getCallingUid();
27909489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
27919489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return static_cast<uid_t>(targetUid);
27929489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    }
27939489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
27949489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    /**
27959489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * Check if the caller of the current binder method has the required
27969489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * permission and if acting on other uids the grants to do so.
27979489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     */
27989489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    inline bool checkBinderPermission(perm_t permission, int32_t targetUid = UID_SELF) {
27999489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
28009489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        pid_t spid = IPCThreadState::self()->getCallingPid();
28019489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!has_permission(callingUid, permission, spid)) {
28029489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            ALOGW("permission %s denied for %d", get_perm_label(permission), callingUid);
28039489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return false;
28049489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
28059489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!is_granted_to(callingUid, getEffectiveUid(targetUid))) {
28069489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            ALOGW("uid %d not granted to act for %d", callingUid, targetUid);
28079489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return false;
28089489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
28099489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return true;
28109489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    }
28119489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
28129489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    /**
28139489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * Check if the caller of the current binder method has the required
2814b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker     * permission and the target uid is the caller or the caller is system.
2815b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker     */
2816b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker    inline bool checkBinderPermissionSelfOrSystem(perm_t permission, int32_t targetUid) {
2817b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
2818b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker        pid_t spid = IPCThreadState::self()->getCallingPid();
2819b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker        if (!has_permission(callingUid, permission, spid)) {
2820b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker            ALOGW("permission %s denied for %d", get_perm_label(permission), callingUid);
2821b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker            return false;
2822b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker        }
2823b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker        return getEffectiveUid(targetUid) == callingUid || callingUid == AID_SYSTEM;
2824b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker    }
2825b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker
2826b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker    /**
2827b37a52337f001f8a43f7cbb64203dba78560ee6bChad Brubaker     * Check if the caller of the current binder method has the required
28289489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * permission or the target of the operation is the caller's uid. This is
28299489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * for operation where the permission is only for cross-uid activity and all
28309489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * uids are allowed to act on their own (ie: clearing all entries for a
28319489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * given uid).
28329489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     */
28339489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    inline bool checkBinderPermissionOrSelfTarget(perm_t permission, int32_t targetUid) {
28349489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
28359489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (getEffectiveUid(targetUid) == callingUid) {
28369489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return true;
28379489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        } else {
28389489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return checkBinderPermission(permission, targetUid);
28399489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
28409489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    }
28419489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
28429489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    /**
28439489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * Helper method to check that the caller has the required permission as
28449489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * well as the keystore is in the unlocked state if checkUnlocked is true.
28459489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     *
28469489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * Returns NO_ERROR on success, PERMISSION_DENIED on a permission error and
28479489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * otherwise the state of keystore when not unlocked and checkUnlocked is
28489489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * true.
28499489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     */
28509489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    inline int32_t checkBinderPermissionAndKeystoreState(perm_t permission, int32_t targetUid = -1,
28519489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                 bool checkUnlocked = true) {
28529489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(permission, targetUid)) {
28539489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return ::PERMISSION_DENIED;
28549489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
285572593ee807e89239d98ae08d32c733ecc08203baChad Brubaker        State state = mKeyStore->getState(get_user_id(getEffectiveUid(targetUid)));
28569489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (checkUnlocked && !isKeystoreUnlocked(state)) {
28579489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return state;
28589489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
28599489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
28609489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return ::NO_ERROR;
28619489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
28629489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    }
28639489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
28649d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root    inline bool isKeystoreUnlocked(State state) {
28659d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        switch (state) {
28669d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        case ::STATE_NO_ERROR:
28679d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root            return true;
28689d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        case ::STATE_UNINITIALIZED:
28699d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        case ::STATE_LOCKED:
28709d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root            return false;
28719d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        }
28729d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        return false;
2873a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
287407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
287567d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    bool isKeyTypeSupported(const keymaster1_device_t* device, keymaster_keypair_t keyType) {
28761d448c074a86ef5d05a22fdf1358718976628a86Kenny Root        const int32_t device_api = device->common.module->module_api_version;
28771d448c074a86ef5d05a22fdf1358718976628a86Kenny Root        if (device_api == KEYMASTER_MODULE_API_VERSION_0_2) {
28781d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            switch (keyType) {
28791d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_RSA:
28801d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_DSA:
28811d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_EC:
28821d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return true;
28831d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                default:
28841d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return false;
28851d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            }
28861d448c074a86ef5d05a22fdf1358718976628a86Kenny Root        } else if (device_api >= KEYMASTER_MODULE_API_VERSION_0_3) {
28871d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            switch (keyType) {
28881d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_RSA:
28891d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return true;
28901d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_DSA:
28911d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return device->flags & KEYMASTER_SUPPORTS_DSA;
28921d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_EC:
28931d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return device->flags & KEYMASTER_SUPPORTS_EC;
28941d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                default:
28951d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return false;
28961d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            }
28971d448c074a86ef5d05a22fdf1358718976628a86Kenny Root        } else {
28981d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            return keyType == TYPE_RSA;
28991d448c074a86ef5d05a22fdf1358718976628a86Kenny Root        }
29001d448c074a86ef5d05a22fdf1358718976628a86Kenny Root    }
29011d448c074a86ef5d05a22fdf1358718976628a86Kenny Root
29020cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    /**
29030cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * Check that all keymaster_key_param_t's provided by the application are
29040cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * allowed. Any parameter that keystore adds itself should be disallowed here.
29050cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     */
29060cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    bool checkAllowedOperationParams(const std::vector<keymaster_key_param_t>& params) {
29070cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        for (auto param: params) {
29080cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            switch (param.tag) {
29090cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                case KM_TAG_AUTH_TOKEN:
29100cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                    return false;
29110cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                default:
29120cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                    break;
29130cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            }
29140cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29150cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        return true;
29160cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    }
29170cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
29180cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    keymaster_error_t getOperationCharacteristics(const keymaster_key_blob_t& key,
29190cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                    const keymaster1_device_t* dev,
29200cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                    const std::vector<keymaster_key_param_t>& params,
29210cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                    keymaster_key_characteristics_t* out) {
29220cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        UniquePtr<keymaster_blob_t> appId;
29230cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        UniquePtr<keymaster_blob_t> appData;
29240cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        for (auto param : params) {
29250cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            if (param.tag == KM_TAG_APPLICATION_ID) {
29260cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appId.reset(new keymaster_blob_t);
29270cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appId->data = param.blob.data;
29280cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appId->data_length = param.blob.data_length;
29290cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            } else if (param.tag == KM_TAG_APPLICATION_DATA) {
29300cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appData.reset(new keymaster_blob_t);
29310cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appData->data = param.blob.data;
29320cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appData->data_length = param.blob.data_length;
29330cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            }
29340cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29350cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        keymaster_key_characteristics_t* result = NULL;
29360cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!dev->get_key_characteristics) {
29370cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            return KM_ERROR_UNIMPLEMENTED;
29380cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29390cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        keymaster_error_t error = dev->get_key_characteristics(dev, &key, appId.get(),
29400cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                                               appData.get(), &result);
29410cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (result) {
29420cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            *out = *result;
29430cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            free(result);
29440cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29450cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        return error;
29460cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    }
29470cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
29480cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    /**
29490cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * Get the auth token for this operation from the auth token table.
29500cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *
29510cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * Returns ::NO_ERROR if the auth token was set or none was required.
29520cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         ::OP_AUTH_NEEDED if it is a per op authorization, no
29530cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         authorization token exists for that operation and
29540cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         failOnTokenMissing is false.
29550cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         KM_ERROR_KEY_USER_NOT_AUTHENTICATED if there is no valid auth
29560cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         token for the operation
29570cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     */
29580cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    int32_t getAuthToken(const keymaster_key_characteristics_t* characteristics,
29590cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                         keymaster_operation_handle_t handle,
29600cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                         const hw_auth_token_t** authToken,
29610cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                         bool failOnTokenMissing = true) {
29620cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
29630cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        std::vector<keymaster_key_param_t> allCharacteristics;
29640cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        for (size_t i = 0; i < characteristics->sw_enforced.length; i++) {
29650cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            allCharacteristics.push_back(characteristics->sw_enforced.params[i]);
29660cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29670cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        for (size_t i = 0; i < characteristics->hw_enforced.length; i++) {
29680cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            allCharacteristics.push_back(characteristics->hw_enforced.params[i]);
29690cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29700cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        keymaster::AuthTokenTable::Error err =
29710cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                mAuthTokenTable.FindAuthorization(allCharacteristics.data(),
29720cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                                  allCharacteristics.size(), handle, authToken);
29730cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        switch (err) {
29740cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::OK:
29750cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::AUTH_NOT_REQUIRED:
29760cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return ::NO_ERROR;
29770cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::AUTH_TOKEN_NOT_FOUND:
29780cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::AUTH_TOKEN_EXPIRED:
29790cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::AUTH_TOKEN_WRONG_SID:
29800cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return KM_ERROR_KEY_USER_NOT_AUTHENTICATED;
29810cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::OP_HANDLE_REQUIRED:
29820cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return failOnTokenMissing ? (int32_t) KM_ERROR_KEY_USER_NOT_AUTHENTICATED :
29830cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                        (int32_t) ::OP_AUTH_NEEDED;
29840cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            default:
29850cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                ALOGE("Unexpected FindAuthorization return value %d", err);
29860cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return KM_ERROR_INVALID_ARGUMENT;
29870cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29880cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    }
29890cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
29900cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    inline void addAuthToParams(std::vector<keymaster_key_param_t>* params,
29910cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                const hw_auth_token_t* token) {
29920cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (token) {
29930cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            params->push_back(keymaster_param_blob(KM_TAG_AUTH_TOKEN,
29940cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                                   reinterpret_cast<const uint8_t*>(token),
29950cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                                   sizeof(hw_auth_token_t)));
29960cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29970cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    }
29980cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
29990cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    /**
30000cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * Add the auth token for the operation to the param list if the operation
30010cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * requires authorization. Uses the cached result in the OperationMap if available
30020cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * otherwise gets the token from the AuthTokenTable and caches the result.
30030cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *
30040cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * Returns ::NO_ERROR if the auth token was added or not needed.
30050cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         KM_ERROR_KEY_USER_NOT_AUTHENTICATED if the operation is not
30060cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         authenticated.
30070cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         KM_ERROR_INVALID_OPERATION_HANDLE if token is not a valid
30080cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         operation token.
30090cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     */
30100cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    int32_t addOperationAuthTokenIfNeeded(sp<IBinder> token,
30110cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                          std::vector<keymaster_key_param_t>* params) {
30120cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        const hw_auth_token_t* authToken = NULL;
30137169a8470f6539036addf3c960b075af224e83e2Chad Brubaker        mOperationMap.getOperationAuthToken(token, &authToken);
30147169a8470f6539036addf3c960b075af224e83e2Chad Brubaker        if (!authToken) {
30150cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            const keymaster1_device_t* dev;
30160cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            keymaster_operation_handle_t handle;
30170cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            const keymaster_key_characteristics_t* characteristics = NULL;
30180cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            if (!mOperationMap.getOperation(token, &handle, &dev, &characteristics)) {
30190cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return KM_ERROR_INVALID_OPERATION_HANDLE;
30200cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            }
30210cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            int32_t result = getAuthToken(characteristics, handle, &authToken);
30220cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            if (result != ::NO_ERROR) {
30230cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return result;
30240cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            }
30250cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            if (authToken) {
30260cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                mOperationMap.setOperationAuthToken(token, authToken);
30270cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            }
30280cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
30290cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        addAuthToParams(params, authToken);
30300cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        return ::NO_ERROR;
30310cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    }
30320cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
303307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    ::KeyStore* mKeyStore;
303440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    OperationMap mOperationMap;
3035d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker    keymaster::AuthTokenTable mAuthTokenTable;
303607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root};
303707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
303807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root}; // namespace android
3039a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
3040a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootint main(int argc, char* argv[]) {
3041a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    if (argc < 2) {
3042a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        ALOGE("A directory must be specified!");
3043a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return 1;
3044a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
3045a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    if (chdir(argv[1]) == -1) {
3046a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        ALOGE("chdir: %s: %s", argv[1], strerror(errno));
3047a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return 1;
3048a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
3049a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
3050a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    Entropy entropy;
3051a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    if (!entropy.open()) {
3052a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return 1;
3053a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
305470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
305580843db63ed6b61c953a1243801117a15c9e8c38Shawn Willden    keymaster0_device_t* dev;
305670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    if (keymaster_device_initialize(&dev)) {
305770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        ALOGE("keystore keymaster could not be initialized; exiting");
305870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        return 1;
305970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
306070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
306167d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t* fallback;
3062fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker    if (fallback_keymaster_device_initialize(&fallback)) {
3063fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        ALOGE("software keymaster could not be initialized; exiting");
3064fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        return 1;
3065fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker    }
3066fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker
3067eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    ks_is_selinux_enabled = is_selinux_enabled();
3068eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    if (ks_is_selinux_enabled) {
3069eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        union selinux_callback cb;
3070eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        cb.func_log = selinux_log_callback;
3071eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        selinux_set_callback(SELINUX_CB_LOG, cb);
3072eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        if (getcon(&tctx) != 0) {
3073eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn            ALOGE("SELinux: Could not acquire target context. Aborting keystore.\n");
3074eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn            return -1;
3075eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        }
3076eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    } else {
3077eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        ALOGI("SELinux: Keystore SELinux is disabled.\n");
3078eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    }
3079eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
308067d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    KeyStore keyStore(&entropy, reinterpret_cast<keymaster1_device_t*>(dev), fallback);
3081655b958eb2180c7c06889f83f606d23421bf038cKenny Root    keyStore.initialize();
308207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    android::sp<android::IServiceManager> sm = android::defaultServiceManager();
308307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    android::sp<android::KeyStoreProxy> proxy = new android::KeyStoreProxy(&keyStore);
308407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    android::status_t ret = sm->addService(android::String16("android.security.keystore"), proxy);
308507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    if (ret != android::OK) {
308607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        ALOGE("Couldn't register binder service!");
308707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return -1;
3088a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
308970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
309007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    /*
309107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * We're the only thread in existence, so we're just going to process
309207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * Binder transaction as a single-threaded program.
309307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     */
309407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    android::IPCThreadState::self()->joinThreadPool();
309570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
309607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    keymaster_device_release(dev);
3097a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    return 1;
3098a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root}
3099