Home | History | Annotate | Download | only in keystore
      1 /*
      2  * Copyright (C) 2016 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_TAG "keystore"
     18 
     19 #include "KeyStore.h"
     20 
     21 #include <dirent.h>
     22 #include <fcntl.h>
     23 
     24 #include <openssl/bio.h>
     25 
     26 #include <utils/String16.h>
     27 #include <utils/String8.h>
     28 
     29 #include <android-base/scopeguard.h>
     30 #include <android/hardware/keymaster/3.0/IKeymasterDevice.h>
     31 #include <android/security/IKeystoreService.h>
     32 #include <log/log_event_list.h>
     33 
     34 #include <private/android_logger.h>
     35 
     36 #include "keystore_utils.h"
     37 #include "permissions.h"
     38 #include <keystore/keystore_hidl_support.h>
     39 
     40 namespace keystore {
     41 
     42 const char* KeyStore::kOldMasterKey = ".masterkey";
     43 const char* KeyStore::kMetaDataFile = ".metadata";
     44 
     45 const android::String16 KeyStore::kRsaKeyType("RSA");
     46 const android::String16 KeyStore::kEcKeyType("EC");
     47 
     48 using android::String8;
     49 
     50 sp<Keymaster>& KeymasterDevices::operator[](SecurityLevel secLevel) {
     51     static_assert(uint32_t(SecurityLevel::SOFTWARE) == 0 &&
     52                       uint32_t(SecurityLevel::TRUSTED_ENVIRONMENT) == 1 &&
     53                       uint32_t(SecurityLevel::STRONGBOX) == 2,
     54                   "Numeric values of security levels have changed");
     55     return at(static_cast<uint32_t>(secLevel));
     56 }
     57 
     58 sp<Keymaster> KeymasterDevices::operator[](SecurityLevel secLevel) const {
     59     if (static_cast<uint32_t>(secLevel) > static_cast<uint32_t>(SecurityLevel::STRONGBOX)) {
     60         LOG(ERROR) << "Invalid security level requested";
     61         return nullptr;
     62     }
     63     return (*const_cast<KeymasterDevices*>(this))[secLevel];
     64 }
     65 
     66 KeyStore::KeyStore(Entropy* entropy, const KeymasterDevices& kmDevices,
     67                    SecurityLevel minimalAllowedSecurityLevelForNewKeys)
     68     : mEntropy(entropy), mKmDevices(kmDevices),
     69       mAllowNewFallback(minimalAllowedSecurityLevelForNewKeys == SecurityLevel::SOFTWARE) {
     70     memset(&mMetaData, '\0', sizeof(mMetaData));
     71 }
     72 
     73 KeyStore::~KeyStore() {
     74     for (android::Vector<UserState*>::iterator it(mMasterKeys.begin()); it != mMasterKeys.end();
     75          it++) {
     76         delete *it;
     77     }
     78     mMasterKeys.clear();
     79 }
     80 
     81 ResponseCode KeyStore::initialize() {
     82     readMetaData();
     83     if (upgradeKeystore()) {
     84         writeMetaData();
     85     }
     86 
     87     return ResponseCode::NO_ERROR;
     88 }
     89 
     90 ResponseCode KeyStore::initializeUser(const android::String8& pw, uid_t userId) {
     91     UserState* userState = getUserState(userId);
     92     return userState->initialize(pw, mEntropy);
     93 }
     94 
     95 ResponseCode KeyStore::copyMasterKey(uid_t srcUser, uid_t dstUser) {
     96     UserState* userState = getUserState(dstUser);
     97     UserState* initState = getUserState(srcUser);
     98     return userState->copyMasterKey(initState);
     99 }
    100 
    101 ResponseCode KeyStore::writeMasterKey(const android::String8& pw, uid_t userId) {
    102     UserState* userState = getUserState(userId);
    103     return userState->writeMasterKey(pw, mEntropy);
    104 }
    105 
    106 ResponseCode KeyStore::readMasterKey(const android::String8& pw, uid_t userId) {
    107     UserState* userState = getUserState(userId);
    108     return userState->readMasterKey(pw, mEntropy);
    109 }
    110 
    111 /* Here is the encoding of keys. This is necessary in order to allow arbitrary
    112  * characters in keys. Characters in [0-~] are not encoded. Others are encoded
    113  * into two bytes. The first byte is one of [+-.] which represents the first
    114  * two bits of the character. The second byte encodes the rest of the bits into
    115  * [0-o]. Therefore in the worst case the length of a key gets doubled. Note
    116  * that Base64 cannot be used here due to the need of prefix match on keys. */
    117 
    118 static size_t encode_key_length(const android::String8& keyName) {
    119     const uint8_t* in = reinterpret_cast<const uint8_t*>(keyName.string());
    120     size_t length = keyName.length();
    121     for (int i = length; i > 0; --i, ++in) {
    122         if (*in < '0' || *in > '~') {
    123             ++length;
    124         }
    125     }
    126     return length;
    127 }
    128 
    129 static int encode_key(char* out, const android::String8& keyName) {
    130     const uint8_t* in = reinterpret_cast<const uint8_t*>(keyName.string());
    131     size_t length = keyName.length();
    132     for (int i = length; i > 0; --i, ++in, ++out) {
    133         if (*in < '0' || *in > '~') {
    134             *out = '+' + (*in >> 6);
    135             *++out = '0' + (*in & 0x3F);
    136             ++length;
    137         } else {
    138             *out = *in;
    139         }
    140     }
    141     *out = '\0';
    142     return length;
    143 }
    144 
    145 android::String8 KeyStore::getKeyName(const android::String8& keyName, const BlobType type) {
    146     std::vector<char> encoded(encode_key_length(keyName) + 1);  // add 1 for null char
    147     encode_key(encoded.data(), keyName);
    148     if (type == TYPE_KEY_CHARACTERISTICS) {
    149         return android::String8::format(".chr_%s", encoded.data());
    150     } else {
    151         return android::String8(encoded.data());
    152     }
    153 }
    154 
    155 android::String8 KeyStore::getKeyNameForUid(const android::String8& keyName, uid_t uid,
    156                                             const BlobType type) {
    157     std::vector<char> encoded(encode_key_length(keyName) + 1);  // add 1 for null char
    158     encode_key(encoded.data(), keyName);
    159     if (type == TYPE_KEY_CHARACTERISTICS) {
    160         return android::String8::format(".%u_chr_%s", uid, encoded.data());
    161     } else {
    162         return android::String8::format("%u_%s", uid, encoded.data());
    163     }
    164 }
    165 
    166 android::String8 KeyStore::getKeyNameForUidWithDir(const android::String8& keyName, uid_t uid,
    167                                                    const BlobType type) {
    168     std::vector<char> encoded(encode_key_length(keyName) + 1);  // add 1 for null char
    169     encode_key(encoded.data(), keyName);
    170 
    171     if (type == TYPE_KEY_CHARACTERISTICS) {
    172         return android::String8::format("%s/.%u_chr_%s", getUserStateByUid(uid)->getUserDirName(),
    173                                         uid, encoded.data());
    174     } else {
    175         return android::String8::format("%s/%u_%s", getUserStateByUid(uid)->getUserDirName(), uid,
    176                                         encoded.data());
    177     }
    178 }
    179 
    180 NullOr<android::String8> KeyStore::getBlobFileNameIfExists(const android::String8& alias, uid_t uid,
    181                                                            const BlobType type) {
    182     android::String8 filepath8(getKeyNameForUidWithDir(alias, uid, type));
    183 
    184     if (!access(filepath8.string(), R_OK | W_OK)) return filepath8;
    185 
    186     // If this is one of the legacy UID->UID mappings, use it.
    187     uid_t euid = get_keystore_euid(uid);
    188     if (euid != uid) {
    189         filepath8 = getKeyNameForUidWithDir(alias, euid, type);
    190         if (!access(filepath8.string(), R_OK | W_OK)) return filepath8;
    191     }
    192 
    193     // They might be using a granted key.
    194     auto grant = mGrants.get(uid, alias.string());
    195     if (grant) {
    196         filepath8 = String8::format(
    197             "%s/%s", grant->owner_dir_name_.c_str(),
    198             getKeyNameForUid(String8(grant->alias_.c_str()), grant->owner_uid_, type).c_str());
    199         if (!access(filepath8.string(), R_OK | W_OK)) return filepath8;
    200     }
    201     return {};
    202 }
    203 
    204 void KeyStore::resetUser(uid_t userId, bool keepUnenryptedEntries) {
    205     android::String8 prefix("");
    206     android::Vector<android::String16> aliases;
    207     UserState* userState = getUserState(userId);
    208     if (list(prefix, &aliases, userId) != ResponseCode::NO_ERROR) {
    209         return;
    210     }
    211     for (uint32_t i = 0; i < aliases.size(); i++) {
    212         android::String8 filename(aliases[i]);
    213         filename = android::String8::format("%s/%s", userState->getUserDirName(),
    214                                             getKeyName(filename, TYPE_ANY).string());
    215         bool shouldDelete = true;
    216         if (keepUnenryptedEntries) {
    217             Blob blob;
    218             ResponseCode rc = get(filename, &blob, ::TYPE_ANY, userId);
    219 
    220             switch (rc) {
    221             case ResponseCode::SYSTEM_ERROR:
    222             case ResponseCode::VALUE_CORRUPTED:
    223                 // If we can't read blobs, delete them.
    224                 shouldDelete = true;
    225                 break;
    226 
    227             case ResponseCode::NO_ERROR:
    228             case ResponseCode::LOCKED:
    229                 // Delete encrypted blobs but keep unencrypted blobs and super-encrypted blobs.  We
    230                 // need to keep super-encrypted blobs so we can report that the user is
    231                 // unauthenticated if a caller tries to use them, rather than reporting that they
    232                 // don't exist.
    233                 shouldDelete = blob.isEncrypted();
    234                 break;
    235 
    236             default:
    237                 ALOGE("Got unexpected return code %d from KeyStore::get()", rc);
    238                 // This shouldn't happen.  To be on the safe side, delete it.
    239                 shouldDelete = true;
    240                 break;
    241             }
    242         }
    243         if (shouldDelete) {
    244             del(filename, ::TYPE_ANY, userId);
    245 
    246             // del() will fail silently if no cached characteristics are present for this alias.
    247             android::String8 chr_filename(aliases[i]);
    248             chr_filename = android::String8::format(
    249                 "%s/%s", userState->getUserDirName(),
    250                 getKeyName(chr_filename, TYPE_KEY_CHARACTERISTICS).string());
    251             del(chr_filename, ::TYPE_KEY_CHARACTERISTICS, userId);
    252         }
    253     }
    254     if (!userState->deleteMasterKey()) {
    255         ALOGE("Failed to delete user %d's master key", userId);
    256     }
    257     if (!keepUnenryptedEntries) {
    258         if (!userState->reset()) {
    259             ALOGE("Failed to remove user %d's directory", userId);
    260         }
    261     }
    262 }
    263 
    264 bool KeyStore::isEmpty(uid_t userId) const {
    265     const UserState* userState = getUserState(userId);
    266     if (userState == NULL) {
    267         return true;
    268     }
    269 
    270     DIR* dir = opendir(userState->getUserDirName());
    271     if (!dir) {
    272         return true;
    273     }
    274 
    275     bool result = true;
    276     struct dirent* file;
    277     while ((file = readdir(dir)) != NULL) {
    278         // We only care about files.
    279         if (file->d_type != DT_REG) {
    280             continue;
    281         }
    282 
    283         // Skip anything that starts with a "."
    284         if (file->d_name[0] == '.') {
    285             continue;
    286         }
    287 
    288         result = false;
    289         break;
    290     }
    291     closedir(dir);
    292     return result;
    293 }
    294 
    295 void KeyStore::lock(uid_t userId) {
    296     UserState* userState = getUserState(userId);
    297     userState->zeroizeMasterKeysInMemory();
    298     userState->setState(STATE_LOCKED);
    299 }
    300 
    301 static void maybeLogKeyIntegrityViolation(const char* filename, const BlobType type);
    302 
    303 ResponseCode KeyStore::get(const char* filename, Blob* keyBlob, const BlobType type, uid_t userId) {
    304     UserState* userState = getUserState(userId);
    305     ResponseCode rc;
    306 
    307     auto logOnScopeExit = android::base::make_scope_guard([&] {
    308         if (rc == ResponseCode::VALUE_CORRUPTED) {
    309             maybeLogKeyIntegrityViolation(filename, type);
    310         }
    311     });
    312 
    313     rc = keyBlob->readBlob(filename, userState->getEncryptionKey(), userState->getState());
    314     if (rc != ResponseCode::NO_ERROR) {
    315         return rc;
    316     }
    317 
    318     const uint8_t version = keyBlob->getVersion();
    319     if (version < CURRENT_BLOB_VERSION) {
    320         /* If we upgrade the key, we need to write it to disk again. Then
    321          * it must be read it again since the blob is encrypted each time
    322          * it's written.
    323          */
    324         if (upgradeBlob(filename, keyBlob, version, type, userId)) {
    325             if ((rc = this->put(filename, keyBlob, userId)) != ResponseCode::NO_ERROR ||
    326                 (rc = keyBlob->readBlob(filename, userState->getEncryptionKey(),
    327                                         userState->getState())) != ResponseCode::NO_ERROR) {
    328                 return rc;
    329             }
    330         }
    331     }
    332 
    333     /*
    334      * This will upgrade software-backed keys to hardware-backed keys.
    335      */
    336     if (rc == ResponseCode::NO_ERROR && type == TYPE_KEY_PAIR && keyBlob->isFallback()) {
    337         ResponseCode imported =
    338             importKey(keyBlob->getValue(), keyBlob->getLength(), filename, userId,
    339                       keyBlob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
    340 
    341         // The HAL allowed the import, reget the key to have the "fresh" version.
    342         if (imported == ResponseCode::NO_ERROR) {
    343             rc = get(filename, keyBlob, TYPE_KEY_PAIR, userId);
    344         }
    345     }
    346 
    347     // Keymaster 0.3 keys are valid keymaster 1.0 keys, so silently upgrade.
    348     if (keyBlob->getType() == TYPE_KEY_PAIR) {
    349         keyBlob->setType(TYPE_KEYMASTER_10);
    350         rc = this->put(filename, keyBlob, userId);
    351     }
    352 
    353     if (type != TYPE_ANY && keyBlob->getType() != type) {
    354         ALOGW("key found but type doesn't match: %d vs %d", keyBlob->getType(), type);
    355         return ResponseCode::KEY_NOT_FOUND;
    356     }
    357 
    358     return rc;
    359 }
    360 
    361 ResponseCode KeyStore::put(const char* filename, Blob* keyBlob, uid_t userId) {
    362     UserState* userState = getUserState(userId);
    363     return keyBlob->writeBlob(filename, userState->getEncryptionKey(), userState->getState(),
    364                               mEntropy);
    365 }
    366 
    367 static NullOr<std::tuple<uid_t, std::string>> filename2UidAlias(const std::string& filename);
    368 
    369 ResponseCode KeyStore::del(const char* filename, const BlobType type, uid_t userId) {
    370     Blob keyBlob;
    371     auto uidAlias = filename2UidAlias(filename);
    372     uid_t uid;
    373     std::string alias;
    374     if (uidAlias.isOk()) {
    375         std::tie(uid, alias) = std::move(uidAlias).value();
    376     }
    377     ResponseCode rc = get(filename, &keyBlob, type, userId);
    378     if (rc == ResponseCode::VALUE_CORRUPTED) {
    379         // The file is corrupt, the best we can do is rm it.
    380         if (uidAlias.isOk()) {
    381             // remove possible grants
    382             mGrants.removeAllGrantsToKey(uid, alias);
    383         }
    384         return (unlink(filename) && errno != ENOENT) ? ResponseCode::SYSTEM_ERROR
    385                                                      : ResponseCode::NO_ERROR;
    386     }
    387     if (rc != ResponseCode::NO_ERROR) {
    388         return rc;
    389     }
    390 
    391     auto dev = getDevice(keyBlob);
    392 
    393     if (keyBlob.getType() == ::TYPE_KEY_PAIR || keyBlob.getType() == ::TYPE_KEYMASTER_10) {
    394         auto ret = KS_HANDLE_HIDL_ERROR(dev->deleteKey(blob2hidlVec(keyBlob)));
    395 
    396         // A device doesn't have to implement delete_key.
    397         bool success = ret == ErrorCode::OK || ret == ErrorCode::UNIMPLEMENTED;
    398         if (__android_log_security() && uidAlias.isOk()) {
    399             android_log_event_list(SEC_TAG_KEY_DESTROYED)
    400                 << int32_t(success) << alias << int32_t(uid) << LOG_ID_SECURITY;
    401         }
    402         if (!success) return ResponseCode::SYSTEM_ERROR;
    403     }
    404 
    405     rc =
    406         (unlink(filename) && errno != ENOENT) ? ResponseCode::SYSTEM_ERROR : ResponseCode::NO_ERROR;
    407 
    408     if (rc == ResponseCode::NO_ERROR && keyBlob.getType() != ::TYPE_KEY_CHARACTERISTICS) {
    409         // now that we have successfully deleted a key, let's make sure there are no stale grants
    410         if (uidAlias.isOk()) {
    411             mGrants.removeAllGrantsToKey(uid, alias);
    412         }
    413     }
    414     return rc;
    415 }
    416 
    417 /*
    418  * Converts from the "escaped" format on disk to actual name.
    419  * This will be smaller than the input string.
    420  *
    421  * Characters that should combine with the next at the end will be truncated.
    422  */
    423 static size_t decode_key_length(const char* in, size_t length) {
    424     size_t outLength = 0;
    425 
    426     for (const char* end = in + length; in < end; in++) {
    427         /* This combines with the next character. */
    428         if (*in < '0' || *in > '~') {
    429             continue;
    430         }
    431 
    432         outLength++;
    433     }
    434     return outLength;
    435 }
    436 
    437 static void decode_key(char* out, const char* in, size_t length) {
    438     for (const char* end = in + length; in < end; in++) {
    439         if (*in < '0' || *in > '~') {
    440             /* Truncate combining characters at the end. */
    441             if (in + 1 >= end) {
    442                 break;
    443             }
    444 
    445             *out = (*in++ - '+') << 6;
    446             *out++ |= (*in - '0') & 0x3F;
    447         } else {
    448             *out++ = *in;
    449         }
    450     }
    451     *out = '\0';
    452 }
    453 
    454 static NullOr<std::tuple<uid_t, std::string>> filename2UidAlias(const std::string& filepath) {
    455     auto filenamebase = filepath.find_last_of('/');
    456     std::string filename =
    457         filenamebase == std::string::npos ? filepath : filepath.substr(filenamebase + 1);
    458 
    459     if (filename[0] == '.') return {};
    460 
    461     auto sep = filename.find('_');
    462     if (sep == std::string::npos) return {};
    463 
    464     std::stringstream s(filename.substr(0, sep));
    465     uid_t uid;
    466     s >> uid;
    467     if (!s) return {};
    468 
    469     auto alias = filename.substr(sep + 1);
    470 
    471     std::vector<char> alias_buffer(decode_key_length(alias.c_str(), alias.size()) + 1);
    472 
    473     decode_key(alias_buffer.data(), alias.c_str(), alias.size());
    474     return std::tuple<uid_t, std::string>(uid, alias_buffer.data());
    475 }
    476 
    477 ResponseCode KeyStore::list(const android::String8& prefix,
    478                             android::Vector<android::String16>* matches, uid_t userId) {
    479 
    480     UserState* userState = getUserState(userId);
    481     size_t n = prefix.length();
    482 
    483     DIR* dir = opendir(userState->getUserDirName());
    484     if (!dir) {
    485         ALOGW("can't open directory for user: %s", strerror(errno));
    486         return ResponseCode::SYSTEM_ERROR;
    487     }
    488 
    489     struct dirent* file;
    490     while ((file = readdir(dir)) != NULL) {
    491         // We only care about files.
    492         if (file->d_type != DT_REG) {
    493             continue;
    494         }
    495 
    496         // Skip anything that starts with a "."
    497         if (file->d_name[0] == '.') {
    498             continue;
    499         }
    500 
    501         if (!strncmp(prefix.string(), file->d_name, n)) {
    502             const char* p = &file->d_name[n];
    503             size_t plen = strlen(p);
    504 
    505             size_t extra = decode_key_length(p, plen);
    506             char* match = (char*)malloc(extra + 1);
    507             if (match != NULL) {
    508                 decode_key(match, p, plen);
    509                 matches->push(android::String16(match, extra));
    510                 free(match);
    511             } else {
    512                 ALOGW("could not allocate match of size %zd", extra);
    513             }
    514         }
    515     }
    516     closedir(dir);
    517     return ResponseCode::NO_ERROR;
    518 }
    519 
    520 std::string KeyStore::addGrant(const char* alias, uid_t granterUid, uid_t granteeUid) {
    521     return mGrants.put(granteeUid, alias, getUserStateByUid(granterUid)->getUserDirName(),
    522                        granterUid);
    523 }
    524 
    525 bool KeyStore::removeGrant(const char* alias, const uid_t granterUid, const uid_t granteeUid) {
    526     return mGrants.removeByFileAlias(granteeUid, granterUid, alias);
    527 }
    528 void KeyStore::removeAllGrantsToUid(const uid_t granteeUid) {
    529     mGrants.removeAllGrantsToUid(granteeUid);
    530 }
    531 
    532 ResponseCode KeyStore::importKey(const uint8_t* key, size_t keyLen, const char* filename,
    533                                  uid_t userId, int32_t flags) {
    534     Unique_PKCS8_PRIV_KEY_INFO pkcs8(d2i_PKCS8_PRIV_KEY_INFO(NULL, &key, keyLen));
    535     if (!pkcs8.get()) {
    536         return ResponseCode::SYSTEM_ERROR;
    537     }
    538     Unique_EVP_PKEY pkey(EVP_PKCS82PKEY(pkcs8.get()));
    539     if (!pkey.get()) {
    540         return ResponseCode::SYSTEM_ERROR;
    541     }
    542     int type = EVP_PKEY_type(pkey->type);
    543     AuthorizationSet params;
    544     add_legacy_key_authorizations(type, &params);
    545     switch (type) {
    546     case EVP_PKEY_RSA:
    547         params.push_back(TAG_ALGORITHM, Algorithm::RSA);
    548         break;
    549     case EVP_PKEY_EC:
    550         params.push_back(TAG_ALGORITHM, Algorithm::EC);
    551         break;
    552     default:
    553         ALOGW("Unsupported key type %d", type);
    554         return ResponseCode::SYSTEM_ERROR;
    555     }
    556 
    557     AuthorizationSet opParams(params);
    558     hidl_vec<uint8_t> blob;
    559 
    560     ErrorCode error;
    561     auto hidlCb = [&](ErrorCode ret, const hidl_vec<uint8_t>& keyBlob,
    562                       const KeyCharacteristics& /* ignored */) {
    563         error = ret;
    564         if (error != ErrorCode::OK) return;
    565         blob = keyBlob;
    566     };
    567     auto input = blob2hidlVec(key, keyLen);
    568 
    569     SecurityLevel securityLevel = flagsToSecurityLevel(flags);
    570     auto kmDevice = getDevice(securityLevel);
    571     if (!kmDevice) {
    572         // As of this writing the only caller is KeyStore::get in an attempt to import legacy
    573         // software keys. It only ever requests TEE as target which must always be present.
    574         // If we see this error, we probably have a new and unanticipated caller.
    575         ALOGE("No implementation for security level %d. Cannot import key.", securityLevel);
    576         return ResponseCode::SYSTEM_ERROR;
    577     }
    578 
    579     ErrorCode rc = KS_HANDLE_HIDL_ERROR(
    580         kmDevice->importKey(params.hidl_data(), KeyFormat::PKCS8, input, hidlCb));
    581     if (rc != ErrorCode::OK) return ResponseCode::SYSTEM_ERROR;
    582     if (error != ErrorCode::OK) {
    583         ALOGE("Keymaster error %d importing key pair", error);
    584         return ResponseCode::SYSTEM_ERROR;
    585     }
    586 
    587     Blob keyBlob(&blob[0], blob.size(), NULL, 0, TYPE_KEYMASTER_10);
    588 
    589     keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
    590     keyBlob.setSecurityLevel(securityLevel);
    591 
    592     return put(filename, &keyBlob, userId);
    593 }
    594 
    595 bool KeyStore::isHardwareBacked(const android::String16& keyType) const {
    596     // if strongbox device is present TEE must also be present and of sufficiently high version
    597     // to support all keys in hardware
    598     if (getDevice(SecurityLevel::STRONGBOX)) return true;
    599     if (!getDevice(SecurityLevel::TRUSTED_ENVIRONMENT)) {
    600         ALOGW("can't get keymaster device");
    601         return false;
    602     }
    603 
    604     auto version = getDevice(SecurityLevel::TRUSTED_ENVIRONMENT)->halVersion();
    605     if (keyType == kRsaKeyType) return true;  // All versions support RSA
    606     return keyType == kEcKeyType && version.supportsEc;
    607 }
    608 
    609 ResponseCode KeyStore::getKeyForName(Blob* keyBlob, const android::String8& keyName,
    610                                      const uid_t uid, const BlobType type) {
    611     auto filepath8 = getBlobFileNameIfExists(keyName, uid, type);
    612     uid_t userId = get_user_id(uid);
    613 
    614     if (filepath8.isOk()) return get(filepath8.value().string(), keyBlob, type, userId);
    615 
    616     return ResponseCode::KEY_NOT_FOUND;
    617 }
    618 
    619 UserState* KeyStore::getUserState(uid_t userId) {
    620     for (android::Vector<UserState*>::iterator it(mMasterKeys.begin()); it != mMasterKeys.end();
    621          it++) {
    622         UserState* state = *it;
    623         if (state->getUserId() == userId) {
    624             return state;
    625         }
    626     }
    627 
    628     UserState* userState = new UserState(userId);
    629     if (!userState->initialize()) {
    630         /* There's not much we can do if initialization fails. Trying to
    631          * unlock the keystore for that user will fail as well, so any
    632          * subsequent request for this user will just return SYSTEM_ERROR.
    633          */
    634         ALOGE("User initialization failed for %u; subsuquent operations will fail", userId);
    635     }
    636     mMasterKeys.add(userState);
    637     return userState;
    638 }
    639 
    640 UserState* KeyStore::getUserStateByUid(uid_t uid) {
    641     uid_t userId = get_user_id(uid);
    642     return getUserState(userId);
    643 }
    644 
    645 const UserState* KeyStore::getUserState(uid_t userId) const {
    646     for (android::Vector<UserState*>::const_iterator it(mMasterKeys.begin());
    647          it != mMasterKeys.end(); it++) {
    648         UserState* state = *it;
    649         if (state->getUserId() == userId) {
    650             return state;
    651         }
    652     }
    653 
    654     return NULL;
    655 }
    656 
    657 const UserState* KeyStore::getUserStateByUid(uid_t uid) const {
    658     uid_t userId = get_user_id(uid);
    659     return getUserState(userId);
    660 }
    661 
    662 bool KeyStore::upgradeBlob(const char* filename, Blob* blob, const uint8_t oldVersion,
    663                            const BlobType type, uid_t userId) {
    664     bool updated = false;
    665     uint8_t version = oldVersion;
    666 
    667     /* From V0 -> V1: All old types were unknown */
    668     if (version == 0) {
    669         ALOGV("upgrading to version 1 and setting type %d", type);
    670 
    671         blob->setType(type);
    672         if (type == TYPE_KEY_PAIR) {
    673             importBlobAsKey(blob, filename, userId);
    674         }
    675         version = 1;
    676         updated = true;
    677     }
    678 
    679     /* From V1 -> V2: All old keys were encrypted */
    680     if (version == 1) {
    681         ALOGV("upgrading to version 2");
    682 
    683         blob->setEncrypted(true);
    684         version = 2;
    685         updated = true;
    686     }
    687 
    688     /*
    689      * If we've updated, set the key blob to the right version
    690      * and write it.
    691      */
    692     if (updated) {
    693         ALOGV("updated and writing file %s", filename);
    694         blob->setVersion(version);
    695     }
    696 
    697     return updated;
    698 }
    699 
    700 struct BIO_Delete {
    701     void operator()(BIO* p) const { BIO_free(p); }
    702 };
    703 typedef std::unique_ptr<BIO, BIO_Delete> Unique_BIO;
    704 
    705 ResponseCode KeyStore::importBlobAsKey(Blob* blob, const char* filename, uid_t userId) {
    706     // We won't even write to the blob directly with this BIO, so const_cast is okay.
    707     Unique_BIO b(BIO_new_mem_buf(const_cast<uint8_t*>(blob->getValue()), blob->getLength()));
    708     if (b.get() == NULL) {
    709         ALOGE("Problem instantiating BIO");
    710         return ResponseCode::SYSTEM_ERROR;
    711     }
    712 
    713     Unique_EVP_PKEY pkey(PEM_read_bio_PrivateKey(b.get(), NULL, NULL, NULL));
    714     if (pkey.get() == NULL) {
    715         ALOGE("Couldn't read old PEM file");
    716         return ResponseCode::SYSTEM_ERROR;
    717     }
    718 
    719     Unique_PKCS8_PRIV_KEY_INFO pkcs8(EVP_PKEY2PKCS8(pkey.get()));
    720     int len = i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), NULL);
    721     if (len < 0) {
    722         ALOGE("Couldn't measure PKCS#8 length");
    723         return ResponseCode::SYSTEM_ERROR;
    724     }
    725 
    726     std::unique_ptr<unsigned char[]> pkcs8key(new unsigned char[len]);
    727     uint8_t* tmp = pkcs8key.get();
    728     if (i2d_PKCS8_PRIV_KEY_INFO(pkcs8.get(), &tmp) != len) {
    729         ALOGE("Couldn't convert to PKCS#8");
    730         return ResponseCode::SYSTEM_ERROR;
    731     }
    732 
    733     ResponseCode rc = importKey(pkcs8key.get(), len, filename, userId,
    734                                 blob->isEncrypted() ? KEYSTORE_FLAG_ENCRYPTED : KEYSTORE_FLAG_NONE);
    735     if (rc != ResponseCode::NO_ERROR) {
    736         return rc;
    737     }
    738 
    739     return get(filename, blob, TYPE_KEY_PAIR, userId);
    740 }
    741 
    742 void KeyStore::readMetaData() {
    743     int in = TEMP_FAILURE_RETRY(open(kMetaDataFile, O_RDONLY));
    744     if (in < 0) {
    745         return;
    746     }
    747     size_t fileLength = readFully(in, (uint8_t*)&mMetaData, sizeof(mMetaData));
    748     if (fileLength != sizeof(mMetaData)) {
    749         ALOGI("Metadata file is %zd bytes (%zd experted); upgrade?", fileLength, sizeof(mMetaData));
    750     }
    751     close(in);
    752 }
    753 
    754 void KeyStore::writeMetaData() {
    755     const char* tmpFileName = ".metadata.tmp";
    756     int out =
    757         TEMP_FAILURE_RETRY(open(tmpFileName, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR));
    758     if (out < 0) {
    759         ALOGE("couldn't write metadata file: %s", strerror(errno));
    760         return;
    761     }
    762     size_t fileLength = writeFully(out, (uint8_t*)&mMetaData, sizeof(mMetaData));
    763     if (fileLength != sizeof(mMetaData)) {
    764         ALOGI("Could only write %zd bytes to metadata file (%zd expected)", fileLength,
    765               sizeof(mMetaData));
    766     }
    767     close(out);
    768     rename(tmpFileName, kMetaDataFile);
    769 }
    770 
    771 bool KeyStore::upgradeKeystore() {
    772     bool upgraded = false;
    773 
    774     if (mMetaData.version == 0) {
    775         UserState* userState = getUserStateByUid(0);
    776 
    777         // Initialize first so the directory is made.
    778         userState->initialize();
    779 
    780         // Migrate the old .masterkey file to user 0.
    781         if (access(kOldMasterKey, R_OK) == 0) {
    782             if (rename(kOldMasterKey, userState->getMasterKeyFileName()) < 0) {
    783                 ALOGE("couldn't migrate old masterkey: %s", strerror(errno));
    784                 return false;
    785             }
    786         }
    787 
    788         // Initialize again in case we had a key.
    789         userState->initialize();
    790 
    791         // Try to migrate existing keys.
    792         DIR* dir = opendir(".");
    793         if (!dir) {
    794             // Give up now; maybe we can upgrade later.
    795             ALOGE("couldn't open keystore's directory; something is wrong");
    796             return false;
    797         }
    798 
    799         struct dirent* file;
    800         while ((file = readdir(dir)) != NULL) {
    801             // We only care about files.
    802             if (file->d_type != DT_REG) {
    803                 continue;
    804             }
    805 
    806             // Skip anything that starts with a "."
    807             if (file->d_name[0] == '.') {
    808                 continue;
    809             }
    810 
    811             // Find the current file's user.
    812             char* end;
    813             unsigned long thisUid = strtoul(file->d_name, &end, 10);
    814             if (end[0] != '_' || end[1] == 0) {
    815                 continue;
    816             }
    817             UserState* otherUser = getUserStateByUid(thisUid);
    818             if (otherUser->getUserId() != 0) {
    819                 unlinkat(dirfd(dir), file->d_name, 0);
    820             }
    821 
    822             // Rename the file into user directory.
    823             DIR* otherdir = opendir(otherUser->getUserDirName());
    824             if (otherdir == NULL) {
    825                 ALOGW("couldn't open user directory for rename");
    826                 continue;
    827             }
    828             if (renameat(dirfd(dir), file->d_name, dirfd(otherdir), file->d_name) < 0) {
    829                 ALOGW("couldn't rename blob: %s: %s", file->d_name, strerror(errno));
    830             }
    831             closedir(otherdir);
    832         }
    833         closedir(dir);
    834 
    835         mMetaData.version = 1;
    836         upgraded = true;
    837     }
    838 
    839     return upgraded;
    840 }
    841 
    842 static void maybeLogKeyIntegrityViolation(const char* filename, const BlobType type) {
    843     if (!__android_log_security() || (type != TYPE_KEY_PAIR && type != TYPE_KEYMASTER_10)) return;
    844 
    845     auto uidAlias = filename2UidAlias(filename);
    846     uid_t uid = -1;
    847     std::string alias;
    848 
    849     if (uidAlias.isOk()) std::tie(uid, alias) = std::move(uidAlias).value();
    850 
    851     log_key_integrity_violation(alias.c_str(), uid);
    852 }
    853 
    854 }  // namespace keystore
    855