blob: d63f808d43f1f08a6260eaf766ee3edb066dbcaf [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 modadugu97471402017-09-27 14:01:00 -070018#include "import_key.h"
nagendra modaduguec667302017-12-04 21:37:22 -080019#include "import_wrapped_key.h"
nagendra modadugu284b9392017-09-27 13:51:23 -070020#include "proto_utils.h"
21
nagendra modadugu9e8c8562017-09-18 18:58:54 -070022#include <Keymaster.client.h>
Andrew Scull8e96ff02017-10-09 11:09:09 +010023#include <nos/debug.h>
nagendra modadugu284b9392017-09-27 13:51:23 -070024#include <nos/NuggetClient.h>
Andrew Sculle4e2ffc2017-08-10 10:03:20 +010025
26#include <android-base/logging.h>
27
28namespace android {
29namespace hardware {
30namespace keymaster {
31
nagendra modadugu8a883372017-09-18 22:29:00 -070032// std
33using std::string;
34
Andrew Sculle4e2ffc2017-08-10 10:03:20 +010035// libhidl
36using ::android::hardware::Void;
37
38// HAL
nagendra modaduguec667302017-12-04 21:37:22 -080039using ::android::hardware::keymaster::V4_0::Algorithm;
40using ::android::hardware::keymaster::V4_0::KeyCharacteristics;
nagendra modadugu284b9392017-09-27 13:51:23 -070041using ::android::hardware::keymaster::V3_0::KeyFormat;
nagendra modaduguec667302017-12-04 21:37:22 -080042using ::android::hardware::keymaster::V4_0::SecurityLevel;
43using ::android::hardware::keymaster::V4_0::Tag;
nagendra modadugu284b9392017-09-27 13:51:23 -070044
45// nos
46using nos::NuggetClient;
47
48// Keymaster app
nagendra modaduguec667302017-12-04 21:37:22 -080049// KM 3.0 types
nagendra modadugu284b9392017-09-27 13:51:23 -070050using ::nugget::app::keymaster::AddRngEntropyRequest;
51using ::nugget::app::keymaster::AddRngEntropyResponse;
52using ::nugget::app::keymaster::GenerateKeyRequest;
53using ::nugget::app::keymaster::GenerateKeyResponse;
54using ::nugget::app::keymaster::GetKeyCharacteristicsRequest;
55using ::nugget::app::keymaster::GetKeyCharacteristicsResponse;
56using ::nugget::app::keymaster::ImportKeyRequest;
57using ::nugget::app::keymaster::ImportKeyResponse;
58using ::nugget::app::keymaster::ExportKeyRequest;
59using ::nugget::app::keymaster::ExportKeyResponse;
60using ::nugget::app::keymaster::AttestKeyRequest;
61using ::nugget::app::keymaster::AttestKeyResponse;
62using ::nugget::app::keymaster::UpgradeKeyRequest;
63using ::nugget::app::keymaster::UpgradeKeyResponse;
64using ::nugget::app::keymaster::DeleteKeyRequest;
65using ::nugget::app::keymaster::DeleteKeyResponse;
66using ::nugget::app::keymaster::DeleteAllKeysRequest;
67using ::nugget::app::keymaster::DeleteAllKeysResponse;
68using ::nugget::app::keymaster::DestroyAttestationIdsRequest;
69using ::nugget::app::keymaster::DestroyAttestationIdsResponse;
70using ::nugget::app::keymaster::BeginOperationRequest;
71using ::nugget::app::keymaster::BeginOperationResponse;
72using ::nugget::app::keymaster::UpdateOperationRequest;
73using ::nugget::app::keymaster::UpdateOperationResponse;
74using ::nugget::app::keymaster::FinishOperationRequest;
75using ::nugget::app::keymaster::FinishOperationResponse;
76using ::nugget::app::keymaster::AbortOperationRequest;
77using ::nugget::app::keymaster::AbortOperationResponse;
78
nagendra modaduguec667302017-12-04 21:37:22 -080079// KM 4.0 types
80using ::nugget::app::keymaster::ImportWrappedKeyRequest;
81
nagendra modadugu284b9392017-09-27 13:51:23 -070082static ErrorCode status_to_error_code(uint32_t status)
83{
84 switch (status) {
85 case APP_SUCCESS:
86 return ErrorCode::OK;
87 break;
88 case APP_ERROR_BOGUS_ARGS:
89 return ErrorCode::INVALID_ARGUMENT;
90 break;
91 case APP_ERROR_INTERNAL:
92 return ErrorCode::UNKNOWN_ERROR;
93 break;
94 case APP_ERROR_TOO_MUCH:
95 return ErrorCode::INSUFFICIENT_BUFFER_SPACE;
96 break;
97 case APP_ERROR_RPC:
98 return ErrorCode::SECURE_HW_COMMUNICATION_FAILED;
99 break;
100 // TODO: app specific error codes go here.
101 default:
102 return ErrorCode::UNKNOWN_ERROR;
103 break;
104 }
105}
106
Andrew Sculldc620df2017-09-29 14:07:56 +0100107#define KM_CALL(meth) { \
108 const uint32_t status = _keymaster. meth (request, &response); \
109 if (status != APP_SUCCESS) { \
110 LOG(ERROR) << #meth << " : request failed with status: " \
Andrew Scull8e96ff02017-10-09 11:09:09 +0100111 << nos::StatusCodeString(status); \
Andrew Sculldc620df2017-09-29 14:07:56 +0100112 return status_to_error_code(status); \
113 } \
114 if ((ErrorCode)response.error_code() != ErrorCode::OK) { \
115 LOG(ERROR) << #meth << " : device response error code: " \
116 << response.error_code(); \
nagendra modaduguec667302017-12-04 21:37:22 -0800117 /* TODO: translate error codes. */ \
Andrew Sculldc620df2017-09-29 14:07:56 +0100118 return (ErrorCode)response.error_code(); \
119 } \
nagendra modadugu284b9392017-09-27 13:51:23 -0700120}
121
Andrew Sculldc620df2017-09-29 14:07:56 +0100122#define KM_CALLV(meth, ...) { \
123 const uint32_t status = _keymaster. meth (request, &response); \
124 if (status != APP_SUCCESS) { \
125 LOG(ERROR) << #meth << " : request failed with status: " \
Andrew Scull8e96ff02017-10-09 11:09:09 +0100126 << nos::StatusCodeString(status); \
Andrew Sculldc620df2017-09-29 14:07:56 +0100127 _hidl_cb(status_to_error_code(status), __VA_ARGS__); \
128 return Void(); \
129 } \
130 if ((ErrorCode)response.error_code() != ErrorCode::OK) { \
131 LOG(ERROR) << #meth << " : device response error code: " \
132 << response.error_code(); \
nagendra modaduguec667302017-12-04 21:37:22 -0800133 /* TODO: translate error codes. */ \
Andrew Sculldc620df2017-09-29 14:07:56 +0100134 _hidl_cb((ErrorCode)response.error_code(), __VA_ARGS__); \
135 return Void(); \
136 } \
nagendra modadugu284b9392017-09-27 13:51:23 -0700137}
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100138
139// Methods from ::android::hardware::keymaster::V3_0::IKeymasterDevice follow.
nagendra modadugu284b9392017-09-27 13:51:23 -0700140
nagendra modaduguec667302017-12-04 21:37:22 -0800141Return<void> KeymasterDevice::getHardwareInfo(
142 getHardwareInfo_cb _hidl_cb)
nagendra modadugu284b9392017-09-27 13:51:23 -0700143{
nagendra modaduguec667302017-12-04 21:37:22 -0800144 LOG(VERBOSE) << "Running KeymasterDevice::getHardwareInfo";
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100145
nagendra modadugu8a883372017-09-18 22:29:00 -0700146 (void)_keymaster;
nagendra modaduguec667302017-12-04 21:37:22 -0800147 _hidl_cb(SecurityLevel::STRONGBOX,
148 string("CitadelKeymaster"), string("Google"));
149
150 return Void();
151}
152
153Return<void> KeymasterDevice::getHmacSharingParameters(
154 getHmacSharingParameters_cb _hidl_cb)
155{
156 LOG(VERBOSE) << "Running KeymasterDevice::getHmacSharingParameters";
157
158 (void)_keymaster;
159 _hidl_cb(ErrorCode::UNIMPLEMENTED, HmacSharingParameters());
160
161 return Void();
162}
163
164Return<void> KeymasterDevice::computeSharedHmac(
165 const hidl_vec<HmacSharingParameters>& params,
166 computeSharedHmac_cb _hidl_cb)
167{
168 LOG(VERBOSE) << "Running KeymasterDevice::computeSharedHmac";
169
170 (void)params;
171
172 (void)_keymaster;
173 _hidl_cb(ErrorCode::UNIMPLEMENTED, hidl_vec<uint8_t>{});
174
175 return Void();
176}
177
178Return<void> KeymasterDevice::verifyAuthorization(
179 uint64_t challenge, const hidl_vec<KeyParameter>& parametersToVerify,
180 const HardwareAuthToken& authToken, verifyAuthorization_cb _hidl_cb)
181{
182 LOG(VERBOSE) << "Running KeymasterDevice::verifyAuthorization";
183
184 (void)challenge;
185 (void)parametersToVerify;
186 (void)authToken;
187
188 (void)_keymaster;
189 _hidl_cb(ErrorCode::UNIMPLEMENTED, VerificationToken());
190
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100191 return Void();
192}
193
nagendra modadugu284b9392017-09-27 13:51:23 -0700194Return<ErrorCode> KeymasterDevice::addRngEntropy(const hidl_vec<uint8_t>& data)
195{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100196 LOG(VERBOSE) << "Running KeymasterDevice::addRngEntropy";
197
nagendra modadugu284b9392017-09-27 13:51:23 -0700198 if (!data.size()) return ErrorCode::OK;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100199
nagendra modadugu284b9392017-09-27 13:51:23 -0700200 AddRngEntropyRequest request;
201 AddRngEntropyResponse response;
202 request.set_data(&data[0], data.size());
203
204 // Call device.
205 KM_CALL(AddRngEntropy);
206
207 return (ErrorCode)response.error_code();
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100208}
209
nagendra modadugu284b9392017-09-27 13:51:23 -0700210Return<void> KeymasterDevice::generateKey(
211 const hidl_vec<KeyParameter>& keyParams,
212 generateKey_cb _hidl_cb)
213{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100214 LOG(VERBOSE) << "Running KeymasterDevice::generateKey";
215
nagendra modadugu284b9392017-09-27 13:51:23 -0700216 GenerateKeyRequest request;
217 GenerateKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100218
nagendra modadugue3ef4692017-10-25 23:58:07 -0700219 hidl_vec<uint8_t> blob;
220 KeyCharacteristics characteristics;
221 if (hidl_params_to_pb(
222 keyParams, request.mutable_params()) != ErrorCode::OK) {
223 _hidl_cb(ErrorCode::INVALID_ARGUMENT, blob, characteristics);
224 return Void();
225 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700226
227 // Call device.
228 KM_CALLV(GenerateKey, hidl_vec<uint8_t>{}, KeyCharacteristics());
229
nagendra modadugu284b9392017-09-27 13:51:23 -0700230 blob.setToExternal(
231 reinterpret_cast<uint8_t*>(
232 const_cast<char*>(response.blob().blob().data())),
233 response.blob().blob().size(), false);
nagendra modadugue3ef4692017-10-25 23:58:07 -0700234 pb_to_hidl_params(response.characteristics().software_enforced(),
235 &characteristics.softwareEnforced);
nagendra modadugu284b9392017-09-27 13:51:23 -0700236 pb_to_hidl_params(response.characteristics().tee_enforced(),
nagendra modaduguec667302017-12-04 21:37:22 -0800237 &characteristics.hardwareEnforced);
nagendra modadugu284b9392017-09-27 13:51:23 -0700238
239 _hidl_cb((ErrorCode)response.error_code(), blob, characteristics);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100240 return Void();
241}
242
nagendra modadugu284b9392017-09-27 13:51:23 -0700243Return<void> KeymasterDevice::getKeyCharacteristics(
244 const hidl_vec<uint8_t>& keyBlob,
245 const hidl_vec<uint8_t>& clientId,
246 const hidl_vec<uint8_t>& appData,
247 getKeyCharacteristics_cb _hidl_cb)
248{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100249 LOG(VERBOSE) << "Running KeymasterDevice::getKeyCharacteristics";
250
nagendra modadugu284b9392017-09-27 13:51:23 -0700251 GetKeyCharacteristicsRequest request;
252 GetKeyCharacteristicsResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100253
nagendra modadugu284b9392017-09-27 13:51:23 -0700254 request.mutable_blob()->set_blob(&keyBlob[0], keyBlob.size());
255 request.set_client_id(&clientId[0], clientId.size());
256 request.set_app_data(&appData[0], appData.size());
257
258 // Call device.
259 KM_CALLV(GetKeyCharacteristics, KeyCharacteristics());
260
261 KeyCharacteristics characteristics;
nagendra modadugue3ef4692017-10-25 23:58:07 -0700262 pb_to_hidl_params(response.characteristics().software_enforced(),
263 &characteristics.softwareEnforced);
nagendra modadugu284b9392017-09-27 13:51:23 -0700264 pb_to_hidl_params(response.characteristics().tee_enforced(),
nagendra modaduguec667302017-12-04 21:37:22 -0800265 &characteristics.hardwareEnforced);
nagendra modadugu284b9392017-09-27 13:51:23 -0700266
267 _hidl_cb((ErrorCode)response.error_code(), characteristics);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100268 return Void();
269}
270
nagendra modadugu284b9392017-09-27 13:51:23 -0700271Return<void> KeymasterDevice::importKey(
272 const hidl_vec<KeyParameter>& params, KeyFormat keyFormat,
273 const hidl_vec<uint8_t>& keyData, importKey_cb _hidl_cb)
274{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100275 LOG(VERBOSE) << "Running KeymasterDevice::importKey";
276
nagendra modadugu97471402017-09-27 14:01:00 -0700277 ErrorCode error;
nagendra modadugu284b9392017-09-27 13:51:23 -0700278 ImportKeyRequest request;
279 ImportKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100280
nagendra modadugu97471402017-09-27 14:01:00 -0700281 error = import_key_request(params, keyFormat, keyData, &request);
282 if (error != ErrorCode::OK) {
283 LOG(ERROR) << "ImportKey request parsing failed with error "
284 << (uint32_t)error;
285 _hidl_cb(error, hidl_vec<uint8_t>{}, KeyCharacteristics{});
286 return Void();
287 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700288
289 KM_CALLV(ImportKey, hidl_vec<uint8_t>{}, KeyCharacteristics{});
290
291 hidl_vec<uint8_t> blob;
292 blob.setToExternal(
293 reinterpret_cast<uint8_t*>(
294 const_cast<char*>(response.blob().blob().data())),
295 response.blob().blob().size(), false);
296
297 KeyCharacteristics characteristics;
nagendra modadugue3ef4692017-10-25 23:58:07 -0700298 pb_to_hidl_params(response.characteristics().software_enforced(),
299 &characteristics.softwareEnforced);
nagendra modadugu97471402017-09-27 14:01:00 -0700300 error = pb_to_hidl_params(response.characteristics().tee_enforced(),
nagendra modaduguec667302017-12-04 21:37:22 -0800301 &characteristics.hardwareEnforced);
nagendra modadugu97471402017-09-27 14:01:00 -0700302 if (error != ErrorCode::OK) {
303 LOG(ERROR) << "KeymasterDevice::importKey: response tee_enforced :"
304 << (uint32_t)error;
nagendra modaduguec667302017-12-04 21:37:22 -0800305 _hidl_cb(error, hidl_vec<uint8_t>{}, KeyCharacteristics{});
306 return Void();
nagendra modadugu97471402017-09-27 14:01:00 -0700307 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700308
309 _hidl_cb(ErrorCode::OK, blob, characteristics);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100310 return Void();
311}
312
nagendra modadugu284b9392017-09-27 13:51:23 -0700313Return<void> KeymasterDevice::exportKey(
314 KeyFormat exportFormat, const hidl_vec<uint8_t>& keyBlob,
315 const hidl_vec<uint8_t>& clientId,
316 const hidl_vec<uint8_t>& appData, exportKey_cb _hidl_cb)
317{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100318 LOG(VERBOSE) << "Running KeymasterDevice::exportKey";
319
nagendra modadugu284b9392017-09-27 13:51:23 -0700320 ExportKeyRequest request;
321 ExportKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100322
nagendra modadugu284b9392017-09-27 13:51:23 -0700323 request.set_format((::nugget::app::keymaster::KeyFormat)exportFormat);
324 request.mutable_blob()->set_blob(&keyBlob[0], keyBlob.size());
325 request.set_client_id(&clientId[0], clientId.size());
326 request.set_app_data(&appData[0], appData.size());
327
328 KM_CALLV(ExportKey, hidl_vec<uint8_t>{});
329
330 hidl_vec<uint8_t> blob;
331 blob.setToExternal(
332 reinterpret_cast<uint8_t*>(
333 const_cast<char*>(response.key_material().data())),
334 response.key_material().size(), false);
335
336 _hidl_cb((ErrorCode)response.error_code(), blob);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100337 return Void();
338}
339
nagendra modadugu284b9392017-09-27 13:51:23 -0700340Return<void> KeymasterDevice::attestKey(
341 const hidl_vec<uint8_t>& keyToAttest,
342 const hidl_vec<KeyParameter>& attestParams,
343 attestKey_cb _hidl_cb)
344{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100345 LOG(VERBOSE) << "Running KeymasterDevice::attestKey";
346
nagendra modadugu284b9392017-09-27 13:51:23 -0700347 AttestKeyRequest request;
348 AttestKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100349
nagendra modadugu284b9392017-09-27 13:51:23 -0700350 request.mutable_blob()->set_blob(&keyToAttest[0], keyToAttest.size());
nagendra modadugue3ef4692017-10-25 23:58:07 -0700351
352 vector<hidl_vec<uint8_t> > chain;
353 if (hidl_params_to_pb(
354 attestParams, request.mutable_params()) != ErrorCode::OK) {
355 _hidl_cb(ErrorCode::INVALID_ARGUMENT, chain);
356 return Void();
357 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700358
359 KM_CALLV(AttestKey, hidl_vec<hidl_vec<uint8_t> >{});
360
nagendra modadugu284b9392017-09-27 13:51:23 -0700361 for (int i = 0; i < response.chain().certificates_size(); i++) {
362 hidl_vec<uint8_t> blob;
363 blob.setToExternal(
364 reinterpret_cast<uint8_t*>(
365 const_cast<char*>(
366 response.chain().certificates(i).data().data())),
367 response.chain().certificates(i).data().size(), false);
368 chain.push_back(blob);
369 }
370
371 _hidl_cb((ErrorCode)response.error_code(),
372 hidl_vec<hidl_vec<uint8_t> >(chain));
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100373 return Void();
374}
375
nagendra modadugu284b9392017-09-27 13:51:23 -0700376Return<void> KeymasterDevice::upgradeKey(
377 const hidl_vec<uint8_t>& keyBlobToUpgrade,
378 const hidl_vec<KeyParameter>& upgradeParams,
379 upgradeKey_cb _hidl_cb)
380{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100381 LOG(VERBOSE) << "Running KeymasterDevice::upgradeKey";
382
nagendra modadugu284b9392017-09-27 13:51:23 -0700383 UpgradeKeyRequest request;
384 UpgradeKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100385
nagendra modadugu284b9392017-09-27 13:51:23 -0700386 request.mutable_blob()->set_blob(&keyBlobToUpgrade[0],
387 keyBlobToUpgrade.size());
nagendra modadugue3ef4692017-10-25 23:58:07 -0700388
389 hidl_vec<uint8_t> blob;
390 if (hidl_params_to_pb(
391 upgradeParams, request.mutable_params()) != ErrorCode::OK) {
392 _hidl_cb(ErrorCode::INVALID_ARGUMENT, blob);
393 return Void();
394 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700395
396 KM_CALLV(UpgradeKey, hidl_vec<uint8_t>{});
397
nagendra modadugu284b9392017-09-27 13:51:23 -0700398 blob.setToExternal(
399 reinterpret_cast<uint8_t*>(
400 const_cast<char*>(response.blob().blob().data())),
401 response.blob().blob().size(), false);
402
403 _hidl_cb((ErrorCode)response.error_code(), blob);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100404 return Void();
405}
406
nagendra modadugu284b9392017-09-27 13:51:23 -0700407Return<ErrorCode> KeymasterDevice::deleteKey(const hidl_vec<uint8_t>& keyBlob)
408{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100409 LOG(VERBOSE) << "Running KeymasterDevice::deleteKey";
410
nagendra modadugu284b9392017-09-27 13:51:23 -0700411 DeleteKeyRequest request;
412 DeleteKeyResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100413
nagendra modadugu284b9392017-09-27 13:51:23 -0700414 request.mutable_blob()->set_blob(&keyBlob[0], keyBlob.size());
415
416 KM_CALL(DeleteKey);
417
418 return (ErrorCode)response.error_code();
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100419}
420
nagendra modadugu284b9392017-09-27 13:51:23 -0700421Return<ErrorCode> KeymasterDevice::deleteAllKeys()
422{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100423 LOG(VERBOSE) << "Running KeymasterDevice::deleteAllKeys";
424
nagendra modadugu284b9392017-09-27 13:51:23 -0700425 DeleteAllKeysRequest request;
426 DeleteAllKeysResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100427
nagendra modadugu284b9392017-09-27 13:51:23 -0700428 KM_CALL(DeleteAllKeys);
429
430 return (ErrorCode)response.error_code();
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100431}
432
nagendra modadugu284b9392017-09-27 13:51:23 -0700433Return<ErrorCode> KeymasterDevice::destroyAttestationIds()
434{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100435 LOG(VERBOSE) << "Running KeymasterDevice::destroyAttestationIds";
436
nagendra modadugu284b9392017-09-27 13:51:23 -0700437 DestroyAttestationIdsRequest request;
438 DestroyAttestationIdsResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100439
nagendra modadugu284b9392017-09-27 13:51:23 -0700440 KM_CALL(DestroyAttestationIds);
441
442 return (ErrorCode)response.error_code();
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100443}
444
nagendra modadugu284b9392017-09-27 13:51:23 -0700445Return<void> KeymasterDevice::begin(
446 KeyPurpose purpose, const hidl_vec<uint8_t>& key,
nagendra modaduguec667302017-12-04 21:37:22 -0800447 const hidl_vec<KeyParameter>& inParams,
448 const HardwareAuthToken& authToken,
449 begin_cb _hidl_cb)
nagendra modadugu284b9392017-09-27 13:51:23 -0700450{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100451 LOG(VERBOSE) << "Running KeymasterDevice::begin";
452
nagendra modadugu284b9392017-09-27 13:51:23 -0700453 BeginOperationRequest request;
454 BeginOperationResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100455
nagendra modadugu284b9392017-09-27 13:51:23 -0700456 request.set_purpose((::nugget::app::keymaster::KeyPurpose)purpose);
457 request.mutable_blob()->set_blob(&key[0], key.size());
nagendra modaduguec667302017-12-04 21:37:22 -0800458 // TODO: set request.auth_token().
459 (void)authToken;
nagendra modadugue3ef4692017-10-25 23:58:07 -0700460
461 hidl_vec<KeyParameter> params;
462 if (hidl_params_to_pb(
463 inParams, request.mutable_params()) != ErrorCode::OK) {
464 _hidl_cb(ErrorCode::INVALID_ARGUMENT, params,
465 response.handle().handle());
466 return Void();
467 }
nagendra modadugu284b9392017-09-27 13:51:23 -0700468
469 KM_CALLV(BeginOperation, hidl_vec<KeyParameter>{}, 0);
470
nagendra modadugu284b9392017-09-27 13:51:23 -0700471 pb_to_hidl_params(response.params(), &params);
472
473 _hidl_cb((ErrorCode)response.error_code(), params,
474 response.handle().handle());
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100475 return Void();
476}
477
nagendra modadugu284b9392017-09-27 13:51:23 -0700478Return<void> KeymasterDevice::update(
479 uint64_t operationHandle,
480 const hidl_vec<KeyParameter>& inParams,
nagendra modaduguec667302017-12-04 21:37:22 -0800481 const hidl_vec<uint8_t>& input,
482 const HardwareAuthToken& authToken,
483 const VerificationToken& verificationToken,
484 update_cb _hidl_cb)
nagendra modadugu284b9392017-09-27 13:51:23 -0700485{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100486 LOG(VERBOSE) << "Running KeymasterDevice::update";
487
nagendra modadugu284b9392017-09-27 13:51:23 -0700488 UpdateOperationRequest request;
489 UpdateOperationResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100490
nagendra modadugu284b9392017-09-27 13:51:23 -0700491 request.mutable_handle()->set_handle(operationHandle);
nagendra modadugue3ef4692017-10-25 23:58:07 -0700492
493 hidl_vec<KeyParameter> params;
494 hidl_vec<uint8_t> output;
495 if (hidl_params_to_pb(
496 inParams, request.mutable_params()) != ErrorCode::OK) {
497 _hidl_cb(ErrorCode::INVALID_ARGUMENT, 0, params, output);
498 return Void();
499 }
500
nagendra modadugu284b9392017-09-27 13:51:23 -0700501 request.set_input(&input[0], input.size());
nagendra modaduguec667302017-12-04 21:37:22 -0800502 // TODO: add authToken and verificationToken.
503 (void)authToken;
504 (void)verificationToken;
nagendra modadugu284b9392017-09-27 13:51:23 -0700505
506 KM_CALLV(UpdateOperation, 0, hidl_vec<KeyParameter>{}, hidl_vec<uint8_t>{});
507
nagendra modadugu284b9392017-09-27 13:51:23 -0700508 pb_to_hidl_params(response.params(), &params);
509 output.setToExternal(
510 reinterpret_cast<uint8_t*>(const_cast<char*>(response.output().data())),
511 response.output().size(), false);
512
513 _hidl_cb(ErrorCode::OK, response.consumed(), params, output);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100514 return Void();
515}
516
nagendra modadugu284b9392017-09-27 13:51:23 -0700517Return<void> KeymasterDevice::finish(
518 uint64_t operationHandle,
519 const hidl_vec<KeyParameter>& inParams,
520 const hidl_vec<uint8_t>& input,
nagendra modaduguec667302017-12-04 21:37:22 -0800521 const hidl_vec<uint8_t>& signature,
522 const HardwareAuthToken& authToken,
523 const VerificationToken& verificationToken,
524 finish_cb _hidl_cb)
nagendra modadugu284b9392017-09-27 13:51:23 -0700525{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100526 LOG(VERBOSE) << "Running KeymasterDevice::finish";
527
nagendra modadugu284b9392017-09-27 13:51:23 -0700528 FinishOperationRequest request;
529 FinishOperationResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100530
nagendra modadugu284b9392017-09-27 13:51:23 -0700531 request.mutable_handle()->set_handle(operationHandle);
nagendra modadugue3ef4692017-10-25 23:58:07 -0700532
533 hidl_vec<KeyParameter> params;
534 hidl_vec<uint8_t> output;
535 if (hidl_params_to_pb(
536 inParams, request.mutable_params()) != ErrorCode::OK) {
537 _hidl_cb(ErrorCode::INVALID_ARGUMENT, params, output);
538 return Void();
539 }
540
nagendra modadugu284b9392017-09-27 13:51:23 -0700541 request.set_input(&input[0], input.size());
542 request.set_signature(&signature[0], signature.size());
543
nagendra modaduguec667302017-12-04 21:37:22 -0800544 // TODO: add authToken and verificationToken.
545 (void)authToken;
546 (void)verificationToken;
547
nagendra modadugu284b9392017-09-27 13:51:23 -0700548 KM_CALLV(FinishOperation, hidl_vec<KeyParameter>{}, hidl_vec<uint8_t>{});
549
nagendra modadugu284b9392017-09-27 13:51:23 -0700550 pb_to_hidl_params(response.params(), &params);
nagendra modadugu284b9392017-09-27 13:51:23 -0700551 output.setToExternal(
552 reinterpret_cast<uint8_t*>(const_cast<char*>(response.output().data())),
553 response.output().size(), false);
554
555 _hidl_cb(ErrorCode::OK, params, output);
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100556 return Void();
557}
558
nagendra modadugu284b9392017-09-27 13:51:23 -0700559Return<ErrorCode> KeymasterDevice::abort(uint64_t operationHandle)
560{
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100561 LOG(VERBOSE) << "Running KeymasterDevice::abort";
562
nagendra modadugu284b9392017-09-27 13:51:23 -0700563 AbortOperationRequest request;
564 AbortOperationResponse response;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100565
nagendra modadugu284b9392017-09-27 13:51:23 -0700566 request.mutable_handle()->set_handle(operationHandle);
567
568 KM_CALL(AbortOperation);
569
570 return ErrorCode::OK;
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100571}
572
nagendra modaduguec667302017-12-04 21:37:22 -0800573// Methods from ::android::hardware::keymaster::V4_0::IKeymasterDevice follow.
574Return<void> KeymasterDevice::importWrappedKey(
575 const hidl_vec<uint8_t>& wrappedKeyData,
576 const hidl_vec<uint8_t>& wrappingKeyBlob,
577 const hidl_vec<uint8_t>& maskingKey,
578 importWrappedKey_cb _hidl_cb)
579{
580 LOG(VERBOSE) << "Running KeymasterDevice::importWrappedKey";
581
582 ErrorCode error;
583 ImportWrappedKeyRequest request;
584 ImportKeyResponse response;
585
586 if (maskingKey.size() != KM_WRAPPER_MASKING_KEY_SIZE) {
587 _hidl_cb(ErrorCode::INVALID_ARGUMENT, hidl_vec<uint8_t>{},
588 KeyCharacteristics{});
589 return Void();
590 }
591
592 error = import_wrapped_key_request(wrappedKeyData, wrappingKeyBlob,
593 maskingKey, &request);
594 if (error != ErrorCode::OK) {
595 LOG(ERROR) << "ImportWrappedKey request parsing failed with error "
596 << (uint32_t)error;
597 _hidl_cb(error, hidl_vec<uint8_t>{}, KeyCharacteristics{});
598 return Void();
599 }
600
601 KM_CALLV(ImportWrappedKey, hidl_vec<uint8_t>{}, KeyCharacteristics{});
602
603 hidl_vec<uint8_t> blob;
604 blob.setToExternal(
605 reinterpret_cast<uint8_t*>(
606 const_cast<char*>(response.blob().blob().data())),
607 response.blob().blob().size(), false);
608
609 KeyCharacteristics characteristics;
610 // TODO: anything to do here with softwareEnforced?
611 pb_to_hidl_params(response.characteristics().software_enforced(),
612 &characteristics.softwareEnforced);
613 error = pb_to_hidl_params(response.characteristics().tee_enforced(),
614 &characteristics.hardwareEnforced);
615 if (error != ErrorCode::OK) {
616 LOG(ERROR) <<
617 "KeymasterDevice::importWrappedKey: response tee_enforced :"
618 << (uint32_t)error;
619 _hidl_cb(error, hidl_vec<uint8_t>{}, KeyCharacteristics{});
620 return Void();
621 }
622
623 _hidl_cb(ErrorCode::OK, blob, characteristics);
624 return Void();
625}
626
Andrew Sculle4e2ffc2017-08-10 10:03:20 +0100627} // namespace keymaster
628} // namespace hardware
629} // namespace android