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 "key_store_service.h"
     20 
     21 #include <fcntl.h>
     22 #include <sys/stat.h>
     23 
     24 #include <algorithm>
     25 #include <sstream>
     26 
     27 #include <binder/IInterface.h>
     28 #include <binder/IPCThreadState.h>
     29 #include <binder/IPermissionController.h>
     30 #include <binder/IServiceManager.h>
     31 
     32 #include <private/android_filesystem_config.h>
     33 
     34 #include <android/hardware/keymaster/3.0/IHwKeymasterDevice.h>
     35 
     36 #include "defaults.h"
     37 #include "keystore_attestation_id.h"
     38 #include "keystore_keymaster_enforcement.h"
     39 #include "keystore_utils.h"
     40 #include <keystore/keystore_hidl_support.h>
     41 
     42 namespace keystore {
     43 
     44 using namespace android;
     45 
     46 namespace {
     47 
     48 constexpr size_t kMaxOperations = 15;
     49 constexpr double kIdRotationPeriod = 30 * 24 * 60 * 60; /* Thirty days, in seconds */
     50 const char* kTimestampFilePath = "timestamp";
     51 
     52 struct BIGNUM_Delete {
     53     void operator()(BIGNUM* p) const { BN_free(p); }
     54 };
     55 typedef UniquePtr<BIGNUM, BIGNUM_Delete> Unique_BIGNUM;
     56 
     57 bool containsTag(const hidl_vec<KeyParameter>& params, Tag tag) {
     58     return params.end() != std::find_if(params.begin(), params.end(),
     59                                         [&](auto& param) { return param.tag == tag; });
     60 }
     61 
     62 bool isAuthenticationBound(const hidl_vec<KeyParameter>& params) {
     63     return !containsTag(params, Tag::NO_AUTH_REQUIRED);
     64 }
     65 
     66 std::pair<KeyStoreServiceReturnCode, bool> hadFactoryResetSinceIdRotation() {
     67     struct stat sbuf;
     68     if (stat(kTimestampFilePath, &sbuf) == 0) {
     69         double diff_secs = difftime(time(NULL), sbuf.st_ctime);
     70         return {ResponseCode::NO_ERROR, diff_secs < kIdRotationPeriod};
     71     }
     72 
     73     if (errno != ENOENT) {
     74         ALOGE("Failed to stat \"timestamp\" file, with error %d", errno);
     75         return {ResponseCode::SYSTEM_ERROR, false /* don't care */};
     76     }
     77 
     78     int fd = creat(kTimestampFilePath, 0600);
     79     if (fd < 0) {
     80         ALOGE("Couldn't create \"timestamp\" file, with error %d", errno);
     81         return {ResponseCode::SYSTEM_ERROR, false /* don't care */};
     82     }
     83 
     84     if (close(fd)) {
     85         ALOGE("Couldn't close \"timestamp\" file, with error %d", errno);
     86         return {ResponseCode::SYSTEM_ERROR, false /* don't care */};
     87     }
     88 
     89     return {ResponseCode::NO_ERROR, true};
     90 }
     91 
     92 constexpr size_t KEY_ATTESTATION_APPLICATION_ID_MAX_SIZE = 1024;
     93 
     94 KeyStoreServiceReturnCode updateParamsForAttestation(uid_t callingUid, AuthorizationSet* params) {
     95     KeyStoreServiceReturnCode responseCode;
     96     bool factoryResetSinceIdRotation;
     97     std::tie(responseCode, factoryResetSinceIdRotation) = hadFactoryResetSinceIdRotation();
     98 
     99     if (!responseCode.isOk()) return responseCode;
    100     if (factoryResetSinceIdRotation) params->push_back(TAG_RESET_SINCE_ID_ROTATION);
    101 
    102     auto asn1_attestation_id_result = security::gather_attestation_application_id(callingUid);
    103     if (!asn1_attestation_id_result.isOk()) {
    104         ALOGE("failed to gather attestation_id");
    105         return ErrorCode::ATTESTATION_APPLICATION_ID_MISSING;
    106     }
    107     std::vector<uint8_t>& asn1_attestation_id = asn1_attestation_id_result;
    108 
    109     /*
    110      * The attestation application ID cannot be longer than
    111      * KEY_ATTESTATION_APPLICATION_ID_MAX_SIZE, so we truncate if too long.
    112      */
    113     if (asn1_attestation_id.size() > KEY_ATTESTATION_APPLICATION_ID_MAX_SIZE) {
    114         asn1_attestation_id.resize(KEY_ATTESTATION_APPLICATION_ID_MAX_SIZE);
    115     }
    116 
    117     params->push_back(TAG_ATTESTATION_APPLICATION_ID, asn1_attestation_id);
    118 
    119     return ResponseCode::NO_ERROR;
    120 }
    121 
    122 }  // anonymous namespace
    123 
    124 void KeyStoreService::binderDied(const wp<IBinder>& who) {
    125     auto operations = mOperationMap.getOperationsForToken(who.unsafe_get());
    126     for (const auto& token : operations) {
    127         abort(token);
    128     }
    129 }
    130 
    131 KeyStoreServiceReturnCode KeyStoreService::getState(int32_t userId) {
    132     if (!checkBinderPermission(P_GET_STATE)) {
    133         return ResponseCode::PERMISSION_DENIED;
    134     }
    135 
    136     return ResponseCode(mKeyStore->getState(userId));
    137 }
    138 
    139 KeyStoreServiceReturnCode KeyStoreService::get(const String16& name, int32_t uid,
    140                                                hidl_vec<uint8_t>* item) {
    141     uid_t targetUid = getEffectiveUid(uid);
    142     if (!checkBinderPermission(P_GET, targetUid)) {
    143         return ResponseCode::PERMISSION_DENIED;
    144     }
    145 
    146     String8 name8(name);
    147     Blob keyBlob;
    148 
    149     KeyStoreServiceReturnCode rc =
    150         mKeyStore->getKeyForName(&keyBlob, name8, targetUid, TYPE_GENERIC);
    151     if (!rc.isOk()) {
    152         if (item) *item = hidl_vec<uint8_t>();
    153         return rc;
    154     }
    155 
    156     // Do not replace this with "if (item) *item = blob2hidlVec(keyBlob)"!
    157     // blob2hidlVec creates a hidl_vec<uint8_t> that references, but not owns, the data in keyBlob
    158     // the subsequent assignment (*item = resultBlob) makes a deep copy, so that *item will own the
    159     // corresponding resources.
    160     auto resultBlob = blob2hidlVec(keyBlob);
    161     if (item) {
    162         *item = resultBlob;
    163     }
    164 
    165     return ResponseCode::NO_ERROR;
    166 }
    167 
    168 KeyStoreServiceReturnCode KeyStoreService::insert(const String16& name,
    169                                                   const hidl_vec<uint8_t>& item, int targetUid,
    170                                                   int32_t flags) {
    171     targetUid = getEffectiveUid(targetUid);
    172     auto result =
    173         checkBinderPermissionAndKeystoreState(P_INSERT, targetUid, flags & KEYSTORE_FLAG_ENCRYPTED);
    174     if (!result.isOk()) {
    175         return result;
    176     }
    177 
    178     String8 name8(name);
    179     String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid, ::TYPE_GENERIC));
    180 
    181     Blob keyBlob(&item[0], item.size(), NULL, 0, ::TYPE_GENERIC);
    182     keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
    183 
    184     return mKeyStore->put(filename.string(), &keyBlob, get_user_id(targetUid));
    185 }
    186 
    187 KeyStoreServiceReturnCode KeyStoreService::del(const String16& name, int targetUid) {
    188     targetUid = getEffectiveUid(targetUid);
    189     if (!checkBinderPermission(P_DELETE, targetUid)) {
    190         return ResponseCode::PERMISSION_DENIED;
    191     }
    192     String8 name8(name);
    193     ALOGI("del %s %d", name8.string(), targetUid);
    194     String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid, ::TYPE_ANY));
    195     ResponseCode result = mKeyStore->del(filename.string(), ::TYPE_ANY, get_user_id(targetUid));
    196     if (result != ResponseCode::NO_ERROR) {
    197         return result;
    198     }
    199 
    200     // Also delete any characteristics files
    201     String8 chrFilename(
    202         mKeyStore->getKeyNameForUidWithDir(name8, targetUid, ::TYPE_KEY_CHARACTERISTICS));
    203     return mKeyStore->del(chrFilename.string(), ::TYPE_KEY_CHARACTERISTICS, get_user_id(targetUid));
    204 }
    205 
    206 KeyStoreServiceReturnCode KeyStoreService::exist(const String16& name, int targetUid) {
    207     targetUid = getEffectiveUid(targetUid);
    208     if (!checkBinderPermission(P_EXIST, targetUid)) {
    209         return ResponseCode::PERMISSION_DENIED;
    210     }
    211 
    212     String8 name8(name);
    213     String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid, ::TYPE_ANY));
    214 
    215     if (access(filename.string(), R_OK) == -1) {
    216         return (errno != ENOENT) ? ResponseCode::SYSTEM_ERROR : ResponseCode::KEY_NOT_FOUND;
    217     }
    218     return ResponseCode::NO_ERROR;
    219 }
    220 
    221 KeyStoreServiceReturnCode KeyStoreService::list(const String16& prefix, int targetUid,
    222                                                 Vector<String16>* matches) {
    223     targetUid = getEffectiveUid(targetUid);
    224     if (!checkBinderPermission(P_LIST, targetUid)) {
    225         return ResponseCode::PERMISSION_DENIED;
    226     }
    227     const String8 prefix8(prefix);
    228     String8 filename(mKeyStore->getKeyNameForUid(prefix8, targetUid, TYPE_ANY));
    229 
    230     if (mKeyStore->list(filename, matches, get_user_id(targetUid)) != ResponseCode::NO_ERROR) {
    231         return ResponseCode::SYSTEM_ERROR;
    232     }
    233     return ResponseCode::NO_ERROR;
    234 }
    235 
    236 KeyStoreServiceReturnCode KeyStoreService::reset() {
    237     if (!checkBinderPermission(P_RESET)) {
    238         return ResponseCode::PERMISSION_DENIED;
    239     }
    240 
    241     uid_t callingUid = IPCThreadState::self()->getCallingUid();
    242     mKeyStore->resetUser(get_user_id(callingUid), false);
    243     return ResponseCode::NO_ERROR;
    244 }
    245 
    246 KeyStoreServiceReturnCode KeyStoreService::onUserPasswordChanged(int32_t userId,
    247                                                                  const String16& password) {
    248     if (!checkBinderPermission(P_PASSWORD)) {
    249         return ResponseCode::PERMISSION_DENIED;
    250     }
    251 
    252     const String8 password8(password);
    253     // Flush the auth token table to prevent stale tokens from sticking
    254     // around.
    255     mAuthTokenTable.Clear();
    256 
    257     if (password.size() == 0) {
    258         ALOGI("Secure lockscreen for user %d removed, deleting encrypted entries", userId);
    259         mKeyStore->resetUser(userId, true);
    260         return ResponseCode::NO_ERROR;
    261     } else {
    262         switch (mKeyStore->getState(userId)) {
    263         case ::STATE_UNINITIALIZED: {
    264             // generate master key, encrypt with password, write to file,
    265             // initialize mMasterKey*.
    266             return mKeyStore->initializeUser(password8, userId);
    267         }
    268         case ::STATE_NO_ERROR: {
    269             // rewrite master key with new password.
    270             return mKeyStore->writeMasterKey(password8, userId);
    271         }
    272         case ::STATE_LOCKED: {
    273             ALOGE("Changing user %d's password while locked, clearing old encryption", userId);
    274             mKeyStore->resetUser(userId, true);
    275             return mKeyStore->initializeUser(password8, userId);
    276         }
    277         }
    278         return ResponseCode::SYSTEM_ERROR;
    279     }
    280 }
    281 
    282 KeyStoreServiceReturnCode KeyStoreService::onUserAdded(int32_t userId, int32_t parentId) {
    283     if (!checkBinderPermission(P_USER_CHANGED)) {
    284         return ResponseCode::PERMISSION_DENIED;
    285     }
    286 
    287     // Sanity check that the new user has an empty keystore.
    288     if (!mKeyStore->isEmpty(userId)) {
    289         ALOGW("New user %d's keystore not empty. Clearing old entries.", userId);
    290     }
    291     // Unconditionally clear the keystore, just to be safe.
    292     mKeyStore->resetUser(userId, false);
    293     if (parentId != -1) {
    294         // This profile must share the same master key password as the parent profile. Because the
    295         // password of the parent profile is not known here, the best we can do is copy the parent's
    296         // master key and master key file. This makes this profile use the same master key as the
    297         // parent profile, forever.
    298         return mKeyStore->copyMasterKey(parentId, userId);
    299     } else {
    300         return ResponseCode::NO_ERROR;
    301     }
    302 }
    303 
    304 KeyStoreServiceReturnCode KeyStoreService::onUserRemoved(int32_t userId) {
    305     if (!checkBinderPermission(P_USER_CHANGED)) {
    306         return ResponseCode::PERMISSION_DENIED;
    307     }
    308 
    309     mKeyStore->resetUser(userId, false);
    310     return ResponseCode::NO_ERROR;
    311 }
    312 
    313 KeyStoreServiceReturnCode KeyStoreService::lock(int32_t userId) {
    314     if (!checkBinderPermission(P_LOCK)) {
    315         return ResponseCode::PERMISSION_DENIED;
    316     }
    317 
    318     State state = mKeyStore->getState(userId);
    319     if (state != ::STATE_NO_ERROR) {
    320         ALOGD("calling lock in state: %d", state);
    321         return ResponseCode(state);
    322     }
    323 
    324     mKeyStore->lock(userId);
    325     return ResponseCode::NO_ERROR;
    326 }
    327 
    328 KeyStoreServiceReturnCode KeyStoreService::unlock(int32_t userId, const String16& pw) {
    329     if (!checkBinderPermission(P_UNLOCK)) {
    330         return ResponseCode::PERMISSION_DENIED;
    331     }
    332 
    333     State state = mKeyStore->getState(userId);
    334     if (state != ::STATE_LOCKED) {
    335         switch (state) {
    336         case ::STATE_NO_ERROR:
    337             ALOGI("calling unlock when already unlocked, ignoring.");
    338             break;
    339         case ::STATE_UNINITIALIZED:
    340             ALOGE("unlock called on uninitialized keystore.");
    341             break;
    342         default:
    343             ALOGE("unlock called on keystore in unknown state: %d", state);
    344             break;
    345         }
    346         return ResponseCode(state);
    347     }
    348 
    349     const String8 password8(pw);
    350     // read master key, decrypt with password, initialize mMasterKey*.
    351     return mKeyStore->readMasterKey(password8, userId);
    352 }
    353 
    354 bool KeyStoreService::isEmpty(int32_t userId) {
    355     if (!checkBinderPermission(P_IS_EMPTY)) {
    356         return false;
    357     }
    358 
    359     return mKeyStore->isEmpty(userId);
    360 }
    361 
    362 KeyStoreServiceReturnCode KeyStoreService::generate(const String16& name, int32_t targetUid,
    363                                                     int32_t keyType, int32_t keySize, int32_t flags,
    364                                                     Vector<sp<KeystoreArg>>* args) {
    365     targetUid = getEffectiveUid(targetUid);
    366     auto result =
    367         checkBinderPermissionAndKeystoreState(P_INSERT, targetUid, flags & KEYSTORE_FLAG_ENCRYPTED);
    368     if (!result.isOk()) {
    369         return result;
    370     }
    371 
    372     keystore::AuthorizationSet params;
    373     add_legacy_key_authorizations(keyType, &params);
    374 
    375     switch (keyType) {
    376     case EVP_PKEY_EC: {
    377         params.push_back(TAG_ALGORITHM, Algorithm::EC);
    378         if (keySize == -1) {
    379             keySize = EC_DEFAULT_KEY_SIZE;
    380         } else if (keySize < EC_MIN_KEY_SIZE || keySize > EC_MAX_KEY_SIZE) {
    381             ALOGI("invalid key size %d", keySize);
    382             return ResponseCode::SYSTEM_ERROR;
    383         }
    384         params.push_back(TAG_KEY_SIZE, keySize);
    385         break;
    386     }
    387     case EVP_PKEY_RSA: {
    388         params.push_back(TAG_ALGORITHM, Algorithm::RSA);
    389         if (keySize == -1) {
    390             keySize = RSA_DEFAULT_KEY_SIZE;
    391         } else if (keySize < RSA_MIN_KEY_SIZE || keySize > RSA_MAX_KEY_SIZE) {
    392             ALOGI("invalid key size %d", keySize);
    393             return ResponseCode::SYSTEM_ERROR;
    394         }
    395         params.push_back(TAG_KEY_SIZE, keySize);
    396         unsigned long exponent = RSA_DEFAULT_EXPONENT;
    397         if (args->size() > 1) {
    398             ALOGI("invalid number of arguments: %zu", args->size());
    399             return ResponseCode::SYSTEM_ERROR;
    400         } else if (args->size() == 1) {
    401             const sp<KeystoreArg>& expArg = args->itemAt(0);
    402             if (expArg != NULL) {
    403                 Unique_BIGNUM pubExpBn(BN_bin2bn(
    404                     reinterpret_cast<const unsigned char*>(expArg->data()), expArg->size(), NULL));
    405                 if (pubExpBn.get() == NULL) {
    406                     ALOGI("Could not convert public exponent to BN");
    407                     return ResponseCode::SYSTEM_ERROR;
    408                 }
    409                 exponent = BN_get_word(pubExpBn.get());
    410                 if (exponent == 0xFFFFFFFFL) {
    411                     ALOGW("cannot represent public exponent as a long value");
    412                     return ResponseCode::SYSTEM_ERROR;
    413                 }
    414             } else {
    415                 ALOGW("public exponent not read");
    416                 return ResponseCode::SYSTEM_ERROR;
    417             }
    418         }
    419         params.push_back(TAG_RSA_PUBLIC_EXPONENT, exponent);
    420         break;
    421     }
    422     default: {
    423         ALOGW("Unsupported key type %d", keyType);
    424         return ResponseCode::SYSTEM_ERROR;
    425     }
    426     }
    427 
    428     auto rc = generateKey(name, params.hidl_data(), hidl_vec<uint8_t>(), targetUid, flags,
    429                           /*outCharacteristics*/ NULL);
    430     if (!rc.isOk()) {
    431         ALOGW("generate failed: %d", int32_t(rc));
    432     }
    433     return translateResultToLegacyResult(rc);
    434 }
    435 
    436 KeyStoreServiceReturnCode KeyStoreService::import(const String16& name,
    437                                                   const hidl_vec<uint8_t>& data, int targetUid,
    438                                                   int32_t flags) {
    439 
    440     const uint8_t* ptr = &data[0];
    441 
    442     Unique_PKCS8_PRIV_KEY_INFO pkcs8(d2i_PKCS8_PRIV_KEY_INFO(NULL, &ptr, data.size()));
    443     if (!pkcs8.get()) {
    444         return ResponseCode::SYSTEM_ERROR;
    445     }
    446     Unique_EVP_PKEY pkey(EVP_PKCS82PKEY(pkcs8.get()));
    447     if (!pkey.get()) {
    448         return ResponseCode::SYSTEM_ERROR;
    449     }
    450     int type = EVP_PKEY_type(pkey->type);
    451     AuthorizationSet params;
    452     add_legacy_key_authorizations(type, &params);
    453     switch (type) {
    454     case EVP_PKEY_RSA:
    455         params.push_back(TAG_ALGORITHM, Algorithm::RSA);
    456         break;
    457     case EVP_PKEY_EC:
    458         params.push_back(TAG_ALGORITHM, Algorithm::EC);
    459         break;
    460     default:
    461         ALOGW("Unsupported key type %d", type);
    462         return ResponseCode::SYSTEM_ERROR;
    463     }
    464 
    465     auto rc = importKey(name, params.hidl_data(), KeyFormat::PKCS8, data, targetUid, flags,
    466                         /*outCharacteristics*/ NULL);
    467 
    468     if (!rc.isOk()) {
    469         ALOGW("importKey failed: %d", int32_t(rc));
    470     }
    471     return translateResultToLegacyResult(rc);
    472 }
    473 
    474 KeyStoreServiceReturnCode KeyStoreService::sign(const String16& name, const hidl_vec<uint8_t>& data,
    475                                                 hidl_vec<uint8_t>* out) {
    476     if (!checkBinderPermission(P_SIGN)) {
    477         return ResponseCode::PERMISSION_DENIED;
    478     }
    479     return doLegacySignVerify(name, data, out, hidl_vec<uint8_t>(), KeyPurpose::SIGN);
    480 }
    481 
    482 KeyStoreServiceReturnCode KeyStoreService::verify(const String16& name,
    483                                                   const hidl_vec<uint8_t>& data,
    484                                                   const hidl_vec<uint8_t>& signature) {
    485     if (!checkBinderPermission(P_VERIFY)) {
    486         return ResponseCode::PERMISSION_DENIED;
    487     }
    488     return doLegacySignVerify(name, data, nullptr, signature, KeyPurpose::VERIFY);
    489 }
    490 
    491 /*
    492  * TODO: The abstraction between things stored in hardware and regular blobs
    493  * of data stored on the filesystem should be moved down to keystore itself.
    494  * Unfortunately the Java code that calls this has naming conventions that it
    495  * knows about. Ideally keystore shouldn't be used to store random blobs of
    496  * data.
    497  *
    498  * Until that happens, it's necessary to have a separate "get_pubkey" and
    499  * "del_key" since the Java code doesn't really communicate what it's
    500  * intentions are.
    501  */
    502 KeyStoreServiceReturnCode KeyStoreService::get_pubkey(const String16& name,
    503                                                       hidl_vec<uint8_t>* pubKey) {
    504     ExportResult result;
    505     exportKey(name, KeyFormat::X509, hidl_vec<uint8_t>(), hidl_vec<uint8_t>(), UID_SELF, &result);
    506     if (!result.resultCode.isOk()) {
    507         ALOGW("export failed: %d", int32_t(result.resultCode));
    508         return translateResultToLegacyResult(result.resultCode);
    509     }
    510 
    511     if (pubKey) *pubKey = std::move(result.exportData);
    512     return ResponseCode::NO_ERROR;
    513 }
    514 
    515 KeyStoreServiceReturnCode KeyStoreService::grant(const String16& name, int32_t granteeUid) {
    516     uid_t callingUid = IPCThreadState::self()->getCallingUid();
    517     auto result = checkBinderPermissionAndKeystoreState(P_GRANT);
    518     if (!result.isOk()) {
    519         return result;
    520     }
    521 
    522     String8 name8(name);
    523     String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid, ::TYPE_ANY));
    524 
    525     if (access(filename.string(), R_OK) == -1) {
    526         return (errno != ENOENT) ? ResponseCode::SYSTEM_ERROR : ResponseCode::KEY_NOT_FOUND;
    527     }
    528 
    529     mKeyStore->addGrant(filename.string(), granteeUid);
    530     return ResponseCode::NO_ERROR;
    531 }
    532 
    533 KeyStoreServiceReturnCode KeyStoreService::ungrant(const String16& name, int32_t granteeUid) {
    534     uid_t callingUid = IPCThreadState::self()->getCallingUid();
    535     auto result = checkBinderPermissionAndKeystoreState(P_GRANT);
    536     if (!result.isOk()) {
    537         return result;
    538     }
    539 
    540     String8 name8(name);
    541     String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, callingUid, ::TYPE_ANY));
    542 
    543     if (access(filename.string(), R_OK) == -1) {
    544         return (errno != ENOENT) ? ResponseCode::SYSTEM_ERROR : ResponseCode::KEY_NOT_FOUND;
    545     }
    546 
    547     return mKeyStore->removeGrant(filename.string(), granteeUid) ? ResponseCode::NO_ERROR
    548                                                                  : ResponseCode::KEY_NOT_FOUND;
    549 }
    550 
    551 int64_t KeyStoreService::getmtime(const String16& name, int32_t uid) {
    552     uid_t targetUid = getEffectiveUid(uid);
    553     if (!checkBinderPermission(P_GET, targetUid)) {
    554         ALOGW("permission denied for %d: getmtime", targetUid);
    555         return -1L;
    556     }
    557 
    558     String8 name8(name);
    559     String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid, ::TYPE_ANY));
    560 
    561     if (access(filename.string(), R_OK) == -1) {
    562         ALOGW("could not access %s for getmtime", filename.string());
    563         return -1L;
    564     }
    565 
    566     int fd = TEMP_FAILURE_RETRY(open(filename.string(), O_NOFOLLOW, O_RDONLY));
    567     if (fd < 0) {
    568         ALOGW("could not open %s for getmtime", filename.string());
    569         return -1L;
    570     }
    571 
    572     struct stat s;
    573     int ret = fstat(fd, &s);
    574     close(fd);
    575     if (ret == -1) {
    576         ALOGW("could not stat %s for getmtime", filename.string());
    577         return -1L;
    578     }
    579 
    580     return static_cast<int64_t>(s.st_mtime);
    581 }
    582 
    583 // TODO(tuckeris): This is dead code, remove it.  Don't bother copying over key characteristics here
    584 KeyStoreServiceReturnCode KeyStoreService::duplicate(const String16& srcKey, int32_t srcUid,
    585                                                      const String16& destKey, int32_t destUid) {
    586     uid_t callingUid = IPCThreadState::self()->getCallingUid();
    587     pid_t spid = IPCThreadState::self()->getCallingPid();
    588     if (!has_permission(callingUid, P_DUPLICATE, spid)) {
    589         ALOGW("permission denied for %d: duplicate", callingUid);
    590         return ResponseCode::PERMISSION_DENIED;
    591     }
    592 
    593     State state = mKeyStore->getState(get_user_id(callingUid));
    594     if (!isKeystoreUnlocked(state)) {
    595         ALOGD("calling duplicate in state: %d", state);
    596         return ResponseCode(state);
    597     }
    598 
    599     if (srcUid == -1 || static_cast<uid_t>(srcUid) == callingUid) {
    600         srcUid = callingUid;
    601     } else if (!is_granted_to(callingUid, srcUid)) {
    602         ALOGD("migrate not granted from source: %d -> %d", callingUid, srcUid);
    603         return ResponseCode::PERMISSION_DENIED;
    604     }
    605 
    606     if (destUid == -1) {
    607         destUid = callingUid;
    608     }
    609 
    610     if (srcUid != destUid) {
    611         if (static_cast<uid_t>(srcUid) != callingUid) {
    612             ALOGD("can only duplicate from caller to other or to same uid: "
    613                   "calling=%d, srcUid=%d, destUid=%d",
    614                   callingUid, srcUid, destUid);
    615             return ResponseCode::PERMISSION_DENIED;
    616         }
    617 
    618         if (!is_granted_to(callingUid, destUid)) {
    619             ALOGD("duplicate not granted to dest: %d -> %d", callingUid, destUid);
    620             return ResponseCode::PERMISSION_DENIED;
    621         }
    622     }
    623 
    624     String8 source8(srcKey);
    625     String8 sourceFile(mKeyStore->getKeyNameForUidWithDir(source8, srcUid, ::TYPE_ANY));
    626 
    627     String8 target8(destKey);
    628     String8 targetFile(mKeyStore->getKeyNameForUidWithDir(target8, destUid, ::TYPE_ANY));
    629 
    630     if (access(targetFile.string(), W_OK) != -1 || errno != ENOENT) {
    631         ALOGD("destination already exists: %s", targetFile.string());
    632         return ResponseCode::SYSTEM_ERROR;
    633     }
    634 
    635     Blob keyBlob;
    636     ResponseCode responseCode =
    637         mKeyStore->get(sourceFile.string(), &keyBlob, TYPE_ANY, get_user_id(srcUid));
    638     if (responseCode != ResponseCode::NO_ERROR) {
    639         return responseCode;
    640     }
    641 
    642     return mKeyStore->put(targetFile.string(), &keyBlob, get_user_id(destUid));
    643 }
    644 
    645 int32_t KeyStoreService::is_hardware_backed(const String16& keyType) {
    646     return mKeyStore->isHardwareBacked(keyType) ? 1 : 0;
    647 }
    648 
    649 KeyStoreServiceReturnCode KeyStoreService::clear_uid(int64_t targetUid64) {
    650     uid_t targetUid = getEffectiveUid(targetUid64);
    651     if (!checkBinderPermissionSelfOrSystem(P_CLEAR_UID, targetUid)) {
    652         return ResponseCode::PERMISSION_DENIED;
    653     }
    654     ALOGI("clear_uid %" PRId64, targetUid64);
    655 
    656     String8 prefix = String8::format("%u_", targetUid);
    657     Vector<String16> aliases;
    658     if (mKeyStore->list(prefix, &aliases, get_user_id(targetUid)) != ResponseCode::NO_ERROR) {
    659         return ResponseCode::SYSTEM_ERROR;
    660     }
    661 
    662     for (uint32_t i = 0; i < aliases.size(); i++) {
    663         String8 name8(aliases[i]);
    664         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, targetUid, ::TYPE_ANY));
    665 
    666         if (get_app_id(targetUid) == AID_SYSTEM) {
    667             Blob keyBlob;
    668             ResponseCode responseCode =
    669                 mKeyStore->get(filename.string(), &keyBlob, ::TYPE_ANY, get_user_id(targetUid));
    670             if (responseCode == ResponseCode::NO_ERROR && keyBlob.isCriticalToDeviceEncryption()) {
    671                 // Do not clear keys critical to device encryption under system uid.
    672                 continue;
    673             }
    674         }
    675 
    676         mKeyStore->del(filename.string(), ::TYPE_ANY, get_user_id(targetUid));
    677 
    678         // del() will fail silently if no cached characteristics are present for this alias.
    679         String8 chr_filename(
    680             mKeyStore->getKeyNameForUidWithDir(name8, targetUid, ::TYPE_KEY_CHARACTERISTICS));
    681         mKeyStore->del(chr_filename.string(), ::TYPE_KEY_CHARACTERISTICS, get_user_id(targetUid));
    682     }
    683     return ResponseCode::NO_ERROR;
    684 }
    685 
    686 KeyStoreServiceReturnCode KeyStoreService::addRngEntropy(const hidl_vec<uint8_t>& entropy) {
    687     const auto& device = mKeyStore->getDevice();
    688     return KS_HANDLE_HIDL_ERROR(device->addRngEntropy(entropy));
    689 }
    690 
    691 KeyStoreServiceReturnCode KeyStoreService::generateKey(const String16& name,
    692                                                        const hidl_vec<KeyParameter>& params,
    693                                                        const hidl_vec<uint8_t>& entropy, int uid,
    694                                                        int flags,
    695                                                        KeyCharacteristics* outCharacteristics) {
    696     uid = getEffectiveUid(uid);
    697     KeyStoreServiceReturnCode rc =
    698         checkBinderPermissionAndKeystoreState(P_INSERT, uid, flags & KEYSTORE_FLAG_ENCRYPTED);
    699     if (!rc.isOk()) {
    700         return rc;
    701     }
    702     if ((flags & KEYSTORE_FLAG_CRITICAL_TO_DEVICE_ENCRYPTION) && get_app_id(uid) != AID_SYSTEM) {
    703         ALOGE("Non-system uid %d cannot set FLAG_CRITICAL_TO_DEVICE_ENCRYPTION", uid);
    704         return ResponseCode::PERMISSION_DENIED;
    705     }
    706 
    707     if (containsTag(params, Tag::INCLUDE_UNIQUE_ID)) {
    708         if (!checkBinderPermission(P_GEN_UNIQUE_ID)) return ResponseCode::PERMISSION_DENIED;
    709     }
    710 
    711     bool usingFallback = false;
    712     auto& dev = mKeyStore->getDevice();
    713     AuthorizationSet keyCharacteristics = params;
    714 
    715     // TODO: Seed from Linux RNG before this.
    716     rc = addRngEntropy(entropy);
    717     if (!rc.isOk()) {
    718         return rc;
    719     }
    720 
    721     KeyStoreServiceReturnCode error;
    722     auto hidl_cb = [&](ErrorCode ret, const hidl_vec<uint8_t>& hidlKeyBlob,
    723                        const KeyCharacteristics& keyCharacteristics) {
    724         error = ret;
    725         if (!error.isOk()) {
    726             return;
    727         }
    728         if (outCharacteristics) *outCharacteristics = keyCharacteristics;
    729 
    730         // Write the key
    731         String8 name8(name);
    732         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, uid, ::TYPE_KEYMASTER_10));
    733 
    734         Blob keyBlob(&hidlKeyBlob[0], hidlKeyBlob.size(), NULL, 0, ::TYPE_KEYMASTER_10);
    735         keyBlob.setFallback(usingFallback);
    736         keyBlob.setCriticalToDeviceEncryption(flags & KEYSTORE_FLAG_CRITICAL_TO_DEVICE_ENCRYPTION);
    737         if (isAuthenticationBound(params) && !keyBlob.isCriticalToDeviceEncryption()) {
    738             keyBlob.setSuperEncrypted(true);
    739         }
    740         keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
    741 
    742         error = mKeyStore->put(filename.string(), &keyBlob, get_user_id(uid));
    743     };
    744 
    745     rc = KS_HANDLE_HIDL_ERROR(dev->generateKey(params, hidl_cb));
    746     if (!rc.isOk()) {
    747         return rc;
    748     }
    749     if (!error.isOk()) {
    750         ALOGE("Failed to generate key -> falling back to software keymaster");
    751         usingFallback = true;
    752         auto fallback = mKeyStore->getFallbackDevice();
    753         if (!fallback.isOk()) {
    754             return error;
    755         }
    756         rc = KS_HANDLE_HIDL_ERROR(fallback.value()->generateKey(params, hidl_cb));
    757         if (!rc.isOk()) {
    758             return rc;
    759         }
    760         if (!error.isOk()) {
    761             return error;
    762         }
    763     }
    764 
    765     // Write the characteristics:
    766     String8 name8(name);
    767     String8 cFilename(mKeyStore->getKeyNameForUidWithDir(name8, uid, ::TYPE_KEY_CHARACTERISTICS));
    768 
    769     std::stringstream kc_stream;
    770     keyCharacteristics.Serialize(&kc_stream);
    771     if (kc_stream.bad()) {
    772         return ResponseCode::SYSTEM_ERROR;
    773     }
    774     auto kc_buf = kc_stream.str();
    775     Blob charBlob(reinterpret_cast<const uint8_t*>(kc_buf.data()), kc_buf.size(), NULL, 0,
    776                   ::TYPE_KEY_CHARACTERISTICS);
    777     charBlob.setFallback(usingFallback);
    778     charBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
    779 
    780     return mKeyStore->put(cFilename.string(), &charBlob, get_user_id(uid));
    781 }
    782 
    783 KeyStoreServiceReturnCode
    784 KeyStoreService::getKeyCharacteristics(const String16& name, const hidl_vec<uint8_t>& clientId,
    785                                        const hidl_vec<uint8_t>& appData, int32_t uid,
    786                                        KeyCharacteristics* outCharacteristics) {
    787     if (!outCharacteristics) {
    788         return ErrorCode::UNEXPECTED_NULL_POINTER;
    789     }
    790 
    791     uid_t targetUid = getEffectiveUid(uid);
    792     uid_t callingUid = IPCThreadState::self()->getCallingUid();
    793     if (!is_granted_to(callingUid, targetUid)) {
    794         ALOGW("uid %d not permitted to act for uid %d in getKeyCharacteristics", callingUid,
    795               targetUid);
    796         return ResponseCode::PERMISSION_DENIED;
    797     }
    798 
    799     Blob keyBlob;
    800     String8 name8(name);
    801 
    802     KeyStoreServiceReturnCode rc =
    803         mKeyStore->getKeyForName(&keyBlob, name8, targetUid, TYPE_KEYMASTER_10);
    804     if (!rc.isOk()) {
    805         return rc;
    806     }
    807 
    808     auto hidlKeyBlob = blob2hidlVec(keyBlob);
    809     auto& dev = mKeyStore->getDevice(keyBlob);
    810 
    811     KeyStoreServiceReturnCode error;
    812 
    813     auto hidlCb = [&](ErrorCode ret, const KeyCharacteristics& keyCharacteristics) {
    814         error = ret;
    815         if (!error.isOk()) {
    816             return;
    817         }
    818         *outCharacteristics = keyCharacteristics;
    819     };
    820 
    821     rc = KS_HANDLE_HIDL_ERROR(dev->getKeyCharacteristics(hidlKeyBlob, clientId, appData, hidlCb));
    822     if (!rc.isOk()) {
    823         return rc;
    824     }
    825 
    826     if (error == ErrorCode::KEY_REQUIRES_UPGRADE) {
    827         AuthorizationSet upgradeParams;
    828         if (clientId.size()) {
    829             upgradeParams.push_back(TAG_APPLICATION_ID, clientId);
    830         }
    831         if (appData.size()) {
    832             upgradeParams.push_back(TAG_APPLICATION_DATA, appData);
    833         }
    834         rc = upgradeKeyBlob(name, targetUid, upgradeParams, &keyBlob);
    835         if (!rc.isOk()) {
    836             return rc;
    837         }
    838 
    839         auto upgradedHidlKeyBlob = blob2hidlVec(keyBlob);
    840 
    841         rc = KS_HANDLE_HIDL_ERROR(
    842             dev->getKeyCharacteristics(upgradedHidlKeyBlob, clientId, appData, hidlCb));
    843         if (!rc.isOk()) {
    844             return rc;
    845         }
    846         // Note that, on success, "error" will have been updated by the hidlCB callback.
    847         // So it is fine to return "error" below.
    848     }
    849     return error;
    850 }
    851 
    852 KeyStoreServiceReturnCode
    853 KeyStoreService::importKey(const String16& name, const hidl_vec<KeyParameter>& params,
    854                            KeyFormat format, const hidl_vec<uint8_t>& keyData, int uid, int flags,
    855                            KeyCharacteristics* outCharacteristics) {
    856     uid = getEffectiveUid(uid);
    857     KeyStoreServiceReturnCode rc =
    858         checkBinderPermissionAndKeystoreState(P_INSERT, uid, flags & KEYSTORE_FLAG_ENCRYPTED);
    859     if (!rc.isOk()) {
    860         return rc;
    861     }
    862     if ((flags & KEYSTORE_FLAG_CRITICAL_TO_DEVICE_ENCRYPTION) && get_app_id(uid) != AID_SYSTEM) {
    863         ALOGE("Non-system uid %d cannot set FLAG_CRITICAL_TO_DEVICE_ENCRYPTION", uid);
    864         return ResponseCode::PERMISSION_DENIED;
    865     }
    866 
    867     bool usingFallback = false;
    868     auto& dev = mKeyStore->getDevice();
    869 
    870     String8 name8(name);
    871 
    872     KeyStoreServiceReturnCode error;
    873 
    874     auto hidlCb = [&](ErrorCode ret, const hidl_vec<uint8_t>& keyBlob,
    875                       const KeyCharacteristics& keyCharacteristics) {
    876         error = ret;
    877         if (!error.isOk()) {
    878             return;
    879         }
    880 
    881         if (outCharacteristics) *outCharacteristics = keyCharacteristics;
    882 
    883         // Write the key:
    884         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, uid, ::TYPE_KEYMASTER_10));
    885 
    886         Blob ksBlob(&keyBlob[0], keyBlob.size(), NULL, 0, ::TYPE_KEYMASTER_10);
    887         ksBlob.setFallback(usingFallback);
    888         ksBlob.setCriticalToDeviceEncryption(flags & KEYSTORE_FLAG_CRITICAL_TO_DEVICE_ENCRYPTION);
    889         if (isAuthenticationBound(params) && !ksBlob.isCriticalToDeviceEncryption()) {
    890             ksBlob.setSuperEncrypted(true);
    891         }
    892         ksBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
    893 
    894         error = mKeyStore->put(filename.string(), &ksBlob, get_user_id(uid));
    895     };
    896 
    897     rc = KS_HANDLE_HIDL_ERROR(dev->importKey(params, format, keyData, hidlCb));
    898     // possible hidl error
    899     if (!rc.isOk()) {
    900         return rc;
    901     }
    902     // now check error from callback
    903     if (!error.isOk()) {
    904         ALOGE("Failed to import key -> falling back to software keymaster");
    905         usingFallback = true;
    906         auto fallback = mKeyStore->getFallbackDevice();
    907         if (!fallback.isOk()) {
    908             return error;
    909         }
    910         rc = KS_HANDLE_HIDL_ERROR(fallback.value()->importKey(params, format, keyData, hidlCb));
    911         // possible hidl error
    912         if (!rc.isOk()) {
    913             return rc;
    914         }
    915         // now check error from callback
    916         if (!error.isOk()) {
    917             return error;
    918         }
    919     }
    920 
    921     // Write the characteristics:
    922     String8 cFilename(mKeyStore->getKeyNameForUidWithDir(name8, uid, ::TYPE_KEY_CHARACTERISTICS));
    923 
    924     AuthorizationSet opParams = params;
    925     std::stringstream kcStream;
    926     opParams.Serialize(&kcStream);
    927     if (kcStream.bad()) return ResponseCode::SYSTEM_ERROR;
    928     auto kcBuf = kcStream.str();
    929 
    930     Blob charBlob(reinterpret_cast<const uint8_t*>(kcBuf.data()), kcBuf.size(), NULL, 0,
    931                   ::TYPE_KEY_CHARACTERISTICS);
    932     charBlob.setFallback(usingFallback);
    933     charBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
    934 
    935     return mKeyStore->put(cFilename.string(), &charBlob, get_user_id(uid));
    936 }
    937 
    938 void KeyStoreService::exportKey(const String16& name, KeyFormat format,
    939                                 const hidl_vec<uint8_t>& clientId, const hidl_vec<uint8_t>& appData,
    940                                 int32_t uid, ExportResult* result) {
    941 
    942     uid_t targetUid = getEffectiveUid(uid);
    943     uid_t callingUid = IPCThreadState::self()->getCallingUid();
    944     if (!is_granted_to(callingUid, targetUid)) {
    945         ALOGW("uid %d not permitted to act for uid %d in exportKey", callingUid, targetUid);
    946         result->resultCode = ResponseCode::PERMISSION_DENIED;
    947         return;
    948     }
    949 
    950     Blob keyBlob;
    951     String8 name8(name);
    952 
    953     result->resultCode = mKeyStore->getKeyForName(&keyBlob, name8, targetUid, TYPE_KEYMASTER_10);
    954     if (!result->resultCode.isOk()) {
    955         return;
    956     }
    957 
    958     auto key = blob2hidlVec(keyBlob);
    959     auto& dev = mKeyStore->getDevice(keyBlob);
    960 
    961     auto hidlCb = [&](ErrorCode ret, const ::android::hardware::hidl_vec<uint8_t>& keyMaterial) {
    962         result->resultCode = ret;
    963         if (!result->resultCode.isOk()) {
    964             return;
    965         }
    966         result->exportData = keyMaterial;
    967     };
    968     KeyStoreServiceReturnCode rc =
    969         KS_HANDLE_HIDL_ERROR(dev->exportKey(format, key, clientId, appData, hidlCb));
    970     // Overwrite result->resultCode only on HIDL error. Otherwise we want the result set in the
    971     // callback hidlCb.
    972     if (!rc.isOk()) {
    973         result->resultCode = rc;
    974     }
    975 
    976     if (result->resultCode == ErrorCode::KEY_REQUIRES_UPGRADE) {
    977         AuthorizationSet upgradeParams;
    978         if (clientId.size()) {
    979             upgradeParams.push_back(TAG_APPLICATION_ID, clientId);
    980         }
    981         if (appData.size()) {
    982             upgradeParams.push_back(TAG_APPLICATION_DATA, appData);
    983         }
    984         result->resultCode = upgradeKeyBlob(name, targetUid, upgradeParams, &keyBlob);
    985         if (!result->resultCode.isOk()) {
    986             return;
    987         }
    988 
    989         auto upgradedHidlKeyBlob = blob2hidlVec(keyBlob);
    990 
    991         result->resultCode = KS_HANDLE_HIDL_ERROR(
    992             dev->exportKey(format, upgradedHidlKeyBlob, clientId, appData, hidlCb));
    993         if (!result->resultCode.isOk()) {
    994             return;
    995         }
    996     }
    997 }
    998 
    999 static inline void addAuthTokenToParams(AuthorizationSet* params, const HardwareAuthToken* token) {
   1000     if (token) {
   1001         params->push_back(TAG_AUTH_TOKEN, authToken2HidlVec(*token));
   1002     }
   1003 }
   1004 
   1005 void KeyStoreService::begin(const sp<IBinder>& appToken, const String16& name, KeyPurpose purpose,
   1006                             bool pruneable, const hidl_vec<KeyParameter>& params,
   1007                             const hidl_vec<uint8_t>& entropy, int32_t uid,
   1008                             OperationResult* result) {
   1009     uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1010     uid_t targetUid = getEffectiveUid(uid);
   1011     if (!is_granted_to(callingUid, targetUid)) {
   1012         ALOGW("uid %d not permitted to act for uid %d in begin", callingUid, targetUid);
   1013         result->resultCode = ResponseCode::PERMISSION_DENIED;
   1014         return;
   1015     }
   1016     if (!pruneable && get_app_id(callingUid) != AID_SYSTEM) {
   1017         ALOGE("Non-system uid %d trying to start non-pruneable operation", callingUid);
   1018         result->resultCode = ResponseCode::PERMISSION_DENIED;
   1019         return;
   1020     }
   1021     if (!checkAllowedOperationParams(params)) {
   1022         result->resultCode = ErrorCode::INVALID_ARGUMENT;
   1023         return;
   1024     }
   1025     Blob keyBlob;
   1026     String8 name8(name);
   1027     result->resultCode = mKeyStore->getKeyForName(&keyBlob, name8, targetUid, TYPE_KEYMASTER_10);
   1028     if (result->resultCode == ResponseCode::LOCKED && keyBlob.isSuperEncrypted()) {
   1029         result->resultCode = ErrorCode::KEY_USER_NOT_AUTHENTICATED;
   1030     }
   1031     if (!result->resultCode.isOk()) {
   1032         return;
   1033     }
   1034 
   1035     auto key = blob2hidlVec(keyBlob);
   1036     auto& dev = mKeyStore->getDevice(keyBlob);
   1037     AuthorizationSet opParams = params;
   1038     KeyCharacteristics characteristics;
   1039     result->resultCode = getOperationCharacteristics(key, &dev, opParams, &characteristics);
   1040 
   1041     if (result->resultCode == ErrorCode::KEY_REQUIRES_UPGRADE) {
   1042         result->resultCode = upgradeKeyBlob(name, targetUid, opParams, &keyBlob);
   1043         if (!result->resultCode.isOk()) {
   1044             return;
   1045         }
   1046         key = blob2hidlVec(keyBlob);
   1047         result->resultCode = getOperationCharacteristics(key, &dev, opParams, &characteristics);
   1048     }
   1049     if (!result->resultCode.isOk()) {
   1050         return;
   1051     }
   1052 
   1053     const HardwareAuthToken* authToken = NULL;
   1054 
   1055     // Merge these characteristics with the ones cached when the key was generated or imported
   1056     Blob charBlob;
   1057     AuthorizationSet persistedCharacteristics;
   1058     result->resultCode =
   1059         mKeyStore->getKeyForName(&charBlob, name8, targetUid, TYPE_KEY_CHARACTERISTICS);
   1060     if (result->resultCode.isOk()) {
   1061         // TODO write one shot stream buffer to avoid copying (twice here)
   1062         std::string charBuffer(reinterpret_cast<const char*>(charBlob.getValue()),
   1063                                charBlob.getLength());
   1064         std::stringstream charStream(charBuffer);
   1065         persistedCharacteristics.Deserialize(&charStream);
   1066     } else {
   1067         ALOGD("Unable to read cached characteristics for key");
   1068     }
   1069 
   1070     // Replace the sw_enforced set with those persisted to disk, minus hw_enforced
   1071     AuthorizationSet softwareEnforced = characteristics.softwareEnforced;
   1072     AuthorizationSet teeEnforced = characteristics.teeEnforced;
   1073     persistedCharacteristics.Union(softwareEnforced);
   1074     persistedCharacteristics.Subtract(teeEnforced);
   1075     characteristics.softwareEnforced = persistedCharacteristics.hidl_data();
   1076 
   1077     result->resultCode = getAuthToken(characteristics, 0, purpose, &authToken,
   1078                                       /*failOnTokenMissing*/ false);
   1079     // If per-operation auth is needed we need to begin the operation and
   1080     // the client will need to authorize that operation before calling
   1081     // update. Any other auth issues stop here.
   1082     if (!result->resultCode.isOk() && result->resultCode != ResponseCode::OP_AUTH_NEEDED) return;
   1083 
   1084     addAuthTokenToParams(&opParams, authToken);
   1085 
   1086     // Add entropy to the device first.
   1087     if (entropy.size()) {
   1088         result->resultCode = addRngEntropy(entropy);
   1089         if (!result->resultCode.isOk()) {
   1090             return;
   1091         }
   1092     }
   1093 
   1094     // Create a keyid for this key.
   1095     km_id_t keyid;
   1096     if (!enforcement_policy.CreateKeyId(key, &keyid)) {
   1097         ALOGE("Failed to create a key ID for authorization checking.");
   1098         result->resultCode = ErrorCode::UNKNOWN_ERROR;
   1099         return;
   1100     }
   1101 
   1102     // Check that all key authorization policy requirements are met.
   1103     AuthorizationSet key_auths = characteristics.teeEnforced;
   1104     key_auths.append(&characteristics.softwareEnforced[0],
   1105                      &characteristics.softwareEnforced[characteristics.softwareEnforced.size()]);
   1106 
   1107     result->resultCode = enforcement_policy.AuthorizeOperation(
   1108         purpose, keyid, key_auths, opParams, 0 /* op_handle */, true /* is_begin_operation */);
   1109     if (!result->resultCode.isOk()) {
   1110         return;
   1111     }
   1112 
   1113     // If there are more than kMaxOperations, abort the oldest operation that was started as
   1114     // pruneable.
   1115     while (mOperationMap.getOperationCount() >= kMaxOperations) {
   1116         ALOGD("Reached or exceeded concurrent operations limit");
   1117         if (!pruneOperation()) {
   1118             break;
   1119         }
   1120     }
   1121 
   1122     auto hidlCb = [&](ErrorCode ret, const hidl_vec<KeyParameter>& outParams,
   1123                       uint64_t operationHandle) {
   1124         result->resultCode = ret;
   1125         if (!result->resultCode.isOk()) {
   1126             return;
   1127         }
   1128         result->handle = operationHandle;
   1129         result->outParams = outParams;
   1130     };
   1131 
   1132     ErrorCode rc = KS_HANDLE_HIDL_ERROR(dev->begin(purpose, key, opParams.hidl_data(), hidlCb));
   1133     if (rc != ErrorCode::OK) {
   1134         ALOGW("Got error %d from begin()", rc);
   1135     }
   1136 
   1137     // If there are too many operations abort the oldest operation that was
   1138     // started as pruneable and try again.
   1139     while (rc == ErrorCode::TOO_MANY_OPERATIONS && mOperationMap.hasPruneableOperation()) {
   1140         ALOGW("Ran out of operation handles");
   1141         if (!pruneOperation()) {
   1142             break;
   1143         }
   1144         rc = KS_HANDLE_HIDL_ERROR(dev->begin(purpose, key, opParams.hidl_data(), hidlCb));
   1145     }
   1146     if (rc != ErrorCode::OK) {
   1147         result->resultCode = rc;
   1148         return;
   1149     }
   1150 
   1151     // Note: The operation map takes possession of the contents of "characteristics".
   1152     // It is safe to use characteristics after the following line but it will be empty.
   1153     sp<IBinder> operationToken = mOperationMap.addOperation(
   1154         result->handle, keyid, purpose, dev, appToken, std::move(characteristics), pruneable);
   1155     assert(characteristics.teeEnforced.size() == 0);
   1156     assert(characteristics.softwareEnforced.size() == 0);
   1157 
   1158     if (authToken) {
   1159         mOperationMap.setOperationAuthToken(operationToken, authToken);
   1160     }
   1161     // Return the authentication lookup result. If this is a per operation
   1162     // auth'd key then the resultCode will be ::OP_AUTH_NEEDED and the
   1163     // application should get an auth token using the handle before the
   1164     // first call to update, which will fail if keystore hasn't received the
   1165     // auth token.
   1166     // All fields but "token" were set in the begin operation's callback.
   1167     result->token = operationToken;
   1168 }
   1169 
   1170 void KeyStoreService::update(const sp<IBinder>& token, const hidl_vec<KeyParameter>& params,
   1171                              const hidl_vec<uint8_t>& data, OperationResult* result) {
   1172     if (!checkAllowedOperationParams(params)) {
   1173         result->resultCode = ErrorCode::INVALID_ARGUMENT;
   1174         return;
   1175     }
   1176     km_device_t dev;
   1177     uint64_t handle;
   1178     KeyPurpose purpose;
   1179     km_id_t keyid;
   1180     const KeyCharacteristics* characteristics;
   1181     if (!mOperationMap.getOperation(token, &handle, &keyid, &purpose, &dev, &characteristics)) {
   1182         result->resultCode = ErrorCode::INVALID_OPERATION_HANDLE;
   1183         return;
   1184     }
   1185     AuthorizationSet opParams = params;
   1186     result->resultCode = addOperationAuthTokenIfNeeded(token, &opParams);
   1187     if (!result->resultCode.isOk()) {
   1188         return;
   1189     }
   1190 
   1191     // Check that all key authorization policy requirements are met.
   1192     AuthorizationSet key_auths(characteristics->teeEnforced);
   1193     key_auths.append(&characteristics->softwareEnforced[0],
   1194                      &characteristics->softwareEnforced[characteristics->softwareEnforced.size()]);
   1195     result->resultCode = enforcement_policy.AuthorizeOperation(
   1196         purpose, keyid, key_auths, opParams, handle, false /* is_begin_operation */);
   1197     if (!result->resultCode.isOk()) {
   1198         return;
   1199     }
   1200 
   1201     auto hidlCb = [&](ErrorCode ret, uint32_t inputConsumed,
   1202                       const hidl_vec<KeyParameter>& outParams, const hidl_vec<uint8_t>& output) {
   1203         result->resultCode = ret;
   1204         if (!result->resultCode.isOk()) {
   1205             return;
   1206         }
   1207         result->inputConsumed = inputConsumed;
   1208         result->outParams = outParams;
   1209         result->data = output;
   1210     };
   1211 
   1212     KeyStoreServiceReturnCode rc = KS_HANDLE_HIDL_ERROR(dev->update(handle, opParams.hidl_data(),
   1213                                                         data, hidlCb));
   1214     // just a reminder: on success result->resultCode was set in the callback. So we only overwrite
   1215     // it if there was a communication error indicated by the ErrorCode.
   1216     if (!rc.isOk()) {
   1217         result->resultCode = rc;
   1218     }
   1219 }
   1220 
   1221 void KeyStoreService::finish(const sp<IBinder>& token, const hidl_vec<KeyParameter>& params,
   1222                              const hidl_vec<uint8_t>& signature, const hidl_vec<uint8_t>& entropy,
   1223                              OperationResult* result) {
   1224     if (!checkAllowedOperationParams(params)) {
   1225         result->resultCode = ErrorCode::INVALID_ARGUMENT;
   1226         return;
   1227     }
   1228     km_device_t dev;
   1229     uint64_t handle;
   1230     KeyPurpose purpose;
   1231     km_id_t keyid;
   1232     const KeyCharacteristics* characteristics;
   1233     if (!mOperationMap.getOperation(token, &handle, &keyid, &purpose, &dev, &characteristics)) {
   1234         result->resultCode = ErrorCode::INVALID_OPERATION_HANDLE;
   1235         return;
   1236     }
   1237     AuthorizationSet opParams = params;
   1238     result->resultCode = addOperationAuthTokenIfNeeded(token, &opParams);
   1239     if (!result->resultCode.isOk()) {
   1240         return;
   1241     }
   1242 
   1243     if (entropy.size()) {
   1244         result->resultCode = addRngEntropy(entropy);
   1245         if (!result->resultCode.isOk()) {
   1246             return;
   1247         }
   1248     }
   1249 
   1250     // Check that all key authorization policy requirements are met.
   1251     AuthorizationSet key_auths(characteristics->teeEnforced);
   1252     key_auths.append(&characteristics->softwareEnforced[0],
   1253                      &characteristics->softwareEnforced[characteristics->softwareEnforced.size()]);
   1254     result->resultCode = enforcement_policy.AuthorizeOperation(
   1255         purpose, keyid, key_auths, opParams, handle, false /* is_begin_operation */);
   1256     if (!result->resultCode.isOk()) return;
   1257 
   1258     auto hidlCb = [&](ErrorCode ret, const hidl_vec<KeyParameter>& outParams,
   1259                       const hidl_vec<uint8_t>& output) {
   1260         result->resultCode = ret;
   1261         if (!result->resultCode.isOk()) {
   1262             return;
   1263         }
   1264         result->outParams = outParams;
   1265         result->data = output;
   1266     };
   1267 
   1268     KeyStoreServiceReturnCode rc = KS_HANDLE_HIDL_ERROR(dev->finish(
   1269         handle, opParams.hidl_data(),
   1270         hidl_vec<uint8_t>() /* TODO(swillden): wire up input to finish() */, signature, hidlCb));
   1271     // Remove the operation regardless of the result
   1272     mOperationMap.removeOperation(token);
   1273     mAuthTokenTable.MarkCompleted(handle);
   1274 
   1275     // just a reminder: on success result->resultCode was set in the callback. So we only overwrite
   1276     // it if there was a communication error indicated by the ErrorCode.
   1277     if (!rc.isOk()) {
   1278         result->resultCode = rc;
   1279     }
   1280 }
   1281 
   1282 KeyStoreServiceReturnCode KeyStoreService::abort(const sp<IBinder>& token) {
   1283     km_device_t dev;
   1284     uint64_t handle;
   1285     KeyPurpose purpose;
   1286     km_id_t keyid;
   1287     if (!mOperationMap.getOperation(token, &handle, &keyid, &purpose, &dev, NULL)) {
   1288         return ErrorCode::INVALID_OPERATION_HANDLE;
   1289     }
   1290     mOperationMap.removeOperation(token);
   1291 
   1292     ErrorCode rc = KS_HANDLE_HIDL_ERROR(dev->abort(handle));
   1293     mAuthTokenTable.MarkCompleted(handle);
   1294     return rc;
   1295 }
   1296 
   1297 bool KeyStoreService::isOperationAuthorized(const sp<IBinder>& token) {
   1298     km_device_t dev;
   1299     uint64_t handle;
   1300     const KeyCharacteristics* characteristics;
   1301     KeyPurpose purpose;
   1302     km_id_t keyid;
   1303     if (!mOperationMap.getOperation(token, &handle, &keyid, &purpose, &dev, &characteristics)) {
   1304         return false;
   1305     }
   1306     const HardwareAuthToken* authToken = NULL;
   1307     mOperationMap.getOperationAuthToken(token, &authToken);
   1308     AuthorizationSet ignored;
   1309     auto authResult = addOperationAuthTokenIfNeeded(token, &ignored);
   1310     return authResult.isOk();
   1311 }
   1312 
   1313 KeyStoreServiceReturnCode KeyStoreService::addAuthToken(const uint8_t* token, size_t length) {
   1314     // TODO(swillden): When gatekeeper and fingerprint are ready, this should be updated to
   1315     // receive a HardwareAuthToken, rather than an opaque byte array.
   1316 
   1317     if (!checkBinderPermission(P_ADD_AUTH)) {
   1318         ALOGW("addAuthToken: permission denied for %d", IPCThreadState::self()->getCallingUid());
   1319         return ResponseCode::PERMISSION_DENIED;
   1320     }
   1321     if (length != sizeof(hw_auth_token_t)) {
   1322         return ErrorCode::INVALID_ARGUMENT;
   1323     }
   1324 
   1325     hw_auth_token_t authToken;
   1326     memcpy(reinterpret_cast<void*>(&authToken), token, sizeof(hw_auth_token_t));
   1327     if (authToken.version != 0) {
   1328         return ErrorCode::INVALID_ARGUMENT;
   1329     }
   1330 
   1331     std::unique_ptr<HardwareAuthToken> hidlAuthToken(new HardwareAuthToken);
   1332     hidlAuthToken->challenge = authToken.challenge;
   1333     hidlAuthToken->userId = authToken.user_id;
   1334     hidlAuthToken->authenticatorId = authToken.authenticator_id;
   1335     hidlAuthToken->authenticatorType = authToken.authenticator_type;
   1336     hidlAuthToken->timestamp = authToken.timestamp;
   1337     static_assert(
   1338         std::is_same<decltype(hidlAuthToken->hmac),
   1339                      ::android::hardware::hidl_array<uint8_t, sizeof(authToken.hmac)>>::value,
   1340         "This function assumes token HMAC is 32 bytes, but it might not be.");
   1341     std::copy(authToken.hmac, authToken.hmac + sizeof(authToken.hmac), hidlAuthToken->hmac.data());
   1342 
   1343     // The table takes ownership of authToken.
   1344     mAuthTokenTable.AddAuthenticationToken(hidlAuthToken.release());
   1345     return ResponseCode::NO_ERROR;
   1346 }
   1347 
   1348 bool isDeviceIdAttestationRequested(const hidl_vec<KeyParameter>& params) {
   1349     for (size_t i = 0; i < params.size(); ++i) {
   1350         switch (params[i].tag) {
   1351         case Tag::ATTESTATION_ID_BRAND:
   1352         case Tag::ATTESTATION_ID_DEVICE:
   1353         case Tag::ATTESTATION_ID_IMEI:
   1354         case Tag::ATTESTATION_ID_MANUFACTURER:
   1355         case Tag::ATTESTATION_ID_MEID:
   1356         case Tag::ATTESTATION_ID_MODEL:
   1357         case Tag::ATTESTATION_ID_PRODUCT:
   1358         case Tag::ATTESTATION_ID_SERIAL:
   1359             return true;
   1360         default:
   1361             break;
   1362         }
   1363     }
   1364     return false;
   1365 }
   1366 
   1367 KeyStoreServiceReturnCode KeyStoreService::attestKey(const String16& name,
   1368                                                      const hidl_vec<KeyParameter>& params,
   1369                                                      hidl_vec<hidl_vec<uint8_t>>* outChain) {
   1370     if (!outChain) {
   1371         return ErrorCode::OUTPUT_PARAMETER_NULL;
   1372     }
   1373 
   1374     if (!checkAllowedOperationParams(params)) {
   1375         return ErrorCode::INVALID_ARGUMENT;
   1376     }
   1377 
   1378     if (isDeviceIdAttestationRequested(params)) {
   1379         // There is a dedicated attestDeviceIds() method for device ID attestation.
   1380         return ErrorCode::INVALID_ARGUMENT;
   1381     }
   1382 
   1383     uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1384 
   1385     AuthorizationSet mutableParams = params;
   1386     KeyStoreServiceReturnCode rc = updateParamsForAttestation(callingUid, &mutableParams);
   1387     if (!rc.isOk()) {
   1388         return rc;
   1389     }
   1390 
   1391     Blob keyBlob;
   1392     String8 name8(name);
   1393     rc = mKeyStore->getKeyForName(&keyBlob, name8, callingUid, TYPE_KEYMASTER_10);
   1394     if (!rc.isOk()) {
   1395         return rc;
   1396     }
   1397 
   1398     KeyStoreServiceReturnCode error;
   1399     auto hidlCb = [&](ErrorCode ret, const hidl_vec<hidl_vec<uint8_t>>& certChain) {
   1400         error = ret;
   1401         if (!error.isOk()) {
   1402             return;
   1403         }
   1404         if (outChain) *outChain = certChain;
   1405     };
   1406 
   1407     auto hidlKey = blob2hidlVec(keyBlob);
   1408     auto& dev = mKeyStore->getDevice(keyBlob);
   1409     rc = KS_HANDLE_HIDL_ERROR(dev->attestKey(hidlKey, mutableParams.hidl_data(), hidlCb));
   1410     if (!rc.isOk()) {
   1411         return rc;
   1412     }
   1413     return error;
   1414 }
   1415 
   1416 KeyStoreServiceReturnCode KeyStoreService::attestDeviceIds(const hidl_vec<KeyParameter>& params,
   1417                                                            hidl_vec<hidl_vec<uint8_t>>* outChain) {
   1418     if (!outChain) {
   1419         return ErrorCode::OUTPUT_PARAMETER_NULL;
   1420     }
   1421 
   1422     if (!checkAllowedOperationParams(params)) {
   1423         return ErrorCode::INVALID_ARGUMENT;
   1424     }
   1425 
   1426     if (!isDeviceIdAttestationRequested(params)) {
   1427         // There is an attestKey() method for attesting keys without device ID attestation.
   1428         return ErrorCode::INVALID_ARGUMENT;
   1429     }
   1430 
   1431     uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1432     sp<IBinder> binder = defaultServiceManager()->getService(String16("permission"));
   1433     if (binder == 0) {
   1434         return ErrorCode::CANNOT_ATTEST_IDS;
   1435     }
   1436     if (!interface_cast<IPermissionController>(binder)->checkPermission(
   1437             String16("android.permission.READ_PRIVILEGED_PHONE_STATE"),
   1438             IPCThreadState::self()->getCallingPid(), callingUid)) {
   1439         return ErrorCode::CANNOT_ATTEST_IDS;
   1440     }
   1441 
   1442     AuthorizationSet mutableParams = params;
   1443     KeyStoreServiceReturnCode rc = updateParamsForAttestation(callingUid, &mutableParams);
   1444     if (!rc.isOk()) {
   1445         return rc;
   1446     }
   1447 
   1448     // Generate temporary key.
   1449     auto& dev = mKeyStore->getDevice();
   1450     KeyStoreServiceReturnCode error;
   1451     hidl_vec<uint8_t> hidlKey;
   1452 
   1453     AuthorizationSet keyCharacteristics;
   1454     keyCharacteristics.push_back(TAG_PURPOSE, KeyPurpose::VERIFY);
   1455     keyCharacteristics.push_back(TAG_ALGORITHM, Algorithm::EC);
   1456     keyCharacteristics.push_back(TAG_DIGEST, Digest::SHA_2_256);
   1457     keyCharacteristics.push_back(TAG_NO_AUTH_REQUIRED);
   1458     keyCharacteristics.push_back(TAG_EC_CURVE, EcCurve::P_256);
   1459     auto generateHidlCb = [&](ErrorCode ret, const hidl_vec<uint8_t>& hidlKeyBlob,
   1460                               const KeyCharacteristics&) {
   1461         error = ret;
   1462         if (!error.isOk()) {
   1463             return;
   1464         }
   1465         hidlKey = hidlKeyBlob;
   1466     };
   1467 
   1468     rc = KS_HANDLE_HIDL_ERROR(dev->generateKey(keyCharacteristics.hidl_data(), generateHidlCb));
   1469     if (!rc.isOk()) {
   1470         return rc;
   1471     }
   1472     if (!error.isOk()) {
   1473         return error;
   1474     }
   1475 
   1476     // Attest key and device IDs.
   1477     auto attestHidlCb = [&](ErrorCode ret, const hidl_vec<hidl_vec<uint8_t>>& certChain) {
   1478         error = ret;
   1479         if (!error.isOk()) {
   1480             return;
   1481         }
   1482         *outChain = certChain;
   1483     };
   1484     KeyStoreServiceReturnCode attestationRc =
   1485             KS_HANDLE_HIDL_ERROR(dev->attestKey(hidlKey, mutableParams.hidl_data(), attestHidlCb));
   1486 
   1487     // Delete temporary key.
   1488     KeyStoreServiceReturnCode deletionRc = KS_HANDLE_HIDL_ERROR(dev->deleteKey(hidlKey));
   1489 
   1490     if (!attestationRc.isOk()) {
   1491         return attestationRc;
   1492     }
   1493     if (!error.isOk()) {
   1494         return error;
   1495     }
   1496     return deletionRc;
   1497 }
   1498 
   1499 KeyStoreServiceReturnCode KeyStoreService::onDeviceOffBody() {
   1500     // TODO(tuckeris): add permission check.  This should be callable from ClockworkHome only.
   1501     mAuthTokenTable.onDeviceOffBody();
   1502     return ResponseCode::NO_ERROR;
   1503 }
   1504 
   1505 /**
   1506  * Prune the oldest pruneable operation.
   1507  */
   1508 bool KeyStoreService::pruneOperation() {
   1509     sp<IBinder> oldest = mOperationMap.getOldestPruneableOperation();
   1510     ALOGD("Trying to prune operation %p", oldest.get());
   1511     size_t op_count_before_abort = mOperationMap.getOperationCount();
   1512     // We mostly ignore errors from abort() because all we care about is whether at least
   1513     // one operation has been removed.
   1514     int abort_error = abort(oldest);
   1515     if (mOperationMap.getOperationCount() >= op_count_before_abort) {
   1516         ALOGE("Failed to abort pruneable operation %p, error: %d", oldest.get(), abort_error);
   1517         return false;
   1518     }
   1519     return true;
   1520 }
   1521 
   1522 /**
   1523  * Get the effective target uid for a binder operation that takes an
   1524  * optional uid as the target.
   1525  */
   1526 uid_t KeyStoreService::getEffectiveUid(int32_t targetUid) {
   1527     if (targetUid == UID_SELF) {
   1528         return IPCThreadState::self()->getCallingUid();
   1529     }
   1530     return static_cast<uid_t>(targetUid);
   1531 }
   1532 
   1533 /**
   1534  * Check if the caller of the current binder method has the required
   1535  * permission and if acting on other uids the grants to do so.
   1536  */
   1537 bool KeyStoreService::checkBinderPermission(perm_t permission, int32_t targetUid) {
   1538     uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1539     pid_t spid = IPCThreadState::self()->getCallingPid();
   1540     if (!has_permission(callingUid, permission, spid)) {
   1541         ALOGW("permission %s denied for %d", get_perm_label(permission), callingUid);
   1542         return false;
   1543     }
   1544     if (!is_granted_to(callingUid, getEffectiveUid(targetUid))) {
   1545         ALOGW("uid %d not granted to act for %d", callingUid, targetUid);
   1546         return false;
   1547     }
   1548     return true;
   1549 }
   1550 
   1551 /**
   1552  * Check if the caller of the current binder method has the required
   1553  * permission and the target uid is the caller or the caller is system.
   1554  */
   1555 bool KeyStoreService::checkBinderPermissionSelfOrSystem(perm_t permission, int32_t targetUid) {
   1556     uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1557     pid_t spid = IPCThreadState::self()->getCallingPid();
   1558     if (!has_permission(callingUid, permission, spid)) {
   1559         ALOGW("permission %s denied for %d", get_perm_label(permission), callingUid);
   1560         return false;
   1561     }
   1562     return getEffectiveUid(targetUid) == callingUid || callingUid == AID_SYSTEM;
   1563 }
   1564 
   1565 /**
   1566  * Check if the caller of the current binder method has the required
   1567  * permission or the target of the operation is the caller's uid. This is
   1568  * for operation where the permission is only for cross-uid activity and all
   1569  * uids are allowed to act on their own (ie: clearing all entries for a
   1570  * given uid).
   1571  */
   1572 bool KeyStoreService::checkBinderPermissionOrSelfTarget(perm_t permission, int32_t targetUid) {
   1573     uid_t callingUid = IPCThreadState::self()->getCallingUid();
   1574     if (getEffectiveUid(targetUid) == callingUid) {
   1575         return true;
   1576     } else {
   1577         return checkBinderPermission(permission, targetUid);
   1578     }
   1579 }
   1580 
   1581 /**
   1582  * Helper method to check that the caller has the required permission as
   1583  * well as the keystore is in the unlocked state if checkUnlocked is true.
   1584  *
   1585  * Returns NO_ERROR on success, PERMISSION_DENIED on a permission error and
   1586  * otherwise the state of keystore when not unlocked and checkUnlocked is
   1587  * true.
   1588  */
   1589 KeyStoreServiceReturnCode
   1590 KeyStoreService::checkBinderPermissionAndKeystoreState(perm_t permission, int32_t targetUid,
   1591                                                        bool checkUnlocked) {
   1592     if (!checkBinderPermission(permission, targetUid)) {
   1593         return ResponseCode::PERMISSION_DENIED;
   1594     }
   1595     State state = mKeyStore->getState(get_user_id(getEffectiveUid(targetUid)));
   1596     if (checkUnlocked && !isKeystoreUnlocked(state)) {
   1597         // All State values coincide with ResponseCodes
   1598         return static_cast<ResponseCode>(state);
   1599     }
   1600 
   1601     return ResponseCode::NO_ERROR;
   1602 }
   1603 
   1604 bool KeyStoreService::isKeystoreUnlocked(State state) {
   1605     switch (state) {
   1606     case ::STATE_NO_ERROR:
   1607         return true;
   1608     case ::STATE_UNINITIALIZED:
   1609     case ::STATE_LOCKED:
   1610         return false;
   1611     }
   1612     return false;
   1613 }
   1614 
   1615 /**
   1616  * Check that all KeyParameter's provided by the application are
   1617  * allowed. Any parameter that keystore adds itself should be disallowed here.
   1618  */
   1619 bool KeyStoreService::checkAllowedOperationParams(const hidl_vec<KeyParameter>& params) {
   1620     for (size_t i = 0; i < params.size(); ++i) {
   1621         switch (params[i].tag) {
   1622         case Tag::ATTESTATION_APPLICATION_ID:
   1623         case Tag::AUTH_TOKEN:
   1624         case Tag::RESET_SINCE_ID_ROTATION:
   1625             return false;
   1626         default:
   1627             break;
   1628         }
   1629     }
   1630     return true;
   1631 }
   1632 
   1633 ErrorCode KeyStoreService::getOperationCharacteristics(const hidl_vec<uint8_t>& key,
   1634                                                        km_device_t* dev,
   1635                                                        const AuthorizationSet& params,
   1636                                                        KeyCharacteristics* out) {
   1637     hidl_vec<uint8_t> appId;
   1638     hidl_vec<uint8_t> appData;
   1639     for (auto param : params) {
   1640         if (param.tag == Tag::APPLICATION_ID) {
   1641             appId = authorizationValue(TAG_APPLICATION_ID, param).value();
   1642         } else if (param.tag == Tag::APPLICATION_DATA) {
   1643             appData = authorizationValue(TAG_APPLICATION_DATA, param).value();
   1644         }
   1645     }
   1646     ErrorCode error = ErrorCode::OK;
   1647 
   1648     auto hidlCb = [&](ErrorCode ret, const KeyCharacteristics& keyCharacteristics) {
   1649         error = ret;
   1650         if (error != ErrorCode::OK) {
   1651             return;
   1652         }
   1653         if (out) *out = keyCharacteristics;
   1654     };
   1655 
   1656     ErrorCode rc = KS_HANDLE_HIDL_ERROR((*dev)->getKeyCharacteristics(key, appId, appData, hidlCb));
   1657     if (rc != ErrorCode::OK) {
   1658         return rc;
   1659     }
   1660     return error;
   1661 }
   1662 
   1663 /**
   1664  * Get the auth token for this operation from the auth token table.
   1665  *
   1666  * Returns ResponseCode::NO_ERROR if the auth token was set or none was required.
   1667  *         ::OP_AUTH_NEEDED if it is a per op authorization, no
   1668  *         authorization token exists for that operation and
   1669  *         failOnTokenMissing is false.
   1670  *         KM_ERROR_KEY_USER_NOT_AUTHENTICATED if there is no valid auth
   1671  *         token for the operation
   1672  */
   1673 KeyStoreServiceReturnCode KeyStoreService::getAuthToken(const KeyCharacteristics& characteristics,
   1674                                                         uint64_t handle, KeyPurpose purpose,
   1675                                                         const HardwareAuthToken** authToken,
   1676                                                         bool failOnTokenMissing) {
   1677 
   1678     AuthorizationSet allCharacteristics;
   1679     for (size_t i = 0; i < characteristics.softwareEnforced.size(); i++) {
   1680         allCharacteristics.push_back(characteristics.softwareEnforced[i]);
   1681     }
   1682     for (size_t i = 0; i < characteristics.teeEnforced.size(); i++) {
   1683         allCharacteristics.push_back(characteristics.teeEnforced[i]);
   1684     }
   1685     AuthTokenTable::Error err =
   1686         mAuthTokenTable.FindAuthorization(allCharacteristics, purpose, handle, authToken);
   1687     switch (err) {
   1688     case AuthTokenTable::OK:
   1689     case AuthTokenTable::AUTH_NOT_REQUIRED:
   1690         return ResponseCode::NO_ERROR;
   1691     case AuthTokenTable::AUTH_TOKEN_NOT_FOUND:
   1692     case AuthTokenTable::AUTH_TOKEN_EXPIRED:
   1693     case AuthTokenTable::AUTH_TOKEN_WRONG_SID:
   1694         return ErrorCode::KEY_USER_NOT_AUTHENTICATED;
   1695     case AuthTokenTable::OP_HANDLE_REQUIRED:
   1696         return failOnTokenMissing ? KeyStoreServiceReturnCode(ErrorCode::KEY_USER_NOT_AUTHENTICATED)
   1697                                   : KeyStoreServiceReturnCode(ResponseCode::OP_AUTH_NEEDED);
   1698     default:
   1699         ALOGE("Unexpected FindAuthorization return value %d", err);
   1700         return ErrorCode::INVALID_ARGUMENT;
   1701     }
   1702 }
   1703 
   1704 /**
   1705  * Add the auth token for the operation to the param list if the operation
   1706  * requires authorization. Uses the cached result in the OperationMap if available
   1707  * otherwise gets the token from the AuthTokenTable and caches the result.
   1708  *
   1709  * Returns ResponseCode::NO_ERROR if the auth token was added or not needed.
   1710  *         KM_ERROR_KEY_USER_NOT_AUTHENTICATED if the operation is not
   1711  *         authenticated.
   1712  *         KM_ERROR_INVALID_OPERATION_HANDLE if token is not a valid
   1713  *         operation token.
   1714  */
   1715 KeyStoreServiceReturnCode KeyStoreService::addOperationAuthTokenIfNeeded(const sp<IBinder>& token,
   1716                                                                          AuthorizationSet* params) {
   1717     const HardwareAuthToken* authToken = nullptr;
   1718     mOperationMap.getOperationAuthToken(token, &authToken);
   1719     if (!authToken) {
   1720         km_device_t dev;
   1721         uint64_t handle;
   1722         const KeyCharacteristics* characteristics = nullptr;
   1723         KeyPurpose purpose;
   1724         km_id_t keyid;
   1725         if (!mOperationMap.getOperation(token, &handle, &keyid, &purpose, &dev, &characteristics)) {
   1726             return ErrorCode::INVALID_OPERATION_HANDLE;
   1727         }
   1728         auto result = getAuthToken(*characteristics, handle, purpose, &authToken);
   1729         if (!result.isOk()) {
   1730             return result;
   1731         }
   1732         if (authToken) {
   1733             mOperationMap.setOperationAuthToken(token, authToken);
   1734         }
   1735     }
   1736     addAuthTokenToParams(params, authToken);
   1737     return ResponseCode::NO_ERROR;
   1738 }
   1739 
   1740 /**
   1741  * Translate a result value to a legacy return value. All keystore errors are
   1742  * preserved and keymaster errors become SYSTEM_ERRORs
   1743  */
   1744 KeyStoreServiceReturnCode KeyStoreService::translateResultToLegacyResult(int32_t result) {
   1745     if (result > 0) {
   1746         return static_cast<ResponseCode>(result);
   1747     }
   1748     return ResponseCode::SYSTEM_ERROR;
   1749 }
   1750 
   1751 static NullOr<const Algorithm&>
   1752 getKeyAlgoritmFromKeyCharacteristics(const KeyCharacteristics& characteristics) {
   1753     for (size_t i = 0; i < characteristics.teeEnforced.size(); ++i) {
   1754         auto algo = authorizationValue(TAG_ALGORITHM, characteristics.teeEnforced[i]);
   1755         if (algo.isOk()) return algo.value();
   1756     }
   1757     for (size_t i = 0; i < characteristics.softwareEnforced.size(); ++i) {
   1758         auto algo = authorizationValue(TAG_ALGORITHM, characteristics.softwareEnforced[i]);
   1759         if (algo.isOk()) return algo.value();
   1760     }
   1761     return {};
   1762 }
   1763 
   1764 void KeyStoreService::addLegacyBeginParams(const String16& name, AuthorizationSet* params) {
   1765     // All legacy keys are DIGEST_NONE/PAD_NONE.
   1766     params->push_back(TAG_DIGEST, Digest::NONE);
   1767     params->push_back(TAG_PADDING, PaddingMode::NONE);
   1768 
   1769     // Look up the algorithm of the key.
   1770     KeyCharacteristics characteristics;
   1771     auto rc = getKeyCharacteristics(name, hidl_vec<uint8_t>(), hidl_vec<uint8_t>(), UID_SELF,
   1772                                     &characteristics);
   1773     if (!rc.isOk()) {
   1774         ALOGE("Failed to get key characteristics");
   1775         return;
   1776     }
   1777     auto algorithm = getKeyAlgoritmFromKeyCharacteristics(characteristics);
   1778     if (!algorithm.isOk()) {
   1779         ALOGE("getKeyCharacteristics did not include KM_TAG_ALGORITHM");
   1780         return;
   1781     }
   1782     params->push_back(TAG_ALGORITHM, algorithm.value());
   1783 }
   1784 
   1785 KeyStoreServiceReturnCode KeyStoreService::doLegacySignVerify(const String16& name,
   1786                                                               const hidl_vec<uint8_t>& data,
   1787                                                               hidl_vec<uint8_t>* out,
   1788                                                               const hidl_vec<uint8_t>& signature,
   1789                                                               KeyPurpose purpose) {
   1790 
   1791     std::basic_stringstream<uint8_t> outBuffer;
   1792     OperationResult result;
   1793     AuthorizationSet inArgs;
   1794     addLegacyBeginParams(name, &inArgs);
   1795     sp<IBinder> appToken(new BBinder);
   1796     sp<IBinder> token;
   1797 
   1798     begin(appToken, name, purpose, true, inArgs.hidl_data(), hidl_vec<uint8_t>(), UID_SELF,
   1799           &result);
   1800     if (!result.resultCode.isOk()) {
   1801         if (result.resultCode == ResponseCode::KEY_NOT_FOUND) {
   1802             ALOGW("Key not found");
   1803         } else {
   1804             ALOGW("Error in begin: %d", int32_t(result.resultCode));
   1805         }
   1806         return translateResultToLegacyResult(result.resultCode);
   1807     }
   1808     inArgs.Clear();
   1809     token = result.token;
   1810     size_t consumed = 0;
   1811     size_t lastConsumed = 0;
   1812     hidl_vec<uint8_t> data_view;
   1813     do {
   1814         data_view.setToExternal(const_cast<uint8_t*>(&data[consumed]), data.size() - consumed);
   1815         update(token, inArgs.hidl_data(), data_view, &result);
   1816         if (result.resultCode != ResponseCode::NO_ERROR) {
   1817             ALOGW("Error in update: %d", int32_t(result.resultCode));
   1818             return translateResultToLegacyResult(result.resultCode);
   1819         }
   1820         if (out) {
   1821             outBuffer.write(&result.data[0], result.data.size());
   1822         }
   1823         lastConsumed = result.inputConsumed;
   1824         consumed += lastConsumed;
   1825     } while (consumed < data.size() && lastConsumed > 0);
   1826 
   1827     if (consumed != data.size()) {
   1828         ALOGW("Not all data consumed. Consumed %zu of %zu", consumed, data.size());
   1829         return ResponseCode::SYSTEM_ERROR;
   1830     }
   1831 
   1832     finish(token, inArgs.hidl_data(), signature, hidl_vec<uint8_t>(), &result);
   1833     if (result.resultCode != ResponseCode::NO_ERROR) {
   1834         ALOGW("Error in finish: %d", int32_t(result.resultCode));
   1835         return translateResultToLegacyResult(result.resultCode);
   1836     }
   1837     if (out) {
   1838         outBuffer.write(&result.data[0], result.data.size());
   1839     }
   1840 
   1841     if (out) {
   1842         auto buf = outBuffer.str();
   1843         out->resize(buf.size());
   1844         memcpy(&(*out)[0], buf.data(), out->size());
   1845     }
   1846 
   1847     return ResponseCode::NO_ERROR;
   1848 }
   1849 
   1850 KeyStoreServiceReturnCode KeyStoreService::upgradeKeyBlob(const String16& name, uid_t uid,
   1851                                                           const AuthorizationSet& params,
   1852                                                           Blob* blob) {
   1853     // Read the blob rather than assuming the caller provided the right name/uid/blob triplet.
   1854     String8 name8(name);
   1855     ResponseCode responseCode = mKeyStore->getKeyForName(blob, name8, uid, TYPE_KEYMASTER_10);
   1856     if (responseCode != ResponseCode::NO_ERROR) {
   1857         return responseCode;
   1858     }
   1859     ALOGI("upgradeKeyBlob %s %d", name8.string(), uid);
   1860 
   1861     auto hidlKey = blob2hidlVec(*blob);
   1862     auto& dev = mKeyStore->getDevice(*blob);
   1863 
   1864     KeyStoreServiceReturnCode error;
   1865     auto hidlCb = [&](ErrorCode ret, const hidl_vec<uint8_t>& upgradedKeyBlob) {
   1866         error = ret;
   1867         if (!error.isOk()) {
   1868             return;
   1869         }
   1870 
   1871         String8 filename(mKeyStore->getKeyNameForUidWithDir(name8, uid, ::TYPE_KEYMASTER_10));
   1872         error = mKeyStore->del(filename.string(), ::TYPE_ANY, get_user_id(uid));
   1873         if (!error.isOk()) {
   1874             ALOGI("upgradeKeyBlob keystore->del failed %d", (int)error);
   1875             return;
   1876         }
   1877 
   1878         Blob newBlob(&upgradedKeyBlob[0], upgradedKeyBlob.size(), nullptr /* info */,
   1879                      0 /* infoLength */, ::TYPE_KEYMASTER_10);
   1880         newBlob.setFallback(blob->isFallback());
   1881         newBlob.setEncrypted(blob->isEncrypted());
   1882         newBlob.setSuperEncrypted(blob->isSuperEncrypted());
   1883         newBlob.setCriticalToDeviceEncryption(blob->isCriticalToDeviceEncryption());
   1884 
   1885         error = mKeyStore->put(filename.string(), &newBlob, get_user_id(uid));
   1886         if (!error.isOk()) {
   1887             ALOGI("upgradeKeyBlob keystore->put failed %d", (int)error);
   1888             return;
   1889         }
   1890 
   1891         // Re-read blob for caller.  We can't use newBlob because writing it modified it.
   1892         error = mKeyStore->getKeyForName(blob, name8, uid, TYPE_KEYMASTER_10);
   1893     };
   1894 
   1895     KeyStoreServiceReturnCode rc =
   1896         KS_HANDLE_HIDL_ERROR(dev->upgradeKey(hidlKey, params.hidl_data(), hidlCb));
   1897     if (!rc.isOk()) {
   1898         return rc;
   1899     }
   1900 
   1901     return error;
   1902 }
   1903 
   1904 }  // namespace keystore
   1905