• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2020, 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 "android.hardware.security.keymint-impl"
18 #include <android-base/logging.h>
19 
20 #include "AndroidKeyMintDevice.h"
21 
22 #include <aidl/android/hardware/security/keymint/ErrorCode.h>
23 
24 #include <keymaster/android_keymaster.h>
25 #include <keymaster/contexts/pure_soft_keymaster_context.h>
26 #include <keymaster/keymaster_configuration.h>
27 
28 #include "AndroidKeyMintOperation.h"
29 #include "KeyMintUtils.h"
30 
31 namespace aidl::android::hardware::security::keymint {
32 
33 using namespace keymaster;  // NOLINT(google-build-using-namespace)
34 
35 using km_utils::authToken2AidlVec;
36 using km_utils::kmBlob2vector;
37 using km_utils::kmError2ScopedAStatus;
38 using km_utils::kmParam2Aidl;
39 using km_utils::KmParamSet;
40 using km_utils::kmParamSet2Aidl;
41 using km_utils::legacy_enum_conversion;
42 using secureclock::TimeStampToken;
43 
44 namespace {
45 
convertKeyCharacteristics(SecurityLevel keyMintSecurityLevel,const AuthorizationSet & requestParams,const AuthorizationSet & sw_enforced,const AuthorizationSet & hw_enforced,bool include_keystore_enforced=true)46 vector<KeyCharacteristics> convertKeyCharacteristics(SecurityLevel keyMintSecurityLevel,
47                                                      const AuthorizationSet& requestParams,
48                                                      const AuthorizationSet& sw_enforced,
49                                                      const AuthorizationSet& hw_enforced,
50                                                      bool include_keystore_enforced = true) {
51     KeyCharacteristics keyMintEnforced{keyMintSecurityLevel, {}};
52 
53     if (keyMintSecurityLevel != SecurityLevel::SOFTWARE) {
54         // We're pretending to be TRUSTED_ENVIRONMENT or STRONGBOX.
55         keyMintEnforced.authorizations = kmParamSet2Aidl(hw_enforced);
56         if (include_keystore_enforced && !sw_enforced.empty()) {
57             // Put all the software authorizations in the keystore list.
58             KeyCharacteristics keystoreEnforced{SecurityLevel::KEYSTORE,
59                                                 kmParamSet2Aidl(sw_enforced)};
60             return {std::move(keyMintEnforced), std::move(keystoreEnforced)};
61         } else {
62             return {std::move(keyMintEnforced)};
63         }
64     }
65 
66     KeyCharacteristics keystoreEnforced{SecurityLevel::KEYSTORE, {}};
67     CHECK(hw_enforced.empty()) << "Hardware-enforced list is non-empty for pure SW KeyMint";
68 
69     // This is a pure software implementation, so all tags are in sw_enforced.
70     // We need to walk through the SW-enforced list and figure out which tags to
71     // return in the software list and which in the keystore list.
72 
73     for (auto& entry : sw_enforced) {
74         switch (entry.tag) {
75         /* Invalid and unused */
76         case KM_TAG_ECIES_SINGLE_HASH_MODE:
77         case KM_TAG_INVALID:
78         case KM_TAG_KDF:
79         case KM_TAG_ROLLBACK_RESISTANCE:
80             CHECK(false) << "We shouldn't see tag " << entry.tag;
81             break;
82 
83         /* Unimplemented */
84         case KM_TAG_ALLOW_WHILE_ON_BODY:
85         case KM_TAG_BOOTLOADER_ONLY:
86         case KM_TAG_ROLLBACK_RESISTANT:
87         case KM_TAG_STORAGE_KEY:
88             break;
89 
90         /* Keystore-enforced if not locally generated. */
91         case KM_TAG_CREATION_DATETIME:
92             // A KeyMaster implementation is required to add this tag to generated/imported keys.
93             // A KeyMint implementation is not required to create this tag, only to echo it back if
94             // it was included in the key generation/import request.
95             if (requestParams.Contains(KM_TAG_CREATION_DATETIME)) {
96                 keystoreEnforced.authorizations.push_back(kmParam2Aidl(entry));
97             }
98             break;
99 
100         /* Disallowed in KeyCharacteristics */
101         case KM_TAG_APPLICATION_DATA:
102         case KM_TAG_ATTESTATION_APPLICATION_ID:
103             break;
104 
105         /* Not key characteristics */
106         case KM_TAG_ASSOCIATED_DATA:
107         case KM_TAG_ATTESTATION_CHALLENGE:
108         case KM_TAG_ATTESTATION_ID_BRAND:
109         case KM_TAG_ATTESTATION_ID_DEVICE:
110         case KM_TAG_ATTESTATION_ID_IMEI:
111         case KM_TAG_ATTESTATION_ID_MANUFACTURER:
112         case KM_TAG_ATTESTATION_ID_MEID:
113         case KM_TAG_ATTESTATION_ID_MODEL:
114         case KM_TAG_ATTESTATION_ID_PRODUCT:
115         case KM_TAG_ATTESTATION_ID_SERIAL:
116         case KM_TAG_AUTH_TOKEN:
117         case KM_TAG_CERTIFICATE_SERIAL:
118         case KM_TAG_CERTIFICATE_SUBJECT:
119         case KM_TAG_CERTIFICATE_NOT_AFTER:
120         case KM_TAG_CERTIFICATE_NOT_BEFORE:
121         case KM_TAG_CONFIRMATION_TOKEN:
122         case KM_TAG_DEVICE_UNIQUE_ATTESTATION:
123         case KM_TAG_IDENTITY_CREDENTIAL_KEY:
124         case KM_TAG_INCLUDE_UNIQUE_ID:
125         case KM_TAG_MAC_LENGTH:
126         case KM_TAG_NONCE:
127         case KM_TAG_RESET_SINCE_ID_ROTATION:
128         case KM_TAG_ROOT_OF_TRUST:
129         case KM_TAG_UNIQUE_ID:
130             break;
131 
132         /* KeyMint-enforced */
133         case KM_TAG_ALGORITHM:
134         case KM_TAG_APPLICATION_ID:
135         case KM_TAG_AUTH_TIMEOUT:
136         case KM_TAG_BLOB_USAGE_REQUIREMENTS:
137         case KM_TAG_BLOCK_MODE:
138         case KM_TAG_BOOT_PATCHLEVEL:
139         case KM_TAG_CALLER_NONCE:
140         case KM_TAG_DIGEST:
141         case KM_TAG_EARLY_BOOT_ONLY:
142         case KM_TAG_EC_CURVE:
143         case KM_TAG_EXPORTABLE:
144         case KM_TAG_KEY_SIZE:
145         case KM_TAG_MAX_USES_PER_BOOT:
146         case KM_TAG_MIN_MAC_LENGTH:
147         case KM_TAG_MIN_SECONDS_BETWEEN_OPS:
148         case KM_TAG_NO_AUTH_REQUIRED:
149         case KM_TAG_ORIGIN:
150         case KM_TAG_OS_PATCHLEVEL:
151         case KM_TAG_OS_VERSION:
152         case KM_TAG_PADDING:
153         case KM_TAG_PURPOSE:
154         case KM_TAG_RSA_OAEP_MGF_DIGEST:
155         case KM_TAG_RSA_PUBLIC_EXPONENT:
156         case KM_TAG_TRUSTED_CONFIRMATION_REQUIRED:
157         case KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED:
158         case KM_TAG_UNLOCKED_DEVICE_REQUIRED:
159         case KM_TAG_USER_AUTH_TYPE:
160         case KM_TAG_USER_SECURE_ID:
161         case KM_TAG_VENDOR_PATCHLEVEL:
162             keyMintEnforced.authorizations.push_back(kmParam2Aidl(entry));
163             break;
164 
165         /* Keystore-enforced */
166         case KM_TAG_ACTIVE_DATETIME:
167         case KM_TAG_ALL_APPLICATIONS:
168         case KM_TAG_ALL_USERS:
169         case KM_TAG_MAX_BOOT_LEVEL:
170         case KM_TAG_ORIGINATION_EXPIRE_DATETIME:
171         case KM_TAG_USAGE_EXPIRE_DATETIME:
172         case KM_TAG_USER_ID:
173         case KM_TAG_USAGE_COUNT_LIMIT:
174             keystoreEnforced.authorizations.push_back(kmParam2Aidl(entry));
175             break;
176         }
177     }
178 
179     vector<KeyCharacteristics> retval;
180     retval.reserve(2);
181     if (!keyMintEnforced.authorizations.empty()) retval.push_back(std::move(keyMintEnforced));
182     if (include_keystore_enforced && !keystoreEnforced.authorizations.empty()) {
183         retval.push_back(std::move(keystoreEnforced));
184     }
185 
186     return retval;
187 }
188 
convertCertificate(const keymaster_blob_t & cert)189 Certificate convertCertificate(const keymaster_blob_t& cert) {
190     return {std::vector<uint8_t>(cert.data, cert.data + cert.data_length)};
191 }
192 
convertCertificateChain(const CertificateChain & chain)193 vector<Certificate> convertCertificateChain(const CertificateChain& chain) {
194     vector<Certificate> retval;
195     retval.reserve(chain.entry_count);
196     std::transform(chain.begin(), chain.end(), std::back_inserter(retval), convertCertificate);
197     return retval;
198 }
199 
addClientAndAppData(const std::vector<uint8_t> & appId,const std::vector<uint8_t> & appData,::keymaster::AuthorizationSet * params)200 void addClientAndAppData(const std::vector<uint8_t>& appId, const std::vector<uint8_t>& appData,
201                          ::keymaster::AuthorizationSet* params) {
202     params->Clear();
203     if (appId.size()) {
204         params->push_back(::keymaster::TAG_APPLICATION_ID, appId.data(), appId.size());
205     }
206     if (appData.size()) {
207         params->push_back(::keymaster::TAG_APPLICATION_DATA, appData.data(), appData.size());
208     }
209 }
210 
211 }  // namespace
212 
213 constexpr size_t kOperationTableSize = 16;
214 
AndroidKeyMintDevice(SecurityLevel securityLevel)215 AndroidKeyMintDevice::AndroidKeyMintDevice(SecurityLevel securityLevel)
216     : impl_(new (std::nothrow)::keymaster::AndroidKeymaster(
217           [&]() -> auto{
218               auto context = new (std::nothrow) PureSoftKeymasterContext(
219                   KmVersion::KEYMINT_2, static_cast<keymaster_security_level_t>(securityLevel));
220               context->SetSystemVersion(::keymaster::GetOsVersion(),
221                                         ::keymaster::GetOsPatchlevel());
222               context->SetVendorPatchlevel(::keymaster::GetVendorPatchlevel());
223               // Software devices cannot be configured by the boot loader but they have
224               // to return a boot patch level. So lets just return the OS patch level.
225               // The OS patch level only has a year and a month so we just add the 1st
226               // of the month as day field.
227               context->SetBootPatchlevel(GetOsPatchlevel() * 100 + 1);
228               auto digest = ::keymaster::GetVbmetaDigest();
229               if (digest) {
230                   std::string bootState = ::keymaster::GetVerifiedBootState();
231                   std::string bootloaderState = ::keymaster::GetBootloaderState();
232                   context->SetVerifiedBootInfo(bootState, bootloaderState, *digest);
233               } else {
234                   LOG(ERROR) << "Unable to read vb_meta digest";
235               }
236               return context;
237           }(),
238           kOperationTableSize)),
239       securityLevel_(securityLevel) {}
240 
~AndroidKeyMintDevice()241 AndroidKeyMintDevice::~AndroidKeyMintDevice() {}
242 
getHardwareInfo(KeyMintHardwareInfo * info)243 ScopedAStatus AndroidKeyMintDevice::getHardwareInfo(KeyMintHardwareInfo* info) {
244     info->versionNumber = 2;
245     info->securityLevel = securityLevel_;
246     info->keyMintName = "FakeKeyMintDevice";
247     info->keyMintAuthorName = "Google";
248     info->timestampTokenRequired = false;
249     return ScopedAStatus::ok();
250 }
251 
addRngEntropy(const vector<uint8_t> & data)252 ScopedAStatus AndroidKeyMintDevice::addRngEntropy(const vector<uint8_t>& data) {
253     if (data.size() == 0) {
254         return ScopedAStatus::ok();
255     }
256 
257     AddEntropyRequest request(impl_->message_version());
258     request.random_data.Reinitialize(data.data(), data.size());
259 
260     AddEntropyResponse response(impl_->message_version());
261     impl_->AddRngEntropy(request, &response);
262 
263     return kmError2ScopedAStatus(response.error);
264 }
265 
generateKey(const vector<KeyParameter> & keyParams,const optional<AttestationKey> & attestationKey,KeyCreationResult * creationResult)266 ScopedAStatus AndroidKeyMintDevice::generateKey(const vector<KeyParameter>& keyParams,
267                                                 const optional<AttestationKey>& attestationKey,
268                                                 KeyCreationResult* creationResult) {
269 
270     GenerateKeyRequest request(impl_->message_version());
271     request.key_description.Reinitialize(KmParamSet(keyParams));
272     if (attestationKey) {
273         request.attestation_signing_key_blob =
274             KeymasterKeyBlob(attestationKey->keyBlob.data(), attestationKey->keyBlob.size());
275         request.attest_key_params.Reinitialize(KmParamSet(attestationKey->attestKeyParams));
276         request.issuer_subject = KeymasterBlob(attestationKey->issuerSubjectName.data(),
277                                                attestationKey->issuerSubjectName.size());
278     }
279 
280     GenerateKeyResponse response(impl_->message_version());
281     impl_->GenerateKey(request, &response);
282 
283     if (response.error != KM_ERROR_OK) {
284         // Note a key difference between this current aidl and previous hal, is
285         // that hal returns void where as aidl returns the error status.  If
286         // aidl returns error, then aidl will not return any change you may make
287         // to the out parameters.  This is quite different from hal where all
288         // output variable can be modified due to hal returning void.
289         //
290         // So the caller need to be aware not to expect aidl functions to clear
291         // the output variables for you in case of error.  If you left some
292         // wrong data set in the out parameters, they will stay there.
293         return kmError2ScopedAStatus(response.error);
294     }
295 
296     creationResult->keyBlob = kmBlob2vector(response.key_blob);
297     creationResult->keyCharacteristics = convertKeyCharacteristics(
298         securityLevel_, request.key_description, response.unenforced, response.enforced);
299     creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
300     return ScopedAStatus::ok();
301 }
302 
importKey(const vector<KeyParameter> & keyParams,KeyFormat keyFormat,const vector<uint8_t> & keyData,const optional<AttestationKey> & attestationKey,KeyCreationResult * creationResult)303 ScopedAStatus AndroidKeyMintDevice::importKey(const vector<KeyParameter>& keyParams,
304                                               KeyFormat keyFormat, const vector<uint8_t>& keyData,
305                                               const optional<AttestationKey>& attestationKey,
306                                               KeyCreationResult* creationResult) {
307 
308     ImportKeyRequest request(impl_->message_version());
309     request.key_description.Reinitialize(KmParamSet(keyParams));
310     request.key_format = legacy_enum_conversion(keyFormat);
311     request.key_data = KeymasterKeyBlob(keyData.data(), keyData.size());
312     if (attestationKey) {
313         request.attestation_signing_key_blob =
314             KeymasterKeyBlob(attestationKey->keyBlob.data(), attestationKey->keyBlob.size());
315         request.attest_key_params.Reinitialize(KmParamSet(attestationKey->attestKeyParams));
316         request.issuer_subject = KeymasterBlob(attestationKey->issuerSubjectName.data(),
317                                                attestationKey->issuerSubjectName.size());
318     }
319 
320     ImportKeyResponse response(impl_->message_version());
321     impl_->ImportKey(request, &response);
322 
323     if (response.error != KM_ERROR_OK) {
324         return kmError2ScopedAStatus(response.error);
325     }
326 
327     creationResult->keyBlob = kmBlob2vector(response.key_blob);
328     creationResult->keyCharacteristics = convertKeyCharacteristics(
329         securityLevel_, request.key_description, response.unenforced, response.enforced);
330     creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
331 
332     return ScopedAStatus::ok();
333 }
334 
335 ScopedAStatus
importWrappedKey(const vector<uint8_t> & wrappedKeyData,const vector<uint8_t> & wrappingKeyBlob,const vector<uint8_t> & maskingKey,const vector<KeyParameter> & unwrappingParams,int64_t passwordSid,int64_t biometricSid,KeyCreationResult * creationResult)336 AndroidKeyMintDevice::importWrappedKey(const vector<uint8_t>& wrappedKeyData,         //
337                                        const vector<uint8_t>& wrappingKeyBlob,        //
338                                        const vector<uint8_t>& maskingKey,             //
339                                        const vector<KeyParameter>& unwrappingParams,  //
340                                        int64_t passwordSid, int64_t biometricSid,     //
341                                        KeyCreationResult* creationResult) {
342 
343     ImportWrappedKeyRequest request(impl_->message_version());
344     request.SetWrappedMaterial(wrappedKeyData.data(), wrappedKeyData.size());
345     request.SetWrappingMaterial(wrappingKeyBlob.data(), wrappingKeyBlob.size());
346     request.SetMaskingKeyMaterial(maskingKey.data(), maskingKey.size());
347     request.additional_params.Reinitialize(KmParamSet(unwrappingParams));
348     request.password_sid = static_cast<uint64_t>(passwordSid);
349     request.biometric_sid = static_cast<uint64_t>(biometricSid);
350 
351     ImportWrappedKeyResponse response(impl_->message_version());
352     impl_->ImportWrappedKey(request, &response);
353 
354     if (response.error != KM_ERROR_OK) {
355         return kmError2ScopedAStatus(response.error);
356     }
357 
358     creationResult->keyBlob = kmBlob2vector(response.key_blob);
359     creationResult->keyCharacteristics = convertKeyCharacteristics(
360         securityLevel_, request.additional_params, response.unenforced, response.enforced);
361     creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
362 
363     return ScopedAStatus::ok();
364 }
365 
upgradeKey(const vector<uint8_t> & keyBlobToUpgrade,const vector<KeyParameter> & upgradeParams,vector<uint8_t> * keyBlob)366 ScopedAStatus AndroidKeyMintDevice::upgradeKey(const vector<uint8_t>& keyBlobToUpgrade,
367                                                const vector<KeyParameter>& upgradeParams,
368                                                vector<uint8_t>* keyBlob) {
369 
370     UpgradeKeyRequest request(impl_->message_version());
371     request.SetKeyMaterial(keyBlobToUpgrade.data(), keyBlobToUpgrade.size());
372     request.upgrade_params.Reinitialize(KmParamSet(upgradeParams));
373 
374     UpgradeKeyResponse response(impl_->message_version());
375     impl_->UpgradeKey(request, &response);
376 
377     if (response.error != KM_ERROR_OK) {
378         return kmError2ScopedAStatus(response.error);
379     }
380 
381     *keyBlob = kmBlob2vector(response.upgraded_key);
382     return ScopedAStatus::ok();
383 }
384 
deleteKey(const vector<uint8_t> & keyBlob)385 ScopedAStatus AndroidKeyMintDevice::deleteKey(const vector<uint8_t>& keyBlob) {
386     DeleteKeyRequest request(impl_->message_version());
387     request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
388 
389     DeleteKeyResponse response(impl_->message_version());
390     impl_->DeleteKey(request, &response);
391 
392     return kmError2ScopedAStatus(response.error);
393 }
394 
deleteAllKeys()395 ScopedAStatus AndroidKeyMintDevice::deleteAllKeys() {
396     // There's nothing to be done to delete software key blobs.
397     DeleteAllKeysRequest request(impl_->message_version());
398     DeleteAllKeysResponse response(impl_->message_version());
399     impl_->DeleteAllKeys(request, &response);
400 
401     return kmError2ScopedAStatus(response.error);
402 }
403 
destroyAttestationIds()404 ScopedAStatus AndroidKeyMintDevice::destroyAttestationIds() {
405     return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
406 }
407 
begin(KeyPurpose purpose,const vector<uint8_t> & keyBlob,const vector<KeyParameter> & params,const optional<HardwareAuthToken> & authToken,BeginResult * result)408 ScopedAStatus AndroidKeyMintDevice::begin(KeyPurpose purpose, const vector<uint8_t>& keyBlob,
409                                           const vector<KeyParameter>& params,
410                                           const optional<HardwareAuthToken>& authToken,
411                                           BeginResult* result) {
412 
413     BeginOperationRequest request(impl_->message_version());
414     request.purpose = legacy_enum_conversion(purpose);
415     request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
416     request.additional_params.Reinitialize(KmParamSet(params));
417 
418     vector<uint8_t> vector_token = authToken2AidlVec(authToken);
419     request.additional_params.push_back(
420         TAG_AUTH_TOKEN, reinterpret_cast<uint8_t*>(vector_token.data()), vector_token.size());
421 
422     BeginOperationResponse response(impl_->message_version());
423     impl_->BeginOperation(request, &response);
424 
425     if (response.error != KM_ERROR_OK) {
426         return kmError2ScopedAStatus(response.error);
427     }
428 
429     result->params = kmParamSet2Aidl(response.output_params);
430     result->challenge = response.op_handle;
431     result->operation =
432         ndk::SharedRefBase::make<AndroidKeyMintOperation>(impl_, response.op_handle);
433     return ScopedAStatus::ok();
434 }
435 
deviceLocked(bool passwordOnly,const std::optional<secureclock::TimeStampToken> & timestampToken)436 ScopedAStatus AndroidKeyMintDevice::deviceLocked(
437     bool passwordOnly, const std::optional<secureclock::TimeStampToken>& timestampToken) {
438     DeviceLockedRequest request(impl_->message_version());
439     request.passwordOnly = passwordOnly;
440     if (timestampToken.has_value()) {
441         request.token.challenge = timestampToken->challenge;
442         request.token.mac = {timestampToken->mac.data(), timestampToken->mac.size()};
443         request.token.timestamp = timestampToken->timestamp.milliSeconds;
444     }
445     DeviceLockedResponse response = impl_->DeviceLocked(request);
446     return kmError2ScopedAStatus(response.error);
447 }
448 
earlyBootEnded()449 ScopedAStatus AndroidKeyMintDevice::earlyBootEnded() {
450     EarlyBootEndedResponse response = impl_->EarlyBootEnded();
451     return kmError2ScopedAStatus(response.error);
452 }
453 
454 ScopedAStatus
convertStorageKeyToEphemeral(const std::vector<uint8_t> &,std::vector<uint8_t> *)455 AndroidKeyMintDevice::convertStorageKeyToEphemeral(const std::vector<uint8_t>& /* storageKeyBlob */,
456                                                    std::vector<uint8_t>* /* ephemeralKeyBlob */) {
457     return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
458 }
459 
getKeyCharacteristics(const std::vector<uint8_t> & keyBlob,const std::vector<uint8_t> & appId,const std::vector<uint8_t> & appData,std::vector<KeyCharacteristics> * keyCharacteristics)460 ScopedAStatus AndroidKeyMintDevice::getKeyCharacteristics(
461     const std::vector<uint8_t>& keyBlob, const std::vector<uint8_t>& appId,
462     const std::vector<uint8_t>& appData, std::vector<KeyCharacteristics>* keyCharacteristics) {
463     GetKeyCharacteristicsRequest request(impl_->message_version());
464     request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
465     addClientAndAppData(appId, appData, &request.additional_params);
466 
467     GetKeyCharacteristicsResponse response(impl_->message_version());
468     impl_->GetKeyCharacteristics(request, &response);
469 
470     if (response.error != KM_ERROR_OK) {
471         return kmError2ScopedAStatus(response.error);
472     }
473 
474     AuthorizationSet emptySet;
475     *keyCharacteristics =
476         convertKeyCharacteristics(securityLevel_, emptySet, response.unenforced, response.enforced,
477                                   /* include_keystore_enforced = */ false);
478 
479     return ScopedAStatus::ok();
480 }
481 
getRootOfTrustChallenge(array<uint8_t,16> *)482 ScopedAStatus AndroidKeyMintDevice::getRootOfTrustChallenge(array<uint8_t, 16>* /* challenge */) {
483     return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
484 }
485 
getRootOfTrust(const array<uint8_t,16> &,vector<uint8_t> *)486 ScopedAStatus AndroidKeyMintDevice::getRootOfTrust(const array<uint8_t, 16>& /* challenge */,
487                                                    vector<uint8_t>* /* rootOfTrust */) {
488     return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
489 }
490 
sendRootOfTrust(const vector<uint8_t> &)491 ScopedAStatus AndroidKeyMintDevice::sendRootOfTrust(const vector<uint8_t>& /* rootOfTrust */) {
492     return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
493 }
494 
CreateKeyMintDevice(SecurityLevel securityLevel)495 std::shared_ptr<IKeyMintDevice> CreateKeyMintDevice(SecurityLevel securityLevel) {
496     return ndk::SharedRefBase::make<AndroidKeyMintDevice>(securityLevel);
497 }
498 
499 }  // namespace aidl::android::hardware::security::keymint
500