1 /* 2 * Copyright (C) 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 "KeymasterHidlTest.h" 18 19 #include <chrono> 20 #include <vector> 21 22 #include <android-base/logging.h> 23 #include <android/hidl/manager/1.0/IServiceManager.h> 24 25 #include <keymasterV4_0/key_param_output.h> 26 27 namespace android { 28 namespace hardware { 29 namespace keymaster { 30 namespace V4_0 { 31 32 ::std::ostream& operator<<(::std::ostream& os, const AuthorizationSet& set) { 33 if (set.size() == 0) 34 os << "(Empty)" << ::std::endl; 35 else { 36 os << "\n"; 37 for (size_t i = 0; i < set.size(); ++i) os << set[i] << ::std::endl; 38 } 39 return os; 40 } 41 42 namespace test { 43 44 sp<IKeymasterDevice> KeymasterHidlTest::keymaster_; 45 std::vector<sp<IKeymasterDevice>> KeymasterHidlTest::all_keymasters_; 46 uint32_t KeymasterHidlTest::os_version_; 47 uint32_t KeymasterHidlTest::os_patch_level_; 48 SecurityLevel KeymasterHidlTest::securityLevel_; 49 hidl_string KeymasterHidlTest::name_; 50 hidl_string KeymasterHidlTest::author_; 51 52 void KeymasterHidlTest::SetUpTestCase() { 53 string service_name = KeymasterHidlEnvironment::Instance()->getServiceName<IKeymasterDevice>(); 54 keymaster_ = ::testing::VtsHalHidlTargetTestBase::getService<IKeymasterDevice>(service_name); 55 ASSERT_NE(keymaster_, nullptr); 56 57 ASSERT_TRUE(keymaster_ 58 ->getHardwareInfo([&](SecurityLevel securityLevel, const hidl_string& name, 59 const hidl_string& author) { 60 securityLevel_ = securityLevel; 61 name_ = name; 62 author_ = author; 63 }) 64 .isOk()); 65 66 os_version_ = ::keymaster::GetOsVersion(); 67 os_patch_level_ = ::keymaster::GetOsPatchlevel(); 68 69 auto service_manager = android::hidl::manager::V1_0::IServiceManager::getService(); 70 ASSERT_NE(nullptr, service_manager.get()); 71 72 all_keymasters_.push_back(keymaster_); 73 service_manager->listByInterface( 74 IKeymasterDevice::descriptor, [&](const hidl_vec<hidl_string>& names) { 75 for (auto& name : names) { 76 if (name == service_name) continue; 77 auto keymaster = 78 ::testing::VtsHalHidlTargetTestBase::getService<IKeymasterDevice>(name); 79 ASSERT_NE(keymaster, nullptr); 80 all_keymasters_.push_back(keymaster); 81 } 82 }); 83 } 84 85 ErrorCode KeymasterHidlTest::GenerateKey(const AuthorizationSet& key_desc, HidlBuf* key_blob, 86 KeyCharacteristics* key_characteristics) { 87 EXPECT_NE(key_blob, nullptr) << "Key blob pointer must not be null. Test bug"; 88 EXPECT_EQ(0U, key_blob->size()) << "Key blob not empty before generating key. Test bug."; 89 EXPECT_NE(key_characteristics, nullptr) 90 << "Previous characteristics not deleted before generating key. Test bug."; 91 92 ErrorCode error; 93 EXPECT_TRUE(keymaster_ 94 ->generateKey(key_desc.hidl_data(), 95 [&](ErrorCode hidl_error, const HidlBuf& hidl_key_blob, 96 const KeyCharacteristics& hidl_key_characteristics) { 97 error = hidl_error; 98 *key_blob = hidl_key_blob; 99 *key_characteristics = hidl_key_characteristics; 100 }) 101 .isOk()); 102 // On error, blob & characteristics should be empty. 103 if (error != ErrorCode::OK) { 104 EXPECT_EQ(0U, key_blob->size()); 105 EXPECT_EQ(0U, (key_characteristics->softwareEnforced.size() + 106 key_characteristics->hardwareEnforced.size())); 107 } 108 return error; 109 } 110 111 ErrorCode KeymasterHidlTest::GenerateKey(const AuthorizationSet& key_desc) { 112 return GenerateKey(key_desc, &key_blob_, &key_characteristics_); 113 } 114 115 ErrorCode KeymasterHidlTest::ImportKey(const AuthorizationSet& key_desc, KeyFormat format, 116 const string& key_material, HidlBuf* key_blob, 117 KeyCharacteristics* key_characteristics) { 118 ErrorCode error; 119 EXPECT_TRUE(keymaster_ 120 ->importKey(key_desc.hidl_data(), format, HidlBuf(key_material), 121 [&](ErrorCode hidl_error, const HidlBuf& hidl_key_blob, 122 const KeyCharacteristics& hidl_key_characteristics) { 123 error = hidl_error; 124 *key_blob = hidl_key_blob; 125 *key_characteristics = hidl_key_characteristics; 126 }) 127 .isOk()); 128 // On error, blob & characteristics should be empty. 129 if (error != ErrorCode::OK) { 130 EXPECT_EQ(0U, key_blob->size()); 131 EXPECT_EQ(0U, (key_characteristics->softwareEnforced.size() + 132 key_characteristics->hardwareEnforced.size())); 133 } 134 return error; 135 } 136 137 ErrorCode KeymasterHidlTest::ImportKey(const AuthorizationSet& key_desc, KeyFormat format, 138 const string& key_material) { 139 return ImportKey(key_desc, format, key_material, &key_blob_, &key_characteristics_); 140 } 141 142 ErrorCode KeymasterHidlTest::ImportWrappedKey(string wrapped_key, string wrapping_key, 143 const AuthorizationSet& wrapping_key_desc, 144 string masking_key, 145 const AuthorizationSet& unwrapping_params) { 146 ErrorCode error; 147 ImportKey(wrapping_key_desc, KeyFormat::PKCS8, wrapping_key); 148 EXPECT_TRUE(keymaster_ 149 ->importWrappedKey(HidlBuf(wrapped_key), key_blob_, HidlBuf(masking_key), 150 unwrapping_params.hidl_data(), 0 /* passwordSid */, 151 0 /* biometricSid */, 152 [&](ErrorCode hidl_error, const HidlBuf& hidl_key_blob, 153 const KeyCharacteristics& hidl_key_characteristics) { 154 error = hidl_error; 155 key_blob_ = hidl_key_blob; 156 key_characteristics_ = hidl_key_characteristics; 157 }) 158 .isOk()); 159 return error; 160 } 161 162 ErrorCode KeymasterHidlTest::ExportKey(KeyFormat format, const HidlBuf& key_blob, 163 const HidlBuf& client_id, const HidlBuf& app_data, 164 HidlBuf* key_material) { 165 ErrorCode error; 166 EXPECT_TRUE(keymaster_ 167 ->exportKey(format, key_blob, client_id, app_data, 168 [&](ErrorCode hidl_error_code, const HidlBuf& hidl_key_material) { 169 error = hidl_error_code; 170 *key_material = hidl_key_material; 171 }) 172 .isOk()); 173 // On error, blob should be empty. 174 if (error != ErrorCode::OK) { 175 EXPECT_EQ(0U, key_material->size()); 176 } 177 return error; 178 } 179 180 ErrorCode KeymasterHidlTest::ExportKey(KeyFormat format, HidlBuf* key_material) { 181 HidlBuf client_id, app_data; 182 return ExportKey(format, key_blob_, client_id, app_data, key_material); 183 } 184 185 ErrorCode KeymasterHidlTest::DeleteKey(HidlBuf* key_blob, bool keep_key_blob) { 186 auto rc = keymaster_->deleteKey(*key_blob); 187 if (!keep_key_blob) *key_blob = HidlBuf(); 188 if (!rc.isOk()) return ErrorCode::UNKNOWN_ERROR; 189 return rc; 190 } 191 192 ErrorCode KeymasterHidlTest::DeleteKey(bool keep_key_blob) { 193 return DeleteKey(&key_blob_, keep_key_blob); 194 } 195 196 ErrorCode KeymasterHidlTest::DeleteAllKeys() { 197 ErrorCode error = keymaster_->deleteAllKeys(); 198 return error; 199 } 200 201 void KeymasterHidlTest::CheckedDeleteKey(HidlBuf* key_blob, bool keep_key_blob) { 202 auto rc = DeleteKey(key_blob, keep_key_blob); 203 EXPECT_TRUE(rc == ErrorCode::OK || rc == ErrorCode::UNIMPLEMENTED); 204 } 205 206 void KeymasterHidlTest::CheckedDeleteKey() { 207 CheckedDeleteKey(&key_blob_); 208 } 209 210 void KeymasterHidlTest::CheckCreationDateTime( 211 const AuthorizationSet& sw_enforced, 212 std::chrono::time_point<std::chrono::system_clock> creation) { 213 for (int i = 0; i < sw_enforced.size(); i++) { 214 if (sw_enforced[i].tag == TAG_CREATION_DATETIME) { 215 std::chrono::time_point<std::chrono::system_clock> now = 216 std::chrono::system_clock::now(); 217 std::chrono::time_point<std::chrono::system_clock> reported_time{ 218 std::chrono::milliseconds(sw_enforced[i].f.dateTime)}; 219 // The test is flaky for EC keys, so a buffer time of 120 seconds will be added. 220 EXPECT_LE(creation - 120s, reported_time); 221 EXPECT_LE(reported_time, now + 1s); 222 } 223 } 224 } 225 226 void KeymasterHidlTest::CheckGetCharacteristics(const HidlBuf& key_blob, const HidlBuf& client_id, 227 const HidlBuf& app_data, 228 KeyCharacteristics* key_characteristics) { 229 HidlBuf empty_buf = {}; 230 EXPECT_EQ(ErrorCode::OK, 231 GetCharacteristics(key_blob, client_id, app_data, key_characteristics)); 232 EXPECT_GT(key_characteristics->hardwareEnforced.size(), 0); 233 EXPECT_GT(key_characteristics->softwareEnforced.size(), 0); 234 235 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB, 236 GetCharacteristics(key_blob, empty_buf, app_data, key_characteristics)); 237 EXPECT_EQ(key_characteristics->hardwareEnforced.size(), 0); 238 EXPECT_EQ(key_characteristics->softwareEnforced.size(), 0); 239 240 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB, 241 GetCharacteristics(key_blob, client_id, empty_buf, key_characteristics)); 242 EXPECT_EQ(key_characteristics->hardwareEnforced.size(), 0); 243 EXPECT_EQ(key_characteristics->softwareEnforced.size(), 0); 244 245 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB, 246 GetCharacteristics(key_blob, empty_buf, empty_buf, key_characteristics)); 247 EXPECT_EQ(key_characteristics->hardwareEnforced.size(), 0); 248 EXPECT_EQ(key_characteristics->softwareEnforced.size(), 0); 249 } 250 251 ErrorCode KeymasterHidlTest::GetCharacteristics(const HidlBuf& key_blob, const HidlBuf& client_id, 252 const HidlBuf& app_data, 253 KeyCharacteristics* key_characteristics) { 254 ErrorCode error = ErrorCode::UNKNOWN_ERROR; 255 EXPECT_TRUE( 256 keymaster_ 257 ->getKeyCharacteristics( 258 key_blob, client_id, app_data, 259 [&](ErrorCode hidl_error, const KeyCharacteristics& hidl_key_characteristics) { 260 error = hidl_error, *key_characteristics = hidl_key_characteristics; 261 }) 262 .isOk()); 263 return error; 264 } 265 266 ErrorCode KeymasterHidlTest::GetCharacteristics(const HidlBuf& key_blob, 267 KeyCharacteristics* key_characteristics) { 268 HidlBuf client_id, app_data; 269 return GetCharacteristics(key_blob, client_id, app_data, key_characteristics); 270 } 271 272 ErrorCode KeymasterHidlTest::Begin(KeyPurpose purpose, const HidlBuf& key_blob, 273 const AuthorizationSet& in_params, AuthorizationSet* out_params, 274 OperationHandle* op_handle) { 275 SCOPED_TRACE("Begin"); 276 ErrorCode error; 277 OperationHandle saved_handle = *op_handle; 278 EXPECT_TRUE(keymaster_ 279 ->begin(purpose, key_blob, in_params.hidl_data(), HardwareAuthToken(), 280 [&](ErrorCode hidl_error, const hidl_vec<KeyParameter>& hidl_out_params, 281 uint64_t hidl_op_handle) { 282 error = hidl_error; 283 *out_params = hidl_out_params; 284 *op_handle = hidl_op_handle; 285 }) 286 .isOk()); 287 if (error != ErrorCode::OK) { 288 // Some implementations may modify *op_handle on error. 289 *op_handle = saved_handle; 290 } 291 return error; 292 } 293 294 ErrorCode KeymasterHidlTest::Begin(KeyPurpose purpose, const AuthorizationSet& in_params, 295 AuthorizationSet* out_params) { 296 SCOPED_TRACE("Begin"); 297 EXPECT_EQ(kOpHandleSentinel, op_handle_); 298 return Begin(purpose, key_blob_, in_params, out_params, &op_handle_); 299 } 300 301 ErrorCode KeymasterHidlTest::Begin(KeyPurpose purpose, const AuthorizationSet& in_params) { 302 SCOPED_TRACE("Begin"); 303 AuthorizationSet out_params; 304 ErrorCode error = Begin(purpose, in_params, &out_params); 305 EXPECT_TRUE(out_params.empty()); 306 return error; 307 } 308 309 ErrorCode KeymasterHidlTest::Update(OperationHandle op_handle, const AuthorizationSet& in_params, 310 const string& input, AuthorizationSet* out_params, 311 string* output, size_t* input_consumed) { 312 SCOPED_TRACE("Update"); 313 ErrorCode error; 314 EXPECT_TRUE(keymaster_ 315 ->update(op_handle, in_params.hidl_data(), HidlBuf(input), HardwareAuthToken(), 316 VerificationToken(), 317 [&](ErrorCode hidl_error, uint32_t hidl_input_consumed, 318 const hidl_vec<KeyParameter>& hidl_out_params, 319 const HidlBuf& hidl_output) { 320 error = hidl_error; 321 out_params->push_back(AuthorizationSet(hidl_out_params)); 322 output->append(hidl_output.to_string()); 323 *input_consumed = hidl_input_consumed; 324 }) 325 .isOk()); 326 return error; 327 } 328 329 ErrorCode KeymasterHidlTest::Update(const string& input, string* out, size_t* input_consumed) { 330 SCOPED_TRACE("Update"); 331 AuthorizationSet out_params; 332 ErrorCode error = Update(op_handle_, AuthorizationSet() /* in_params */, input, &out_params, 333 out, input_consumed); 334 EXPECT_TRUE(out_params.empty()); 335 return error; 336 } 337 338 ErrorCode KeymasterHidlTest::Finish(OperationHandle op_handle, const AuthorizationSet& in_params, 339 const string& input, const string& signature, 340 AuthorizationSet* out_params, string* output) { 341 SCOPED_TRACE("Finish"); 342 ErrorCode error; 343 EXPECT_TRUE( 344 keymaster_ 345 ->finish(op_handle, in_params.hidl_data(), HidlBuf(input), HidlBuf(signature), 346 HardwareAuthToken(), VerificationToken(), 347 [&](ErrorCode hidl_error, const hidl_vec<KeyParameter>& hidl_out_params, 348 const HidlBuf& hidl_output) { 349 error = hidl_error; 350 *out_params = hidl_out_params; 351 output->append(hidl_output.to_string()); 352 }) 353 .isOk()); 354 op_handle_ = kOpHandleSentinel; // So dtor doesn't Abort(). 355 return error; 356 } 357 358 ErrorCode KeymasterHidlTest::Finish(const string& message, string* output) { 359 SCOPED_TRACE("Finish"); 360 AuthorizationSet out_params; 361 string finish_output; 362 ErrorCode error = Finish(op_handle_, AuthorizationSet() /* in_params */, message, 363 "" /* signature */, &out_params, output); 364 if (error != ErrorCode::OK) { 365 return error; 366 } 367 EXPECT_EQ(0U, out_params.size()); 368 return error; 369 } 370 371 ErrorCode KeymasterHidlTest::Finish(const string& message, const string& signature, 372 string* output) { 373 SCOPED_TRACE("Finish"); 374 AuthorizationSet out_params; 375 ErrorCode error = Finish(op_handle_, AuthorizationSet() /* in_params */, message, signature, 376 &out_params, output); 377 op_handle_ = kOpHandleSentinel; // So dtor doesn't Abort(). 378 if (error != ErrorCode::OK) { 379 return error; 380 } 381 EXPECT_EQ(0U, out_params.size()); 382 return error; 383 } 384 385 ErrorCode KeymasterHidlTest::Abort(OperationHandle op_handle) { 386 SCOPED_TRACE("Abort"); 387 auto retval = keymaster_->abort(op_handle); 388 EXPECT_TRUE(retval.isOk()); 389 return retval; 390 } 391 392 void KeymasterHidlTest::AbortIfNeeded() { 393 SCOPED_TRACE("AbortIfNeeded"); 394 if (op_handle_ != kOpHandleSentinel) { 395 EXPECT_EQ(ErrorCode::OK, Abort(op_handle_)); 396 op_handle_ = kOpHandleSentinel; 397 } 398 } 399 400 ErrorCode KeymasterHidlTest::AttestKey(const HidlBuf& key_blob, 401 const AuthorizationSet& attest_params, 402 hidl_vec<hidl_vec<uint8_t>>* cert_chain) { 403 SCOPED_TRACE("AttestKey"); 404 ErrorCode error; 405 auto rc = keymaster_->attestKey( 406 key_blob, attest_params.hidl_data(), 407 [&](ErrorCode hidl_error, const hidl_vec<hidl_vec<uint8_t>>& hidl_cert_chain) { 408 error = hidl_error; 409 *cert_chain = hidl_cert_chain; 410 }); 411 412 EXPECT_TRUE(rc.isOk()) << rc.description(); 413 if (!rc.isOk()) return ErrorCode::UNKNOWN_ERROR; 414 415 return error; 416 } 417 418 ErrorCode KeymasterHidlTest::AttestKey(const AuthorizationSet& attest_params, 419 hidl_vec<hidl_vec<uint8_t>>* cert_chain) { 420 SCOPED_TRACE("AttestKey"); 421 return AttestKey(key_blob_, attest_params, cert_chain); 422 } 423 424 string KeymasterHidlTest::ProcessMessage(const HidlBuf& key_blob, KeyPurpose operation, 425 const string& message, const AuthorizationSet& in_params, 426 AuthorizationSet* out_params) { 427 SCOPED_TRACE("ProcessMessage"); 428 AuthorizationSet begin_out_params; 429 EXPECT_EQ(ErrorCode::OK, Begin(operation, key_blob, in_params, &begin_out_params, &op_handle_)); 430 431 string output; 432 size_t consumed = 0; 433 AuthorizationSet update_params; 434 AuthorizationSet update_out_params; 435 EXPECT_EQ(ErrorCode::OK, 436 Update(op_handle_, update_params, message, &update_out_params, &output, &consumed)); 437 438 string unused; 439 AuthorizationSet finish_params; 440 AuthorizationSet finish_out_params; 441 EXPECT_EQ(ErrorCode::OK, Finish(op_handle_, finish_params, message.substr(consumed), unused, 442 &finish_out_params, &output)); 443 op_handle_ = kOpHandleSentinel; 444 445 out_params->push_back(begin_out_params); 446 out_params->push_back(finish_out_params); 447 return output; 448 } 449 450 string KeymasterHidlTest::SignMessage(const HidlBuf& key_blob, const string& message, 451 const AuthorizationSet& params) { 452 SCOPED_TRACE("SignMessage"); 453 AuthorizationSet out_params; 454 string signature = ProcessMessage(key_blob, KeyPurpose::SIGN, message, params, &out_params); 455 EXPECT_TRUE(out_params.empty()); 456 return signature; 457 } 458 459 string KeymasterHidlTest::SignMessage(const string& message, const AuthorizationSet& params) { 460 SCOPED_TRACE("SignMessage"); 461 return SignMessage(key_blob_, message, params); 462 } 463 464 string KeymasterHidlTest::MacMessage(const string& message, Digest digest, size_t mac_length) { 465 SCOPED_TRACE("MacMessage"); 466 return SignMessage( 467 key_blob_, message, 468 AuthorizationSetBuilder().Digest(digest).Authorization(TAG_MAC_LENGTH, mac_length)); 469 } 470 471 void KeymasterHidlTest::CheckHmacTestVector(const string& key, const string& message, Digest digest, 472 const string& expected_mac) { 473 SCOPED_TRACE("CheckHmacTestVector"); 474 ASSERT_EQ(ErrorCode::OK, 475 ImportKey(AuthorizationSetBuilder() 476 .Authorization(TAG_NO_AUTH_REQUIRED) 477 .HmacKey(key.size() * 8) 478 .Authorization(TAG_MIN_MAC_LENGTH, expected_mac.size() * 8) 479 .Digest(digest), 480 KeyFormat::RAW, key)); 481 string signature = MacMessage(message, digest, expected_mac.size() * 8); 482 EXPECT_EQ(expected_mac, signature) 483 << "Test vector didn't match for key of size " << key.size() << " message of size " 484 << message.size() << " and digest " << digest; 485 CheckedDeleteKey(); 486 } 487 488 void KeymasterHidlTest::CheckAesCtrTestVector(const string& key, const string& nonce, 489 const string& message, 490 const string& expected_ciphertext) { 491 SCOPED_TRACE("CheckAesCtrTestVector"); 492 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder() 493 .Authorization(TAG_NO_AUTH_REQUIRED) 494 .AesEncryptionKey(key.size() * 8) 495 .BlockMode(BlockMode::CTR) 496 .Authorization(TAG_CALLER_NONCE) 497 .Padding(PaddingMode::NONE), 498 KeyFormat::RAW, key)); 499 500 auto params = AuthorizationSetBuilder() 501 .Authorization(TAG_NONCE, nonce.data(), nonce.size()) 502 .BlockMode(BlockMode::CTR) 503 .Padding(PaddingMode::NONE); 504 AuthorizationSet out_params; 505 string ciphertext = EncryptMessage(key_blob_, message, params, &out_params); 506 EXPECT_EQ(expected_ciphertext, ciphertext); 507 } 508 509 void KeymasterHidlTest::CheckTripleDesTestVector(KeyPurpose purpose, BlockMode block_mode, 510 PaddingMode padding_mode, const string& key, 511 const string& iv, const string& input, 512 const string& expected_output) { 513 auto authset = AuthorizationSetBuilder() 514 .TripleDesEncryptionKey(key.size() * 7) 515 .BlockMode(block_mode) 516 .Authorization(TAG_NO_AUTH_REQUIRED) 517 .Padding(padding_mode); 518 if (iv.size()) authset.Authorization(TAG_CALLER_NONCE); 519 ASSERT_EQ(ErrorCode::OK, ImportKey(authset, KeyFormat::RAW, key)); 520 auto begin_params = AuthorizationSetBuilder().BlockMode(block_mode).Padding(padding_mode); 521 if (iv.size()) begin_params.Authorization(TAG_NONCE, iv.data(), iv.size()); 522 AuthorizationSet output_params; 523 string output = ProcessMessage(key_blob_, purpose, input, begin_params, &output_params); 524 EXPECT_EQ(expected_output, output); 525 } 526 527 void KeymasterHidlTest::VerifyMessage(const HidlBuf& key_blob, const string& message, 528 const string& signature, const AuthorizationSet& params) { 529 SCOPED_TRACE("VerifyMessage"); 530 AuthorizationSet begin_out_params; 531 ASSERT_EQ(ErrorCode::OK, 532 Begin(KeyPurpose::VERIFY, key_blob, params, &begin_out_params, &op_handle_)); 533 534 string output; 535 AuthorizationSet update_params; 536 AuthorizationSet update_out_params; 537 size_t consumed; 538 ASSERT_EQ(ErrorCode::OK, 539 Update(op_handle_, update_params, message, &update_out_params, &output, &consumed)); 540 EXPECT_TRUE(output.empty()); 541 EXPECT_GT(consumed, 0U); 542 543 string unused; 544 AuthorizationSet finish_params; 545 AuthorizationSet finish_out_params; 546 EXPECT_EQ(ErrorCode::OK, Finish(op_handle_, finish_params, message.substr(consumed), signature, 547 &finish_out_params, &output)); 548 op_handle_ = kOpHandleSentinel; 549 EXPECT_TRUE(output.empty()); 550 } 551 552 void KeymasterHidlTest::VerifyMessage(const string& message, const string& signature, 553 const AuthorizationSet& params) { 554 SCOPED_TRACE("VerifyMessage"); 555 VerifyMessage(key_blob_, message, signature, params); 556 } 557 558 string KeymasterHidlTest::EncryptMessage(const HidlBuf& key_blob, const string& message, 559 const AuthorizationSet& in_params, 560 AuthorizationSet* out_params) { 561 SCOPED_TRACE("EncryptMessage"); 562 return ProcessMessage(key_blob, KeyPurpose::ENCRYPT, message, in_params, out_params); 563 } 564 565 string KeymasterHidlTest::EncryptMessage(const string& message, const AuthorizationSet& params, 566 AuthorizationSet* out_params) { 567 SCOPED_TRACE("EncryptMessage"); 568 return EncryptMessage(key_blob_, message, params, out_params); 569 } 570 571 string KeymasterHidlTest::EncryptMessage(const string& message, const AuthorizationSet& params) { 572 SCOPED_TRACE("EncryptMessage"); 573 AuthorizationSet out_params; 574 string ciphertext = EncryptMessage(message, params, &out_params); 575 EXPECT_TRUE(out_params.empty()) << "Output params should be empty. Contained: " << out_params; 576 return ciphertext; 577 } 578 579 string KeymasterHidlTest::EncryptMessage(const string& message, BlockMode block_mode, 580 PaddingMode padding) { 581 SCOPED_TRACE("EncryptMessage"); 582 auto params = AuthorizationSetBuilder().BlockMode(block_mode).Padding(padding); 583 AuthorizationSet out_params; 584 string ciphertext = EncryptMessage(message, params, &out_params); 585 EXPECT_TRUE(out_params.empty()) << "Output params should be empty. Contained: " << out_params; 586 return ciphertext; 587 } 588 589 string KeymasterHidlTest::EncryptMessage(const string& message, BlockMode block_mode, 590 PaddingMode padding, HidlBuf* iv_out) { 591 SCOPED_TRACE("EncryptMessage"); 592 auto params = AuthorizationSetBuilder().BlockMode(block_mode).Padding(padding); 593 AuthorizationSet out_params; 594 string ciphertext = EncryptMessage(message, params, &out_params); 595 EXPECT_EQ(1U, out_params.size()); 596 auto ivVal = out_params.GetTagValue(TAG_NONCE); 597 EXPECT_TRUE(ivVal.isOk()); 598 if (ivVal.isOk()) *iv_out = ivVal.value(); 599 return ciphertext; 600 } 601 602 string KeymasterHidlTest::EncryptMessage(const string& message, BlockMode block_mode, 603 PaddingMode padding, const HidlBuf& iv_in) { 604 SCOPED_TRACE("EncryptMessage"); 605 auto params = AuthorizationSetBuilder() 606 .BlockMode(block_mode) 607 .Padding(padding) 608 .Authorization(TAG_NONCE, iv_in); 609 AuthorizationSet out_params; 610 string ciphertext = EncryptMessage(message, params, &out_params); 611 return ciphertext; 612 } 613 614 string KeymasterHidlTest::DecryptMessage(const HidlBuf& key_blob, const string& ciphertext, 615 const AuthorizationSet& params) { 616 SCOPED_TRACE("DecryptMessage"); 617 AuthorizationSet out_params; 618 string plaintext = 619 ProcessMessage(key_blob, KeyPurpose::DECRYPT, ciphertext, params, &out_params); 620 EXPECT_TRUE(out_params.empty()); 621 return plaintext; 622 } 623 624 string KeymasterHidlTest::DecryptMessage(const string& ciphertext, const AuthorizationSet& params) { 625 SCOPED_TRACE("DecryptMessage"); 626 return DecryptMessage(key_blob_, ciphertext, params); 627 } 628 629 string KeymasterHidlTest::DecryptMessage(const string& ciphertext, BlockMode block_mode, 630 PaddingMode padding_mode, const HidlBuf& iv) { 631 SCOPED_TRACE("DecryptMessage"); 632 auto params = AuthorizationSetBuilder() 633 .BlockMode(block_mode) 634 .Padding(padding_mode) 635 .Authorization(TAG_NONCE, iv); 636 return DecryptMessage(key_blob_, ciphertext, params); 637 } 638 639 std::pair<ErrorCode, HidlBuf> KeymasterHidlTest::UpgradeKey(const HidlBuf& key_blob) { 640 std::pair<ErrorCode, HidlBuf> retval; 641 keymaster_->upgradeKey(key_blob, hidl_vec<KeyParameter>(), 642 [&](ErrorCode error, const hidl_vec<uint8_t>& upgraded_blob) { 643 retval = std::tie(error, upgraded_blob); 644 }); 645 return retval; 646 } 647 std::vector<uint32_t> KeymasterHidlTest::ValidKeySizes(Algorithm algorithm) { 648 switch (algorithm) { 649 case Algorithm::RSA: 650 switch (SecLevel()) { 651 case SecurityLevel::TRUSTED_ENVIRONMENT: 652 return {2048, 3072, 4096}; 653 case SecurityLevel::STRONGBOX: 654 return {2048}; 655 default: 656 CHECK(false) << "Invalid security level " << uint32_t(SecLevel()); 657 break; 658 } 659 break; 660 case Algorithm::EC: 661 switch (SecLevel()) { 662 case SecurityLevel::TRUSTED_ENVIRONMENT: 663 return {224, 256, 384, 521}; 664 case SecurityLevel::STRONGBOX: 665 return {256}; 666 default: 667 CHECK(false) << "Invalid security level " << uint32_t(SecLevel()); 668 break; 669 } 670 break; 671 case Algorithm::AES: 672 return {128, 256}; 673 case Algorithm::TRIPLE_DES: 674 return {168}; 675 case Algorithm::HMAC: { 676 std::vector<uint32_t> retval((512 - 64) / 8 + 1); 677 uint32_t size = 64 - 8; 678 std::generate(retval.begin(), retval.end(), [&]() { return (size += 8); }); 679 return retval; 680 } 681 default: 682 CHECK(false) << "Invalid Algorithm: " << algorithm; 683 return {}; 684 } 685 CHECK(false) << "Should be impossible to get here"; 686 return {}; 687 } 688 std::vector<uint32_t> KeymasterHidlTest::InvalidKeySizes(Algorithm algorithm) { 689 if (SecLevel() == SecurityLevel::TRUSTED_ENVIRONMENT) return {}; 690 CHECK(SecLevel() == SecurityLevel::STRONGBOX); 691 switch (algorithm) { 692 case Algorithm::RSA: 693 return {3072, 4096}; 694 case Algorithm::EC: 695 return {224, 384, 521}; 696 case Algorithm::AES: 697 return {192}; 698 default: 699 return {}; 700 } 701 } 702 703 std::vector<EcCurve> KeymasterHidlTest::ValidCurves() { 704 if (securityLevel_ == SecurityLevel::STRONGBOX) { 705 return {EcCurve::P_256}; 706 } else { 707 return {EcCurve::P_224, EcCurve::P_256, EcCurve::P_384, EcCurve::P_521}; 708 } 709 } 710 711 std::vector<EcCurve> KeymasterHidlTest::InvalidCurves() { 712 if (SecLevel() == SecurityLevel::TRUSTED_ENVIRONMENT) return {}; 713 CHECK(SecLevel() == SecurityLevel::STRONGBOX); 714 return {EcCurve::P_224, EcCurve::P_384, EcCurve::P_521}; 715 } 716 717 std::vector<Digest> KeymasterHidlTest::ValidDigests(bool withNone, bool withMD5) { 718 switch (SecLevel()) { 719 case SecurityLevel::TRUSTED_ENVIRONMENT: 720 if (withNone) { 721 if (withMD5) 722 return {Digest::NONE, Digest::MD5, Digest::SHA1, 723 Digest::SHA_2_224, Digest::SHA_2_256, Digest::SHA_2_384, 724 Digest::SHA_2_512}; 725 else 726 return {Digest::NONE, Digest::SHA1, Digest::SHA_2_224, 727 Digest::SHA_2_256, Digest::SHA_2_384, Digest::SHA_2_512}; 728 } else { 729 if (withMD5) 730 return {Digest::MD5, Digest::SHA1, Digest::SHA_2_224, 731 Digest::SHA_2_256, Digest::SHA_2_384, Digest::SHA_2_512}; 732 else 733 return {Digest::SHA1, Digest::SHA_2_224, Digest::SHA_2_256, Digest::SHA_2_384, 734 Digest::SHA_2_512}; 735 } 736 break; 737 case SecurityLevel::STRONGBOX: 738 if (withNone) 739 return {Digest::NONE, Digest::SHA_2_256}; 740 else 741 return {Digest::SHA_2_256}; 742 break; 743 default: 744 CHECK(false) << "Invalid security level " << uint32_t(SecLevel()); 745 break; 746 } 747 CHECK(false) << "Should be impossible to get here"; 748 return {}; 749 } 750 751 std::vector<Digest> KeymasterHidlTest::InvalidDigests() { 752 return {}; 753 } 754 755 } // namespace test 756 } // namespace V4_0 757 } // namespace keymaster 758 } // namespace hardware 759 } // namespace android 760