blob: 07490de12967f08ec6ee3e8cd35aaf11815c9401 [file] [log] [blame]
Shawn Willden815e8962020-12-11 13:05:27 +00001/*
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"
Shawn Willden763166c2021-01-10 19:45:01 -070018#include <android-base/logging.h>
Shawn Willden815e8962020-12-11 13:05:27 +000019
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
31namespace aidl::android::hardware::security::keymint {
32
33using namespace ::keymaster;
Shawn Willden96d4e8c2020-12-07 17:03:54 -070034using namespace km_utils;
Chirag Pathakb292e9a2021-02-02 07:28:09 +000035using secureclock::TimeStampToken;
Shawn Willden815e8962020-12-11 13:05:27 +000036
Shawn Willden763166c2021-01-10 19:45:01 -070037namespace {
38
39vector<KeyCharacteristics> convertKeyCharacteristics(SecurityLevel keyMintSecurityLevel,
40 const AuthorizationSet& sw_enforced,
41 const AuthorizationSet& hw_enforced) {
Shawn Willden09f47102021-01-15 15:21:56 -070042 KeyCharacteristics keyMintEnforced{keyMintSecurityLevel, {}};
Shawn Willden763166c2021-01-10 19:45:01 -070043
Shawn Willden763166c2021-01-10 19:45:01 -070044 if (keyMintSecurityLevel != SecurityLevel::SOFTWARE) {
Qi Wuf7c8e9d2021-02-11 03:14:52 +080045 // We're pretending to be TRUSTED_ENVIRONMENT or STRONGBOX.
Shawn Willden09f47102021-01-15 15:21:56 -070046 keyMintEnforced.authorizations = kmParamSet2Aidl(hw_enforced);
Qi Wuf7c8e9d2021-02-11 03:14:52 +080047 // Put all the software authorizations in the keystore list.
48 KeyCharacteristics keystoreEnforced{SecurityLevel::KEYSTORE, kmParamSet2Aidl(sw_enforced)};
49 return {std::move(keyMintEnforced), std::move(keystoreEnforced)};
Shawn Willden763166c2021-01-10 19:45:01 -070050 }
51
Shawn Willden09f47102021-01-15 15:21:56 -070052 KeyCharacteristics keystoreEnforced{SecurityLevel::KEYSTORE, {}};
Shawn Willden763166c2021-01-10 19:45:01 -070053 CHECK(hw_enforced.empty()) << "Hardware-enforced list is non-empty for pure SW KeyMint";
54
Shawn Willden09f47102021-01-15 15:21:56 -070055 // This is a pure software implementation, so all tags are in sw_enforced.
56 // We need to walk through the SW-enforced list and figure out which tags to
57 // return in the software list and which in the keystore list.
Shawn Willden763166c2021-01-10 19:45:01 -070058
59 for (auto& entry : sw_enforced) {
60 switch (entry.tag) {
61 /* Invalid and unused */
62 case KM_TAG_ECIES_SINGLE_HASH_MODE:
63 case KM_TAG_INVALID:
64 case KM_TAG_KDF:
Shawn Willden09f47102021-01-15 15:21:56 -070065 case KM_TAG_ROLLBACK_RESISTANCE:
Shawn Willden763166c2021-01-10 19:45:01 -070066 CHECK(false) << "We shouldn't see tag " << entry.tag;
67 break;
68
69 /* Unimplemented */
70 case KM_TAG_ALLOW_WHILE_ON_BODY:
Shawn Willden763166c2021-01-10 19:45:01 -070071 case KM_TAG_BOOTLOADER_ONLY:
72 case KM_TAG_EARLY_BOOT_ONLY:
Shawn Willden763166c2021-01-10 19:45:01 -070073 case KM_TAG_ROLLBACK_RESISTANT:
74 case KM_TAG_STORAGE_KEY:
Shawn Willden09f47102021-01-15 15:21:56 -070075 case KM_TAG_TRUSTED_CONFIRMATION_REQUIRED:
76 case KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED:
Shawn Willden763166c2021-01-10 19:45:01 -070077 break;
78
79 /* Unenforceable */
Shawn Willden763166c2021-01-10 19:45:01 -070080 case KM_TAG_CREATION_DATETIME:
Shawn Willden763166c2021-01-10 19:45:01 -070081 break;
82
83 /* Disallowed in KeyCharacteristics */
84 case KM_TAG_APPLICATION_DATA:
Shawn Willden09f47102021-01-15 15:21:56 -070085 case KM_TAG_ATTESTATION_APPLICATION_ID:
Shawn Willden763166c2021-01-10 19:45:01 -070086 break;
87
88 /* Not key characteristics */
89 case KM_TAG_ASSOCIATED_DATA:
Shawn Willden763166c2021-01-10 19:45:01 -070090 case KM_TAG_ATTESTATION_CHALLENGE:
91 case KM_TAG_ATTESTATION_ID_BRAND:
92 case KM_TAG_ATTESTATION_ID_DEVICE:
93 case KM_TAG_ATTESTATION_ID_IMEI:
94 case KM_TAG_ATTESTATION_ID_MANUFACTURER:
95 case KM_TAG_ATTESTATION_ID_MEID:
96 case KM_TAG_ATTESTATION_ID_MODEL:
97 case KM_TAG_ATTESTATION_ID_PRODUCT:
98 case KM_TAG_ATTESTATION_ID_SERIAL:
99 case KM_TAG_AUTH_TOKEN:
100 case KM_TAG_CERTIFICATE_SERIAL:
101 case KM_TAG_CERTIFICATE_SUBJECT:
Janis Danisevskisa5780e22021-01-31 22:05:22 -0800102 case KM_TAG_CERTIFICATE_NOT_AFTER:
103 case KM_TAG_CERTIFICATE_NOT_BEFORE:
Shawn Willden763166c2021-01-10 19:45:01 -0700104 case KM_TAG_CONFIRMATION_TOKEN:
105 case KM_TAG_DEVICE_UNIQUE_ATTESTATION:
106 case KM_TAG_IDENTITY_CREDENTIAL_KEY:
107 case KM_TAG_MAC_LENGTH:
108 case KM_TAG_NONCE:
109 case KM_TAG_RESET_SINCE_ID_ROTATION:
110 case KM_TAG_ROOT_OF_TRUST:
111 case KM_TAG_UNIQUE_ID:
112 break;
113
Shawn Willden09f47102021-01-15 15:21:56 -0700114 /* KeyMint-enforced */
Shawn Willden763166c2021-01-10 19:45:01 -0700115 case KM_TAG_ALGORITHM:
Shawn Willden09f47102021-01-15 15:21:56 -0700116 case KM_TAG_APPLICATION_ID:
Shawn Willden763166c2021-01-10 19:45:01 -0700117 case KM_TAG_AUTH_TIMEOUT:
118 case KM_TAG_BLOB_USAGE_REQUIREMENTS:
119 case KM_TAG_BLOCK_MODE:
120 case KM_TAG_BOOT_PATCHLEVEL:
121 case KM_TAG_CALLER_NONCE:
122 case KM_TAG_DIGEST:
123 case KM_TAG_EC_CURVE:
124 case KM_TAG_EXPORTABLE:
125 case KM_TAG_INCLUDE_UNIQUE_ID:
126 case KM_TAG_KEY_SIZE:
127 case KM_TAG_MAX_USES_PER_BOOT:
128 case KM_TAG_MIN_MAC_LENGTH:
129 case KM_TAG_MIN_SECONDS_BETWEEN_OPS:
130 case KM_TAG_NO_AUTH_REQUIRED:
131 case KM_TAG_ORIGIN:
132 case KM_TAG_OS_PATCHLEVEL:
133 case KM_TAG_OS_VERSION:
134 case KM_TAG_PADDING:
135 case KM_TAG_PURPOSE:
136 case KM_TAG_RSA_OAEP_MGF_DIGEST:
137 case KM_TAG_RSA_PUBLIC_EXPONENT:
138 case KM_TAG_UNLOCKED_DEVICE_REQUIRED:
139 case KM_TAG_USER_AUTH_TYPE:
140 case KM_TAG_USER_SECURE_ID:
141 case KM_TAG_VENDOR_PATCHLEVEL:
Shawn Willden09f47102021-01-15 15:21:56 -0700142 keyMintEnforced.authorizations.push_back(kmParam2Aidl(entry));
143 break;
144
145 /* Keystore-enforced */
146 case KM_TAG_ACTIVE_DATETIME:
147 case KM_TAG_ALL_APPLICATIONS:
148 case KM_TAG_ALL_USERS:
Paul Crowley83846532021-02-10 11:24:50 -0800149 case KM_TAG_MAX_BOOT_LEVEL:
Shawn Willden09f47102021-01-15 15:21:56 -0700150 case KM_TAG_ORIGINATION_EXPIRE_DATETIME:
151 case KM_TAG_USAGE_EXPIRE_DATETIME:
152 case KM_TAG_USER_ID:
153 case KM_TAG_USAGE_COUNT_LIMIT:
154 keystoreEnforced.authorizations.push_back(kmParam2Aidl(entry));
155 break;
Shawn Willden763166c2021-01-10 19:45:01 -0700156 }
157 }
158
Shawn Willden09f47102021-01-15 15:21:56 -0700159 vector<KeyCharacteristics> retval;
160 retval.reserve(2);
161 if (!keyMintEnforced.authorizations.empty()) retval.push_back(std::move(keyMintEnforced));
162 if (!keystoreEnforced.authorizations.empty()) retval.push_back(std::move(keystoreEnforced));
163
164 return retval;
Shawn Willden763166c2021-01-10 19:45:01 -0700165}
166
Shawn Willdend7d4f312020-12-21 08:31:01 -0700167Certificate convertCertificate(const keymaster_blob_t& cert) {
168 return {std::vector<uint8_t>(cert.data, cert.data + cert.data_length)};
169}
170
171vector<Certificate> convertCertificateChain(const CertificateChain& chain) {
172 vector<Certificate> retval;
173 retval.reserve(chain.entry_count);
174 std::transform(chain.begin(), chain.end(), std::back_inserter(retval), convertCertificate);
175 return retval;
176}
177
Shawn Willden763166c2021-01-10 19:45:01 -0700178} // namespace
179
Shawn Willden815e8962020-12-11 13:05:27 +0000180constexpr size_t kOperationTableSize = 16;
181
182AndroidKeyMintDevice::AndroidKeyMintDevice(SecurityLevel securityLevel)
183 : impl_(new ::keymaster::AndroidKeymaster(
184 [&]() -> auto {
185 auto context = new PureSoftKeymasterContext(
186 KmVersion::KEYMINT_1, static_cast<keymaster_security_level_t>(securityLevel));
187 context->SetSystemVersion(::keymaster::GetOsVersion(),
188 ::keymaster::GetOsPatchlevel());
189 return context;
190 }(),
191 kOperationTableSize)),
192 securityLevel_(securityLevel) {}
193
194AndroidKeyMintDevice::~AndroidKeyMintDevice() {}
195
196ScopedAStatus AndroidKeyMintDevice::getHardwareInfo(KeyMintHardwareInfo* info) {
197 info->versionNumber = 1;
198 info->securityLevel = securityLevel_;
199 info->keyMintName = "FakeKeyMintDevice";
200 info->keyMintAuthorName = "Google";
Chirag Pathakb292e9a2021-02-02 07:28:09 +0000201 info->timestampTokenRequired = false;
Shawn Willden815e8962020-12-11 13:05:27 +0000202 return ScopedAStatus::ok();
203}
204
Shawn Willden815e8962020-12-11 13:05:27 +0000205ScopedAStatus AndroidKeyMintDevice::addRngEntropy(const vector<uint8_t>& data) {
206 if (data.size() == 0) {
207 return ScopedAStatus::ok();
208 }
209
Shawn Willden950eb0b2021-01-06 19:15:29 +0000210 AddEntropyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000211 request.random_data.Reinitialize(data.data(), data.size());
212
Shawn Willden950eb0b2021-01-06 19:15:29 +0000213 AddEntropyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000214 impl_->AddRngEntropy(request, &response);
215
216 return kmError2ScopedAStatus(response.error);
217}
218
219ScopedAStatus AndroidKeyMintDevice::generateKey(const vector<KeyParameter>& keyParams,
Shawn Willden44c38882020-12-21 18:35:13 -0700220 const optional<AttestationKey>& attestationKey,
Shawn Willden763166c2021-01-10 19:45:01 -0700221 KeyCreationResult* creationResult) {
Shawn Willden815e8962020-12-11 13:05:27 +0000222
Shawn Willden950eb0b2021-01-06 19:15:29 +0000223 GenerateKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000224 request.key_description.Reinitialize(KmParamSet(keyParams));
Shawn Willden44c38882020-12-21 18:35:13 -0700225 if (attestationKey) {
226 request.attestation_signing_key_blob =
227 KeymasterKeyBlob(attestationKey->keyBlob.data(), attestationKey->keyBlob.size());
228 request.attest_key_params.Reinitialize(KmParamSet(attestationKey->attestKeyParams));
229 request.issuer_subject = KeymasterBlob(attestationKey->issuerSubjectName.data(),
230 attestationKey->issuerSubjectName.size());
231 }
Shawn Willden815e8962020-12-11 13:05:27 +0000232
Shawn Willden950eb0b2021-01-06 19:15:29 +0000233 GenerateKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000234 impl_->GenerateKey(request, &response);
235
236 if (response.error != KM_ERROR_OK) {
237 // Note a key difference between this current aidl and previous hal, is
238 // that hal returns void where as aidl returns the error status. If
239 // aidl returns error, then aidl will not return any change you may make
240 // to the out parameters. This is quite different from hal where all
241 // output variable can be modified due to hal returning void.
242 //
243 // So the caller need to be aware not to expect aidl functions to clear
244 // the output variables for you in case of error. If you left some
245 // wrong data set in the out parameters, they will stay there.
246 return kmError2ScopedAStatus(response.error);
247 }
248
Shawn Willden763166c2021-01-10 19:45:01 -0700249 creationResult->keyBlob = kmBlob2vector(response.key_blob);
250 creationResult->keyCharacteristics =
251 convertKeyCharacteristics(securityLevel_, response.unenforced, response.enforced);
Shawn Willdend7d4f312020-12-21 08:31:01 -0700252 creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
Shawn Willden815e8962020-12-11 13:05:27 +0000253 return ScopedAStatus::ok();
254}
255
256ScopedAStatus AndroidKeyMintDevice::importKey(const vector<KeyParameter>& keyParams,
257 KeyFormat keyFormat, const vector<uint8_t>& keyData,
Shawn Willden44c38882020-12-21 18:35:13 -0700258 const optional<AttestationKey>& attestationKey,
Shawn Willden763166c2021-01-10 19:45:01 -0700259 KeyCreationResult* creationResult) {
Shawn Willden815e8962020-12-11 13:05:27 +0000260
Shawn Willden950eb0b2021-01-06 19:15:29 +0000261 ImportKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000262 request.key_description.Reinitialize(KmParamSet(keyParams));
263 request.key_format = legacy_enum_conversion(keyFormat);
Shawn Willden6e20ea42020-12-21 18:52:34 -0700264 request.key_data = KeymasterKeyBlob(keyData.data(), keyData.size());
Shawn Willden44c38882020-12-21 18:35:13 -0700265 if (attestationKey) {
266 request.attestation_signing_key_blob =
267 KeymasterKeyBlob(attestationKey->keyBlob.data(), attestationKey->keyBlob.size());
268 request.attest_key_params.Reinitialize(KmParamSet(attestationKey->attestKeyParams));
269 request.issuer_subject = KeymasterBlob(attestationKey->issuerSubjectName.data(),
270 attestationKey->issuerSubjectName.size());
271 }
Shawn Willden815e8962020-12-11 13:05:27 +0000272
Shawn Willden950eb0b2021-01-06 19:15:29 +0000273 ImportKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000274 impl_->ImportKey(request, &response);
275
276 if (response.error != KM_ERROR_OK) {
277 return kmError2ScopedAStatus(response.error);
278 }
279
Shawn Willden763166c2021-01-10 19:45:01 -0700280 creationResult->keyBlob = kmBlob2vector(response.key_blob);
281 creationResult->keyCharacteristics =
282 convertKeyCharacteristics(securityLevel_, response.unenforced, response.enforced);
Shawn Willdend7d4f312020-12-21 08:31:01 -0700283 creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
Shawn Willden815e8962020-12-11 13:05:27 +0000284
285 return ScopedAStatus::ok();
286}
287
Shawn Willden44c38882020-12-21 18:35:13 -0700288ScopedAStatus
289AndroidKeyMintDevice::importWrappedKey(const vector<uint8_t>& wrappedKeyData, //
290 const vector<uint8_t>& wrappingKeyBlob, //
291 const vector<uint8_t>& maskingKey, //
292 const vector<KeyParameter>& unwrappingParams, //
293 int64_t passwordSid, int64_t biometricSid, //
294 KeyCreationResult* creationResult) {
Shawn Willden815e8962020-12-11 13:05:27 +0000295
Shawn Willden950eb0b2021-01-06 19:15:29 +0000296 ImportWrappedKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000297 request.SetWrappedMaterial(wrappedKeyData.data(), wrappedKeyData.size());
298 request.SetWrappingMaterial(wrappingKeyBlob.data(), wrappingKeyBlob.size());
299 request.SetMaskingKeyMaterial(maskingKey.data(), maskingKey.size());
300 request.additional_params.Reinitialize(KmParamSet(unwrappingParams));
301 request.password_sid = static_cast<uint64_t>(passwordSid);
302 request.biometric_sid = static_cast<uint64_t>(biometricSid);
303
Shawn Willden950eb0b2021-01-06 19:15:29 +0000304 ImportWrappedKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000305 impl_->ImportWrappedKey(request, &response);
306
307 if (response.error != KM_ERROR_OK) {
308 return kmError2ScopedAStatus(response.error);
309 }
310
Shawn Willden763166c2021-01-10 19:45:01 -0700311 creationResult->keyBlob = kmBlob2vector(response.key_blob);
312 creationResult->keyCharacteristics =
313 convertKeyCharacteristics(securityLevel_, response.unenforced, response.enforced);
Shawn Willdend7d4f312020-12-21 08:31:01 -0700314 creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
Shawn Willden815e8962020-12-11 13:05:27 +0000315
316 return ScopedAStatus::ok();
317}
318
319ScopedAStatus AndroidKeyMintDevice::upgradeKey(const vector<uint8_t>& keyBlobToUpgrade,
320 const vector<KeyParameter>& upgradeParams,
321 vector<uint8_t>* keyBlob) {
322
Shawn Willden950eb0b2021-01-06 19:15:29 +0000323 UpgradeKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000324 request.SetKeyMaterial(keyBlobToUpgrade.data(), keyBlobToUpgrade.size());
325 request.upgrade_params.Reinitialize(KmParamSet(upgradeParams));
326
Shawn Willden950eb0b2021-01-06 19:15:29 +0000327 UpgradeKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000328 impl_->UpgradeKey(request, &response);
329
330 if (response.error != KM_ERROR_OK) {
331 return kmError2ScopedAStatus(response.error);
332 }
333
334 *keyBlob = kmBlob2vector(response.upgraded_key);
335 return ScopedAStatus::ok();
336}
337
338ScopedAStatus AndroidKeyMintDevice::deleteKey(const vector<uint8_t>& keyBlob) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000339 DeleteKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000340 request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
341
Shawn Willden950eb0b2021-01-06 19:15:29 +0000342 DeleteKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000343 impl_->DeleteKey(request, &response);
344
345 return kmError2ScopedAStatus(response.error);
346}
347
348ScopedAStatus AndroidKeyMintDevice::deleteAllKeys() {
349 // There's nothing to be done to delete software key blobs.
Shawn Willden950eb0b2021-01-06 19:15:29 +0000350 DeleteAllKeysRequest request(impl_->message_version());
351 DeleteAllKeysResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000352 impl_->DeleteAllKeys(request, &response);
353
354 return kmError2ScopedAStatus(response.error);
355}
356
357ScopedAStatus AndroidKeyMintDevice::destroyAttestationIds() {
358 return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
359}
360
361ScopedAStatus AndroidKeyMintDevice::begin(KeyPurpose purpose, const vector<uint8_t>& keyBlob,
362 const vector<KeyParameter>& params,
363 const HardwareAuthToken& authToken, BeginResult* result) {
364
Shawn Willden950eb0b2021-01-06 19:15:29 +0000365 BeginOperationRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000366 request.purpose = legacy_enum_conversion(purpose);
367 request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
368 request.additional_params.Reinitialize(KmParamSet(params));
369
370 vector<uint8_t> vector_token = authToken2AidlVec(authToken);
371 request.additional_params.push_back(
372 TAG_AUTH_TOKEN, reinterpret_cast<uint8_t*>(vector_token.data()), vector_token.size());
373
Shawn Willden950eb0b2021-01-06 19:15:29 +0000374 BeginOperationResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000375 impl_->BeginOperation(request, &response);
376
377 if (response.error != KM_ERROR_OK) {
378 return kmError2ScopedAStatus(response.error);
379 }
380
381 result->params = kmParamSet2Aidl(response.output_params);
382 result->challenge = response.op_handle;
383 result->operation =
384 ndk::SharedRefBase::make<AndroidKeyMintOperation>(impl_, response.op_handle);
385 return ScopedAStatus::ok();
386}
387
Chirag Pathakb292e9a2021-02-02 07:28:09 +0000388ScopedAStatus AndroidKeyMintDevice::deviceLocked(
Shawn Willden55929692021-02-19 14:53:02 -0700389 bool passwordOnly, const std::optional<secureclock::TimeStampToken>& timestampToken) {
Chirag Pathakb292e9a2021-02-02 07:28:09 +0000390 DeviceLockedRequest request(impl_->message_version());
Shawn Willden55929692021-02-19 14:53:02 -0700391 request.passwordOnly = passwordOnly;
392 if (timestampToken.has_value()) {
393 request.token.challenge = timestampToken->challenge;
394 request.token.mac = {timestampToken->mac.data(), timestampToken->mac.size()};
395 request.token.timestamp = timestampToken->timestamp.milliSeconds;
Chirag Pathakb292e9a2021-02-02 07:28:09 +0000396 }
397 DeviceLockedResponse response = impl_->DeviceLocked(request);
398 return kmError2ScopedAStatus(response.error);
399}
400
401ScopedAStatus AndroidKeyMintDevice::earlyBootEnded() {
402 EarlyBootEndedResponse response = impl_->EarlyBootEnded();
403 return kmError2ScopedAStatus(response.error);
404}
405
Shawn Willden55929692021-02-19 14:53:02 -0700406ScopedAStatus AndroidKeyMintDevice::performOperation(const vector<uint8_t>& /* request */,
407 vector<uint8_t>* /* response */) {
408 return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
409}
410
Shawn Willden815e8962020-12-11 13:05:27 +0000411IKeyMintDevice* CreateKeyMintDevice(SecurityLevel securityLevel) {
Shawn Willden815e8962020-12-11 13:05:27 +0000412 return ::new AndroidKeyMintDevice(securityLevel);
413}
414
415} // namespace aidl::android::hardware::security::keymint