blob: d616b3b7ec2f0eb292ce2310bc76ffc356dc458b [file] [log] [blame]
Andrew Sculle4e2ffc2017-08-10 10:03:20 +01001/*
2 * Copyright 2017, 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 "KeymasterDevice.h"
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -070018#include "buffer.h"
nagendra modaduguf5127a32018-01-24 16:30:49 -080019#include "export_key.h"
nagendra modadugu97471402017-09-27 14:01:00 -070020#include "import_key.h"
nagendra modaduguec667302017-12-04 21:37:22 -080021#include "import_wrapped_key.h"
nagendra modadugu284b9392017-09-27 13:51:23 -070022#include "proto_utils.h"
23
nagendra modadugu9e8c8562017-09-18 18:58:54 -070024#include <Keymaster.client.h>
Andrew Scull8e96ff02017-10-09 11:09:09 +010025#include <nos/debug.h>
nagendra modadugu284b9392017-09-27 13:51:23 -070026#include <nos/NuggetClient.h>
Andrew Sculle4e2ffc2017-08-10 10:03:20 +010027
nagendra modadugue2914e42018-01-02 17:42:46 -080028#include <keymasterV4_0/key_param_output.h>
29
Andrew Sculle4e2ffc2017-08-10 10:03:20 +010030#include <android-base/logging.h>
Allen Webb8fb68f12018-05-24 16:36:44 -070031#include <android-base/properties.h>
32
33#include <algorithm>
Andrew Sculle4e2ffc2017-08-10 10:03:20 +010034
35namespace android {
36namespace hardware {
37namespace keymaster {
38
Allen Webb8fb68f12018-05-24 16:36:44 -070039namespace {
40
41constexpr char PROPERTY_OS_VERSION[] = "ro.build.version.release";
42constexpr char PROPERTY_OS_PATCHLEVEL[] = "ro.build.version.security_patch";
43constexpr char PROPERTY_VENDOR_PATCHLEVEL[] = "ro.vendor.build.security_patch";
44
45std::string DigitsOnly(const std::string& code) {
Allen Webb3f96bd72018-05-25 08:01:32 -070046 // Keep digits only.
47 std::string filtered_code;
48 std::copy_if(code.begin(), code.end(), std::back_inserter(filtered_code),
49 isdigit);
50 return filtered_code;
Allen Webb8fb68f12018-05-24 16:36:44 -070051}
52
Allen Webb83542622018-05-31 16:04:49 -070053/** Get one version number from a string and move loc to the point after the
54 * next version delimiter.
55 */
56uint32_t ExtractVersion(const std::string& version, size_t* loc) {
57 if (*loc == std::string::npos || *loc >= version.size()) {
58 return 0;
59 }
60
61 uint32_t value = 0;
62 size_t new_loc = version.find('.', *loc);
63 if (new_loc == std::string::npos) {
Allen Webbfe116592018-06-06 16:26:29 -070064 auto sanitized = DigitsOnly(version.substr(*loc));
65 if (!sanitized.empty()) {
66 if (sanitized.size() < version.size() - *loc) {
67 LOG(ERROR) << "Unexpected version format: \"" << version
68 << "\"";
69 }
70 value = std::stoi(sanitized);
71 }
Allen Webb83542622018-05-31 16:04:49 -070072 *loc = new_loc;
73 } else {
Allen Webbfe116592018-06-06 16:26:29 -070074 auto sanitized = DigitsOnly(version.substr(*loc, new_loc - *loc));
75 if (!sanitized.empty()) {
76 if (sanitized.size() < new_loc - *loc) {
77 LOG(ERROR) << "Unexpected version format: \"" << version
78 << "\"";
79 }
80 value = std::stoi(sanitized);
81 }
Allen Webb83542622018-05-31 16:04:49 -070082 *loc = new_loc + 1;
83 }
84 return value;
85}
86
87uint32_t VersionToUint32(const std::string& version) {
88 size_t loc = 0;
89 uint32_t major = ExtractVersion(version, &loc);
90 uint32_t minor = ExtractVersion(version, &loc);
91 uint32_t subminor = ExtractVersion(version, &loc);
92 return major * 10000 + minor * 100 + subminor;
93}
94
Allen Webb8fb68f12018-05-24 16:36:44 -070095uint32_t DateCodeToUint32(const std::string& code, bool include_day) {
96 // Keep digits only.
97 std::string filtered_code = DigitsOnly(code);
98
99 // Return 0 if the date string has an unexpected number of digits.
100 uint32_t return_value = 0;
101 if (filtered_code.size() == 8) {
102 return_value = std::stoi(filtered_code);
103 if (!include_day) {
104 return_value /= 100;
105 }
106 } else if (filtered_code.size() == 6) {
107 return_value = std::stoi(filtered_code);
108 if (include_day) {
109 return_value *= 100;
110 }
Allen Webbfe116592018-06-06 16:26:29 -0700111 } else {
112 LOG(ERROR) << "Unexpected patchset format: \"" << code << "\"";
Allen Webb8fb68f12018-05-24 16:36:44 -0700113 }
114 return return_value;
115}
116
nagendra modadugu2a43a4c2018-10-10 17:44:34 -0700117// Helper class to call a finalizer on stack unwind.
118class Finalize {
119 private:
120 std::function<void()> f_;
121
122 public:
123 Finalize(std::function<void()> f) : f_(f) {}
124 ~Finalize() { if (f_) f_(); }
125 void release() { f_ = {}; }
126};
127
Allen Webb8fb68f12018-05-24 16:36:44 -0700128} // namespace
129
nagendra modadugu8a883372017-09-18 22:29:00 -0700130// std
131using std::string;
132
Allen Webb8fb68f12018-05-24 16:36:44 -0700133// base
134using ::android::base::GetProperty;
135
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100136// libhidl
137using ::android::hardware::Void;
138
139// HAL
nagendra modaduguf1101762018-01-04 17:59:51 -0800140using ::android::hardware::keymaster::V4_0::Algorithm;
nagendra modaduguec667302017-12-04 21:37:22 -0800141using ::android::hardware::keymaster::V4_0::KeyCharacteristics;
nagendra modaduguf1101762018-01-04 17:59:51 -0800142using ::android::hardware::keymaster::V4_0::KeyFormat;
nagendra modadugu24945ea2018-05-16 17:55:39 -0700143using ::android::hardware::keymaster::V4_0::HardwareAuthToken;
144using ::android::hardware::keymaster::V4_0::HardwareAuthenticatorType;
nagendra modaduguec667302017-12-04 21:37:22 -0800145using ::android::hardware::keymaster::V4_0::SecurityLevel;
146using ::android::hardware::keymaster::V4_0::Tag;
nagendra modadugu284b9392017-09-27 13:51:23 -0700147
148// nos
149using nos::NuggetClient;
150
151// Keymaster app
nagendra modaduguec667302017-12-04 21:37:22 -0800152// KM 3.0 types
nagendra modadugu284b9392017-09-27 13:51:23 -0700153using ::nugget::app::keymaster::AddRngEntropyRequest;
154using ::nugget::app::keymaster::AddRngEntropyResponse;
155using ::nugget::app::keymaster::GenerateKeyRequest;
156using ::nugget::app::keymaster::GenerateKeyResponse;
157using ::nugget::app::keymaster::GetKeyCharacteristicsRequest;
158using ::nugget::app::keymaster::GetKeyCharacteristicsResponse;
159using ::nugget::app::keymaster::ImportKeyRequest;
160using ::nugget::app::keymaster::ImportKeyResponse;
161using ::nugget::app::keymaster::ExportKeyRequest;
162using ::nugget::app::keymaster::ExportKeyResponse;
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700163using ::nugget::app::keymaster::StartAttestKeyRequest;
164using ::nugget::app::keymaster::StartAttestKeyResponse;
165using ::nugget::app::keymaster::ContinueAttestKeyRequest;
166using ::nugget::app::keymaster::ContinueAttestKeyResponse;
167using ::nugget::app::keymaster::FinishAttestKeyRequest;
168using ::nugget::app::keymaster::FinishAttestKeyResponse;
nagendra modadugu284b9392017-09-27 13:51:23 -0700169using ::nugget::app::keymaster::UpgradeKeyRequest;
170using ::nugget::app::keymaster::UpgradeKeyResponse;
171using ::nugget::app::keymaster::DeleteKeyRequest;
172using ::nugget::app::keymaster::DeleteKeyResponse;
173using ::nugget::app::keymaster::DeleteAllKeysRequest;
174using ::nugget::app::keymaster::DeleteAllKeysResponse;
175using ::nugget::app::keymaster::DestroyAttestationIdsRequest;
176using ::nugget::app::keymaster::DestroyAttestationIdsResponse;
177using ::nugget::app::keymaster::BeginOperationRequest;
178using ::nugget::app::keymaster::BeginOperationResponse;
179using ::nugget::app::keymaster::UpdateOperationRequest;
180using ::nugget::app::keymaster::UpdateOperationResponse;
181using ::nugget::app::keymaster::FinishOperationRequest;
182using ::nugget::app::keymaster::FinishOperationResponse;
183using ::nugget::app::keymaster::AbortOperationRequest;
184using ::nugget::app::keymaster::AbortOperationResponse;
Janis Danisevskisda932b92018-04-13 18:21:07 -0700185using ::nugget::app::keymaster::ComputeSharedHmacRequest;
186using ::nugget::app::keymaster::ComputeSharedHmacResponse;
187using ::nugget::app::keymaster::GetHmacSharingParametersRequest;
188using ::nugget::app::keymaster::GetHmacSharingParametersResponse;
Allen Webb6f869fd2018-05-25 09:02:25 -0700189using ::nugget::app::keymaster::SetSystemVersionInfoRequest;
190using ::nugget::app::keymaster::SetSystemVersionInfoResponse;
Allen Webbb5ec9122018-05-30 14:30:43 -0700191using ::nugget::app::keymaster::GetBootInfoRequest;
192using ::nugget::app::keymaster::GetBootInfoResponse;
nagendra modadugu284b9392017-09-27 13:51:23 -0700193
nagendra modaduguec667302017-12-04 21:37:22 -0800194// KM 4.0 types
195using ::nugget::app::keymaster::ImportWrappedKeyRequest;
Janis Danisevskisda932b92018-04-13 18:21:07 -0700196namespace nosapp = ::nugget::app::keymaster;
nagendra modaduguec667302017-12-04 21:37:22 -0800197
nagendra modadugu284b9392017-09-27 13:51:23 -0700198static ErrorCode status_to_error_code(uint32_t status)
199{
200 switch (status) {
201 case APP_SUCCESS:
202 return ErrorCode::OK;
203 break;
204 case APP_ERROR_BOGUS_ARGS:
205 return ErrorCode::INVALID_ARGUMENT;
206 break;
207 case APP_ERROR_INTERNAL:
208 return ErrorCode::UNKNOWN_ERROR;
209 break;
210 case APP_ERROR_TOO_MUCH:
211 return ErrorCode::INSUFFICIENT_BUFFER_SPACE;
212 break;
213 case APP_ERROR_RPC:
214 return ErrorCode::SECURE_HW_COMMUNICATION_FAILED;
215 break;
216 // TODO: app specific error codes go here.
217 default:
218 return ErrorCode::UNKNOWN_ERROR;
219 break;
220 }
221}
222
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700223#define KM_CALL(meth, request, response) { \
nagendra modadugu07be7f12017-12-28 11:20:45 -0800224 const uint32_t status = _keymaster. meth (request, &response); \
225 const ErrorCode error_code = translate_error_code(response.error_code()); \
226 if (status != APP_SUCCESS) { \
227 LOG(ERROR) << #meth << " : request failed with status: " \
228 << nos::StatusCodeString(status); \
229 return status_to_error_code(status); \
230 } \
231 if (error_code != ErrorCode::OK) { \
232 LOG(ERROR) << #meth << " : device response error code: " \
nagendra modadugue2914e42018-01-02 17:42:46 -0800233 << error_code; \
nagendra modadugu07be7f12017-12-28 11:20:45 -0800234 return error_code; \
235 } \
nagendra modadugu284b9392017-09-27 13:51:23 -0700236}
237
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700238#define KM_CALLV(meth, request, response, ...) { \
nagendra modadugu07be7f12017-12-28 11:20:45 -0800239 const uint32_t status = _keymaster. meth (request, &response); \
240 const ErrorCode error_code = translate_error_code(response.error_code()); \
241 if (status != APP_SUCCESS) { \
242 LOG(ERROR) << #meth << " : request failed with status: " \
243 << nos::StatusCodeString(status); \
244 _hidl_cb(status_to_error_code(status), __VA_ARGS__); \
245 return Void(); \
246 } \
247 if (error_code != ErrorCode::OK) { \
248 LOG(ERROR) << #meth << " : device response error code: " \
nagendra modadugue2914e42018-01-02 17:42:46 -0800249 << error_code; \
nagendra modadugu07be7f12017-12-28 11:20:45 -0800250 _hidl_cb(error_code, __VA_ARGS__); \
251 return Void(); \
252 } \
nagendra modadugu284b9392017-09-27 13:51:23 -0700253}
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100254
255// Methods from ::android::hardware::keymaster::V3_0::IKeymasterDevice follow.
nagendra modadugu284b9392017-09-27 13:51:23 -0700256
Allen Webb8fb68f12018-05-24 16:36:44 -0700257KeymasterDevice::KeymasterDevice(KeymasterClient& keymaster) :
258 _keymaster{keymaster} {
Allen Webb83542622018-05-31 16:04:49 -0700259 _os_version = VersionToUint32(GetProperty(PROPERTY_OS_VERSION, ""));
Allen Webbb5ec9122018-05-30 14:30:43 -0700260 _os_patchlevel = DateCodeToUint32(GetProperty(PROPERTY_OS_PATCHLEVEL, ""),
Allen Webb3f96bd72018-05-25 08:01:32 -0700261 false /* include_day */);
Allen Webbb5ec9122018-05-30 14:30:43 -0700262 _vendor_patchlevel = DateCodeToUint32(
Allen Webb3f96bd72018-05-25 08:01:32 -0700263 GetProperty(PROPERTY_VENDOR_PATCHLEVEL, ""),
264 true /* include_day */);
Allen Webb6f869fd2018-05-25 09:02:25 -0700265
Allen Webbb5ec9122018-05-30 14:30:43 -0700266 SendSystemVersionInfo();
267 GetBootInfo();
Allen Webb8fb68f12018-05-24 16:36:44 -0700268}
269
nagendra modaduguec667302017-12-04 21:37:22 -0800270Return<void> KeymasterDevice::getHardwareInfo(
271 getHardwareInfo_cb _hidl_cb)
nagendra modadugu284b9392017-09-27 13:51:23 -0700272{
nagendra modaduguec667302017-12-04 21:37:22 -0800273 LOG(VERBOSE) << "Running KeymasterDevice::getHardwareInfo";
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100274
nagendra modadugu8a883372017-09-18 22:29:00 -0700275 (void)_keymaster;
nagendra modaduguec667302017-12-04 21:37:22 -0800276 _hidl_cb(SecurityLevel::STRONGBOX,
277 string("CitadelKeymaster"), string("Google"));
278
279 return Void();
280}
281
282Return<void> KeymasterDevice::getHmacSharingParameters(
283 getHmacSharingParameters_cb _hidl_cb)
284{
285 LOG(VERBOSE) << "Running KeymasterDevice::getHmacSharingParameters";
286
Janis Danisevskisda932b92018-04-13 18:21:07 -0700287 GetHmacSharingParametersRequest request;
288 GetHmacSharingParametersResponse response;
289 HmacSharingParameters result;
290
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700291 KM_CALLV(GetHmacSharingParameters, request, response, result);
Janis Danisevskisda932b92018-04-13 18:21:07 -0700292
293 ErrorCode ec = translate_error_code(response.error_code());
294
295 if (ec != ErrorCode::OK) {
296 _hidl_cb(ec, HmacSharingParameters());
297 }
298
299 const std::string & nonce = response.hmac_sharing_params().nonce();
300 const std::string & seed = response.hmac_sharing_params().seed();
301
302 if (seed.size() == 32) {
303 result.seed.setToExternal(reinterpret_cast<uint8_t*>(
304 const_cast<char*>(seed.data())),
305 seed.size(), false);
306 } else if (seed.size() != 0) {
307 LOG(ERROR) << "Citadel returned unexpected seed size: "
308 << seed.size();
309 _hidl_cb(ErrorCode::UNKNOWN_ERROR, HmacSharingParameters());
310 return Void();
311 }
312
313 if (nonce.size() == result.nonce.size()) {
314 std::copy(nonce.begin(), nonce.end(), result.nonce.data());
315 } else {
316 LOG(ERROR) << "Citadel returned unexpected nonce size: "
317 << nonce.size();
318 _hidl_cb(ErrorCode::UNKNOWN_ERROR, HmacSharingParameters());
319 return Void();
320 }
321
322 _hidl_cb(ec, result);
nagendra modaduguec667302017-12-04 21:37:22 -0800323
324 return Void();
325}
326
327Return<void> KeymasterDevice::computeSharedHmac(
328 const hidl_vec<HmacSharingParameters>& params,
329 computeSharedHmac_cb _hidl_cb)
330{
Janis Danisevskisda932b92018-04-13 18:21:07 -0700331 LOG(VERBOSE) << "Running KeymasterDevice::computeSharedHmac";
nagendra modaduguec667302017-12-04 21:37:22 -0800332
Janis Danisevskisda932b92018-04-13 18:21:07 -0700333 ComputeSharedHmacRequest request;
334 ComputeSharedHmacResponse response;
335 hidl_vec<uint8_t> result;
nagendra modaduguec667302017-12-04 21:37:22 -0800336
Janis Danisevskisda932b92018-04-13 18:21:07 -0700337 for (const HmacSharingParameters & param : params) {
338 // TODO respect max number of parameters defined in
339 // keymaster_types.proto
340 nosapp::HmacSharingParameters* req_param =
341 request.add_hmac_sharing_params();
342 req_param->set_nonce(
343 reinterpret_cast<const int8_t*>(
344 param.nonce.data()), param.nonce.size());
345 req_param->set_seed(reinterpret_cast<const int8_t*>(param.seed.data()),
346 param.seed.size());
347 }
348
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700349 KM_CALLV(ComputeSharedHmac, request, response, result);
Janis Danisevskisda932b92018-04-13 18:21:07 -0700350
351 ErrorCode ec = translate_error_code(response.error_code());
352
353 if (ec != ErrorCode::OK) {
354 _hidl_cb(ec, result);
355 return Void();
356 }
357
358 const std::string & share_check = response.sharing_check();
359
360 result.setToExternal(reinterpret_cast<uint8_t*>(
361 const_cast<char*>(share_check.data())), share_check.size(), false);
362 _hidl_cb(ec, result);
nagendra modaduguec667302017-12-04 21:37:22 -0800363
364 return Void();
365}
366
367Return<void> KeymasterDevice::verifyAuthorization(
nagendra modadugu24945ea2018-05-16 17:55:39 -0700368 uint64_t operationHandle, const hidl_vec<KeyParameter>& parametersToVerify,
nagendra modaduguec667302017-12-04 21:37:22 -0800369 const HardwareAuthToken& authToken, verifyAuthorization_cb _hidl_cb)
370{
371 LOG(VERBOSE) << "Running KeymasterDevice::verifyAuthorization";
372
nagendra modadugu24945ea2018-05-16 17:55:39 -0700373 (void)operationHandle;
nagendra modaduguec667302017-12-04 21:37:22 -0800374 (void)parametersToVerify;
375 (void)authToken;
376
377 (void)_keymaster;
378 _hidl_cb(ErrorCode::UNIMPLEMENTED, VerificationToken());
379
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100380 return Void();
381}
382
nagendra modadugu284b9392017-09-27 13:51:23 -0700383Return<ErrorCode> KeymasterDevice::addRngEntropy(const hidl_vec<uint8_t>& data)
384{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100385 LOG(VERBOSE) << "Running KeymasterDevice::addRngEntropy";
386
nagendra modadugu284b9392017-09-27 13:51:23 -0700387 if (!data.size()) return ErrorCode::OK;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100388
nagendra modadugue2914e42018-01-02 17:42:46 -0800389 const size_t chunk_size = 1024;
390 for (size_t i = 0; i < data.size(); i += chunk_size) {
391 AddRngEntropyRequest request;
392 AddRngEntropyResponse response;
nagendra modadugu284b9392017-09-27 13:51:23 -0700393
nagendra modadugue2914e42018-01-02 17:42:46 -0800394 request.set_data(&data[i], std::min(chunk_size, data.size() - i));
nagendra modadugu284b9392017-09-27 13:51:23 -0700395
nagendra modadugue2914e42018-01-02 17:42:46 -0800396 // Call device.
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700397 KM_CALL(AddRngEntropy, request, response);
nagendra modadugue2914e42018-01-02 17:42:46 -0800398 }
399
400 return ErrorCode::OK;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100401}
402
nagendra modadugu284b9392017-09-27 13:51:23 -0700403Return<void> KeymasterDevice::generateKey(
404 const hidl_vec<KeyParameter>& keyParams,
405 generateKey_cb _hidl_cb)
406{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100407 LOG(VERBOSE) << "Running KeymasterDevice::generateKey";
408
nagendra modadugu284b9392017-09-27 13:51:23 -0700409 GenerateKeyRequest request;
410 GenerateKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100411
nagendra modadugue3ef4692017-10-25 23:58:07 -0700412 hidl_vec<uint8_t> blob;
413 KeyCharacteristics characteristics;
414 if (hidl_params_to_pb(
415 keyParams, request.mutable_params()) != ErrorCode::OK) {
416 _hidl_cb(ErrorCode::INVALID_ARGUMENT, blob, characteristics);
417 return Void();
418 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700419
420 // Call device.
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700421 KM_CALLV(GenerateKey, request, response,
422 hidl_vec<uint8_t>{}, KeyCharacteristics());
nagendra modadugu284b9392017-09-27 13:51:23 -0700423
nagendra modadugu284b9392017-09-27 13:51:23 -0700424 blob.setToExternal(
425 reinterpret_cast<uint8_t*>(
426 const_cast<char*>(response.blob().blob().data())),
427 response.blob().blob().size(), false);
nagendra modadugue3ef4692017-10-25 23:58:07 -0700428 pb_to_hidl_params(response.characteristics().software_enforced(),
429 &characteristics.softwareEnforced);
nagendra modadugu284b9392017-09-27 13:51:23 -0700430 pb_to_hidl_params(response.characteristics().tee_enforced(),
nagendra modaduguec667302017-12-04 21:37:22 -0800431 &characteristics.hardwareEnforced);
nagendra modadugu284b9392017-09-27 13:51:23 -0700432
nagendra modadugue2914e42018-01-02 17:42:46 -0800433 _hidl_cb(translate_error_code(response.error_code()),
434 blob, characteristics);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100435 return Void();
436}
437
nagendra modadugu284b9392017-09-27 13:51:23 -0700438Return<void> KeymasterDevice::getKeyCharacteristics(
439 const hidl_vec<uint8_t>& keyBlob,
440 const hidl_vec<uint8_t>& clientId,
441 const hidl_vec<uint8_t>& appData,
442 getKeyCharacteristics_cb _hidl_cb)
443{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100444 LOG(VERBOSE) << "Running KeymasterDevice::getKeyCharacteristics";
445
nagendra modadugu284b9392017-09-27 13:51:23 -0700446 GetKeyCharacteristicsRequest request;
447 GetKeyCharacteristicsResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100448
nagendra modadugu284b9392017-09-27 13:51:23 -0700449 request.mutable_blob()->set_blob(&keyBlob[0], keyBlob.size());
450 request.set_client_id(&clientId[0], clientId.size());
451 request.set_app_data(&appData[0], appData.size());
452
453 // Call device.
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700454 KM_CALLV(GetKeyCharacteristics, request, response, KeyCharacteristics());
nagendra modadugu284b9392017-09-27 13:51:23 -0700455
456 KeyCharacteristics characteristics;
nagendra modadugue3ef4692017-10-25 23:58:07 -0700457 pb_to_hidl_params(response.characteristics().software_enforced(),
458 &characteristics.softwareEnforced);
nagendra modadugu284b9392017-09-27 13:51:23 -0700459 pb_to_hidl_params(response.characteristics().tee_enforced(),
nagendra modaduguec667302017-12-04 21:37:22 -0800460 &characteristics.hardwareEnforced);
nagendra modadugu284b9392017-09-27 13:51:23 -0700461
nagendra modadugue2914e42018-01-02 17:42:46 -0800462 _hidl_cb(translate_error_code(response.error_code()), characteristics);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100463 return Void();
464}
465
nagendra modadugu284b9392017-09-27 13:51:23 -0700466Return<void> KeymasterDevice::importKey(
467 const hidl_vec<KeyParameter>& params, KeyFormat keyFormat,
468 const hidl_vec<uint8_t>& keyData, importKey_cb _hidl_cb)
469{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100470 LOG(VERBOSE) << "Running KeymasterDevice::importKey";
471
nagendra modadugu97471402017-09-27 14:01:00 -0700472 ErrorCode error;
nagendra modadugu284b9392017-09-27 13:51:23 -0700473 ImportKeyRequest request;
474 ImportKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100475
nagendra modadugu97471402017-09-27 14:01:00 -0700476 error = import_key_request(params, keyFormat, keyData, &request);
477 if (error != ErrorCode::OK) {
478 LOG(ERROR) << "ImportKey request parsing failed with error "
nagendra modadugue2914e42018-01-02 17:42:46 -0800479 << error;
nagendra modadugu97471402017-09-27 14:01:00 -0700480 _hidl_cb(error, hidl_vec<uint8_t>{}, KeyCharacteristics{});
481 return Void();
482 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700483
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700484 KM_CALLV(ImportKey, request, response,
485 hidl_vec<uint8_t>{}, KeyCharacteristics{});
nagendra modadugu284b9392017-09-27 13:51:23 -0700486
487 hidl_vec<uint8_t> blob;
488 blob.setToExternal(
489 reinterpret_cast<uint8_t*>(
490 const_cast<char*>(response.blob().blob().data())),
491 response.blob().blob().size(), false);
492
493 KeyCharacteristics characteristics;
nagendra modadugue3ef4692017-10-25 23:58:07 -0700494 pb_to_hidl_params(response.characteristics().software_enforced(),
495 &characteristics.softwareEnforced);
nagendra modadugu97471402017-09-27 14:01:00 -0700496 error = pb_to_hidl_params(response.characteristics().tee_enforced(),
nagendra modaduguec667302017-12-04 21:37:22 -0800497 &characteristics.hardwareEnforced);
nagendra modadugu97471402017-09-27 14:01:00 -0700498 if (error != ErrorCode::OK) {
499 LOG(ERROR) << "KeymasterDevice::importKey: response tee_enforced :"
nagendra modadugue2914e42018-01-02 17:42:46 -0800500 << error;
nagendra modaduguec667302017-12-04 21:37:22 -0800501 _hidl_cb(error, hidl_vec<uint8_t>{}, KeyCharacteristics{});
502 return Void();
nagendra modadugu97471402017-09-27 14:01:00 -0700503 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700504
505 _hidl_cb(ErrorCode::OK, blob, characteristics);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100506 return Void();
507}
508
nagendra modadugu284b9392017-09-27 13:51:23 -0700509Return<void> KeymasterDevice::exportKey(
510 KeyFormat exportFormat, const hidl_vec<uint8_t>& keyBlob,
511 const hidl_vec<uint8_t>& clientId,
512 const hidl_vec<uint8_t>& appData, exportKey_cb _hidl_cb)
513{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100514 LOG(VERBOSE) << "Running KeymasterDevice::exportKey";
515
nagendra modadugu284b9392017-09-27 13:51:23 -0700516 ExportKeyRequest request;
517 ExportKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100518
nagendra modadugu284b9392017-09-27 13:51:23 -0700519 request.set_format((::nugget::app::keymaster::KeyFormat)exportFormat);
520 request.mutable_blob()->set_blob(&keyBlob[0], keyBlob.size());
521 request.set_client_id(&clientId[0], clientId.size());
522 request.set_app_data(&appData[0], appData.size());
523
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700524 KM_CALLV(ExportKey, request, response, hidl_vec<uint8_t>{});
nagendra modadugu284b9392017-09-27 13:51:23 -0700525
nagendra modaduguf5127a32018-01-24 16:30:49 -0800526 ErrorCode error_code = translate_error_code(response.error_code());
527 if (error_code != ErrorCode::OK) {
528 _hidl_cb(error_code, hidl_vec<uint8_t>{});
529 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700530
nagendra modaduguf5127a32018-01-24 16:30:49 -0800531 hidl_vec<uint8_t> der;
532 error_code = export_key_der(response, &der);
533
534 _hidl_cb(error_code, der);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100535 return Void();
536}
537
nagendra modadugu284b9392017-09-27 13:51:23 -0700538Return<void> KeymasterDevice::attestKey(
539 const hidl_vec<uint8_t>& keyToAttest,
540 const hidl_vec<KeyParameter>& attestParams,
541 attestKey_cb _hidl_cb)
542{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100543 LOG(VERBOSE) << "Running KeymasterDevice::attestKey";
544
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700545 StartAttestKeyRequest startRequest;
546 StartAttestKeyResponse startResponse;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100547
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700548 startRequest.mutable_blob()->set_blob(&keyToAttest[0], keyToAttest.size());
nagendra modadugue3ef4692017-10-25 23:58:07 -0700549
550 vector<hidl_vec<uint8_t> > chain;
551 if (hidl_params_to_pb(
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700552 attestParams, startRequest.mutable_params()) != ErrorCode::OK) {
nagendra modadugue3ef4692017-10-25 23:58:07 -0700553 _hidl_cb(ErrorCode::INVALID_ARGUMENT, chain);
554 return Void();
555 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700556
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700557 // TODO:
558 // startRequest.set_attestation_app_id_len(
559 // attestation_app_id_len(attestParams));
nagendra modadugu284b9392017-09-27 13:51:23 -0700560
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700561 KM_CALLV(StartAttestKey, startRequest, startResponse,
562 hidl_vec<hidl_vec<uint8_t> >{});
nagendra modadugu284b9392017-09-27 13:51:23 -0700563
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700564 uint64_t operationHandle = startResponse.handle().handle();
565 ContinueAttestKeyRequest continueRequest;
566 ContinueAttestKeyResponse continueResponse;
nagendra modadugu2a43a4c2018-10-10 17:44:34 -0700567 // Prepare to abort the pending operation in event of an error.
568 Finalize finalize([&] () { abort(operationHandle); });
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700569
570 continueRequest.mutable_handle()->set_handle(operationHandle);
571 // TODO
572 // continueRequest.set_attestation_app_id(
573 // attestation_app_id(attestParams));
574
575 KM_CALLV(ContinueAttestKey, continueRequest, continueResponse,
576 hidl_vec<hidl_vec<uint8_t> >{});
577
578 FinishAttestKeyRequest finishRequest;
579 FinishAttestKeyResponse finishResponse;
580
581 finishRequest.mutable_handle()->set_handle(operationHandle);
582
583 KM_CALLV(FinishAttestKey, finishRequest, finishResponse,
584 hidl_vec<hidl_vec<uint8_t> >{});
585
586 std::stringstream ss;
587 ss << startResponse.certificate_prologue();
588 ss << continueResponse.certificate_body();
589 ss << finishResponse.certificate_epilogue();
590
591 hidl_vec<uint8_t> attestation_certificate;
592 attestation_certificate.setToExternal(
593 reinterpret_cast<uint8_t*>(
594 const_cast<char*>(ss.str().data())),
595 ss.str().size(), false);
596
597 chain.push_back(attestation_certificate);
598 // TODO:
599 // chain.push_back(intermediate_certificate());
600 // chain.push_back(root_certificate());
601 // verify cert chain
602
603 _hidl_cb(ErrorCode::OK, hidl_vec<hidl_vec<uint8_t> >(chain));
nagendra modadugu2a43a4c2018-10-10 17:44:34 -0700604 finalize.release();
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100605 return Void();
606}
607
nagendra modadugu284b9392017-09-27 13:51:23 -0700608Return<void> KeymasterDevice::upgradeKey(
609 const hidl_vec<uint8_t>& keyBlobToUpgrade,
610 const hidl_vec<KeyParameter>& upgradeParams,
611 upgradeKey_cb _hidl_cb)
612{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100613 LOG(VERBOSE) << "Running KeymasterDevice::upgradeKey";
614
nagendra modadugu284b9392017-09-27 13:51:23 -0700615 UpgradeKeyRequest request;
616 UpgradeKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100617
nagendra modadugu284b9392017-09-27 13:51:23 -0700618 request.mutable_blob()->set_blob(&keyBlobToUpgrade[0],
619 keyBlobToUpgrade.size());
nagendra modadugue3ef4692017-10-25 23:58:07 -0700620
621 hidl_vec<uint8_t> blob;
622 if (hidl_params_to_pb(
623 upgradeParams, request.mutable_params()) != ErrorCode::OK) {
624 _hidl_cb(ErrorCode::INVALID_ARGUMENT, blob);
625 return Void();
626 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700627
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700628 KM_CALLV(UpgradeKey, request, response, hidl_vec<uint8_t>{});
nagendra modadugu284b9392017-09-27 13:51:23 -0700629
nagendra modadugu284b9392017-09-27 13:51:23 -0700630 blob.setToExternal(
631 reinterpret_cast<uint8_t*>(
632 const_cast<char*>(response.blob().blob().data())),
633 response.blob().blob().size(), false);
634
nagendra modadugue2914e42018-01-02 17:42:46 -0800635 _hidl_cb(translate_error_code(response.error_code()), blob);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100636 return Void();
637}
638
nagendra modadugu284b9392017-09-27 13:51:23 -0700639Return<ErrorCode> KeymasterDevice::deleteKey(const hidl_vec<uint8_t>& keyBlob)
640{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100641 LOG(VERBOSE) << "Running KeymasterDevice::deleteKey";
642
nagendra modadugu284b9392017-09-27 13:51:23 -0700643 DeleteKeyRequest request;
644 DeleteKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100645
nagendra modadugu284b9392017-09-27 13:51:23 -0700646 request.mutable_blob()->set_blob(&keyBlob[0], keyBlob.size());
647
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700648 KM_CALL(DeleteKey, request, response);
nagendra modadugu284b9392017-09-27 13:51:23 -0700649
nagendra modadugue2914e42018-01-02 17:42:46 -0800650 return translate_error_code(response.error_code());
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100651}
652
nagendra modadugu284b9392017-09-27 13:51:23 -0700653Return<ErrorCode> KeymasterDevice::deleteAllKeys()
654{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100655 LOG(VERBOSE) << "Running KeymasterDevice::deleteAllKeys";
656
nagendra modadugu284b9392017-09-27 13:51:23 -0700657 DeleteAllKeysRequest request;
658 DeleteAllKeysResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100659
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700660 KM_CALL(DeleteAllKeys, request, response);
nagendra modadugu284b9392017-09-27 13:51:23 -0700661
nagendra modadugue2914e42018-01-02 17:42:46 -0800662 return translate_error_code(response.error_code());
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100663}
664
nagendra modadugu284b9392017-09-27 13:51:23 -0700665Return<ErrorCode> KeymasterDevice::destroyAttestationIds()
666{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100667 LOG(VERBOSE) << "Running KeymasterDevice::destroyAttestationIds";
668
nagendra modadugu284b9392017-09-27 13:51:23 -0700669 DestroyAttestationIdsRequest request;
670 DestroyAttestationIdsResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100671
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700672 KM_CALL(DestroyAttestationIds, request, response);
nagendra modadugu284b9392017-09-27 13:51:23 -0700673
nagendra modadugue2914e42018-01-02 17:42:46 -0800674 return translate_error_code(response.error_code());
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100675}
676
nagendra modadugu284b9392017-09-27 13:51:23 -0700677Return<void> KeymasterDevice::begin(
678 KeyPurpose purpose, const hidl_vec<uint8_t>& key,
nagendra modaduguec667302017-12-04 21:37:22 -0800679 const hidl_vec<KeyParameter>& inParams,
680 const HardwareAuthToken& authToken,
681 begin_cb _hidl_cb)
nagendra modadugu284b9392017-09-27 13:51:23 -0700682{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100683 LOG(VERBOSE) << "Running KeymasterDevice::begin";
684
nagendra modadugu284b9392017-09-27 13:51:23 -0700685 BeginOperationRequest request;
686 BeginOperationResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100687
nagendra modadugu284b9392017-09-27 13:51:23 -0700688 request.set_purpose((::nugget::app::keymaster::KeyPurpose)purpose);
689 request.mutable_blob()->set_blob(&key[0], key.size());
nagendra modadugue3ef4692017-10-25 23:58:07 -0700690
691 hidl_vec<KeyParameter> params;
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700692 tag_map_t tag_map;
nagendra modadugu24945ea2018-05-16 17:55:39 -0700693 if (translate_auth_token(
694 authToken, request.mutable_auth_token()) != ErrorCode::OK) {
695 _hidl_cb(ErrorCode::INVALID_ARGUMENT, params,
696 response.handle().handle());
697 return Void();
698 }
nagendra modadugue3ef4692017-10-25 23:58:07 -0700699 if (hidl_params_to_pb(
700 inParams, request.mutable_params()) != ErrorCode::OK) {
701 _hidl_cb(ErrorCode::INVALID_ARGUMENT, params,
702 response.handle().handle());
703 return Void();
704 }
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700705 if (hidl_params_to_map(inParams, &tag_map) != ErrorCode::OK) {
706 _hidl_cb(ErrorCode::INVALID_ARGUMENT, params,
707 response.handle().handle());
708 return Void();
709 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700710
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700711 KM_CALLV(BeginOperation, request, response, hidl_vec<KeyParameter>{}, 0);
nagendra modadugu284b9392017-09-27 13:51:23 -0700712
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700713 // Setup HAL buffering for this operation's data.
714 Algorithm algorithm;
715 if (translate_algorithm(response.algorithm(), &algorithm) !=
716 ErrorCode::OK) {
717 if (this->abort(response.handle().handle()) != ErrorCode::OK) {
718 LOG(ERROR) << "abort( " << response.handle().handle()
719 << ") failed";
720 }
721 _hidl_cb(ErrorCode::INVALID_ARGUMENT, params,
722 response.handle().handle());
723 return Void();
724 }
nagendra modadugu3e864352018-06-07 09:16:52 -0700725 ErrorCode error_code = buffer_begin(response.handle().handle(), algorithm);
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700726 if (error_code != ErrorCode::OK) {
727 if (this->abort(response.handle().handle()) != ErrorCode::OK) {
728 LOG(ERROR) << "abort( " << response.handle().handle()
729 << ") failed";
730 }
731 _hidl_cb(ErrorCode::UNKNOWN_ERROR, params,
732 response.handle().handle());
733 return Void();
734 }
735
nagendra modadugu284b9392017-09-27 13:51:23 -0700736 pb_to_hidl_params(response.params(), &params);
737
nagendra modadugue2914e42018-01-02 17:42:46 -0800738 _hidl_cb(translate_error_code(response.error_code()), params,
nagendra modadugu284b9392017-09-27 13:51:23 -0700739 response.handle().handle());
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100740 return Void();
741}
742
nagendra modadugu284b9392017-09-27 13:51:23 -0700743Return<void> KeymasterDevice::update(
744 uint64_t operationHandle,
745 const hidl_vec<KeyParameter>& inParams,
nagendra modaduguec667302017-12-04 21:37:22 -0800746 const hidl_vec<uint8_t>& input,
747 const HardwareAuthToken& authToken,
748 const VerificationToken& verificationToken,
749 update_cb _hidl_cb)
nagendra modadugu284b9392017-09-27 13:51:23 -0700750{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100751 LOG(VERBOSE) << "Running KeymasterDevice::update";
752
nagendra modadugu284b9392017-09-27 13:51:23 -0700753 UpdateOperationRequest request;
754 UpdateOperationResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100755
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700756 // TODO: does keystore chunk stream data? To what quantum?
nagendra modadugu19439672018-01-17 16:43:26 -0800757 if (input.size() > KM_MAX_PROTO_FIELD_SIZE) {
758 LOG(ERROR) << "Excess input length: " << input.size()
759 << "max allowed: " << KM_MAX_PROTO_FIELD_SIZE;
760 if (this->abort(operationHandle) != ErrorCode::OK) {
761 LOG(ERROR) << "abort( " << operationHandle
762 << ") failed";
763 }
764 _hidl_cb(ErrorCode::INVALID_INPUT_LENGTH, 0,
765 hidl_vec<KeyParameter>{}, hidl_vec<uint8_t>{});
766 return Void();
767 }
768
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700769 uint32_t consumed;
770 hidl_vec<uint8_t> output;
771 hidl_vec<KeyParameter> params;
772 ErrorCode error_code;
773 error_code = buffer_append(operationHandle, input, &consumed);
774 if (error_code != ErrorCode::OK) {
775 _hidl_cb(error_code, 0, params, output);
776 return Void();
777 }
778
779 hidl_vec<uint8_t> blocks;
nagendra modadugu9d75b7d2018-06-05 14:53:57 -0700780 error_code = buffer_peek(operationHandle, &blocks);
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700781 if (error_code != ErrorCode::OK) {
782 _hidl_cb(error_code, 0, params, output);
783 return Void();
784 }
785
786 if (blocks.size() == 0) {
787 // Insufficient data available to proceed.
788 _hidl_cb(ErrorCode::OK, consumed, params, output);
789 return Void();
790 }
791
nagendra modadugu284b9392017-09-27 13:51:23 -0700792 request.mutable_handle()->set_handle(operationHandle);
nagendra modadugue3ef4692017-10-25 23:58:07 -0700793
nagendra modadugue3ef4692017-10-25 23:58:07 -0700794 if (hidl_params_to_pb(
795 inParams, request.mutable_params()) != ErrorCode::OK) {
796 _hidl_cb(ErrorCode::INVALID_ARGUMENT, 0, params, output);
797 return Void();
798 }
799
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700800 request.set_input(&blocks[0], blocks.size());
nagendra modadugu24945ea2018-05-16 17:55:39 -0700801 if (translate_auth_token(
802 authToken, request.mutable_auth_token()) != ErrorCode::OK) {
803 _hidl_cb(ErrorCode::INVALID_ARGUMENT, 0, params, output);
804 return Void();
805 }
806 translate_verification_token(verificationToken,
807 request.mutable_verification_token());
nagendra modadugu284b9392017-09-27 13:51:23 -0700808
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700809 KM_CALLV(UpdateOperation, request, response,
810 0, hidl_vec<KeyParameter>{}, hidl_vec<uint8_t>{});
nagendra modadugu284b9392017-09-27 13:51:23 -0700811
nagendra modadugu9d75b7d2018-06-05 14:53:57 -0700812 if (buffer_advance(operationHandle, response.consumed()) != ErrorCode::OK) {
813 _hidl_cb(ErrorCode::UNKNOWN_ERROR, 0, params, output);
814 return Void();
815 }
816
nagendra modadugu284b9392017-09-27 13:51:23 -0700817 pb_to_hidl_params(response.params(), &params);
818 output.setToExternal(
819 reinterpret_cast<uint8_t*>(const_cast<char*>(response.output().data())),
820 response.output().size(), false);
821
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700822 _hidl_cb(ErrorCode::OK, consumed, params, output);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100823 return Void();
824}
825
nagendra modadugu284b9392017-09-27 13:51:23 -0700826Return<void> KeymasterDevice::finish(
827 uint64_t operationHandle,
828 const hidl_vec<KeyParameter>& inParams,
829 const hidl_vec<uint8_t>& input,
nagendra modaduguec667302017-12-04 21:37:22 -0800830 const hidl_vec<uint8_t>& signature,
831 const HardwareAuthToken& authToken,
832 const VerificationToken& verificationToken,
833 finish_cb _hidl_cb)
nagendra modadugu284b9392017-09-27 13:51:23 -0700834{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100835 LOG(VERBOSE) << "Running KeymasterDevice::finish";
836
nagendra modadugu284b9392017-09-27 13:51:23 -0700837 FinishOperationRequest request;
838 FinishOperationResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100839
nagendra modadugu19439672018-01-17 16:43:26 -0800840 if (input.size() > KM_MAX_PROTO_FIELD_SIZE) {
841 LOG(ERROR) << "Excess input length: " << input.size()
842 << "max allowed: " << KM_MAX_PROTO_FIELD_SIZE;
843 if (this->abort(operationHandle) != ErrorCode::OK) {
844 LOG(ERROR) << "abort( " << operationHandle
845 << ") failed";
846 }
847 _hidl_cb(ErrorCode::INVALID_INPUT_LENGTH,
848 hidl_vec<KeyParameter>{}, hidl_vec<uint8_t>{});
849 return Void();
850 }
851
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700852 uint32_t consumed;
853 ErrorCode error_code;
854 error_code = buffer_append(operationHandle, input, &consumed);
855 if (error_code != ErrorCode::OK) {
856 _hidl_cb(error_code,
857 hidl_vec<KeyParameter>{}, hidl_vec<uint8_t>{});
858 return Void();
859 }
860
861 hidl_vec<uint8_t> data;
862 error_code = buffer_final(operationHandle, &data);
863 if (error_code != ErrorCode::OK) {
864 _hidl_cb(error_code,
865 hidl_vec<KeyParameter>{}, hidl_vec<uint8_t>{});
866 return Void();
867 }
868
nagendra modadugu284b9392017-09-27 13:51:23 -0700869 request.mutable_handle()->set_handle(operationHandle);
nagendra modadugue3ef4692017-10-25 23:58:07 -0700870
871 hidl_vec<KeyParameter> params;
872 hidl_vec<uint8_t> output;
873 if (hidl_params_to_pb(
874 inParams, request.mutable_params()) != ErrorCode::OK) {
875 _hidl_cb(ErrorCode::INVALID_ARGUMENT, params, output);
876 return Void();
877 }
878
nagendra modadugu6c9d8bd2018-06-03 02:41:03 -0700879 request.set_input(&data[0], data.size());
nagendra modadugu284b9392017-09-27 13:51:23 -0700880 request.set_signature(&signature[0], signature.size());
881
nagendra modadugu24945ea2018-05-16 17:55:39 -0700882 if (translate_auth_token(
883 authToken, request.mutable_auth_token()) != ErrorCode::OK) {
884 _hidl_cb(ErrorCode::INVALID_ARGUMENT, params, output);
885 return Void();
886 }
887 translate_verification_token(verificationToken,
888 request.mutable_verification_token());
nagendra modaduguec667302017-12-04 21:37:22 -0800889
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700890 KM_CALLV(FinishOperation, request, response,
891 hidl_vec<KeyParameter>{}, hidl_vec<uint8_t>{});
nagendra modadugu284b9392017-09-27 13:51:23 -0700892
nagendra modadugu284b9392017-09-27 13:51:23 -0700893 pb_to_hidl_params(response.params(), &params);
nagendra modadugu284b9392017-09-27 13:51:23 -0700894 output.setToExternal(
895 reinterpret_cast<uint8_t*>(const_cast<char*>(response.output().data())),
896 response.output().size(), false);
897
898 _hidl_cb(ErrorCode::OK, params, output);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100899 return Void();
900}
901
nagendra modadugu284b9392017-09-27 13:51:23 -0700902Return<ErrorCode> KeymasterDevice::abort(uint64_t operationHandle)
903{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100904 LOG(VERBOSE) << "Running KeymasterDevice::abort";
905
nagendra modadugu284b9392017-09-27 13:51:23 -0700906 AbortOperationRequest request;
907 AbortOperationResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100908
nagendra modadugu284b9392017-09-27 13:51:23 -0700909 request.mutable_handle()->set_handle(operationHandle);
910
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700911 KM_CALL(AbortOperation, request, response);
nagendra modadugu284b9392017-09-27 13:51:23 -0700912
913 return ErrorCode::OK;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100914}
915
nagendra modaduguec667302017-12-04 21:37:22 -0800916// Methods from ::android::hardware::keymaster::V4_0::IKeymasterDevice follow.
917Return<void> KeymasterDevice::importWrappedKey(
918 const hidl_vec<uint8_t>& wrappedKeyData,
919 const hidl_vec<uint8_t>& wrappingKeyBlob,
920 const hidl_vec<uint8_t>& maskingKey,
nagendra modadugu9c231ef2018-01-19 15:51:59 -0800921 const hidl_vec<KeyParameter>& /* unwrappingParams */,
922 uint64_t /* passwordSid */, uint64_t /* biometricSid */,
nagendra modaduguec667302017-12-04 21:37:22 -0800923 importWrappedKey_cb _hidl_cb)
924{
925 LOG(VERBOSE) << "Running KeymasterDevice::importWrappedKey";
926
927 ErrorCode error;
928 ImportWrappedKeyRequest request;
929 ImportKeyResponse response;
930
931 if (maskingKey.size() != KM_WRAPPER_MASKING_KEY_SIZE) {
932 _hidl_cb(ErrorCode::INVALID_ARGUMENT, hidl_vec<uint8_t>{},
933 KeyCharacteristics{});
934 return Void();
935 }
936
937 error = import_wrapped_key_request(wrappedKeyData, wrappingKeyBlob,
938 maskingKey, &request);
939 if (error != ErrorCode::OK) {
940 LOG(ERROR) << "ImportWrappedKey request parsing failed with error "
nagendra modadugue2914e42018-01-02 17:42:46 -0800941 << error;
nagendra modaduguec667302017-12-04 21:37:22 -0800942 _hidl_cb(error, hidl_vec<uint8_t>{}, KeyCharacteristics{});
943 return Void();
944 }
945
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700946 KM_CALLV(ImportWrappedKey, request, response,
947 hidl_vec<uint8_t>{}, KeyCharacteristics{});
nagendra modaduguec667302017-12-04 21:37:22 -0800948
949 hidl_vec<uint8_t> blob;
950 blob.setToExternal(
951 reinterpret_cast<uint8_t*>(
952 const_cast<char*>(response.blob().blob().data())),
953 response.blob().blob().size(), false);
954
955 KeyCharacteristics characteristics;
956 // TODO: anything to do here with softwareEnforced?
957 pb_to_hidl_params(response.characteristics().software_enforced(),
958 &characteristics.softwareEnforced);
959 error = pb_to_hidl_params(response.characteristics().tee_enforced(),
960 &characteristics.hardwareEnforced);
961 if (error != ErrorCode::OK) {
962 LOG(ERROR) <<
963 "KeymasterDevice::importWrappedKey: response tee_enforced :"
nagendra modadugue2914e42018-01-02 17:42:46 -0800964 << error;
nagendra modaduguec667302017-12-04 21:37:22 -0800965 _hidl_cb(error, hidl_vec<uint8_t>{}, KeyCharacteristics{});
966 return Void();
967 }
968
969 _hidl_cb(ErrorCode::OK, blob, characteristics);
970 return Void();
971}
972
Allen Webbb5ec9122018-05-30 14:30:43 -0700973// Private methods.
974Return<ErrorCode> KeymasterDevice::SendSystemVersionInfo() const {
975 SetSystemVersionInfoRequest request;
976 SetSystemVersionInfoResponse response;
977
978 request.set_system_version(_os_version);
979 request.set_system_security_level(_os_patchlevel);
980 request.set_vendor_security_level(_vendor_patchlevel);
981
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700982 KM_CALL(SetSystemVersionInfo, request, response);
Allen Webbb5ec9122018-05-30 14:30:43 -0700983 return ErrorCode::OK;
984}
985
986Return<ErrorCode> KeymasterDevice::GetBootInfo() {
987 GetBootInfoRequest request;
988 GetBootInfoResponse response;
989
nagendra modadugu5104bbc2018-06-06 11:48:14 -0700990 KM_CALL(GetBootInfo, request, response);
Allen Webbb5ec9122018-05-30 14:30:43 -0700991
992 _is_unlocked = response.is_unlocked();
993 _boot_color = response.boot_color();
994 _boot_key.assign(response.boot_key().begin(), response.boot_key().end());
995 _boot_hash.assign(response.boot_hash().begin(), response.boot_hash().end());
996 return ErrorCode::OK;
997}
998
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100999} // namespace keymaster
1000} // namespace hardware
1001} // namespace android