keystore.cpp revision 7169a8470f6539036addf3c960b075af224e83e2
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
4617208e0de5a42722901d803118745cca25fd10c1Kenny Root#include <keymaster/softkeymaster.h>
4767d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker#include <keymaster/soft_keymaster_device.h>
4817208e0de5a42722901d803118745cca25fd10c1Kenny Root
4926cfc08add3966eca5892e3387cf5ed6dc3068fbKenny Root#include <UniquePtr.h>
50655b958eb2180c7c06889f83f606d23421bf038cKenny Root#include <utils/String8.h>
51655b958eb2180c7c06889f83f606d23421bf038cKenny Root#include <utils/Vector.h>
5270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
5307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root#include <keystore/IKeystoreService.h>
5407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root#include <binder/IPCThreadState.h>
5507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root#include <binder/IServiceManager.h>
5607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
57a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <cutils/log.h>
58a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <cutils/sockets.h>
59a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#include <private/android_filesystem_config.h>
60a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
6107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root#include <keystore/keystore.h>
62a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
63eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn#include <selinux/android.h>
64eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
65d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker#include "auth_token_table.h"
6696427baf0094d50047049d329b0779c3c910402cKenny Root#include "defaults.h"
6740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker#include "operation.h"
6896427baf0094d50047049d329b0779c3c910402cKenny Root
69a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root/* KeyStore is a secured storage for key-value pairs. In this implementation,
70a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * each file stores one key-value pair. Keys are encoded in file names, and
71a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * values are encrypted with checksums. The encryption key is protected by a
72a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * user-defined password. To keep things simple, buffers are always larger than
73a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * the maximum space we needed, so boundary checks on buffers are omitted. */
74a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
75a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#define KEY_SIZE        ((NAME_MAX - 15) / 2)
76a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#define VALUE_SIZE      32768
77a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root#define PASSWORD_SIZE   VALUE_SIZE
78a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
79822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
8096427baf0094d50047049d329b0779c3c910402cKenny Rootstruct BIGNUM_Delete {
8196427baf0094d50047049d329b0779c3c910402cKenny Root    void operator()(BIGNUM* p) const {
8296427baf0094d50047049d329b0779c3c910402cKenny Root        BN_free(p);
8396427baf0094d50047049d329b0779c3c910402cKenny Root    }
8496427baf0094d50047049d329b0779c3c910402cKenny Root};
8596427baf0094d50047049d329b0779c3c910402cKenny Roottypedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
8696427baf0094d50047049d329b0779c3c910402cKenny Root
87822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Rootstruct BIO_Delete {
88822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    void operator()(BIO* p) const {
89822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        BIO_free(p);
90822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
91822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root};
92822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Roottypedef UniquePtr<BIO, BIO_Delete> Unique_BIO;
93822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
94822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Rootstruct EVP_PKEY_Delete {
95822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    void operator()(EVP_PKEY* p) const {
96822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        EVP_PKEY_free(p);
97822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
98822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root};
99822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Roottypedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
100822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
101822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Rootstruct PKCS8_PRIV_KEY_INFO_Delete {
102822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    void operator()(PKCS8_PRIV_KEY_INFO* p) const {
103822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        PKCS8_PRIV_KEY_INFO_free(p);
104822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
105822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root};
106822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Roottypedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
107822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
10880843db63ed6b61c953a1243801117a15c9e8c38Shawn Willdenstatic int keymaster_device_initialize(keymaster0_device_t** dev) {
10970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    int rc;
11070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
11170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    const hw_module_t* mod;
11270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    rc = hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod);
11370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    if (rc) {
11470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        ALOGE("could not find any keystore module");
11570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        goto out;
11670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
11770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
11880843db63ed6b61c953a1243801117a15c9e8c38Shawn Willden    rc = keymaster0_open(mod, dev);
11970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    if (rc) {
12070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        ALOGE("could not open keymaster device in %s (%s)",
12170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root            KEYSTORE_HARDWARE_MODULE_ID, strerror(-rc));
12270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        goto out;
12370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
12470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
12570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    return 0;
12670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
12770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Rootout:
12870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    *dev = NULL;
12970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    return rc;
13070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root}
13170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
13267d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubakerstatic int fallback_keymaster_device_initialize(keymaster1_device_t** dev) {
13367d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster::SoftKeymasterDevice* softkeymaster =
13467d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker            new keymaster::SoftKeymasterDevice();
13567d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    // SoftKeymasterDevice is designed to make this cast safe.
13667d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    *dev = reinterpret_cast<keymaster1_device_t*>(softkeymaster);
137fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker    return 0;
138fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker}
139fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker
14080843db63ed6b61c953a1243801117a15c9e8c38Shawn Willdenstatic void keymaster_device_release(keymaster0_device_t* dev) {
14180843db63ed6b61c953a1243801117a15c9e8c38Shawn Willden    keymaster0_close(dev);
14270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root}
14370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
14407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root/***************
14507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root * PERMISSIONS *
14607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root ***************/
14707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
14807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root/* Here are the permissions, actions, users, and the main function. */
14907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Roottypedef enum {
1504e865753346fc6a075966972a7a98051818859dbRobin Lee    P_TEST          = 1 << 0,
1514e865753346fc6a075966972a7a98051818859dbRobin Lee    P_GET           = 1 << 1,
1524e865753346fc6a075966972a7a98051818859dbRobin Lee    P_INSERT        = 1 << 2,
1534e865753346fc6a075966972a7a98051818859dbRobin Lee    P_DELETE        = 1 << 3,
1544e865753346fc6a075966972a7a98051818859dbRobin Lee    P_EXIST         = 1 << 4,
1554e865753346fc6a075966972a7a98051818859dbRobin Lee    P_SAW           = 1 << 5,
1564e865753346fc6a075966972a7a98051818859dbRobin Lee    P_RESET         = 1 << 6,
1574e865753346fc6a075966972a7a98051818859dbRobin Lee    P_PASSWORD      = 1 << 7,
1584e865753346fc6a075966972a7a98051818859dbRobin Lee    P_LOCK          = 1 << 8,
1594e865753346fc6a075966972a7a98051818859dbRobin Lee    P_UNLOCK        = 1 << 9,
1604e865753346fc6a075966972a7a98051818859dbRobin Lee    P_ZERO          = 1 << 10,
1614e865753346fc6a075966972a7a98051818859dbRobin Lee    P_SIGN          = 1 << 11,
1624e865753346fc6a075966972a7a98051818859dbRobin Lee    P_VERIFY        = 1 << 12,
1634e865753346fc6a075966972a7a98051818859dbRobin Lee    P_GRANT         = 1 << 13,
1644e865753346fc6a075966972a7a98051818859dbRobin Lee    P_DUPLICATE     = 1 << 14,
1654e865753346fc6a075966972a7a98051818859dbRobin Lee    P_CLEAR_UID     = 1 << 15,
1664e865753346fc6a075966972a7a98051818859dbRobin Lee    P_RESET_UID     = 1 << 16,
1674e865753346fc6a075966972a7a98051818859dbRobin Lee    P_SYNC_UID      = 1 << 17,
1684e865753346fc6a075966972a7a98051818859dbRobin Lee    P_PASSWORD_UID  = 1 << 18,
169d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker    P_ADD_AUTH      = 1 << 19,
17007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root} perm_t;
17107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
17207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic struct user_euid {
17307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    uid_t uid;
17407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    uid_t euid;
17507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root} user_euids[] = {
17607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_VPN, AID_SYSTEM},
17707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_WIFI, AID_SYSTEM},
17807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_ROOT, AID_SYSTEM},
17907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root};
18007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
181eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn/* perm_labels associcated with keystore_key SELinux class verbs. */
182eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahnconst char *perm_labels[] = {
183eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "test",
184eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "get",
185eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "insert",
186eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "delete",
187eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "exist",
188eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "saw",
189eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "reset",
190eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "password",
191eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "lock",
192eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "unlock",
193eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "zero",
194eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "sign",
195eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "verify",
196eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "grant",
197eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    "duplicate",
1984e865753346fc6a075966972a7a98051818859dbRobin Lee    "clear_uid",
1994e865753346fc6a075966972a7a98051818859dbRobin Lee    "reset_uid",
2004e865753346fc6a075966972a7a98051818859dbRobin Lee    "sync_uid",
2014e865753346fc6a075966972a7a98051818859dbRobin Lee    "password_uid",
202d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker    "add_auth",
203eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn};
204eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
20507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic struct user_perm {
20607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    uid_t uid;
20707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    perm_t perms;
20807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root} user_perms[] = {
20907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_SYSTEM, static_cast<perm_t>((uint32_t)(~0)) },
21007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_VPN,    static_cast<perm_t>(P_GET | P_SIGN | P_VERIFY) },
21107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_WIFI,   static_cast<perm_t>(P_GET | P_SIGN | P_VERIFY) },
21207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {AID_ROOT,   static_cast<perm_t>(P_GET) },
21307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root};
21407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
21507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic const perm_t DEFAULT_PERMS = static_cast<perm_t>(P_TEST | P_GET | P_INSERT | P_DELETE | P_EXIST | P_SAW | P_SIGN
21607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        | P_VERIFY);
21707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
218eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahnstatic char *tctx;
219eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahnstatic int ks_is_selinux_enabled;
220eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
221eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahnstatic const char *get_perm_label(perm_t perm) {
222eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    unsigned int index = ffs(perm);
223eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    if (index > 0 && index <= (sizeof(perm_labels) / sizeof(perm_labels[0]))) {
224eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        return perm_labels[index - 1];
225eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    } else {
226eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        ALOGE("Keystore: Failed to retrieve permission label.\n");
227eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        abort();
228eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    }
229eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn}
230eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
231655b958eb2180c7c06889f83f606d23421bf038cKenny Root/**
232655b958eb2180c7c06889f83f606d23421bf038cKenny Root * Returns the app ID (in the Android multi-user sense) for the current
233655b958eb2180c7c06889f83f606d23421bf038cKenny Root * UNIX UID.
234655b958eb2180c7c06889f83f606d23421bf038cKenny Root */
235655b958eb2180c7c06889f83f606d23421bf038cKenny Rootstatic uid_t get_app_id(uid_t uid) {
236655b958eb2180c7c06889f83f606d23421bf038cKenny Root    return uid % AID_USER;
237655b958eb2180c7c06889f83f606d23421bf038cKenny Root}
238655b958eb2180c7c06889f83f606d23421bf038cKenny Root
239655b958eb2180c7c06889f83f606d23421bf038cKenny Root/**
240655b958eb2180c7c06889f83f606d23421bf038cKenny Root * Returns the user ID (in the Android multi-user sense) for the current
241655b958eb2180c7c06889f83f606d23421bf038cKenny Root * UNIX UID.
242655b958eb2180c7c06889f83f606d23421bf038cKenny Root */
243655b958eb2180c7c06889f83f606d23421bf038cKenny Rootstatic uid_t get_user_id(uid_t uid) {
244655b958eb2180c7c06889f83f606d23421bf038cKenny Root    return uid / AID_USER;
245655b958eb2180c7c06889f83f606d23421bf038cKenny Root}
246655b958eb2180c7c06889f83f606d23421bf038cKenny Root
247a25b2a397fff48dea7bce16af2065e6f5f043956Chih-Hung Hsiehstatic bool keystore_selinux_check_access(uid_t /*uid*/, perm_t perm, pid_t spid) {
248eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    if (!ks_is_selinux_enabled) {
249eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        return true;
250eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    }
251eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
252eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    char *sctx = NULL;
253eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    const char *selinux_class = "keystore_key";
254eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    const char *str_perm = get_perm_label(perm);
255eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
256eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    if (!str_perm) {
257eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        return false;
258eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    }
259eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
260eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    if (getpidcon(spid, &sctx) != 0) {
261eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        ALOGE("SELinux: Failed to get source pid context.\n");
262eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        return false;
263eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    }
26466dbf67dd65b4808a15ef64f0ffde1275bdd58a9Nick Kralevich
265eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    bool allowed = selinux_check_access(sctx, tctx, selinux_class, str_perm,
266eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn            NULL) == 0;
267eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    freecon(sctx);
268eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    return allowed;
269eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn}
270eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
271eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahnstatic bool has_permission(uid_t uid, perm_t perm, pid_t spid) {
272655b958eb2180c7c06889f83f606d23421bf038cKenny Root    // All system users are equivalent for multi-user support.
273655b958eb2180c7c06889f83f606d23421bf038cKenny Root    if (get_app_id(uid) == AID_SYSTEM) {
274655b958eb2180c7c06889f83f606d23421bf038cKenny Root        uid = AID_SYSTEM;
275655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
276655b958eb2180c7c06889f83f606d23421bf038cKenny Root
27707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    for (size_t i = 0; i < sizeof(user_perms)/sizeof(user_perms[0]); i++) {
27807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        struct user_perm user = user_perms[i];
27907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (user.uid == uid) {
280eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn            return (user.perms & perm) &&
281eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn                keystore_selinux_check_access(uid, perm, spid);
28207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
28307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
28407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
285eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    return (DEFAULT_PERMS & perm) &&
286eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        keystore_selinux_check_access(uid, perm, spid);
28707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root}
28807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
289494689083467ec372a58f094f041c8f102f39393Kenny Root/**
290494689083467ec372a58f094f041c8f102f39393Kenny Root * Returns the UID that the callingUid should act as. This is here for
291494689083467ec372a58f094f041c8f102f39393Kenny Root * legacy support of the WiFi and VPN systems and should be removed
292494689083467ec372a58f094f041c8f102f39393Kenny Root * when WiFi can operate in its own namespace.
293494689083467ec372a58f094f041c8f102f39393Kenny Root */
29407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic uid_t get_keystore_euid(uid_t uid) {
29507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    for (size_t i = 0; i < sizeof(user_euids)/sizeof(user_euids[0]); i++) {
29607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        struct user_euid user = user_euids[i];
29707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (user.uid == uid) {
29807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return user.euid;
29907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
30007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
30107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
30207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    return uid;
30307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root}
30407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
305494689083467ec372a58f094f041c8f102f39393Kenny Root/**
306494689083467ec372a58f094f041c8f102f39393Kenny Root * Returns true if the callingUid is allowed to interact in the targetUid's
307494689083467ec372a58f094f041c8f102f39393Kenny Root * namespace.
308494689083467ec372a58f094f041c8f102f39393Kenny Root */
309494689083467ec372a58f094f041c8f102f39393Kenny Rootstatic bool is_granted_to(uid_t callingUid, uid_t targetUid) {
3109489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    if (callingUid == targetUid) {
3119489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return true;
3129489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    }
313494689083467ec372a58f094f041c8f102f39393Kenny Root    for (size_t i = 0; i < sizeof(user_euids)/sizeof(user_euids[0]); i++) {
314494689083467ec372a58f094f041c8f102f39393Kenny Root        struct user_euid user = user_euids[i];
315494689083467ec372a58f094f041c8f102f39393Kenny Root        if (user.euid == callingUid && user.uid == targetUid) {
316494689083467ec372a58f094f041c8f102f39393Kenny Root            return true;
317494689083467ec372a58f094f041c8f102f39393Kenny Root        }
318494689083467ec372a58f094f041c8f102f39393Kenny Root    }
319494689083467ec372a58f094f041c8f102f39393Kenny Root
320494689083467ec372a58f094f041c8f102f39393Kenny Root    return false;
321494689083467ec372a58f094f041c8f102f39393Kenny Root}
322494689083467ec372a58f094f041c8f102f39393Kenny Root
323a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root/* Here is the encoding of keys. This is necessary in order to allow arbitrary
324a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * characters in keys. Characters in [0-~] are not encoded. Others are encoded
325a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * into two bytes. The first byte is one of [+-.] which represents the first
326a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * two bits of the character. The second byte encodes the rest of the bits into
327a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * [0-o]. Therefore in the worst case the length of a key gets doubled. Note
328a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * that Base64 cannot be used here due to the need of prefix match on keys. */
329a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
330655b958eb2180c7c06889f83f606d23421bf038cKenny Rootstatic size_t encode_key_length(const android::String8& keyName) {
331655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const uint8_t* in = reinterpret_cast<const uint8_t*>(keyName.string());
332655b958eb2180c7c06889f83f606d23421bf038cKenny Root    size_t length = keyName.length();
333655b958eb2180c7c06889f83f606d23421bf038cKenny Root    for (int i = length; i > 0; --i, ++in) {
334655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (*in < '0' || *in > '~') {
335655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ++length;
336655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
337655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
338655b958eb2180c7c06889f83f606d23421bf038cKenny Root    return length;
339655b958eb2180c7c06889f83f606d23421bf038cKenny Root}
340655b958eb2180c7c06889f83f606d23421bf038cKenny Root
34107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic int encode_key(char* out, const android::String8& keyName) {
34207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    const uint8_t* in = reinterpret_cast<const uint8_t*>(keyName.string());
34307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    size_t length = keyName.length();
344a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    for (int i = length; i > 0; --i, ++in, ++out) {
345655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (*in < '0' || *in > '~') {
346a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            *out = '+' + (*in >> 6);
347a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            *++out = '0' + (*in & 0x3F);
348a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            ++length;
349655b958eb2180c7c06889f83f606d23421bf038cKenny Root        } else {
350655b958eb2180c7c06889f83f606d23421bf038cKenny Root            *out = *in;
351a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
352a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
353a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    *out = '\0';
35470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    return length;
35570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root}
35670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
35707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root/*
35807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root * Converts from the "escaped" format on disk to actual name.
35907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root * This will be smaller than the input string.
36007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root *
36107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root * Characters that should combine with the next at the end will be truncated.
36207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root */
36307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic size_t decode_key_length(const char* in, size_t length) {
36407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    size_t outLength = 0;
36507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
36607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    for (const char* end = in + length; in < end; in++) {
36707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        /* This combines with the next character. */
36807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (*in < '0' || *in > '~') {
36907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            continue;
37007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
37107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
37207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        outLength++;
37307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
37407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    return outLength;
37507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root}
37607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
37707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootstatic void decode_key(char* out, const char* in, size_t length) {
37807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    for (const char* end = in + length; in < end; in++) {
37907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (*in < '0' || *in > '~') {
38007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            /* Truncate combining characters at the end. */
38107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            if (in + 1 >= end) {
38207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root                break;
38307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            }
38407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
38507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            *out = (*in++ - '+') << 6;
38607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            *out++ |= (*in - '0') & 0x3F;
387a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        } else {
38807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            *out++ = *in;
389a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
390a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
391a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    *out = '\0';
392a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root}
393a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
394a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootstatic size_t readFully(int fd, uint8_t* data, size_t size) {
395a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    size_t remaining = size;
396a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    while (remaining > 0) {
397150ca934edb745de3666a6492b039900df228ff0Kenny Root        ssize_t n = TEMP_FAILURE_RETRY(read(fd, data, remaining));
3985281edbc9445065479e92a6c86da462f3943c2caKenny Root        if (n <= 0) {
399150ca934edb745de3666a6492b039900df228ff0Kenny Root            return size - remaining;
400a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
401a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        data += n;
402a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        remaining -= n;
403a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
404a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    return size;
405a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root}
406a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
407a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootstatic size_t writeFully(int fd, uint8_t* data, size_t size) {
408a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    size_t remaining = size;
409a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    while (remaining > 0) {
410150ca934edb745de3666a6492b039900df228ff0Kenny Root        ssize_t n = TEMP_FAILURE_RETRY(write(fd, data, remaining));
411150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (n < 0) {
412150ca934edb745de3666a6492b039900df228ff0Kenny Root            ALOGW("write failed: %s", strerror(errno));
413150ca934edb745de3666a6492b039900df228ff0Kenny Root            return size - remaining;
414a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
415a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        data += n;
416a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        remaining -= n;
417a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
418a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    return size;
419a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root}
420a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
421a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootclass Entropy {
422a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootpublic:
423a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    Entropy() : mRandom(-1) {}
424a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    ~Entropy() {
425150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (mRandom >= 0) {
426a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            close(mRandom);
427a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
428a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
429a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
430a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    bool open() {
431a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        const char* randomDevice = "/dev/urandom";
432150ca934edb745de3666a6492b039900df228ff0Kenny Root        mRandom = TEMP_FAILURE_RETRY(::open(randomDevice, O_RDONLY));
433150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (mRandom < 0) {
434a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            ALOGE("open: %s: %s", randomDevice, strerror(errno));
435a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return false;
436a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
437a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return true;
438a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
439a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
4405187818895c4c5f650a611c40531b1dff7764c18Kenny Root    bool generate_random_data(uint8_t* data, size_t size) const {
441a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return (readFully(mRandom, data, size) == size);
442a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
443a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
444a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootprivate:
445a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    int mRandom;
446a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root};
447a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
448a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root/* Here is the file format. There are two parts in blob.value, the secret and
449a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * the description. The secret is stored in ciphertext, and its original size
450a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * can be found in blob.length. The description is stored after the secret in
451a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * plaintext, and its size is specified in blob.info. The total size of the two
452822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root * parts must be no more than VALUE_SIZE bytes. The first field is the version,
453f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root * the second is the blob's type, and the third byte is flags. Fields other
454a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * than blob.info, blob.length, and blob.value are modified by encryptBlob()
455a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root * and decryptBlob(). Thus they should not be accessed from outside. */
456a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
457822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root/* ** Note to future implementors of encryption: **
458822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root * Currently this is the construction:
459822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *   metadata || Enc(MD5(data) || data)
460822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *
461822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root * This should be the construction used for encrypting if re-implementing:
462822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *
463822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *   Derive independent keys for encryption and MAC:
464822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *     Kenc = AES_encrypt(masterKey, "Encrypt")
465822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *     Kmac = AES_encrypt(masterKey, "MAC")
466822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *
467822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *   Store this:
468822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *     metadata || AES_CTR_encrypt(Kenc, rand_IV, data) ||
469822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root *             HMAC(Kmac, metadata || Enc(data))
470822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root */
471a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootstruct __attribute__((packed)) blob {
472822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    uint8_t version;
473822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    uint8_t type;
474f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    uint8_t flags;
475a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    uint8_t info;
476a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    uint8_t vector[AES_BLOCK_SIZE];
477822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    uint8_t encrypted[0]; // Marks offset to encrypted data.
478a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    uint8_t digest[MD5_DIGEST_LENGTH];
479822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    uint8_t digested[0]; // Marks offset to digested data.
480a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    int32_t length; // in network byte order when encrypted
481a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    uint8_t value[VALUE_SIZE + AES_BLOCK_SIZE];
482a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root};
483a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
484822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Roottypedef enum {
485d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root    TYPE_ANY = 0, // meta type that matches anything
486822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    TYPE_GENERIC = 1,
487822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    TYPE_MASTER_KEY = 2,
488822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    TYPE_KEY_PAIR = 3,
48917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker    TYPE_KEYMASTER_10 = 4,
490822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root} BlobType;
491822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
492f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Rootstatic const uint8_t CURRENT_BLOB_VERSION = 2;
493822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
494a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootclass Blob {
495a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootpublic:
49607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    Blob(const uint8_t* value, int32_t valueLength, const uint8_t* info, uint8_t infoLength,
49707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            BlobType type) {
4981773b442b16098c6d111d6371d4a986a0747992bAlex Klyubin        memset(&mBlob, 0, sizeof(mBlob));
499a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        mBlob.length = valueLength;
500a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        memcpy(mBlob.value, value, valueLength);
501a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
502a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        mBlob.info = infoLength;
503a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        memcpy(mBlob.value + valueLength, info, infoLength);
504822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
50507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        mBlob.version = CURRENT_BLOB_VERSION;
506822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        mBlob.type = uint8_t(type);
507f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
508ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root        if (type == TYPE_MASTER_KEY) {
509ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root            mBlob.flags = KEYSTORE_FLAG_ENCRYPTED;
510ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root        } else {
511ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root            mBlob.flags = KEYSTORE_FLAG_NONE;
512ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root        }
513a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
514a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
515a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    Blob(blob b) {
516a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        mBlob = b;
517a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
518a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
5191773b442b16098c6d111d6371d4a986a0747992bAlex Klyubin    Blob() {
5201773b442b16098c6d111d6371d4a986a0747992bAlex Klyubin        memset(&mBlob, 0, sizeof(mBlob));
5211773b442b16098c6d111d6371d4a986a0747992bAlex Klyubin    }
522a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
5235187818895c4c5f650a611c40531b1dff7764c18Kenny Root    const uint8_t* getValue() const {
524a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return mBlob.value;
525a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
526a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
5275187818895c4c5f650a611c40531b1dff7764c18Kenny Root    int32_t getLength() const {
528a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return mBlob.length;
529a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
530a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
5315187818895c4c5f650a611c40531b1dff7764c18Kenny Root    const uint8_t* getInfo() const {
5325187818895c4c5f650a611c40531b1dff7764c18Kenny Root        return mBlob.value + mBlob.length;
5335187818895c4c5f650a611c40531b1dff7764c18Kenny Root    }
5345187818895c4c5f650a611c40531b1dff7764c18Kenny Root
5355187818895c4c5f650a611c40531b1dff7764c18Kenny Root    uint8_t getInfoLength() const {
536a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return mBlob.info;
537a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
538a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
539822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    uint8_t getVersion() const {
540822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        return mBlob.version;
541822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
542822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
543f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    bool isEncrypted() const {
544f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (mBlob.version < 2) {
545f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            return true;
546f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        }
547f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
548f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        return mBlob.flags & KEYSTORE_FLAG_ENCRYPTED;
549f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    }
550f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
551f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    void setEncrypted(bool encrypted) {
552f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (encrypted) {
553f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            mBlob.flags |= KEYSTORE_FLAG_ENCRYPTED;
554f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        } else {
555f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            mBlob.flags &= ~KEYSTORE_FLAG_ENCRYPTED;
556f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        }
557f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    }
558f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
55917208e0de5a42722901d803118745cca25fd10c1Kenny Root    bool isFallback() const {
56017208e0de5a42722901d803118745cca25fd10c1Kenny Root        return mBlob.flags & KEYSTORE_FLAG_FALLBACK;
56117208e0de5a42722901d803118745cca25fd10c1Kenny Root    }
56217208e0de5a42722901d803118745cca25fd10c1Kenny Root
56317208e0de5a42722901d803118745cca25fd10c1Kenny Root    void setFallback(bool fallback) {
56417208e0de5a42722901d803118745cca25fd10c1Kenny Root        if (fallback) {
56517208e0de5a42722901d803118745cca25fd10c1Kenny Root            mBlob.flags |= KEYSTORE_FLAG_FALLBACK;
56617208e0de5a42722901d803118745cca25fd10c1Kenny Root        } else {
56717208e0de5a42722901d803118745cca25fd10c1Kenny Root            mBlob.flags &= ~KEYSTORE_FLAG_FALLBACK;
56817208e0de5a42722901d803118745cca25fd10c1Kenny Root        }
56917208e0de5a42722901d803118745cca25fd10c1Kenny Root    }
57017208e0de5a42722901d803118745cca25fd10c1Kenny Root
571822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    void setVersion(uint8_t version) {
572822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        mBlob.version = version;
573822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
574822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
575822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    BlobType getType() const {
576822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        return BlobType(mBlob.type);
577822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
578822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
579822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    void setType(BlobType type) {
580822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        mBlob.type = uint8_t(type);
581822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
582822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
583f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    ResponseCode writeBlob(const char* filename, AES_KEY *aes_key, State state, Entropy* entropy) {
584f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ALOGV("writing blob %s", filename);
585f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (isEncrypted()) {
586f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            if (state != STATE_NO_ERROR) {
587f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                ALOGD("couldn't insert encrypted blob while not unlocked");
588f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                return LOCKED;
589f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            }
590f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
591f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            if (!entropy->generate_random_data(mBlob.vector, AES_BLOCK_SIZE)) {
592f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                ALOGW("Could not read random data for: %s", filename);
593f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                return SYSTEM_ERROR;
594f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            }
595a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
596a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
597a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // data includes the value and the value's length
598a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t dataLength = mBlob.length + sizeof(mBlob.length);
599a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // pad data to the AES_BLOCK_SIZE
600a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t digestedLength = ((dataLength + AES_BLOCK_SIZE - 1)
601a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root                                 / AES_BLOCK_SIZE * AES_BLOCK_SIZE);
602a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // encrypted data includes the digest value
603a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t encryptedLength = digestedLength + MD5_DIGEST_LENGTH;
604a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // move info after space for padding
605a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        memmove(&mBlob.encrypted[encryptedLength], &mBlob.value[mBlob.length], mBlob.info);
606a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // zero padding area
607a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        memset(mBlob.value + mBlob.length, 0, digestedLength - dataLength);
608a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
609a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        mBlob.length = htonl(mBlob.length);
610a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
611f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (isEncrypted()) {
612f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            MD5(mBlob.digested, digestedLength, mBlob.digest);
613f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
614f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            uint8_t vector[AES_BLOCK_SIZE];
615f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            memcpy(vector, mBlob.vector, AES_BLOCK_SIZE);
616f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            AES_cbc_encrypt(mBlob.encrypted, mBlob.encrypted, encryptedLength,
617f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                            aes_key, vector, AES_ENCRYPT);
618f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        }
619a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
620a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t headerLength = (mBlob.encrypted - (uint8_t*) &mBlob);
621a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t fileLength = encryptedLength + headerLength + mBlob.info;
622a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
623a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        const char* tmpFileName = ".tmp";
624150ca934edb745de3666a6492b039900df228ff0Kenny Root        int out = TEMP_FAILURE_RETRY(open(tmpFileName,
625150ca934edb745de3666a6492b039900df228ff0Kenny Root                O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR));
626150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (out < 0) {
627150ca934edb745de3666a6492b039900df228ff0Kenny Root            ALOGW("could not open file: %s: %s", tmpFileName, strerror(errno));
628a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
629a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
630a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t writtenBytes = writeFully(out, (uint8_t*) &mBlob, fileLength);
631a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (close(out) != 0) {
632a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
633a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
634a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (writtenBytes != fileLength) {
635150ca934edb745de3666a6492b039900df228ff0Kenny Root            ALOGW("blob not fully written %zu != %zu", writtenBytes, fileLength);
636a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            unlink(tmpFileName);
637a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
638a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
639150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (rename(tmpFileName, filename) == -1) {
640150ca934edb745de3666a6492b039900df228ff0Kenny Root            ALOGW("could not rename blob to %s: %s", filename, strerror(errno));
641150ca934edb745de3666a6492b039900df228ff0Kenny Root            return SYSTEM_ERROR;
642150ca934edb745de3666a6492b039900df228ff0Kenny Root        }
643150ca934edb745de3666a6492b039900df228ff0Kenny Root        return NO_ERROR;
644a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
645a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
646f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    ResponseCode readBlob(const char* filename, AES_KEY *aes_key, State state) {
647f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ALOGV("reading blob %s", filename);
648150ca934edb745de3666a6492b039900df228ff0Kenny Root        int in = TEMP_FAILURE_RETRY(open(filename, O_RDONLY));
649150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (in < 0) {
650a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return (errno == ENOENT) ? KEY_NOT_FOUND : SYSTEM_ERROR;
651a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
652a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // fileLength may be less than sizeof(mBlob) since the in
653a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // memory version has extra padding to tolerate rounding up to
654a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // the AES_BLOCK_SIZE
655a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t fileLength = readFully(in, (uint8_t*) &mBlob, sizeof(mBlob));
656a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (close(in) != 0) {
657a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
658a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
659f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
660f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (isEncrypted() && (state != STATE_NO_ERROR)) {
661f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            return LOCKED;
662f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        }
663f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
664a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t headerLength = (mBlob.encrypted - (uint8_t*) &mBlob);
665a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (fileLength < headerLength) {
666a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return VALUE_CORRUPTED;
667a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
668a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
669a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        ssize_t encryptedLength = fileLength - (headerLength + mBlob.info);
670f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (encryptedLength < 0) {
671a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return VALUE_CORRUPTED;
672a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
673f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
674f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ssize_t digestedLength;
675f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (isEncrypted()) {
676f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            if (encryptedLength % AES_BLOCK_SIZE != 0) {
677f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                return VALUE_CORRUPTED;
678f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            }
679f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
680f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            AES_cbc_encrypt(mBlob.encrypted, mBlob.encrypted, encryptedLength, aes_key,
681f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                            mBlob.vector, AES_DECRYPT);
682f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            digestedLength = encryptedLength - MD5_DIGEST_LENGTH;
683f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            uint8_t computedDigest[MD5_DIGEST_LENGTH];
684f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            MD5(mBlob.digested, digestedLength, computedDigest);
685f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            if (memcmp(mBlob.digest, computedDigest, MD5_DIGEST_LENGTH) != 0) {
686f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                return VALUE_CORRUPTED;
687f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            }
688f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        } else {
689f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            digestedLength = encryptedLength;
690a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
691a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
692a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        ssize_t maxValueLength = digestedLength - sizeof(mBlob.length);
693a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        mBlob.length = ntohl(mBlob.length);
694a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (mBlob.length < 0 || mBlob.length > maxValueLength) {
695a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return VALUE_CORRUPTED;
696a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
697a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (mBlob.info != 0) {
698a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            // move info from after padding to after data
699a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            memmove(&mBlob.value[mBlob.length], &mBlob.value[maxValueLength], mBlob.info);
700a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
70107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
702a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
703a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
704a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootprivate:
705a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    struct blob mBlob;
706a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root};
707a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
708655b958eb2180c7c06889f83f606d23421bf038cKenny Rootclass UserState {
709655b958eb2180c7c06889f83f606d23421bf038cKenny Rootpublic:
710655b958eb2180c7c06889f83f606d23421bf038cKenny Root    UserState(uid_t userId) : mUserId(userId), mRetry(MAX_RETRY) {
711655b958eb2180c7c06889f83f606d23421bf038cKenny Root        asprintf(&mUserDir, "user_%u", mUserId);
712655b958eb2180c7c06889f83f606d23421bf038cKenny Root        asprintf(&mMasterKeyFile, "%s/.masterkey", mUserDir);
713655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
71470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
715655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ~UserState() {
716655b958eb2180c7c06889f83f606d23421bf038cKenny Root        free(mUserDir);
717655b958eb2180c7c06889f83f606d23421bf038cKenny Root        free(mMasterKeyFile);
718655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
71970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
720655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool initialize() {
721655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if ((mkdir(mUserDir, S_IRUSR | S_IWUSR | S_IXUSR) < 0) && (errno != EEXIST)) {
722655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGE("Could not create directory '%s'", mUserDir);
723655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return false;
724655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
725655b958eb2180c7c06889f83f606d23421bf038cKenny Root
726655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(mMasterKeyFile, R_OK) == 0) {
727a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            setState(STATE_LOCKED);
728a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        } else {
729a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            setState(STATE_UNINITIALIZED);
730a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
73170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
732655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return true;
733655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
734655b958eb2180c7c06889f83f606d23421bf038cKenny Root
735655b958eb2180c7c06889f83f606d23421bf038cKenny Root    uid_t getUserId() const {
736655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mUserId;
737655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
738655b958eb2180c7c06889f83f606d23421bf038cKenny Root
739655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const char* getUserDirName() const {
740655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mUserDir;
741655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
742655b958eb2180c7c06889f83f606d23421bf038cKenny Root
743655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const char* getMasterKeyFileName() const {
744655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mMasterKeyFile;
745655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
746655b958eb2180c7c06889f83f606d23421bf038cKenny Root
747655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void setState(State state) {
748655b958eb2180c7c06889f83f606d23421bf038cKenny Root        mState = state;
749655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (mState == STATE_NO_ERROR || mState == STATE_UNINITIALIZED) {
750655b958eb2180c7c06889f83f606d23421bf038cKenny Root            mRetry = MAX_RETRY;
751655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
752a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
753a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
7545187818895c4c5f650a611c40531b1dff7764c18Kenny Root    State getState() const {
755a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return mState;
756a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
757a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
7585187818895c4c5f650a611c40531b1dff7764c18Kenny Root    int8_t getRetry() const {
759a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return mRetry;
760a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
761a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
762655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void zeroizeMasterKeysInMemory() {
763655b958eb2180c7c06889f83f606d23421bf038cKenny Root        memset(mMasterKey, 0, sizeof(mMasterKey));
764655b958eb2180c7c06889f83f606d23421bf038cKenny Root        memset(mSalt, 0, sizeof(mSalt));
765655b958eb2180c7c06889f83f606d23421bf038cKenny Root        memset(&mMasterKeyEncryption, 0, sizeof(mMasterKeyEncryption));
766655b958eb2180c7c06889f83f606d23421bf038cKenny Root        memset(&mMasterKeyDecryption, 0, sizeof(mMasterKeyDecryption));
76770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
76870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
769655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode initialize(const android::String8& pw, Entropy* entropy) {
770655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (!generateMasterKey(entropy)) {
771a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
772a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
773655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode response = writeMasterKey(pw, entropy);
774a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (response != NO_ERROR) {
775a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return response;
776a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
777a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        setupMasterKeys();
77807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
779a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
780a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
7814e865753346fc6a075966972a7a98051818859dbRobin Lee    ResponseCode copyMasterKey(UserState* src) {
7824e865753346fc6a075966972a7a98051818859dbRobin Lee        if (mState != STATE_UNINITIALIZED) {
7834e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::SYSTEM_ERROR;
7844e865753346fc6a075966972a7a98051818859dbRobin Lee        }
7854e865753346fc6a075966972a7a98051818859dbRobin Lee        if (src->getState() != STATE_NO_ERROR) {
7864e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::SYSTEM_ERROR;
7874e865753346fc6a075966972a7a98051818859dbRobin Lee        }
7884e865753346fc6a075966972a7a98051818859dbRobin Lee        memcpy(mMasterKey, src->mMasterKey, MASTER_KEY_SIZE_BYTES);
7894e865753346fc6a075966972a7a98051818859dbRobin Lee        setupMasterKeys();
7904e865753346fc6a075966972a7a98051818859dbRobin Lee        return ::NO_ERROR;
7914e865753346fc6a075966972a7a98051818859dbRobin Lee    }
7924e865753346fc6a075966972a7a98051818859dbRobin Lee
793655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode writeMasterKey(const android::String8& pw, Entropy* entropy) {
794a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        uint8_t passwordKey[MASTER_KEY_SIZE_BYTES];
795a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        generateKeyFromPassword(passwordKey, MASTER_KEY_SIZE_BYTES, pw, mSalt);
796a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        AES_KEY passwordAesKey;
797a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        AES_set_encrypt_key(passwordKey, MASTER_KEY_SIZE_BITS, &passwordAesKey);
798822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        Blob masterKeyBlob(mMasterKey, sizeof(mMasterKey), mSalt, sizeof(mSalt), TYPE_MASTER_KEY);
799f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        return masterKeyBlob.writeBlob(mMasterKeyFile, &passwordAesKey, STATE_NO_ERROR, entropy);
800a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
801a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
802655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode readMasterKey(const android::String8& pw, Entropy* entropy) {
803655b958eb2180c7c06889f83f606d23421bf038cKenny Root        int in = TEMP_FAILURE_RETRY(open(mMasterKeyFile, O_RDONLY));
804150ca934edb745de3666a6492b039900df228ff0Kenny Root        if (in < 0) {
805a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
806a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
807a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
808a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // we read the raw blob to just to get the salt to generate
809a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // the AES key, then we create the Blob to use with decryptBlob
810a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        blob rawBlob;
811a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        size_t length = readFully(in, (uint8_t*) &rawBlob, sizeof(rawBlob));
812a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (close(in) != 0) {
813a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return SYSTEM_ERROR;
814a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
815a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        // find salt at EOF if present, otherwise we have an old file
816a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        uint8_t* salt;
817a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (length > SALT_SIZE && rawBlob.info == SALT_SIZE) {
818a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            salt = (uint8_t*) &rawBlob + length - SALT_SIZE;
819a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        } else {
820a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            salt = NULL;
821a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
822a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        uint8_t passwordKey[MASTER_KEY_SIZE_BYTES];
823a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        generateKeyFromPassword(passwordKey, MASTER_KEY_SIZE_BYTES, pw, salt);
824a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        AES_KEY passwordAesKey;
825a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        AES_set_decrypt_key(passwordKey, MASTER_KEY_SIZE_BITS, &passwordAesKey);
826a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        Blob masterKeyBlob(rawBlob);
827f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ResponseCode response = masterKeyBlob.readBlob(mMasterKeyFile, &passwordAesKey,
828f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                STATE_NO_ERROR);
829a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (response == SYSTEM_ERROR) {
830f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            return response;
831a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
832a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (response == NO_ERROR && masterKeyBlob.getLength() == MASTER_KEY_SIZE_BYTES) {
833a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            // if salt was missing, generate one and write a new master key file with the salt.
834a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            if (salt == NULL) {
835655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (!generateSalt(entropy)) {
836a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root                    return SYSTEM_ERROR;
837a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root                }
838655b958eb2180c7c06889f83f606d23421bf038cKenny Root                response = writeMasterKey(pw, entropy);
839a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            }
840a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            if (response == NO_ERROR) {
841a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root                memcpy(mMasterKey, masterKeyBlob.getValue(), MASTER_KEY_SIZE_BYTES);
842a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root                setupMasterKeys();
843a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            }
844a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return response;
845a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
846a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (mRetry <= 0) {
847a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            reset();
848a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return UNINITIALIZED;
849a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
850a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        --mRetry;
851a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        switch (mRetry) {
852a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            case 0: return WRONG_PASSWORD_0;
853a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            case 1: return WRONG_PASSWORD_1;
854a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            case 2: return WRONG_PASSWORD_2;
855a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            case 3: return WRONG_PASSWORD_3;
856a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            default: return WRONG_PASSWORD_3;
857a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
858a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
859a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
860655b958eb2180c7c06889f83f606d23421bf038cKenny Root    AES_KEY* getEncryptionKey() {
861655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return &mMasterKeyEncryption;
862655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
863a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
864655b958eb2180c7c06889f83f606d23421bf038cKenny Root    AES_KEY* getDecryptionKey() {
865655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return &mMasterKeyDecryption;
866655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
867a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
868655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool reset() {
869655b958eb2180c7c06889f83f606d23421bf038cKenny Root        DIR* dir = opendir(getUserDirName());
870a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (!dir) {
871655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGW("couldn't open user directory: %s", strerror(errno));
872a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return false;
873a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
874655b958eb2180c7c06889f83f606d23421bf038cKenny Root
875655b958eb2180c7c06889f83f606d23421bf038cKenny Root        struct dirent* file;
876a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        while ((file = readdir(dir)) != NULL) {
877655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // We only care about files.
878655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (file->d_type != DT_REG) {
879655b958eb2180c7c06889f83f606d23421bf038cKenny Root                continue;
880655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
881655b958eb2180c7c06889f83f606d23421bf038cKenny Root
882655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Skip anything that starts with a "."
883931fac098f2ae35aa1da26ced57962c9a21f95cfKenny Root            if (file->d_name[0] == '.' && strcmp(".masterkey", file->d_name)) {
884655b958eb2180c7c06889f83f606d23421bf038cKenny Root                continue;
885655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
886655b958eb2180c7c06889f83f606d23421bf038cKenny Root
887655b958eb2180c7c06889f83f606d23421bf038cKenny Root            unlinkat(dirfd(dir), file->d_name, 0);
888a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
889a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        closedir(dir);
890a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return true;
891a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
892a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
893655b958eb2180c7c06889f83f606d23421bf038cKenny Rootprivate:
894655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const int MASTER_KEY_SIZE_BYTES = 16;
895655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const int MASTER_KEY_SIZE_BITS = MASTER_KEY_SIZE_BYTES * 8;
896655b958eb2180c7c06889f83f606d23421bf038cKenny Root
897655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const int MAX_RETRY = 4;
898655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const size_t SALT_SIZE = 16;
899655b958eb2180c7c06889f83f606d23421bf038cKenny Root
900655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void generateKeyFromPassword(uint8_t* key, ssize_t keySize, const android::String8& pw,
901655b958eb2180c7c06889f83f606d23421bf038cKenny Root            uint8_t* salt) {
902655b958eb2180c7c06889f83f606d23421bf038cKenny Root        size_t saltSize;
903655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (salt != NULL) {
904655b958eb2180c7c06889f83f606d23421bf038cKenny Root            saltSize = SALT_SIZE;
905655b958eb2180c7c06889f83f606d23421bf038cKenny Root        } else {
906655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // pre-gingerbread used this hardwired salt, readMasterKey will rewrite these when found
907655b958eb2180c7c06889f83f606d23421bf038cKenny Root            salt = (uint8_t*) "keystore";
908655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // sizeof = 9, not strlen = 8
909655b958eb2180c7c06889f83f606d23421bf038cKenny Root            saltSize = sizeof("keystore");
910655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
911655b958eb2180c7c06889f83f606d23421bf038cKenny Root
912655b958eb2180c7c06889f83f606d23421bf038cKenny Root        PKCS5_PBKDF2_HMAC_SHA1(reinterpret_cast<const char*>(pw.string()), pw.length(), salt,
913655b958eb2180c7c06889f83f606d23421bf038cKenny Root                saltSize, 8192, keySize, key);
914655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
915655b958eb2180c7c06889f83f606d23421bf038cKenny Root
916655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool generateSalt(Entropy* entropy) {
917655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return entropy->generate_random_data(mSalt, sizeof(mSalt));
918655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
919655b958eb2180c7c06889f83f606d23421bf038cKenny Root
920655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool generateMasterKey(Entropy* entropy) {
921655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (!entropy->generate_random_data(mMasterKey, sizeof(mMasterKey))) {
922655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return false;
923655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
924655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (!generateSalt(entropy)) {
925655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return false;
926655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
927655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return true;
928655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
929655b958eb2180c7c06889f83f606d23421bf038cKenny Root
930655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void setupMasterKeys() {
931655b958eb2180c7c06889f83f606d23421bf038cKenny Root        AES_set_encrypt_key(mMasterKey, MASTER_KEY_SIZE_BITS, &mMasterKeyEncryption);
932655b958eb2180c7c06889f83f606d23421bf038cKenny Root        AES_set_decrypt_key(mMasterKey, MASTER_KEY_SIZE_BITS, &mMasterKeyDecryption);
933655b958eb2180c7c06889f83f606d23421bf038cKenny Root        setState(STATE_NO_ERROR);
934655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
935655b958eb2180c7c06889f83f606d23421bf038cKenny Root
936655b958eb2180c7c06889f83f606d23421bf038cKenny Root    uid_t mUserId;
937655b958eb2180c7c06889f83f606d23421bf038cKenny Root
938655b958eb2180c7c06889f83f606d23421bf038cKenny Root    char* mUserDir;
939655b958eb2180c7c06889f83f606d23421bf038cKenny Root    char* mMasterKeyFile;
940655b958eb2180c7c06889f83f606d23421bf038cKenny Root
941655b958eb2180c7c06889f83f606d23421bf038cKenny Root    State mState;
942655b958eb2180c7c06889f83f606d23421bf038cKenny Root    int8_t mRetry;
943655b958eb2180c7c06889f83f606d23421bf038cKenny Root
944655b958eb2180c7c06889f83f606d23421bf038cKenny Root    uint8_t mMasterKey[MASTER_KEY_SIZE_BYTES];
945655b958eb2180c7c06889f83f606d23421bf038cKenny Root    uint8_t mSalt[SALT_SIZE];
946655b958eb2180c7c06889f83f606d23421bf038cKenny Root
947655b958eb2180c7c06889f83f606d23421bf038cKenny Root    AES_KEY mMasterKeyEncryption;
948655b958eb2180c7c06889f83f606d23421bf038cKenny Root    AES_KEY mMasterKeyDecryption;
949655b958eb2180c7c06889f83f606d23421bf038cKenny Root};
950655b958eb2180c7c06889f83f606d23421bf038cKenny Root
951655b958eb2180c7c06889f83f606d23421bf038cKenny Roottypedef struct {
952655b958eb2180c7c06889f83f606d23421bf038cKenny Root    uint32_t uid;
953655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const uint8_t* filename;
954655b958eb2180c7c06889f83f606d23421bf038cKenny Root} grant_t;
955655b958eb2180c7c06889f83f606d23421bf038cKenny Root
956655b958eb2180c7c06889f83f606d23421bf038cKenny Rootclass KeyStore {
957655b958eb2180c7c06889f83f606d23421bf038cKenny Rootpublic:
95867d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    KeyStore(Entropy* entropy, keymaster1_device_t* device, keymaster1_device_t* fallback)
959655b958eb2180c7c06889f83f606d23421bf038cKenny Root        : mEntropy(entropy)
960655b958eb2180c7c06889f83f606d23421bf038cKenny Root        , mDevice(device)
961fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        , mFallbackDevice(fallback)
962655b958eb2180c7c06889f83f606d23421bf038cKenny Root    {
963655b958eb2180c7c06889f83f606d23421bf038cKenny Root        memset(&mMetaData, '\0', sizeof(mMetaData));
964655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
965655b958eb2180c7c06889f83f606d23421bf038cKenny Root
966655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ~KeyStore() {
967655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<grant_t*>::iterator it(mGrants.begin());
968655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mGrants.end(); it++) {
969655b958eb2180c7c06889f83f606d23421bf038cKenny Root            delete *it;
970655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
971c35d4eb3e66aa69ca17dd83b1bcdcc19276bf8e5haitao fang        mGrants.clear();
972655b958eb2180c7c06889f83f606d23421bf038cKenny Root
973655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<UserState*>::iterator it(mMasterKeys.begin());
974655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mMasterKeys.end(); it++) {
975655b958eb2180c7c06889f83f606d23421bf038cKenny Root            delete *it;
976655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
977c35d4eb3e66aa69ca17dd83b1bcdcc19276bf8e5haitao fang        mMasterKeys.clear();
978655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
979655b958eb2180c7c06889f83f606d23421bf038cKenny Root
98067d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    /**
98167d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker     * Depending on the hardware keymaster version is this may return a
98267d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker     * keymaster0_device_t* cast to a keymaster1_device_t*. All methods from
98367d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker     * keymaster0 are safe to call, calls to keymaster1_device_t methods should
98467d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker     * be guarded by a check on the device's version.
98567d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker     */
98667d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t *getDevice() const {
987655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mDevice;
988655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
989655b958eb2180c7c06889f83f606d23421bf038cKenny Root
99067d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t *getFallbackDevice() const {
991fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        return mFallbackDevice;
992fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker    }
993fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker
99467d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t *getDeviceForBlob(const Blob& blob) const {
995fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        return blob.isFallback() ? mFallbackDevice: mDevice;
996fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker    }
997fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker
998655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode initialize() {
999655b958eb2180c7c06889f83f606d23421bf038cKenny Root        readMetaData();
1000655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (upgradeKeystore()) {
1001655b958eb2180c7c06889f83f606d23421bf038cKenny Root            writeMetaData();
1002655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1003655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1004655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return ::NO_ERROR;
1005655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1006655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1007655b958eb2180c7c06889f83f606d23421bf038cKenny Root    State getState(uid_t uid) {
1008655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return getUserState(uid)->getState();
1009655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1010655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1011655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode initializeUser(const android::String8& pw, uid_t uid) {
1012655b958eb2180c7c06889f83f606d23421bf038cKenny Root        UserState* userState = getUserState(uid);
1013655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return userState->initialize(pw, mEntropy);
1014655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1015655b958eb2180c7c06889f83f606d23421bf038cKenny Root
10164e865753346fc6a075966972a7a98051818859dbRobin Lee    ResponseCode copyMasterKey(uid_t src, uid_t uid) {
10174e865753346fc6a075966972a7a98051818859dbRobin Lee        UserState *userState = getUserState(uid);
10184e865753346fc6a075966972a7a98051818859dbRobin Lee        UserState *initState = getUserState(src);
10194e865753346fc6a075966972a7a98051818859dbRobin Lee        return userState->copyMasterKey(initState);
10204e865753346fc6a075966972a7a98051818859dbRobin Lee    }
10214e865753346fc6a075966972a7a98051818859dbRobin Lee
1022655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode writeMasterKey(const android::String8& pw, uid_t uid) {
102350122db50bcb6c1aab50ef235c8f9d264b50e97aRobin Lee        UserState* userState = getUserState(uid);
1024655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return userState->writeMasterKey(pw, mEntropy);
1025655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1026655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1027655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode readMasterKey(const android::String8& pw, uid_t uid) {
102850122db50bcb6c1aab50ef235c8f9d264b50e97aRobin Lee        UserState* userState = getUserState(uid);
1029655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return userState->readMasterKey(pw, mEntropy);
1030655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1031655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1032655b958eb2180c7c06889f83f606d23421bf038cKenny Root    android::String8 getKeyName(const android::String8& keyName) {
1033a77e809ecff5190790906fb7a3c527259c735071Douglas Leung        char encoded[encode_key_length(keyName) + 1];	// add 1 for null char
1034655b958eb2180c7c06889f83f606d23421bf038cKenny Root        encode_key(encoded, keyName);
1035655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return android::String8(encoded);
1036655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1037655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1038655b958eb2180c7c06889f83f606d23421bf038cKenny Root    android::String8 getKeyNameForUid(const android::String8& keyName, uid_t uid) {
1039a77e809ecff5190790906fb7a3c527259c735071Douglas Leung        char encoded[encode_key_length(keyName) + 1];	// add 1 for null char
1040655b958eb2180c7c06889f83f606d23421bf038cKenny Root        encode_key(encoded, keyName);
1041655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return android::String8::format("%u_%s", uid, encoded);
1042655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1043655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1044655b958eb2180c7c06889f83f606d23421bf038cKenny Root    android::String8 getKeyNameForUidWithDir(const android::String8& keyName, uid_t uid) {
1045a77e809ecff5190790906fb7a3c527259c735071Douglas Leung        char encoded[encode_key_length(keyName) + 1];	// add 1 for null char
1046655b958eb2180c7c06889f83f606d23421bf038cKenny Root        encode_key(encoded, keyName);
1047655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return android::String8::format("%s/%u_%s", getUserState(uid)->getUserDirName(), uid,
1048655b958eb2180c7c06889f83f606d23421bf038cKenny Root                encoded);
1049655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1050655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1051655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool reset(uid_t uid) {
10524b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        android::String8 prefix("");
10534b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        android::Vector<android::String16> aliases;
10544b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (saw(prefix, &aliases, uid) != ::NO_ERROR) {
10554b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            return ::SYSTEM_ERROR;
10564b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
10574b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
1058655b958eb2180c7c06889f83f606d23421bf038cKenny Root        UserState* userState = getUserState(uid);
10594b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        for (uint32_t i = 0; i < aliases.size(); i++) {
10604b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            android::String8 filename(aliases[i]);
10614b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            filename = android::String8::format("%s/%s", userState->getUserDirName(),
10624b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    getKeyName(filename).string());
10634b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            del(filename, ::TYPE_ANY, uid);
10644b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
10654b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
1066655b958eb2180c7c06889f83f606d23421bf038cKenny Root        userState->zeroizeMasterKeysInMemory();
1067655b958eb2180c7c06889f83f606d23421bf038cKenny Root        userState->setState(STATE_UNINITIALIZED);
1068655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return userState->reset();
1069655b958eb2180c7c06889f83f606d23421bf038cKenny Root    }
1070655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1071655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool isEmpty(uid_t uid) const {
1072655b958eb2180c7c06889f83f606d23421bf038cKenny Root        const UserState* userState = getUserState(uid);
107331e27468b6d822adbd2aec9219a68c206aa6957cKenny Root        if (userState == NULL || userState->getState() == STATE_UNINITIALIZED) {
1074655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return true;
1075655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1076655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1077655b958eb2180c7c06889f83f606d23421bf038cKenny Root        DIR* dir = opendir(userState->getUserDirName());
1078a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        if (!dir) {
1079a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root            return true;
1080a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
1081655b958eb2180c7c06889f83f606d23421bf038cKenny Root
108231e27468b6d822adbd2aec9219a68c206aa6957cKenny Root        bool result = true;
108331e27468b6d822adbd2aec9219a68c206aa6957cKenny Root        struct dirent* file;
1084a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        while ((file = readdir(dir)) != NULL) {
1085655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // We only care about files.
1086655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (file->d_type != DT_REG) {
1087655b958eb2180c7c06889f83f606d23421bf038cKenny Root                continue;
1088655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1089655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1090655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Skip anything that starts with a "."
1091655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (file->d_name[0] == '.') {
1092655b958eb2180c7c06889f83f606d23421bf038cKenny Root                continue;
1093655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1094655b958eb2180c7c06889f83f606d23421bf038cKenny Root
109531e27468b6d822adbd2aec9219a68c206aa6957cKenny Root            result = false;
109631e27468b6d822adbd2aec9219a68c206aa6957cKenny Root            break;
1097a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
1098a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        closedir(dir);
1099a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return result;
1100a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1101a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1102655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void lock(uid_t uid) {
1103655b958eb2180c7c06889f83f606d23421bf038cKenny Root        UserState* userState = getUserState(uid);
1104655b958eb2180c7c06889f83f606d23421bf038cKenny Root        userState->zeroizeMasterKeysInMemory();
1105655b958eb2180c7c06889f83f606d23421bf038cKenny Root        userState->setState(STATE_LOCKED);
1106a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1107a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1108655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode get(const char* filename, Blob* keyBlob, const BlobType type, uid_t uid) {
1109655b958eb2180c7c06889f83f606d23421bf038cKenny Root        UserState* userState = getUserState(uid);
1110f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ResponseCode rc = keyBlob->readBlob(filename, userState->getDecryptionKey(),
1111f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                userState->getState());
1112822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (rc != NO_ERROR) {
1113822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return rc;
1114822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1115822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1116822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        const uint8_t version = keyBlob->getVersion();
111707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (version < CURRENT_BLOB_VERSION) {
1118cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root            /* If we upgrade the key, we need to write it to disk again. Then
1119cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root             * it must be read it again since the blob is encrypted each time
1120cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root             * it's written.
1121cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root             */
1122655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (upgradeBlob(filename, keyBlob, version, type, uid)) {
1123655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if ((rc = this->put(filename, keyBlob, uid)) != NO_ERROR
1124f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                        || (rc = keyBlob->readBlob(filename, userState->getDecryptionKey(),
1125f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                                userState->getState())) != NO_ERROR) {
1126cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root                    return rc;
1127cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root                }
1128cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root            }
1129822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1130822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
113117208e0de5a42722901d803118745cca25fd10c1Kenny Root        /*
113217208e0de5a42722901d803118745cca25fd10c1Kenny Root         * This will upgrade software-backed keys to hardware-backed keys when
113317208e0de5a42722901d803118745cca25fd10c1Kenny Root         * the HAL for the device supports the newer key types.
113417208e0de5a42722901d803118745cca25fd10c1Kenny Root         */
113517208e0de5a42722901d803118745cca25fd10c1Kenny Root        if (rc == NO_ERROR && type == TYPE_KEY_PAIR
113617208e0de5a42722901d803118745cca25fd10c1Kenny Root                && mDevice->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_0_2
113717208e0de5a42722901d803118745cca25fd10c1Kenny Root                && keyBlob->isFallback()) {
113817208e0de5a42722901d803118745cca25fd10c1Kenny Root            ResponseCode imported = importKey(keyBlob->getValue(), keyBlob->getLength(), filename,
113917208e0de5a42722901d803118745cca25fd10c1Kenny Root                    uid, keyBlob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
114017208e0de5a42722901d803118745cca25fd10c1Kenny Root
114117208e0de5a42722901d803118745cca25fd10c1Kenny Root            // The HAL allowed the import, reget the key to have the "fresh"
114217208e0de5a42722901d803118745cca25fd10c1Kenny Root            // version.
114317208e0de5a42722901d803118745cca25fd10c1Kenny Root            if (imported == NO_ERROR) {
114417208e0de5a42722901d803118745cca25fd10c1Kenny Root                rc = get(filename, keyBlob, TYPE_KEY_PAIR, uid);
114517208e0de5a42722901d803118745cca25fd10c1Kenny Root            }
114617208e0de5a42722901d803118745cca25fd10c1Kenny Root        }
114717208e0de5a42722901d803118745cca25fd10c1Kenny Root
1148d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        if (type != TYPE_ANY && keyBlob->getType() != type) {
1149822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGW("key found but type doesn't match: %d vs %d", keyBlob->getType(), type);
1150822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return KEY_NOT_FOUND;
1151822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1152822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1153822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        return rc;
1154a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1155a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1156655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode put(const char* filename, Blob* keyBlob, uid_t uid) {
1157655b958eb2180c7c06889f83f606d23421bf038cKenny Root        UserState* userState = getUserState(uid);
1158f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        return keyBlob->writeBlob(filename, userState->getEncryptionKey(), userState->getState(),
1159f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                mEntropy);
1160a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1161a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
11624b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee    ResponseCode del(const char *filename, const BlobType type, uid_t uid) {
11634b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        Blob keyBlob;
11644b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        ResponseCode rc = get(filename, &keyBlob, type, uid);
11654b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (rc != ::NO_ERROR) {
11664b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            return rc;
11674b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
11684b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
11694b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (keyBlob.getType() == ::TYPE_KEY_PAIR) {
11704b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            // A device doesn't have to implement delete_keypair.
11714b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            if (mDevice->delete_keypair != NULL && !keyBlob.isFallback()) {
11724b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                if (mDevice->delete_keypair(mDevice, keyBlob.getValue(), keyBlob.getLength())) {
11734b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    rc = ::SYSTEM_ERROR;
11744b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                }
11754b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            }
11764b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
117717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (keyBlob.getType() == ::TYPE_KEYMASTER_10) {
117817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            keymaster1_device_t* dev = getDeviceForBlob(keyBlob);
117917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            if (dev->delete_key) {
118017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                keymaster_key_blob_t blob;
118117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                blob.key_material = keyBlob.getValue();
118217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                blob.key_material_size = keyBlob.getLength();
118317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                dev->delete_key(dev, &blob);
118417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            }
118517d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
11864b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (rc != ::NO_ERROR) {
11874b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            return rc;
11884b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
11894b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
11904b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        return (unlink(filename) && errno != ENOENT) ? ::SYSTEM_ERROR : ::NO_ERROR;
11914b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee    }
11924b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
11934b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee    ResponseCode saw(const android::String8& prefix, android::Vector<android::String16> *matches,
11944b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            uid_t uid) {
11954b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
11964b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        UserState* userState = getUserState(uid);
11974b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        size_t n = prefix.length();
11984b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
11994b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        DIR* dir = opendir(userState->getUserDirName());
12004b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (!dir) {
12014b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            ALOGW("can't open directory for user: %s", strerror(errno));
12024b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            return ::SYSTEM_ERROR;
12034b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
12044b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12054b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        struct dirent* file;
12064b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        while ((file = readdir(dir)) != NULL) {
12074b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            // We only care about files.
12084b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            if (file->d_type != DT_REG) {
12094b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                continue;
12104b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            }
12114b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12124b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            // Skip anything that starts with a "."
12134b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            if (file->d_name[0] == '.') {
12144b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                continue;
12154b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            }
12164b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12174b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            if (!strncmp(prefix.string(), file->d_name, n)) {
12184b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                const char* p = &file->d_name[n];
12194b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                size_t plen = strlen(p);
12204b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
12214b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                size_t extra = decode_key_length(p, plen);
12224b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                char *match = (char*) malloc(extra + 1);
12234b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                if (match != NULL) {
12244b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    decode_key(match, p, plen);
12254b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    matches->push(android::String16(match, extra));
12264b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    free(match);
12274b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                } else {
12284b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                    ALOGW("could not allocate match of size %zd", extra);
12294b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee                }
12304b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            }
12314b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        }
12324b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        closedir(dir);
12334b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        return ::NO_ERROR;
12344b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee    }
12354b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee
123607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    void addGrant(const char* filename, uid_t granteeUid) {
1237655b958eb2180c7c06889f83f606d23421bf038cKenny Root        const grant_t* existing = getGrant(filename, granteeUid);
1238655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (existing == NULL) {
1239655b958eb2180c7c06889f83f606d23421bf038cKenny Root            grant_t* grant = new grant_t;
124007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            grant->uid = granteeUid;
1241a8c703d9fdd98e3caefb6e74cd03c2878cecd0a1Brian Carlstrom            grant->filename = reinterpret_cast<const uint8_t*>(strdup(filename));
1242655b958eb2180c7c06889f83f606d23421bf038cKenny Root            mGrants.add(grant);
124370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        }
124470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
124570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
124607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    bool removeGrant(const char* filename, uid_t granteeUid) {
1247655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<grant_t*>::iterator it(mGrants.begin());
1248655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mGrants.end(); it++) {
1249655b958eb2180c7c06889f83f606d23421bf038cKenny Root            grant_t* grant = *it;
1250655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (grant->uid == granteeUid
1251655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    && !strcmp(reinterpret_cast<const char*>(grant->filename), filename)) {
1252655b958eb2180c7c06889f83f606d23421bf038cKenny Root                mGrants.erase(it);
1253655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return true;
1254655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
125570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        }
125670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        return false;
125770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
125870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1259a8c703d9fdd98e3caefb6e74cd03c2878cecd0a1Brian Carlstrom    bool hasGrant(const char* filename, const uid_t uid) const {
1260a8c703d9fdd98e3caefb6e74cd03c2878cecd0a1Brian Carlstrom        return getGrant(filename, uid) != NULL;
126170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
126270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1263f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    ResponseCode importKey(const uint8_t* key, size_t keyLen, const char* filename, uid_t uid,
1264f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            int32_t flags) {
1265822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        uint8_t* data;
1266822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        size_t dataLength;
1267822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        int rc;
1268822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1269822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (mDevice->import_keypair == NULL) {
1270822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGE("Keymaster doesn't support import!");
1271822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return SYSTEM_ERROR;
1272822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1273822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
127417208e0de5a42722901d803118745cca25fd10c1Kenny Root        bool isFallback = false;
127507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        rc = mDevice->import_keypair(mDevice, key, keyLen, &data, &dataLength);
1276822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (rc) {
1277a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root            /*
1278a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root             * Maybe the device doesn't support this type of key. Try to use the
1279a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root             * software fallback keymaster implementation. This is a little bit
1280a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root             * lazier than checking the PKCS#8 key type, but the software
1281a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root             * implementation will do that anyway.
1282a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root             */
12837c1eb75a6898452867ca28a4d7fad2d91edca615Chad Brubaker            rc = mFallbackDevice->import_keypair(mFallbackDevice, key, keyLen, &data, &dataLength);
1284a39da5a226975f8b75f93de255a21d526ae8d334Kenny Root            isFallback = true;
128517208e0de5a42722901d803118745cca25fd10c1Kenny Root
128617208e0de5a42722901d803118745cca25fd10c1Kenny Root            if (rc) {
128717208e0de5a42722901d803118745cca25fd10c1Kenny Root                ALOGE("Error while importing keypair: %d", rc);
128817208e0de5a42722901d803118745cca25fd10c1Kenny Root                return SYSTEM_ERROR;
128917208e0de5a42722901d803118745cca25fd10c1Kenny Root            }
1290822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1291822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1292822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);
1293822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        free(data);
1294822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1295f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
129617208e0de5a42722901d803118745cca25fd10c1Kenny Root        keyBlob.setFallback(isFallback);
1297f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
1298655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return put(filename, &keyBlob, uid);
1299822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
1300822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
13011b0e3933900c7ea21189704d5db64e7346aee7afKenny Root    bool isHardwareBacked(const android::String16& keyType) const {
13021b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        if (mDevice == NULL) {
13031b0e3933900c7ea21189704d5db64e7346aee7afKenny Root            ALOGW("can't get keymaster device");
13041b0e3933900c7ea21189704d5db64e7346aee7afKenny Root            return false;
13051b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        }
13061b0e3933900c7ea21189704d5db64e7346aee7afKenny Root
13071b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        if (sRSAKeyType == keyType) {
13081b0e3933900c7ea21189704d5db64e7346aee7afKenny Root            return (mDevice->flags & KEYMASTER_SOFTWARE_ONLY) == 0;
13091b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        } else {
13101b0e3933900c7ea21189704d5db64e7346aee7afKenny Root            return (mDevice->flags & KEYMASTER_SOFTWARE_ONLY) == 0
13111b0e3933900c7ea21189704d5db64e7346aee7afKenny Root                    && (mDevice->common.module->module_api_version
13121b0e3933900c7ea21189704d5db64e7346aee7afKenny Root                            >= KEYMASTER_MODULE_API_VERSION_0_2);
13131b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        }
13148ddf35a6e1fd80a7d0685041d2bfc77078277c9dKenny Root    }
13158ddf35a6e1fd80a7d0685041d2bfc77078277c9dKenny Root
1316655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode getKeyForName(Blob* keyBlob, const android::String8& keyName, const uid_t uid,
1317655b958eb2180c7c06889f83f606d23421bf038cKenny Root            const BlobType type) {
131886b16e8c0d353af97f0411917789308dba417295Kenny Root        android::String8 filepath8(getKeyNameForUidWithDir(keyName, uid));
1319a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1320655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = get(filepath8.string(), keyBlob, type, uid);
1321655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (responseCode == NO_ERROR) {
1322655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return responseCode;
1323655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1324a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1325655b958eb2180c7c06889f83f606d23421bf038cKenny Root        // If this is one of the legacy UID->UID mappings, use it.
1326655b958eb2180c7c06889f83f606d23421bf038cKenny Root        uid_t euid = get_keystore_euid(uid);
1327655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (euid != uid) {
132886b16e8c0d353af97f0411917789308dba417295Kenny Root            filepath8 = getKeyNameForUidWithDir(keyName, euid);
1329655b958eb2180c7c06889f83f606d23421bf038cKenny Root            responseCode = get(filepath8.string(), keyBlob, type, uid);
1330655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (responseCode == NO_ERROR) {
1331655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return responseCode;
1332655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1333655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
133470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1335655b958eb2180c7c06889f83f606d23421bf038cKenny Root        // They might be using a granted key.
133686b16e8c0d353af97f0411917789308dba417295Kenny Root        android::String8 filename8 = getKeyName(keyName);
1337655b958eb2180c7c06889f83f606d23421bf038cKenny Root        char* end;
133886b16e8c0d353af97f0411917789308dba417295Kenny Root        strtoul(filename8.string(), &end, 10);
1339655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (end[0] != '_' || end[1] == 0) {
1340655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return KEY_NOT_FOUND;
1341655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
134286b16e8c0d353af97f0411917789308dba417295Kenny Root        filepath8 = android::String8::format("%s/%s", getUserState(uid)->getUserDirName(),
134386b16e8c0d353af97f0411917789308dba417295Kenny Root                filename8.string());
1344655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (!hasGrant(filepath8.string(), uid)) {
1345655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return responseCode;
1346a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
1347a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1348655b958eb2180c7c06889f83f606d23421bf038cKenny Root        // It is a granted key. Try to load it.
1349655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return get(filepath8.string(), keyBlob, type, uid);
1350a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1351a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1352655b958eb2180c7c06889f83f606d23421bf038cKenny Root    /**
1353655b958eb2180c7c06889f83f606d23421bf038cKenny Root     * Returns any existing UserState or creates it if it doesn't exist.
1354655b958eb2180c7c06889f83f606d23421bf038cKenny Root     */
1355655b958eb2180c7c06889f83f606d23421bf038cKenny Root    UserState* getUserState(uid_t uid) {
1356655b958eb2180c7c06889f83f606d23421bf038cKenny Root        uid_t userId = get_user_id(uid);
1357655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1358655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<UserState*>::iterator it(mMasterKeys.begin());
1359655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mMasterKeys.end(); it++) {
1360655b958eb2180c7c06889f83f606d23421bf038cKenny Root            UserState* state = *it;
1361655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (state->getUserId() == userId) {
1362655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return state;
1363655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1364a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
1365655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1366655b958eb2180c7c06889f83f606d23421bf038cKenny Root        UserState* userState = new UserState(userId);
1367655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (!userState->initialize()) {
1368655b958eb2180c7c06889f83f606d23421bf038cKenny Root            /* There's not much we can do if initialization fails. Trying to
1369655b958eb2180c7c06889f83f606d23421bf038cKenny Root             * unlock the keystore for that user will fail as well, so any
1370655b958eb2180c7c06889f83f606d23421bf038cKenny Root             * subsequent request for this user will just return SYSTEM_ERROR.
1371655b958eb2180c7c06889f83f606d23421bf038cKenny Root             */
1372655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGE("User initialization failed for %u; subsuquent operations will fail", userId);
1373a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
1374655b958eb2180c7c06889f83f606d23421bf038cKenny Root        mMasterKeys.add(userState);
1375655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return userState;
1376a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1377a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1378655b958eb2180c7c06889f83f606d23421bf038cKenny Root    /**
1379655b958eb2180c7c06889f83f606d23421bf038cKenny Root     * Returns NULL if the UserState doesn't already exist.
1380655b958eb2180c7c06889f83f606d23421bf038cKenny Root     */
1381655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const UserState* getUserState(uid_t uid) const {
1382655b958eb2180c7c06889f83f606d23421bf038cKenny Root        uid_t userId = get_user_id(uid);
1383655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1384655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<UserState*>::const_iterator it(mMasterKeys.begin());
1385655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mMasterKeys.end(); it++) {
1386655b958eb2180c7c06889f83f606d23421bf038cKenny Root            UserState* state = *it;
1387655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (state->getUserId() == userId) {
1388655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return state;
1389655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1390655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1391a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1392655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return NULL;
1393a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1394a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1395655b958eb2180c7c06889f83f606d23421bf038cKenny Rootprivate:
1396655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const char* sOldMasterKey;
1397655b958eb2180c7c06889f83f606d23421bf038cKenny Root    static const char* sMetaDataFile;
13981b0e3933900c7ea21189704d5db64e7346aee7afKenny Root    static const android::String16 sRSAKeyType;
1399655b958eb2180c7c06889f83f606d23421bf038cKenny Root    Entropy* mEntropy;
140007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
140167d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t* mDevice;
140267d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t* mFallbackDevice;
1403a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1404655b958eb2180c7c06889f83f606d23421bf038cKenny Root    android::Vector<UserState*> mMasterKeys;
1405655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1406655b958eb2180c7c06889f83f606d23421bf038cKenny Root    android::Vector<grant_t*> mGrants;
140770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1408655b958eb2180c7c06889f83f606d23421bf038cKenny Root    typedef struct {
1409655b958eb2180c7c06889f83f606d23421bf038cKenny Root        uint32_t version;
1410655b958eb2180c7c06889f83f606d23421bf038cKenny Root    } keystore_metadata_t;
141170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1412655b958eb2180c7c06889f83f606d23421bf038cKenny Root    keystore_metadata_t mMetaData;
1413655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1414655b958eb2180c7c06889f83f606d23421bf038cKenny Root    const grant_t* getGrant(const char* filename, uid_t uid) const {
1415655b958eb2180c7c06889f83f606d23421bf038cKenny Root        for (android::Vector<grant_t*>::const_iterator it(mGrants.begin());
1416655b958eb2180c7c06889f83f606d23421bf038cKenny Root                it != mGrants.end(); it++) {
1417655b958eb2180c7c06889f83f606d23421bf038cKenny Root            grant_t* grant = *it;
141870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root            if (grant->uid == uid
1419655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    && !strcmp(reinterpret_cast<const char*>(grant->filename), filename)) {
142070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root                return grant;
142170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root            }
142270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        }
142370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        return NULL;
142470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
142570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1426822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    /**
1427822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * Upgrade code. This will upgrade the key from the current version
1428822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * to whatever is newest.
1429822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     */
1430655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool upgradeBlob(const char* filename, Blob* blob, const uint8_t oldVersion,
1431655b958eb2180c7c06889f83f606d23421bf038cKenny Root            const BlobType type, uid_t uid) {
1432822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        bool updated = false;
1433822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        uint8_t version = oldVersion;
1434822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1435822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        /* From V0 -> V1: All old types were unknown */
1436822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (version == 0) {
1437822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGV("upgrading to version 1 and setting type %d", type);
1438822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1439822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            blob->setType(type);
1440822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            if (type == TYPE_KEY_PAIR) {
1441655b958eb2180c7c06889f83f606d23421bf038cKenny Root                importBlobAsKey(blob, filename, uid);
1442822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            }
1443822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            version = 1;
1444822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            updated = true;
1445822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1446822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1447f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        /* From V1 -> V2: All old keys were encrypted */
1448f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        if (version == 1) {
1449f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            ALOGV("upgrading to version 2");
1450f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
1451f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            blob->setEncrypted(true);
1452f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            version = 2;
1453f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            updated = true;
1454f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        }
1455f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root
1456822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        /*
1457822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root         * If we've updated, set the key blob to the right version
1458822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root         * and write it.
1459cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root         */
1460822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (updated) {
1461822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGV("updated and writing file %s", filename);
1462822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            blob->setVersion(version);
1463822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1464cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root
1465cfeae072c96d84f286ddbf0aff8055c12c7c4f15Kenny Root        return updated;
1466822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
1467822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1468822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    /**
1469822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * Takes a blob that is an PEM-encoded RSA key as a byte array and
1470822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * converts it to a DER-encoded PKCS#8 for import into a keymaster.
1471822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * Then it overwrites the original blob with the new blob
1472822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     * format that is returned from the keymaster.
1473822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root     */
1474655b958eb2180c7c06889f83f606d23421bf038cKenny Root    ResponseCode importBlobAsKey(Blob* blob, const char* filename, uid_t uid) {
1475822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        // We won't even write to the blob directly with this BIO, so const_cast is okay.
1476822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        Unique_BIO b(BIO_new_mem_buf(const_cast<uint8_t*>(blob->getValue()), blob->getLength()));
1477822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (b.get() == NULL) {
1478822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGE("Problem instantiating BIO");
1479822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return SYSTEM_ERROR;
1480822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1481822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1482822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        Unique_EVP_PKEY pkey(PEM_read_bio_PrivateKey(b.get(), NULL, NULL, NULL));
1483822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (pkey.get() == NULL) {
1484822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGE("Couldn't read old PEM file");
1485822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return SYSTEM_ERROR;
1486822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1487822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1488822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        Unique_PKCS8_PRIV_KEY_INFO pkcs8(EVP_PKEY2PKCS8(pkey.get()));
1489822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        int len = i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), NULL);
1490822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (len < 0) {
1491822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGE("Couldn't measure PKCS#8 length");
1492822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return SYSTEM_ERROR;
1493822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1494822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
149570c9889c5ca912e7c492580e1999f18ab65b267bKenny Root        UniquePtr<unsigned char[]> pkcs8key(new unsigned char[len]);
149670c9889c5ca912e7c492580e1999f18ab65b267bKenny Root        uint8_t* tmp = pkcs8key.get();
1497822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), &tmp) != len) {
1498822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            ALOGE("Couldn't convert to PKCS#8");
1499822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return SYSTEM_ERROR;
1500822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1501822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1502f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root        ResponseCode rc = importKey(pkcs8key.get(), len, filename, uid,
1503f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root                blob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
1504822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        if (rc != NO_ERROR) {
1505822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root            return rc;
1506822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root        }
1507822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root
1508655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return get(filename, blob, TYPE_KEY_PAIR, uid);
1509822c3a99d930e9299e2fad2fb3e0ff91b119b95aKenny Root    }
151070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1511655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void readMetaData() {
1512655b958eb2180c7c06889f83f606d23421bf038cKenny Root        int in = TEMP_FAILURE_RETRY(open(sMetaDataFile, O_RDONLY));
1513655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (in < 0) {
1514655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return;
1515655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1516655b958eb2180c7c06889f83f606d23421bf038cKenny Root        size_t fileLength = readFully(in, (uint8_t*) &mMetaData, sizeof(mMetaData));
1517655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (fileLength != sizeof(mMetaData)) {
1518655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGI("Metadata file is %zd bytes (%zd experted); upgrade?", fileLength,
1519655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    sizeof(mMetaData));
1520655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1521655b958eb2180c7c06889f83f606d23421bf038cKenny Root        close(in);
152270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
152370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1524655b958eb2180c7c06889f83f606d23421bf038cKenny Root    void writeMetaData() {
1525655b958eb2180c7c06889f83f606d23421bf038cKenny Root        const char* tmpFileName = ".metadata.tmp";
1526655b958eb2180c7c06889f83f606d23421bf038cKenny Root        int out = TEMP_FAILURE_RETRY(open(tmpFileName,
1527655b958eb2180c7c06889f83f606d23421bf038cKenny Root                O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR));
1528655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (out < 0) {
1529655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGE("couldn't write metadata file: %s", strerror(errno));
1530655b958eb2180c7c06889f83f606d23421bf038cKenny Root            return;
1531655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1532655b958eb2180c7c06889f83f606d23421bf038cKenny Root        size_t fileLength = writeFully(out, (uint8_t*) &mMetaData, sizeof(mMetaData));
1533655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (fileLength != sizeof(mMetaData)) {
1534655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGI("Could only write %zd bytes to metadata file (%zd expected)", fileLength,
1535655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    sizeof(mMetaData));
153670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        }
1537655b958eb2180c7c06889f83f606d23421bf038cKenny Root        close(out);
1538655b958eb2180c7c06889f83f606d23421bf038cKenny Root        rename(tmpFileName, sMetaDataFile);
153970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
154070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1541655b958eb2180c7c06889f83f606d23421bf038cKenny Root    bool upgradeKeystore() {
1542655b958eb2180c7c06889f83f606d23421bf038cKenny Root        bool upgraded = false;
1543655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1544655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (mMetaData.version == 0) {
1545655b958eb2180c7c06889f83f606d23421bf038cKenny Root            UserState* userState = getUserState(0);
1546655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1547655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Initialize first so the directory is made.
1548655b958eb2180c7c06889f83f606d23421bf038cKenny Root            userState->initialize();
1549655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1550655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Migrate the old .masterkey file to user 0.
1551655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (access(sOldMasterKey, R_OK) == 0) {
1552655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (rename(sOldMasterKey, userState->getMasterKeyFileName()) < 0) {
1553655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    ALOGE("couldn't migrate old masterkey: %s", strerror(errno));
1554655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    return false;
1555655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1556655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1557655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1558655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Initialize again in case we had a key.
1559655b958eb2180c7c06889f83f606d23421bf038cKenny Root            userState->initialize();
1560655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1561655b958eb2180c7c06889f83f606d23421bf038cKenny Root            // Try to migrate existing keys.
1562655b958eb2180c7c06889f83f606d23421bf038cKenny Root            DIR* dir = opendir(".");
1563655b958eb2180c7c06889f83f606d23421bf038cKenny Root            if (!dir) {
1564655b958eb2180c7c06889f83f606d23421bf038cKenny Root                // Give up now; maybe we can upgrade later.
1565655b958eb2180c7c06889f83f606d23421bf038cKenny Root                ALOGE("couldn't open keystore's directory; something is wrong");
1566655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return false;
1567655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1568655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1569655b958eb2180c7c06889f83f606d23421bf038cKenny Root            struct dirent* file;
1570655b958eb2180c7c06889f83f606d23421bf038cKenny Root            while ((file = readdir(dir)) != NULL) {
1571655b958eb2180c7c06889f83f606d23421bf038cKenny Root                // We only care about files.
1572655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (file->d_type != DT_REG) {
1573655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    continue;
1574655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1575655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1576655b958eb2180c7c06889f83f606d23421bf038cKenny Root                // Skip anything that starts with a "."
1577655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (file->d_name[0] == '.') {
1578655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    continue;
1579655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1580655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1581655b958eb2180c7c06889f83f606d23421bf038cKenny Root                // Find the current file's user.
1582655b958eb2180c7c06889f83f606d23421bf038cKenny Root                char* end;
1583655b958eb2180c7c06889f83f606d23421bf038cKenny Root                unsigned long thisUid = strtoul(file->d_name, &end, 10);
1584655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (end[0] != '_' || end[1] == 0) {
1585655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    continue;
1586655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1587655b958eb2180c7c06889f83f606d23421bf038cKenny Root                UserState* otherUser = getUserState(thisUid);
1588655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (otherUser->getUserId() != 0) {
1589655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    unlinkat(dirfd(dir), file->d_name, 0);
1590655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1591655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1592655b958eb2180c7c06889f83f606d23421bf038cKenny Root                // Rename the file into user directory.
1593655b958eb2180c7c06889f83f606d23421bf038cKenny Root                DIR* otherdir = opendir(otherUser->getUserDirName());
1594655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (otherdir == NULL) {
1595655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    ALOGW("couldn't open user directory for rename");
1596655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    continue;
1597655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1598655b958eb2180c7c06889f83f606d23421bf038cKenny Root                if (renameat(dirfd(dir), file->d_name, dirfd(otherdir), file->d_name) < 0) {
1599655b958eb2180c7c06889f83f606d23421bf038cKenny Root                    ALOGW("couldn't rename blob: %s: %s", file->d_name, strerror(errno));
1600655b958eb2180c7c06889f83f606d23421bf038cKenny Root                }
1601655b958eb2180c7c06889f83f606d23421bf038cKenny Root                closedir(otherdir);
1602655b958eb2180c7c06889f83f606d23421bf038cKenny Root            }
1603655b958eb2180c7c06889f83f606d23421bf038cKenny Root            closedir(dir);
1604655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1605655b958eb2180c7c06889f83f606d23421bf038cKenny Root            mMetaData.version = 1;
1606655b958eb2180c7c06889f83f606d23421bf038cKenny Root            upgraded = true;
1607655b958eb2180c7c06889f83f606d23421bf038cKenny Root        }
1608655b958eb2180c7c06889f83f606d23421bf038cKenny Root
1609655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return upgraded;
161070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
1611655b958eb2180c7c06889f83f606d23421bf038cKenny Root};
161270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1613655b958eb2180c7c06889f83f606d23421bf038cKenny Rootconst char* KeyStore::sOldMasterKey = ".masterkey";
1614655b958eb2180c7c06889f83f606d23421bf038cKenny Rootconst char* KeyStore::sMetaDataFile = ".metadata";
161570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
16161b0e3933900c7ea21189704d5db64e7346aee7afKenny Rootconst android::String16 KeyStore::sRSAKeyType("RSA");
16171b0e3933900c7ea21189704d5db64e7346aee7afKenny Root
161807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootnamespace android {
161907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootclass KeyStoreProxy : public BnKeystoreService, public IBinder::DeathRecipient {
162007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootpublic:
162107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    KeyStoreProxy(KeyStore* keyStore)
162240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        : mKeyStore(keyStore),
162340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker          mOperationMap(this)
162407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    {
162507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
1626a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
162740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    void binderDied(const wp<IBinder>& who) {
162840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        auto operations = mOperationMap.getOperationsForToken(who.unsafe_get());
162940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        for (auto token: operations) {
163040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            abort(token);
163140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
163207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
1633a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
163407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t test() {
16359489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_TEST)) {
163607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
163707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
1638a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
16399489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return mKeyStore->getState(IPCThreadState::self()->getCallingUid());
1640a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1641a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
164207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t get(const String16& name, uint8_t** item, size_t* itemLength) {
16439489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_GET)) {
164407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
164507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
1646a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
16479489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
164807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
164907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob;
165066dbf67dd65b4808a15ef64f0ffde1275bdd58a9Nick Kralevich
1651655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
1652494689083467ec372a58f094f041c8f102f39393Kenny Root                TYPE_GENERIC);
165307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (responseCode != ::NO_ERROR) {
1654655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGW("Could not read %s", name8.string());
165507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            *item = NULL;
165607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            *itemLength = 0;
165707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return responseCode;
165807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
165907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
166007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        *item = (uint8_t*) malloc(keyBlob.getLength());
166107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        memcpy(*item, keyBlob.getValue(), keyBlob.getLength());
166207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        *itemLength = keyBlob.getLength();
166307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
166407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
1665a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1666a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1667f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    int32_t insert(const String16& name, const uint8_t* item, size_t itemLength, int targetUid,
1668f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            int32_t flags) {
16699489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
16709489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int32_t result = checkBinderPermissionAndKeystoreState(P_INSERT, targetUid,
16719489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                    flags & KEYSTORE_FLAG_ENCRYPTED);
16729489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (result != ::NO_ERROR) {
16739489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return result;
1674b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root        }
1675b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root
167607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
1677655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
167807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
167907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob(item, itemLength, NULL, 0, ::TYPE_GENERIC);
1680ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root        keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
1681ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root
1682fa27d5bbc366e4ecb45aee5ae08565ab3ad3dcbcKenny Root        return mKeyStore->put(filename.string(), &keyBlob, targetUid);
1683a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1684a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1685494689083467ec372a58f094f041c8f102f39393Kenny Root    int32_t del(const String16& name, int targetUid) {
16869489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
16879489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_DELETE, targetUid)) {
1688b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root            return ::PERMISSION_DENIED;
1689b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root        }
169007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
1691655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
169217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        return mKeyStore->del(filename.string(), ::TYPE_ANY, targetUid);
1693298e7b1b0f9116e2054d594d7538379d86585035Kenny Root    }
1694298e7b1b0f9116e2054d594d7538379d86585035Kenny Root
1695494689083467ec372a58f094f041c8f102f39393Kenny Root    int32_t exist(const String16& name, int targetUid) {
16969489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
16979489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_EXIST, targetUid)) {
1698b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root            return ::PERMISSION_DENIED;
1699b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root        }
1700b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root
170107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
1702655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
170307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
1704655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(filename.string(), R_OK) == -1) {
170507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
170607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
170707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
1708298e7b1b0f9116e2054d594d7538379d86585035Kenny Root    }
1709298e7b1b0f9116e2054d594d7538379d86585035Kenny Root
1710494689083467ec372a58f094f041c8f102f39393Kenny Root    int32_t saw(const String16& prefix, int targetUid, Vector<String16>* matches) {
17119489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
17129489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_SAW, targetUid)) {
1713b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root            return ::PERMISSION_DENIED;
1714b88c3eb96625513df4cc998d739d17266ebaf89fKenny Root        }
171507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        const String8 prefix8(prefix);
1716655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUid(prefix8, targetUid));
171707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
17184b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (mKeyStore->saw(filename, matches, targetUid) != ::NO_ERROR) {
17194b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            return ::SYSTEM_ERROR;
172007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
172107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
1722298e7b1b0f9116e2054d594d7538379d86585035Kenny Root    }
1723298e7b1b0f9116e2054d594d7538379d86585035Kenny Root
172407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t reset() {
17259489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_RESET)) {
172607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
172707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
1728a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
17299489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
17304b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        return mKeyStore->reset(callingUid) ? ::NO_ERROR : ::SYSTEM_ERROR;
1731a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
1732a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
173307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    /*
173407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * Here is the history. To improve the security, the parameters to generate the
173507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * master key has been changed. To make a seamless transition, we update the
173607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * file using the same password when the user unlock it for the first time. If
173707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * any thing goes wrong during the transition, the new file will not overwrite
173807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * the old one. This avoids permanent damages of the existing data.
173907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     */
174007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t password(const String16& password) {
17419489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_PASSWORD)) {
174207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
174307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
1744a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
174507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        const String8 password8(password);
17469489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
1747a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
1748655b958eb2180c7c06889f83f606d23421bf038cKenny Root        switch (mKeyStore->getState(callingUid)) {
174907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            case ::STATE_UNINITIALIZED: {
175007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root                // generate master key, encrypt with password, write to file, initialize mMasterKey*.
1751655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return mKeyStore->initializeUser(password8, callingUid);
175207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            }
175307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            case ::STATE_NO_ERROR: {
175407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root                // rewrite master key with new password.
1755655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return mKeyStore->writeMasterKey(password8, callingUid);
175607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            }
175707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            case ::STATE_LOCKED: {
175807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root                // read master key, decrypt with password, initialize mMasterKey*.
1759655b958eb2180c7c06889f83f606d23421bf038cKenny Root                return mKeyStore->readMasterKey(password8, callingUid);
176007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            }
176107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
176207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::SYSTEM_ERROR;
176307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    }
1764a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
176507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t lock() {
17669489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_LOCK)) {
176707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
176807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
176907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
17709489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
1771655b958eb2180c7c06889f83f606d23421bf038cKenny Root        State state = mKeyStore->getState(callingUid);
17729d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        if (state != ::STATE_NO_ERROR) {
177307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGD("calling lock in state: %d", state);
177407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return state;
177507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
177670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1777655b958eb2180c7c06889f83f606d23421bf038cKenny Root        mKeyStore->lock(callingUid);
177807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
177970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
1780a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
178107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t unlock(const String16& pw) {
17829489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_UNLOCK)) {
178307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
178407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
178507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
17869489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
1787655b958eb2180c7c06889f83f606d23421bf038cKenny Root        State state = mKeyStore->getState(callingUid);
17889d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        if (state != ::STATE_LOCKED) {
178907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGD("calling unlock when not locked");
179007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return state;
179107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
179207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
179307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        const String8 password8(pw);
179407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return password(pw);
179570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
179670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
179707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t zero() {
17989489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_ZERO)) {
179907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return -1;
180007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
180170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
18029489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
1803655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mKeyStore->isEmpty(callingUid) ? ::KEY_NOT_FOUND : ::NO_ERROR;
180470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
180570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
180696427baf0094d50047049d329b0779c3c910402cKenny Root    int32_t generate(const String16& name, int32_t targetUid, int32_t keyType, int32_t keySize,
180796427baf0094d50047049d329b0779c3c910402cKenny Root            int32_t flags, Vector<sp<KeystoreArg> >* args) {
18089489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
18099489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int32_t result = checkBinderPermissionAndKeystoreState(P_INSERT, targetUid,
18109489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                       flags & KEYSTORE_FLAG_ENCRYPTED);
18119489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (result != ::NO_ERROR) {
18129489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return result;
181307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
181407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        uint8_t* data;
181507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        size_t dataLength;
181607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        int rc;
181717208e0de5a42722901d803118745cca25fd10c1Kenny Root        bool isFallback = false;
181870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
181967d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker        const keymaster1_device_t* device = mKeyStore->getDevice();
182067d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker        const keymaster1_device_t* fallback = mKeyStore->getFallbackDevice();
182107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device == NULL) {
182207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
182307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
182470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
182507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device->generate_keypair == NULL) {
182607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
182707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
182870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
182917208e0de5a42722901d803118745cca25fd10c1Kenny Root        if (keyType == EVP_PKEY_DSA) {
183096427baf0094d50047049d329b0779c3c910402cKenny Root            keymaster_dsa_keygen_params_t dsa_params;
183196427baf0094d50047049d329b0779c3c910402cKenny Root            memset(&dsa_params, '\0', sizeof(dsa_params));
183296427baf0094d50047049d329b0779c3c910402cKenny Root
183396427baf0094d50047049d329b0779c3c910402cKenny Root            if (keySize == -1) {
183496427baf0094d50047049d329b0779c3c910402cKenny Root                keySize = DSA_DEFAULT_KEY_SIZE;
183596427baf0094d50047049d329b0779c3c910402cKenny Root            } else if ((keySize % 64) != 0 || keySize < DSA_MIN_KEY_SIZE
183696427baf0094d50047049d329b0779c3c910402cKenny Root                    || keySize > DSA_MAX_KEY_SIZE) {
183796427baf0094d50047049d329b0779c3c910402cKenny Root                ALOGI("invalid key size %d", keySize);
183896427baf0094d50047049d329b0779c3c910402cKenny Root                return ::SYSTEM_ERROR;
183996427baf0094d50047049d329b0779c3c910402cKenny Root            }
184096427baf0094d50047049d329b0779c3c910402cKenny Root            dsa_params.key_size = keySize;
184196427baf0094d50047049d329b0779c3c910402cKenny Root
184296427baf0094d50047049d329b0779c3c910402cKenny Root            if (args->size() == 3) {
184396427baf0094d50047049d329b0779c3c910402cKenny Root                sp<KeystoreArg> gArg = args->itemAt(0);
184496427baf0094d50047049d329b0779c3c910402cKenny Root                sp<KeystoreArg> pArg = args->itemAt(1);
184596427baf0094d50047049d329b0779c3c910402cKenny Root                sp<KeystoreArg> qArg = args->itemAt(2);
184696427baf0094d50047049d329b0779c3c910402cKenny Root
184796427baf0094d50047049d329b0779c3c910402cKenny Root                if (gArg != NULL && pArg != NULL && qArg != NULL) {
184896427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.generator = reinterpret_cast<const uint8_t*>(gArg->data());
184996427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.generator_len = gArg->size();
185096427baf0094d50047049d329b0779c3c910402cKenny Root
185196427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.prime_p = reinterpret_cast<const uint8_t*>(pArg->data());
185296427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.prime_p_len = pArg->size();
185396427baf0094d50047049d329b0779c3c910402cKenny Root
185496427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.prime_q = reinterpret_cast<const uint8_t*>(qArg->data());
185596427baf0094d50047049d329b0779c3c910402cKenny Root                    dsa_params.prime_q_len = qArg->size();
185696427baf0094d50047049d329b0779c3c910402cKenny Root                } else {
185796427baf0094d50047049d329b0779c3c910402cKenny Root                    ALOGI("not all DSA parameters were read");
185896427baf0094d50047049d329b0779c3c910402cKenny Root                    return ::SYSTEM_ERROR;
185996427baf0094d50047049d329b0779c3c910402cKenny Root                }
186096427baf0094d50047049d329b0779c3c910402cKenny Root            } else if (args->size() != 0) {
186196427baf0094d50047049d329b0779c3c910402cKenny Root                ALOGI("DSA args must be 3");
186296427baf0094d50047049d329b0779c3c910402cKenny Root                return ::SYSTEM_ERROR;
186396427baf0094d50047049d329b0779c3c910402cKenny Root            }
186496427baf0094d50047049d329b0779c3c910402cKenny Root
18651d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            if (isKeyTypeSupported(device, TYPE_DSA)) {
186617208e0de5a42722901d803118745cca25fd10c1Kenny Root                rc = device->generate_keypair(device, TYPE_DSA, &dsa_params, &data, &dataLength);
186717208e0de5a42722901d803118745cca25fd10c1Kenny Root            } else {
186817208e0de5a42722901d803118745cca25fd10c1Kenny Root                isFallback = true;
1869fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                rc = fallback->generate_keypair(fallback, TYPE_DSA, &dsa_params, &data,
1870fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                                                &dataLength);
187117208e0de5a42722901d803118745cca25fd10c1Kenny Root            }
187217208e0de5a42722901d803118745cca25fd10c1Kenny Root        } else if (keyType == EVP_PKEY_EC) {
187396427baf0094d50047049d329b0779c3c910402cKenny Root            keymaster_ec_keygen_params_t ec_params;
187496427baf0094d50047049d329b0779c3c910402cKenny Root            memset(&ec_params, '\0', sizeof(ec_params));
187596427baf0094d50047049d329b0779c3c910402cKenny Root
187696427baf0094d50047049d329b0779c3c910402cKenny Root            if (keySize == -1) {
187796427baf0094d50047049d329b0779c3c910402cKenny Root                keySize = EC_DEFAULT_KEY_SIZE;
187896427baf0094d50047049d329b0779c3c910402cKenny Root            } else if (keySize < EC_MIN_KEY_SIZE || keySize > EC_MAX_KEY_SIZE) {
187996427baf0094d50047049d329b0779c3c910402cKenny Root                ALOGI("invalid key size %d", keySize);
188096427baf0094d50047049d329b0779c3c910402cKenny Root                return ::SYSTEM_ERROR;
188196427baf0094d50047049d329b0779c3c910402cKenny Root            }
188296427baf0094d50047049d329b0779c3c910402cKenny Root            ec_params.field_size = keySize;
188396427baf0094d50047049d329b0779c3c910402cKenny Root
18841d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            if (isKeyTypeSupported(device, TYPE_EC)) {
188517208e0de5a42722901d803118745cca25fd10c1Kenny Root                rc = device->generate_keypair(device, TYPE_EC, &ec_params, &data, &dataLength);
188617208e0de5a42722901d803118745cca25fd10c1Kenny Root            } else {
188717208e0de5a42722901d803118745cca25fd10c1Kenny Root                isFallback = true;
1888fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                rc = fallback->generate_keypair(fallback, TYPE_EC, &ec_params, &data, &dataLength);
188917208e0de5a42722901d803118745cca25fd10c1Kenny Root            }
189096427baf0094d50047049d329b0779c3c910402cKenny Root        } else if (keyType == EVP_PKEY_RSA) {
189196427baf0094d50047049d329b0779c3c910402cKenny Root            keymaster_rsa_keygen_params_t rsa_params;
189296427baf0094d50047049d329b0779c3c910402cKenny Root            memset(&rsa_params, '\0', sizeof(rsa_params));
189396427baf0094d50047049d329b0779c3c910402cKenny Root            rsa_params.public_exponent = RSA_DEFAULT_EXPONENT;
189496427baf0094d50047049d329b0779c3c910402cKenny Root
189596427baf0094d50047049d329b0779c3c910402cKenny Root            if (keySize == -1) {
189696427baf0094d50047049d329b0779c3c910402cKenny Root                keySize = RSA_DEFAULT_KEY_SIZE;
189796427baf0094d50047049d329b0779c3c910402cKenny Root            } else if (keySize < RSA_MIN_KEY_SIZE || keySize > RSA_MAX_KEY_SIZE) {
189896427baf0094d50047049d329b0779c3c910402cKenny Root                ALOGI("invalid key size %d", keySize);
189996427baf0094d50047049d329b0779c3c910402cKenny Root                return ::SYSTEM_ERROR;
190096427baf0094d50047049d329b0779c3c910402cKenny Root            }
190196427baf0094d50047049d329b0779c3c910402cKenny Root            rsa_params.modulus_size = keySize;
190296427baf0094d50047049d329b0779c3c910402cKenny Root
190396427baf0094d50047049d329b0779c3c910402cKenny Root            if (args->size() > 1) {
19046489e02e134e4779d35c4a340ff68ad445fde133Matteo Franchin                ALOGI("invalid number of arguments: %zu", args->size());
190596427baf0094d50047049d329b0779c3c910402cKenny Root                return ::SYSTEM_ERROR;
190696427baf0094d50047049d329b0779c3c910402cKenny Root            } else if (args->size() == 1) {
190796427baf0094d50047049d329b0779c3c910402cKenny Root                sp<KeystoreArg> pubExpBlob = args->itemAt(0);
190896427baf0094d50047049d329b0779c3c910402cKenny Root                if (pubExpBlob != NULL) {
190996427baf0094d50047049d329b0779c3c910402cKenny Root                    Unique_BIGNUM pubExpBn(
191096427baf0094d50047049d329b0779c3c910402cKenny Root                            BN_bin2bn(reinterpret_cast<const unsigned char*>(pubExpBlob->data()),
191196427baf0094d50047049d329b0779c3c910402cKenny Root                                    pubExpBlob->size(), NULL));
191296427baf0094d50047049d329b0779c3c910402cKenny Root                    if (pubExpBn.get() == NULL) {
191396427baf0094d50047049d329b0779c3c910402cKenny Root                        ALOGI("Could not convert public exponent to BN");
191496427baf0094d50047049d329b0779c3c910402cKenny Root                        return ::SYSTEM_ERROR;
191596427baf0094d50047049d329b0779c3c910402cKenny Root                    }
191696427baf0094d50047049d329b0779c3c910402cKenny Root                    unsigned long pubExp = BN_get_word(pubExpBn.get());
191796427baf0094d50047049d329b0779c3c910402cKenny Root                    if (pubExp == 0xFFFFFFFFL) {
191896427baf0094d50047049d329b0779c3c910402cKenny Root                        ALOGI("cannot represent public exponent as a long value");
191996427baf0094d50047049d329b0779c3c910402cKenny Root                        return ::SYSTEM_ERROR;
192096427baf0094d50047049d329b0779c3c910402cKenny Root                    }
192196427baf0094d50047049d329b0779c3c910402cKenny Root                    rsa_params.public_exponent = pubExp;
192296427baf0094d50047049d329b0779c3c910402cKenny Root                }
192396427baf0094d50047049d329b0779c3c910402cKenny Root            }
192496427baf0094d50047049d329b0779c3c910402cKenny Root
192596427baf0094d50047049d329b0779c3c910402cKenny Root            rc = device->generate_keypair(device, TYPE_RSA, &rsa_params, &data, &dataLength);
192696427baf0094d50047049d329b0779c3c910402cKenny Root        } else {
192796427baf0094d50047049d329b0779c3c910402cKenny Root            ALOGW("Unsupported key type %d", keyType);
192896427baf0094d50047049d329b0779c3c910402cKenny Root            rc = -1;
192996427baf0094d50047049d329b0779c3c910402cKenny Root        }
193070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
193107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (rc) {
193207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
193307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
193470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1935655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 name8(name);
19369489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
193770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
193807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);
193907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        free(data);
194007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
1941ee8068b9e7bfb2770635062fc9c2035be2142bd8Kenny Root        keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
194217208e0de5a42722901d803118745cca25fd10c1Kenny Root        keyBlob.setFallback(isFallback);
194317208e0de5a42722901d803118745cca25fd10c1Kenny Root
19449489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return mKeyStore->put(filename.string(), &keyBlob, targetUid);
194570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
194670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1947f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root    int32_t import(const String16& name, const uint8_t* data, size_t length, int targetUid,
1948f9119d6414f43ef669d64e9e53feb043eda49cf3Kenny Root            int32_t flags) {
19499489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
19509489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int32_t result = checkBinderPermissionAndKeystoreState(P_INSERT, targetUid,
19519489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                       flags & KEYSTORE_FLAG_ENCRYPTED);
19529489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (result != ::NO_ERROR) {
19539489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return result;
195407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
195507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
195660898896c3f3b2245d10076cac64346c956dbaa5Kenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
195770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1958fa27d5bbc366e4ecb45aee5ae08565ab3ad3dcbcKenny Root        return mKeyStore->importKey(data, length, filename.string(), targetUid, flags);
195970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
196070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
196107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t sign(const String16& name, const uint8_t* data, size_t length, uint8_t** out,
196207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            size_t* outLength) {
19639489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_SIGN)) {
196407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
196507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
19669a53d3eaf42104ddf02feeccec3cf7f5c1a34baeKenny Root
19679489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
196807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob;
196907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
197070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1971d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        ALOGV("sign %s from uid %d", name8.string(), callingUid);
197270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
1973655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
1974d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root                ::TYPE_KEY_PAIR);
197507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (responseCode != ::NO_ERROR) {
197607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return responseCode;
197707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
197870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
197967d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker        const keymaster1_device_t* device = mKeyStore->getDeviceForBlob(keyBlob);
198007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device == NULL) {
198107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGE("no keymaster device; cannot sign");
198207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
198307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
198470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
198507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device->sign_data == NULL) {
198607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGE("device doesn't implement signing");
198707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
198807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
198970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
199007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        keymaster_rsa_sign_params_t params;
199107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        params.digest_type = DIGEST_NONE;
199207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        params.padding_type = PADDING_NONE;
19939489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int rc = device->sign_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
1994fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                length, out, outLength);
199507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (rc) {
199607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGW("device couldn't sign data");
199707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
199807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
199970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
200007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
200170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
200270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
200307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t verify(const String16& name, const uint8_t* data, size_t dataLength,
200407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            const uint8_t* signature, size_t signatureLength) {
20059489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_VERIFY)) {
200607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
200707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
200870e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
20099489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
201007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob;
201107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
201207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        int rc;
201370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
2014655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
2015494689083467ec372a58f094f041c8f102f39393Kenny Root                TYPE_KEY_PAIR);
201607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (responseCode != ::NO_ERROR) {
201707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return responseCode;
201807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
201970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
202067d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker        const keymaster1_device_t* device = mKeyStore->getDeviceForBlob(keyBlob);
202107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device == NULL) {
202207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
202307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
202470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
202507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device->verify_data == NULL) {
202607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
202707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
202807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
202907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        keymaster_rsa_sign_params_t params;
203007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        params.digest_type = DIGEST_NONE;
203107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        params.padding_type = PADDING_NONE;
203270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
2033fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        rc = device->verify_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
2034fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                dataLength, signature, signatureLength);
203507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (rc) {
203607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
203707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        } else {
203807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::NO_ERROR;
203907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
204070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
204170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
204207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    /*
204307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * TODO: The abstraction between things stored in hardware and regular blobs
204407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * of data stored on the filesystem should be moved down to keystore itself.
204507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * Unfortunately the Java code that calls this has naming conventions that it
204607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * knows about. Ideally keystore shouldn't be used to store random blobs of
204707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * data.
204807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     *
204907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * Until that happens, it's necessary to have a separate "get_pubkey" and
205007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * "del_key" since the Java code doesn't really communicate what it's
205107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * intentions are.
205207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     */
205307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t get_pubkey(const String16& name, uint8_t** pubkey, size_t* pubkeyLength) {
2054d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        uid_t callingUid = IPCThreadState::self()->getCallingUid();
20559489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_GET)) {
2056d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root            ALOGW("permission denied for %d: get_pubkey", callingUid);
205707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::PERMISSION_DENIED;
205807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
205970e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
206007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        Blob keyBlob;
206107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
206270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
2063d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        ALOGV("get_pubkey '%s' from uid %d", name8.string(), callingUid);
206470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
2065655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
206607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root                TYPE_KEY_PAIR);
206707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (responseCode != ::NO_ERROR) {
206807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return responseCode;
206907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
207070e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
207167d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker        const keymaster1_device_t* device = mKeyStore->getDeviceForBlob(keyBlob);
207207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device == NULL) {
207307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
207407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
207570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
207607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (device->get_keypair_public == NULL) {
207707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            ALOGE("device has no get_keypair_public implementation!");
207807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
207907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
2080344e0bc23ca46b9acec97ac8bcd87949bde0ccabKenny Root
208117208e0de5a42722901d803118745cca25fd10c1Kenny Root        int rc;
2082fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        rc = device->get_keypair_public(device, keyBlob.getValue(), keyBlob.getLength(), pubkey,
2083fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker                pubkeyLength);
208407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (rc) {
208507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return ::SYSTEM_ERROR;
208607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
2087344e0bc23ca46b9acec97ac8bcd87949bde0ccabKenny Root
208807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
2089344e0bc23ca46b9acec97ac8bcd87949bde0ccabKenny Root    }
2090344e0bc23ca46b9acec97ac8bcd87949bde0ccabKenny Root
2091494689083467ec372a58f094f041c8f102f39393Kenny Root    int32_t del_key(const String16& name, int targetUid) {
20929489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return del(name, targetUid);
2093a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
209407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
209507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t grant(const String16& name, int32_t granteeUid) {
2096d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        uid_t callingUid = IPCThreadState::self()->getCallingUid();
20979489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int32_t result = checkBinderPermissionAndKeystoreState(P_GRANT);
20989489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (result != ::NO_ERROR) {
20999489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return result;
210007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
210107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
210207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
2103655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
210407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2105655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(filename.string(), R_OK) == -1) {
210607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
210707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
210807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2109655b958eb2180c7c06889f83f606d23421bf038cKenny Root        mKeyStore->addGrant(filename.string(), granteeUid);
211007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return ::NO_ERROR;
2111a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
211207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
211307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int32_t ungrant(const String16& name, int32_t granteeUid) {
2114d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        uid_t callingUid = IPCThreadState::self()->getCallingUid();
21159489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int32_t result = checkBinderPermissionAndKeystoreState(P_GRANT);
21169489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (result != ::NO_ERROR) {
21179489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return result;
211807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
211907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
212007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
2121655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
212207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2123655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(filename.string(), R_OK) == -1) {
212407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root            return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
212507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
212607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2127655b958eb2180c7c06889f83f606d23421bf038cKenny Root        return mKeyStore->removeGrant(filename.string(), granteeUid) ? ::NO_ERROR : ::KEY_NOT_FOUND;
2128a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
212907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
213007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    int64_t getmtime(const String16& name) {
2131d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root        uid_t callingUid = IPCThreadState::self()->getCallingUid();
21329489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_GET)) {
2133d38a0b07a3104fcb1e747a0fa06641dee8fc058fKenny Root            ALOGW("permission denied for %d: getmtime", callingUid);
213436a9e231e03734cd2143383d26388455c1764e17Kenny Root            return -1L;
213507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
213607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
213707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        String8 name8(name);
2138655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
213907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2140655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(filename.string(), R_OK) == -1) {
2141655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGW("could not access %s for getmtime", filename.string());
214236a9e231e03734cd2143383d26388455c1764e17Kenny Root            return -1L;
2143a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        }
214407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2145655b958eb2180c7c06889f83f606d23421bf038cKenny Root        int fd = TEMP_FAILURE_RETRY(open(filename.string(), O_NOFOLLOW, O_RDONLY));
214607438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (fd < 0) {
2147655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGW("could not open %s for getmtime", filename.string());
214836a9e231e03734cd2143383d26388455c1764e17Kenny Root            return -1L;
214907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
215007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
215107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        struct stat s;
215207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        int ret = fstat(fd, &s);
215307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        close(fd);
215407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        if (ret == -1) {
2155655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGW("could not stat %s for getmtime", filename.string());
215636a9e231e03734cd2143383d26388455c1764e17Kenny Root            return -1L;
215707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        }
215807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
215936a9e231e03734cd2143383d26388455c1764e17Kenny Root        return static_cast<int64_t>(s.st_mtime);
2160a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
216107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
2162d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root    int32_t duplicate(const String16& srcKey, int32_t srcUid, const String16& destKey,
2163d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            int32_t destUid) {
21640225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        uid_t callingUid = IPCThreadState::self()->getCallingUid();
2165eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        pid_t spid = IPCThreadState::self()->getCallingPid();
2166eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        if (!has_permission(callingUid, P_DUPLICATE, spid)) {
2167d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            ALOGW("permission denied for %d: duplicate", callingUid);
21680225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root            return -1L;
21690225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
21700225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2171655b958eb2180c7c06889f83f606d23421bf038cKenny Root        State state = mKeyStore->getState(callingUid);
21720225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        if (!isKeystoreUnlocked(state)) {
2173d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            ALOGD("calling duplicate in state: %d", state);
21740225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root            return state;
21750225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
21760225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2177d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        if (srcUid == -1 || static_cast<uid_t>(srcUid) == callingUid) {
2178d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            srcUid = callingUid;
2179d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        } else if (!is_granted_to(callingUid, srcUid)) {
2180d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            ALOGD("migrate not granted from source: %d -> %d", callingUid, srcUid);
21810225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root            return ::PERMISSION_DENIED;
21820225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
21830225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2184d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        if (destUid == -1) {
2185d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            destUid = callingUid;
2186d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        }
21870225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2188d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        if (srcUid != destUid) {
2189d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            if (static_cast<uid_t>(srcUid) != callingUid) {
2190d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root                ALOGD("can only duplicate from caller to other or to same uid: "
2191d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root                      "calling=%d, srcUid=%d, destUid=%d", callingUid, srcUid, destUid);
2192d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root                return ::PERMISSION_DENIED;
2193d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            }
21940225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2195d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            if (!is_granted_to(callingUid, destUid)) {
2196d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root                ALOGD("duplicate not granted to dest: %d -> %d", callingUid, destUid);
2197d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root                return ::PERMISSION_DENIED;
2198d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            }
21990225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
22000225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2201d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        String8 source8(srcKey);
2202655b958eb2180c7c06889f83f606d23421bf038cKenny Root        String8 sourceFile(mKeyStore->getKeyNameForUidWithDir(source8, srcUid));
2203d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root
2204d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        String8 target8(destKey);
2205fa27d5bbc366e4ecb45aee5ae08565ab3ad3dcbcKenny Root        String8 targetFile(mKeyStore->getKeyNameForUidWithDir(target8, destUid));
22060225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2207655b958eb2180c7c06889f83f606d23421bf038cKenny Root        if (access(targetFile.string(), W_OK) != -1 || errno != ENOENT) {
2208655b958eb2180c7c06889f83f606d23421bf038cKenny Root            ALOGD("destination already exists: %s", targetFile.string());
22090225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root            return ::SYSTEM_ERROR;
22100225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
22110225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
2212d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        Blob keyBlob;
2213655b958eb2180c7c06889f83f606d23421bf038cKenny Root        ResponseCode responseCode = mKeyStore->get(sourceFile.string(), &keyBlob, TYPE_ANY,
2214fa27d5bbc366e4ecb45aee5ae08565ab3ad3dcbcKenny Root                srcUid);
2215d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root        if (responseCode != ::NO_ERROR) {
2216d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root            return responseCode;
22170225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root        }
2218d53bc92f1cc4eb669ec015480cebe5ae7aaaf7cfKenny Root
2219fa27d5bbc366e4ecb45aee5ae08565ab3ad3dcbcKenny Root        return mKeyStore->put(targetFile.string(), &keyBlob, destUid);
22200225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root    }
22210225407783ee339164a0cd8ca5ef04c99d27c59aKenny Root
22221b0e3933900c7ea21189704d5db64e7346aee7afKenny Root    int32_t is_hardware_backed(const String16& keyType) {
22231b0e3933900c7ea21189704d5db64e7346aee7afKenny Root        return mKeyStore->isHardwareBacked(keyType) ? 1 : 0;
22248ddf35a6e1fd80a7d0685041d2bfc77078277c9dKenny Root    }
22258ddf35a6e1fd80a7d0685041d2bfc77078277c9dKenny Root
2226fa27d5bbc366e4ecb45aee5ae08565ab3ad3dcbcKenny Root    int32_t clear_uid(int64_t targetUid64) {
22279489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t targetUid = getEffectiveUid(targetUid64);
22289489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_CLEAR_UID, targetUid)) {
2229a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root            return ::PERMISSION_DENIED;
2230a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root        }
2231a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root
22324b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        String8 prefix = String8::format("%u_", targetUid);
22334b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        Vector<String16> aliases;
22344b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        if (mKeyStore->saw(prefix, &aliases, targetUid) != ::NO_ERROR) {
2235a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root            return ::SYSTEM_ERROR;
2236a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root        }
2237a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root
22384b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        for (uint32_t i = 0; i < aliases.size(); i++) {
22394b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            String8 name8(aliases[i]);
22404b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
22414b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee            mKeyStore->del(filename.string(), ::TYPE_ANY, targetUid);
2242a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root        }
22434b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        return ::NO_ERROR;
2244a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root    }
2245a9bb549868035e05450a9b918f8d7de9deca5343Kenny Root
22464b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee    int32_t reset_uid(int32_t targetUid) {
22479489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
22489489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_RESET_UID, targetUid)) {
22494e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::PERMISSION_DENIED;
22504e865753346fc6a075966972a7a98051818859dbRobin Lee        }
2251bbc7648d285f67b898d24d307b011fb676ba6643Chad Brubaker        // Flush the auth token table to prevent stale tokens from sticking
2252bbc7648d285f67b898d24d307b011fb676ba6643Chad Brubaker        // around.
2253bbc7648d285f67b898d24d307b011fb676ba6643Chad Brubaker        mAuthTokenTable.Clear();
22544e865753346fc6a075966972a7a98051818859dbRobin Lee
22554b84fdc21457e16b08dc2738f4744c9ca7f7cc46Robin Lee        return mKeyStore->reset(targetUid) ? ::NO_ERROR : ::SYSTEM_ERROR;
22564e865753346fc6a075966972a7a98051818859dbRobin Lee    }
22574e865753346fc6a075966972a7a98051818859dbRobin Lee
22584e865753346fc6a075966972a7a98051818859dbRobin Lee    int32_t sync_uid(int32_t sourceUid, int32_t targetUid) {
22599489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_SYNC_UID, targetUid)) {
22604e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::PERMISSION_DENIED;
22614e865753346fc6a075966972a7a98051818859dbRobin Lee        }
22629489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
22634e865753346fc6a075966972a7a98051818859dbRobin Lee        if (sourceUid == targetUid) {
22644e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::SYSTEM_ERROR;
22654e865753346fc6a075966972a7a98051818859dbRobin Lee        }
22664e865753346fc6a075966972a7a98051818859dbRobin Lee
22674e865753346fc6a075966972a7a98051818859dbRobin Lee        // Initialise user keystore with existing master key held in-memory
22684e865753346fc6a075966972a7a98051818859dbRobin Lee        return mKeyStore->copyMasterKey(sourceUid, targetUid);
22694e865753346fc6a075966972a7a98051818859dbRobin Lee    }
22704e865753346fc6a075966972a7a98051818859dbRobin Lee
22714e865753346fc6a075966972a7a98051818859dbRobin Lee    int32_t password_uid(const String16& pw, int32_t targetUid) {
22729489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        targetUid = getEffectiveUid(targetUid);
22739489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_PASSWORD, targetUid)) {
22744e865753346fc6a075966972a7a98051818859dbRobin Lee            return ::PERMISSION_DENIED;
22754e865753346fc6a075966972a7a98051818859dbRobin Lee        }
22764e865753346fc6a075966972a7a98051818859dbRobin Lee        const String8 password8(pw);
22774e865753346fc6a075966972a7a98051818859dbRobin Lee
22784e865753346fc6a075966972a7a98051818859dbRobin Lee        switch (mKeyStore->getState(targetUid)) {
22794e865753346fc6a075966972a7a98051818859dbRobin Lee            case ::STATE_UNINITIALIZED: {
22804e865753346fc6a075966972a7a98051818859dbRobin Lee                // generate master key, encrypt with password, write to file, initialize mMasterKey*.
22814e865753346fc6a075966972a7a98051818859dbRobin Lee                return mKeyStore->initializeUser(password8, targetUid);
22824e865753346fc6a075966972a7a98051818859dbRobin Lee            }
22834e865753346fc6a075966972a7a98051818859dbRobin Lee            case ::STATE_NO_ERROR: {
22844e865753346fc6a075966972a7a98051818859dbRobin Lee                // rewrite master key with new password.
22854e865753346fc6a075966972a7a98051818859dbRobin Lee                return mKeyStore->writeMasterKey(password8, targetUid);
22864e865753346fc6a075966972a7a98051818859dbRobin Lee            }
22874e865753346fc6a075966972a7a98051818859dbRobin Lee            case ::STATE_LOCKED: {
22884e865753346fc6a075966972a7a98051818859dbRobin Lee                // read master key, decrypt with password, initialize mMasterKey*.
22894e865753346fc6a075966972a7a98051818859dbRobin Lee                return mKeyStore->readMasterKey(password8, targetUid);
22904e865753346fc6a075966972a7a98051818859dbRobin Lee            }
22914e865753346fc6a075966972a7a98051818859dbRobin Lee        }
22924e865753346fc6a075966972a7a98051818859dbRobin Lee        return ::SYSTEM_ERROR;
22934e865753346fc6a075966972a7a98051818859dbRobin Lee    }
22944e865753346fc6a075966972a7a98051818859dbRobin Lee
22959c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker    int32_t addRngEntropy(const uint8_t* data, size_t dataLength) {
22969c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        const keymaster1_device_t* device = mKeyStore->getDevice();
22979c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        const keymaster1_device_t* fallback = mKeyStore->getFallbackDevice();
22989c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        int32_t devResult = KM_ERROR_UNIMPLEMENTED;
22999c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        int32_t fallbackResult = KM_ERROR_UNIMPLEMENTED;
23009c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        if (device->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_1_0 &&
23019c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker                device->add_rng_entropy != NULL) {
23029c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker            devResult = device->add_rng_entropy(device, data, dataLength);
23039c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        }
23049c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        if (fallback->add_rng_entropy) {
23059c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker            fallbackResult = fallback->add_rng_entropy(fallback, data, dataLength);
23069c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        }
23079c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        if (devResult) {
23089c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker            return devResult;
23099c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        }
23109c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        if (fallbackResult) {
23119c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker            return fallbackResult;
23129c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        }
23139c8612c88dc03dc52d85e7a482453e04e7e3e2a2Chad Brubaker        return ::NO_ERROR;
23149899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
23159899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
231617d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker    int32_t generateKey(const String16& name, const KeymasterArguments& params,
2317154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                        const uint8_t* entropy, size_t entropyLength, int uid, int flags,
2318154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                        KeyCharacteristics* outCharacteristics) {
23199489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid = getEffectiveUid(uid);
23209489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int rc = checkBinderPermissionAndKeystoreState(P_INSERT, uid,
23219489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                       flags & KEYSTORE_FLAG_ENCRYPTED);
23229489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (rc != ::NO_ERROR) {
23239489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return rc;
232417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
232517d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
23269489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        rc = KM_ERROR_UNIMPLEMENTED;
232717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        bool isFallback = false;
232817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        keymaster_key_blob_t blob;
232917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        keymaster_key_characteristics_t *out = NULL;
233017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
233117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        const keymaster1_device_t* device = mKeyStore->getDevice();
233217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        const keymaster1_device_t* fallback = mKeyStore->getFallbackDevice();
233317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (device == NULL) {
233417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            return ::SYSTEM_ERROR;
233517d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
2336154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker        // TODO: Seed from Linux RNG before this.
233717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (device->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_1_0 &&
233817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                device->generate_key != NULL) {
2339154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (!entropy) {
2340154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = KM_ERROR_OK;
2341154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            } else if (device->add_rng_entropy) {
2342154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = device->add_rng_entropy(device, entropy, entropyLength);
2343154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            } else {
2344154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = KM_ERROR_UNIMPLEMENTED;
2345154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
2346154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (rc == KM_ERROR_OK) {
2347154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = device->generate_key(device, params.params.data(), params.params.size(),
2348154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                                          &blob, &out);
2349154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
235017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
235117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        // If the HW device didn't support generate_key or generate_key failed
235217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        // fall back to the software implementation.
235317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (rc && fallback->generate_key != NULL) {
235417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            isFallback = true;
2355154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (!entropy) {
2356154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = KM_ERROR_OK;
2357154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            } else if (fallback->add_rng_entropy) {
2358154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = fallback->add_rng_entropy(fallback, entropy, entropyLength);
2359154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            } else {
2360154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = KM_ERROR_UNIMPLEMENTED;
2361154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
2362154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (rc == KM_ERROR_OK) {
2363154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                rc = fallback->generate_key(fallback, params.params.data(), params.params.size(),
2364154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                                            &blob,
2365154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                                            &out);
2366154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
236717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
236817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
236917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (out) {
237017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            if (outCharacteristics) {
237117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                outCharacteristics->characteristics = *out;
237217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            } else {
237317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker                keymaster_free_characteristics(out);
237417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            }
237517d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            free(out);
237617d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
237717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
237817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        if (rc) {
237917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker            return rc;
238017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        }
238117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
238217d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        String8 name8(name);
238317d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, uid));
238417d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
238517d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        Blob keyBlob(blob.key_material, blob.key_material_size, NULL, 0, ::TYPE_KEYMASTER_10);
238617d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        keyBlob.setFallback(isFallback);
238717d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
238817d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
238917d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        free(const_cast<uint8_t*>(blob.key_material));
239017d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker
239117d68b9520e66226f1c7b2e1b3bd183ac80ca58bChad Brubaker        return mKeyStore->put(filename.string(), &keyBlob, uid);
23929899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
23939899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
2394f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker    int32_t getKeyCharacteristics(const String16& name,
2395d663442b590b59250062335cc057478001b8e439Chad Brubaker                                  const keymaster_blob_t* clientId,
2396d663442b590b59250062335cc057478001b8e439Chad Brubaker                                  const keymaster_blob_t* appData,
2397f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker                                  KeyCharacteristics* outCharacteristics) {
2398f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        if (!outCharacteristics) {
2399f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            return KM_ERROR_UNEXPECTED_NULL_POINTER;
2400f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        }
2401f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker
2402f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
2403f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker
2404f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        Blob keyBlob;
2405f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        String8 name8(name);
2406f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        int rc;
2407f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker
2408f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
2409f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker                TYPE_KEYMASTER_10);
2410f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        if (responseCode != ::NO_ERROR) {
2411f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            return responseCode;
2412f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        }
2413f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        keymaster_key_blob_t key;
2414f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        key.key_material_size = keyBlob.getLength();
2415f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        key.key_material = keyBlob.getValue();
2416f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        keymaster1_device_t* dev = mKeyStore->getDeviceForBlob(keyBlob);
2417f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        keymaster_key_characteristics_t *out = NULL;
2418f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        if (!dev->get_key_characteristics) {
2419f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            ALOGW("device does not implement get_key_characteristics");
2420f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            return KM_ERROR_UNIMPLEMENTED;
2421f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        }
2422d663442b590b59250062335cc057478001b8e439Chad Brubaker        rc = dev->get_key_characteristics(dev, &key, clientId, appData, &out);
2423f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        if (out) {
2424f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            outCharacteristics->characteristics = *out;
2425f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker            free(out);
2426f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        }
2427f3f071fc5020fa5255f49e898a7c4a1cbf824a99Chad Brubaker        return rc ? rc : ::NO_ERROR;
24289899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
24299899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
24304c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker    int32_t importKey(const String16& name, const KeymasterArguments& params,
24314c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                                keymaster_key_format_t format, const uint8_t *keyData,
24324c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                                size_t keyLength, int uid, int flags,
24334c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                                KeyCharacteristics* outCharacteristics) {
24349489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid = getEffectiveUid(uid);
24359489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        int rc = checkBinderPermissionAndKeystoreState(P_INSERT, uid,
24369489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                       flags & KEYSTORE_FLAG_ENCRYPTED);
24379489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (rc != ::NO_ERROR) {
24389489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return rc;
24394c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
24404c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
24419489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        rc = KM_ERROR_UNIMPLEMENTED;
24424c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        bool isFallback = false;
24434c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        keymaster_key_blob_t blob;
24444c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        keymaster_key_characteristics_t *out = NULL;
24454c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
24464c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        const keymaster1_device_t* device = mKeyStore->getDevice();
24474c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        const keymaster1_device_t* fallback = mKeyStore->getFallbackDevice();
24484c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        if (device == NULL) {
24494c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            return ::SYSTEM_ERROR;
24504c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
24514c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        if (device->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_1_0 &&
24524c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                device->import_key != NULL) {
24534c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            rc = device->import_key(device, params.params.data(), params.params.size(),
24544c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                                    format, keyData, keyLength, &blob, &out);
24554c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
24564c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        if (rc && fallback->import_key != NULL) {
24574c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            isFallback = true;
24584c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            rc = fallback->import_key(fallback, params.params.data(), params.params.size(),
24594c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                                      format, keyData, keyLength, &blob, &out);
24604c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
24614c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        if (out) {
24624c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            if (outCharacteristics) {
24634c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                outCharacteristics->characteristics = *out;
24644c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            } else {
24654c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker                keymaster_free_characteristics(out);
24664c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            }
24674c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            free(out);
24684c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
24694c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        if (rc) {
24704c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker            return rc;
24714c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        }
24724c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
24734c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        String8 name8(name);
24744c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, uid));
24754c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
24764c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        Blob keyBlob(blob.key_material, blob.key_material_size, NULL, 0, ::TYPE_KEYMASTER_10);
24774c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        keyBlob.setFallback(isFallback);
24784c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
24794c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
24804c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        free((void*) blob.key_material);
24814c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker
24824c353cb98e52e2ea8f051b517fec064f1d3fa99fChad Brubaker        return mKeyStore->put(filename.string(), &keyBlob, uid);
24839899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
24849899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
248507b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker    void exportKey(const String16& name, keymaster_key_format_t format,
2486d663442b590b59250062335cc057478001b8e439Chad Brubaker                           const keymaster_blob_t* clientId,
2487d663442b590b59250062335cc057478001b8e439Chad Brubaker                           const keymaster_blob_t* appData, ExportResult* result) {
248807b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker
248907b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
249007b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker
249107b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        Blob keyBlob;
249207b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        String8 name8(name);
249307b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        int rc;
249407b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker
249507b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
249607b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker                TYPE_KEYMASTER_10);
249707b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        if (responseCode != ::NO_ERROR) {
249807b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker            result->resultCode = responseCode;
249907b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker            return;
250007b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        }
250107b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        keymaster_key_blob_t key;
250207b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        key.key_material_size = keyBlob.getLength();
250307b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        key.key_material = keyBlob.getValue();
250407b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        keymaster1_device_t* dev = mKeyStore->getDeviceForBlob(keyBlob);
250507b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        if (!dev->export_key) {
250607b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker            result->resultCode = KM_ERROR_UNIMPLEMENTED;
250707b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker            return;
250807b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        }
250907b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        uint8_t* ptr = NULL;
2510d663442b590b59250062335cc057478001b8e439Chad Brubaker        rc = dev->export_key(dev, format, &key, clientId, appData,
251107b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker                                             &ptr, &result->dataLength);
251207b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        result->exportData.reset(ptr);
251307b0cda3b14d16205ce3040d00bc18d15eda5fdcChad Brubaker        result->resultCode = rc ? rc : ::NO_ERROR;
25149899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
25159899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
2516ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker
251740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    void begin(const sp<IBinder>& appToken, const String16& name, keymaster_purpose_t purpose,
2518154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker               bool pruneable, const KeymasterArguments& params, const uint8_t* entropy,
2519154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker               size_t entropyLength, KeymasterArguments* outParams, OperationResult* result) {
252040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (!result || !outParams) {
252140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            ALOGE("Unexpected null arguments to begin()");
252240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
252340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
252440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
252540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (!pruneable && get_app_id(callingUid) != AID_SYSTEM) {
252640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            ALOGE("Non-system uid %d trying to start non-pruneable operation", callingUid);
252740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            result->resultCode = ::PERMISSION_DENIED;
252840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
252940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
25300cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!checkAllowedOperationParams(params.params)) {
25310cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            result->resultCode = KM_ERROR_INVALID_ARGUMENT;
25320cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            return;
25330cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
253440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        Blob keyBlob;
253540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        String8 name8(name);
253640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
253740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker                TYPE_KEYMASTER_10);
253840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (responseCode != ::NO_ERROR) {
253940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            result->resultCode = responseCode;
254040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
254140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
254240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_key_blob_t key;
254340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        key.key_material_size = keyBlob.getLength();
254440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        key.key_material = keyBlob.getValue();
254540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_key_param_t* out;
254640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        size_t outSize;
254740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_operation_handle_t handle;
254840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster1_device_t* dev = mKeyStore->getDeviceForBlob(keyBlob);
2549154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker        keymaster_error_t err = KM_ERROR_UNIMPLEMENTED;
255006801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        std::vector<keymaster_key_param_t> opParams(params.params);
2551ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        Unique_keymaster_key_characteristics characteristics;
2552ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        characteristics.reset(new keymaster_key_characteristics_t);
2553ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        err = getOperationCharacteristics(key, dev, opParams, characteristics.get());
2554ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        if (err) {
2555ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker            result->resultCode = err;
2556ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker            return;
2557ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        }
25580cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        const hw_auth_token_t* authToken = NULL;
25590cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        int32_t authResult = getAuthToken(characteristics.get(), 0, &authToken,
256006801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                                                /*failOnTokenMissing*/ false);
25610cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // If per-operation auth is needed we need to begin the operation and
25620cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // the client will need to authorize that operation before calling
25630cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // update. Any other auth issues stop here.
25640cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (authResult != ::NO_ERROR && authResult != ::OP_AUTH_NEEDED) {
25650cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            result->resultCode = authResult;
256606801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            return;
256706801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        }
25680cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        addAuthToParams(&opParams, authToken);
2569154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker        // Add entropy to the device first.
2570154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker        if (entropy) {
2571154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (dev->add_rng_entropy) {
2572154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                err = dev->add_rng_entropy(dev, entropy, entropyLength);
2573154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            } else {
2574154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                err = KM_ERROR_UNIMPLEMENTED;
2575154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
2576154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            if (err) {
2577154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                result->resultCode = err;
2578154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker                return;
2579154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker            }
2580154d7699cc30ef5156d6497258c4dd350fcb1286Chad Brubaker        }
258106801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        err = dev->begin(dev, purpose, &key, opParams.data(), opParams.size(), &out, &outSize,
258206801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                         &handle);
258340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker
258440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        // If there are too many operations abort the oldest operation that was
258540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        // started as pruneable and try again.
258640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        while (err == KM_ERROR_TOO_MANY_OPERATIONS && mOperationMap.hasPruneableOperation()) {
258740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            sp<IBinder> oldest = mOperationMap.getOldestPruneableOperation();
258840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            ALOGD("Ran out of operation handles, trying to prune %p", oldest.get());
258940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            if (abort(oldest) != ::NO_ERROR) {
259040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker                break;
259140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            }
25920cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            err = dev->begin(dev, purpose, &key, opParams.data(), opParams.size(), &out, &outSize,
259340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker                             &handle);
259440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
259540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (err) {
259640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            result->resultCode = err;
259740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
259840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
259940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (out) {
260040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            outParams->params.assign(out, out + outSize);
260140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            free(out);
260240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
26039899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
2604ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        sp<IBinder> operationToken = mOperationMap.addOperation(handle, dev, appToken,
2605ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker                                                                characteristics.release(),
260606801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                                                                pruneable);
26070cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (authToken) {
26080cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            mOperationMap.setOperationAuthToken(operationToken, authToken);
26090cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
26100cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // Return the authentication lookup result. If this is a per operation
26110cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // auth'd key then the resultCode will be ::OP_AUTH_NEEDED and the
26120cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // application should get an auth token using the handle before the
26130cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // first call to update, which will fail if keystore hasn't received the
26140cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        // auth token.
26150cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        result->resultCode = authResult;
261640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->token = operationToken;
2617c3a1856bbe2e39d5b3430f5f088b12fd710a159fChad Brubaker        result->handle = handle;
26189899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
26199899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
262040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    void update(const sp<IBinder>& token, const KeymasterArguments& params, const uint8_t* data,
262140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker                size_t dataLength, OperationResult* result) {
26220cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!checkAllowedOperationParams(params.params)) {
26230cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            result->resultCode = KM_ERROR_INVALID_ARGUMENT;
26240cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            return;
26250cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
262640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        const keymaster1_device_t* dev;
262740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_operation_handle_t handle;
26280cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!mOperationMap.getOperation(token, &handle, &dev, NULL)) {
262940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            result->resultCode = KM_ERROR_INVALID_OPERATION_HANDLE;
263040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
263140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
263240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        uint8_t* output_buf = NULL;
263340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        size_t output_length = 0;
263440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        size_t consumed = 0;
263506801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        std::vector<keymaster_key_param_t> opParams(params.params);
26360cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        int32_t authResult = addOperationAuthTokenIfNeeded(token, &opParams);
26370cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (authResult != ::NO_ERROR) {
263806801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            result->resultCode = authResult;
263906801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            return;
264006801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        }
264106801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        keymaster_error_t err = dev->update(dev, handle, opParams.data(), opParams.size(), data,
264206801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                                            dataLength, &consumed, &output_buf, &output_length);
264340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->data.reset(output_buf);
264440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->dataLength = output_length;
264540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->inputConsumed = consumed;
264640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->resultCode = err ? (int32_t) err : ::NO_ERROR;
264740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    }
264840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker
264940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    void finish(const sp<IBinder>& token, const KeymasterArguments& params,
265040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker                const uint8_t* signature, size_t signatureLength, OperationResult* result) {
26510cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!checkAllowedOperationParams(params.params)) {
26520cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            result->resultCode = KM_ERROR_INVALID_ARGUMENT;
26530cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            return;
26540cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
265540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        const keymaster1_device_t* dev;
265640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_operation_handle_t handle;
26570cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!mOperationMap.getOperation(token, &handle, &dev, NULL)) {
265840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            result->resultCode = KM_ERROR_INVALID_OPERATION_HANDLE;
265940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return;
266040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
266140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        uint8_t* output_buf = NULL;
266240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        size_t output_length = 0;
266306801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        std::vector<keymaster_key_param_t> opParams(params.params);
26640cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        int32_t authResult = addOperationAuthTokenIfNeeded(token, &opParams);
26650cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (authResult != ::NO_ERROR) {
266606801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            result->resultCode = authResult;
266706801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            return;
266806801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        }
26690cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
267006801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        keymaster_error_t err = dev->finish(dev, handle, opParams.data(), opParams.size(),
267106801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                                            signature, signatureLength, &output_buf,
267206801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker                                            &output_length);
267340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        // Remove the operation regardless of the result
267440a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        mOperationMap.removeOperation(token);
267506801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        mAuthTokenTable.MarkCompleted(handle);
267640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->data.reset(output_buf);
267740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->dataLength = output_length;
267840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        result->resultCode = err ? (int32_t) err : ::NO_ERROR;
267940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    }
268040a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker
268140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    int32_t abort(const sp<IBinder>& token) {
268240a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        const keymaster1_device_t* dev;
268340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        keymaster_operation_handle_t handle;
268406801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        if (!mOperationMap.getOperation(token, &handle, &dev, NULL)) {
268540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return KM_ERROR_INVALID_OPERATION_HANDLE;
268640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
268740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        mOperationMap.removeOperation(token);
268806801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        int32_t rc;
268940a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (!dev->abort) {
269006801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            rc = KM_ERROR_UNIMPLEMENTED;
269106801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        } else {
269206801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker            rc = dev->abort(dev, handle);
269340a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
269406801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        mAuthTokenTable.MarkCompleted(handle);
269540a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        if (rc) {
269640a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker            return rc;
269740a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        }
269840a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker        return ::NO_ERROR;
26999899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker    }
27009899d6b392e8223c3c00bfccadd43b18cdc96b4fChad Brubaker
27012ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker    bool isOperationAuthorized(const sp<IBinder>& token) {
27022ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker        const keymaster1_device_t* dev;
27032ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker        keymaster_operation_handle_t handle;
2704ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        const keymaster_key_characteristics_t* characteristics;
2705ad6514ab7a57504aa3b04bcc383f60940b923710Chad Brubaker        if (!mOperationMap.getOperation(token, &handle, &dev, &characteristics)) {
27062ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker            return false;
27072ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker        }
27080cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        const hw_auth_token_t* authToken = NULL;
27090cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        mOperationMap.getOperationAuthToken(token, &authToken);
271006801e0a7ccabbe8f22cff29b7edb7c7d02d7692Chad Brubaker        std::vector<keymaster_key_param_t> ignored;
27110cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        int32_t authResult = addOperationAuthTokenIfNeeded(token, &ignored);
27120cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        return authResult == ::NO_ERROR;
27132ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker    }
27142ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker
2715d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker    int32_t addAuthToken(const uint8_t* token, size_t length) {
27169489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(P_ADD_AUTH)) {
27179489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            ALOGW("addAuthToken: permission denied for %d",
27189489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                  IPCThreadState::self()->getCallingUid());
2719d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker            return ::PERMISSION_DENIED;
2720d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        }
2721d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        if (length != sizeof(hw_auth_token_t)) {
2722d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker            return KM_ERROR_INVALID_ARGUMENT;
2723d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        }
2724d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        hw_auth_token_t* authToken = new hw_auth_token_t;
2725d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        memcpy(reinterpret_cast<void*>(authToken), token, sizeof(hw_auth_token_t));
2726d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        // The table takes ownership of authToken.
2727d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        mAuthTokenTable.AddAuthenticationToken(authToken);
2728d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker        return ::NO_ERROR;
27292ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker    }
27302ed2baa7de690b09430b40625e6b18d10757a2fdChad Brubaker
273107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Rootprivate:
27329489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    static const int32_t UID_SELF = -1;
27339489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
27349489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    /**
27359489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * Get the effective target uid for a binder operation that takes an
27369489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * optional uid as the target.
27379489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     */
27389489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    inline uid_t getEffectiveUid(int32_t targetUid) {
27399489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (targetUid == UID_SELF) {
27409489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return IPCThreadState::self()->getCallingUid();
27419489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
27429489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return static_cast<uid_t>(targetUid);
27439489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    }
27449489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
27459489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    /**
27469489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * Check if the caller of the current binder method has the required
27479489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * permission and if acting on other uids the grants to do so.
27489489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     */
27499489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    inline bool checkBinderPermission(perm_t permission, int32_t targetUid = UID_SELF) {
27509489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
27519489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        pid_t spid = IPCThreadState::self()->getCallingPid();
27529489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!has_permission(callingUid, permission, spid)) {
27539489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            ALOGW("permission %s denied for %d", get_perm_label(permission), callingUid);
27549489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return false;
27559489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
27569489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!is_granted_to(callingUid, getEffectiveUid(targetUid))) {
27579489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            ALOGW("uid %d not granted to act for %d", callingUid, targetUid);
27589489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return false;
27599489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
27609489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return true;
27619489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    }
27629489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
27639489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    /**
27649489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * Check if the caller of the current binder method has the required
27659489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * permission or the target of the operation is the caller's uid. This is
27669489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * for operation where the permission is only for cross-uid activity and all
27679489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * uids are allowed to act on their own (ie: clearing all entries for a
27689489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * given uid).
27699489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     */
27709489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    inline bool checkBinderPermissionOrSelfTarget(perm_t permission, int32_t targetUid) {
27719489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        uid_t callingUid = IPCThreadState::self()->getCallingUid();
27729489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (getEffectiveUid(targetUid) == callingUid) {
27739489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return true;
27749489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        } else {
27759489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return checkBinderPermission(permission, targetUid);
27769489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
27779489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    }
27789489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
27799489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    /**
27809489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * Helper method to check that the caller has the required permission as
27819489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * well as the keystore is in the unlocked state if checkUnlocked is true.
27829489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     *
27839489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * Returns NO_ERROR on success, PERMISSION_DENIED on a permission error and
27849489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * otherwise the state of keystore when not unlocked and checkUnlocked is
27859489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     * true.
27869489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker     */
27879489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    inline int32_t checkBinderPermissionAndKeystoreState(perm_t permission, int32_t targetUid = -1,
27889489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker                                                 bool checkUnlocked = true) {
27899489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (!checkBinderPermission(permission, targetUid)) {
27909489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return ::PERMISSION_DENIED;
27919489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
27929489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        State state = mKeyStore->getState(getEffectiveUid(targetUid));
27939489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        if (checkUnlocked && !isKeystoreUnlocked(state)) {
27949489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker            return state;
27959489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        }
27969489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
27979489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker        return ::NO_ERROR;
27989489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
27999489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker    }
28009489b7905acfb27a99dd505364a715f4cf2ab5e6Chad Brubaker
28019d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root    inline bool isKeystoreUnlocked(State state) {
28029d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        switch (state) {
28039d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        case ::STATE_NO_ERROR:
28049d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root            return true;
28059d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        case ::STATE_UNINITIALIZED:
28069d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        case ::STATE_LOCKED:
28079d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root            return false;
28089d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        }
28099d45d1caba5135e6b8bd6d05d449e8dcf52b6802Kenny Root        return false;
2810a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
281107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
281267d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    bool isKeyTypeSupported(const keymaster1_device_t* device, keymaster_keypair_t keyType) {
28131d448c074a86ef5d05a22fdf1358718976628a86Kenny Root        const int32_t device_api = device->common.module->module_api_version;
28141d448c074a86ef5d05a22fdf1358718976628a86Kenny Root        if (device_api == KEYMASTER_MODULE_API_VERSION_0_2) {
28151d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            switch (keyType) {
28161d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_RSA:
28171d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_DSA:
28181d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_EC:
28191d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return true;
28201d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                default:
28211d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return false;
28221d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            }
28231d448c074a86ef5d05a22fdf1358718976628a86Kenny Root        } else if (device_api >= KEYMASTER_MODULE_API_VERSION_0_3) {
28241d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            switch (keyType) {
28251d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_RSA:
28261d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return true;
28271d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_DSA:
28281d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return device->flags & KEYMASTER_SUPPORTS_DSA;
28291d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                case TYPE_EC:
28301d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return device->flags & KEYMASTER_SUPPORTS_EC;
28311d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                default:
28321d448c074a86ef5d05a22fdf1358718976628a86Kenny Root                    return false;
28331d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            }
28341d448c074a86ef5d05a22fdf1358718976628a86Kenny Root        } else {
28351d448c074a86ef5d05a22fdf1358718976628a86Kenny Root            return keyType == TYPE_RSA;
28361d448c074a86ef5d05a22fdf1358718976628a86Kenny Root        }
28371d448c074a86ef5d05a22fdf1358718976628a86Kenny Root    }
28381d448c074a86ef5d05a22fdf1358718976628a86Kenny Root
28390cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    /**
28400cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * Check that all keymaster_key_param_t's provided by the application are
28410cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * allowed. Any parameter that keystore adds itself should be disallowed here.
28420cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     */
28430cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    bool checkAllowedOperationParams(const std::vector<keymaster_key_param_t>& params) {
28440cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        for (auto param: params) {
28450cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            switch (param.tag) {
28460cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                case KM_TAG_AUTH_TOKEN:
28470cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                    return false;
28480cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                default:
28490cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                    break;
28500cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            }
28510cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
28520cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        return true;
28530cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    }
28540cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
28550cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    keymaster_error_t getOperationCharacteristics(const keymaster_key_blob_t& key,
28560cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                    const keymaster1_device_t* dev,
28570cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                    const std::vector<keymaster_key_param_t>& params,
28580cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                    keymaster_key_characteristics_t* out) {
28590cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        UniquePtr<keymaster_blob_t> appId;
28600cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        UniquePtr<keymaster_blob_t> appData;
28610cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        for (auto param : params) {
28620cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            if (param.tag == KM_TAG_APPLICATION_ID) {
28630cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appId.reset(new keymaster_blob_t);
28640cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appId->data = param.blob.data;
28650cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appId->data_length = param.blob.data_length;
28660cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            } else if (param.tag == KM_TAG_APPLICATION_DATA) {
28670cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appData.reset(new keymaster_blob_t);
28680cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appData->data = param.blob.data;
28690cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                appData->data_length = param.blob.data_length;
28700cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            }
28710cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
28720cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        keymaster_key_characteristics_t* result = NULL;
28730cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (!dev->get_key_characteristics) {
28740cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            return KM_ERROR_UNIMPLEMENTED;
28750cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
28760cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        keymaster_error_t error = dev->get_key_characteristics(dev, &key, appId.get(),
28770cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                                               appData.get(), &result);
28780cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (result) {
28790cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            *out = *result;
28800cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            free(result);
28810cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
28820cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        return error;
28830cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    }
28840cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
28850cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    /**
28860cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * Get the auth token for this operation from the auth token table.
28870cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *
28880cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * Returns ::NO_ERROR if the auth token was set or none was required.
28890cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         ::OP_AUTH_NEEDED if it is a per op authorization, no
28900cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         authorization token exists for that operation and
28910cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         failOnTokenMissing is false.
28920cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         KM_ERROR_KEY_USER_NOT_AUTHENTICATED if there is no valid auth
28930cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         token for the operation
28940cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     */
28950cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    int32_t getAuthToken(const keymaster_key_characteristics_t* characteristics,
28960cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                         keymaster_operation_handle_t handle,
28970cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                         const hw_auth_token_t** authToken,
28980cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                         bool failOnTokenMissing = true) {
28990cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
29000cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        std::vector<keymaster_key_param_t> allCharacteristics;
29010cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        for (size_t i = 0; i < characteristics->sw_enforced.length; i++) {
29020cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            allCharacteristics.push_back(characteristics->sw_enforced.params[i]);
29030cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29040cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        for (size_t i = 0; i < characteristics->hw_enforced.length; i++) {
29050cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            allCharacteristics.push_back(characteristics->hw_enforced.params[i]);
29060cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29070cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        keymaster::AuthTokenTable::Error err =
29080cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                mAuthTokenTable.FindAuthorization(allCharacteristics.data(),
29090cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                                  allCharacteristics.size(), handle, authToken);
29100cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        switch (err) {
29110cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::OK:
29120cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::AUTH_NOT_REQUIRED:
29130cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return ::NO_ERROR;
29140cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::AUTH_TOKEN_NOT_FOUND:
29150cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::AUTH_TOKEN_EXPIRED:
29160cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::AUTH_TOKEN_WRONG_SID:
29170cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return KM_ERROR_KEY_USER_NOT_AUTHENTICATED;
29180cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            case keymaster::AuthTokenTable::OP_HANDLE_REQUIRED:
29190cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return failOnTokenMissing ? (int32_t) KM_ERROR_KEY_USER_NOT_AUTHENTICATED :
29200cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                        (int32_t) ::OP_AUTH_NEEDED;
29210cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            default:
29220cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                ALOGE("Unexpected FindAuthorization return value %d", err);
29230cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return KM_ERROR_INVALID_ARGUMENT;
29240cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29250cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    }
29260cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
29270cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    inline void addAuthToParams(std::vector<keymaster_key_param_t>* params,
29280cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                const hw_auth_token_t* token) {
29290cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        if (token) {
29300cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            params->push_back(keymaster_param_blob(KM_TAG_AUTH_TOKEN,
29310cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                                   reinterpret_cast<const uint8_t*>(token),
29320cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                                   sizeof(hw_auth_token_t)));
29330cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29340cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    }
29350cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
29360cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    /**
29370cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * Add the auth token for the operation to the param list if the operation
29380cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * requires authorization. Uses the cached result in the OperationMap if available
29390cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * otherwise gets the token from the AuthTokenTable and caches the result.
29400cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *
29410cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     * Returns ::NO_ERROR if the auth token was added or not needed.
29420cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         KM_ERROR_KEY_USER_NOT_AUTHENTICATED if the operation is not
29430cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         authenticated.
29440cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         KM_ERROR_INVALID_OPERATION_HANDLE if token is not a valid
29450cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     *         operation token.
29460cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker     */
29470cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    int32_t addOperationAuthTokenIfNeeded(sp<IBinder> token,
29480cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                                          std::vector<keymaster_key_param_t>* params) {
29490cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        const hw_auth_token_t* authToken = NULL;
29507169a8470f6539036addf3c960b075af224e83e2Chad Brubaker        mOperationMap.getOperationAuthToken(token, &authToken);
29517169a8470f6539036addf3c960b075af224e83e2Chad Brubaker        if (!authToken) {
29520cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            const keymaster1_device_t* dev;
29530cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            keymaster_operation_handle_t handle;
29540cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            const keymaster_key_characteristics_t* characteristics = NULL;
29550cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            if (!mOperationMap.getOperation(token, &handle, &dev, &characteristics)) {
29560cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return KM_ERROR_INVALID_OPERATION_HANDLE;
29570cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            }
29580cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            int32_t result = getAuthToken(characteristics, handle, &authToken);
29590cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            if (result != ::NO_ERROR) {
29600cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                return result;
29610cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            }
29620cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            if (authToken) {
29630cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker                mOperationMap.setOperationAuthToken(token, authToken);
29640cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker            }
29650cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        }
29660cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        addAuthToParams(params, authToken);
29670cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker        return ::NO_ERROR;
29680cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker    }
29690cf34a249c008743cf2e2371743a89f86aa4b03cChad Brubaker
297007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    ::KeyStore* mKeyStore;
297140a1a9b306d4e3c85b24f80ff39841507cf42357Chad Brubaker    OperationMap mOperationMap;
2972d80c7b487b2f7f0bf955d0efeaa3db6dcd160639Chad Brubaker    keymaster::AuthTokenTable mAuthTokenTable;
297307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root};
297407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root
297507438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root}; // namespace android
2976a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
2977a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Rootint main(int argc, char* argv[]) {
2978a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    if (argc < 2) {
2979a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        ALOGE("A directory must be specified!");
2980a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return 1;
2981a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
2982a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    if (chdir(argv[1]) == -1) {
2983a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        ALOGE("chdir: %s: %s", argv[1], strerror(errno));
2984a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return 1;
2985a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
2986a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root
2987a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    Entropy entropy;
2988a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    if (!entropy.open()) {
2989a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root        return 1;
2990a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
299170e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
299280843db63ed6b61c953a1243801117a15c9e8c38Shawn Willden    keymaster0_device_t* dev;
299370e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    if (keymaster_device_initialize(&dev)) {
299470e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        ALOGE("keystore keymaster could not be initialized; exiting");
299570e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root        return 1;
299670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root    }
299770e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
299867d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    keymaster1_device_t* fallback;
2999fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker    if (fallback_keymaster_device_initialize(&fallback)) {
3000fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        ALOGE("software keymaster could not be initialized; exiting");
3001fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker        return 1;
3002fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker    }
3003fc18edcdfe2f7774e621030d51338f3216170b97Chad Brubaker
3004eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    ks_is_selinux_enabled = is_selinux_enabled();
3005eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    if (ks_is_selinux_enabled) {
3006eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        union selinux_callback cb;
3007eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        cb.func_log = selinux_log_callback;
3008eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        selinux_set_callback(SELINUX_CB_LOG, cb);
3009eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        if (getcon(&tctx) != 0) {
3010eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn            ALOGE("SELinux: Could not acquire target context. Aborting keystore.\n");
3011eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn            return -1;
3012eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        }
3013eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    } else {
3014eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn        ALOGI("SELinux: Keystore SELinux is disabled.\n");
3015eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn    }
3016eaabae9bf8ff0873b0ece2a835f71ee6c6b49437Riley Spahn
301767d2a5029e8c25c5ee448e3bbd245cdcebe6abd3Chad Brubaker    KeyStore keyStore(&entropy, reinterpret_cast<keymaster1_device_t*>(dev), fallback);
3018655b958eb2180c7c06889f83f606d23421bf038cKenny Root    keyStore.initialize();
301907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    android::sp<android::IServiceManager> sm = android::defaultServiceManager();
302007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    android::sp<android::KeyStoreProxy> proxy = new android::KeyStoreProxy(&keyStore);
302107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    android::status_t ret = sm->addService(android::String16("android.security.keystore"), proxy);
302207438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    if (ret != android::OK) {
302307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        ALOGE("Couldn't register binder service!");
302407438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root        return -1;
3025a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    }
302670e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
302707438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    /*
302807438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * We're the only thread in existence, so we're just going to process
302907438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     * Binder transaction as a single-threaded program.
303007438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root     */
303107438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    android::IPCThreadState::self()->joinThreadPool();
303270e3a86abd2c412d602a018967c01c177eb6cf4eKenny Root
303307438c8d7256d3788dac323b4d0055f201e0bec9Kenny Root    keymaster_device_release(dev);
3034a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root    return 1;
3035a91203b08350b2fc7efda5b1eab39e7541476b3aKenny Root}
3036