blob: d2175b8fbf48f4b1d48e530001493ebf2c65d186 [file] [log] [blame]
Janis Danisevskisff3d7f42018-10-08 07:15:09 -07001/*
2**
3** Copyright 2018, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9** http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17#define LOG_TAG "keymaster_worker"
18
19#include "keymaster_worker.h"
20
21#include "keystore_utils.h"
22
23#include <android-base/logging.h>
24
25#include "KeyStore.h"
26#include "keymaster_enforcement.h"
27
28#include "key_proto_handler.h"
29#include "keystore_utils.h"
30
31namespace keystore {
32
33constexpr size_t kMaxOperations = 15;
34
35using AndroidKeymasterArguments = android::security::keymaster::KeymasterArguments;
36using android::security::keymaster::ExportResult;
37using android::security::keymaster::operationFailed;
38using android::security::keymaster::OperationResult;
39
Janis Danisevskis5ec4c2a2018-11-12 10:39:48 -080040Worker::Worker() {}
Janis Danisevskisff3d7f42018-10-08 07:15:09 -070041Worker::~Worker() {
Janis Danisevskis5ec4c2a2018-11-12 10:39:48 -080042 std::unique_lock<std::mutex> lock(pending_requests_mutex_);
43 pending_requests_cond_var_.wait(lock, [this] { return pending_requests_.empty(); });
Janis Danisevskisff3d7f42018-10-08 07:15:09 -070044}
45void Worker::addRequest(WorkerTask request) {
46 std::unique_lock<std::mutex> lock(pending_requests_mutex_);
Janis Danisevskis5ec4c2a2018-11-12 10:39:48 -080047 bool start_thread = pending_requests_.empty();
Janis Danisevskisff3d7f42018-10-08 07:15:09 -070048 pending_requests_.push(std::move(request));
49 lock.unlock();
Janis Danisevskis5ec4c2a2018-11-12 10:39:48 -080050 if (start_thread) {
51 auto worker = std::thread([this] {
52 std::unique_lock<std::mutex> lock(pending_requests_mutex_);
53 running_ = true;
54 while (!pending_requests_.empty()) {
55 auto request = std::move(pending_requests_.front());
56 lock.unlock();
57 request();
58 lock.lock();
59 pending_requests_.pop();
60 pending_requests_cond_var_.notify_all();
61 }
62 });
63 worker.detach();
64 }
Janis Danisevskisff3d7f42018-10-08 07:15:09 -070065}
66
67KeymasterWorker::KeymasterWorker(sp<Keymaster> keymasterDevice, KeyStore* keyStore)
68 : keymasterDevice_(std::move(keymasterDevice)), operationMap_(keyStore), keyStore_(keyStore) {
69 // make sure that hal version is cached.
70 if (keymasterDevice_) keymasterDevice_->halVersion();
71}
72
73std::tuple<KeyStoreServiceReturnCode, Blob>
74KeymasterWorker::upgradeKeyBlob(const LockedKeyBlobEntry& lockedEntry,
75 const AuthorizationSet& params) {
76 LOG(INFO) << "upgradeKeyBlob " << lockedEntry->alias() << " " << (uint32_t)lockedEntry->uid();
77
78 std::tuple<KeyStoreServiceReturnCode, Blob> result;
79
80 auto userState = keyStore_->getUserStateDB().getUserStateByUid(lockedEntry->uid());
81
82 Blob& blob = std::get<1>(result);
83 KeyStoreServiceReturnCode& error = std::get<0>(result);
84
85 Blob charBlob;
86 ResponseCode rc;
87
88 std::tie(rc, blob, charBlob) =
89 lockedEntry.readBlobs(userState->getEncryptionKey(), userState->getState());
90
Janis Danisevskis265435f2018-11-16 14:10:46 -080091 userState = {};
92
Janis Danisevskisff3d7f42018-10-08 07:15:09 -070093 if (rc != ResponseCode::NO_ERROR) {
94 return error = rc, result;
95 }
96
97 auto hidlKey = blob2hidlVec(blob);
98 auto& dev = keymasterDevice_;
99
100 auto hidlCb = [&](ErrorCode ret, const ::std::vector<uint8_t>& upgradedKeyBlob) {
101 error = ret;
102 if (!error.isOk()) {
103 if (error == ErrorCode::INVALID_KEY_BLOB) {
104 log_key_integrity_violation(lockedEntry->alias().c_str(), lockedEntry->uid());
105 }
106 return;
107 }
108
109 error = keyStore_->del(lockedEntry);
110 if (!error.isOk()) {
Branden Archer70080742018-11-20 11:04:11 -0800111 ALOGI("upgradeKeyBlob keystore->del failed %d", error.getErrorCode());
Janis Danisevskisff3d7f42018-10-08 07:15:09 -0700112 return;
113 }
114
115 Blob newBlob(&upgradedKeyBlob[0], upgradedKeyBlob.size(), nullptr /* info */,
116 0 /* infoLength */, ::TYPE_KEYMASTER_10);
117 newBlob.setSecurityLevel(blob.getSecurityLevel());
118 newBlob.setEncrypted(blob.isEncrypted());
119 newBlob.setSuperEncrypted(blob.isSuperEncrypted());
120 newBlob.setCriticalToDeviceEncryption(blob.isCriticalToDeviceEncryption());
121
122 error = keyStore_->put(lockedEntry, newBlob, charBlob);
123 if (!error.isOk()) {
Branden Archer70080742018-11-20 11:04:11 -0800124 ALOGI("upgradeKeyBlob keystore->put failed %d", error.getErrorCode());
Janis Danisevskisff3d7f42018-10-08 07:15:09 -0700125 return;
126 }
127 blob = std::move(newBlob);
128 };
129
130 KeyStoreServiceReturnCode error2;
131 error2 = KS_HANDLE_HIDL_ERROR(dev->upgradeKey(hidlKey, params.hidl_data(), hidlCb));
132 if (!error2.isOk()) {
133 return error = error2, result;
134 }
135
136 return result;
137}
138
139std::tuple<KeyStoreServiceReturnCode, KeyCharacteristics, Blob, Blob>
140KeymasterWorker::createKeyCharacteristicsCache(const LockedKeyBlobEntry& lockedEntry,
141 const hidl_vec<uint8_t>& clientId,
142 const hidl_vec<uint8_t>& appData, Blob keyBlob,
143 Blob charBlob) {
144 std::tuple<KeyStoreServiceReturnCode, KeyCharacteristics, Blob, Blob> result;
145
146#if __cplusplus == 201703L
147 auto& [rc, resultCharacteristics, outBlob, charOutBlob] = result;
148#else
149 KeyStoreServiceReturnCode& rc = std::get<0>(result);
150 KeyCharacteristics& resultCharacteristics = std::get<1>(result);
151 Blob& outBlob = std::get<2>(result);
152 Blob& charOutBlob = std::get<3>(result);
153#endif
154
155 rc = ResponseCode::SYSTEM_ERROR;
156 if (!keyBlob) return result;
157 auto hidlKeyBlob = blob2hidlVec(keyBlob);
158 auto& dev = keymasterDevice_;
159
160 KeyStoreServiceReturnCode error;
161
162 AuthorizationSet hwEnforced, swEnforced;
163 bool success = true;
164
165 if (charBlob) {
166 std::tie(success, hwEnforced, swEnforced) = charBlob.getKeyCharacteristics();
167 }
168 if (!success) {
169 LOG(ERROR) << "Failed to read cached key characteristics";
170 return rc = ResponseCode::SYSTEM_ERROR, result;
171 }
172
173 auto hidlCb = [&](ErrorCode ret, const KeyCharacteristics& keyCharacteristics) {
174 error = ret;
175 if (!error.isOk()) {
176 if (error == ErrorCode::INVALID_KEY_BLOB) {
177 log_key_integrity_violation(lockedEntry->alias().c_str(), lockedEntry->uid());
178 }
179 return;
180 }
181
182 // Replace the sw_enforced set with those persisted to disk, minus hw_enforced
183 AuthorizationSet softwareEnforced = keyCharacteristics.softwareEnforced;
184 hwEnforced = keyCharacteristics.hardwareEnforced;
185 swEnforced.Union(softwareEnforced);
186 softwareEnforced.Subtract(hwEnforced);
187
188 // We only get the characteristics from keymaster if there was no cache file or the
189 // the chach file was a legacy cache file. So lets write a new cache file for the next time.
190 Blob newCharBlob;
191 success = newCharBlob.putKeyCharacteristics(hwEnforced, swEnforced);
192 if (!success) {
193 error = ResponseCode::SYSTEM_ERROR;
194 LOG(ERROR) << "Failed to serialize cached key characteristics";
195 return;
196 }
197
198 error = keyStore_->put(lockedEntry, {}, newCharBlob);
199 if (!error.isOk()) {
200 ALOGE("Failed to write key characteristics cache");
201 return;
202 }
203 charBlob = std::move(newCharBlob);
204 };
205
206 if (!charBlob || charBlob.getType() == TYPE_KEY_CHARACTERISTICS) {
207 // this updates the key characteristics cache file to the new format or creates one in
208 // in the first place
209 rc = KS_HANDLE_HIDL_ERROR(
210 dev->getKeyCharacteristics(hidlKeyBlob, clientId, appData, hidlCb));
211 if (!rc.isOk()) {
212 return result;
213 }
214
215 if (error == ErrorCode::KEY_REQUIRES_UPGRADE) {
216 AuthorizationSet upgradeParams;
217 if (clientId.size()) {
218 upgradeParams.push_back(TAG_APPLICATION_ID, clientId);
219 }
220 if (appData.size()) {
221 upgradeParams.push_back(TAG_APPLICATION_DATA, appData);
222 }
223 std::tie(rc, keyBlob) = upgradeKeyBlob(lockedEntry, upgradeParams);
224 if (!rc.isOk()) {
225 return result;
226 }
227
228 auto upgradedHidlKeyBlob = blob2hidlVec(keyBlob);
229
230 rc = KS_HANDLE_HIDL_ERROR(
231 dev->getKeyCharacteristics(upgradedHidlKeyBlob, clientId, appData, hidlCb));
232 if (!rc.isOk()) {
233 return result;
234 }
235 }
236 }
237
238 resultCharacteristics.hardwareEnforced = hwEnforced.hidl_data();
239 resultCharacteristics.softwareEnforced = swEnforced.hidl_data();
240
241 outBlob = std::move(keyBlob);
242 charOutBlob = std::move(charBlob);
243 rc = error;
244 return result;
245}
246
247/**
248 * Get the auth token for this operation from the auth token table.
249 *
250 * Returns ResponseCode::NO_ERROR if the auth token was set or none was required.
251 * ::OP_AUTH_NEEDED if it is a per op authorization, no
252 * authorization token exists for that operation and
253 * failOnTokenMissing is false.
254 * KM_ERROR_KEY_USER_NOT_AUTHENTICATED if there is no valid auth
255 * token for the operation
256 */
257std::pair<KeyStoreServiceReturnCode, HardwareAuthToken>
258KeymasterWorker::getAuthToken(const KeyCharacteristics& characteristics, uint64_t handle,
259 KeyPurpose purpose, bool failOnTokenMissing) {
260
261 AuthorizationSet allCharacteristics(characteristics.softwareEnforced);
262 allCharacteristics.append(characteristics.hardwareEnforced.begin(),
263 characteristics.hardwareEnforced.end());
264
265 HardwareAuthToken authToken;
266 AuthTokenTable::Error err;
267 std::tie(err, authToken) = keyStore_->getAuthTokenTable().FindAuthorization(
268 allCharacteristics, static_cast<KeyPurpose>(purpose), handle);
269
270 KeyStoreServiceReturnCode rc;
271
272 switch (err) {
273 case AuthTokenTable::OK:
274 case AuthTokenTable::AUTH_NOT_REQUIRED:
275 rc = ResponseCode::NO_ERROR;
276 break;
277
278 case AuthTokenTable::AUTH_TOKEN_NOT_FOUND:
279 case AuthTokenTable::AUTH_TOKEN_EXPIRED:
280 case AuthTokenTable::AUTH_TOKEN_WRONG_SID:
281 ALOGE("getAuthToken failed: %d", err); // STOPSHIP: debug only, to be removed
282 rc = ErrorCode::KEY_USER_NOT_AUTHENTICATED;
283 break;
284
285 case AuthTokenTable::OP_HANDLE_REQUIRED:
286 rc = failOnTokenMissing ? KeyStoreServiceReturnCode(ErrorCode::KEY_USER_NOT_AUTHENTICATED)
287 : KeyStoreServiceReturnCode(ResponseCode::OP_AUTH_NEEDED);
288 break;
289
290 default:
291 ALOGE("Unexpected FindAuthorization return value %d", err);
292 rc = ErrorCode::INVALID_ARGUMENT;
293 }
294
295 return {rc, std::move(authToken)};
296}
297
298KeyStoreServiceReturnCode KeymasterWorker::abort(const sp<IBinder>& token) {
299 auto op = operationMap_.removeOperation(token, false /* wasOpSuccessful */);
300 if (op) {
301 keyStore_->getAuthTokenTable().MarkCompleted(op->handle);
302 return KS_HANDLE_HIDL_ERROR(keymasterDevice_->abort(op->handle));
303 } else {
304 return ErrorCode::INVALID_OPERATION_HANDLE;
305 }
306}
307
308/**
309 * Prune the oldest pruneable operation.
310 */
311bool KeymasterWorker::pruneOperation() {
312 sp<IBinder> oldest = operationMap_.getOldestPruneableOperation();
313 ALOGD("Trying to prune operation %p", oldest.get());
314 size_t op_count_before_abort = operationMap_.getOperationCount();
315 // We mostly ignore errors from abort() because all we care about is whether at least
316 // one operation has been removed.
317 auto rc = abort(oldest);
318 if (operationMap_.getOperationCount() >= op_count_before_abort) {
Branden Archer70080742018-11-20 11:04:11 -0800319 ALOGE("Failed to abort pruneable operation %p, error: %d", oldest.get(), rc.getErrorCode());
Janis Danisevskisff3d7f42018-10-08 07:15:09 -0700320 return false;
321 }
322 return true;
323}
324
325// My IDE defines "CAPTURE_MOVE(x) x" because it does not understand generalized lambda captures.
326// It should never be redefined by a build system though.
327#ifndef CAPTURE_MOVE
328#define CAPTURE_MOVE(x) x = std::move(x)
329#endif
330
331void KeymasterWorker::begin(LockedKeyBlobEntry lockedEntry, sp<IBinder> appToken, Blob keyBlob,
332 Blob charBlob, bool pruneable, KeyPurpose purpose,
333 AuthorizationSet opParams, hidl_vec<uint8_t> entropy,
334 worker_begin_cb worker_cb) {
335
336 Worker::addRequest([this, CAPTURE_MOVE(lockedEntry), CAPTURE_MOVE(appToken),
337 CAPTURE_MOVE(keyBlob), CAPTURE_MOVE(charBlob), pruneable, purpose,
338 CAPTURE_MOVE(opParams), CAPTURE_MOVE(entropy),
339 CAPTURE_MOVE(worker_cb)]() mutable {
340 // Concurrently executed
341
Janis Danisevskisff3d7f42018-10-08 07:15:09 -0700342 auto& dev = keymasterDevice_;
343
344 KeyCharacteristics characteristics;
345
346 {
347 hidl_vec<uint8_t> clientId;
348 hidl_vec<uint8_t> appData;
Chih-Hung Hsiehb3bfdb02018-12-12 14:43:33 -0800349 for (const auto& param : opParams) {
Janis Danisevskisff3d7f42018-10-08 07:15:09 -0700350 if (param.tag == Tag::APPLICATION_ID) {
351 clientId = authorizationValue(TAG_APPLICATION_ID, param).value();
352 } else if (param.tag == Tag::APPLICATION_DATA) {
353 appData = authorizationValue(TAG_APPLICATION_DATA, param).value();
354 }
355 }
356 KeyStoreServiceReturnCode error;
357 std::tie(error, characteristics, keyBlob, charBlob) = createKeyCharacteristicsCache(
358 lockedEntry, clientId, appData, std::move(keyBlob), std::move(charBlob));
359 if (!error.isOk()) {
360 worker_cb(operationFailed(error));
361 return;
362 }
363 }
364
365 KeyStoreServiceReturnCode rc, authRc;
366 HardwareAuthToken authToken;
367 std::tie(authRc, authToken) = getAuthToken(characteristics, 0 /* no challenge */, purpose,
368 /*failOnTokenMissing*/ false);
369
370 // If per-operation auth is needed we need to begin the operation and
371 // the client will need to authorize that operation before calling
372 // update. Any other auth issues stop here.
373 if (!authRc.isOk() && authRc != ResponseCode::OP_AUTH_NEEDED) {
374 return worker_cb(operationFailed(authRc));
375 }
376
377 // Add entropy to the device first.
378 if (entropy.size()) {
379 rc = KS_HANDLE_HIDL_ERROR(dev->addRngEntropy(entropy));
380 if (!rc.isOk()) {
381 return worker_cb(operationFailed(rc));
382 }
383 }
384
385 // Create a keyid for this key.
Janis Danisevskis64eb3eb2018-11-27 20:41:52 -0800386 auto keyid = KeymasterEnforcement::CreateKeyId(blob2hidlVec(keyBlob));
Janis Danisevskisff3d7f42018-10-08 07:15:09 -0700387 if (!keyid) {
388 ALOGE("Failed to create a key ID for authorization checking.");
389 return worker_cb(operationFailed(ErrorCode::UNKNOWN_ERROR));
390 }
391
392 // Check that all key authorization policy requirements are met.
393 AuthorizationSet key_auths = characteristics.hardwareEnforced;
394 key_auths.append(characteristics.softwareEnforced.begin(),
395 characteristics.softwareEnforced.end());
396
397 rc = keyStore_->getEnforcementPolicy().AuthorizeOperation(
398 purpose, *keyid, key_auths, opParams, authToken, 0 /* op_handle */,
399 true /* is_begin_operation */);
400 if (!rc.isOk()) {
401 return worker_cb(operationFailed(rc));
402 }
403
404 // If there are more than kMaxOperations, abort the oldest operation that was started as
405 // pruneable.
406 while (operationMap_.getOperationCount() >= kMaxOperations) {
407 ALOGD("Reached or exceeded concurrent operations limit");
408 if (!pruneOperation()) {
409 break;
410 }
411 }
412
413 android::security::keymaster::OperationResult result;
414
415 auto hidlCb = [&](ErrorCode ret, const hidl_vec<KeyParameter>& outParams,
416 uint64_t operationHandle) {
417 result.resultCode = ret;
418 if (!result.resultCode.isOk()) {
419 if (result.resultCode == ErrorCode::INVALID_KEY_BLOB) {
420 log_key_integrity_violation(lockedEntry->alias().c_str(), lockedEntry->uid());
421 }
422 return;
423 }
424 result.handle = operationHandle;
425 result.outParams = outParams;
426 };
427
428 do {
Janis Danisevskis64eb3eb2018-11-27 20:41:52 -0800429 rc = KS_HANDLE_HIDL_ERROR(dev->begin(purpose, blob2hidlVec(keyBlob),
430 opParams.hidl_data(), authToken, hidlCb));
Janis Danisevskisff3d7f42018-10-08 07:15:09 -0700431 if (!rc.isOk()) {
432 LOG(ERROR) << "Got error " << rc << " from begin()";
433 return worker_cb(operationFailed(ResponseCode::SYSTEM_ERROR));
434 }
Janis Danisevskis64eb3eb2018-11-27 20:41:52 -0800435
436 if (result.resultCode == ErrorCode::KEY_REQUIRES_UPGRADE) {
437 std::tie(rc, keyBlob) = upgradeKeyBlob(lockedEntry, opParams);
438 if (!rc.isOk()) {
439 return worker_cb(operationFailed(rc));
440 }
441
442 rc = KS_HANDLE_HIDL_ERROR(dev->begin(purpose, blob2hidlVec(keyBlob),
443 opParams.hidl_data(), authToken, hidlCb));
444 if (!rc.isOk()) {
445 LOG(ERROR) << "Got error " << rc << " from begin()";
446 return worker_cb(operationFailed(ResponseCode::SYSTEM_ERROR));
447 }
448 }
Janis Danisevskisff3d7f42018-10-08 07:15:09 -0700449 // If there are too many operations abort the oldest operation that was
450 // started as pruneable and try again.
451 } while (result.resultCode == ErrorCode::TOO_MANY_OPERATIONS && pruneOperation());
452
453 rc = result.resultCode;
454 if (!rc.isOk()) {
455 return worker_cb(operationFailed(rc));
456 }
457
458 // Note: The operation map takes possession of the contents of "characteristics".
459 // It is safe to use characteristics after the following line but it will be empty.
460 sp<IBinder> operationToken =
461 operationMap_.addOperation(result.handle, *keyid, purpose, dev, appToken,
462 std::move(characteristics), opParams.hidl_data(), pruneable);
463 assert(characteristics.hardwareEnforced.size() == 0);
464 assert(characteristics.softwareEnforced.size() == 0);
465 result.token = operationToken;
466
467 auto operation = operationMap_.getOperation(operationToken);
468 if (!operation) {
469 return worker_cb(operationFailed(ResponseCode::SYSTEM_ERROR));
470 }
471
472 if (authRc.isOk() && authToken.mac.size() &&
473 dev->halVersion().securityLevel == SecurityLevel::STRONGBOX) {
474 operation->authTokenFuture = operation->authTokenPromise.get_future();
475 std::weak_ptr<Operation> weak_operation = operation;
476
477 auto verifyTokenCB = [weak_operation](KeyStoreServiceReturnCode rc,
478 HardwareAuthToken authToken,
479 VerificationToken verificationToken) {
480 auto operation = weak_operation.lock();
481 if (!operation) {
482 // operation aborted, nothing to do
483 return;
484 }
485 if (rc.isOk()) {
486 operation->authToken = std::move(authToken);
487 operation->verificationToken = std::move(verificationToken);
488 }
489 operation->authTokenPromise.set_value(rc);
490 };
491 auto teeKmDevice = keyStore_->getDevice(SecurityLevel::TRUSTED_ENVIRONMENT);
492 teeKmDevice->verifyAuthorization(result.handle, {}, std::move(authToken),
493 std::move(verifyTokenCB));
494 }
495
496 // Return the authentication lookup result. If this is a per operation
497 // auth'd key then the resultCode will be ::OP_AUTH_NEEDED and the
498 // application should get an auth token using the handle before the
499 // first call to update, which will fail if keystore hasn't received the
500 // auth token.
501 if (result.resultCode.isOk()) {
502 result.resultCode = authRc;
503 }
504 return worker_cb(result);
505 });
506}
507
508KeyStoreServiceReturnCode
509KeymasterWorker::getOperationAuthTokenIfNeeded(std::shared_ptr<Operation> op) {
510 if (!op) return ErrorCode::INVALID_OPERATION_HANDLE;
511
512 if (op->authTokenFuture.valid()) {
513 LOG(INFO) << "Waiting for verification token";
514 op->authTokenFuture.wait();
515 auto rc = op->authTokenFuture.get();
516 if (!rc.isOk()) {
517 return rc;
518 }
519 op->authTokenFuture = {};
520 } else if (!op->hasAuthToken()) {
521 KeyStoreServiceReturnCode rc;
522 HardwareAuthToken found;
523 std::tie(rc, found) = getAuthToken(op->characteristics, op->handle, op->purpose);
524 if (!rc.isOk()) return rc;
525 op->authToken = std::move(found);
526 }
527
528 return ResponseCode::NO_ERROR;
529}
530
531namespace {
532
533class Finalize {
534 private:
535 std::function<void()> f_;
536
537 public:
Chih-Hung Hsieh4fa39ef2019-01-04 13:34:17 -0800538 explicit Finalize(std::function<void()> f) : f_(f) {}
Janis Danisevskisff3d7f42018-10-08 07:15:09 -0700539 ~Finalize() {
540 if (f_) f_();
541 }
542 void release() { f_ = {}; }
543};
544
545} // namespace
546
547void KeymasterWorker::update(sp<IBinder> token, AuthorizationSet params, hidl_vec<uint8_t> data,
548 update_cb worker_cb) {
549 Worker::addRequest([this, CAPTURE_MOVE(token), CAPTURE_MOVE(params), CAPTURE_MOVE(data),
550 CAPTURE_MOVE(worker_cb)]() {
551 KeyStoreServiceReturnCode rc;
552 auto op = operationMap_.getOperation(token);
553 if (!op) {
554 return worker_cb(operationFailed(ErrorCode::INVALID_OPERATION_HANDLE));
555 }
556
557 Finalize abort_operation_in_case_of_error([&] {
558 operationMap_.removeOperation(token, false);
559 keyStore_->getAuthTokenTable().MarkCompleted(op->handle);
560 KS_HANDLE_HIDL_ERROR(keymasterDevice_->abort(op->handle));
561 });
562
563 rc = getOperationAuthTokenIfNeeded(op);
564 if (!rc.isOk()) return worker_cb(operationFailed(rc));
565
566 // Check that all key authorization policy requirements are met.
567 AuthorizationSet key_auths(op->characteristics.hardwareEnforced);
568 key_auths.append(op->characteristics.softwareEnforced.begin(),
569 op->characteristics.softwareEnforced.end());
570
571 rc = keyStore_->getEnforcementPolicy().AuthorizeOperation(op->purpose, op->keyid, key_auths,
572 params, op->authToken, op->handle,
573 false /* is_begin_operation */);
574 if (!rc.isOk()) return worker_cb(operationFailed(rc));
575
576 OperationResult result;
577 auto hidlCb = [&](ErrorCode ret, uint32_t inputConsumed,
578 const hidl_vec<KeyParameter>& outParams,
579 const ::std::vector<uint8_t>& output) {
580 result.resultCode = ret;
581 if (result.resultCode.isOk()) {
582 result.inputConsumed = inputConsumed;
583 result.outParams = outParams;
584 result.data = output;
585 }
586 };
587
588 rc = KS_HANDLE_HIDL_ERROR(op->device->update(op->handle, params.hidl_data(), data,
589 op->authToken, op->verificationToken, hidlCb));
590
591 // just a reminder: on success result->resultCode was set in the callback. So we only
592 // overwrite it if there was a communication error indicated by the ErrorCode.
593 if (!rc.isOk()) result.resultCode = rc;
594 if (result.resultCode.isOk()) {
595 // if everything went well we don't abort the operation.
596 abort_operation_in_case_of_error.release();
597 }
598 return worker_cb(std::move(result));
599 });
600}
601
602/**
603 * Check that all KeyParameters provided by the application are allowed. Any parameter that keystore
604 * adds itself should be disallowed here.
605 */
606template <typename ParamsIter>
607static bool checkAllowedOperationParams(ParamsIter begin, const ParamsIter end) {
608 while (begin != end) {
609 switch (begin->tag) {
610 case Tag::ATTESTATION_APPLICATION_ID:
611 case Tag::RESET_SINCE_ID_ROTATION:
612 return false;
613 default:
614 break;
615 }
616 ++begin;
617 }
618 return true;
619}
620
621void KeymasterWorker::finish(sp<IBinder> token, AuthorizationSet params, hidl_vec<uint8_t> input,
622 hidl_vec<uint8_t> signature, hidl_vec<uint8_t> entropy,
623 finish_cb worker_cb) {
624 Worker::addRequest([this, CAPTURE_MOVE(token), CAPTURE_MOVE(params), CAPTURE_MOVE(input),
625 CAPTURE_MOVE(signature), CAPTURE_MOVE(entropy),
626 CAPTURE_MOVE(worker_cb)]() mutable {
627 KeyStoreServiceReturnCode rc;
628 auto op = operationMap_.getOperation(token);
629 if (!op) {
630 return worker_cb(operationFailed(ErrorCode::INVALID_OPERATION_HANDLE));
631 }
632
633 bool finished = false;
634 Finalize abort_operation_in_case_of_error([&] {
635 operationMap_.removeOperation(token, finished && rc.isOk());
636 keyStore_->getAuthTokenTable().MarkCompleted(op->handle);
637 if (!finished) KS_HANDLE_HIDL_ERROR(keymasterDevice_->abort(op->handle));
638 });
639
640 if (!checkAllowedOperationParams(params.begin(), params.end())) {
641 return worker_cb(operationFailed(ErrorCode::INVALID_ARGUMENT));
642 }
643
644 rc = getOperationAuthTokenIfNeeded(op);
645 if (!rc.isOk()) return worker_cb(operationFailed(rc));
646
647 // Check that all key authorization policy requirements are met.
648 AuthorizationSet key_auths(op->characteristics.hardwareEnforced);
649 key_auths.append(op->characteristics.softwareEnforced.begin(),
650 op->characteristics.softwareEnforced.end());
651
652 if (key_auths.Contains(Tag::TRUSTED_CONFIRMATION_REQUIRED)) {
653 hidl_vec<uint8_t> confirmationToken =
654 keyStore_->getConfirmationManager().getLatestConfirmationToken();
655 if (confirmationToken.size() == 0) {
656 LOG(ERROR) << "Confirmation token required but none found";
657 return worker_cb(operationFailed(ErrorCode::NO_USER_CONFIRMATION));
658 }
659 params.push_back(keymaster::TAG_CONFIRMATION_TOKEN, std::move(confirmationToken));
660 }
661
662 rc = keyStore_->getEnforcementPolicy().AuthorizeOperation(op->purpose, op->keyid, key_auths,
663 params, op->authToken, op->handle,
664 false /* is_begin_operation */);
665 if (!rc.isOk()) return worker_cb(operationFailed(rc));
666
667 if (entropy.size()) {
668 rc = KS_HANDLE_HIDL_ERROR(op->device->addRngEntropy(entropy));
669 if (!rc.isOk()) {
670 return worker_cb(operationFailed(rc));
671 }
672 }
673
674 OperationResult result;
675 auto hidlCb = [&](ErrorCode ret, const hidl_vec<KeyParameter>& outParams,
676 const ::std::vector<uint8_t>& output) {
677 result.resultCode = ret;
678 if (result.resultCode.isOk()) {
679 result.outParams = outParams;
680 result.data = output;
681 }
682 };
683
684 rc = KS_HANDLE_HIDL_ERROR(op->device->finish(op->handle, params.hidl_data(), input,
685 signature, op->authToken,
686 op->verificationToken, hidlCb));
687
688 if (rc.isOk()) {
689 // inform the finalizer that the finish call went through
690 finished = true;
691 // and what the result was
692 rc = result.resultCode;
693 } else {
694 return worker_cb(operationFailed(rc));
695 }
696 return worker_cb(std::move(result));
697 });
698}
699
700void KeymasterWorker::abort(sp<IBinder> token, abort_cb worker_cb) {
701 Worker::addRequest(
702 [this, CAPTURE_MOVE(token), CAPTURE_MOVE(worker_cb)]() { return worker_cb(abort(token)); });
703}
704
705void KeymasterWorker::verifyAuthorization(uint64_t challenge, hidl_vec<KeyParameter> params,
706 HardwareAuthToken token,
707 verifyAuthorization_cb worker_cb) {
708 Worker::addRequest([this, challenge, CAPTURE_MOVE(params), CAPTURE_MOVE(token),
709 CAPTURE_MOVE(worker_cb)]() {
710 KeyStoreServiceReturnCode error;
711 VerificationToken verificationToken;
712 KeyStoreServiceReturnCode rc = KS_HANDLE_HIDL_ERROR(keymasterDevice_->verifyAuthorization(
713 challenge, params, token, [&](ErrorCode error_, const VerificationToken& vToken) {
714 error = error_;
715 verificationToken = vToken;
716 }));
717 worker_cb(rc.isOk() ? error : rc, std::move(token), std::move(verificationToken));
718 });
719}
720
721void KeymasterWorker::addRngEntropy(hidl_vec<uint8_t> data, addRngEntropy_cb _hidl_cb) {
722 addRequest(&Keymaster::addRngEntropy, std::move(_hidl_cb), std::move(data));
723}
724
725namespace {
726bool containsTag(const hidl_vec<KeyParameter>& params, Tag tag) {
727 return params.end() !=
728 std::find_if(params.begin(), params.end(),
729 [&](const KeyParameter& param) { return param.tag == tag; });
730}
731
732bool isAuthenticationBound(const hidl_vec<KeyParameter>& params) {
733 return !containsTag(params, Tag::NO_AUTH_REQUIRED);
734}
735} // namespace
736
737void KeymasterWorker::generateKey(LockedKeyBlobEntry lockedEntry, hidl_vec<KeyParameter> keyParams,
738 hidl_vec<uint8_t> entropy, int flags, generateKey_cb worker_cb) {
739 Worker::addRequest([this, CAPTURE_MOVE(lockedEntry), CAPTURE_MOVE(keyParams),
740 CAPTURE_MOVE(entropy), CAPTURE_MOVE(worker_cb), flags]() mutable {
741 KeyStoreServiceReturnCode rc =
742 KS_HANDLE_HIDL_ERROR(keymasterDevice_->addRngEntropy(entropy));
743 if (!rc.isOk()) {
744 return worker_cb(rc, {});
745 }
746
747 SecurityLevel securityLevel = keymasterDevice_->halVersion().securityLevel;
748
749 // Fallback cannot be considered for Strongbox. Further versions restrictions are enforced
750 // by KeyStore::getFallbackDevice()
751 bool consider_fallback = securityLevel == SecurityLevel::TRUSTED_ENVIRONMENT;
752
753 Finalize logOnFail(
754 [&] { uploadKeyCharacteristicsAsProto(keyParams, false /* wasCreationSuccessful */); });
755
756 KeyCharacteristics outCharacteristics;
757 KeyStoreServiceReturnCode error;
758 auto hidl_cb = [&](ErrorCode ret, const hidl_vec<uint8_t>& hidlKeyBlob,
759 const KeyCharacteristics& keyCharacteristics) {
760 error = ret;
761 if (!error.isOk()) {
762 return;
763 }
764 consider_fallback = false;
765 outCharacteristics = keyCharacteristics;
766
767 Blob keyBlob(&hidlKeyBlob[0], hidlKeyBlob.size(), nullptr, 0, ::TYPE_KEYMASTER_10);
768 keyBlob.setSecurityLevel(securityLevel);
769 keyBlob.setCriticalToDeviceEncryption(flags &
770 KEYSTORE_FLAG_CRITICAL_TO_DEVICE_ENCRYPTION);
771 if (isAuthenticationBound(keyParams) && !keyBlob.isCriticalToDeviceEncryption()) {
772 keyBlob.setSuperEncrypted(true);
773 }
774 keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
775
776 AuthorizationSet sw_enforced = keyParams;
777 sw_enforced.Subtract(outCharacteristics.hardwareEnforced);
778 sw_enforced.Union(outCharacteristics.softwareEnforced);
779 sw_enforced.Filter([](const KeyParameter& param) -> bool {
780 return !(param.tag == Tag::APPLICATION_DATA || param.tag == Tag::APPLICATION_ID);
781 });
782 if (!sw_enforced.Contains(Tag::USER_ID)) {
783 // Most Java processes don't have access to this tag
784 sw_enforced.push_back(keymaster::TAG_USER_ID, get_user_id(lockedEntry->uid()));
785 }
786 Blob keyCharBlob;
787 keyCharBlob.putKeyCharacteristics(outCharacteristics.hardwareEnforced, sw_enforced);
788 error = keyStore_->put(lockedEntry, std::move(keyBlob), std::move(keyCharBlob));
789 };
790
791 rc = KS_HANDLE_HIDL_ERROR(keymasterDevice_->generateKey(keyParams, hidl_cb));
792 if (!rc.isOk()) {
793 return worker_cb(rc, {});
794 }
795
796 if (consider_fallback && !error.isOk()) {
797 auto fallback = keyStore_->getFallbackDevice();
798 if (!fallback) {
799 return worker_cb(error, {});
800 }
801 // No fallback for 3DES
802 for (auto& param : keyParams) {
803 auto algorithm = authorizationValue(TAG_ALGORITHM, param);
804 if (algorithm.isOk() && algorithm.value() == Algorithm::TRIPLE_DES) {
805 return worker_cb(ErrorCode::UNSUPPORTED_ALGORITHM, {});
806 }
807 }
808
809 // delegate to fallback worker
810 fallback->generateKey(std::move(lockedEntry), std::move(keyParams), std::move(entropy),
811 flags, std::move(worker_cb));
812 // let fallback do the logging
813 logOnFail.release();
814 return;
815 }
816
817 if (!error.isOk()) return worker_cb(error, {});
818
819 // log on success
820 logOnFail.release();
821 uploadKeyCharacteristicsAsProto(keyParams, true /* wasCreationSuccessful */);
822
823 return worker_cb(error, std::move(outCharacteristics));
824 });
825}
826
827void KeymasterWorker::generateKey(hidl_vec<KeyParameter> keyParams, generateKey2_cb worker_cb) {
828 addRequest(&Keymaster::generateKey, std::move(worker_cb), std::move(keyParams));
829}
830
831void KeymasterWorker::getKeyCharacteristics(LockedKeyBlobEntry lockedEntry,
832 hidl_vec<uint8_t> clientId, hidl_vec<uint8_t> appData,
833 Blob keyBlob, Blob charBlob,
834 getKeyCharacteristics_cb worker_cb) {
835 Worker::addRequest([this, CAPTURE_MOVE(lockedEntry), CAPTURE_MOVE(clientId),
836 CAPTURE_MOVE(appData), CAPTURE_MOVE(keyBlob), CAPTURE_MOVE(charBlob),
837 CAPTURE_MOVE(worker_cb)]() {
838 auto result = createKeyCharacteristicsCache(lockedEntry, clientId, appData,
839 std::move(keyBlob), std::move(charBlob));
840 return worker_cb(std::get<0>(result), std::move(std::get<1>(result)));
841 });
842}
843
844void KeymasterWorker::importKey(LockedKeyBlobEntry lockedEntry, hidl_vec<KeyParameter> keyParams,
845 KeyFormat keyFormat, hidl_vec<uint8_t> keyData, int flags,
846 importKey_cb worker_cb) {
847 Worker::addRequest([this, CAPTURE_MOVE(lockedEntry), CAPTURE_MOVE(keyParams), keyFormat,
848 CAPTURE_MOVE(keyData), flags, CAPTURE_MOVE(worker_cb)]() mutable {
849 SecurityLevel securityLevel = keymasterDevice_->halVersion().securityLevel;
850
851 // Fallback cannot be considered for Strongbox. Further versions restrictions are enforced
852 // by KeyStore::getFallbackDevice()
853 bool consider_fallback = securityLevel == SecurityLevel::TRUSTED_ENVIRONMENT;
854
855 Finalize logOnFail(
856 [&] { uploadKeyCharacteristicsAsProto(keyParams, false /* wasCreationSuccessful */); });
857
858 KeyCharacteristics outCharacteristics;
859 KeyStoreServiceReturnCode error;
860 auto hidl_cb = [&](ErrorCode ret, const hidl_vec<uint8_t>& hidlKeyBlob,
861 const KeyCharacteristics& keyCharacteristics) {
862 error = ret;
863 if (!error.isOk()) {
864 LOG(INFO) << "importKey failed";
865 return;
866 }
867 consider_fallback = false;
868 outCharacteristics = keyCharacteristics;
869
870 Blob keyBlob(&hidlKeyBlob[0], hidlKeyBlob.size(), nullptr, 0, ::TYPE_KEYMASTER_10);
871 keyBlob.setSecurityLevel(securityLevel);
872 keyBlob.setCriticalToDeviceEncryption(flags &
873 KEYSTORE_FLAG_CRITICAL_TO_DEVICE_ENCRYPTION);
874 if (isAuthenticationBound(keyParams) && !keyBlob.isCriticalToDeviceEncryption()) {
875 keyBlob.setSuperEncrypted(true);
876 }
877 keyBlob.setEncrypted(flags & KEYSTORE_FLAG_ENCRYPTED);
878
879 AuthorizationSet sw_enforced = keyParams;
880 sw_enforced.Subtract(outCharacteristics.hardwareEnforced);
881 sw_enforced.Union(outCharacteristics.softwareEnforced);
882 sw_enforced.Filter([](const KeyParameter& param) -> bool {
883 return !(param.tag == Tag::APPLICATION_DATA || param.tag == Tag::APPLICATION_ID);
884 });
885 if (!sw_enforced.Contains(Tag::USER_ID)) {
886 // Most Java processes don't have access to this tag
887 sw_enforced.push_back(keymaster::TAG_USER_ID, get_user_id(lockedEntry->uid()));
888 }
889 Blob keyCharBlob;
890 keyCharBlob.putKeyCharacteristics(outCharacteristics.hardwareEnforced, sw_enforced);
891 error = keyStore_->put(lockedEntry, std::move(keyBlob), std::move(keyCharBlob));
892 };
893
894 KeyStoreServiceReturnCode rc = KS_HANDLE_HIDL_ERROR(
895 keymasterDevice_->importKey(keyParams, keyFormat, keyData, hidl_cb));
896 if (!rc.isOk()) {
897 return worker_cb(rc, {});
898 }
899
900 if (consider_fallback && !error.isOk()) {
901 auto fallback = keyStore_->getFallbackDevice();
902 if (!fallback) {
903 return worker_cb(error, {});
904 }
905 // No fallback for 3DES
906 for (auto& param : keyParams) {
907 auto algorithm = authorizationValue(TAG_ALGORITHM, param);
908 if (algorithm.isOk() && algorithm.value() == Algorithm::TRIPLE_DES) {
909 return worker_cb(ErrorCode::UNSUPPORTED_ALGORITHM, {});
910 }
911 }
912
913 // delegate to fallback worker
914 fallback->importKey(std::move(lockedEntry), std::move(keyParams), keyFormat,
915 std::move(keyData), flags, std::move(worker_cb));
916 // let fallback to the logging
917 logOnFail.release();
918 return;
919 }
920
921 if (!error.isOk()) return worker_cb(error, {});
922
923 // log on success
924 logOnFail.release();
925 uploadKeyCharacteristicsAsProto(keyParams, true /* wasCreationSuccessful */);
926
927 return worker_cb(error, std::move(outCharacteristics));
928 });
929}
930
931void KeymasterWorker::importWrappedKey(LockedKeyBlobEntry wrappingLockedEntry,
932 LockedKeyBlobEntry wrapppedLockedEntry,
933 hidl_vec<uint8_t> wrappedKeyData,
934 hidl_vec<uint8_t> maskingKey,
935 hidl_vec<KeyParameter> unwrappingParams, Blob wrappingBlob,
936 Blob wrappingCharBlob, uint64_t passwordSid,
937 uint64_t biometricSid, importWrappedKey_cb worker_cb) {
938 Worker::addRequest([this, CAPTURE_MOVE(wrappingLockedEntry), CAPTURE_MOVE(wrapppedLockedEntry),
939 CAPTURE_MOVE(wrappedKeyData), CAPTURE_MOVE(maskingKey),
940 CAPTURE_MOVE(unwrappingParams), CAPTURE_MOVE(wrappingBlob),
941 CAPTURE_MOVE(wrappingCharBlob), passwordSid, biometricSid,
942 CAPTURE_MOVE(worker_cb)]() mutable {
943 auto hidlWrappingKey = blob2hidlVec(wrappingBlob);
944
945 SecurityLevel securityLevel = keymasterDevice_->halVersion().securityLevel;
946
947 KeyCharacteristics outCharacteristics;
948 KeyStoreServiceReturnCode error;
949
950 auto hidlCb = [&](ErrorCode ret, const hidl_vec<uint8_t>& hidlKeyBlob,
951 const KeyCharacteristics& keyCharacteristics) {
952 error = ret;
953 if (!error.isOk()) {
954 return;
955 }
956 outCharacteristics = keyCharacteristics;
957
958 Blob keyBlob(hidlKeyBlob.data(), hidlKeyBlob.size(), nullptr, 0, ::TYPE_KEYMASTER_10);
959 keyBlob.setSecurityLevel(securityLevel);
960 if (isAuthenticationBound(keyCharacteristics.hardwareEnforced)) {
961 keyBlob.setSuperEncrypted(true);
962 }
963
964 AuthorizationSet sw_enforced = outCharacteristics.softwareEnforced;
965 if (!sw_enforced.Contains(Tag::USER_ID)) {
966 // Most Java processes don't have access to this tag
967 sw_enforced.push_back(keymaster::TAG_USER_ID,
968 get_user_id(wrapppedLockedEntry->uid()));
969 }
970 Blob keyCharBlob;
971 keyCharBlob.putKeyCharacteristics(outCharacteristics.hardwareEnforced, sw_enforced);
972 error = keyStore_->put(wrapppedLockedEntry, std::move(keyBlob), std::move(keyCharBlob));
973 };
974
975 KeyStoreServiceReturnCode rc = KS_HANDLE_HIDL_ERROR(keymasterDevice_->importWrappedKey(
976 wrappedKeyData, hidlWrappingKey, maskingKey, unwrappingParams, passwordSid,
977 biometricSid, hidlCb));
978
979 // possible hidl error
980 if (!rc.isOk()) {
981 return worker_cb(rc, {});
982 }
983
984 if (error == ErrorCode::KEY_REQUIRES_UPGRADE) {
985 std::tie(rc, wrappingBlob) = upgradeKeyBlob(wrappingLockedEntry, {});
986 if (!rc.isOk()) {
987 return worker_cb(rc, {});
988 }
989
990 auto upgradedHidlKeyBlob = blob2hidlVec(wrappingBlob);
991
992 rc = KS_HANDLE_HIDL_ERROR(keymasterDevice_->importWrappedKey(
993 wrappedKeyData, upgradedHidlKeyBlob, maskingKey, unwrappingParams, passwordSid,
994 biometricSid, hidlCb));
995 if (!rc.isOk()) {
996 error = rc;
997 }
998 }
999 return worker_cb(error, std::move(outCharacteristics));
1000 });
1001}
1002
1003void KeymasterWorker::exportKey(LockedKeyBlobEntry lockedEntry, KeyFormat exportFormat,
1004 hidl_vec<uint8_t> clientId, hidl_vec<uint8_t> appData, Blob keyBlob,
1005 Blob charBlob, exportKey_cb worker_cb) {
1006 Worker::addRequest([this, CAPTURE_MOVE(lockedEntry), exportFormat, CAPTURE_MOVE(clientId),
1007 CAPTURE_MOVE(appData), CAPTURE_MOVE(keyBlob), CAPTURE_MOVE(charBlob),
1008 CAPTURE_MOVE(worker_cb)]() mutable {
1009 auto key = blob2hidlVec(keyBlob);
1010
1011 ExportResult result;
1012 auto hidlCb = [&](ErrorCode ret,
1013 const ::android::hardware::hidl_vec<uint8_t>& keyMaterial) {
1014 result.resultCode = ret;
1015 if (!result.resultCode.isOk()) {
1016 if (result.resultCode == ErrorCode::INVALID_KEY_BLOB) {
1017 log_key_integrity_violation(lockedEntry->alias().c_str(), lockedEntry->uid());
1018 }
1019 return;
1020 }
1021 result.exportData = keyMaterial;
1022 };
1023 KeyStoreServiceReturnCode rc = KS_HANDLE_HIDL_ERROR(
1024 keymasterDevice_->exportKey(exportFormat, key, clientId, appData, hidlCb));
1025
1026 // Overwrite result->resultCode only on HIDL error. Otherwise we want the result set in the
1027 // callback hidlCb.
1028 if (!rc.isOk()) {
1029 result.resultCode = rc;
1030 }
1031
1032 if (result.resultCode == ErrorCode::KEY_REQUIRES_UPGRADE) {
1033 AuthorizationSet upgradeParams;
1034 if (clientId.size()) {
1035 upgradeParams.push_back(TAG_APPLICATION_ID, clientId);
1036 }
1037 if (appData.size()) {
1038 upgradeParams.push_back(TAG_APPLICATION_DATA, appData);
1039 }
1040 std::tie(rc, keyBlob) = upgradeKeyBlob(lockedEntry, upgradeParams);
1041 if (!rc.isOk()) {
1042 return worker_cb(std::move(result));
1043 }
1044
1045 auto upgradedHidlKeyBlob = blob2hidlVec(keyBlob);
1046
1047 rc = KS_HANDLE_HIDL_ERROR(keymasterDevice_->exportKey(exportFormat, upgradedHidlKeyBlob,
1048 clientId, appData, hidlCb));
1049 if (!rc.isOk()) {
1050 result.resultCode = rc;
1051 }
1052 }
1053 return worker_cb(std::move(result));
1054 });
1055}
1056void KeymasterWorker::attestKey(hidl_vec<uint8_t> keyToAttest, hidl_vec<KeyParameter> attestParams,
1057 attestKey_cb worker_cb) {
1058 addRequest(&Keymaster::attestKey, std::move(worker_cb), std::move(keyToAttest),
1059 std::move(attestParams));
1060}
1061void KeymasterWorker::upgradeKey(hidl_vec<uint8_t> keyBlobToUpgrade,
1062 hidl_vec<KeyParameter> upgradeParams, upgradeKey_cb _hidl_cb) {
1063 addRequest(&Keymaster::upgradeKey, std::move(_hidl_cb), std::move(keyBlobToUpgrade),
1064 std::move(upgradeParams));
1065}
1066
1067void KeymasterWorker::deleteKey(hidl_vec<uint8_t> keyBlob, deleteKey_cb _hidl_cb) {
1068 addRequest(&Keymaster::deleteKey, std::move(_hidl_cb), std::move(keyBlob));
1069}
1070void KeymasterWorker::deleteAllKeys(deleteAllKeys_cb _hidl_cb) {
1071 addRequest(&Keymaster::deleteAllKeys, std::move(_hidl_cb));
1072}
1073void KeymasterWorker::destroyAttestationIds(destroyAttestationIds_cb _hidl_cb) {
1074 addRequest(&Keymaster::destroyAttestationIds, move(_hidl_cb));
1075}
1076
1077void KeymasterWorker::binderDied(android::wp<IBinder> who) {
1078 Worker::addRequest([this, who]() {
1079 auto operations = operationMap_.getOperationsForToken(who.unsafe_get());
1080 for (const auto& token : operations) {
1081 abort(token);
1082 }
1083 });
1084}
1085
1086} // namespace keystore