Home | History | Annotate | Download | only in android_keymaster
      1 /*
      2  * Copyright 2014 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 #include <keymaster/android_keymaster.h>
     18 
     19 #include <assert.h>
     20 #include <string.h>
     21 
     22 #include <stddef.h>
     23 
     24 #include <keymaster/UniquePtr.h>
     25 #include <keymaster/android_keymaster_utils.h>
     26 #include <keymaster/key.h>
     27 #include <keymaster/key_blob_utils/ae.h>
     28 #include <keymaster/key_factory.h>
     29 #include <keymaster/keymaster_context.h>
     30 #include <keymaster/km_openssl/openssl_err.h>
     31 #include <keymaster/operation.h>
     32 #include <keymaster/operation_table.h>
     33 
     34 namespace keymaster {
     35 
     36 namespace {
     37 
     38 const uint8_t MAJOR_VER = 2;
     39 const uint8_t MINOR_VER = 0;
     40 const uint8_t SUBMINOR_VER = 0;
     41 
     42 keymaster_error_t CheckVersionInfo(const AuthorizationSet& tee_enforced,
     43                                    const AuthorizationSet& sw_enforced,
     44                                    const KeymasterContext& context) {
     45     uint32_t os_version;
     46     uint32_t os_patchlevel;
     47     context.GetSystemVersion(&os_version, &os_patchlevel);
     48 
     49     uint32_t key_os_patchlevel;
     50     if (tee_enforced.GetTagValue(TAG_OS_PATCHLEVEL, &key_os_patchlevel) ||
     51         sw_enforced.GetTagValue(TAG_OS_PATCHLEVEL, &key_os_patchlevel)) {
     52         if (key_os_patchlevel < os_patchlevel)
     53             return KM_ERROR_KEY_REQUIRES_UPGRADE;
     54         else if (key_os_patchlevel > os_patchlevel)
     55             return KM_ERROR_INVALID_KEY_BLOB;
     56     }
     57 
     58     return KM_ERROR_OK;
     59 }
     60 
     61 }  // anonymous namespace
     62 
     63 AndroidKeymaster::AndroidKeymaster(KeymasterContext* context, size_t operation_table_size)
     64     : context_(context), operation_table_(new(std::nothrow) OperationTable(operation_table_size)) {}
     65 
     66 AndroidKeymaster::~AndroidKeymaster() {}
     67 
     68 AndroidKeymaster::AndroidKeymaster(AndroidKeymaster&& other)
     69     : context_(move(other.context_)), operation_table_(move(other.operation_table_)) {}
     70 
     71 // TODO(swillden): Unify support analysis.  Right now, we have per-keytype methods that determine if
     72 // specific modes, padding, etc. are supported for that key type, and AndroidKeymaster also has
     73 // methods that return the same information.  They'll get out of sync.  Best to put the knowledge in
     74 // the keytypes and provide some mechanism for AndroidKeymaster to query the keytypes for the
     75 // information.
     76 
     77 template <typename T>
     78 bool check_supported(const KeymasterContext& context, keymaster_algorithm_t algorithm,
     79                      SupportedResponse<T>* response) {
     80     if (context.GetKeyFactory(algorithm) == NULL) {
     81         response->error = KM_ERROR_UNSUPPORTED_ALGORITHM;
     82         return false;
     83     }
     84     return true;
     85 }
     86 
     87 void AndroidKeymaster::GetVersion(const GetVersionRequest&, GetVersionResponse* rsp) {
     88     if (rsp == NULL)
     89         return;
     90 
     91     rsp->major_ver = MAJOR_VER;
     92     rsp->minor_ver = MINOR_VER;
     93     rsp->subminor_ver = SUBMINOR_VER;
     94     rsp->error = KM_ERROR_OK;
     95 }
     96 
     97 void AndroidKeymaster::SupportedAlgorithms(const SupportedAlgorithmsRequest& /* request */,
     98                                            SupportedAlgorithmsResponse* response) {
     99     if (response == NULL)
    100         return;
    101 
    102     response->error = KM_ERROR_OK;
    103 
    104     size_t algorithm_count = 0;
    105     const keymaster_algorithm_t* algorithms = context_->GetSupportedAlgorithms(&algorithm_count);
    106     if (algorithm_count == 0)
    107         return;
    108     response->results_length = algorithm_count;
    109     response->results = dup_array(algorithms, algorithm_count);
    110     if (!response->results)
    111         response->error = KM_ERROR_MEMORY_ALLOCATION_FAILED;
    112 }
    113 
    114 template <typename T>
    115 void GetSupported(const KeymasterContext& context, keymaster_algorithm_t algorithm,
    116                   keymaster_purpose_t purpose,
    117                   const T* (OperationFactory::*get_supported_method)(size_t* count) const,
    118                   SupportedResponse<T>* response) {
    119     if (response == NULL || !check_supported(context, algorithm, response))
    120         return;
    121 
    122     const OperationFactory* factory = context.GetOperationFactory(algorithm, purpose);
    123     if (!factory) {
    124         response->error = KM_ERROR_UNSUPPORTED_PURPOSE;
    125         return;
    126     }
    127 
    128     size_t count;
    129     const T* supported = (factory->*get_supported_method)(&count);
    130     response->SetResults(supported, count);
    131 }
    132 
    133 void AndroidKeymaster::SupportedBlockModes(const SupportedBlockModesRequest& request,
    134                                            SupportedBlockModesResponse* response) {
    135     GetSupported(*context_, request.algorithm, request.purpose,
    136                  &OperationFactory::SupportedBlockModes, response);
    137 }
    138 
    139 void AndroidKeymaster::SupportedPaddingModes(const SupportedPaddingModesRequest& request,
    140                                              SupportedPaddingModesResponse* response) {
    141     GetSupported(*context_, request.algorithm, request.purpose,
    142                  &OperationFactory::SupportedPaddingModes, response);
    143 }
    144 
    145 void AndroidKeymaster::SupportedDigests(const SupportedDigestsRequest& request,
    146                                         SupportedDigestsResponse* response) {
    147     GetSupported(*context_, request.algorithm, request.purpose, &OperationFactory::SupportedDigests,
    148                  response);
    149 }
    150 
    151 void AndroidKeymaster::SupportedImportFormats(const SupportedImportFormatsRequest& request,
    152                                               SupportedImportFormatsResponse* response) {
    153     if (response == NULL || !check_supported(*context_, request.algorithm, response))
    154         return;
    155 
    156     size_t count;
    157     const keymaster_key_format_t* formats =
    158         context_->GetKeyFactory(request.algorithm)->SupportedImportFormats(&count);
    159     response->SetResults(formats, count);
    160 }
    161 
    162 void AndroidKeymaster::SupportedExportFormats(const SupportedExportFormatsRequest& request,
    163                                               SupportedExportFormatsResponse* response) {
    164     if (response == NULL || !check_supported(*context_, request.algorithm, response))
    165         return;
    166 
    167     size_t count;
    168     const keymaster_key_format_t* formats =
    169         context_->GetKeyFactory(request.algorithm)->SupportedExportFormats(&count);
    170     response->SetResults(formats, count);
    171 }
    172 
    173 GetHmacSharingParametersResponse AndroidKeymaster::GetHmacSharingParameters() {
    174     GetHmacSharingParametersResponse response;
    175     KeymasterEnforcement* policy = context_->enforcement_policy();
    176     if (!policy) {
    177         response.error = KM_ERROR_UNIMPLEMENTED;
    178         return response;
    179     }
    180 
    181     response.error = policy->GetHmacSharingParameters(&response.params);
    182     return response;
    183 }
    184 
    185 ComputeSharedHmacResponse
    186 AndroidKeymaster::ComputeSharedHmac(const ComputeSharedHmacRequest& request) {
    187     ComputeSharedHmacResponse response;
    188     KeymasterEnforcement* policy = context_->enforcement_policy();
    189     if (!policy) {
    190         response.error = KM_ERROR_UNIMPLEMENTED;
    191         return response;
    192     }
    193 
    194     response.error = policy->ComputeSharedHmac(request.params_array, &response.sharing_check);
    195     return response;
    196 }
    197 
    198 VerifyAuthorizationResponse
    199 AndroidKeymaster::VerifyAuthorization(const VerifyAuthorizationRequest& request) {
    200     KeymasterEnforcement* policy = context_->enforcement_policy();
    201     if (!policy) {
    202         VerifyAuthorizationResponse response;
    203         response.error = KM_ERROR_UNIMPLEMENTED;
    204         return response;
    205     }
    206 
    207     return policy->VerifyAuthorization(request);
    208 }
    209 
    210 void AndroidKeymaster::AddRngEntropy(const AddEntropyRequest& request,
    211                                      AddEntropyResponse* response) {
    212     response->error = context_->AddRngEntropy(request.random_data.peek_read(),
    213                                               request.random_data.available_read());
    214 }
    215 
    216 void AndroidKeymaster::GenerateKey(const GenerateKeyRequest& request,
    217                                    GenerateKeyResponse* response) {
    218     if (response == NULL)
    219         return;
    220 
    221     keymaster_algorithm_t algorithm;
    222     KeyFactory* factory = 0;
    223     UniquePtr<Key> key;
    224     if (!request.key_description.GetTagValue(TAG_ALGORITHM, &algorithm) ||
    225         !(factory = context_->GetKeyFactory(algorithm)))
    226         response->error = KM_ERROR_UNSUPPORTED_ALGORITHM;
    227     else {
    228         KeymasterKeyBlob key_blob;
    229         response->enforced.Clear();
    230         response->unenforced.Clear();
    231         response->error = factory->GenerateKey(request.key_description, &key_blob,
    232                                                &response->enforced, &response->unenforced);
    233         if (response->error == KM_ERROR_OK)
    234             response->key_blob = key_blob.release();
    235     }
    236 }
    237 
    238 void AndroidKeymaster::GetKeyCharacteristics(const GetKeyCharacteristicsRequest& request,
    239                                              GetKeyCharacteristicsResponse* response) {
    240     if (response == NULL)
    241         return;
    242 
    243     UniquePtr<Key> key;
    244     response->error =
    245         context_->ParseKeyBlob(KeymasterKeyBlob(request.key_blob), request.additional_params,
    246                                &key);
    247     if (response->error != KM_ERROR_OK)
    248         return;
    249 
    250     // scavenge the key object for the auth lists
    251     response->enforced = move(key->hw_enforced());
    252     response->unenforced = move(key->sw_enforced());
    253 
    254     response->error = CheckVersionInfo(response->enforced, response->unenforced, *context_);
    255 }
    256 
    257 void AndroidKeymaster::BeginOperation(const BeginOperationRequest& request,
    258                                       BeginOperationResponse* response) {
    259     if (response == NULL)
    260         return;
    261     response->op_handle = 0;
    262 
    263     const KeyFactory* key_factory;
    264     UniquePtr<Key> key;
    265     response->error = LoadKey(request.key_blob, request.additional_params, &key_factory, &key);
    266     if (response->error != KM_ERROR_OK)
    267         return;
    268 
    269     response->error = KM_ERROR_UNKNOWN_ERROR;
    270     keymaster_algorithm_t key_algorithm;
    271     if (!key->authorizations().GetTagValue(TAG_ALGORITHM, &key_algorithm))
    272         return;
    273 
    274     response->error = KM_ERROR_UNSUPPORTED_PURPOSE;
    275     OperationFactory* factory = key_factory->GetOperationFactory(request.purpose);
    276     if (!factory) return;
    277 
    278     OperationPtr operation(
    279         factory->CreateOperation(move(*key), request.additional_params, &response->error));
    280     if (operation.get() == NULL) return;
    281 
    282     if (context_->enforcement_policy()) {
    283         km_id_t key_id;
    284         response->error = KM_ERROR_UNKNOWN_ERROR;
    285         if (!context_->enforcement_policy()->CreateKeyId(request.key_blob, &key_id)) return;
    286         operation->set_key_id(key_id);
    287         response->error = context_->enforcement_policy()->AuthorizeOperation(
    288             request.purpose, key_id, operation->authorizations(), request.additional_params,
    289             0 /* op_handle */, true /* is_begin_operation */);
    290         if (response->error != KM_ERROR_OK) return;
    291     }
    292 
    293     response->output_params.Clear();
    294     response->error = operation->Begin(request.additional_params, &response->output_params);
    295     if (response->error != KM_ERROR_OK)
    296         return;
    297 
    298     response->op_handle = operation->operation_handle();
    299     response->error = operation_table_->Add(move(operation));
    300 }
    301 
    302 void AndroidKeymaster::UpdateOperation(const UpdateOperationRequest& request,
    303                                        UpdateOperationResponse* response) {
    304     if (response == NULL)
    305         return;
    306 
    307     response->error = KM_ERROR_INVALID_OPERATION_HANDLE;
    308     Operation* operation = operation_table_->Find(request.op_handle);
    309     if (operation == NULL)
    310         return;
    311 
    312     if (context_->enforcement_policy()) {
    313         response->error = context_->enforcement_policy()->AuthorizeOperation(
    314             operation->purpose(), operation->key_id(), operation->authorizations(),
    315             request.additional_params, request.op_handle, false /* is_begin_operation */);
    316         if (response->error != KM_ERROR_OK) {
    317             operation_table_->Delete(request.op_handle);
    318             return;
    319         }
    320     }
    321 
    322     response->error =
    323         operation->Update(request.additional_params, request.input, &response->output_params,
    324                           &response->output, &response->input_consumed);
    325     if (response->error != KM_ERROR_OK) {
    326         // Any error invalidates the operation.
    327         operation_table_->Delete(request.op_handle);
    328     }
    329 }
    330 
    331 void AndroidKeymaster::FinishOperation(const FinishOperationRequest& request,
    332                                        FinishOperationResponse* response) {
    333     if (response == NULL)
    334         return;
    335 
    336     response->error = KM_ERROR_INVALID_OPERATION_HANDLE;
    337     Operation* operation = operation_table_->Find(request.op_handle);
    338     if (operation == NULL)
    339         return;
    340 
    341     if (context_->enforcement_policy()) {
    342         response->error = context_->enforcement_policy()->AuthorizeOperation(
    343             operation->purpose(), operation->key_id(), operation->authorizations(),
    344             request.additional_params, request.op_handle, false /* is_begin_operation */);
    345         if (response->error != KM_ERROR_OK) {
    346             operation_table_->Delete(request.op_handle);
    347             return;
    348         }
    349     }
    350 
    351     response->error = operation->Finish(request.additional_params, request.input, request.signature,
    352                                         &response->output_params, &response->output);
    353     operation_table_->Delete(request.op_handle);
    354 }
    355 
    356 void AndroidKeymaster::AbortOperation(const AbortOperationRequest& request,
    357                                       AbortOperationResponse* response) {
    358     if (!response)
    359         return;
    360 
    361     Operation* operation = operation_table_->Find(request.op_handle);
    362     if (!operation) {
    363         response->error = KM_ERROR_INVALID_OPERATION_HANDLE;
    364         return;
    365     }
    366 
    367     response->error = operation->Abort();
    368     operation_table_->Delete(request.op_handle);
    369 }
    370 
    371 void AndroidKeymaster::ExportKey(const ExportKeyRequest& request, ExportKeyResponse* response) {
    372     if (response == NULL)
    373         return;
    374 
    375     UniquePtr<Key> key;
    376     response->error =
    377         context_->ParseKeyBlob(KeymasterKeyBlob(request.key_blob), request.additional_params, &key);
    378     if (response->error != KM_ERROR_OK)
    379         return;
    380 
    381     UniquePtr<uint8_t[]> out_key;
    382     size_t size;
    383     response->error = key->formatted_key_material(request.key_format, &out_key, &size);
    384     if (response->error == KM_ERROR_OK) {
    385         response->key_data = out_key.release();
    386         response->key_data_length = size;
    387     }
    388 }
    389 
    390 void AndroidKeymaster::AttestKey(const AttestKeyRequest& request, AttestKeyResponse* response) {
    391     if (!response)
    392         return;
    393 
    394     const KeyFactory* key_factory;
    395     UniquePtr<Key> key;
    396     response->error = LoadKey(request.key_blob, request.attest_params,
    397                               &key_factory, &key);
    398     if (response->error != KM_ERROR_OK)
    399         return;
    400 
    401     keymaster_blob_t attestation_application_id;
    402     if (request.attest_params.GetTagValue(TAG_ATTESTATION_APPLICATION_ID,
    403                                           &attestation_application_id)) {
    404         key->sw_enforced().push_back(TAG_ATTESTATION_APPLICATION_ID, attestation_application_id);
    405     }
    406 
    407     CertChainPtr certchain;
    408     response->error = context_->GenerateAttestation(*key, request.attest_params, &certchain);
    409     if (response->error == KM_ERROR_OK) {
    410         response->certificate_chain = *certchain;
    411         // response->certificate_chain took possession of secondary resources. So we shallowly
    412         // delete the keymaster_cert_chain_t object, but nothing else.
    413         // TODO Can we switch to managed types eventually?
    414         delete certchain.release();
    415     }
    416 }
    417 
    418 void AndroidKeymaster::UpgradeKey(const UpgradeKeyRequest& request, UpgradeKeyResponse* response) {
    419     if (!response)
    420         return;
    421 
    422     KeymasterKeyBlob upgraded_key;
    423     response->error = context_->UpgradeKeyBlob(KeymasterKeyBlob(request.key_blob),
    424                                                request.upgrade_params, &upgraded_key);
    425     if (response->error != KM_ERROR_OK)
    426         return;
    427     response->upgraded_key = upgraded_key.release();
    428 }
    429 
    430 void AndroidKeymaster::ImportKey(const ImportKeyRequest& request, ImportKeyResponse* response) {
    431     if (response == NULL)
    432         return;
    433 
    434     keymaster_algorithm_t algorithm;
    435     KeyFactory* factory = 0;
    436     UniquePtr<Key> key;
    437     if (!request.key_description.GetTagValue(TAG_ALGORITHM, &algorithm) ||
    438         !(factory = context_->GetKeyFactory(algorithm)))
    439         response->error = KM_ERROR_UNSUPPORTED_ALGORITHM;
    440     else {
    441         keymaster_key_blob_t key_material = {request.key_data, request.key_data_length};
    442         KeymasterKeyBlob key_blob;
    443         response->error = factory->ImportKey(request.key_description, request.key_format,
    444                                              KeymasterKeyBlob(key_material), &key_blob,
    445                                              &response->enforced, &response->unenforced);
    446         if (response->error == KM_ERROR_OK)
    447             response->key_blob = key_blob.release();
    448     }
    449 }
    450 
    451 void AndroidKeymaster::DeleteKey(const DeleteKeyRequest& request, DeleteKeyResponse* response) {
    452     if (!response)
    453         return;
    454     response->error = context_->DeleteKey(KeymasterKeyBlob(request.key_blob));
    455 }
    456 
    457 void AndroidKeymaster::DeleteAllKeys(const DeleteAllKeysRequest&, DeleteAllKeysResponse* response) {
    458     if (!response)
    459         return;
    460     response->error = context_->DeleteAllKeys();
    461 }
    462 
    463 void AndroidKeymaster::Configure(const ConfigureRequest& request, ConfigureResponse* response) {
    464     if (!response)
    465         return;
    466     response->error = context_->SetSystemVersion(request.os_version, request.os_patchlevel);
    467 }
    468 
    469 bool AndroidKeymaster::has_operation(keymaster_operation_handle_t op_handle) const {
    470     return operation_table_->Find(op_handle) != nullptr;
    471 }
    472 
    473 keymaster_error_t AndroidKeymaster::LoadKey(const keymaster_key_blob_t& key_blob,
    474                                             const AuthorizationSet& additional_params,
    475                                             const KeyFactory** factory, UniquePtr<Key>* key) {
    476     KeymasterKeyBlob key_material;
    477     keymaster_error_t error = context_->ParseKeyBlob(KeymasterKeyBlob(key_blob), additional_params,
    478                                                      key);
    479     if (error != KM_ERROR_OK)
    480         return error;
    481     if (factory) *factory = (*key)->key_factory();
    482     return CheckVersionInfo((*key)->hw_enforced(), (*key)->sw_enforced(), *context_);
    483 }
    484 
    485 void AndroidKeymaster::ImportWrappedKey(const ImportWrappedKeyRequest& request,
    486                                         ImportWrappedKeyResponse* response) {
    487     if (!response) return;
    488 
    489     KeymasterKeyBlob secret_key;
    490     AuthorizationSet key_description;
    491     keymaster_key_format_t key_format;
    492 
    493     response->error =
    494         context_->UnwrapKey(request.wrapped_key, request.wrapping_key, request.additional_params,
    495                             request.masking_key, &key_description, &key_format, &secret_key);
    496 
    497     if (response->error != KM_ERROR_OK) {
    498         return;
    499     }
    500 
    501     int sid_idx = key_description.find(TAG_USER_SECURE_ID);
    502     if (sid_idx != -1) {
    503         uint8_t sids = key_description[sid_idx].long_integer;
    504         if (!key_description.erase(sid_idx)) {
    505             response->error = KM_ERROR_UNKNOWN_ERROR;
    506             return;
    507         }
    508         if (sids & HW_AUTH_PASSWORD) {
    509             key_description.push_back(TAG_USER_SECURE_ID, request.password_sid);
    510         }
    511         if (sids & HW_AUTH_FINGERPRINT) {
    512             key_description.push_back(TAG_USER_SECURE_ID, request.biometric_sid);
    513         }
    514     }
    515 
    516     keymaster_algorithm_t algorithm;
    517     KeyFactory* factory = 0;
    518     if (!key_description.GetTagValue(TAG_ALGORITHM, &algorithm) ||
    519         !(factory = context_->GetKeyFactory(algorithm))) {
    520         response->error = KM_ERROR_UNSUPPORTED_ALGORITHM;
    521     } else {
    522         KeymasterKeyBlob key_blob;
    523         response->error =
    524             factory->ImportKey(key_description, key_format, KeymasterKeyBlob(secret_key), &key_blob,
    525                                &response->enforced, &response->unenforced);
    526         if (response->error == KM_ERROR_OK) {
    527             response->key_blob = key_blob;
    528         }
    529     }
    530 }
    531 
    532 }  // namespace keymaster
    533