blob: a71948e0ae9de5d9bf5653b49950ce7094d72229 [file] [log] [blame]
Shawn Willden9e149572017-10-30 16:08:21 -06001/*
2 **
3 ** Copyright 2017, 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
18#define LOG_TAG "android.hardware.keymaster@4.0-impl"
19#include <log/log.h>
20
Shawn Willdenefd06732017-11-30 19:34:16 -070021#include "include/AndroidKeymaster4Device.h"
Shawn Willden9e149572017-10-30 16:08:21 -060022
23#include <keymasterV4_0/authorization_set.h>
Shawn Willdenda495752020-01-15 17:46:30 -070024#include <keymasterV4_0/keymaster_utils.h>
Shawn Willden9e149572017-10-30 16:08:21 -060025
26#include <keymaster/android_keymaster.h>
27#include <keymaster/android_keymaster_messages.h>
28#include <keymaster/contexts/pure_soft_keymaster_context.h>
29#include <keymaster/contexts/soft_keymaster_context.h>
30#include <keymaster/keymaster_configuration.h>
31#include <keymaster/keymaster_enforcement.h>
32#include <keymaster/km_openssl/soft_keymaster_enforcement.h>
33
Shawn Willdenda495752020-01-15 17:46:30 -070034using android::hardware::keymaster::V4_0::support::authToken2HidlVec;
35
Shawn Willden9e149572017-10-30 16:08:21 -060036namespace keymaster {
37namespace V4_0 {
38namespace ng {
39
40namespace {
41
42constexpr size_t kOperationTableSize = 16;
43
44inline keymaster_tag_t legacy_enum_conversion(const Tag value) {
45 return keymaster_tag_t(value);
46}
Shawn Willden18534d52018-01-07 21:16:40 -070047
Shawn Willden9e149572017-10-30 16:08:21 -060048inline Tag legacy_enum_conversion(const keymaster_tag_t value) {
49 return Tag(value);
50}
Shawn Willden18534d52018-01-07 21:16:40 -070051
Shawn Willden9e149572017-10-30 16:08:21 -060052inline keymaster_purpose_t legacy_enum_conversion(const KeyPurpose value) {
Shawn Willden18534d52018-01-07 21:16:40 -070053 return static_cast<keymaster_purpose_t>(value);
Shawn Willden9e149572017-10-30 16:08:21 -060054}
Shawn Willden18534d52018-01-07 21:16:40 -070055
Shawn Willden9e149572017-10-30 16:08:21 -060056inline keymaster_key_format_t legacy_enum_conversion(const KeyFormat value) {
Shawn Willden18534d52018-01-07 21:16:40 -070057 return static_cast<keymaster_key_format_t>(value);
Shawn Willden9e149572017-10-30 16:08:21 -060058}
Shawn Willden18534d52018-01-07 21:16:40 -070059
60inline SecurityLevel legacy_enum_conversion(const keymaster_security_level_t value) {
61 return static_cast<SecurityLevel>(value);
62}
63
64inline hw_authenticator_type_t legacy_enum_conversion(const HardwareAuthenticatorType value) {
65 return static_cast<hw_authenticator_type_t>(value);
66}
67
Shawn Willden9e149572017-10-30 16:08:21 -060068inline ErrorCode legacy_enum_conversion(const keymaster_error_t value) {
Shawn Willden18534d52018-01-07 21:16:40 -070069 return static_cast<ErrorCode>(value);
Shawn Willden9e149572017-10-30 16:08:21 -060070}
71
72inline keymaster_tag_type_t typeFromTag(const keymaster_tag_t tag) {
73 return keymaster_tag_get_type(tag);
74}
75
76class KmParamSet : public keymaster_key_param_set_t {
77 public:
Shawn Willdenda495752020-01-15 17:46:30 -070078 explicit KmParamSet(const hidl_vec<KeyParameter>& keyParams)
79 : keymaster_key_param_set_t(hidlKeyParams2Km(keyParams)) {}
Shawn Willden9e149572017-10-30 16:08:21 -060080 KmParamSet(KmParamSet&& other) : keymaster_key_param_set_t{other.params, other.length} {
81 other.length = 0;
82 other.params = nullptr;
83 }
84 KmParamSet(const KmParamSet&) = delete;
85 ~KmParamSet() { delete[] params; }
86};
87
88inline hidl_vec<uint8_t> kmBlob2hidlVec(const keymaster_key_blob_t& blob) {
89 hidl_vec<uint8_t> result;
90 result.setToExternal(const_cast<unsigned char*>(blob.key_material), blob.key_material_size);
91 return result;
92}
93
94inline hidl_vec<uint8_t> kmBlob2hidlVec(const keymaster_blob_t& blob) {
95 hidl_vec<uint8_t> result;
96 result.setToExternal(const_cast<unsigned char*>(blob.data), blob.data_length);
97 return result;
98}
99
100inline hidl_vec<uint8_t> kmBuffer2hidlVec(const ::keymaster::Buffer& buf) {
101 hidl_vec<uint8_t> result;
102 result.setToExternal(const_cast<unsigned char*>(buf.peek_read()), buf.available_read());
103 return result;
104}
105
106inline static hidl_vec<hidl_vec<uint8_t>>
107kmCertChain2Hidl(const keymaster_cert_chain_t& cert_chain) {
108 hidl_vec<hidl_vec<uint8_t>> result;
Shawn Willden32873522020-12-14 22:29:46 -0700109 if (!cert_chain.entry_count || !cert_chain.entries) return result;
Shawn Willden9e149572017-10-30 16:08:21 -0600110
111 result.resize(cert_chain.entry_count);
112 for (size_t i = 0; i < cert_chain.entry_count; ++i) {
113 result[i] = kmBlob2hidlVec(cert_chain.entries[i]);
114 }
115
116 return result;
117}
118
119static inline hidl_vec<KeyParameter> kmParamSet2Hidl(const keymaster_key_param_set_t& set) {
120 hidl_vec<KeyParameter> result;
Shawn Willden32873522020-12-14 22:29:46 -0700121 if (set.length == 0 || set.params == nullptr) return result;
Shawn Willden9e149572017-10-30 16:08:21 -0600122
123 result.resize(set.length);
124 keymaster_key_param_t* params = set.params;
125 for (size_t i = 0; i < set.length; ++i) {
126 auto tag = params[i].tag;
127 result[i].tag = legacy_enum_conversion(tag);
128 switch (typeFromTag(tag)) {
129 case KM_ENUM:
130 case KM_ENUM_REP:
131 result[i].f.integer = params[i].enumerated;
132 break;
133 case KM_UINT:
134 case KM_UINT_REP:
135 result[i].f.integer = params[i].integer;
136 break;
137 case KM_ULONG:
138 case KM_ULONG_REP:
139 result[i].f.longInteger = params[i].long_integer;
140 break;
141 case KM_DATE:
142 result[i].f.dateTime = params[i].date_time;
143 break;
144 case KM_BOOL:
145 result[i].f.boolValue = params[i].boolean;
146 break;
147 case KM_BIGNUM:
148 case KM_BYTES:
149 result[i].blob.setToExternal(const_cast<unsigned char*>(params[i].blob.data),
150 params[i].blob.data_length);
151 break;
152 case KM_INVALID:
153 default:
154 params[i].tag = KM_TAG_INVALID;
155 /* just skip */
156 break;
157 }
158 }
159 return result;
160}
161
162void addClientAndAppData(const hidl_vec<uint8_t>& clientId, const hidl_vec<uint8_t>& appData,
163 ::keymaster::AuthorizationSet* params) {
164 params->Clear();
165 if (clientId.size()) {
166 params->push_back(::keymaster::TAG_APPLICATION_ID, clientId.data(), clientId.size());
167 }
168 if (appData.size()) {
169 params->push_back(::keymaster::TAG_APPLICATION_DATA, appData.data(), appData.size());
170 }
171}
172
173} // anonymous namespace
174
Shawn Willdenda495752020-01-15 17:46:30 -0700175keymaster_key_param_set_t hidlKeyParams2Km(const hidl_vec<KeyParameter>& keyParams) {
176 keymaster_key_param_set_t set;
177
178 set.params = new keymaster_key_param_t[keyParams.size()];
179 set.length = keyParams.size();
180
181 for (size_t i = 0; i < keyParams.size(); ++i) {
182 auto tag = legacy_enum_conversion(keyParams[i].tag);
183 switch (typeFromTag(tag)) {
184 case KM_ENUM:
185 case KM_ENUM_REP:
186 set.params[i] = keymaster_param_enum(tag, keyParams[i].f.integer);
187 break;
188 case KM_UINT:
189 case KM_UINT_REP:
190 set.params[i] = keymaster_param_int(tag, keyParams[i].f.integer);
191 break;
192 case KM_ULONG:
193 case KM_ULONG_REP:
194 set.params[i] = keymaster_param_long(tag, keyParams[i].f.longInteger);
195 break;
196 case KM_DATE:
197 set.params[i] = keymaster_param_date(tag, keyParams[i].f.dateTime);
198 break;
199 case KM_BOOL:
200 if (keyParams[i].f.boolValue)
201 set.params[i] = keymaster_param_bool(tag);
202 else
203 set.params[i].tag = KM_TAG_INVALID;
204 break;
205 case KM_BIGNUM:
206 case KM_BYTES:
207 set.params[i] =
208 keymaster_param_blob(tag, &keyParams[i].blob[0], keyParams[i].blob.size());
209 break;
210 case KM_INVALID:
211 default:
212 set.params[i].tag = KM_TAG_INVALID;
213 /* just skip */
214 break;
215 }
216 }
217
218 return set;
219}
220
Shawn Willden6daf9842020-11-19 10:11:47 -0700221AndroidKeymaster4Device::AndroidKeymaster4Device(KmVersion version, SecurityLevel securityLevel)
Shawn Willden9e149572017-10-30 16:08:21 -0600222 : impl_(new ::keymaster::AndroidKeymaster(
Shawn Willdena07577e2020-01-15 17:42:42 -0700223 [&]() -> auto {
224 auto context = new PureSoftKeymasterContext(
Shawn Willden6daf9842020-11-19 10:11:47 -0700225 version, static_cast<keymaster_security_level_t>(securityLevel));
Shawn Willden9e149572017-10-30 16:08:21 -0600226 context->SetSystemVersion(GetOsVersion(), GetOsPatchlevel());
227 return context;
228 }(),
Shawn Willdena07577e2020-01-15 17:42:42 -0700229 kOperationTableSize)),
230 securityLevel_(securityLevel) {}
Shawn Willden9e149572017-10-30 16:08:21 -0600231
Shawn Willdenefd06732017-11-30 19:34:16 -0700232AndroidKeymaster4Device::~AndroidKeymaster4Device() {}
Shawn Willden9e149572017-10-30 16:08:21 -0600233
Shawn Willdenefd06732017-11-30 19:34:16 -0700234Return<void> AndroidKeymaster4Device::getHardwareInfo(getHardwareInfo_cb _hidl_cb) {
Shawn Willden32873522020-12-14 22:29:46 -0700235 _hidl_cb(securityLevel_, "SoftwareKeymasterDevice", "Google");
Shawn Willden8123da82017-10-31 09:01:26 -0600236 return Void();
237}
238
239Return<void>
240AndroidKeymaster4Device::getHmacSharingParameters(getHmacSharingParameters_cb _hidl_cb) {
Shawn Willden8b940582018-01-02 10:53:39 -0700241 auto response = impl_->GetHmacSharingParameters();
242
243 ::android::hardware::keymaster::V4_0::HmacSharingParameters params;
244 params.seed.setToExternal(const_cast<uint8_t*>(response.params.seed.data),
245 response.params.seed.data_length);
246 static_assert(sizeof(response.params.nonce) == params.nonce.size(), "Nonce sizes don't match");
247 memcpy(params.nonce.data(), response.params.nonce, params.nonce.size());
248 _hidl_cb(legacy_enum_conversion(response.error), params);
Shawn Willden8123da82017-10-31 09:01:26 -0600249 return Void();
250}
251
Shawn Willden8b940582018-01-02 10:53:39 -0700252Return<void> AndroidKeymaster4Device::computeSharedHmac(
253 const hidl_vec<::android::hardware::keymaster::V4_0::HmacSharingParameters>& params,
254 computeSharedHmac_cb _hidl_cb) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000255 ComputeSharedHmacRequest request(impl_->message_version());
Shawn Willden8b940582018-01-02 10:53:39 -0700256 request.params_array.params_array = new keymaster::HmacSharingParameters[params.size()];
257 request.params_array.num_params = params.size();
258 for (size_t i = 0; i < params.size(); ++i) {
259 request.params_array.params_array[i].seed = {params[i].seed.data(), params[i].seed.size()};
260 static_assert(sizeof(request.params_array.params_array[i].nonce) ==
261 decltype(params[i].nonce)::size(),
262 "Nonce sizes don't match");
263 memcpy(request.params_array.params_array[i].nonce, params[i].nonce.data(),
264 params[i].nonce.size());
265 }
266
267 auto response = impl_->ComputeSharedHmac(request);
268 hidl_vec<uint8_t> sharing_check;
269 if (response.error == KM_ERROR_OK) sharing_check = kmBlob2hidlVec(response.sharing_check);
270
271 _hidl_cb(legacy_enum_conversion(response.error), sharing_check);
Shawn Willden8123da82017-10-31 09:01:26 -0600272 return Void();
273}
274
275Return<void> AndroidKeymaster4Device::verifyAuthorization(
Shawn Willden18534d52018-01-07 21:16:40 -0700276 uint64_t challenge, const hidl_vec<KeyParameter>& parametersToVerify,
277 const ::android::hardware::keymaster::V4_0::HardwareAuthToken& authToken,
278 verifyAuthorization_cb _hidl_cb) {
279
Shawn Willden950eb0b2021-01-06 19:15:29 +0000280 VerifyAuthorizationRequest request(impl_->message_version());
Shawn Willden18534d52018-01-07 21:16:40 -0700281 request.challenge = challenge;
282 request.parameters_to_verify.Reinitialize(KmParamSet(parametersToVerify));
283 request.auth_token.challenge = authToken.challenge;
284 request.auth_token.user_id = authToken.userId;
285 request.auth_token.authenticator_id = authToken.authenticatorId;
286 request.auth_token.authenticator_type = legacy_enum_conversion(authToken.authenticatorType);
287 request.auth_token.timestamp = authToken.timestamp;
288 KeymasterBlob mac(authToken.mac.data(), authToken.mac.size());
289 request.auth_token.mac = mac;
290
291 auto response = impl_->VerifyAuthorization(request);
292
293 ::android::hardware::keymaster::V4_0::VerificationToken token;
294 token.challenge = response.token.challenge;
295 token.timestamp = response.token.timestamp;
296 token.parametersVerified = kmParamSet2Hidl(response.token.parameters_verified);
297 token.securityLevel = legacy_enum_conversion(response.token.security_level);
298 token.mac = kmBlob2hidlVec(response.token.mac);
299
300 _hidl_cb(legacy_enum_conversion(response.error), token);
301
Shawn Willden9e149572017-10-30 16:08:21 -0600302 return Void();
303}
304
Shawn Willdenefd06732017-11-30 19:34:16 -0700305Return<ErrorCode> AndroidKeymaster4Device::addRngEntropy(const hidl_vec<uint8_t>& data) {
Shawn Willden32873522020-12-14 22:29:46 -0700306 if (data.size() == 0) return ErrorCode::OK;
Shawn Willden950eb0b2021-01-06 19:15:29 +0000307 AddEntropyRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600308 request.random_data.Reinitialize(data.data(), data.size());
309
Shawn Willden950eb0b2021-01-06 19:15:29 +0000310 AddEntropyResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600311 impl_->AddRngEntropy(request, &response);
312
313 return legacy_enum_conversion(response.error);
314}
315
Shawn Willdenefd06732017-11-30 19:34:16 -0700316Return<void> AndroidKeymaster4Device::generateKey(const hidl_vec<KeyParameter>& keyParams,
317 generateKey_cb _hidl_cb) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000318 GenerateKeyRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600319 request.key_description.Reinitialize(KmParamSet(keyParams));
320
Shawn Willden950eb0b2021-01-06 19:15:29 +0000321 GenerateKeyResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600322 impl_->GenerateKey(request, &response);
323
324 KeyCharacteristics resultCharacteristics;
325 hidl_vec<uint8_t> resultKeyBlob;
326 if (response.error == KM_ERROR_OK) {
327 resultKeyBlob = kmBlob2hidlVec(response.key_blob);
328 resultCharacteristics.hardwareEnforced = kmParamSet2Hidl(response.enforced);
329 resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
330 }
331 _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob, resultCharacteristics);
332 return Void();
333}
334
Shawn Willdenefd06732017-11-30 19:34:16 -0700335Return<void> AndroidKeymaster4Device::getKeyCharacteristics(const hidl_vec<uint8_t>& keyBlob,
336 const hidl_vec<uint8_t>& clientId,
337 const hidl_vec<uint8_t>& appData,
338 getKeyCharacteristics_cb _hidl_cb) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000339 GetKeyCharacteristicsRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600340 request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
341 addClientAndAppData(clientId, appData, &request.additional_params);
342
Shawn Willden950eb0b2021-01-06 19:15:29 +0000343 GetKeyCharacteristicsResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600344 impl_->GetKeyCharacteristics(request, &response);
345
346 KeyCharacteristics resultCharacteristics;
347 if (response.error == KM_ERROR_OK) {
348 resultCharacteristics.hardwareEnforced = kmParamSet2Hidl(response.enforced);
349 resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
350 }
351 _hidl_cb(legacy_enum_conversion(response.error), resultCharacteristics);
352 return Void();
353}
354
Shawn Willdenefd06732017-11-30 19:34:16 -0700355Return<void> AndroidKeymaster4Device::importKey(const hidl_vec<KeyParameter>& params,
356 KeyFormat keyFormat,
357 const hidl_vec<uint8_t>& keyData,
358 importKey_cb _hidl_cb) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000359 ImportKeyRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600360 request.key_description.Reinitialize(KmParamSet(params));
361 request.key_format = legacy_enum_conversion(keyFormat);
Shawn Willden6e20ea42020-12-21 18:52:34 -0700362 request.key_data = KeymasterKeyBlob(keyData.data(), keyData.size());
Shawn Willden9e149572017-10-30 16:08:21 -0600363
Shawn Willden950eb0b2021-01-06 19:15:29 +0000364 ImportKeyResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600365 impl_->ImportKey(request, &response);
366
367 KeyCharacteristics resultCharacteristics;
368 hidl_vec<uint8_t> resultKeyBlob;
369 if (response.error == KM_ERROR_OK) {
370 resultKeyBlob = kmBlob2hidlVec(response.key_blob);
371 resultCharacteristics.hardwareEnforced = kmParamSet2Hidl(response.enforced);
372 resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
373 }
374 _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob, resultCharacteristics);
375 return Void();
376}
377
Shawn Willden3c665a22018-01-19 13:32:42 -0700378Return<void> AndroidKeymaster4Device::importWrappedKey(
379 const hidl_vec<uint8_t>& wrappedKeyData, const hidl_vec<uint8_t>& wrappingKeyBlob,
380 const hidl_vec<uint8_t>& maskingKey, const hidl_vec<KeyParameter>& unwrappingParams,
381 uint64_t passwordSid, uint64_t biometricSid, importWrappedKey_cb _hidl_cb) {
Shawn Willdendd7e8a02018-01-12 13:03:37 -0700382
Shawn Willden950eb0b2021-01-06 19:15:29 +0000383 ImportWrappedKeyRequest request(impl_->message_version());
Shawn Willdendd7e8a02018-01-12 13:03:37 -0700384 request.SetWrappedMaterial(wrappedKeyData.data(), wrappedKeyData.size());
385 request.SetWrappingMaterial(wrappingKeyBlob.data(), wrappingKeyBlob.size());
386 request.SetMaskingKeyMaterial(maskingKey.data(), maskingKey.size());
Shawn Willden3c665a22018-01-19 13:32:42 -0700387 request.additional_params.Reinitialize(KmParamSet(unwrappingParams));
388 request.password_sid = passwordSid;
389 request.biometric_sid = biometricSid;
Shawn Willdendd7e8a02018-01-12 13:03:37 -0700390
Shawn Willden950eb0b2021-01-06 19:15:29 +0000391 ImportWrappedKeyResponse response(impl_->message_version());
Shawn Willdendd7e8a02018-01-12 13:03:37 -0700392 impl_->ImportWrappedKey(request, &response);
393
394 KeyCharacteristics resultCharacteristics;
395 hidl_vec<uint8_t> resultKeyBlob;
396 if (response.error == KM_ERROR_OK) {
397 resultKeyBlob = kmBlob2hidlVec(response.key_blob);
398 resultCharacteristics.hardwareEnforced = kmParamSet2Hidl(response.enforced);
399 resultCharacteristics.softwareEnforced = kmParamSet2Hidl(response.unenforced);
400 }
401 _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob, resultCharacteristics);
Shawn Willden8123da82017-10-31 09:01:26 -0600402 return Void();
403}
404
Shawn Willdenefd06732017-11-30 19:34:16 -0700405Return<void> AndroidKeymaster4Device::exportKey(KeyFormat exportFormat,
406 const hidl_vec<uint8_t>& keyBlob,
407 const hidl_vec<uint8_t>& clientId,
408 const hidl_vec<uint8_t>& appData,
409 exportKey_cb _hidl_cb) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000410 ExportKeyRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600411 request.key_format = legacy_enum_conversion(exportFormat);
412 request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
413 addClientAndAppData(clientId, appData, &request.additional_params);
414
Shawn Willden950eb0b2021-01-06 19:15:29 +0000415 ExportKeyResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600416 impl_->ExportKey(request, &response);
417
418 hidl_vec<uint8_t> resultKeyBlob;
419 if (response.error == KM_ERROR_OK) {
420 resultKeyBlob.setToExternal(response.key_data, response.key_data_length);
421 }
422 _hidl_cb(legacy_enum_conversion(response.error), resultKeyBlob);
423 return Void();
424}
425
Shawn Willdenefd06732017-11-30 19:34:16 -0700426Return<void> AndroidKeymaster4Device::attestKey(const hidl_vec<uint8_t>& keyToAttest,
427 const hidl_vec<KeyParameter>& attestParams,
428 attestKey_cb _hidl_cb) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000429 AttestKeyRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600430 request.SetKeyMaterial(keyToAttest.data(), keyToAttest.size());
431 request.attest_params.Reinitialize(KmParamSet(attestParams));
432
Shawn Willden950eb0b2021-01-06 19:15:29 +0000433 AttestKeyResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600434 impl_->AttestKey(request, &response);
435
436 hidl_vec<hidl_vec<uint8_t>> resultCertChain;
437 if (response.error == KM_ERROR_OK) {
438 resultCertChain = kmCertChain2Hidl(response.certificate_chain);
439 }
440 _hidl_cb(legacy_enum_conversion(response.error), resultCertChain);
441 return Void();
442}
443
Shawn Willdenefd06732017-11-30 19:34:16 -0700444Return<void> AndroidKeymaster4Device::upgradeKey(const hidl_vec<uint8_t>& keyBlobToUpgrade,
445 const hidl_vec<KeyParameter>& upgradeParams,
446 upgradeKey_cb _hidl_cb) {
Shawn Willden9e149572017-10-30 16:08:21 -0600447 // There's nothing to be done to upgrade software key blobs. Further, the software
448 // implementation never returns ErrorCode::KEY_REQUIRES_UPGRADE, so this should never be called.
Shawn Willden950eb0b2021-01-06 19:15:29 +0000449 UpgradeKeyRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600450 request.SetKeyMaterial(keyBlobToUpgrade.data(), keyBlobToUpgrade.size());
451 request.upgrade_params.Reinitialize(KmParamSet(upgradeParams));
452
Shawn Willden950eb0b2021-01-06 19:15:29 +0000453 UpgradeKeyResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600454 impl_->UpgradeKey(request, &response);
455
456 if (response.error == KM_ERROR_OK) {
457 _hidl_cb(ErrorCode::OK, kmBlob2hidlVec(response.upgraded_key));
458 } else {
459 _hidl_cb(legacy_enum_conversion(response.error), hidl_vec<uint8_t>());
460 }
461 return Void();
462}
463
Shawn Willdenefd06732017-11-30 19:34:16 -0700464Return<ErrorCode> AndroidKeymaster4Device::deleteKey(const hidl_vec<uint8_t>& keyBlob) {
Shawn Willden9e149572017-10-30 16:08:21 -0600465 // There's nothing to be done to delete software key blobs.
Shawn Willden950eb0b2021-01-06 19:15:29 +0000466 DeleteKeyRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600467 request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
468
Shawn Willden950eb0b2021-01-06 19:15:29 +0000469 DeleteKeyResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600470 impl_->DeleteKey(request, &response);
471
472 return legacy_enum_conversion(response.error);
473}
474
Shawn Willdenefd06732017-11-30 19:34:16 -0700475Return<ErrorCode> AndroidKeymaster4Device::deleteAllKeys() {
Shawn Willden9e149572017-10-30 16:08:21 -0600476 // There's nothing to be done to delete software key blobs.
Shawn Willden950eb0b2021-01-06 19:15:29 +0000477 DeleteAllKeysRequest request(impl_->message_version());
478 DeleteAllKeysResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600479 impl_->DeleteAllKeys(request, &response);
480
481 return legacy_enum_conversion(response.error);
482}
483
Shawn Willdenefd06732017-11-30 19:34:16 -0700484Return<ErrorCode> AndroidKeymaster4Device::destroyAttestationIds() {
Shawn Willden9e149572017-10-30 16:08:21 -0600485 return ErrorCode::UNIMPLEMENTED;
486}
487
Shawn Willdenefd06732017-11-30 19:34:16 -0700488Return<void> AndroidKeymaster4Device::begin(KeyPurpose purpose, const hidl_vec<uint8_t>& key,
489 const hidl_vec<KeyParameter>& inParams,
Shawn Willdenda495752020-01-15 17:46:30 -0700490 const HardwareAuthToken& authToken, begin_cb _hidl_cb) {
Shawn Willden9e149572017-10-30 16:08:21 -0600491
Shawn Willden950eb0b2021-01-06 19:15:29 +0000492 BeginOperationRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600493 request.purpose = legacy_enum_conversion(purpose);
494 request.SetKeyMaterial(key.data(), key.size());
495 request.additional_params.Reinitialize(KmParamSet(inParams));
496
Shawn Willdenda495752020-01-15 17:46:30 -0700497 hidl_vec<uint8_t> hidl_vec_token = authToken2HidlVec(authToken);
498 request.additional_params.push_back(
499 TAG_AUTH_TOKEN, reinterpret_cast<uint8_t*>(hidl_vec_token.data()), hidl_vec_token.size());
500
Shawn Willden950eb0b2021-01-06 19:15:29 +0000501 BeginOperationResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600502 impl_->BeginOperation(request, &response);
503
504 hidl_vec<KeyParameter> resultParams;
Shawn Willdenda495752020-01-15 17:46:30 -0700505 if (response.error == KM_ERROR_OK) resultParams = kmParamSet2Hidl(response.output_params);
Shawn Willden9e149572017-10-30 16:08:21 -0600506
507 _hidl_cb(legacy_enum_conversion(response.error), resultParams, response.op_handle);
508 return Void();
509}
510
Shawn Willdenefd06732017-11-30 19:34:16 -0700511Return<void> AndroidKeymaster4Device::update(uint64_t operationHandle,
512 const hidl_vec<KeyParameter>& inParams,
513 const hidl_vec<uint8_t>& input,
514 const HardwareAuthToken& /* authToken */,
Shawn Willden8123da82017-10-31 09:01:26 -0600515 const VerificationToken& /* verificationToken */,
Shawn Willdenefd06732017-11-30 19:34:16 -0700516 update_cb _hidl_cb) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000517 UpdateOperationRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600518 request.op_handle = operationHandle;
519 request.input.Reinitialize(input.data(), input.size());
520 request.additional_params.Reinitialize(KmParamSet(inParams));
521
Shawn Willden950eb0b2021-01-06 19:15:29 +0000522 UpdateOperationResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600523 impl_->UpdateOperation(request, &response);
524
525 uint32_t resultConsumed = 0;
526 hidl_vec<KeyParameter> resultParams;
527 hidl_vec<uint8_t> resultBlob;
528 if (response.error == KM_ERROR_OK) {
529 resultConsumed = response.input_consumed;
530 resultParams = kmParamSet2Hidl(response.output_params);
531 resultBlob = kmBuffer2hidlVec(response.output);
532 }
533 _hidl_cb(legacy_enum_conversion(response.error), resultConsumed, resultParams, resultBlob);
534 return Void();
535}
536
Shawn Willden8123da82017-10-31 09:01:26 -0600537Return<void> AndroidKeymaster4Device::finish(uint64_t operationHandle,
538 const hidl_vec<KeyParameter>& inParams,
539 const hidl_vec<uint8_t>& input,
540 const hidl_vec<uint8_t>& signature,
541 const HardwareAuthToken& /* authToken */,
542 const VerificationToken& /* verificationToken */,
543 finish_cb _hidl_cb) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000544 FinishOperationRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600545 request.op_handle = operationHandle;
546 request.input.Reinitialize(input.data(), input.size());
547 request.signature.Reinitialize(signature.data(), signature.size());
548 request.additional_params.Reinitialize(KmParamSet(inParams));
549
Shawn Willden950eb0b2021-01-06 19:15:29 +0000550 FinishOperationResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600551 impl_->FinishOperation(request, &response);
552
553 hidl_vec<KeyParameter> resultParams;
554 hidl_vec<uint8_t> resultBlob;
555 if (response.error == KM_ERROR_OK) {
556 resultParams = kmParamSet2Hidl(response.output_params);
557 resultBlob = kmBuffer2hidlVec(response.output);
558 }
559 _hidl_cb(legacy_enum_conversion(response.error), resultParams, resultBlob);
560 return Void();
561}
562
Shawn Willdenefd06732017-11-30 19:34:16 -0700563Return<ErrorCode> AndroidKeymaster4Device::abort(uint64_t operationHandle) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000564 AbortOperationRequest request(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600565 request.op_handle = operationHandle;
566
Shawn Willden950eb0b2021-01-06 19:15:29 +0000567 AbortOperationResponse response(impl_->message_version());
Shawn Willden9e149572017-10-30 16:08:21 -0600568 impl_->AbortOperation(request, &response);
569
570 return legacy_enum_conversion(response.error);
571}
572
Janis Danisevskis265f9122018-01-02 17:02:21 -0800573IKeymasterDevice* CreateKeymasterDevice(SecurityLevel securityLevel) {
574 return new AndroidKeymaster4Device(securityLevel);
Shawn Willden9e149572017-10-30 16:08:21 -0600575}
576
577} // namespace ng
578} // namespace V4_0
579} // namespace keymaster