blob: 08a1036230b87fb05dfbdacce68f757bf51c9691 [file] [log] [blame]
Shawn Willden815e8962020-12-11 13:05:27 +00001/*
2 * Copyright 2020, The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#define LOG_TAG "android.hardware.security.keymint-impl"
Shawn Willden763166c2021-01-10 19:45:01 -070018#include <android-base/logging.h>
Shawn Willden815e8962020-12-11 13:05:27 +000019
20#include "AndroidKeyMintDevice.h"
21
22#include <aidl/android/hardware/security/keymint/ErrorCode.h>
23
24#include <keymaster/android_keymaster.h>
25#include <keymaster/contexts/pure_soft_keymaster_context.h>
26#include <keymaster/keymaster_configuration.h>
27
28#include "AndroidKeyMintOperation.h"
29#include "KeyMintUtils.h"
30
31namespace aidl::android::hardware::security::keymint {
32
Shawn Willden9a3792e2021-04-08 09:38:14 -060033using namespace keymaster; // NOLINT(google-build-using-namespace)
34
35using km_utils::authToken2AidlVec;
36using km_utils::kmBlob2vector;
37using km_utils::kmError2ScopedAStatus;
38using km_utils::kmParam2Aidl;
39using km_utils::KmParamSet;
40using km_utils::kmParamSet2Aidl;
41using km_utils::legacy_enum_conversion;
Chirag Pathakb292e9a2021-02-02 07:28:09 +000042using secureclock::TimeStampToken;
Shawn Willden815e8962020-12-11 13:05:27 +000043
Shawn Willden763166c2021-01-10 19:45:01 -070044namespace {
45
46vector<KeyCharacteristics> convertKeyCharacteristics(SecurityLevel keyMintSecurityLevel,
David Drysdaleb90937d2021-03-08 13:52:17 +000047 const AuthorizationSet& requestParams,
Shawn Willden763166c2021-01-10 19:45:01 -070048 const AuthorizationSet& sw_enforced,
David Drysdalea49f3fd2021-05-20 12:04:06 +010049 const AuthorizationSet& hw_enforced,
50 bool include_keystore_enforced = true) {
Shawn Willden09f47102021-01-15 15:21:56 -070051 KeyCharacteristics keyMintEnforced{keyMintSecurityLevel, {}};
Shawn Willden763166c2021-01-10 19:45:01 -070052
Shawn Willden763166c2021-01-10 19:45:01 -070053 if (keyMintSecurityLevel != SecurityLevel::SOFTWARE) {
Qi Wuf7c8e9d2021-02-11 03:14:52 +080054 // We're pretending to be TRUSTED_ENVIRONMENT or STRONGBOX.
Shawn Willden09f47102021-01-15 15:21:56 -070055 keyMintEnforced.authorizations = kmParamSet2Aidl(hw_enforced);
David Drysdale9d480da2021-11-12 08:00:37 +000056 if (include_keystore_enforced && !sw_enforced.empty()) {
David Drysdalea49f3fd2021-05-20 12:04:06 +010057 // Put all the software authorizations in the keystore list.
58 KeyCharacteristics keystoreEnforced{SecurityLevel::KEYSTORE,
59 kmParamSet2Aidl(sw_enforced)};
60 return {std::move(keyMintEnforced), std::move(keystoreEnforced)};
61 } else {
62 return {std::move(keyMintEnforced)};
63 }
Shawn Willden763166c2021-01-10 19:45:01 -070064 }
65
Shawn Willden09f47102021-01-15 15:21:56 -070066 KeyCharacteristics keystoreEnforced{SecurityLevel::KEYSTORE, {}};
Shawn Willden763166c2021-01-10 19:45:01 -070067 CHECK(hw_enforced.empty()) << "Hardware-enforced list is non-empty for pure SW KeyMint";
68
Shawn Willden09f47102021-01-15 15:21:56 -070069 // This is a pure software implementation, so all tags are in sw_enforced.
70 // We need to walk through the SW-enforced list and figure out which tags to
71 // return in the software list and which in the keystore list.
Shawn Willden763166c2021-01-10 19:45:01 -070072
73 for (auto& entry : sw_enforced) {
74 switch (entry.tag) {
75 /* Invalid and unused */
76 case KM_TAG_ECIES_SINGLE_HASH_MODE:
77 case KM_TAG_INVALID:
78 case KM_TAG_KDF:
Shawn Willden09f47102021-01-15 15:21:56 -070079 case KM_TAG_ROLLBACK_RESISTANCE:
Shawn Willden763166c2021-01-10 19:45:01 -070080 CHECK(false) << "We shouldn't see tag " << entry.tag;
81 break;
82
83 /* Unimplemented */
84 case KM_TAG_ALLOW_WHILE_ON_BODY:
Shawn Willden763166c2021-01-10 19:45:01 -070085 case KM_TAG_BOOTLOADER_ONLY:
Shawn Willden763166c2021-01-10 19:45:01 -070086 case KM_TAG_ROLLBACK_RESISTANT:
87 case KM_TAG_STORAGE_KEY:
88 break;
89
David Drysdaleb90937d2021-03-08 13:52:17 +000090 /* Keystore-enforced if not locally generated. */
Shawn Willden763166c2021-01-10 19:45:01 -070091 case KM_TAG_CREATION_DATETIME:
David Drysdaleb90937d2021-03-08 13:52:17 +000092 // A KeyMaster implementation is required to add this tag to generated/imported keys.
93 // A KeyMint implementation is not required to create this tag, only to echo it back if
94 // it was included in the key generation/import request.
95 if (requestParams.Contains(KM_TAG_CREATION_DATETIME)) {
96 keystoreEnforced.authorizations.push_back(kmParam2Aidl(entry));
97 }
Shawn Willden763166c2021-01-10 19:45:01 -070098 break;
99
100 /* Disallowed in KeyCharacteristics */
101 case KM_TAG_APPLICATION_DATA:
Shawn Willden09f47102021-01-15 15:21:56 -0700102 case KM_TAG_ATTESTATION_APPLICATION_ID:
Shawn Willden763166c2021-01-10 19:45:01 -0700103 break;
104
105 /* Not key characteristics */
106 case KM_TAG_ASSOCIATED_DATA:
Shawn Willden763166c2021-01-10 19:45:01 -0700107 case KM_TAG_ATTESTATION_CHALLENGE:
108 case KM_TAG_ATTESTATION_ID_BRAND:
109 case KM_TAG_ATTESTATION_ID_DEVICE:
110 case KM_TAG_ATTESTATION_ID_IMEI:
111 case KM_TAG_ATTESTATION_ID_MANUFACTURER:
112 case KM_TAG_ATTESTATION_ID_MEID:
113 case KM_TAG_ATTESTATION_ID_MODEL:
114 case KM_TAG_ATTESTATION_ID_PRODUCT:
115 case KM_TAG_ATTESTATION_ID_SERIAL:
116 case KM_TAG_AUTH_TOKEN:
117 case KM_TAG_CERTIFICATE_SERIAL:
118 case KM_TAG_CERTIFICATE_SUBJECT:
Janis Danisevskisa5780e22021-01-31 22:05:22 -0800119 case KM_TAG_CERTIFICATE_NOT_AFTER:
120 case KM_TAG_CERTIFICATE_NOT_BEFORE:
Shawn Willden763166c2021-01-10 19:45:01 -0700121 case KM_TAG_CONFIRMATION_TOKEN:
122 case KM_TAG_DEVICE_UNIQUE_ATTESTATION:
123 case KM_TAG_IDENTITY_CREDENTIAL_KEY:
David Drysdalee104f382021-10-13 10:19:38 +0100124 case KM_TAG_INCLUDE_UNIQUE_ID:
Shawn Willden763166c2021-01-10 19:45:01 -0700125 case KM_TAG_MAC_LENGTH:
126 case KM_TAG_NONCE:
127 case KM_TAG_RESET_SINCE_ID_ROTATION:
128 case KM_TAG_ROOT_OF_TRUST:
129 case KM_TAG_UNIQUE_ID:
130 break;
131
Shawn Willden09f47102021-01-15 15:21:56 -0700132 /* KeyMint-enforced */
Shawn Willden763166c2021-01-10 19:45:01 -0700133 case KM_TAG_ALGORITHM:
Shawn Willden09f47102021-01-15 15:21:56 -0700134 case KM_TAG_APPLICATION_ID:
Shawn Willden763166c2021-01-10 19:45:01 -0700135 case KM_TAG_AUTH_TIMEOUT:
136 case KM_TAG_BLOB_USAGE_REQUIREMENTS:
137 case KM_TAG_BLOCK_MODE:
138 case KM_TAG_BOOT_PATCHLEVEL:
139 case KM_TAG_CALLER_NONCE:
140 case KM_TAG_DIGEST:
David Drysdale82fe2592021-05-27 11:57:03 +0100141 case KM_TAG_EARLY_BOOT_ONLY:
Shawn Willden763166c2021-01-10 19:45:01 -0700142 case KM_TAG_EC_CURVE:
143 case KM_TAG_EXPORTABLE:
Shawn Willden763166c2021-01-10 19:45:01 -0700144 case KM_TAG_KEY_SIZE:
145 case KM_TAG_MAX_USES_PER_BOOT:
146 case KM_TAG_MIN_MAC_LENGTH:
147 case KM_TAG_MIN_SECONDS_BETWEEN_OPS:
148 case KM_TAG_NO_AUTH_REQUIRED:
149 case KM_TAG_ORIGIN:
150 case KM_TAG_OS_PATCHLEVEL:
151 case KM_TAG_OS_VERSION:
152 case KM_TAG_PADDING:
153 case KM_TAG_PURPOSE:
154 case KM_TAG_RSA_OAEP_MGF_DIGEST:
155 case KM_TAG_RSA_PUBLIC_EXPONENT:
David Drysdale82fe2592021-05-27 11:57:03 +0100156 case KM_TAG_TRUSTED_CONFIRMATION_REQUIRED:
157 case KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED:
Shawn Willden763166c2021-01-10 19:45:01 -0700158 case KM_TAG_UNLOCKED_DEVICE_REQUIRED:
159 case KM_TAG_USER_AUTH_TYPE:
160 case KM_TAG_USER_SECURE_ID:
161 case KM_TAG_VENDOR_PATCHLEVEL:
Shawn Willden09f47102021-01-15 15:21:56 -0700162 keyMintEnforced.authorizations.push_back(kmParam2Aidl(entry));
163 break;
164
165 /* Keystore-enforced */
166 case KM_TAG_ACTIVE_DATETIME:
167 case KM_TAG_ALL_APPLICATIONS:
168 case KM_TAG_ALL_USERS:
Paul Crowley83846532021-02-10 11:24:50 -0800169 case KM_TAG_MAX_BOOT_LEVEL:
Shawn Willden09f47102021-01-15 15:21:56 -0700170 case KM_TAG_ORIGINATION_EXPIRE_DATETIME:
171 case KM_TAG_USAGE_EXPIRE_DATETIME:
172 case KM_TAG_USER_ID:
173 case KM_TAG_USAGE_COUNT_LIMIT:
174 keystoreEnforced.authorizations.push_back(kmParam2Aidl(entry));
175 break;
Shawn Willden763166c2021-01-10 19:45:01 -0700176 }
177 }
178
Shawn Willden09f47102021-01-15 15:21:56 -0700179 vector<KeyCharacteristics> retval;
180 retval.reserve(2);
181 if (!keyMintEnforced.authorizations.empty()) retval.push_back(std::move(keyMintEnforced));
David Drysdalea49f3fd2021-05-20 12:04:06 +0100182 if (include_keystore_enforced && !keystoreEnforced.authorizations.empty()) {
183 retval.push_back(std::move(keystoreEnforced));
184 }
Shawn Willden09f47102021-01-15 15:21:56 -0700185
186 return retval;
Shawn Willden763166c2021-01-10 19:45:01 -0700187}
188
Shawn Willdend7d4f312020-12-21 08:31:01 -0700189Certificate convertCertificate(const keymaster_blob_t& cert) {
190 return {std::vector<uint8_t>(cert.data, cert.data + cert.data_length)};
191}
192
193vector<Certificate> convertCertificateChain(const CertificateChain& chain) {
194 vector<Certificate> retval;
195 retval.reserve(chain.entry_count);
196 std::transform(chain.begin(), chain.end(), std::back_inserter(retval), convertCertificate);
197 return retval;
198}
199
David Drysdalea49f3fd2021-05-20 12:04:06 +0100200void addClientAndAppData(const std::vector<uint8_t>& appId, const std::vector<uint8_t>& appData,
201 ::keymaster::AuthorizationSet* params) {
202 params->Clear();
203 if (appId.size()) {
204 params->push_back(::keymaster::TAG_APPLICATION_ID, appId.data(), appId.size());
205 }
206 if (appData.size()) {
207 params->push_back(::keymaster::TAG_APPLICATION_DATA, appData.data(), appData.size());
208 }
209}
210
Shawn Willden763166c2021-01-10 19:45:01 -0700211} // namespace
212
Shawn Willden815e8962020-12-11 13:05:27 +0000213constexpr size_t kOperationTableSize = 16;
214
215AndroidKeyMintDevice::AndroidKeyMintDevice(SecurityLevel securityLevel)
216 : impl_(new ::keymaster::AndroidKeymaster(
217 [&]() -> auto {
218 auto context = new PureSoftKeymasterContext(
David Drysdale34754162021-12-06 10:03:56 +0000219 KmVersion::KEYMINT_2, static_cast<keymaster_security_level_t>(securityLevel));
Shawn Willden815e8962020-12-11 13:05:27 +0000220 context->SetSystemVersion(::keymaster::GetOsVersion(),
221 ::keymaster::GetOsPatchlevel());
Janis Danisevskisc427c562021-10-29 09:34:54 -0700222 context->SetVendorPatchlevel(::keymaster::GetVendorPatchlevel());
223 // Software devices cannot be configured by the boot loader but they have
224 // to return a boot patch level. So lets just return the OS patch level.
225 // The OS patch level only has a year and a month so we just add the 1st
226 // of the month as day field.
227 context->SetBootPatchlevel(GetOsPatchlevel() * 100 + 1);
Shawn Willden815e8962020-12-11 13:05:27 +0000228 return context;
229 }(),
230 kOperationTableSize)),
231 securityLevel_(securityLevel) {}
232
233AndroidKeyMintDevice::~AndroidKeyMintDevice() {}
234
235ScopedAStatus AndroidKeyMintDevice::getHardwareInfo(KeyMintHardwareInfo* info) {
David Drysdale34754162021-12-06 10:03:56 +0000236 info->versionNumber = 2;
Shawn Willden815e8962020-12-11 13:05:27 +0000237 info->securityLevel = securityLevel_;
238 info->keyMintName = "FakeKeyMintDevice";
239 info->keyMintAuthorName = "Google";
Chirag Pathakb292e9a2021-02-02 07:28:09 +0000240 info->timestampTokenRequired = false;
Shawn Willden815e8962020-12-11 13:05:27 +0000241 return ScopedAStatus::ok();
242}
243
Shawn Willden815e8962020-12-11 13:05:27 +0000244ScopedAStatus AndroidKeyMintDevice::addRngEntropy(const vector<uint8_t>& data) {
245 if (data.size() == 0) {
246 return ScopedAStatus::ok();
247 }
248
Shawn Willden950eb0b2021-01-06 19:15:29 +0000249 AddEntropyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000250 request.random_data.Reinitialize(data.data(), data.size());
251
Shawn Willden950eb0b2021-01-06 19:15:29 +0000252 AddEntropyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000253 impl_->AddRngEntropy(request, &response);
254
255 return kmError2ScopedAStatus(response.error);
256}
257
258ScopedAStatus AndroidKeyMintDevice::generateKey(const vector<KeyParameter>& keyParams,
Shawn Willden44c38882020-12-21 18:35:13 -0700259 const optional<AttestationKey>& attestationKey,
Shawn Willden763166c2021-01-10 19:45:01 -0700260 KeyCreationResult* creationResult) {
Shawn Willden815e8962020-12-11 13:05:27 +0000261
Shawn Willden950eb0b2021-01-06 19:15:29 +0000262 GenerateKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000263 request.key_description.Reinitialize(KmParamSet(keyParams));
Shawn Willden44c38882020-12-21 18:35:13 -0700264 if (attestationKey) {
265 request.attestation_signing_key_blob =
266 KeymasterKeyBlob(attestationKey->keyBlob.data(), attestationKey->keyBlob.size());
267 request.attest_key_params.Reinitialize(KmParamSet(attestationKey->attestKeyParams));
268 request.issuer_subject = KeymasterBlob(attestationKey->issuerSubjectName.data(),
269 attestationKey->issuerSubjectName.size());
270 }
Shawn Willden815e8962020-12-11 13:05:27 +0000271
Shawn Willden950eb0b2021-01-06 19:15:29 +0000272 GenerateKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000273 impl_->GenerateKey(request, &response);
274
275 if (response.error != KM_ERROR_OK) {
276 // Note a key difference between this current aidl and previous hal, is
277 // that hal returns void where as aidl returns the error status. If
278 // aidl returns error, then aidl will not return any change you may make
279 // to the out parameters. This is quite different from hal where all
280 // output variable can be modified due to hal returning void.
281 //
282 // So the caller need to be aware not to expect aidl functions to clear
283 // the output variables for you in case of error. If you left some
284 // wrong data set in the out parameters, they will stay there.
285 return kmError2ScopedAStatus(response.error);
286 }
287
Shawn Willden763166c2021-01-10 19:45:01 -0700288 creationResult->keyBlob = kmBlob2vector(response.key_blob);
David Drysdaleb90937d2021-03-08 13:52:17 +0000289 creationResult->keyCharacteristics = convertKeyCharacteristics(
290 securityLevel_, request.key_description, response.unenforced, response.enforced);
Shawn Willdend7d4f312020-12-21 08:31:01 -0700291 creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
Shawn Willden815e8962020-12-11 13:05:27 +0000292 return ScopedAStatus::ok();
293}
294
295ScopedAStatus AndroidKeyMintDevice::importKey(const vector<KeyParameter>& keyParams,
296 KeyFormat keyFormat, const vector<uint8_t>& keyData,
Shawn Willden44c38882020-12-21 18:35:13 -0700297 const optional<AttestationKey>& attestationKey,
Shawn Willden763166c2021-01-10 19:45:01 -0700298 KeyCreationResult* creationResult) {
Shawn Willden815e8962020-12-11 13:05:27 +0000299
Shawn Willden950eb0b2021-01-06 19:15:29 +0000300 ImportKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000301 request.key_description.Reinitialize(KmParamSet(keyParams));
302 request.key_format = legacy_enum_conversion(keyFormat);
Shawn Willden6e20ea42020-12-21 18:52:34 -0700303 request.key_data = KeymasterKeyBlob(keyData.data(), keyData.size());
Shawn Willden44c38882020-12-21 18:35:13 -0700304 if (attestationKey) {
305 request.attestation_signing_key_blob =
306 KeymasterKeyBlob(attestationKey->keyBlob.data(), attestationKey->keyBlob.size());
307 request.attest_key_params.Reinitialize(KmParamSet(attestationKey->attestKeyParams));
308 request.issuer_subject = KeymasterBlob(attestationKey->issuerSubjectName.data(),
309 attestationKey->issuerSubjectName.size());
310 }
Shawn Willden815e8962020-12-11 13:05:27 +0000311
Shawn Willden950eb0b2021-01-06 19:15:29 +0000312 ImportKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000313 impl_->ImportKey(request, &response);
314
315 if (response.error != KM_ERROR_OK) {
316 return kmError2ScopedAStatus(response.error);
317 }
318
Shawn Willden763166c2021-01-10 19:45:01 -0700319 creationResult->keyBlob = kmBlob2vector(response.key_blob);
David Drysdaleb90937d2021-03-08 13:52:17 +0000320 creationResult->keyCharacteristics = convertKeyCharacteristics(
321 securityLevel_, request.key_description, response.unenforced, response.enforced);
Shawn Willdend7d4f312020-12-21 08:31:01 -0700322 creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
Shawn Willden815e8962020-12-11 13:05:27 +0000323
324 return ScopedAStatus::ok();
325}
326
Shawn Willden44c38882020-12-21 18:35:13 -0700327ScopedAStatus
328AndroidKeyMintDevice::importWrappedKey(const vector<uint8_t>& wrappedKeyData, //
329 const vector<uint8_t>& wrappingKeyBlob, //
330 const vector<uint8_t>& maskingKey, //
331 const vector<KeyParameter>& unwrappingParams, //
332 int64_t passwordSid, int64_t biometricSid, //
333 KeyCreationResult* creationResult) {
Shawn Willden815e8962020-12-11 13:05:27 +0000334
Shawn Willden950eb0b2021-01-06 19:15:29 +0000335 ImportWrappedKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000336 request.SetWrappedMaterial(wrappedKeyData.data(), wrappedKeyData.size());
337 request.SetWrappingMaterial(wrappingKeyBlob.data(), wrappingKeyBlob.size());
338 request.SetMaskingKeyMaterial(maskingKey.data(), maskingKey.size());
339 request.additional_params.Reinitialize(KmParamSet(unwrappingParams));
340 request.password_sid = static_cast<uint64_t>(passwordSid);
341 request.biometric_sid = static_cast<uint64_t>(biometricSid);
342
Shawn Willden950eb0b2021-01-06 19:15:29 +0000343 ImportWrappedKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000344 impl_->ImportWrappedKey(request, &response);
345
346 if (response.error != KM_ERROR_OK) {
347 return kmError2ScopedAStatus(response.error);
348 }
349
Shawn Willden763166c2021-01-10 19:45:01 -0700350 creationResult->keyBlob = kmBlob2vector(response.key_blob);
David Drysdaleb90937d2021-03-08 13:52:17 +0000351 creationResult->keyCharacteristics = convertKeyCharacteristics(
352 securityLevel_, request.additional_params, response.unenforced, response.enforced);
Shawn Willdend7d4f312020-12-21 08:31:01 -0700353 creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
Shawn Willden815e8962020-12-11 13:05:27 +0000354
355 return ScopedAStatus::ok();
356}
357
358ScopedAStatus AndroidKeyMintDevice::upgradeKey(const vector<uint8_t>& keyBlobToUpgrade,
359 const vector<KeyParameter>& upgradeParams,
360 vector<uint8_t>* keyBlob) {
361
Shawn Willden950eb0b2021-01-06 19:15:29 +0000362 UpgradeKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000363 request.SetKeyMaterial(keyBlobToUpgrade.data(), keyBlobToUpgrade.size());
364 request.upgrade_params.Reinitialize(KmParamSet(upgradeParams));
365
Shawn Willden950eb0b2021-01-06 19:15:29 +0000366 UpgradeKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000367 impl_->UpgradeKey(request, &response);
368
369 if (response.error != KM_ERROR_OK) {
370 return kmError2ScopedAStatus(response.error);
371 }
372
373 *keyBlob = kmBlob2vector(response.upgraded_key);
374 return ScopedAStatus::ok();
375}
376
377ScopedAStatus AndroidKeyMintDevice::deleteKey(const vector<uint8_t>& keyBlob) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000378 DeleteKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000379 request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
380
Shawn Willden950eb0b2021-01-06 19:15:29 +0000381 DeleteKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000382 impl_->DeleteKey(request, &response);
383
384 return kmError2ScopedAStatus(response.error);
385}
386
387ScopedAStatus AndroidKeyMintDevice::deleteAllKeys() {
388 // There's nothing to be done to delete software key blobs.
Shawn Willden950eb0b2021-01-06 19:15:29 +0000389 DeleteAllKeysRequest request(impl_->message_version());
390 DeleteAllKeysResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000391 impl_->DeleteAllKeys(request, &response);
392
393 return kmError2ScopedAStatus(response.error);
394}
395
396ScopedAStatus AndroidKeyMintDevice::destroyAttestationIds() {
397 return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
398}
399
400ScopedAStatus AndroidKeyMintDevice::begin(KeyPurpose purpose, const vector<uint8_t>& keyBlob,
401 const vector<KeyParameter>& params,
David Drysdale81815912021-04-19 19:11:41 +0100402 const optional<HardwareAuthToken>& authToken,
403 BeginResult* result) {
Shawn Willden815e8962020-12-11 13:05:27 +0000404
Shawn Willden950eb0b2021-01-06 19:15:29 +0000405 BeginOperationRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000406 request.purpose = legacy_enum_conversion(purpose);
407 request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
408 request.additional_params.Reinitialize(KmParamSet(params));
409
410 vector<uint8_t> vector_token = authToken2AidlVec(authToken);
411 request.additional_params.push_back(
412 TAG_AUTH_TOKEN, reinterpret_cast<uint8_t*>(vector_token.data()), vector_token.size());
413
Shawn Willden950eb0b2021-01-06 19:15:29 +0000414 BeginOperationResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000415 impl_->BeginOperation(request, &response);
416
417 if (response.error != KM_ERROR_OK) {
418 return kmError2ScopedAStatus(response.error);
419 }
420
421 result->params = kmParamSet2Aidl(response.output_params);
422 result->challenge = response.op_handle;
423 result->operation =
424 ndk::SharedRefBase::make<AndroidKeyMintOperation>(impl_, response.op_handle);
425 return ScopedAStatus::ok();
426}
427
Chirag Pathakb292e9a2021-02-02 07:28:09 +0000428ScopedAStatus AndroidKeyMintDevice::deviceLocked(
Shawn Willden55929692021-02-19 14:53:02 -0700429 bool passwordOnly, const std::optional<secureclock::TimeStampToken>& timestampToken) {
Chirag Pathakb292e9a2021-02-02 07:28:09 +0000430 DeviceLockedRequest request(impl_->message_version());
Shawn Willden55929692021-02-19 14:53:02 -0700431 request.passwordOnly = passwordOnly;
432 if (timestampToken.has_value()) {
433 request.token.challenge = timestampToken->challenge;
434 request.token.mac = {timestampToken->mac.data(), timestampToken->mac.size()};
435 request.token.timestamp = timestampToken->timestamp.milliSeconds;
Chirag Pathakb292e9a2021-02-02 07:28:09 +0000436 }
437 DeviceLockedResponse response = impl_->DeviceLocked(request);
438 return kmError2ScopedAStatus(response.error);
439}
440
441ScopedAStatus AndroidKeyMintDevice::earlyBootEnded() {
442 EarlyBootEndedResponse response = impl_->EarlyBootEnded();
443 return kmError2ScopedAStatus(response.error);
444}
445
Satya Tangirala86d25402021-03-05 16:33:50 -0800446ScopedAStatus
447AndroidKeyMintDevice::convertStorageKeyToEphemeral(const std::vector<uint8_t>& /* storageKeyBlob */,
448 std::vector<uint8_t>* /* ephemeralKeyBlob */) {
449 return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
450}
451
Paul Crowley08641bf2021-04-29 12:46:49 -0700452ScopedAStatus AndroidKeyMintDevice::getKeyCharacteristics(
David Drysdalea49f3fd2021-05-20 12:04:06 +0100453 const std::vector<uint8_t>& keyBlob, const std::vector<uint8_t>& appId,
454 const std::vector<uint8_t>& appData, std::vector<KeyCharacteristics>* keyCharacteristics) {
455 GetKeyCharacteristicsRequest request(impl_->message_version());
456 request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
457 addClientAndAppData(appId, appData, &request.additional_params);
458
459 GetKeyCharacteristicsResponse response(impl_->message_version());
460 impl_->GetKeyCharacteristics(request, &response);
461
462 if (response.error != KM_ERROR_OK) {
463 return kmError2ScopedAStatus(response.error);
464 }
465
466 AuthorizationSet emptySet;
467 *keyCharacteristics =
468 convertKeyCharacteristics(securityLevel_, emptySet, response.unenforced, response.enforced,
469 /* include_keystore_enforced = */ false);
470
471 return ScopedAStatus::ok();
Paul Crowley08641bf2021-04-29 12:46:49 -0700472}
473
Shawn Willden5c4f5702022-02-17 15:48:35 -0700474ScopedAStatus AndroidKeyMintDevice::getRootOfTrustChallenge(array<uint8_t, 16>* /* challenge */) {
475 return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
476}
477
478ScopedAStatus AndroidKeyMintDevice::getRootOfTrust(const array<uint8_t, 16>& /* challenge */,
479 vector<uint8_t>* /* rootOfTrust */) {
480 return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
481}
482
483ScopedAStatus AndroidKeyMintDevice::sendRootOfTrust(const vector<uint8_t>& /* rootOfTrust */) {
484 return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
485}
486
Shawn Willden815e8962020-12-11 13:05:27 +0000487IKeyMintDevice* CreateKeyMintDevice(SecurityLevel securityLevel) {
Shawn Willden815e8962020-12-11 13:05:27 +0000488 return ::new AndroidKeyMintDevice(securityLevel);
489}
490
491} // namespace aidl::android::hardware::security::keymint