blob: 0dbf756aa8dc740d5b0b6faa4fd5f11469ba1a5f [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
33using namespace ::keymaster;
Shawn Willden96d4e8c2020-12-07 17:03:54 -070034using namespace km_utils;
Shawn Willden815e8962020-12-11 13:05:27 +000035
Shawn Willden763166c2021-01-10 19:45:01 -070036namespace {
37
38vector<KeyCharacteristics> convertKeyCharacteristics(SecurityLevel keyMintSecurityLevel,
39 const AuthorizationSet& sw_enforced,
40 const AuthorizationSet& hw_enforced) {
41 KeyCharacteristics enforced;
42
43 enforced.securityLevel = keyMintSecurityLevel;
44 if (keyMintSecurityLevel != SecurityLevel::SOFTWARE) {
45 // We're pretending to be TRUSTED_ENVIRONMENT or STRONGBOX. Only the entries in hw_enforced
46 // should be returned.
47 enforced.authorizations = kmParamSet2Aidl(hw_enforced);
48 KeyCharacteristics enforced{keyMintSecurityLevel, kmParamSet2Aidl(hw_enforced)};
49 return {std::move(enforced)};
50 }
51
52 CHECK(hw_enforced.empty()) << "Hardware-enforced list is non-empty for pure SW KeyMint";
53
54 // This is a pure software implementation, so all tags are in sw_enforced. We need to walk
55 // through the SW-enforced list and figure out which tags to return and which not.
56
57 for (auto& entry : sw_enforced) {
58 switch (entry.tag) {
59 /* Invalid and unused */
60 case KM_TAG_ECIES_SINGLE_HASH_MODE:
61 case KM_TAG_INVALID:
62 case KM_TAG_KDF:
63 CHECK(false) << "We shouldn't see tag " << entry.tag;
64 break;
65
66 /* Unimplemented */
67 case KM_TAG_ALLOW_WHILE_ON_BODY:
68 case KM_TAG_APPLICATION_ID:
69 case KM_TAG_BOOTLOADER_ONLY:
70 case KM_TAG_EARLY_BOOT_ONLY:
71 case KM_TAG_ROLLBACK_RESISTANCE:
72 case KM_TAG_ROLLBACK_RESISTANT:
73 case KM_TAG_STORAGE_KEY:
74 break;
75
76 /* Unenforceable */
77 case KM_TAG_ACTIVE_DATETIME:
78 case KM_TAG_ALL_APPLICATIONS:
79 case KM_TAG_ALL_USERS:
80 case KM_TAG_CREATION_DATETIME:
81 case KM_TAG_ORIGINATION_EXPIRE_DATETIME:
82 case KM_TAG_TRUSTED_CONFIRMATION_REQUIRED:
83 case KM_TAG_TRUSTED_USER_PRESENCE_REQUIRED:
84 case KM_TAG_USAGE_EXPIRE_DATETIME:
85 case KM_TAG_USER_ID:
86 break;
87
88 /* Disallowed in KeyCharacteristics */
89 case KM_TAG_APPLICATION_DATA:
90 break;
91
92 /* Not key characteristics */
93 case KM_TAG_ASSOCIATED_DATA:
94 case KM_TAG_ATTESTATION_APPLICATION_ID:
95 case KM_TAG_ATTESTATION_CHALLENGE:
96 case KM_TAG_ATTESTATION_ID_BRAND:
97 case KM_TAG_ATTESTATION_ID_DEVICE:
98 case KM_TAG_ATTESTATION_ID_IMEI:
99 case KM_TAG_ATTESTATION_ID_MANUFACTURER:
100 case KM_TAG_ATTESTATION_ID_MEID:
101 case KM_TAG_ATTESTATION_ID_MODEL:
102 case KM_TAG_ATTESTATION_ID_PRODUCT:
103 case KM_TAG_ATTESTATION_ID_SERIAL:
104 case KM_TAG_AUTH_TOKEN:
105 case KM_TAG_CERTIFICATE_SERIAL:
106 case KM_TAG_CERTIFICATE_SUBJECT:
107 case KM_TAG_CONFIRMATION_TOKEN:
108 case KM_TAG_DEVICE_UNIQUE_ATTESTATION:
109 case KM_TAG_IDENTITY_CREDENTIAL_KEY:
110 case KM_TAG_MAC_LENGTH:
111 case KM_TAG_NONCE:
112 case KM_TAG_RESET_SINCE_ID_ROTATION:
113 case KM_TAG_ROOT_OF_TRUST:
114 case KM_TAG_UNIQUE_ID:
115 break;
116
117 /* Enforced */
118 case KM_TAG_ALGORITHM:
119 case KM_TAG_AUTH_TIMEOUT:
120 case KM_TAG_BLOB_USAGE_REQUIREMENTS:
121 case KM_TAG_BLOCK_MODE:
122 case KM_TAG_BOOT_PATCHLEVEL:
123 case KM_TAG_CALLER_NONCE:
124 case KM_TAG_DIGEST:
125 case KM_TAG_EC_CURVE:
126 case KM_TAG_EXPORTABLE:
127 case KM_TAG_INCLUDE_UNIQUE_ID:
128 case KM_TAG_KEY_SIZE:
129 case KM_TAG_MAX_USES_PER_BOOT:
130 case KM_TAG_MIN_MAC_LENGTH:
131 case KM_TAG_MIN_SECONDS_BETWEEN_OPS:
132 case KM_TAG_NO_AUTH_REQUIRED:
133 case KM_TAG_ORIGIN:
134 case KM_TAG_OS_PATCHLEVEL:
135 case KM_TAG_OS_VERSION:
136 case KM_TAG_PADDING:
137 case KM_TAG_PURPOSE:
138 case KM_TAG_RSA_OAEP_MGF_DIGEST:
139 case KM_TAG_RSA_PUBLIC_EXPONENT:
140 case KM_TAG_UNLOCKED_DEVICE_REQUIRED:
141 case KM_TAG_USER_AUTH_TYPE:
142 case KM_TAG_USER_SECURE_ID:
143 case KM_TAG_VENDOR_PATCHLEVEL:
144 enforced.authorizations.push_back(kmParam2Aidl(entry));
145 }
146 }
147
148 return {std::move(enforced)};
149}
150
Shawn Willdend7d4f312020-12-21 08:31:01 -0700151Certificate convertCertificate(const keymaster_blob_t& cert) {
152 return {std::vector<uint8_t>(cert.data, cert.data + cert.data_length)};
153}
154
155vector<Certificate> convertCertificateChain(const CertificateChain& chain) {
156 vector<Certificate> retval;
157 retval.reserve(chain.entry_count);
158 std::transform(chain.begin(), chain.end(), std::back_inserter(retval), convertCertificate);
159 return retval;
160}
161
Shawn Willden763166c2021-01-10 19:45:01 -0700162} // namespace
163
Shawn Willden815e8962020-12-11 13:05:27 +0000164constexpr size_t kOperationTableSize = 16;
165
166AndroidKeyMintDevice::AndroidKeyMintDevice(SecurityLevel securityLevel)
167 : impl_(new ::keymaster::AndroidKeymaster(
168 [&]() -> auto {
169 auto context = new PureSoftKeymasterContext(
170 KmVersion::KEYMINT_1, static_cast<keymaster_security_level_t>(securityLevel));
171 context->SetSystemVersion(::keymaster::GetOsVersion(),
172 ::keymaster::GetOsPatchlevel());
173 return context;
174 }(),
175 kOperationTableSize)),
176 securityLevel_(securityLevel) {}
177
178AndroidKeyMintDevice::~AndroidKeyMintDevice() {}
179
180ScopedAStatus AndroidKeyMintDevice::getHardwareInfo(KeyMintHardwareInfo* info) {
181 info->versionNumber = 1;
182 info->securityLevel = securityLevel_;
183 info->keyMintName = "FakeKeyMintDevice";
184 info->keyMintAuthorName = "Google";
185
186 return ScopedAStatus::ok();
187}
188
189ScopedAStatus AndroidKeyMintDevice::verifyAuthorization(int64_t challenge, //
190 const HardwareAuthToken& authToken, //
191 VerificationToken* verificationToken) {
192
Shawn Willden950eb0b2021-01-06 19:15:29 +0000193 VerifyAuthorizationRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000194 request.challenge = static_cast<uint64_t>(challenge);
195 request.auth_token.challenge = authToken.challenge;
196 request.auth_token.user_id = authToken.userId;
197 request.auth_token.authenticator_id = authToken.authenticatorId;
198 request.auth_token.authenticator_type = legacy_enum_conversion(authToken.authenticatorType);
199
200 // TODO(seleneh) b/162481130 remove the casting once uint is supported in aidl
201 request.auth_token.timestamp = static_cast<uint64_t>(authToken.timestamp.milliSeconds);
202 KeymasterBlob mac(authToken.mac.data(), authToken.mac.size());
203 request.auth_token.mac = KeymasterBlob(authToken.mac.data(), authToken.mac.size());
204
205 auto response = impl_->VerifyAuthorization(request);
206
207 if (response.error != KM_ERROR_OK) {
208 return kmError2ScopedAStatus(response.error);
209 }
210
211 verificationToken->challenge = response.token.challenge;
212 verificationToken->timestamp.milliSeconds = static_cast<int64_t>(response.token.timestamp);
213 verificationToken->securityLevel = legacy_enum_conversion(response.token.security_level);
214 verificationToken->mac = kmBlob2vector(response.token.mac);
215
216 return ScopedAStatus::ok();
217}
218
219ScopedAStatus AndroidKeyMintDevice::addRngEntropy(const vector<uint8_t>& data) {
220 if (data.size() == 0) {
221 return ScopedAStatus::ok();
222 }
223
Shawn Willden950eb0b2021-01-06 19:15:29 +0000224 AddEntropyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000225 request.random_data.Reinitialize(data.data(), data.size());
226
Shawn Willden950eb0b2021-01-06 19:15:29 +0000227 AddEntropyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000228 impl_->AddRngEntropy(request, &response);
229
230 return kmError2ScopedAStatus(response.error);
231}
232
233ScopedAStatus AndroidKeyMintDevice::generateKey(const vector<KeyParameter>& keyParams,
Shawn Willden763166c2021-01-10 19:45:01 -0700234 KeyCreationResult* creationResult) {
Shawn Willden815e8962020-12-11 13:05:27 +0000235
Shawn Willden950eb0b2021-01-06 19:15:29 +0000236 GenerateKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000237 request.key_description.Reinitialize(KmParamSet(keyParams));
238
Shawn Willden950eb0b2021-01-06 19:15:29 +0000239 GenerateKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000240 impl_->GenerateKey(request, &response);
241
242 if (response.error != KM_ERROR_OK) {
243 // Note a key difference between this current aidl and previous hal, is
244 // that hal returns void where as aidl returns the error status. If
245 // aidl returns error, then aidl will not return any change you may make
246 // to the out parameters. This is quite different from hal where all
247 // output variable can be modified due to hal returning void.
248 //
249 // So the caller need to be aware not to expect aidl functions to clear
250 // the output variables for you in case of error. If you left some
251 // wrong data set in the out parameters, they will stay there.
252 return kmError2ScopedAStatus(response.error);
253 }
254
Shawn Willden763166c2021-01-10 19:45:01 -0700255 creationResult->keyBlob = kmBlob2vector(response.key_blob);
256 creationResult->keyCharacteristics =
257 convertKeyCharacteristics(securityLevel_, response.unenforced, response.enforced);
Shawn Willdend7d4f312020-12-21 08:31:01 -0700258 creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
Shawn Willden815e8962020-12-11 13:05:27 +0000259 return ScopedAStatus::ok();
260}
261
262ScopedAStatus AndroidKeyMintDevice::importKey(const vector<KeyParameter>& keyParams,
263 KeyFormat keyFormat, const vector<uint8_t>& keyData,
Shawn Willden763166c2021-01-10 19:45:01 -0700264 KeyCreationResult* creationResult) {
Shawn Willden815e8962020-12-11 13:05:27 +0000265
Shawn Willden950eb0b2021-01-06 19:15:29 +0000266 ImportKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000267 request.key_description.Reinitialize(KmParamSet(keyParams));
268 request.key_format = legacy_enum_conversion(keyFormat);
269 request.SetKeyMaterial(keyData.data(), keyData.size());
270
Shawn Willden950eb0b2021-01-06 19:15:29 +0000271 ImportKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000272 impl_->ImportKey(request, &response);
273
274 if (response.error != KM_ERROR_OK) {
275 return kmError2ScopedAStatus(response.error);
276 }
277
Shawn Willden763166c2021-01-10 19:45:01 -0700278 creationResult->keyBlob = kmBlob2vector(response.key_blob);
279 creationResult->keyCharacteristics =
280 convertKeyCharacteristics(securityLevel_, response.unenforced, response.enforced);
Shawn Willdend7d4f312020-12-21 08:31:01 -0700281 creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
Shawn Willden815e8962020-12-11 13:05:27 +0000282
283 return ScopedAStatus::ok();
284}
285
Shawn Willden763166c2021-01-10 19:45:01 -0700286ScopedAStatus AndroidKeyMintDevice::importWrappedKey(const vector<uint8_t>& wrappedKeyData,
287 const vector<uint8_t>& wrappingKeyBlob,
288 const vector<uint8_t>& maskingKey,
289 const vector<KeyParameter>& unwrappingParams,
290 int64_t passwordSid, int64_t biometricSid,
291 KeyCreationResult* creationResult) {
Shawn Willden815e8962020-12-11 13:05:27 +0000292
Shawn Willden950eb0b2021-01-06 19:15:29 +0000293 ImportWrappedKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000294 request.SetWrappedMaterial(wrappedKeyData.data(), wrappedKeyData.size());
295 request.SetWrappingMaterial(wrappingKeyBlob.data(), wrappingKeyBlob.size());
296 request.SetMaskingKeyMaterial(maskingKey.data(), maskingKey.size());
297 request.additional_params.Reinitialize(KmParamSet(unwrappingParams));
298 request.password_sid = static_cast<uint64_t>(passwordSid);
299 request.biometric_sid = static_cast<uint64_t>(biometricSid);
300
Shawn Willden950eb0b2021-01-06 19:15:29 +0000301 ImportWrappedKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000302 impl_->ImportWrappedKey(request, &response);
303
304 if (response.error != KM_ERROR_OK) {
305 return kmError2ScopedAStatus(response.error);
306 }
307
Shawn Willden763166c2021-01-10 19:45:01 -0700308 creationResult->keyBlob = kmBlob2vector(response.key_blob);
309 creationResult->keyCharacteristics =
310 convertKeyCharacteristics(securityLevel_, response.unenforced, response.enforced);
Shawn Willdend7d4f312020-12-21 08:31:01 -0700311 creationResult->certificateChain = convertCertificateChain(response.certificate_chain);
Shawn Willden815e8962020-12-11 13:05:27 +0000312
313 return ScopedAStatus::ok();
314}
315
316ScopedAStatus AndroidKeyMintDevice::upgradeKey(const vector<uint8_t>& keyBlobToUpgrade,
317 const vector<KeyParameter>& upgradeParams,
318 vector<uint8_t>* keyBlob) {
319
Shawn Willden950eb0b2021-01-06 19:15:29 +0000320 UpgradeKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000321 request.SetKeyMaterial(keyBlobToUpgrade.data(), keyBlobToUpgrade.size());
322 request.upgrade_params.Reinitialize(KmParamSet(upgradeParams));
323
Shawn Willden950eb0b2021-01-06 19:15:29 +0000324 UpgradeKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000325 impl_->UpgradeKey(request, &response);
326
327 if (response.error != KM_ERROR_OK) {
328 return kmError2ScopedAStatus(response.error);
329 }
330
331 *keyBlob = kmBlob2vector(response.upgraded_key);
332 return ScopedAStatus::ok();
333}
334
335ScopedAStatus AndroidKeyMintDevice::deleteKey(const vector<uint8_t>& keyBlob) {
Shawn Willden950eb0b2021-01-06 19:15:29 +0000336 DeleteKeyRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000337 request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
338
Shawn Willden950eb0b2021-01-06 19:15:29 +0000339 DeleteKeyResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000340 impl_->DeleteKey(request, &response);
341
342 return kmError2ScopedAStatus(response.error);
343}
344
345ScopedAStatus AndroidKeyMintDevice::deleteAllKeys() {
346 // There's nothing to be done to delete software key blobs.
Shawn Willden950eb0b2021-01-06 19:15:29 +0000347 DeleteAllKeysRequest request(impl_->message_version());
348 DeleteAllKeysResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000349 impl_->DeleteAllKeys(request, &response);
350
351 return kmError2ScopedAStatus(response.error);
352}
353
354ScopedAStatus AndroidKeyMintDevice::destroyAttestationIds() {
355 return kmError2ScopedAStatus(KM_ERROR_UNIMPLEMENTED);
356}
357
358ScopedAStatus AndroidKeyMintDevice::begin(KeyPurpose purpose, const vector<uint8_t>& keyBlob,
359 const vector<KeyParameter>& params,
360 const HardwareAuthToken& authToken, BeginResult* result) {
361
Shawn Willden950eb0b2021-01-06 19:15:29 +0000362 BeginOperationRequest request(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000363 request.purpose = legacy_enum_conversion(purpose);
364 request.SetKeyMaterial(keyBlob.data(), keyBlob.size());
365 request.additional_params.Reinitialize(KmParamSet(params));
366
367 vector<uint8_t> vector_token = authToken2AidlVec(authToken);
368 request.additional_params.push_back(
369 TAG_AUTH_TOKEN, reinterpret_cast<uint8_t*>(vector_token.data()), vector_token.size());
370
Shawn Willden950eb0b2021-01-06 19:15:29 +0000371 BeginOperationResponse response(impl_->message_version());
Shawn Willden815e8962020-12-11 13:05:27 +0000372 impl_->BeginOperation(request, &response);
373
374 if (response.error != KM_ERROR_OK) {
375 return kmError2ScopedAStatus(response.error);
376 }
377
378 result->params = kmParamSet2Aidl(response.output_params);
379 result->challenge = response.op_handle;
380 result->operation =
381 ndk::SharedRefBase::make<AndroidKeyMintOperation>(impl_, response.op_handle);
382 return ScopedAStatus::ok();
383}
384
385IKeyMintDevice* CreateKeyMintDevice(SecurityLevel securityLevel) {
386
387 return ::new AndroidKeyMintDevice(securityLevel);
388}
389
390} // namespace aidl::android::hardware::security::keymint