Home | History | Annotate | Download | only in keystore
      1 /*
      2  * Copyright (C) 2009 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 //#define LOG_NDEBUG 0
     18 #define LOG_TAG "keystore"
     19 
     20 #include <stdio.h>
     21 #include <stdint.h>
     22 #include <string.h>
     23 #include <unistd.h>
     24 #include <signal.h>
     25 #include <errno.h>
     26 #include <dirent.h>
     27 #include <errno.h>
     28 #include <fcntl.h>
     29 #include <limits.h>
     30 #include <assert.h>
     31 #include <sys/types.h>
     32 #include <sys/socket.h>
     33 #include <sys/stat.h>
     34 #include <sys/time.h>
     35 #include <arpa/inet.h>
     36 
     37 #include <openssl/aes.h>
     38 #include <openssl/bio.h>
     39 #include <openssl/evp.h>
     40 #include <openssl/md5.h>
     41 #include <openssl/pem.h>
     42 
     43 #include <hardware/keymaster.h>
     44 
     45 #include <keymaster/softkeymaster.h>
     46 
     47 #include <utils/String8.h>
     48 #include <utils/UniquePtr.h>
     49 #include <utils/Vector.h>
     50 
     51 #include <keystore/IKeystoreService.h>
     52 #include <binder/IPCThreadState.h>
     53 #include <binder/IServiceManager.h>
     54 
     55 #include <cutils/log.h>
     56 #include <cutils/sockets.h>
     57 #include <private/android_filesystem_config.h>
     58 
     59 #include <keystore/keystore.h>
     60 
     61 #include "defaults.h"
     62 
     63 /* KeyStore is a secured storage for key-value pairs. In this implementation,
     64  * each file stores one key-value pair. Keys are encoded in file names, and
     65  * values are encrypted with checksums. The encryption key is protected by a
     66  * user-defined password. To keep things simple, buffers are always larger than
     67  * the maximum space we needed, so boundary checks on buffers are omitted. */
     68 
     69 #define KEY_SIZE        ((NAME_MAX - 15) / 2)
     70 #define VALUE_SIZE      32768
     71 #define PASSWORD_SIZE   VALUE_SIZE
     72 
     73 
     74 struct BIGNUM_Delete {
     75     void operator()(BIGNUM* p) const {
     76         BN_free(p);
     77     }
     78 };
     79 typedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
     80 
     81 struct BIO_Delete {
     82     void operator()(BIO* p) const {
     83         BIO_free(p);
     84     }
     85 };
     86 typedef UniquePtr<BIO, BIO_Delete> Unique_BIO;
     87 
     88 struct EVP_PKEY_Delete {
     89     void operator()(EVP_PKEY* p) const {
     90         EVP_PKEY_free(p);
     91     }
     92 };
     93 typedef UniquePtr<EVP_PKEY, EVP_PKEY_Delete> Unique_EVP_PKEY;
     94 
     95 struct PKCS8_PRIV_KEY_INFO_Delete {
     96     void operator()(PKCS8_PRIV_KEY_INFO* p) const {
     97         PKCS8_PRIV_KEY_INFO_free(p);
     98     }
     99 };
    100 typedef UniquePtr<PKCS8_PRIV_KEY_INFO, PKCS8_PRIV_KEY_INFO_Delete> Unique_PKCS8_PRIV_KEY_INFO;
    101 
    102 
    103 static int keymaster_device_initialize(keymaster_device_t** dev) {
    104     int rc;
    105 
    106     const hw_module_t* mod;
    107     rc = hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod);
    108     if (rc) {
    109         ALOGE("could not find any keystore module");
    110         goto out;
    111     }
    112 
    113     rc = keymaster_open(mod, dev);
    114     if (rc) {
    115         ALOGE("could not open keymaster device in %s (%s)",
    116             KEYSTORE_HARDWARE_MODULE_ID, strerror(-rc));
    117         goto out;
    118     }
    119 
    120     return 0;
    121 
    122 out:
    123     *dev = NULL;
    124     return rc;
    125 }
    126 
    127 static void keymaster_device_release(keymaster_device_t* dev) {
    128     keymaster_close(dev);
    129 }
    130 
    131 /***************
    132  * PERMISSIONS *
    133  ***************/
    134 
    135 /* Here are the permissions, actions, users, and the main function. */
    136 typedef enum {
    137     P_TEST      = 1 << 0,
    138     P_GET       = 1 << 1,
    139     P_INSERT    = 1 << 2,
    140     P_DELETE    = 1 << 3,
    141     P_EXIST     = 1 << 4,
    142     P_SAW       = 1 << 5,
    143     P_RESET     = 1 << 6,
    144     P_PASSWORD  = 1 << 7,
    145     P_LOCK      = 1 << 8,
    146     P_UNLOCK    = 1 << 9,
    147     P_ZERO      = 1 << 10,
    148     P_SIGN      = 1 << 11,
    149     P_VERIFY    = 1 << 12,
    150     P_GRANT     = 1 << 13,
    151     P_DUPLICATE = 1 << 14,
    152     P_CLEAR_UID = 1 << 15,
    153 } perm_t;
    154 
    155 static struct user_euid {
    156     uid_t uid;
    157     uid_t euid;
    158 } user_euids[] = {
    159     {AID_VPN, AID_SYSTEM},
    160     {AID_WIFI, AID_SYSTEM},
    161     {AID_ROOT, AID_SYSTEM},
    162 };
    163 
    164 static struct user_perm {
    165     uid_t uid;
    166     perm_t perms;
    167 } user_perms[] = {
    168     {AID_SYSTEM, static_cast<perm_t>((uint32_t)(~0)) },
    169     {AID_VPN,    static_cast<perm_t>(P_GET | P_SIGN | P_VERIFY) },
    170     {AID_WIFI,   static_cast<perm_t>(P_GET | P_SIGN | P_VERIFY) },
    171     {AID_ROOT,   static_cast<perm_t>(P_GET) },
    172 };
    173 
    174 static const perm_t DEFAULT_PERMS = static_cast<perm_t>(P_TEST | P_GET | P_INSERT | P_DELETE | P_EXIST | P_SAW | P_SIGN
    175         | P_VERIFY);
    176 
    177 /**
    178  * Returns the app ID (in the Android multi-user sense) for the current
    179  * UNIX UID.
    180  */
    181 static uid_t get_app_id(uid_t uid) {
    182     return uid % AID_USER;
    183 }
    184 
    185 /**
    186  * Returns the user ID (in the Android multi-user sense) for the current
    187  * UNIX UID.
    188  */
    189 static uid_t get_user_id(uid_t uid) {
    190     return uid / AID_USER;
    191 }
    192 
    193 
    194 static bool has_permission(uid_t uid, perm_t perm) {
    195     // All system users are equivalent for multi-user support.
    196     if (get_app_id(uid) == AID_SYSTEM) {
    197         uid = AID_SYSTEM;
    198     }
    199 
    200     for (size_t i = 0; i < sizeof(user_perms)/sizeof(user_perms[0]); i++) {
    201         struct user_perm user = user_perms[i];
    202         if (user.uid == uid) {
    203             return user.perms & perm;
    204         }
    205     }
    206 
    207     return DEFAULT_PERMS & perm;
    208 }
    209 
    210 /**
    211  * Returns the UID that the callingUid should act as. This is here for
    212  * legacy support of the WiFi and VPN systems and should be removed
    213  * when WiFi can operate in its own namespace.
    214  */
    215 static uid_t get_keystore_euid(uid_t uid) {
    216     for (size_t i = 0; i < sizeof(user_euids)/sizeof(user_euids[0]); i++) {
    217         struct user_euid user = user_euids[i];
    218         if (user.uid == uid) {
    219             return user.euid;
    220         }
    221     }
    222 
    223     return uid;
    224 }
    225 
    226 /**
    227  * Returns true if the callingUid is allowed to interact in the targetUid's
    228  * namespace.
    229  */
    230 static bool is_granted_to(uid_t callingUid, uid_t targetUid) {
    231     for (size_t i = 0; i < sizeof(user_euids)/sizeof(user_euids[0]); i++) {
    232         struct user_euid user = user_euids[i];
    233         if (user.euid == callingUid && user.uid == targetUid) {
    234             return true;
    235         }
    236     }
    237 
    238     return false;
    239 }
    240 
    241 /* Here is the encoding of keys. This is necessary in order to allow arbitrary
    242  * characters in keys. Characters in [0-~] are not encoded. Others are encoded
    243  * into two bytes. The first byte is one of [+-.] which represents the first
    244  * two bits of the character. The second byte encodes the rest of the bits into
    245  * [0-o]. Therefore in the worst case the length of a key gets doubled. Note
    246  * that Base64 cannot be used here due to the need of prefix match on keys. */
    247 
    248 static size_t encode_key_length(const android::String8& keyName) {
    249     const uint8_t* in = reinterpret_cast<const uint8_t*>(keyName.string());
    250     size_t length = keyName.length();
    251     for (int i = length; i > 0; --i, ++in) {
    252         if (*in < '0' || *in > '~') {
    253             ++length;
    254         }
    255     }
    256     return length;
    257 }
    258 
    259 static int encode_key(char* out, const android::String8& keyName) {
    260     const uint8_t* in = reinterpret_cast<const uint8_t*>(keyName.string());
    261     size_t length = keyName.length();
    262     for (int i = length; i > 0; --i, ++in, ++out) {
    263         if (*in < '0' || *in > '~') {
    264             *out = '+' + (*in >> 6);
    265             *++out = '0' + (*in & 0x3F);
    266             ++length;
    267         } else {
    268             *out = *in;
    269         }
    270     }
    271     *out = '\0';
    272     return length;
    273 }
    274 
    275 /*
    276  * Converts from the "escaped" format on disk to actual name.
    277  * This will be smaller than the input string.
    278  *
    279  * Characters that should combine with the next at the end will be truncated.
    280  */
    281 static size_t decode_key_length(const char* in, size_t length) {
    282     size_t outLength = 0;
    283 
    284     for (const char* end = in + length; in < end; in++) {
    285         /* This combines with the next character. */
    286         if (*in < '0' || *in > '~') {
    287             continue;
    288         }
    289 
    290         outLength++;
    291     }
    292     return outLength;
    293 }
    294 
    295 static void decode_key(char* out, const char* in, size_t length) {
    296     for (const char* end = in + length; in < end; in++) {
    297         if (*in < '0' || *in > '~') {
    298             /* Truncate combining characters at the end. */
    299             if (in + 1 >= end) {
    300                 break;
    301             }
    302 
    303             *out = (*in++ - '+') << 6;
    304             *out++ |= (*in - '0') & 0x3F;
    305         } else {
    306             *out++ = *in;
    307         }
    308     }
    309     *out = '\0';
    310 }
    311 
    312 static size_t readFully(int fd, uint8_t* data, size_t size) {
    313     size_t remaining = size;
    314     while (remaining > 0) {
    315         ssize_t n = TEMP_FAILURE_RETRY(read(fd, data, remaining));
    316         if (n <= 0) {
    317             return size - remaining;
    318         }
    319         data += n;
    320         remaining -= n;
    321     }
    322     return size;
    323 }
    324 
    325 static size_t writeFully(int fd, uint8_t* data, size_t size) {
    326     size_t remaining = size;
    327     while (remaining > 0) {
    328         ssize_t n = TEMP_FAILURE_RETRY(write(fd, data, remaining));
    329         if (n < 0) {
    330             ALOGW("write failed: %s", strerror(errno));
    331             return size - remaining;
    332         }
    333         data += n;
    334         remaining -= n;
    335     }
    336     return size;
    337 }
    338 
    339 class Entropy {
    340 public:
    341     Entropy() : mRandom(-1) {}
    342     ~Entropy() {
    343         if (mRandom >= 0) {
    344             close(mRandom);
    345         }
    346     }
    347 
    348     bool open() {
    349         const char* randomDevice = "/dev/urandom";
    350         mRandom = TEMP_FAILURE_RETRY(::open(randomDevice, O_RDONLY));
    351         if (mRandom < 0) {
    352             ALOGE("open: %s: %s", randomDevice, strerror(errno));
    353             return false;
    354         }
    355         return true;
    356     }
    357 
    358     bool generate_random_data(uint8_t* data, size_t size) const {
    359         return (readFully(mRandom, data, size) == size);
    360     }
    361 
    362 private:
    363     int mRandom;
    364 };
    365 
    366 /* Here is the file format. There are two parts in blob.value, the secret and
    367  * the description. The secret is stored in ciphertext, and its original size
    368  * can be found in blob.length. The description is stored after the secret in
    369  * plaintext, and its size is specified in blob.info. The total size of the two
    370  * parts must be no more than VALUE_SIZE bytes. The first field is the version,
    371  * the second is the blob's type, and the third byte is flags. Fields other
    372  * than blob.info, blob.length, and blob.value are modified by encryptBlob()
    373  * and decryptBlob(). Thus they should not be accessed from outside. */
    374 
    375 /* ** Note to future implementors of encryption: **
    376  * Currently this is the construction:
    377  *   metadata || Enc(MD5(data) || data)
    378  *
    379  * This should be the construction used for encrypting if re-implementing:
    380  *
    381  *   Derive independent keys for encryption and MAC:
    382  *     Kenc = AES_encrypt(masterKey, "Encrypt")
    383  *     Kmac = AES_encrypt(masterKey, "MAC")
    384  *
    385  *   Store this:
    386  *     metadata || AES_CTR_encrypt(Kenc, rand_IV, data) ||
    387  *             HMAC(Kmac, metadata || Enc(data))
    388  */
    389 struct __attribute__((packed)) blob {
    390     uint8_t version;
    391     uint8_t type;
    392     uint8_t flags;
    393     uint8_t info;
    394     uint8_t vector[AES_BLOCK_SIZE];
    395     uint8_t encrypted[0]; // Marks offset to encrypted data.
    396     uint8_t digest[MD5_DIGEST_LENGTH];
    397     uint8_t digested[0]; // Marks offset to digested data.
    398     int32_t length; // in network byte order when encrypted
    399     uint8_t value[VALUE_SIZE + AES_BLOCK_SIZE];
    400 };
    401 
    402 typedef enum {
    403     TYPE_ANY = 0, // meta type that matches anything
    404     TYPE_GENERIC = 1,
    405     TYPE_MASTER_KEY = 2,
    406     TYPE_KEY_PAIR = 3,
    407 } BlobType;
    408 
    409 static const uint8_t CURRENT_BLOB_VERSION = 2;
    410 
    411 class Blob {
    412 public:
    413     Blob(const uint8_t* value, int32_t valueLength, const uint8_t* info, uint8_t infoLength,
    414             BlobType type) {
    415         mBlob.length = valueLength;
    416         memcpy(mBlob.value, value, valueLength);
    417 
    418         mBlob.info = infoLength;
    419         memcpy(mBlob.value + valueLength, info, infoLength);
    420 
    421         mBlob.version = CURRENT_BLOB_VERSION;
    422         mBlob.type = uint8_t(type);
    423 
    424         if (type == TYPE_MASTER_KEY) {
    425             mBlob.flags = KEYSTORE_FLAG_ENCRYPTED;
    426         } else {
    427             mBlob.flags = KEYSTORE_FLAG_NONE;
    428         }
    429     }
    430 
    431     Blob(blob b) {
    432         mBlob = b;
    433     }
    434 
    435     Blob() {}
    436 
    437     const uint8_t* getValue() const {
    438         return mBlob.value;
    439     }
    440 
    441     int32_t getLength() const {
    442         return mBlob.length;
    443     }
    444 
    445     const uint8_t* getInfo() const {
    446         return mBlob.value + mBlob.length;
    447     }
    448 
    449     uint8_t getInfoLength() const {
    450         return mBlob.info;
    451     }
    452 
    453     uint8_t getVersion() const {
    454         return mBlob.version;
    455     }
    456 
    457     bool isEncrypted() const {
    458         if (mBlob.version < 2) {
    459             return true;
    460         }
    461 
    462         return mBlob.flags & KEYSTORE_FLAG_ENCRYPTED;
    463     }
    464 
    465     void setEncrypted(bool encrypted) {
    466         if (encrypted) {
    467             mBlob.flags |= KEYSTORE_FLAG_ENCRYPTED;
    468         } else {
    469             mBlob.flags &= ~KEYSTORE_FLAG_ENCRYPTED;
    470         }
    471     }
    472 
    473     bool isFallback() const {
    474         return mBlob.flags & KEYSTORE_FLAG_FALLBACK;
    475     }
    476 
    477     void setFallback(bool fallback) {
    478         if (fallback) {
    479             mBlob.flags |= KEYSTORE_FLAG_FALLBACK;
    480         } else {
    481             mBlob.flags &= ~KEYSTORE_FLAG_FALLBACK;
    482         }
    483     }
    484 
    485     void setVersion(uint8_t version) {
    486         mBlob.version = version;
    487     }
    488 
    489     BlobType getType() const {
    490         return BlobType(mBlob.type);
    491     }
    492 
    493     void setType(BlobType type) {
    494         mBlob.type = uint8_t(type);
    495     }
    496 
    497     ResponseCode writeBlob(const char* filename, AES_KEY *aes_key, State state, Entropy* entropy) {
    498         ALOGV("writing blob %s", filename);
    499         if (isEncrypted()) {
    500             if (state != STATE_NO_ERROR) {
    501                 ALOGD("couldn't insert encrypted blob while not unlocked");
    502                 return LOCKED;
    503             }
    504 
    505             if (!entropy->generate_random_data(mBlob.vector, AES_BLOCK_SIZE)) {
    506                 ALOGW("Could not read random data for: %s", filename);
    507                 return SYSTEM_ERROR;
    508             }
    509         }
    510 
    511         // data includes the value and the value's length
    512         size_t dataLength = mBlob.length + sizeof(mBlob.length);
    513         // pad data to the AES_BLOCK_SIZE
    514         size_t digestedLength = ((dataLength + AES_BLOCK_SIZE - 1)
    515                                  / AES_BLOCK_SIZE * AES_BLOCK_SIZE);
    516         // encrypted data includes the digest value
    517         size_t encryptedLength = digestedLength + MD5_DIGEST_LENGTH;
    518         // move info after space for padding
    519         memmove(&mBlob.encrypted[encryptedLength], &mBlob.value[mBlob.length], mBlob.info);
    520         // zero padding area
    521         memset(mBlob.value + mBlob.length, 0, digestedLength - dataLength);
    522 
    523         mBlob.length = htonl(mBlob.length);
    524 
    525         if (isEncrypted()) {
    526             MD5(mBlob.digested, digestedLength, mBlob.digest);
    527 
    528             uint8_t vector[AES_BLOCK_SIZE];
    529             memcpy(vector, mBlob.vector, AES_BLOCK_SIZE);
    530             AES_cbc_encrypt(mBlob.encrypted, mBlob.encrypted, encryptedLength,
    531                             aes_key, vector, AES_ENCRYPT);
    532         }
    533 
    534         size_t headerLength = (mBlob.encrypted - (uint8_t*) &mBlob);
    535         size_t fileLength = encryptedLength + headerLength + mBlob.info;
    536 
    537         const char* tmpFileName = ".tmp";
    538         int out = TEMP_FAILURE_RETRY(open(tmpFileName,
    539                 O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR));
    540         if (out < 0) {
    541             ALOGW("could not open file: %s: %s", tmpFileName, strerror(errno));
    542             return SYSTEM_ERROR;
    543         }
    544         size_t writtenBytes = writeFully(out, (uint8_t*) &mBlob, fileLength);
    545         if (close(out) != 0) {
    546             return SYSTEM_ERROR;
    547         }
    548         if (writtenBytes != fileLength) {
    549             ALOGW("blob not fully written %zu != %zu", writtenBytes, fileLength);
    550             unlink(tmpFileName);
    551             return SYSTEM_ERROR;
    552         }
    553         if (rename(tmpFileName, filename) == -1) {
    554             ALOGW("could not rename blob to %s: %s", filename, strerror(errno));
    555             return SYSTEM_ERROR;
    556         }
    557         return NO_ERROR;
    558     }
    559 
    560     ResponseCode readBlob(const char* filename, AES_KEY *aes_key, State state) {
    561         ALOGV("reading blob %s", filename);
    562         int in = TEMP_FAILURE_RETRY(open(filename, O_RDONLY));
    563         if (in < 0) {
    564             return (errno == ENOENT) ? KEY_NOT_FOUND : SYSTEM_ERROR;
    565         }
    566         // fileLength may be less than sizeof(mBlob) since the in
    567         // memory version has extra padding to tolerate rounding up to
    568         // the AES_BLOCK_SIZE
    569         size_t fileLength = readFully(in, (uint8_t*) &mBlob, sizeof(mBlob));
    570         if (close(in) != 0) {
    571             return SYSTEM_ERROR;
    572         }
    573 
    574         if (isEncrypted() && (state != STATE_NO_ERROR)) {
    575             return LOCKED;
    576         }
    577 
    578         size_t headerLength = (mBlob.encrypted - (uint8_t*) &mBlob);
    579         if (fileLength < headerLength) {
    580             return VALUE_CORRUPTED;
    581         }
    582 
    583         ssize_t encryptedLength = fileLength - (headerLength + mBlob.info);
    584         if (encryptedLength < 0) {
    585             return VALUE_CORRUPTED;
    586         }
    587 
    588         ssize_t digestedLength;
    589         if (isEncrypted()) {
    590             if (encryptedLength % AES_BLOCK_SIZE != 0) {
    591                 return VALUE_CORRUPTED;
    592             }
    593 
    594             AES_cbc_encrypt(mBlob.encrypted, mBlob.encrypted, encryptedLength, aes_key,
    595                             mBlob.vector, AES_DECRYPT);
    596             digestedLength = encryptedLength - MD5_DIGEST_LENGTH;
    597             uint8_t computedDigest[MD5_DIGEST_LENGTH];
    598             MD5(mBlob.digested, digestedLength, computedDigest);
    599             if (memcmp(mBlob.digest, computedDigest, MD5_DIGEST_LENGTH) != 0) {
    600                 return VALUE_CORRUPTED;
    601             }
    602         } else {
    603             digestedLength = encryptedLength;
    604         }
    605 
    606         ssize_t maxValueLength = digestedLength - sizeof(mBlob.length);
    607         mBlob.length = ntohl(mBlob.length);
    608         if (mBlob.length < 0 || mBlob.length > maxValueLength) {
    609             return VALUE_CORRUPTED;
    610         }
    611         if (mBlob.info != 0) {
    612             // move info from after padding to after data
    613             memmove(&mBlob.value[mBlob.length], &mBlob.value[maxValueLength], mBlob.info);
    614         }
    615         return ::NO_ERROR;
    616     }
    617 
    618 private:
    619     struct blob mBlob;
    620 };
    621 
    622 class UserState {
    623 public:
    624     UserState(uid_t userId) : mUserId(userId), mRetry(MAX_RETRY) {
    625         asprintf(&mUserDir, "user_%u", mUserId);
    626         asprintf(&mMasterKeyFile, "%s/.masterkey", mUserDir);
    627     }
    628 
    629     ~UserState() {
    630         free(mUserDir);
    631         free(mMasterKeyFile);
    632     }
    633 
    634     bool initialize() {
    635         if ((mkdir(mUserDir, S_IRUSR | S_IWUSR | S_IXUSR) < 0) && (errno != EEXIST)) {
    636             ALOGE("Could not create directory '%s'", mUserDir);
    637             return false;
    638         }
    639 
    640         if (access(mMasterKeyFile, R_OK) == 0) {
    641             setState(STATE_LOCKED);
    642         } else {
    643             setState(STATE_UNINITIALIZED);
    644         }
    645 
    646         return true;
    647     }
    648 
    649     uid_t getUserId() const {
    650         return mUserId;
    651     }
    652 
    653     const char* getUserDirName() const {
    654         return mUserDir;
    655     }
    656 
    657     const char* getMasterKeyFileName() const {
    658         return mMasterKeyFile;
    659     }
    660 
    661     void setState(State state) {
    662         mState = state;
    663         if (mState == STATE_NO_ERROR || mState == STATE_UNINITIALIZED) {
    664             mRetry = MAX_RETRY;
    665         }
    666     }
    667 
    668     State getState() const {
    669         return mState;
    670     }
    671 
    672     int8_t getRetry() const {
    673         return mRetry;
    674     }
    675 
    676     void zeroizeMasterKeysInMemory() {
    677         memset(mMasterKey, 0, sizeof(mMasterKey));
    678         memset(mSalt, 0, sizeof(mSalt));
    679         memset(&mMasterKeyEncryption, 0, sizeof(mMasterKeyEncryption));
    680         memset(&mMasterKeyDecryption, 0, sizeof(mMasterKeyDecryption));
    681     }
    682 
    683     ResponseCode initialize(const android::String8& pw, Entropy* entropy) {
    684         if (!generateMasterKey(entropy)) {
    685             return SYSTEM_ERROR;
    686         }
    687         ResponseCode response = writeMasterKey(pw, entropy);
    688         if (response != NO_ERROR) {
    689             return response;
    690         }
    691         setupMasterKeys();
    692         return ::NO_ERROR;
    693     }
    694 
    695     ResponseCode writeMasterKey(const android::String8& pw, Entropy* entropy) {
    696         uint8_t passwordKey[MASTER_KEY_SIZE_BYTES];
    697         generateKeyFromPassword(passwordKey, MASTER_KEY_SIZE_BYTES, pw, mSalt);
    698         AES_KEY passwordAesKey;
    699         AES_set_encrypt_key(passwordKey, MASTER_KEY_SIZE_BITS, &passwordAesKey);
    700         Blob masterKeyBlob(mMasterKey, sizeof(mMasterKey), mSalt, sizeof(mSalt), TYPE_MASTER_KEY);
    701         return masterKeyBlob.writeBlob(mMasterKeyFile, &passwordAesKey, STATE_NO_ERROR, entropy);
    702     }
    703 
    704     ResponseCode readMasterKey(const android::String8& pw, Entropy* entropy) {
    705         int in = TEMP_FAILURE_RETRY(open(mMasterKeyFile, O_RDONLY));
    706         if (in < 0) {
    707             return SYSTEM_ERROR;
    708         }
    709 
    710         // we read the raw blob to just to get the salt to generate
    711         // the AES key, then we create the Blob to use with decryptBlob
    712         blob rawBlob;
    713         size_t length = readFully(in, (uint8_t*) &rawBlob, sizeof(rawBlob));
    714         if (close(in) != 0) {
    715             return SYSTEM_ERROR;
    716         }
    717         // find salt at EOF if present, otherwise we have an old file
    718         uint8_t* salt;
    719         if (length > SALT_SIZE && rawBlob.info == SALT_SIZE) {
    720             salt = (uint8_t*) &rawBlob + length - SALT_SIZE;
    721         } else {
    722             salt = NULL;
    723         }
    724         uint8_t passwordKey[MASTER_KEY_SIZE_BYTES];
    725         generateKeyFromPassword(passwordKey, MASTER_KEY_SIZE_BYTES, pw, salt);
    726         AES_KEY passwordAesKey;
    727         AES_set_decrypt_key(passwordKey, MASTER_KEY_SIZE_BITS, &passwordAesKey);
    728         Blob masterKeyBlob(rawBlob);
    729         ResponseCode response = masterKeyBlob.readBlob(mMasterKeyFile, &passwordAesKey,
    730                 STATE_NO_ERROR);
    731         if (response == SYSTEM_ERROR) {
    732             return response;
    733         }
    734         if (response == NO_ERROR && masterKeyBlob.getLength() == MASTER_KEY_SIZE_BYTES) {
    735             // if salt was missing, generate one and write a new master key file with the salt.
    736             if (salt == NULL) {
    737                 if (!generateSalt(entropy)) {
    738                     return SYSTEM_ERROR;
    739                 }
    740                 response = writeMasterKey(pw, entropy);
    741             }
    742             if (response == NO_ERROR) {
    743                 memcpy(mMasterKey, masterKeyBlob.getValue(), MASTER_KEY_SIZE_BYTES);
    744                 setupMasterKeys();
    745             }
    746             return response;
    747         }
    748         if (mRetry <= 0) {
    749             reset();
    750             return UNINITIALIZED;
    751         }
    752         --mRetry;
    753         switch (mRetry) {
    754             case 0: return WRONG_PASSWORD_0;
    755             case 1: return WRONG_PASSWORD_1;
    756             case 2: return WRONG_PASSWORD_2;
    757             case 3: return WRONG_PASSWORD_3;
    758             default: return WRONG_PASSWORD_3;
    759         }
    760     }
    761 
    762     AES_KEY* getEncryptionKey() {
    763         return &mMasterKeyEncryption;
    764     }
    765 
    766     AES_KEY* getDecryptionKey() {
    767         return &mMasterKeyDecryption;
    768     }
    769 
    770     bool reset() {
    771         DIR* dir = opendir(getUserDirName());
    772         if (!dir) {
    773             ALOGW("couldn't open user directory: %s", strerror(errno));
    774             return false;
    775         }
    776 
    777         struct dirent* file;
    778         while ((file = readdir(dir)) != NULL) {
    779             // We only care about files.
    780             if (file->d_type != DT_REG) {
    781                 continue;
    782             }
    783 
    784             // Skip anything that starts with a "."
    785             if (file->d_name[0] == '.') {
    786                 continue;
    787             }
    788 
    789             // Find the current file's UID.
    790             char* end;
    791             unsigned long thisUid = strtoul(file->d_name, &end, 10);
    792             if (end[0] != '_' || end[1] == 0) {
    793                 continue;
    794             }
    795 
    796             // Skip if this is not our user.
    797             if (get_user_id(thisUid) != mUserId) {
    798                 continue;
    799             }
    800 
    801             unlinkat(dirfd(dir), file->d_name, 0);
    802         }
    803         closedir(dir);
    804         return true;
    805     }
    806 
    807 private:
    808     static const int MASTER_KEY_SIZE_BYTES = 16;
    809     static const int MASTER_KEY_SIZE_BITS = MASTER_KEY_SIZE_BYTES * 8;
    810 
    811     static const int MAX_RETRY = 4;
    812     static const size_t SALT_SIZE = 16;
    813 
    814     void generateKeyFromPassword(uint8_t* key, ssize_t keySize, const android::String8& pw,
    815             uint8_t* salt) {
    816         size_t saltSize;
    817         if (salt != NULL) {
    818             saltSize = SALT_SIZE;
    819         } else {
    820             // pre-gingerbread used this hardwired salt, readMasterKey will rewrite these when found
    821             salt = (uint8_t*) "keystore";
    822             // sizeof = 9, not strlen = 8
    823             saltSize = sizeof("keystore");
    824         }
    825 
    826         PKCS5_PBKDF2_HMAC_SHA1(reinterpret_cast<const char*>(pw.string()), pw.length(), salt,
    827                 saltSize, 8192, keySize, key);
    828     }
    829 
    830     bool generateSalt(Entropy* entropy) {
    831         return entropy->generate_random_data(mSalt, sizeof(mSalt));
    832     }
    833 
    834     bool generateMasterKey(Entropy* entropy) {
    835         if (!entropy->generate_random_data(mMasterKey, sizeof(mMasterKey))) {
    836             return false;
    837         }
    838         if (!generateSalt(entropy)) {
    839             return false;
    840         }
    841         return true;
    842     }
    843 
    844     void setupMasterKeys() {
    845         AES_set_encrypt_key(mMasterKey, MASTER_KEY_SIZE_BITS, &mMasterKeyEncryption);
    846         AES_set_decrypt_key(mMasterKey, MASTER_KEY_SIZE_BITS, &mMasterKeyDecryption);
    847         setState(STATE_NO_ERROR);
    848     }
    849 
    850     uid_t mUserId;
    851 
    852     char* mUserDir;
    853     char* mMasterKeyFile;
    854 
    855     State mState;
    856     int8_t mRetry;
    857 
    858     uint8_t mMasterKey[MASTER_KEY_SIZE_BYTES];
    859     uint8_t mSalt[SALT_SIZE];
    860 
    861     AES_KEY mMasterKeyEncryption;
    862     AES_KEY mMasterKeyDecryption;
    863 };
    864 
    865 typedef struct {
    866     uint32_t uid;
    867     const uint8_t* filename;
    868 } grant_t;
    869 
    870 class KeyStore {
    871 public:
    872     KeyStore(Entropy* entropy, keymaster_device_t* device)
    873         : mEntropy(entropy)
    874         , mDevice(device)
    875     {
    876         memset(&mMetaData, '\0', sizeof(mMetaData));
    877     }
    878 
    879     ~KeyStore() {
    880         for (android::Vector<grant_t*>::iterator it(mGrants.begin());
    881                 it != mGrants.end(); it++) {
    882             delete *it;
    883             mGrants.erase(it);
    884         }
    885 
    886         for (android::Vector<UserState*>::iterator it(mMasterKeys.begin());
    887                 it != mMasterKeys.end(); it++) {
    888             delete *it;
    889             mMasterKeys.erase(it);
    890         }
    891     }
    892 
    893     keymaster_device_t* getDevice() const {
    894         return mDevice;
    895     }
    896 
    897     ResponseCode initialize() {
    898         readMetaData();
    899         if (upgradeKeystore()) {
    900             writeMetaData();
    901         }
    902 
    903         return ::NO_ERROR;
    904     }
    905 
    906     State getState(uid_t uid) {
    907         return getUserState(uid)->getState();
    908     }
    909 
    910     ResponseCode initializeUser(const android::String8& pw, uid_t uid) {
    911         UserState* userState = getUserState(uid);
    912         return userState->initialize(pw, mEntropy);
    913     }
    914 
    915     ResponseCode writeMasterKey(const android::String8& pw, uid_t uid) {
    916         uid_t user_id = get_user_id(uid);
    917         UserState* userState = getUserState(user_id);
    918         return userState->writeMasterKey(pw, mEntropy);
    919     }
    920 
    921     ResponseCode readMasterKey(const android::String8& pw, uid_t uid) {
    922         uid_t user_id = get_user_id(uid);
    923         UserState* userState = getUserState(user_id);
    924         return userState->readMasterKey(pw, mEntropy);
    925     }
    926 
    927     android::String8 getKeyName(const android::String8& keyName) {
    928         char encoded[encode_key_length(keyName) + 1];	// add 1 for null char
    929         encode_key(encoded, keyName);
    930         return android::String8(encoded);
    931     }
    932 
    933     android::String8 getKeyNameForUid(const android::String8& keyName, uid_t uid) {
    934         char encoded[encode_key_length(keyName) + 1];	// add 1 for null char
    935         encode_key(encoded, keyName);
    936         return android::String8::format("%u_%s", uid, encoded);
    937     }
    938 
    939     android::String8 getKeyNameForUidWithDir(const android::String8& keyName, uid_t uid) {
    940         char encoded[encode_key_length(keyName) + 1];	// add 1 for null char
    941         encode_key(encoded, keyName);
    942         return android::String8::format("%s/%u_%s", getUserState(uid)->getUserDirName(), uid,
    943                 encoded);
    944     }
    945 
    946     bool reset(uid_t uid) {
    947         UserState* userState = getUserState(uid);
    948         userState->zeroizeMasterKeysInMemory();
    949         userState->setState(STATE_UNINITIALIZED);
    950         return userState->reset();
    951     }
    952 
    953     bool isEmpty(uid_t uid) const {
    954         const UserState* userState = getUserState(uid);
    955         if (userState == NULL) {
    956             return true;
    957         }
    958 
    959         DIR* dir = opendir(userState->getUserDirName());
    960         struct dirent* file;
    961         if (!dir) {
    962             return true;
    963         }
    964         bool result = true;
    965 
    966         char filename[NAME_MAX];
    967         int n = snprintf(filename, sizeof(filename), "%u_", uid);
    968 
    969         while ((file = readdir(dir)) != NULL) {
    970             // We only care about files.
    971             if (file->d_type != DT_REG) {
    972                 continue;
    973             }
    974 
    975             // Skip anything that starts with a "."
    976             if (file->d_name[0] == '.') {
    977                 continue;
    978             }
    979 
    980             if (!strncmp(file->d_name, filename, n)) {
    981                 result = false;
    982                 break;
    983             }
    984         }
    985         closedir(dir);
    986         return result;
    987     }
    988 
    989     void lock(uid_t uid) {
    990         UserState* userState = getUserState(uid);
    991         userState->zeroizeMasterKeysInMemory();
    992         userState->setState(STATE_LOCKED);
    993     }
    994 
    995     ResponseCode get(const char* filename, Blob* keyBlob, const BlobType type, uid_t uid) {
    996         UserState* userState = getUserState(uid);
    997         ResponseCode rc = keyBlob->readBlob(filename, userState->getDecryptionKey(),
    998                 userState->getState());
    999         if (rc != NO_ERROR) {
   1000             return rc;
   1001         }
   1002 
   1003         const uint8_t version = keyBlob->getVersion();
   1004         if (version < CURRENT_BLOB_VERSION) {
   1005             /* If we upgrade the key, we need to write it to disk again. Then
   1006              * it must be read it again since the blob is encrypted each time
   1007              * it's written.
   1008              */
   1009             if (upgradeBlob(filename, keyBlob, version, type, uid)) {
   1010                 if ((rc = this->put(filename, keyBlob, uid)) != NO_ERROR
   1011                         || (rc = keyBlob->readBlob(filename, userState->getDecryptionKey(),
   1012                                 userState->getState())) != NO_ERROR) {
   1013                     return rc;
   1014                 }
   1015             }
   1016         }
   1017 
   1018         /*
   1019          * This will upgrade software-backed keys to hardware-backed keys when
   1020          * the HAL for the device supports the newer key types.
   1021          */
   1022         if (rc == NO_ERROR && type == TYPE_KEY_PAIR
   1023                 && mDevice->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_0_2
   1024                 && keyBlob->isFallback()) {
   1025             ResponseCode imported = importKey(keyBlob->getValue(), keyBlob->getLength(), filename,
   1026                     uid, keyBlob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
   1027 
   1028             // The HAL allowed the import, reget the key to have the "fresh"
   1029             // version.
   1030             if (imported == NO_ERROR) {
   1031                 rc = get(filename, keyBlob, TYPE_KEY_PAIR, uid);
   1032             }
   1033         }
   1034 
   1035         if (type != TYPE_ANY && keyBlob->getType() != type) {
   1036             ALOGW("key found but type doesn't match: %d vs %d", keyBlob->getType(), type);
   1037             return KEY_NOT_FOUND;
   1038         }
   1039 
   1040         return rc;
   1041     }
   1042 
   1043     ResponseCode put(const char* filename, Blob* keyBlob, uid_t uid) {
   1044         UserState* userState = getUserState(uid);
   1045         return keyBlob->writeBlob(filename, userState->getEncryptionKey(), userState->getState(),
   1046                 mEntropy);
   1047     }
   1048 
   1049     void addGrant(const char* filename, uid_t granteeUid) {
   1050         const grant_t* existing = getGrant(filename, granteeUid);
   1051         if (existing == NULL) {
   1052             grant_t* grant = new grant_t;
   1053             grant->uid = granteeUid;
   1054             grant->filename = reinterpret_cast<const uint8_t*>(strdup(filename));
   1055             mGrants.add(grant);
   1056         }
   1057     }
   1058 
   1059     bool removeGrant(const char* filename, uid_t granteeUid) {
   1060         for (android::Vector<grant_t*>::iterator it(mGrants.begin());
   1061                 it != mGrants.end(); it++) {
   1062             grant_t* grant = *it;
   1063             if (grant->uid == granteeUid
   1064                     && !strcmp(reinterpret_cast<const char*>(grant->filename), filename)) {
   1065                 mGrants.erase(it);
   1066                 return true;
   1067             }
   1068         }
   1069         return false;
   1070     }
   1071 
   1072     bool hasGrant(const char* filename, const uid_t uid) const {
   1073         return getGrant(filename, uid) != NULL;
   1074     }
   1075 
   1076     ResponseCode importKey(const uint8_t* key, size_t keyLen, const char* filename, uid_t uid,
   1077             int32_t flags) {
   1078         uint8_t* data;
   1079         size_t dataLength;
   1080         int rc;
   1081 
   1082         if (mDevice->import_keypair == NULL) {
   1083             ALOGE("Keymaster doesn't support import!");
   1084             return SYSTEM_ERROR;
   1085         }
   1086 
   1087         bool isFallback = false;
   1088         rc = mDevice->import_keypair(mDevice, key, keyLen, &data, &dataLength);
   1089         if (rc) {
   1090             // If this is an old device HAL, try to fall back to an old version
   1091             if (mDevice->common.module->module_api_version < KEYMASTER_MODULE_API_VERSION_0_2) {
   1092                 rc = openssl_import_keypair(mDevice, key, keyLen, &data, &dataLength);
   1093                 isFallback = true;
   1094             }
   1095 
   1096             if (rc) {
   1097                 ALOGE("Error while importing keypair: %d", rc);
   1098                 return SYSTEM_ERROR;
   1099             }
   1100         }
   1101 
   1102         Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);
   1103         free(data);
   1104 
   1105         keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
   1106         keyBlob.setFallback(isFallback);
   1107 
   1108         return put(filename, &keyBlob, uid);
   1109     }
   1110 
   1111     bool isHardwareBacked(const android::String16& keyType) const {
   1112         if (mDevice == NULL) {
   1113             ALOGW("can't get keymaster device");
   1114             return false;
   1115         }
   1116 
   1117         if (sRSAKeyType == keyType) {
   1118             return (mDevice->flags & KEYMASTER_SOFTWARE_ONLY) == 0;
   1119         } else {
   1120             return (mDevice->flags & KEYMASTER_SOFTWARE_ONLY) == 0
   1121                     && (mDevice->common.module->module_api_version
   1122                             >= KEYMASTER_MODULE_API_VERSION_0_2);
   1123         }
   1124     }
   1125 
   1126     ResponseCode getKeyForName(Blob* keyBlob, const android::String8& keyName, const uid_t uid,
   1127             const BlobType type) {
   1128         android::String8 filepath8(getKeyNameForUidWithDir(keyName, uid));
   1129 
   1130         ResponseCode responseCode = get(filepath8.string(), keyBlob, type, uid);
   1131         if (responseCode == NO_ERROR) {
   1132             return responseCode;
   1133         }
   1134 
   1135         // If this is one of the legacy UID->UID mappings, use it.
   1136         uid_t euid = get_keystore_euid(uid);
   1137         if (euid != uid) {
   1138             filepath8 = getKeyNameForUidWithDir(keyName, euid);
   1139             responseCode = get(filepath8.string(), keyBlob, type, uid);
   1140             if (responseCode == NO_ERROR) {
   1141                 return responseCode;
   1142             }
   1143         }
   1144 
   1145         // They might be using a granted key.
   1146         android::String8 filename8 = getKeyName(keyName);
   1147         char* end;
   1148         strtoul(filename8.string(), &end, 10);
   1149         if (end[0] != '_' || end[1] == 0) {
   1150             return KEY_NOT_FOUND;
   1151         }
   1152         filepath8 = android::String8::format("%s/%s", getUserState(uid)->getUserDirName(),
   1153                 filename8.string());
   1154         if (!hasGrant(filepath8.string(), uid)) {
   1155             return responseCode;
   1156         }
   1157 
   1158         // It is a granted key. Try to load it.
   1159         return get(filepath8.string(), keyBlob, type, uid);
   1160     }
   1161 
   1162     /**
   1163      * Returns any existing UserState or creates it if it doesn't exist.
   1164      */
   1165     UserState* getUserState(uid_t uid) {
   1166         uid_t userId = get_user_id(uid);
   1167 
   1168         for (android::Vector<UserState*>::iterator it(mMasterKeys.begin());
   1169                 it != mMasterKeys.end(); it++) {
   1170             UserState* state = *it;
   1171             if (state->getUserId() == userId) {
   1172                 return state;
   1173             }
   1174         }
   1175 
   1176         UserState* userState = new UserState(userId);
   1177         if (!userState->initialize()) {
   1178             /* There's not much we can do if initialization fails. Trying to
   1179              * unlock the keystore for that user will fail as well, so any
   1180              * subsequent request for this user will just return SYSTEM_ERROR.
   1181              */
   1182             ALOGE("User initialization failed for %u; subsuquent operations will fail", userId);
   1183         }
   1184         mMasterKeys.add(userState);
   1185         return userState;
   1186     }
   1187 
   1188     /**
   1189      * Returns NULL if the UserState doesn't already exist.
   1190      */
   1191     const UserState* getUserState(uid_t uid) const {
   1192         uid_t userId = get_user_id(uid);
   1193 
   1194         for (android::Vector<UserState*>::const_iterator it(mMasterKeys.begin());
   1195                 it != mMasterKeys.end(); it++) {
   1196             UserState* state = *it;
   1197             if (state->getUserId() == userId) {
   1198                 return state;
   1199             }
   1200         }
   1201 
   1202         return NULL;
   1203     }
   1204 
   1205 private:
   1206     static const char* sOldMasterKey;
   1207     static const char* sMetaDataFile;
   1208     static const android::String16 sRSAKeyType;
   1209     Entropy* mEntropy;
   1210 
   1211     keymaster_device_t* mDevice;
   1212 
   1213     android::Vector<UserState*> mMasterKeys;
   1214 
   1215     android::Vector<grant_t*> mGrants;
   1216 
   1217     typedef struct {
   1218         uint32_t version;
   1219     } keystore_metadata_t;
   1220 
   1221     keystore_metadata_t mMetaData;
   1222 
   1223     const grant_t* getGrant(const char* filename, uid_t uid) const {
   1224         for (android::Vector<grant_t*>::const_iterator it(mGrants.begin());
   1225                 it != mGrants.end(); it++) {
   1226             grant_t* grant = *it;
   1227             if (grant->uid == uid
   1228                     && !strcmp(reinterpret_cast<const char*>(grant->filename), filename)) {
   1229                 return grant;
   1230             }
   1231         }
   1232         return NULL;
   1233     }
   1234 
   1235     /**
   1236      * Upgrade code. This will upgrade the key from the current version
   1237      * to whatever is newest.
   1238      */
   1239     bool upgradeBlob(const char* filename, Blob* blob, const uint8_t oldVersion,
   1240             const BlobType type, uid_t uid) {
   1241         bool updated = false;
   1242         uint8_t version = oldVersion;
   1243 
   1244         /* From V0 -> V1: All old types were unknown */
   1245         if (version == 0) {
   1246             ALOGV("upgrading to version 1 and setting type %d", type);
   1247 
   1248             blob->setType(type);
   1249             if (type == TYPE_KEY_PAIR) {
   1250                 importBlobAsKey(blob, filename, uid);
   1251             }
   1252             version = 1;
   1253             updated = true;
   1254         }
   1255 
   1256         /* From V1 -> V2: All old keys were encrypted */
   1257         if (version == 1) {
   1258             ALOGV("upgrading to version 2");
   1259 
   1260             blob->setEncrypted(true);
   1261             version = 2;
   1262             updated = true;
   1263         }
   1264 
   1265         /*
   1266          * If we've updated, set the key blob to the right version
   1267          * and write it.
   1268          */
   1269         if (updated) {
   1270             ALOGV("updated and writing file %s", filename);
   1271             blob->setVersion(version);
   1272         }
   1273 
   1274         return updated;
   1275     }
   1276 
   1277     /**
   1278      * Takes a blob that is an PEM-encoded RSA key as a byte array and
   1279      * converts it to a DER-encoded PKCS#8 for import into a keymaster.
   1280      * Then it overwrites the original blob with the new blob
   1281      * format that is returned from the keymaster.
   1282      */
   1283     ResponseCode importBlobAsKey(Blob* blob, const char* filename, uid_t uid) {
   1284         // We won't even write to the blob directly with this BIO, so const_cast is okay.
   1285         Unique_BIO b(BIO_new_mem_buf(const_cast<uint8_t*>(blob->getValue()), blob->getLength()));
   1286         if (b.get() == NULL) {
   1287             ALOGE("Problem instantiating BIO");
   1288             return SYSTEM_ERROR;
   1289         }
   1290 
   1291         Unique_EVP_PKEY pkey(PEM_read_bio_PrivateKey(b.get(), NULL, NULL, NULL));
   1292         if (pkey.get() == NULL) {
   1293             ALOGE("Couldn't read old PEM file");
   1294             return SYSTEM_ERROR;
   1295         }
   1296 
   1297         Unique_PKCS8_PRIV_KEY_INFO pkcs8(EVP_PKEY2PKCS8(pkey.get()));
   1298         int len = i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), NULL);
   1299         if (len < 0) {
   1300             ALOGE("Couldn't measure PKCS#8 length");
   1301             return SYSTEM_ERROR;
   1302         }
   1303 
   1304         UniquePtr<unsigned char[]> pkcs8key(new unsigned char[len]);
   1305         uint8_t* tmp = pkcs8key.get();
   1306         if (i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), &tmp) != len) {
   1307             ALOGE("Couldn't convert to PKCS#8");
   1308             return SYSTEM_ERROR;
   1309         }
   1310 
   1311         ResponseCode rc = importKey(pkcs8key.get(), len, filename, uid,
   1312                 blob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
   1313         if (rc != NO_ERROR) {
   1314             return rc;
   1315         }
   1316 
   1317         return get(filename, blob, TYPE_KEY_PAIR, uid);
   1318     }
   1319 
   1320     void readMetaData() {
   1321         int in = TEMP_FAILURE_RETRY(open(sMetaDataFile, O_RDONLY));
   1322         if (in < 0) {
   1323             return;
   1324         }
   1325         size_t fileLength = readFully(in, (uint8_t*) &mMetaData, sizeof(mMetaData));
   1326         if (fileLength != sizeof(mMetaData)) {
   1327             ALOGI("Metadata file is %zd bytes (%zd experted); upgrade?", fileLength,
   1328                     sizeof(mMetaData));
   1329         }
   1330         close(in);
   1331     }
   1332 
   1333     void writeMetaData() {
   1334         const char* tmpFileName = ".metadata.tmp";
   1335         int out = TEMP_FAILURE_RETRY(open(tmpFileName,
   1336                 O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR));
   1337         if (out < 0) {
   1338             ALOGE("couldn't write metadata file: %s", strerror(errno));
   1339             return;
   1340         }
   1341         size_t fileLength = writeFully(out, (uint8_t*) &mMetaData, sizeof(mMetaData));
   1342         if (fileLength != sizeof(mMetaData)) {
   1343             ALOGI("Could only write %zd bytes to metadata file (%zd expected)", fileLength,
   1344                     sizeof(mMetaData));
   1345         }
   1346         close(out);
   1347         rename(tmpFileName, sMetaDataFile);
   1348     }
   1349 
   1350     bool upgradeKeystore() {
   1351         bool upgraded = false;
   1352 
   1353         if (mMetaData.version == 0) {
   1354             UserState* userState = getUserState(0);
   1355 
   1356             // Initialize first so the directory is made.
   1357             userState->initialize();
   1358 
   1359             // Migrate the old .masterkey file to user 0.
   1360             if (access(sOldMasterKey, R_OK) == 0) {
   1361                 if (rename(sOldMasterKey, userState->getMasterKeyFileName()) < 0) {
   1362                     ALOGE("couldn't migrate old masterkey: %s", strerror(errno));
   1363                     return false;
   1364                 }
   1365             }
   1366 
   1367             // Initialize again in case we had a key.
   1368             userState->initialize();
   1369 
   1370             // Try to migrate existing keys.
   1371             DIR* dir = opendir(".");
   1372             if (!dir) {
   1373                 // Give up now; maybe we can upgrade later.
   1374                 ALOGE("couldn't open keystore's directory; something is wrong");
   1375                 return false;
   1376             }
   1377 
   1378             struct dirent* file;
   1379             while ((file = readdir(dir)) != NULL) {
   1380                 // We only care about files.
   1381                 if (file->d_type != DT_REG) {
   1382                     continue;
   1383                 }
   1384 
   1385                 // Skip anything that starts with a "."
   1386                 if (file->d_name[0] == '.') {
   1387                     continue;
   1388                 }
   1389 
   1390                 // Find the current file's user.
   1391                 char* end;
   1392                 unsigned long thisUid = strtoul(file->d_name, &end, 10);
   1393                 if (end[0] != '_' || end[1] == 0) {
   1394                     continue;
   1395                 }
   1396                 UserState* otherUser = getUserState(thisUid);
   1397                 if (otherUser->getUserId() != 0) {
   1398                     unlinkat(dirfd(dir), file->d_name, 0);
   1399                 }
   1400 
   1401                 // Rename the file into user directory.
   1402                 DIR* otherdir = opendir(otherUser->getUserDirName());
   1403                 if (otherdir == NULL) {
   1404                     ALOGW("couldn't open user directory for rename");
   1405                     continue;
   1406                 }
   1407                 if (renameat(dirfd(dir), file->d_name, dirfd(otherdir), file->d_name) < 0) {
   1408                     ALOGW("couldn't rename blob: %s: %s", file->d_name, strerror(errno));
   1409                 }
   1410                 closedir(otherdir);
   1411             }
   1412             closedir(dir);
   1413 
   1414             mMetaData.version = 1;
   1415             upgraded = true;
   1416         }
   1417 
   1418         return upgraded;
   1419     }
   1420 };
   1421 
   1422 const char* KeyStore::sOldMasterKey = ".masterkey";
   1423 const char* KeyStore::sMetaDataFile = ".metadata";
   1424 
   1425 const android::String16 KeyStore::sRSAKeyType("RSA");
   1426 
   1427 namespace android {
   1428 class KeyStoreProxy : public BnKeystoreService, public IBinder::DeathRecipient {
   1429 public:
   1430     KeyStoreProxy(KeyStore* keyStore)
   1431         : mKeyStore(keyStore)
   1432     {
   1433     }
   1434 
   1435     void binderDied(const wp<IBinder>&) {
   1436         ALOGE("binder death detected");
   1437     }
   1438 
   1439     int32_t test() {
   1440         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1441         if (!has_permission(callingUid, P_TEST)) {
   1442             ALOGW("permission denied for %d: test", callingUid);
   1443             return ::PERMISSION_DENIED;
   1444         }
   1445 
   1446         return mKeyStore->getState(callingUid);
   1447     }
   1448 
   1449     int32_t get(const String16& name, uint8_t** item, size_t* itemLength) {
   1450         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1451         if (!has_permission(callingUid, P_GET)) {
   1452             ALOGW("permission denied for %d: get", callingUid);
   1453             return ::PERMISSION_DENIED;
   1454         }
   1455 
   1456         String8 name8(name);
   1457         Blob keyBlob;
   1458 
   1459         ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
   1460                 TYPE_GENERIC);
   1461         if (responseCode != ::NO_ERROR) {
   1462             ALOGW("Could not read %s", name8.string());
   1463             *item = NULL;
   1464             *itemLength = 0;
   1465             return responseCode;
   1466         }
   1467 
   1468         *item = (uint8_t*) malloc(keyBlob.getLength());
   1469         memcpy(*item, keyBlob.getValue(), keyBlob.getLength());
   1470         *itemLength = keyBlob.getLength();
   1471 
   1472         return ::NO_ERROR;
   1473     }
   1474 
   1475     int32_t insert(const String16& name, const uint8_t* item, size_t itemLength, int targetUid,
   1476             int32_t flags) {
   1477         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1478         if (!has_permission(callingUid, P_INSERT)) {
   1479             ALOGW("permission denied for %d: insert", callingUid);
   1480             return ::PERMISSION_DENIED;
   1481         }
   1482 
   1483         State state = mKeyStore->getState(callingUid);
   1484         if ((flags & KEYSTORE_FLAG_ENCRYPTED) && !isKeystoreUnlocked(state)) {
   1485             ALOGD("calling get in state: %d", state);
   1486             return state;
   1487         }
   1488 
   1489         if (targetUid == -1) {
   1490             targetUid = callingUid;
   1491         } else if (!is_granted_to(callingUid, targetUid)) {
   1492             return ::PERMISSION_DENIED;
   1493         }
   1494 
   1495         String8 name8(name);
   1496         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
   1497 
   1498         Blob keyBlob(item, itemLength, NULL, 0, ::TYPE_GENERIC);
   1499         keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
   1500 
   1501         return mKeyStore->put(filename.string(), &keyBlob, callingUid);
   1502     }
   1503 
   1504     int32_t del(const String16& name, int targetUid) {
   1505         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1506         if (!has_permission(callingUid, P_DELETE)) {
   1507             ALOGW("permission denied for %d: del", callingUid);
   1508             return ::PERMISSION_DENIED;
   1509         }
   1510 
   1511         if (targetUid == -1) {
   1512             targetUid = callingUid;
   1513         } else if (!is_granted_to(callingUid, targetUid)) {
   1514             return ::PERMISSION_DENIED;
   1515         }
   1516 
   1517         String8 name8(name);
   1518         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
   1519 
   1520         Blob keyBlob;
   1521         ResponseCode responseCode = mKeyStore->get(filename.string(), &keyBlob, TYPE_GENERIC,
   1522                 callingUid);
   1523         if (responseCode != ::NO_ERROR) {
   1524             return responseCode;
   1525         }
   1526         return (unlink(filename) && errno != ENOENT) ? ::SYSTEM_ERROR : ::NO_ERROR;
   1527     }
   1528 
   1529     int32_t exist(const String16& name, int targetUid) {
   1530         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1531         if (!has_permission(callingUid, P_EXIST)) {
   1532             ALOGW("permission denied for %d: exist", callingUid);
   1533             return ::PERMISSION_DENIED;
   1534         }
   1535 
   1536         if (targetUid == -1) {
   1537             targetUid = callingUid;
   1538         } else if (!is_granted_to(callingUid, targetUid)) {
   1539             return ::PERMISSION_DENIED;
   1540         }
   1541 
   1542         String8 name8(name);
   1543         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
   1544 
   1545         if (access(filename.string(), R_OK) == -1) {
   1546             return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
   1547         }
   1548         return ::NO_ERROR;
   1549     }
   1550 
   1551     int32_t saw(const String16& prefix, int targetUid, Vector<String16>* matches) {
   1552         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1553         if (!has_permission(callingUid, P_SAW)) {
   1554             ALOGW("permission denied for %d: saw", callingUid);
   1555             return ::PERMISSION_DENIED;
   1556         }
   1557 
   1558         if (targetUid == -1) {
   1559             targetUid = callingUid;
   1560         } else if (!is_granted_to(callingUid, targetUid)) {
   1561             return ::PERMISSION_DENIED;
   1562         }
   1563 
   1564         UserState* userState = mKeyStore->getUserState(targetUid);
   1565         DIR* dir = opendir(userState->getUserDirName());
   1566         if (!dir) {
   1567             ALOGW("can't open directory for user: %s", strerror(errno));
   1568             return ::SYSTEM_ERROR;
   1569         }
   1570 
   1571         const String8 prefix8(prefix);
   1572         String8 filename(mKeyStore->getKeyNameForUid(prefix8, targetUid));
   1573         size_t n = filename.length();
   1574 
   1575         struct dirent* file;
   1576         while ((file = readdir(dir)) != NULL) {
   1577             // We only care about files.
   1578             if (file->d_type != DT_REG) {
   1579                 continue;
   1580             }
   1581 
   1582             // Skip anything that starts with a "."
   1583             if (file->d_name[0] == '.') {
   1584                 continue;
   1585             }
   1586 
   1587             if (!strncmp(filename.string(), file->d_name, n)) {
   1588                 const char* p = &file->d_name[n];
   1589                 size_t plen = strlen(p);
   1590 
   1591                 size_t extra = decode_key_length(p, plen);
   1592                 char *match = (char*) malloc(extra + 1);
   1593                 if (match != NULL) {
   1594                     decode_key(match, p, plen);
   1595                     matches->push(String16(match, extra));
   1596                     free(match);
   1597                 } else {
   1598                     ALOGW("could not allocate match of size %zd", extra);
   1599                 }
   1600             }
   1601         }
   1602         closedir(dir);
   1603 
   1604         return ::NO_ERROR;
   1605     }
   1606 
   1607     int32_t reset() {
   1608         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1609         if (!has_permission(callingUid, P_RESET)) {
   1610             ALOGW("permission denied for %d: reset", callingUid);
   1611             return ::PERMISSION_DENIED;
   1612         }
   1613 
   1614         ResponseCode rc = mKeyStore->reset(callingUid) ? ::NO_ERROR : ::SYSTEM_ERROR;
   1615 
   1616         const keymaster_device_t* device = mKeyStore->getDevice();
   1617         if (device == NULL) {
   1618             ALOGE("No keymaster device!");
   1619             return ::SYSTEM_ERROR;
   1620         }
   1621 
   1622         if (device->delete_all == NULL) {
   1623             ALOGV("keymaster device doesn't implement delete_all");
   1624             return rc;
   1625         }
   1626 
   1627         if (device->delete_all(device)) {
   1628             ALOGE("Problem calling keymaster's delete_all");
   1629             return ::SYSTEM_ERROR;
   1630         }
   1631 
   1632         return rc;
   1633     }
   1634 
   1635     /*
   1636      * Here is the history. To improve the security, the parameters to generate the
   1637      * master key has been changed. To make a seamless transition, we update the
   1638      * file using the same password when the user unlock it for the first time. If
   1639      * any thing goes wrong during the transition, the new file will not overwrite
   1640      * the old one. This avoids permanent damages of the existing data.
   1641      */
   1642     int32_t password(const String16& password) {
   1643         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1644         if (!has_permission(callingUid, P_PASSWORD)) {
   1645             ALOGW("permission denied for %d: password", callingUid);
   1646             return ::PERMISSION_DENIED;
   1647         }
   1648 
   1649         const String8 password8(password);
   1650 
   1651         switch (mKeyStore->getState(callingUid)) {
   1652             case ::STATE_UNINITIALIZED: {
   1653                 // generate master key, encrypt with password, write to file, initialize mMasterKey*.
   1654                 return mKeyStore->initializeUser(password8, callingUid);
   1655             }
   1656             case ::STATE_NO_ERROR: {
   1657                 // rewrite master key with new password.
   1658                 return mKeyStore->writeMasterKey(password8, callingUid);
   1659             }
   1660             case ::STATE_LOCKED: {
   1661                 // read master key, decrypt with password, initialize mMasterKey*.
   1662                 return mKeyStore->readMasterKey(password8, callingUid);
   1663             }
   1664         }
   1665         return ::SYSTEM_ERROR;
   1666     }
   1667 
   1668     int32_t lock() {
   1669         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1670         if (!has_permission(callingUid, P_LOCK)) {
   1671             ALOGW("permission denied for %d: lock", callingUid);
   1672             return ::PERMISSION_DENIED;
   1673         }
   1674 
   1675         State state = mKeyStore->getState(callingUid);
   1676         if (state != ::STATE_NO_ERROR) {
   1677             ALOGD("calling lock in state: %d", state);
   1678             return state;
   1679         }
   1680 
   1681         mKeyStore->lock(callingUid);
   1682         return ::NO_ERROR;
   1683     }
   1684 
   1685     int32_t unlock(const String16& pw) {
   1686         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1687         if (!has_permission(callingUid, P_UNLOCK)) {
   1688             ALOGW("permission denied for %d: unlock", callingUid);
   1689             return ::PERMISSION_DENIED;
   1690         }
   1691 
   1692         State state = mKeyStore->getState(callingUid);
   1693         if (state != ::STATE_LOCKED) {
   1694             ALOGD("calling unlock when not locked");
   1695             return state;
   1696         }
   1697 
   1698         const String8 password8(pw);
   1699         return password(pw);
   1700     }
   1701 
   1702     int32_t zero() {
   1703         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1704         if (!has_permission(callingUid, P_ZERO)) {
   1705             ALOGW("permission denied for %d: zero", callingUid);
   1706             return -1;
   1707         }
   1708 
   1709         return mKeyStore->isEmpty(callingUid) ? ::KEY_NOT_FOUND : ::NO_ERROR;
   1710     }
   1711 
   1712     int32_t generate(const String16& name, int32_t targetUid, int32_t keyType, int32_t keySize,
   1713             int32_t flags, Vector<sp<KeystoreArg> >* args) {
   1714         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1715         if (!has_permission(callingUid, P_INSERT)) {
   1716             ALOGW("permission denied for %d: generate", callingUid);
   1717             return ::PERMISSION_DENIED;
   1718         }
   1719 
   1720         if (targetUid == -1) {
   1721             targetUid = callingUid;
   1722         } else if (!is_granted_to(callingUid, targetUid)) {
   1723             return ::PERMISSION_DENIED;
   1724         }
   1725 
   1726         State state = mKeyStore->getState(callingUid);
   1727         if ((flags & KEYSTORE_FLAG_ENCRYPTED) && !isKeystoreUnlocked(state)) {
   1728             ALOGW("calling generate in state: %d", state);
   1729             return state;
   1730         }
   1731 
   1732         uint8_t* data;
   1733         size_t dataLength;
   1734         int rc;
   1735         bool isFallback = false;
   1736 
   1737         const keymaster_device_t* device = mKeyStore->getDevice();
   1738         if (device == NULL) {
   1739             return ::SYSTEM_ERROR;
   1740         }
   1741 
   1742         if (device->generate_keypair == NULL) {
   1743             return ::SYSTEM_ERROR;
   1744         }
   1745 
   1746         if (keyType == EVP_PKEY_DSA) {
   1747             keymaster_dsa_keygen_params_t dsa_params;
   1748             memset(&dsa_params, '\0', sizeof(dsa_params));
   1749 
   1750             if (keySize == -1) {
   1751                 keySize = DSA_DEFAULT_KEY_SIZE;
   1752             } else if ((keySize % 64) != 0 || keySize < DSA_MIN_KEY_SIZE
   1753                     || keySize > DSA_MAX_KEY_SIZE) {
   1754                 ALOGI("invalid key size %d", keySize);
   1755                 return ::SYSTEM_ERROR;
   1756             }
   1757             dsa_params.key_size = keySize;
   1758 
   1759             if (args->size() == 3) {
   1760                 sp<KeystoreArg> gArg = args->itemAt(0);
   1761                 sp<KeystoreArg> pArg = args->itemAt(1);
   1762                 sp<KeystoreArg> qArg = args->itemAt(2);
   1763 
   1764                 if (gArg != NULL && pArg != NULL && qArg != NULL) {
   1765                     dsa_params.generator = reinterpret_cast<const uint8_t*>(gArg->data());
   1766                     dsa_params.generator_len = gArg->size();
   1767 
   1768                     dsa_params.prime_p = reinterpret_cast<const uint8_t*>(pArg->data());
   1769                     dsa_params.prime_p_len = pArg->size();
   1770 
   1771                     dsa_params.prime_q = reinterpret_cast<const uint8_t*>(qArg->data());
   1772                     dsa_params.prime_q_len = qArg->size();
   1773                 } else {
   1774                     ALOGI("not all DSA parameters were read");
   1775                     return ::SYSTEM_ERROR;
   1776                 }
   1777             } else if (args->size() != 0) {
   1778                 ALOGI("DSA args must be 3");
   1779                 return ::SYSTEM_ERROR;
   1780             }
   1781 
   1782             if (device->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_0_2) {
   1783                 rc = device->generate_keypair(device, TYPE_DSA, &dsa_params, &data, &dataLength);
   1784             } else {
   1785                 isFallback = true;
   1786                 rc = openssl_generate_keypair(device, TYPE_DSA, &dsa_params, &data, &dataLength);
   1787             }
   1788         } else if (keyType == EVP_PKEY_EC) {
   1789             keymaster_ec_keygen_params_t ec_params;
   1790             memset(&ec_params, '\0', sizeof(ec_params));
   1791 
   1792             if (keySize == -1) {
   1793                 keySize = EC_DEFAULT_KEY_SIZE;
   1794             } else if (keySize < EC_MIN_KEY_SIZE || keySize > EC_MAX_KEY_SIZE) {
   1795                 ALOGI("invalid key size %d", keySize);
   1796                 return ::SYSTEM_ERROR;
   1797             }
   1798             ec_params.field_size = keySize;
   1799 
   1800             if (device->common.module->module_api_version >= KEYMASTER_MODULE_API_VERSION_0_2) {
   1801                 rc = device->generate_keypair(device, TYPE_EC, &ec_params, &data, &dataLength);
   1802             } else {
   1803                 isFallback = true;
   1804                 rc = openssl_generate_keypair(device, TYPE_EC, &ec_params, &data, &dataLength);
   1805             }
   1806         } else if (keyType == EVP_PKEY_RSA) {
   1807             keymaster_rsa_keygen_params_t rsa_params;
   1808             memset(&rsa_params, '\0', sizeof(rsa_params));
   1809             rsa_params.public_exponent = RSA_DEFAULT_EXPONENT;
   1810 
   1811             if (keySize == -1) {
   1812                 keySize = RSA_DEFAULT_KEY_SIZE;
   1813             } else if (keySize < RSA_MIN_KEY_SIZE || keySize > RSA_MAX_KEY_SIZE) {
   1814                 ALOGI("invalid key size %d", keySize);
   1815                 return ::SYSTEM_ERROR;
   1816             }
   1817             rsa_params.modulus_size = keySize;
   1818 
   1819             if (args->size() > 1) {
   1820                 ALOGI("invalid number of arguments: %d", args->size());
   1821                 return ::SYSTEM_ERROR;
   1822             } else if (args->size() == 1) {
   1823                 sp<KeystoreArg> pubExpBlob = args->itemAt(0);
   1824                 if (pubExpBlob != NULL) {
   1825                     Unique_BIGNUM pubExpBn(
   1826                             BN_bin2bn(reinterpret_cast<const unsigned char*>(pubExpBlob->data()),
   1827                                     pubExpBlob->size(), NULL));
   1828                     if (pubExpBn.get() == NULL) {
   1829                         ALOGI("Could not convert public exponent to BN");
   1830                         return ::SYSTEM_ERROR;
   1831                     }
   1832                     unsigned long pubExp = BN_get_word(pubExpBn.get());
   1833                     if (pubExp == 0xFFFFFFFFL) {
   1834                         ALOGI("cannot represent public exponent as a long value");
   1835                         return ::SYSTEM_ERROR;
   1836                     }
   1837                     rsa_params.public_exponent = pubExp;
   1838                 }
   1839             }
   1840 
   1841             rc = device->generate_keypair(device, TYPE_RSA, &rsa_params, &data, &dataLength);
   1842         } else {
   1843             ALOGW("Unsupported key type %d", keyType);
   1844             rc = -1;
   1845         }
   1846 
   1847         if (rc) {
   1848             return ::SYSTEM_ERROR;
   1849         }
   1850 
   1851         String8 name8(name);
   1852         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
   1853 
   1854         Blob keyBlob(data, dataLength, NULL, 0, TYPE_KEY_PAIR);
   1855         free(data);
   1856 
   1857         keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
   1858         keyBlob.setFallback(isFallback);
   1859 
   1860         return mKeyStore->put(filename.string(), &keyBlob, callingUid);
   1861     }
   1862 
   1863     int32_t import(const String16& name, const uint8_t* data, size_t length, int targetUid,
   1864             int32_t flags) {
   1865         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1866         if (!has_permission(callingUid, P_INSERT)) {
   1867             ALOGW("permission denied for %d: import", callingUid);
   1868             return ::PERMISSION_DENIED;
   1869         }
   1870 
   1871         if (targetUid == -1) {
   1872             targetUid = callingUid;
   1873         } else if (!is_granted_to(callingUid, targetUid)) {
   1874             return ::PERMISSION_DENIED;
   1875         }
   1876 
   1877         State state = mKeyStore->getState(callingUid);
   1878         if ((flags & KEYSTORE_FLAG_ENCRYPTED) && !isKeystoreUnlocked(state)) {
   1879             ALOGD("calling import in state: %d", state);
   1880             return state;
   1881         }
   1882 
   1883         String8 name8(name);
   1884         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid));
   1885 
   1886         return mKeyStore->importKey(data, length, filename.string(), callingUid, flags);
   1887     }
   1888 
   1889     int32_t sign(const String16& name, const uint8_t* data, size_t length, uint8_t** out,
   1890             size_t* outLength) {
   1891         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1892         if (!has_permission(callingUid, P_SIGN)) {
   1893             ALOGW("permission denied for %d: saw", callingUid);
   1894             return ::PERMISSION_DENIED;
   1895         }
   1896 
   1897         Blob keyBlob;
   1898         String8 name8(name);
   1899 
   1900         ALOGV("sign %s from uid %d", name8.string(), callingUid);
   1901         int rc;
   1902 
   1903         ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
   1904                 ::TYPE_KEY_PAIR);
   1905         if (responseCode != ::NO_ERROR) {
   1906             return responseCode;
   1907         }
   1908 
   1909         const keymaster_device_t* device = mKeyStore->getDevice();
   1910         if (device == NULL) {
   1911             ALOGE("no keymaster device; cannot sign");
   1912             return ::SYSTEM_ERROR;
   1913         }
   1914 
   1915         if (device->sign_data == NULL) {
   1916             ALOGE("device doesn't implement signing");
   1917             return ::SYSTEM_ERROR;
   1918         }
   1919 
   1920         keymaster_rsa_sign_params_t params;
   1921         params.digest_type = DIGEST_NONE;
   1922         params.padding_type = PADDING_NONE;
   1923 
   1924         if (keyBlob.isFallback()) {
   1925             rc = openssl_sign_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
   1926                     length, out, outLength);
   1927         } else {
   1928             rc = device->sign_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
   1929                     length, out, outLength);
   1930         }
   1931         if (rc) {
   1932             ALOGW("device couldn't sign data");
   1933             return ::SYSTEM_ERROR;
   1934         }
   1935 
   1936         return ::NO_ERROR;
   1937     }
   1938 
   1939     int32_t verify(const String16& name, const uint8_t* data, size_t dataLength,
   1940             const uint8_t* signature, size_t signatureLength) {
   1941         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1942         if (!has_permission(callingUid, P_VERIFY)) {
   1943             ALOGW("permission denied for %d: verify", callingUid);
   1944             return ::PERMISSION_DENIED;
   1945         }
   1946 
   1947         State state = mKeyStore->getState(callingUid);
   1948         if (!isKeystoreUnlocked(state)) {
   1949             ALOGD("calling verify in state: %d", state);
   1950             return state;
   1951         }
   1952 
   1953         Blob keyBlob;
   1954         String8 name8(name);
   1955         int rc;
   1956 
   1957         ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
   1958                 TYPE_KEY_PAIR);
   1959         if (responseCode != ::NO_ERROR) {
   1960             return responseCode;
   1961         }
   1962 
   1963         const keymaster_device_t* device = mKeyStore->getDevice();
   1964         if (device == NULL) {
   1965             return ::SYSTEM_ERROR;
   1966         }
   1967 
   1968         if (device->verify_data == NULL) {
   1969             return ::SYSTEM_ERROR;
   1970         }
   1971 
   1972         keymaster_rsa_sign_params_t params;
   1973         params.digest_type = DIGEST_NONE;
   1974         params.padding_type = PADDING_NONE;
   1975 
   1976         if (keyBlob.isFallback()) {
   1977             rc = openssl_verify_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
   1978                     dataLength, signature, signatureLength);
   1979         } else {
   1980             rc = device->verify_data(device, &params, keyBlob.getValue(), keyBlob.getLength(), data,
   1981                     dataLength, signature, signatureLength);
   1982         }
   1983         if (rc) {
   1984             return ::SYSTEM_ERROR;
   1985         } else {
   1986             return ::NO_ERROR;
   1987         }
   1988     }
   1989 
   1990     /*
   1991      * TODO: The abstraction between things stored in hardware and regular blobs
   1992      * of data stored on the filesystem should be moved down to keystore itself.
   1993      * Unfortunately the Java code that calls this has naming conventions that it
   1994      * knows about. Ideally keystore shouldn't be used to store random blobs of
   1995      * data.
   1996      *
   1997      * Until that happens, it's necessary to have a separate "get_pubkey" and
   1998      * "del_key" since the Java code doesn't really communicate what it's
   1999      * intentions are.
   2000      */
   2001     int32_t get_pubkey(const String16& name, uint8_t** pubkey, size_t* pubkeyLength) {
   2002         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   2003         if (!has_permission(callingUid, P_GET)) {
   2004             ALOGW("permission denied for %d: get_pubkey", callingUid);
   2005             return ::PERMISSION_DENIED;
   2006         }
   2007 
   2008         Blob keyBlob;
   2009         String8 name8(name);
   2010 
   2011         ALOGV("get_pubkey '%s' from uid %d", name8.string(), callingUid);
   2012 
   2013         ResponseCode responseCode = mKeyStore->getKeyForName(&keyBlob, name8, callingUid,
   2014                 TYPE_KEY_PAIR);
   2015         if (responseCode != ::NO_ERROR) {
   2016             return responseCode;
   2017         }
   2018 
   2019         const keymaster_device_t* device = mKeyStore->getDevice();
   2020         if (device == NULL) {
   2021             return ::SYSTEM_ERROR;
   2022         }
   2023 
   2024         if (device->get_keypair_public == NULL) {
   2025             ALOGE("device has no get_keypair_public implementation!");
   2026             return ::SYSTEM_ERROR;
   2027         }
   2028 
   2029         int rc;
   2030         if (keyBlob.isFallback()) {
   2031             rc = openssl_get_keypair_public(device, keyBlob.getValue(), keyBlob.getLength(), pubkey,
   2032                     pubkeyLength);
   2033         } else {
   2034             rc = device->get_keypair_public(device, keyBlob.getValue(), keyBlob.getLength(), pubkey,
   2035                     pubkeyLength);
   2036         }
   2037         if (rc) {
   2038             return ::SYSTEM_ERROR;
   2039         }
   2040 
   2041         return ::NO_ERROR;
   2042     }
   2043 
   2044     int32_t del_key(const String16& name, int targetUid) {
   2045         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   2046         if (!has_permission(callingUid, P_DELETE)) {
   2047             ALOGW("permission denied for %d: del_key", callingUid);
   2048             return ::PERMISSION_DENIED;
   2049         }
   2050 
   2051         if (targetUid == -1) {
   2052             targetUid = callingUid;
   2053         } else if (!is_granted_to(callingUid, targetUid)) {
   2054             return ::PERMISSION_DENIED;
   2055         }
   2056 
   2057         String8 name8(name);
   2058         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
   2059 
   2060         Blob keyBlob;
   2061         ResponseCode responseCode = mKeyStore->get(filename.string(), &keyBlob, ::TYPE_KEY_PAIR,
   2062                 callingUid);
   2063         if (responseCode != ::NO_ERROR) {
   2064             return responseCode;
   2065         }
   2066 
   2067         ResponseCode rc = ::NO_ERROR;
   2068 
   2069         const keymaster_device_t* device = mKeyStore->getDevice();
   2070         if (device == NULL) {
   2071             rc = ::SYSTEM_ERROR;
   2072         } else {
   2073             // A device doesn't have to implement delete_keypair.
   2074             if (device->delete_keypair != NULL && !keyBlob.isFallback()) {
   2075                 if (device->delete_keypair(device, keyBlob.getValue(), keyBlob.getLength())) {
   2076                     rc = ::SYSTEM_ERROR;
   2077                 }
   2078             }
   2079         }
   2080 
   2081         if (rc != ::NO_ERROR) {
   2082             return rc;
   2083         }
   2084 
   2085         return (unlink(filename) && errno != ENOENT) ? ::SYSTEM_ERROR : ::NO_ERROR;
   2086     }
   2087 
   2088     int32_t grant(const String16& name, int32_t granteeUid) {
   2089         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   2090         if (!has_permission(callingUid, P_GRANT)) {
   2091             ALOGW("permission denied for %d: grant", callingUid);
   2092             return ::PERMISSION_DENIED;
   2093         }
   2094 
   2095         State state = mKeyStore->getState(callingUid);
   2096         if (!isKeystoreUnlocked(state)) {
   2097             ALOGD("calling grant in state: %d", state);
   2098             return state;
   2099         }
   2100 
   2101         String8 name8(name);
   2102         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
   2103 
   2104         if (access(filename.string(), R_OK) == -1) {
   2105             return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
   2106         }
   2107 
   2108         mKeyStore->addGrant(filename.string(), granteeUid);
   2109         return ::NO_ERROR;
   2110     }
   2111 
   2112     int32_t ungrant(const String16& name, int32_t granteeUid) {
   2113         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   2114         if (!has_permission(callingUid, P_GRANT)) {
   2115             ALOGW("permission denied for %d: ungrant", callingUid);
   2116             return ::PERMISSION_DENIED;
   2117         }
   2118 
   2119         State state = mKeyStore->getState(callingUid);
   2120         if (!isKeystoreUnlocked(state)) {
   2121             ALOGD("calling ungrant in state: %d", state);
   2122             return state;
   2123         }
   2124 
   2125         String8 name8(name);
   2126         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
   2127 
   2128         if (access(filename.string(), R_OK) == -1) {
   2129             return (errno != ENOENT) ? ::SYSTEM_ERROR : ::KEY_NOT_FOUND;
   2130         }
   2131 
   2132         return mKeyStore->removeGrant(filename.string(), granteeUid) ? ::NO_ERROR : ::KEY_NOT_FOUND;
   2133     }
   2134 
   2135     int64_t getmtime(const String16& name) {
   2136         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   2137         if (!has_permission(callingUid, P_GET)) {
   2138             ALOGW("permission denied for %d: getmtime", callingUid);
   2139             return -1L;
   2140         }
   2141 
   2142         String8 name8(name);
   2143         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid));
   2144 
   2145         if (access(filename.string(), R_OK) == -1) {
   2146             ALOGW("could not access %s for getmtime", filename.string());
   2147             return -1L;
   2148         }
   2149 
   2150         int fd = TEMP_FAILURE_RETRY(open(filename.string(), O_NOFOLLOW, O_RDONLY));
   2151         if (fd < 0) {
   2152             ALOGW("could not open %s for getmtime", filename.string());
   2153             return -1L;
   2154         }
   2155 
   2156         struct stat s;
   2157         int ret = fstat(fd, &s);
   2158         close(fd);
   2159         if (ret == -1) {
   2160             ALOGW("could not stat %s for getmtime", filename.string());
   2161             return -1L;
   2162         }
   2163 
   2164         return static_cast<int64_t>(s.st_mtime);
   2165     }
   2166 
   2167     int32_t duplicate(const String16& srcKey, int32_t srcUid, const String16& destKey,
   2168             int32_t destUid) {
   2169         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   2170         if (!has_permission(callingUid, P_DUPLICATE)) {
   2171             ALOGW("permission denied for %d: duplicate", callingUid);
   2172             return -1L;
   2173         }
   2174 
   2175         State state = mKeyStore->getState(callingUid);
   2176         if (!isKeystoreUnlocked(state)) {
   2177             ALOGD("calling duplicate in state: %d", state);
   2178             return state;
   2179         }
   2180 
   2181         if (srcUid == -1 || static_cast<uid_t>(srcUid) == callingUid) {
   2182             srcUid = callingUid;
   2183         } else if (!is_granted_to(callingUid, srcUid)) {
   2184             ALOGD("migrate not granted from source: %d -> %d", callingUid, srcUid);
   2185             return ::PERMISSION_DENIED;
   2186         }
   2187 
   2188         if (destUid == -1) {
   2189             destUid = callingUid;
   2190         }
   2191 
   2192         if (srcUid != destUid) {
   2193             if (static_cast<uid_t>(srcUid) != callingUid) {
   2194                 ALOGD("can only duplicate from caller to other or to same uid: "
   2195                       "calling=%d, srcUid=%d, destUid=%d", callingUid, srcUid, destUid);
   2196                 return ::PERMISSION_DENIED;
   2197             }
   2198 
   2199             if (!is_granted_to(callingUid, destUid)) {
   2200                 ALOGD("duplicate not granted to dest: %d -> %d", callingUid, destUid);
   2201                 return ::PERMISSION_DENIED;
   2202             }
   2203         }
   2204 
   2205         String8 source8(srcKey);
   2206         String8 sourceFile(mKeyStore->getKeyNameForUidWithDir(source8, srcUid));
   2207 
   2208         String8 target8(destKey);
   2209         String8 targetFile(mKeyStore->getKeyNameForUidWithDir(target8, srcUid));
   2210 
   2211         if (access(targetFile.string(), W_OK) != -1 || errno != ENOENT) {
   2212             ALOGD("destination already exists: %s", targetFile.string());
   2213             return ::SYSTEM_ERROR;
   2214         }
   2215 
   2216         Blob keyBlob;
   2217         ResponseCode responseCode = mKeyStore->get(sourceFile.string(), &keyBlob, TYPE_ANY,
   2218                 callingUid);
   2219         if (responseCode != ::NO_ERROR) {
   2220             return responseCode;
   2221         }
   2222 
   2223         return mKeyStore->put(targetFile.string(), &keyBlob, callingUid);
   2224     }
   2225 
   2226     int32_t is_hardware_backed(const String16& keyType) {
   2227         return mKeyStore->isHardwareBacked(keyType) ? 1 : 0;
   2228     }
   2229 
   2230     int32_t clear_uid(int64_t targetUid) {
   2231         uid_t callingUid = IPCThreadState::self()->getCallingUid();
   2232         if (!has_permission(callingUid, P_CLEAR_UID)) {
   2233             ALOGW("permission denied for %d: clear_uid", callingUid);
   2234             return ::PERMISSION_DENIED;
   2235         }
   2236 
   2237         State state = mKeyStore->getState(callingUid);
   2238         if (!isKeystoreUnlocked(state)) {
   2239             ALOGD("calling clear_uid in state: %d", state);
   2240             return state;
   2241         }
   2242 
   2243         const keymaster_device_t* device = mKeyStore->getDevice();
   2244         if (device == NULL) {
   2245             ALOGW("can't get keymaster device");
   2246             return ::SYSTEM_ERROR;
   2247         }
   2248 
   2249         UserState* userState = mKeyStore->getUserState(callingUid);
   2250         DIR* dir = opendir(userState->getUserDirName());
   2251         if (!dir) {
   2252             ALOGW("can't open user directory: %s", strerror(errno));
   2253             return ::SYSTEM_ERROR;
   2254         }
   2255 
   2256         char prefix[NAME_MAX];
   2257         int n = snprintf(prefix, NAME_MAX, "%u_", static_cast<uid_t>(targetUid));
   2258 
   2259         ResponseCode rc = ::NO_ERROR;
   2260 
   2261         struct dirent* file;
   2262         while ((file = readdir(dir)) != NULL) {
   2263             // We only care about files.
   2264             if (file->d_type != DT_REG) {
   2265                 continue;
   2266             }
   2267 
   2268             // Skip anything that starts with a "."
   2269             if (file->d_name[0] == '.') {
   2270                 continue;
   2271             }
   2272 
   2273             if (strncmp(prefix, file->d_name, n)) {
   2274                 continue;
   2275             }
   2276 
   2277             String8 filename(String8::format("%s/%s", userState->getUserDirName(), file->d_name));
   2278             Blob keyBlob;
   2279             if (mKeyStore->get(filename.string(), &keyBlob, ::TYPE_ANY, callingUid)
   2280                     != ::NO_ERROR) {
   2281                 ALOGW("couldn't open %s", filename.string());
   2282                 continue;
   2283             }
   2284 
   2285             if (keyBlob.getType() == ::TYPE_KEY_PAIR) {
   2286                 // A device doesn't have to implement delete_keypair.
   2287                 if (device->delete_keypair != NULL && !keyBlob.isFallback()) {
   2288                     if (device->delete_keypair(device, keyBlob.getValue(), keyBlob.getLength())) {
   2289                         rc = ::SYSTEM_ERROR;
   2290                         ALOGW("device couldn't remove %s", filename.string());
   2291                     }
   2292                 }
   2293             }
   2294 
   2295             if (unlinkat(dirfd(dir), file->d_name, 0) && errno != ENOENT) {
   2296                 rc = ::SYSTEM_ERROR;
   2297                 ALOGW("couldn't unlink %s", filename.string());
   2298             }
   2299         }
   2300         closedir(dir);
   2301 
   2302         return rc;
   2303     }
   2304 
   2305 private:
   2306     inline bool isKeystoreUnlocked(State state) {
   2307         switch (state) {
   2308         case ::STATE_NO_ERROR:
   2309             return true;
   2310         case ::STATE_UNINITIALIZED:
   2311         case ::STATE_LOCKED:
   2312             return false;
   2313         }
   2314         return false;
   2315     }
   2316 
   2317     ::KeyStore* mKeyStore;
   2318 };
   2319 
   2320 }; // namespace android
   2321 
   2322 int main(int argc, char* argv[]) {
   2323     if (argc < 2) {
   2324         ALOGE("A directory must be specified!");
   2325         return 1;
   2326     }
   2327     if (chdir(argv[1]) == -1) {
   2328         ALOGE("chdir: %s: %s", argv[1], strerror(errno));
   2329         return 1;
   2330     }
   2331 
   2332     Entropy entropy;
   2333     if (!entropy.open()) {
   2334         return 1;
   2335     }
   2336 
   2337     keymaster_device_t* dev;
   2338     if (keymaster_device_initialize(&dev)) {
   2339         ALOGE("keystore keymaster could not be initialized; exiting");
   2340         return 1;
   2341     }
   2342 
   2343     KeyStore keyStore(&entropy, dev);
   2344     keyStore.initialize();
   2345     android::sp<android::IServiceManager> sm = android::defaultServiceManager();
   2346     android::sp<android::KeyStoreProxy> proxy = new android::KeyStoreProxy(&keyStore);
   2347     android::status_t ret = sm->addService(android::String16("android.security.keystore"), proxy);
   2348     if (ret != android::OK) {
   2349         ALOGE("Couldn't register binder service!");
   2350         return -1;
   2351     }
   2352 
   2353     /*
   2354      * We're the only thread in existence, so we're just going to process
   2355      * Binder transaction as a single-threaded program.
   2356      */
   2357     android::IPCThreadState::self()->joinThreadPool();
   2358 
   2359     keymaster_device_release(dev);
   2360     return 1;
   2361 }
   2362