Home | History | Annotate | Download | only in keystore
      1 // Copyright 2015 The Android Open Source Project
      2 //
      3 // Licensed under the Apache License, Version 2.0 (the "License");
      4 // you may not use this file except in compliance with the License.
      5 // You may obtain a copy of the License at
      6 //
      7 //      http://www.apache.org/licenses/LICENSE-2.0
      8 //
      9 // Unless required by applicable law or agreed to in writing, software
     10 // distributed under the License is distributed on an "AS IS" BASIS,
     11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     12 // See the License for the specific language governing permissions and
     13 // limitations under the License.
     14 
     15 #define LOG_TAG "keystore_client"
     16 
     17 #include "keystore/keystore_client_impl.h"
     18 
     19 #include <string>
     20 #include <vector>
     21 
     22 #include "binder/IBinder.h"
     23 #include "binder/IInterface.h"
     24 #include "binder/IServiceManager.h"
     25 #include "keystore/IKeystoreService.h"
     26 #include "keystore/keystore.h"
     27 #include "log/log.h"
     28 #include "utils/String16.h"
     29 #include "utils/String8.h"
     30 
     31 #include "keystore_client.pb.h"
     32 
     33 using android::ExportResult;
     34 using android::KeyCharacteristics;
     35 using android::KeymasterArguments;
     36 using android::OperationResult;
     37 using android::String16;
     38 using keymaster::AuthorizationSet;
     39 using keymaster::AuthorizationSetBuilder;
     40 
     41 namespace {
     42 
     43 // Use the UID of the current process.
     44 const int kDefaultUID = -1;
     45 const char kEncryptSuffix[] = "_ENC";
     46 const char kAuthenticateSuffix[] = "_AUTH";
     47 const uint32_t kAESKeySize = 256;      // bits
     48 const uint32_t kHMACKeySize = 256;     // bits
     49 const uint32_t kHMACOutputSize = 256;  // bits
     50 
     51 const uint8_t* StringAsByteArray(const std::string& s) {
     52     return reinterpret_cast<const uint8_t*>(s.data());
     53 }
     54 
     55 std::string ByteArrayAsString(const uint8_t* data, size_t data_size) {
     56     return std::string(reinterpret_cast<const char*>(data), data_size);
     57 }
     58 
     59 void CopyParameters(const AuthorizationSet& in, std::vector<keymaster_key_param_t>* out) {
     60   keymaster_key_param_set_t tmp;
     61   in.CopyToParamSet(&tmp);
     62   out->assign(&tmp.params[0], &tmp.params[tmp.length]);
     63   free(tmp.params);
     64 }
     65 
     66 }  // namespace
     67 
     68 namespace keystore {
     69 
     70 KeystoreClientImpl::KeystoreClientImpl() {
     71     service_manager_ = android::defaultServiceManager();
     72     keystore_binder_ = service_manager_->getService(String16("android.security.keystore"));
     73     keystore_ = android::interface_cast<android::IKeystoreService>(keystore_binder_);
     74 }
     75 
     76 bool KeystoreClientImpl::encryptWithAuthentication(const std::string& key_name,
     77                                                    const std::string& data,
     78                                                    std::string* encrypted_data) {
     79     // The encryption algorithm is AES-256-CBC with PKCS #7 padding and a random
     80     // IV. The authentication algorithm is HMAC-SHA256 and is computed over the
     81     // cipher-text (i.e. Encrypt-then-MAC approach). This was chosen over AES-GCM
     82     // because hardware support for GCM is not mandatory for all Brillo devices.
     83     std::string encryption_key_name = key_name + kEncryptSuffix;
     84     if (!createOrVerifyEncryptionKey(encryption_key_name)) {
     85         return false;
     86     }
     87     std::string authentication_key_name = key_name + kAuthenticateSuffix;
     88     if (!createOrVerifyAuthenticationKey(authentication_key_name)) {
     89         return false;
     90     }
     91     AuthorizationSetBuilder encrypt_params;
     92     encrypt_params.Padding(KM_PAD_PKCS7);
     93     encrypt_params.Authorization(keymaster::TAG_BLOCK_MODE, KM_MODE_CBC);
     94     AuthorizationSet output_params;
     95     std::string raw_encrypted_data;
     96     if (!oneShotOperation(KM_PURPOSE_ENCRYPT, encryption_key_name, encrypt_params.build(), data,
     97                           std::string(), /* signature_to_verify */
     98                           &output_params, &raw_encrypted_data)) {
     99         ALOGE("Encrypt: AES operation failed.");
    100         return false;
    101     }
    102     keymaster_blob_t init_vector_blob;
    103     if (!output_params.GetTagValue(keymaster::TAG_NONCE, &init_vector_blob)) {
    104         ALOGE("Encrypt: Missing initialization vector.");
    105         return false;
    106     }
    107     std::string init_vector =
    108         ByteArrayAsString(init_vector_blob.data, init_vector_blob.data_length);
    109 
    110     AuthorizationSetBuilder authenticate_params;
    111     authenticate_params.Digest(KM_DIGEST_SHA_2_256);
    112     authenticate_params.Authorization(keymaster::TAG_MAC_LENGTH, kHMACOutputSize);
    113     std::string raw_authentication_data;
    114     if (!oneShotOperation(KM_PURPOSE_SIGN, authentication_key_name, authenticate_params.build(),
    115                           init_vector + raw_encrypted_data, std::string(), /* signature_to_verify */
    116                           &output_params, &raw_authentication_data)) {
    117         ALOGE("Encrypt: HMAC operation failed.");
    118         return false;
    119     }
    120     EncryptedData protobuf;
    121     protobuf.set_init_vector(init_vector);
    122     protobuf.set_authentication_data(raw_authentication_data);
    123     protobuf.set_encrypted_data(raw_encrypted_data);
    124     if (!protobuf.SerializeToString(encrypted_data)) {
    125         ALOGE("Encrypt: Failed to serialize EncryptedData protobuf.");
    126         return false;
    127     }
    128     return true;
    129 }
    130 
    131 bool KeystoreClientImpl::decryptWithAuthentication(const std::string& key_name,
    132                                                    const std::string& encrypted_data,
    133                                                    std::string* data) {
    134     EncryptedData protobuf;
    135     if (!protobuf.ParseFromString(encrypted_data)) {
    136         ALOGE("Decrypt: Failed to parse EncryptedData protobuf.");
    137     }
    138     // Verify authentication before attempting decryption.
    139     std::string authentication_key_name = key_name + kAuthenticateSuffix;
    140     AuthorizationSetBuilder authenticate_params;
    141     authenticate_params.Digest(KM_DIGEST_SHA_2_256);
    142     AuthorizationSet output_params;
    143     std::string output_data;
    144     if (!oneShotOperation(KM_PURPOSE_VERIFY, authentication_key_name, authenticate_params.build(),
    145                           protobuf.init_vector() + protobuf.encrypted_data(),
    146                           protobuf.authentication_data(), &output_params, &output_data)) {
    147         ALOGE("Decrypt: HMAC operation failed.");
    148         return false;
    149     }
    150     std::string encryption_key_name = key_name + kEncryptSuffix;
    151     AuthorizationSetBuilder encrypt_params;
    152     encrypt_params.Padding(KM_PAD_PKCS7);
    153     encrypt_params.Authorization(keymaster::TAG_BLOCK_MODE, KM_MODE_CBC);
    154     encrypt_params.Authorization(keymaster::TAG_NONCE, protobuf.init_vector().data(),
    155                                  protobuf.init_vector().size());
    156     if (!oneShotOperation(KM_PURPOSE_DECRYPT, encryption_key_name, encrypt_params.build(),
    157                           protobuf.encrypted_data(), std::string(), /* signature_to_verify */
    158                           &output_params, data)) {
    159         ALOGE("Decrypt: AES operation failed.");
    160         return false;
    161     }
    162     return true;
    163 }
    164 
    165 bool KeystoreClientImpl::oneShotOperation(keymaster_purpose_t purpose, const std::string& key_name,
    166                                           const keymaster::AuthorizationSet& input_parameters,
    167                                           const std::string& input_data,
    168                                           const std::string& signature_to_verify,
    169                                           keymaster::AuthorizationSet* output_parameters,
    170                                           std::string* output_data) {
    171     keymaster_operation_handle_t handle;
    172     int32_t result =
    173         beginOperation(purpose, key_name, input_parameters, output_parameters, &handle);
    174     if (result != KM_ERROR_OK) {
    175         ALOGE("BeginOperation failed: %d", result);
    176         return false;
    177     }
    178     AuthorizationSet empty_params;
    179     size_t num_input_bytes_consumed;
    180     AuthorizationSet ignored_params;
    181     result = updateOperation(handle, empty_params, input_data, &num_input_bytes_consumed,
    182                              &ignored_params, output_data);
    183     if (result != KM_ERROR_OK) {
    184         ALOGE("UpdateOperation failed: %d", result);
    185         return false;
    186     }
    187     result =
    188         finishOperation(handle, empty_params, signature_to_verify, &ignored_params, output_data);
    189     if (result != KM_ERROR_OK) {
    190         ALOGE("FinishOperation failed: %d", result);
    191         return false;
    192     }
    193     return true;
    194 }
    195 
    196 int32_t KeystoreClientImpl::addRandomNumberGeneratorEntropy(const std::string& entropy) {
    197     return mapKeystoreError(keystore_->addRngEntropy(StringAsByteArray(entropy), entropy.size()));
    198 }
    199 
    200 int32_t KeystoreClientImpl::generateKey(const std::string& key_name,
    201                                         const AuthorizationSet& key_parameters,
    202                                         AuthorizationSet* hardware_enforced_characteristics,
    203                                         AuthorizationSet* software_enforced_characteristics) {
    204     String16 key_name16(key_name.data(), key_name.size());
    205     KeymasterArguments key_arguments;
    206     CopyParameters(key_parameters, &key_arguments.params);
    207     KeyCharacteristics characteristics;
    208     int32_t result =
    209         keystore_->generateKey(key_name16, key_arguments, NULL /*entropy*/, 0 /*entropyLength*/,
    210                                kDefaultUID, KEYSTORE_FLAG_NONE, &characteristics);
    211     hardware_enforced_characteristics->Reinitialize(characteristics.characteristics.hw_enforced);
    212     software_enforced_characteristics->Reinitialize(characteristics.characteristics.sw_enforced);
    213     return mapKeystoreError(result);
    214 }
    215 
    216 int32_t
    217 KeystoreClientImpl::getKeyCharacteristics(const std::string& key_name,
    218                                           AuthorizationSet* hardware_enforced_characteristics,
    219                                           AuthorizationSet* software_enforced_characteristics) {
    220     String16 key_name16(key_name.data(), key_name.size());
    221     keymaster_blob_t client_id_blob = {nullptr, 0};
    222     keymaster_blob_t app_data_blob = {nullptr, 0};
    223     KeyCharacteristics characteristics;
    224     int32_t result = keystore_->getKeyCharacteristics(key_name16, &client_id_blob, &app_data_blob,
    225                                                       kDefaultUID, &characteristics);
    226     hardware_enforced_characteristics->Reinitialize(characteristics.characteristics.hw_enforced);
    227     software_enforced_characteristics->Reinitialize(characteristics.characteristics.sw_enforced);
    228     return mapKeystoreError(result);
    229 }
    230 
    231 int32_t KeystoreClientImpl::importKey(const std::string& key_name,
    232                                       const AuthorizationSet& key_parameters,
    233                                       keymaster_key_format_t key_format,
    234                                       const std::string& key_data,
    235                                       AuthorizationSet* hardware_enforced_characteristics,
    236                                       AuthorizationSet* software_enforced_characteristics) {
    237     String16 key_name16(key_name.data(), key_name.size());
    238     KeymasterArguments key_arguments;
    239     CopyParameters(key_parameters, &key_arguments.params);
    240     KeyCharacteristics characteristics;
    241     int32_t result =
    242         keystore_->importKey(key_name16, key_arguments, key_format, StringAsByteArray(key_data),
    243                              key_data.size(), kDefaultUID, KEYSTORE_FLAG_NONE, &characteristics);
    244     hardware_enforced_characteristics->Reinitialize(characteristics.characteristics.hw_enforced);
    245     software_enforced_characteristics->Reinitialize(characteristics.characteristics.sw_enforced);
    246     return mapKeystoreError(result);
    247 }
    248 
    249 int32_t KeystoreClientImpl::exportKey(keymaster_key_format_t export_format,
    250                                       const std::string& key_name, std::string* export_data) {
    251     String16 key_name16(key_name.data(), key_name.size());
    252     keymaster_blob_t client_id_blob = {nullptr, 0};
    253     keymaster_blob_t app_data_blob = {nullptr, 0};
    254     ExportResult export_result;
    255     keystore_->exportKey(key_name16, export_format, &client_id_blob, &app_data_blob,
    256                          kDefaultUID, &export_result);
    257     *export_data = ByteArrayAsString(export_result.exportData.get(), export_result.dataLength);
    258     return mapKeystoreError(export_result.resultCode);
    259 }
    260 
    261 int32_t KeystoreClientImpl::deleteKey(const std::string& key_name) {
    262     String16 key_name16(key_name.data(), key_name.size());
    263     return mapKeystoreError(keystore_->del(key_name16, kDefaultUID));
    264 }
    265 
    266 int32_t KeystoreClientImpl::deleteAllKeys() {
    267     return mapKeystoreError(keystore_->clear_uid(kDefaultUID));
    268 }
    269 
    270 int32_t KeystoreClientImpl::beginOperation(keymaster_purpose_t purpose, const std::string& key_name,
    271                                            const AuthorizationSet& input_parameters,
    272                                            AuthorizationSet* output_parameters,
    273                                            keymaster_operation_handle_t* handle) {
    274     android::sp<android::IBinder> token(new android::BBinder);
    275     String16 key_name16(key_name.data(), key_name.size());
    276     KeymasterArguments input_arguments;
    277     CopyParameters(input_parameters, &input_arguments.params);
    278     OperationResult result;
    279     keystore_->begin(token, key_name16, purpose, true /*pruneable*/, input_arguments,
    280                      NULL /*entropy*/, 0 /*entropyLength*/, kDefaultUID, &result);
    281     int32_t error_code = mapKeystoreError(result.resultCode);
    282     if (error_code == KM_ERROR_OK) {
    283         *handle = getNextVirtualHandle();
    284         active_operations_[*handle] = result.token;
    285         if (!result.outParams.params.empty()) {
    286             output_parameters->Reinitialize(&*result.outParams.params.begin(),
    287                                             result.outParams.params.size());
    288         }
    289     }
    290     return error_code;
    291 }
    292 
    293 int32_t KeystoreClientImpl::updateOperation(keymaster_operation_handle_t handle,
    294                                             const AuthorizationSet& input_parameters,
    295                                             const std::string& input_data,
    296                                             size_t* num_input_bytes_consumed,
    297                                             AuthorizationSet* output_parameters,
    298                                             std::string* output_data) {
    299     if (active_operations_.count(handle) == 0) {
    300         return KM_ERROR_INVALID_OPERATION_HANDLE;
    301     }
    302     KeymasterArguments input_arguments;
    303     CopyParameters(input_parameters, &input_arguments.params);
    304     OperationResult result;
    305     keystore_->update(active_operations_[handle], input_arguments, StringAsByteArray(input_data),
    306                       input_data.size(), &result);
    307     int32_t error_code = mapKeystoreError(result.resultCode);
    308     if (error_code == KM_ERROR_OK) {
    309         *num_input_bytes_consumed = result.inputConsumed;
    310         if (!result.outParams.params.empty()) {
    311             output_parameters->Reinitialize(&*result.outParams.params.begin(),
    312                                             result.outParams.params.size());
    313         }
    314         output_data->append(ByteArrayAsString(result.data.get(), result.dataLength));
    315     }
    316     return error_code;
    317 }
    318 
    319 int32_t KeystoreClientImpl::finishOperation(keymaster_operation_handle_t handle,
    320                                             const AuthorizationSet& input_parameters,
    321                                             const std::string& signature_to_verify,
    322                                             AuthorizationSet* output_parameters,
    323                                             std::string* output_data) {
    324     if (active_operations_.count(handle) == 0) {
    325         return KM_ERROR_INVALID_OPERATION_HANDLE;
    326     }
    327     KeymasterArguments input_arguments;
    328     CopyParameters(input_parameters, &input_arguments.params);
    329     OperationResult result;
    330     keystore_->finish(active_operations_[handle], input_arguments,
    331                       StringAsByteArray(signature_to_verify), signature_to_verify.size(),
    332                       NULL /*entropy*/, 0 /*entropyLength*/, &result);
    333     int32_t error_code = mapKeystoreError(result.resultCode);
    334     if (error_code == KM_ERROR_OK) {
    335         if (!result.outParams.params.empty()) {
    336             output_parameters->Reinitialize(&*result.outParams.params.begin(),
    337                                             result.outParams.params.size());
    338         }
    339         output_data->append(ByteArrayAsString(result.data.get(), result.dataLength));
    340         active_operations_.erase(handle);
    341     }
    342     return error_code;
    343 }
    344 
    345 int32_t KeystoreClientImpl::abortOperation(keymaster_operation_handle_t handle) {
    346     if (active_operations_.count(handle) == 0) {
    347         return KM_ERROR_INVALID_OPERATION_HANDLE;
    348     }
    349     int32_t error_code = mapKeystoreError(keystore_->abort(active_operations_[handle]));
    350     if (error_code == KM_ERROR_OK) {
    351         active_operations_.erase(handle);
    352     }
    353     return error_code;
    354 }
    355 
    356 bool KeystoreClientImpl::doesKeyExist(const std::string& key_name) {
    357     String16 key_name16(key_name.data(), key_name.size());
    358     int32_t error_code = mapKeystoreError(keystore_->exist(key_name16, kDefaultUID));
    359     return (error_code == KM_ERROR_OK);
    360 }
    361 
    362 bool KeystoreClientImpl::listKeys(const std::string& prefix,
    363                                   std::vector<std::string>* key_name_list) {
    364     String16 prefix16(prefix.data(), prefix.size());
    365     android::Vector<String16> matches;
    366     int32_t error_code = mapKeystoreError(keystore_->list(prefix16, kDefaultUID, &matches));
    367     if (error_code == KM_ERROR_OK) {
    368         for (const auto& match : matches) {
    369             android::String8 key_name(match);
    370             key_name_list->push_back(prefix + std::string(key_name.string(), key_name.size()));
    371         }
    372         return true;
    373     }
    374     return false;
    375 }
    376 
    377 keymaster_operation_handle_t KeystoreClientImpl::getNextVirtualHandle() {
    378     return next_virtual_handle_++;
    379 }
    380 
    381 int32_t KeystoreClientImpl::mapKeystoreError(int32_t keystore_error) {
    382     // See notes in keystore_client.h for rationale.
    383     if (keystore_error == ::NO_ERROR) {
    384         return KM_ERROR_OK;
    385     }
    386     return keystore_error;
    387 }
    388 
    389 bool KeystoreClientImpl::createOrVerifyEncryptionKey(const std::string& key_name) {
    390     bool key_exists = doesKeyExist(key_name);
    391     if (key_exists) {
    392         bool verified = false;
    393         if (!verifyEncryptionKeyAttributes(key_name, &verified)) {
    394             return false;
    395         }
    396         if (!verified) {
    397             int32_t result = deleteKey(key_name);
    398             if (result != KM_ERROR_OK) {
    399                 ALOGE("Failed to delete invalid encryption key: %d", result);
    400                 return false;
    401             }
    402             key_exists = false;
    403         }
    404     }
    405     if (!key_exists) {
    406         AuthorizationSetBuilder key_parameters;
    407         key_parameters.AesEncryptionKey(kAESKeySize)
    408             .Padding(KM_PAD_PKCS7)
    409             .Authorization(keymaster::TAG_BLOCK_MODE, KM_MODE_CBC)
    410             .Authorization(keymaster::TAG_NO_AUTH_REQUIRED);
    411         AuthorizationSet hardware_enforced_characteristics;
    412         AuthorizationSet software_enforced_characteristics;
    413         int32_t result =
    414             generateKey(key_name, key_parameters.build(), &hardware_enforced_characteristics,
    415                         &software_enforced_characteristics);
    416         if (result != KM_ERROR_OK) {
    417             ALOGE("Failed to generate encryption key: %d", result);
    418             return false;
    419         }
    420         if (hardware_enforced_characteristics.size() == 0) {
    421             ALOGW("WARNING: Encryption key is not hardware-backed.");
    422         }
    423     }
    424     return true;
    425 }
    426 
    427 bool KeystoreClientImpl::createOrVerifyAuthenticationKey(const std::string& key_name) {
    428     bool key_exists = doesKeyExist(key_name);
    429     if (key_exists) {
    430         bool verified = false;
    431         if (!verifyAuthenticationKeyAttributes(key_name, &verified)) {
    432             return false;
    433         }
    434         if (!verified) {
    435             int32_t result = deleteKey(key_name);
    436             if (result != KM_ERROR_OK) {
    437                 ALOGE("Failed to delete invalid authentication key: %d", result);
    438                 return false;
    439             }
    440             key_exists = false;
    441         }
    442     }
    443     if (!key_exists) {
    444         AuthorizationSetBuilder key_parameters;
    445         key_parameters.HmacKey(kHMACKeySize)
    446             .Digest(KM_DIGEST_SHA_2_256)
    447             .Authorization(keymaster::TAG_MIN_MAC_LENGTH, kHMACOutputSize)
    448             .Authorization(keymaster::TAG_NO_AUTH_REQUIRED);
    449         AuthorizationSet hardware_enforced_characteristics;
    450         AuthorizationSet software_enforced_characteristics;
    451         int32_t result =
    452             generateKey(key_name, key_parameters.build(), &hardware_enforced_characteristics,
    453                         &software_enforced_characteristics);
    454         if (result != KM_ERROR_OK) {
    455             ALOGE("Failed to generate authentication key: %d", result);
    456             return false;
    457         }
    458         if (hardware_enforced_characteristics.size() == 0) {
    459             ALOGW("WARNING: Authentication key is not hardware-backed.");
    460         }
    461     }
    462     return true;
    463 }
    464 
    465 bool KeystoreClientImpl::verifyEncryptionKeyAttributes(const std::string& key_name,
    466                                                        bool* verified) {
    467     AuthorizationSet hardware_enforced_characteristics;
    468     AuthorizationSet software_enforced_characteristics;
    469     int32_t result = getKeyCharacteristics(key_name, &hardware_enforced_characteristics,
    470                                            &software_enforced_characteristics);
    471     if (result != KM_ERROR_OK) {
    472         ALOGE("Failed to query encryption key: %d", result);
    473         return false;
    474     }
    475     *verified = true;
    476     keymaster_algorithm_t algorithm = KM_ALGORITHM_RSA;
    477     if ((!hardware_enforced_characteristics.GetTagValue(keymaster::TAG_ALGORITHM, &algorithm) &&
    478          !software_enforced_characteristics.GetTagValue(keymaster::TAG_ALGORITHM, &algorithm)) ||
    479         algorithm != KM_ALGORITHM_AES) {
    480         ALOGW("Found encryption key with invalid algorithm.");
    481         *verified = false;
    482     }
    483     uint32_t key_size = 0;
    484     if ((!hardware_enforced_characteristics.GetTagValue(keymaster::TAG_KEY_SIZE, &key_size) &&
    485          !software_enforced_characteristics.GetTagValue(keymaster::TAG_KEY_SIZE, &key_size)) ||
    486         key_size != kAESKeySize) {
    487         ALOGW("Found encryption key with invalid size.");
    488         *verified = false;
    489     }
    490     keymaster_block_mode_t block_mode = KM_MODE_ECB;
    491     if ((!hardware_enforced_characteristics.GetTagValue(keymaster::TAG_BLOCK_MODE, &block_mode) &&
    492          !software_enforced_characteristics.GetTagValue(keymaster::TAG_BLOCK_MODE, &block_mode)) ||
    493         block_mode != KM_MODE_CBC) {
    494         ALOGW("Found encryption key with invalid block mode.");
    495         *verified = false;
    496     }
    497     keymaster_padding_t padding_mode = KM_PAD_NONE;
    498     if ((!hardware_enforced_characteristics.GetTagValue(keymaster::TAG_PADDING, &padding_mode) &&
    499          !software_enforced_characteristics.GetTagValue(keymaster::TAG_PADDING, &padding_mode)) ||
    500         padding_mode != KM_PAD_PKCS7) {
    501         ALOGW("Found encryption key with invalid padding mode.");
    502         *verified = false;
    503     }
    504     if (hardware_enforced_characteristics.size() == 0) {
    505         ALOGW("WARNING: Encryption key is not hardware-backed.");
    506     }
    507     return true;
    508 }
    509 
    510 bool KeystoreClientImpl::verifyAuthenticationKeyAttributes(const std::string& key_name,
    511                                                            bool* verified) {
    512     AuthorizationSet hardware_enforced_characteristics;
    513     AuthorizationSet software_enforced_characteristics;
    514     int32_t result = getKeyCharacteristics(key_name, &hardware_enforced_characteristics,
    515                                            &software_enforced_characteristics);
    516     if (result != KM_ERROR_OK) {
    517         ALOGE("Failed to query authentication key: %d", result);
    518         return false;
    519     }
    520     *verified = true;
    521     keymaster_algorithm_t algorithm = KM_ALGORITHM_RSA;
    522     if ((!hardware_enforced_characteristics.GetTagValue(keymaster::TAG_ALGORITHM, &algorithm) &&
    523          !software_enforced_characteristics.GetTagValue(keymaster::TAG_ALGORITHM, &algorithm)) ||
    524         algorithm != KM_ALGORITHM_HMAC) {
    525         ALOGW("Found authentication key with invalid algorithm.");
    526         *verified = false;
    527     }
    528     uint32_t key_size = 0;
    529     if ((!hardware_enforced_characteristics.GetTagValue(keymaster::TAG_KEY_SIZE, &key_size) &&
    530          !software_enforced_characteristics.GetTagValue(keymaster::TAG_KEY_SIZE, &key_size)) ||
    531         key_size != kHMACKeySize) {
    532         ALOGW("Found authentication key with invalid size.");
    533         *verified = false;
    534     }
    535     uint32_t mac_size = 0;
    536     if ((!hardware_enforced_characteristics.GetTagValue(keymaster::TAG_MIN_MAC_LENGTH, &mac_size) &&
    537          !software_enforced_characteristics.GetTagValue(keymaster::TAG_MIN_MAC_LENGTH,
    538                                                         &mac_size)) ||
    539         mac_size != kHMACOutputSize) {
    540         ALOGW("Found authentication key with invalid minimum mac size.");
    541         *verified = false;
    542     }
    543     keymaster_digest_t digest = KM_DIGEST_NONE;
    544     if ((!hardware_enforced_characteristics.GetTagValue(keymaster::TAG_DIGEST, &digest) &&
    545          !software_enforced_characteristics.GetTagValue(keymaster::TAG_DIGEST, &digest)) ||
    546         digest != KM_DIGEST_SHA_2_256) {
    547         ALOGW("Found authentication key with invalid digest list.");
    548         *verified = false;
    549     }
    550     if (hardware_enforced_characteristics.size() == 0) {
    551         ALOGW("WARNING: Authentication key is not hardware-backed.");
    552     }
    553     return true;
    554 }
    555 
    556 }  // namespace keystore
    557