1 /* 2 * Copyright (C) 2016 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 "keymaster_hidl_hal_test" 18 #include <cutils/log.h> 19 20 #include <iostream> 21 22 #include <openssl/evp.h> 23 #include <openssl/mem.h> 24 #include <openssl/x509.h> 25 26 #include <android/hardware/keymaster/3.0/IKeymasterDevice.h> 27 #include <android/hardware/keymaster/3.0/types.h> 28 29 #include <cutils/properties.h> 30 31 #include <keymaster/keymaster_configuration.h> 32 33 #include "authorization_set.h" 34 #include "key_param_output.h" 35 36 #include <VtsHalHidlTargetTestBase.h> 37 #include <VtsHalHidlTargetTestEnvBase.h> 38 39 #include "attestation_record.h" 40 #include "openssl_utils.h" 41 42 using ::android::sp; 43 using ::std::string; 44 45 static bool arm_deleteAllKeys = false; 46 static bool dump_Attestations = false; 47 48 namespace android { 49 namespace hardware { 50 51 template <typename T> bool operator==(const hidl_vec<T>& a, const hidl_vec<T>& b) { 52 if (a.size() != b.size()) { 53 return false; 54 } 55 for (size_t i = 0; i < a.size(); ++i) { 56 if (a[i] != b[i]) { 57 return false; 58 } 59 } 60 return true; 61 } 62 63 namespace keymaster { 64 namespace V3_0 { 65 66 bool operator==(const KeyParameter& a, const KeyParameter& b) { 67 if (a.tag != b.tag) { 68 return false; 69 } 70 71 switch (a.tag) { 72 73 /* Boolean tags */ 74 case Tag::INVALID: 75 case Tag::CALLER_NONCE: 76 case Tag::INCLUDE_UNIQUE_ID: 77 case Tag::ECIES_SINGLE_HASH_MODE: 78 case Tag::BOOTLOADER_ONLY: 79 case Tag::NO_AUTH_REQUIRED: 80 case Tag::ALLOW_WHILE_ON_BODY: 81 case Tag::EXPORTABLE: 82 case Tag::ALL_APPLICATIONS: 83 case Tag::ROLLBACK_RESISTANT: 84 case Tag::RESET_SINCE_ID_ROTATION: 85 return true; 86 87 /* Integer tags */ 88 case Tag::KEY_SIZE: 89 case Tag::MIN_MAC_LENGTH: 90 case Tag::MIN_SECONDS_BETWEEN_OPS: 91 case Tag::MAX_USES_PER_BOOT: 92 case Tag::ALL_USERS: 93 case Tag::USER_ID: 94 case Tag::OS_VERSION: 95 case Tag::OS_PATCHLEVEL: 96 case Tag::MAC_LENGTH: 97 case Tag::AUTH_TIMEOUT: 98 return a.f.integer == b.f.integer; 99 100 /* Long integer tags */ 101 case Tag::RSA_PUBLIC_EXPONENT: 102 case Tag::USER_SECURE_ID: 103 return a.f.longInteger == b.f.longInteger; 104 105 /* Date-time tags */ 106 case Tag::ACTIVE_DATETIME: 107 case Tag::ORIGINATION_EXPIRE_DATETIME: 108 case Tag::USAGE_EXPIRE_DATETIME: 109 case Tag::CREATION_DATETIME: 110 return a.f.dateTime == b.f.dateTime; 111 112 /* Bytes tags */ 113 case Tag::APPLICATION_ID: 114 case Tag::APPLICATION_DATA: 115 case Tag::ROOT_OF_TRUST: 116 case Tag::UNIQUE_ID: 117 case Tag::ATTESTATION_CHALLENGE: 118 case Tag::ATTESTATION_APPLICATION_ID: 119 case Tag::ATTESTATION_ID_BRAND: 120 case Tag::ATTESTATION_ID_DEVICE: 121 case Tag::ATTESTATION_ID_PRODUCT: 122 case Tag::ATTESTATION_ID_SERIAL: 123 case Tag::ATTESTATION_ID_IMEI: 124 case Tag::ATTESTATION_ID_MEID: 125 case Tag::ATTESTATION_ID_MANUFACTURER: 126 case Tag::ATTESTATION_ID_MODEL: 127 case Tag::ASSOCIATED_DATA: 128 case Tag::NONCE: 129 case Tag::AUTH_TOKEN: 130 return a.blob == b.blob; 131 132 /* Enum tags */ 133 case Tag::PURPOSE: 134 return a.f.purpose == b.f.purpose; 135 case Tag::ALGORITHM: 136 return a.f.algorithm == b.f.algorithm; 137 case Tag::BLOCK_MODE: 138 return a.f.blockMode == b.f.blockMode; 139 case Tag::DIGEST: 140 return a.f.digest == b.f.digest; 141 case Tag::PADDING: 142 return a.f.paddingMode == b.f.paddingMode; 143 case Tag::EC_CURVE: 144 return a.f.ecCurve == b.f.ecCurve; 145 case Tag::BLOB_USAGE_REQUIREMENTS: 146 return a.f.keyBlobUsageRequirements == b.f.keyBlobUsageRequirements; 147 case Tag::USER_AUTH_TYPE: 148 return a.f.integer == b.f.integer; 149 case Tag::ORIGIN: 150 return a.f.origin == b.f.origin; 151 152 /* Unsupported tags */ 153 case Tag::KDF: 154 return false; 155 } 156 } 157 158 bool operator==(const AuthorizationSet& a, const AuthorizationSet& b) { 159 return a.size() == b.size() && std::equal(a.begin(), a.end(), b.begin()); 160 } 161 162 bool operator==(const KeyCharacteristics& a, const KeyCharacteristics& b) { 163 // This isn't very efficient. Oh, well. 164 AuthorizationSet a_sw(a.softwareEnforced); 165 AuthorizationSet b_sw(b.softwareEnforced); 166 AuthorizationSet a_tee(b.teeEnforced); 167 AuthorizationSet b_tee(b.teeEnforced); 168 169 a_sw.Sort(); 170 b_sw.Sort(); 171 a_tee.Sort(); 172 b_tee.Sort(); 173 174 return a_sw == b_sw && a_tee == b_sw; 175 } 176 177 ::std::ostream& operator<<(::std::ostream& os, const AuthorizationSet& set) { 178 if (set.size() == 0) 179 os << "(Empty)" << ::std::endl; 180 else { 181 os << "\n"; 182 for (size_t i = 0; i < set.size(); ++i) 183 os << set[i] << ::std::endl; 184 } 185 return os; 186 } 187 188 namespace test { 189 namespace { 190 191 template <TagType tag_type, Tag tag, typename ValueT> 192 bool contains(hidl_vec<KeyParameter>& set, TypedTag<tag_type, tag> ttag, ValueT expected_value) { 193 size_t count = std::count_if(set.begin(), set.end(), [&](const KeyParameter& param) { 194 return param.tag == tag && accessTagValue(ttag, param) == expected_value; 195 }); 196 return count == 1; 197 } 198 199 template <TagType tag_type, Tag tag> 200 bool contains(hidl_vec<KeyParameter>& set, TypedTag<tag_type, tag>) { 201 size_t count = std::count_if(set.begin(), set.end(), 202 [&](const KeyParameter& param) { return param.tag == tag; }); 203 return count > 0; 204 } 205 206 constexpr char hex_value[256] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 207 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 208 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 209 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, // '0'..'9' 210 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 'A'..'F' 211 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 212 0, 10, 11, 12, 13, 14, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 'a'..'f' 213 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 214 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 215 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 216 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 217 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 218 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 219 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 220 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 221 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 222 223 string hex2str(string a) { 224 string b; 225 size_t num = a.size() / 2; 226 b.resize(num); 227 for (size_t i = 0; i < num; i++) { 228 b[i] = (hex_value[a[i * 2] & 0xFF] << 4) + (hex_value[a[i * 2 + 1] & 0xFF]); 229 } 230 return b; 231 } 232 233 char nibble2hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', 234 '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; 235 236 string bin2hex(const hidl_vec<uint8_t>& data) { 237 string retval; 238 retval.reserve(data.size() * 2 + 1); 239 for (uint8_t byte : data) { 240 retval.push_back(nibble2hex[0x0F & (byte >> 4)]); 241 retval.push_back(nibble2hex[0x0F & byte]); 242 } 243 return retval; 244 } 245 246 string rsa_key = hex2str( 247 "30820275020100300d06092a864886f70d01010105000482025f3082025b" 248 "02010002818100c6095409047d8634812d5a218176e45c41d60a75b13901" 249 "f234226cffe776521c5a77b9e389417b71c0b6a44d13afe4e4a2805d46c9" 250 "da2935adb1ff0c1f24ea06e62b20d776430a4d435157233c6f916783c30e" 251 "310fcbd89b85c2d56771169785ac12bca244abda72bfb19fc44d27c81e1d" 252 "92de284f4061edfd99280745ea6d2502030100010281801be0f04d9cae37" 253 "18691f035338308e91564b55899ffb5084d2460e6630257e05b3ceab0297" 254 "2dfabcd6ce5f6ee2589eb67911ed0fac16e43a444b8c861e544a05933657" 255 "72f8baf6b22fc9e3c5f1024b063ac080a7b2234cf8aee8f6c47bbf4fd3ac" 256 "e7240290bef16c0b3f7f3cdd64ce3ab5912cf6e32f39ab188358afcccd80" 257 "81024100e4b49ef50f765d3b24dde01aceaaf130f2c76670a91a61ae08af" 258 "497b4a82be6dee8fcdd5e3f7ba1cfb1f0c926b88f88c92bfab137fba2285" 259 "227b83c342ff7c55024100ddabb5839c4c7f6bf3d4183231f005b31aa58a" 260 "ffdda5c79e4cce217f6bc930dbe563d480706c24e9ebfcab28a6cdefd324" 261 "b77e1bf7251b709092c24ff501fd91024023d4340eda3445d8cd26c14411" 262 "da6fdca63c1ccd4b80a98ad52b78cc8ad8beb2842c1d280405bc2f6c1bea" 263 "214a1d742ab996b35b63a82a5e470fa88dbf823cdd02401b7b57449ad30d" 264 "1518249a5f56bb98294d4b6ac12ffc86940497a5a5837a6cf946262b4945" 265 "26d328c11e1126380fde04c24f916dec250892db09a6d77cdba351024077" 266 "62cd8f4d050da56bd591adb515d24d7ccd32cca0d05f866d583514bd7324" 267 "d5f33645e8ed8b4a1cb3cc4a1d67987399f2a09f5b3fb68c88d5e5d90ac3" 268 "3492d6"); 269 270 string ec_256_key = hex2str( 271 "308187020100301306072a8648ce3d020106082a8648ce3d030107046d30" 272 "6b0201010420737c2ecd7b8d1940bf2930aa9b4ed3ff941eed09366bc032" 273 "99986481f3a4d859a14403420004bf85d7720d07c25461683bc648b4778a" 274 "9a14dd8a024e3bdd8c7ddd9ab2b528bbc7aa1b51f14ebbbb0bd0ce21bcc4" 275 "1c6eb00083cf3376d11fd44949e0b2183bfe"); 276 277 string ec_521_key = hex2str( 278 "3081EE020100301006072A8648CE3D020106052B810400230481D63081D3" 279 "02010104420011458C586DB5DAA92AFAB03F4FE46AA9D9C3CE9A9B7A006A" 280 "8384BEC4C78E8E9D18D7D08B5BCFA0E53C75B064AD51C449BAE0258D54B9" 281 "4B1E885DED08ED4FB25CE9A1818903818600040149EC11C6DF0FA122C6A9" 282 "AFD9754A4FA9513A627CA329E349535A5629875A8ADFBE27DCB932C05198" 283 "6377108D054C28C6F39B6F2C9AF81802F9F326B842FF2E5F3C00AB7635CF" 284 "B36157FC0882D574A10D839C1A0C049DC5E0D775E2EE50671A208431BB45" 285 "E78E70BEFE930DB34818EE4D5C26259F5C6B8E28A652950F9F88D7B4B2C9" 286 "D9"); 287 288 struct RSA_Delete { 289 void operator()(RSA* p) { RSA_free(p); } 290 }; 291 292 X509* parse_cert_blob(const hidl_vec<uint8_t>& blob) { 293 const uint8_t* p = blob.data(); 294 return d2i_X509(nullptr, &p, blob.size()); 295 } 296 297 bool verify_chain(const hidl_vec<hidl_vec<uint8_t>>& chain) { 298 for (size_t i = 0; i < chain.size() - 1; ++i) { 299 X509_Ptr key_cert(parse_cert_blob(chain[i])); 300 X509_Ptr signing_cert; 301 if (i < chain.size() - 1) { 302 signing_cert.reset(parse_cert_blob(chain[i + 1])); 303 } else { 304 signing_cert.reset(parse_cert_blob(chain[i])); 305 } 306 EXPECT_TRUE(!!key_cert.get() && !!signing_cert.get()); 307 if (!key_cert.get() || !signing_cert.get()) return false; 308 309 EVP_PKEY_Ptr signing_pubkey(X509_get_pubkey(signing_cert.get())); 310 EXPECT_TRUE(!!signing_pubkey.get()); 311 if (!signing_pubkey.get()) return false; 312 313 EXPECT_EQ(1, X509_verify(key_cert.get(), signing_pubkey.get())) 314 << "Verification of certificate " << i << " failed"; 315 316 char* cert_issuer = // 317 X509_NAME_oneline(X509_get_issuer_name(key_cert.get()), nullptr, 0); 318 char* signer_subj = 319 X509_NAME_oneline(X509_get_subject_name(signing_cert.get()), nullptr, 0); 320 EXPECT_STREQ(cert_issuer, signer_subj) << "Cert " << i 321 << " has wrong issuer. (Possibly b/38394614)"; 322 if (i == 0) { 323 char* cert_sub = X509_NAME_oneline(X509_get_subject_name(key_cert.get()), nullptr, 0); 324 EXPECT_STREQ("/CN=Android Keystore Key", cert_sub) 325 << "Cert " << i << " has wrong subject. (Possibly b/38394614)"; 326 OPENSSL_free(cert_sub); 327 } 328 329 OPENSSL_free(cert_issuer); 330 OPENSSL_free(signer_subj); 331 332 if (dump_Attestations) std::cout << bin2hex(chain[i]) << std::endl; 333 } 334 335 return true; 336 } 337 338 // Extract attestation record from cert. Returned object is still part of cert; don't free it 339 // separately. 340 ASN1_OCTET_STRING* get_attestation_record(X509* certificate) { 341 ASN1_OBJECT_Ptr oid(OBJ_txt2obj(kAttestionRecordOid, 1 /* dotted string format */)); 342 EXPECT_TRUE(!!oid.get()); 343 if (!oid.get()) return nullptr; 344 345 int location = X509_get_ext_by_OBJ(certificate, oid.get(), -1 /* search from beginning */); 346 EXPECT_NE(-1, location); 347 if (location == -1) return nullptr; 348 349 X509_EXTENSION* attest_rec_ext = X509_get_ext(certificate, location); 350 EXPECT_TRUE(!!attest_rec_ext); 351 if (!attest_rec_ext) return nullptr; 352 353 ASN1_OCTET_STRING* attest_rec = X509_EXTENSION_get_data(attest_rec_ext); 354 EXPECT_TRUE(!!attest_rec); 355 return attest_rec; 356 } 357 358 bool tag_in_list(const KeyParameter& entry) { 359 // Attestations don't contain everything in key authorization lists, so we need to filter 360 // the key lists to produce the lists that we expect to match the attestations. 361 auto tag_list = { 362 Tag::USER_ID, Tag::INCLUDE_UNIQUE_ID, Tag::BLOB_USAGE_REQUIREMENTS, 363 Tag::EC_CURVE /* Tag::EC_CURVE will be included by KM2 implementations */, 364 }; 365 return std::find(tag_list.begin(), tag_list.end(), entry.tag) != tag_list.end(); 366 } 367 368 AuthorizationSet filter_tags(const AuthorizationSet& set) { 369 AuthorizationSet filtered; 370 std::remove_copy_if(set.begin(), set.end(), std::back_inserter(filtered), tag_in_list); 371 return filtered; 372 } 373 374 std::string make_string(const uint8_t* data, size_t length) { 375 return std::string(reinterpret_cast<const char*>(data), length); 376 } 377 378 template <size_t N> std::string make_string(const uint8_t (&a)[N]) { 379 return make_string(a, N); 380 } 381 382 class HidlBuf : public hidl_vec<uint8_t> { 383 typedef hidl_vec<uint8_t> super; 384 385 public: 386 HidlBuf() {} 387 HidlBuf(const super& other) : super(other) {} 388 HidlBuf(super&& other) : super(std::move(other)) {} 389 explicit HidlBuf(const std::string& other) : HidlBuf() { *this = other; } 390 391 HidlBuf& operator=(const super& other) { 392 super::operator=(other); 393 return *this; 394 } 395 396 HidlBuf& operator=(super&& other) { 397 super::operator=(std::move(other)); 398 return *this; 399 } 400 401 HidlBuf& operator=(const string& other) { 402 resize(other.size()); 403 for (size_t i = 0; i < other.size(); ++i) { 404 (*this)[i] = static_cast<uint8_t>(other[i]); 405 } 406 return *this; 407 } 408 409 string to_string() const { return string(reinterpret_cast<const char*>(data()), size()); } 410 }; 411 412 constexpr uint64_t kOpHandleSentinel = 0xFFFFFFFFFFFFFFFF; 413 414 } // namespace 415 416 // Test environment for Keymaster HIDL HAL. 417 class KeymasterHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { 418 public: 419 // get the test environment singleton 420 static KeymasterHidlEnvironment* Instance() { 421 static KeymasterHidlEnvironment* instance = new KeymasterHidlEnvironment; 422 return instance; 423 } 424 425 virtual void registerTestServices() override { registerTestService<IKeymasterDevice>(); } 426 private: 427 KeymasterHidlEnvironment() {} 428 }; 429 430 class KeymasterHidlTest : public ::testing::VtsHalHidlTargetTestBase { 431 public: 432 void TearDown() override { 433 if (key_blob_.size()) { 434 CheckedDeleteKey(); 435 } 436 AbortIfNeeded(); 437 } 438 439 // SetUpTestCase runs only once per test case, not once per test. 440 static void SetUpTestCase() { 441 keymaster_ = ::testing::VtsHalHidlTargetTestBase::getService<IKeymasterDevice>( 442 KeymasterHidlEnvironment::Instance()->getServiceName<IKeymasterDevice>()); 443 ASSERT_NE(keymaster_, nullptr); 444 445 ASSERT_TRUE( 446 keymaster_ 447 ->getHardwareFeatures([&](bool isSecure, bool supportsEc, bool supportsSymmetric, 448 bool supportsAttestation, bool supportsAllDigests, 449 const hidl_string& name, const hidl_string& author) { 450 is_secure_ = isSecure; 451 supports_ec_ = supportsEc; 452 supports_symmetric_ = supportsSymmetric; 453 supports_attestation_ = supportsAttestation; 454 supports_all_digests_ = supportsAllDigests; 455 name_ = name; 456 author_ = author; 457 }) 458 .isOk()); 459 460 os_version_ = ::keymaster::GetOsVersion(); 461 os_patch_level_ = ::keymaster::GetOsPatchlevel(); 462 } 463 464 static void TearDownTestCase() { keymaster_.clear(); } 465 466 static IKeymasterDevice& keymaster() { return *keymaster_; } 467 static uint32_t os_version() { return os_version_; } 468 static uint32_t os_patch_level() { return os_patch_level_; } 469 470 AuthorizationSet UserAuths() { return AuthorizationSetBuilder().Authorization(TAG_USER_ID, 7); } 471 472 ErrorCode GenerateKey(const AuthorizationSet& key_desc, HidlBuf* key_blob, 473 KeyCharacteristics* key_characteristics) { 474 EXPECT_NE(key_blob, nullptr); 475 EXPECT_NE(key_characteristics, nullptr); 476 EXPECT_EQ(0U, key_blob->size()); 477 478 ErrorCode error; 479 EXPECT_TRUE(keymaster_ 480 ->generateKey(key_desc.hidl_data(), 481 [&](ErrorCode hidl_error, const HidlBuf& hidl_key_blob, 482 const KeyCharacteristics& hidl_key_characteristics) { 483 error = hidl_error; 484 *key_blob = hidl_key_blob; 485 *key_characteristics = hidl_key_characteristics; 486 }) 487 .isOk()); 488 // On error, blob & characteristics should be empty. 489 if (error != ErrorCode::OK) { 490 EXPECT_EQ(0U, key_blob->size()); 491 EXPECT_EQ(0U, (key_characteristics->softwareEnforced.size() + 492 key_characteristics->teeEnforced.size())); 493 } 494 return error; 495 } 496 497 ErrorCode GenerateKey(const AuthorizationSet& key_desc) { 498 return GenerateKey(key_desc, &key_blob_, &key_characteristics_); 499 } 500 501 ErrorCode ImportKey(const AuthorizationSet& key_desc, KeyFormat format, 502 const string& key_material, HidlBuf* key_blob, 503 KeyCharacteristics* key_characteristics) { 504 ErrorCode error; 505 EXPECT_TRUE(keymaster_ 506 ->importKey(key_desc.hidl_data(), format, HidlBuf(key_material), 507 [&](ErrorCode hidl_error, const HidlBuf& hidl_key_blob, 508 const KeyCharacteristics& hidl_key_characteristics) { 509 error = hidl_error; 510 *key_blob = hidl_key_blob; 511 *key_characteristics = hidl_key_characteristics; 512 }) 513 .isOk()); 514 // On error, blob & characteristics should be empty. 515 if (error != ErrorCode::OK) { 516 EXPECT_EQ(0U, key_blob->size()); 517 EXPECT_EQ(0U, (key_characteristics->softwareEnforced.size() + 518 key_characteristics->teeEnforced.size())); 519 } 520 return error; 521 } 522 523 ErrorCode ImportKey(const AuthorizationSet& key_desc, KeyFormat format, 524 const string& key_material) { 525 return ImportKey(key_desc, format, key_material, &key_blob_, &key_characteristics_); 526 } 527 528 ErrorCode ExportKey(KeyFormat format, const HidlBuf& key_blob, const HidlBuf& client_id, 529 const HidlBuf& app_data, HidlBuf* key_material) { 530 ErrorCode error; 531 EXPECT_TRUE( 532 keymaster_ 533 ->exportKey(format, key_blob, client_id, app_data, 534 [&](ErrorCode hidl_error_code, const HidlBuf& hidl_key_material) { 535 error = hidl_error_code; 536 *key_material = hidl_key_material; 537 }) 538 .isOk()); 539 // On error, blob should be empty. 540 if (error != ErrorCode::OK) { 541 EXPECT_EQ(0U, key_material->size()); 542 } 543 return error; 544 } 545 546 ErrorCode ExportKey(KeyFormat format, HidlBuf* key_material) { 547 HidlBuf client_id, app_data; 548 return ExportKey(format, key_blob_, client_id, app_data, key_material); 549 } 550 551 ErrorCode DeleteKey(HidlBuf* key_blob, bool keep_key_blob = false) { 552 auto rc = keymaster_->deleteKey(*key_blob); 553 if (!keep_key_blob) *key_blob = HidlBuf(); 554 if (!rc.isOk()) return ErrorCode::UNKNOWN_ERROR; 555 return rc; 556 } 557 558 ErrorCode DeleteKey(bool keep_key_blob = false) { 559 return DeleteKey(&key_blob_, keep_key_blob); 560 } 561 562 ErrorCode DeleteAllKeys() { 563 ErrorCode error = keymaster_->deleteAllKeys(); 564 return error; 565 } 566 567 void CheckedDeleteKey(HidlBuf* key_blob, bool keep_key_blob = false) { 568 auto rc = DeleteKey(key_blob, keep_key_blob); 569 EXPECT_TRUE(rc == ErrorCode::OK || rc == ErrorCode::UNIMPLEMENTED); 570 } 571 572 void CheckedDeleteKey() { CheckedDeleteKey(&key_blob_); } 573 574 ErrorCode GetCharacteristics(const HidlBuf& key_blob, const HidlBuf& client_id, 575 const HidlBuf& app_data, KeyCharacteristics* key_characteristics) { 576 ErrorCode error = ErrorCode::UNKNOWN_ERROR; 577 EXPECT_TRUE( 578 keymaster_ 579 ->getKeyCharacteristics( 580 key_blob, client_id, app_data, 581 [&](ErrorCode hidl_error, const KeyCharacteristics& hidl_key_characteristics) { 582 error = hidl_error, *key_characteristics = hidl_key_characteristics; 583 }) 584 .isOk()); 585 return error; 586 } 587 588 ErrorCode GetCharacteristics(const HidlBuf& key_blob, KeyCharacteristics* key_characteristics) { 589 HidlBuf client_id, app_data; 590 return GetCharacteristics(key_blob, client_id, app_data, key_characteristics); 591 } 592 593 ErrorCode Begin(KeyPurpose purpose, const HidlBuf& key_blob, const AuthorizationSet& in_params, 594 AuthorizationSet* out_params, OperationHandle* op_handle) { 595 SCOPED_TRACE("Begin"); 596 ErrorCode error; 597 OperationHandle saved_handle = *op_handle; 598 EXPECT_TRUE( 599 keymaster_ 600 ->begin(purpose, key_blob, in_params.hidl_data(), 601 [&](ErrorCode hidl_error, const hidl_vec<KeyParameter>& hidl_out_params, 602 uint64_t hidl_op_handle) { 603 error = hidl_error; 604 *out_params = hidl_out_params; 605 *op_handle = hidl_op_handle; 606 }) 607 .isOk()); 608 if (error != ErrorCode::OK) { 609 // Some implementations may modify *op_handle on error. 610 *op_handle = saved_handle; 611 } 612 return error; 613 } 614 615 ErrorCode Begin(KeyPurpose purpose, const AuthorizationSet& in_params, 616 AuthorizationSet* out_params) { 617 SCOPED_TRACE("Begin"); 618 EXPECT_EQ(kOpHandleSentinel, op_handle_); 619 return Begin(purpose, key_blob_, in_params, out_params, &op_handle_); 620 } 621 622 ErrorCode Begin(KeyPurpose purpose, const AuthorizationSet& in_params) { 623 SCOPED_TRACE("Begin"); 624 AuthorizationSet out_params; 625 ErrorCode error = Begin(purpose, in_params, &out_params); 626 EXPECT_TRUE(out_params.empty()); 627 return error; 628 } 629 630 ErrorCode Update(OperationHandle op_handle, const AuthorizationSet& in_params, 631 const string& input, AuthorizationSet* out_params, string* output, 632 size_t* input_consumed) { 633 SCOPED_TRACE("Update"); 634 ErrorCode error; 635 EXPECT_TRUE(keymaster_ 636 ->update(op_handle, in_params.hidl_data(), HidlBuf(input), 637 [&](ErrorCode hidl_error, uint32_t hidl_input_consumed, 638 const hidl_vec<KeyParameter>& hidl_out_params, 639 const HidlBuf& hidl_output) { 640 error = hidl_error; 641 out_params->push_back(AuthorizationSet(hidl_out_params)); 642 output->append(hidl_output.to_string()); 643 *input_consumed = hidl_input_consumed; 644 }) 645 .isOk()); 646 return error; 647 } 648 649 ErrorCode Update(const string& input, string* out, size_t* input_consumed) { 650 SCOPED_TRACE("Update"); 651 AuthorizationSet out_params; 652 ErrorCode error = Update(op_handle_, AuthorizationSet() /* in_params */, input, &out_params, 653 out, input_consumed); 654 EXPECT_TRUE(out_params.empty()); 655 return error; 656 } 657 658 ErrorCode Finish(OperationHandle op_handle, const AuthorizationSet& in_params, 659 const string& input, const string& signature, AuthorizationSet* out_params, 660 string* output) { 661 SCOPED_TRACE("Finish"); 662 ErrorCode error; 663 EXPECT_TRUE( 664 keymaster_ 665 ->finish(op_handle, in_params.hidl_data(), HidlBuf(input), HidlBuf(signature), 666 [&](ErrorCode hidl_error, const hidl_vec<KeyParameter>& hidl_out_params, 667 const HidlBuf& hidl_output) { 668 error = hidl_error; 669 *out_params = hidl_out_params; 670 output->append(hidl_output.to_string()); 671 }) 672 .isOk()); 673 op_handle_ = kOpHandleSentinel; // So dtor doesn't Abort(). 674 return error; 675 } 676 677 ErrorCode Finish(const string& message, string* output) { 678 SCOPED_TRACE("Finish"); 679 AuthorizationSet out_params; 680 string finish_output; 681 ErrorCode error = Finish(op_handle_, AuthorizationSet() /* in_params */, message, 682 "" /* signature */, &out_params, output); 683 if (error != ErrorCode::OK) { 684 return error; 685 } 686 EXPECT_EQ(0U, out_params.size()); 687 return error; 688 } 689 690 ErrorCode Finish(const string& message, const string& signature, string* output) { 691 SCOPED_TRACE("Finish"); 692 AuthorizationSet out_params; 693 ErrorCode error = Finish(op_handle_, AuthorizationSet() /* in_params */, message, signature, 694 &out_params, output); 695 op_handle_ = kOpHandleSentinel; // So dtor doesn't Abort(). 696 if (error != ErrorCode::OK) { 697 return error; 698 } 699 EXPECT_EQ(0U, out_params.size()); 700 return error; 701 } 702 703 ErrorCode Abort(OperationHandle op_handle) { 704 SCOPED_TRACE("Abort"); 705 auto retval = keymaster_->abort(op_handle); 706 EXPECT_TRUE(retval.isOk()); 707 return retval; 708 } 709 710 void AbortIfNeeded() { 711 SCOPED_TRACE("AbortIfNeeded"); 712 if (op_handle_ != kOpHandleSentinel) { 713 EXPECT_EQ(ErrorCode::OK, Abort(op_handle_)); 714 op_handle_ = kOpHandleSentinel; 715 } 716 } 717 718 ErrorCode AttestKey(const HidlBuf& key_blob, const AuthorizationSet& attest_params, 719 hidl_vec<hidl_vec<uint8_t>>* cert_chain) { 720 SCOPED_TRACE("AttestKey"); 721 ErrorCode error; 722 auto rc = keymaster_->attestKey( 723 key_blob, attest_params.hidl_data(), 724 [&](ErrorCode hidl_error, const hidl_vec<hidl_vec<uint8_t>>& hidl_cert_chain) { 725 error = hidl_error; 726 *cert_chain = hidl_cert_chain; 727 }); 728 729 EXPECT_TRUE(rc.isOk()) << rc.description(); 730 if (!rc.isOk()) return ErrorCode::UNKNOWN_ERROR; 731 732 return error; 733 } 734 735 ErrorCode AttestKey(const AuthorizationSet& attest_params, 736 hidl_vec<hidl_vec<uint8_t>>* cert_chain) { 737 SCOPED_TRACE("AttestKey"); 738 return AttestKey(key_blob_, attest_params, cert_chain); 739 } 740 741 string ProcessMessage(const HidlBuf& key_blob, KeyPurpose operation, const string& message, 742 const AuthorizationSet& in_params, AuthorizationSet* out_params) { 743 SCOPED_TRACE("ProcessMessage"); 744 AuthorizationSet begin_out_params; 745 EXPECT_EQ(ErrorCode::OK, 746 Begin(operation, key_blob, in_params, &begin_out_params, &op_handle_)); 747 748 string unused; 749 AuthorizationSet finish_params; 750 AuthorizationSet finish_out_params; 751 string output; 752 EXPECT_EQ(ErrorCode::OK, 753 Finish(op_handle_, finish_params, message, unused, &finish_out_params, &output)); 754 op_handle_ = kOpHandleSentinel; 755 756 out_params->push_back(begin_out_params); 757 out_params->push_back(finish_out_params); 758 return output; 759 } 760 761 string SignMessage(const HidlBuf& key_blob, const string& message, 762 const AuthorizationSet& params) { 763 SCOPED_TRACE("SignMessage"); 764 AuthorizationSet out_params; 765 string signature = ProcessMessage(key_blob, KeyPurpose::SIGN, message, params, &out_params); 766 EXPECT_TRUE(out_params.empty()); 767 return signature; 768 } 769 770 string SignMessage(const string& message, const AuthorizationSet& params) { 771 SCOPED_TRACE("SignMessage"); 772 return SignMessage(key_blob_, message, params); 773 } 774 775 string MacMessage(const string& message, Digest digest, size_t mac_length) { 776 SCOPED_TRACE("MacMessage"); 777 return SignMessage( 778 key_blob_, message, 779 AuthorizationSetBuilder().Digest(digest).Authorization(TAG_MAC_LENGTH, mac_length)); 780 } 781 782 void CheckHmacTestVector(const string& key, const string& message, Digest digest, 783 const string& expected_mac) { 784 SCOPED_TRACE("CheckHmacTestVector"); 785 ASSERT_EQ(ErrorCode::OK, 786 ImportKey(AuthorizationSetBuilder() 787 .Authorization(TAG_NO_AUTH_REQUIRED) 788 .HmacKey(key.size() * 8) 789 .Authorization(TAG_MIN_MAC_LENGTH, expected_mac.size() * 8) 790 .Digest(digest), 791 KeyFormat::RAW, key)); 792 string signature = MacMessage(message, digest, expected_mac.size() * 8); 793 EXPECT_EQ(expected_mac, signature) << "Test vector didn't match for digest " << (int)digest; 794 CheckedDeleteKey(); 795 } 796 797 void CheckAesCtrTestVector(const string& key, const string& nonce, const string& message, 798 const string& expected_ciphertext) { 799 SCOPED_TRACE("CheckAesCtrTestVector"); 800 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder() 801 .Authorization(TAG_NO_AUTH_REQUIRED) 802 .AesEncryptionKey(key.size() * 8) 803 .BlockMode(BlockMode::CTR) 804 .Authorization(TAG_CALLER_NONCE) 805 .Padding(PaddingMode::NONE), 806 KeyFormat::RAW, key)); 807 808 auto params = AuthorizationSetBuilder() 809 .Authorization(TAG_NONCE, nonce.data(), nonce.size()) 810 .BlockMode(BlockMode::CTR) 811 .Padding(PaddingMode::NONE); 812 AuthorizationSet out_params; 813 string ciphertext = EncryptMessage(key_blob_, message, params, &out_params); 814 EXPECT_EQ(expected_ciphertext, ciphertext); 815 } 816 817 void VerifyMessage(const HidlBuf& key_blob, const string& message, const string& signature, 818 const AuthorizationSet& params) { 819 SCOPED_TRACE("VerifyMessage"); 820 AuthorizationSet begin_out_params; 821 ASSERT_EQ(ErrorCode::OK, 822 Begin(KeyPurpose::VERIFY, key_blob, params, &begin_out_params, &op_handle_)); 823 824 string unused; 825 AuthorizationSet finish_params; 826 AuthorizationSet finish_out_params; 827 string output; 828 EXPECT_EQ(ErrorCode::OK, Finish(op_handle_, finish_params, message, signature, 829 &finish_out_params, &output)); 830 op_handle_ = kOpHandleSentinel; 831 EXPECT_TRUE(output.empty()); 832 } 833 834 void VerifyMessage(const string& message, const string& signature, 835 const AuthorizationSet& params) { 836 SCOPED_TRACE("VerifyMessage"); 837 VerifyMessage(key_blob_, message, signature, params); 838 } 839 840 string EncryptMessage(const HidlBuf& key_blob, const string& message, 841 const AuthorizationSet& in_params, AuthorizationSet* out_params) { 842 SCOPED_TRACE("EncryptMessage"); 843 return ProcessMessage(key_blob, KeyPurpose::ENCRYPT, message, in_params, out_params); 844 } 845 846 string EncryptMessage(const string& message, const AuthorizationSet& params, 847 AuthorizationSet* out_params) { 848 SCOPED_TRACE("EncryptMessage"); 849 return EncryptMessage(key_blob_, message, params, out_params); 850 } 851 852 string EncryptMessage(const string& message, const AuthorizationSet& params) { 853 SCOPED_TRACE("EncryptMessage"); 854 AuthorizationSet out_params; 855 string ciphertext = EncryptMessage(message, params, &out_params); 856 EXPECT_TRUE(out_params.empty()) 857 << "Output params should be empty. Contained: " << out_params; 858 return ciphertext; 859 } 860 861 string DecryptMessage(const HidlBuf& key_blob, const string& ciphertext, 862 const AuthorizationSet& params) { 863 SCOPED_TRACE("DecryptMessage"); 864 AuthorizationSet out_params; 865 string plaintext = 866 ProcessMessage(key_blob, KeyPurpose::DECRYPT, ciphertext, params, &out_params); 867 EXPECT_TRUE(out_params.empty()); 868 return plaintext; 869 } 870 871 string DecryptMessage(const string& ciphertext, const AuthorizationSet& params) { 872 SCOPED_TRACE("DecryptMessage"); 873 return DecryptMessage(key_blob_, ciphertext, params); 874 } 875 876 template <TagType tag_type, Tag tag, typename ValueT> 877 void CheckKm0CryptoParam(TypedTag<tag_type, tag> ttag, ValueT expected) { 878 SCOPED_TRACE("CheckKm0CryptoParam"); 879 if (is_secure_) { 880 EXPECT_TRUE(contains(key_characteristics_.teeEnforced, ttag, expected)); 881 EXPECT_FALSE(contains(key_characteristics_.softwareEnforced, ttag)); 882 } else { 883 EXPECT_TRUE(contains(key_characteristics_.softwareEnforced, ttag, expected)); 884 EXPECT_FALSE(contains(key_characteristics_.teeEnforced, ttag)); 885 } 886 } 887 888 template <TagType tag_type, Tag tag, typename ValueT> 889 void CheckKm1CryptoParam(TypedTag<tag_type, tag> ttag, ValueT expected) { 890 SCOPED_TRACE("CheckKm1CryptoParam"); 891 if (is_secure_ && supports_symmetric_) { 892 EXPECT_TRUE(contains(key_characteristics_.teeEnforced, ttag, expected)); 893 EXPECT_FALSE(contains(key_characteristics_.softwareEnforced, ttag)); 894 } else { 895 EXPECT_TRUE(contains(key_characteristics_.softwareEnforced, ttag, expected)); 896 EXPECT_FALSE(contains(key_characteristics_.teeEnforced, ttag)); 897 } 898 } 899 900 template <TagType tag_type, Tag tag, typename ValueT> 901 void CheckKm2CryptoParam(TypedTag<tag_type, tag> ttag, ValueT expected) { 902 SCOPED_TRACE("CheckKm2CryptoParam"); 903 if (supports_attestation_) { 904 EXPECT_TRUE(contains(key_characteristics_.teeEnforced, ttag, expected)); 905 EXPECT_FALSE(contains(key_characteristics_.softwareEnforced, ttag)); 906 } else if (!supports_symmetric_ /* KM version < 1 or SW */) { 907 EXPECT_TRUE(contains(key_characteristics_.softwareEnforced, ttag, expected)); 908 EXPECT_FALSE(contains(key_characteristics_.teeEnforced, ttag)); 909 } 910 } 911 912 void CheckOrigin(bool asymmetric = false) { 913 SCOPED_TRACE("CheckOrigin"); 914 if (is_secure_ && supports_symmetric_) { 915 EXPECT_TRUE( 916 contains(key_characteristics_.teeEnforced, TAG_ORIGIN, KeyOrigin::IMPORTED)); 917 } else if (is_secure_) { 918 // wrapped KM0 919 if (asymmetric) { 920 EXPECT_TRUE( 921 contains(key_characteristics_.teeEnforced, TAG_ORIGIN, KeyOrigin::UNKNOWN)); 922 } else { 923 EXPECT_TRUE(contains(key_characteristics_.softwareEnforced, TAG_ORIGIN, 924 KeyOrigin::IMPORTED)); 925 } 926 } else { 927 EXPECT_TRUE( 928 contains(key_characteristics_.softwareEnforced, TAG_ORIGIN, KeyOrigin::IMPORTED)); 929 } 930 } 931 932 static bool IsSecure() { return is_secure_; } 933 static bool SupportsEc() { return supports_ec_; } 934 static bool SupportsSymmetric() { return supports_symmetric_; } 935 static bool SupportsAllDigests() { return supports_all_digests_; } 936 static bool SupportsAttestation() { return supports_attestation_; } 937 938 static bool Km2Profile() { 939 return SupportsAttestation() && SupportsAllDigests() && SupportsSymmetric() && 940 SupportsEc() && IsSecure(); 941 } 942 943 static bool Km1Profile() { 944 return !SupportsAttestation() && SupportsSymmetric() && SupportsEc() && IsSecure(); 945 } 946 947 static bool Km0Profile() { 948 return !SupportsAttestation() && !SupportsAllDigests() && !SupportsSymmetric() && 949 IsSecure(); 950 } 951 952 static bool SwOnlyProfile() { 953 return !SupportsAttestation() && !SupportsAllDigests() && !SupportsSymmetric() && 954 !SupportsEc() && !IsSecure(); 955 } 956 957 HidlBuf key_blob_; 958 KeyCharacteristics key_characteristics_; 959 OperationHandle op_handle_ = kOpHandleSentinel; 960 961 private: 962 static sp<IKeymasterDevice> keymaster_; 963 static uint32_t os_version_; 964 static uint32_t os_patch_level_; 965 966 static bool is_secure_; 967 static bool supports_ec_; 968 static bool supports_symmetric_; 969 static bool supports_attestation_; 970 static bool supports_all_digests_; 971 static hidl_string name_; 972 static hidl_string author_; 973 }; 974 975 bool verify_attestation_record(const string& challenge, const string& app_id, 976 AuthorizationSet expected_sw_enforced, 977 AuthorizationSet expected_tee_enforced, 978 const hidl_vec<uint8_t>& attestation_cert) { 979 X509_Ptr cert(parse_cert_blob(attestation_cert)); 980 EXPECT_TRUE(!!cert.get()); 981 if (!cert.get()) return false; 982 983 ASN1_OCTET_STRING* attest_rec = get_attestation_record(cert.get()); 984 EXPECT_TRUE(!!attest_rec); 985 if (!attest_rec) return false; 986 987 AuthorizationSet att_sw_enforced; 988 AuthorizationSet att_tee_enforced; 989 uint32_t att_attestation_version; 990 uint32_t att_keymaster_version; 991 SecurityLevel att_attestation_security_level; 992 SecurityLevel att_keymaster_security_level; 993 HidlBuf att_challenge; 994 HidlBuf att_unique_id; 995 HidlBuf att_app_id; 996 EXPECT_EQ(ErrorCode::OK, 997 parse_attestation_record(attest_rec->data, // 998 attest_rec->length, // 999 &att_attestation_version, // 1000 &att_attestation_security_level, // 1001 &att_keymaster_version, // 1002 &att_keymaster_security_level, // 1003 &att_challenge, // 1004 &att_sw_enforced, // 1005 &att_tee_enforced, // 1006 &att_unique_id)); 1007 1008 EXPECT_TRUE(att_attestation_version == 1 || att_attestation_version == 2); 1009 1010 expected_sw_enforced.push_back(TAG_ATTESTATION_APPLICATION_ID, 1011 HidlBuf(app_id)); 1012 1013 if (!KeymasterHidlTest::IsSecure()) { 1014 // SW is KM3 1015 EXPECT_EQ(att_keymaster_version, 3U); 1016 } 1017 1018 if (KeymasterHidlTest::SupportsSymmetric()) { 1019 EXPECT_GE(att_keymaster_version, 1U); 1020 } 1021 1022 if (KeymasterHidlTest::SupportsAttestation()) { 1023 EXPECT_GE(att_keymaster_version, 2U); 1024 } 1025 1026 EXPECT_EQ(KeymasterHidlTest::IsSecure() ? SecurityLevel::TRUSTED_ENVIRONMENT 1027 : SecurityLevel::SOFTWARE, 1028 att_keymaster_security_level); 1029 EXPECT_EQ(KeymasterHidlTest::SupportsAttestation() ? SecurityLevel::TRUSTED_ENVIRONMENT 1030 : SecurityLevel::SOFTWARE, 1031 att_attestation_security_level); 1032 1033 EXPECT_EQ(challenge.length(), att_challenge.size()); 1034 EXPECT_EQ(0, memcmp(challenge.data(), att_challenge.data(), challenge.length())); 1035 1036 att_sw_enforced.Sort(); 1037 expected_sw_enforced.Sort(); 1038 EXPECT_EQ(filter_tags(expected_sw_enforced), filter_tags(att_sw_enforced)) 1039 << "(Possibly b/38394619)"; 1040 1041 att_tee_enforced.Sort(); 1042 expected_tee_enforced.Sort(); 1043 EXPECT_EQ(filter_tags(expected_tee_enforced), filter_tags(att_tee_enforced)) 1044 << "(Possibly b/38394619)"; 1045 1046 return true; 1047 } 1048 1049 sp<IKeymasterDevice> KeymasterHidlTest::keymaster_; 1050 uint32_t KeymasterHidlTest::os_version_; 1051 uint32_t KeymasterHidlTest::os_patch_level_; 1052 bool KeymasterHidlTest::is_secure_; 1053 bool KeymasterHidlTest::supports_ec_; 1054 bool KeymasterHidlTest::supports_symmetric_; 1055 bool KeymasterHidlTest::supports_all_digests_; 1056 bool KeymasterHidlTest::supports_attestation_; 1057 hidl_string KeymasterHidlTest::name_; 1058 hidl_string KeymasterHidlTest::author_; 1059 1060 typedef KeymasterHidlTest KeymasterVersionTest; 1061 1062 /* 1063 * KeymasterVersionTest.SensibleFeatures: 1064 * 1065 * Queries keymaster to find the set of features it supports. Fails if the combination doesn't 1066 * correspond to any well-defined keymaster version. 1067 */ 1068 TEST_F(KeymasterVersionTest, SensibleFeatures) { 1069 EXPECT_TRUE(Km2Profile() || Km1Profile() || Km0Profile() || SwOnlyProfile()) 1070 << "Keymaster feature set doesn't fit any reasonable profile. Reported features:" 1071 << "SupportsAttestation [" << SupportsAttestation() << "], " 1072 << "SupportsSymmetric [" << SupportsSymmetric() << "], " 1073 << "SupportsAllDigests [" << SupportsAllDigests() << "], " 1074 << "SupportsEc [" << SupportsEc() << "], " 1075 << "IsSecure [" << IsSecure() << "]"; 1076 } 1077 1078 class NewKeyGenerationTest : public KeymasterHidlTest { 1079 protected: 1080 void CheckBaseParams(const KeyCharacteristics& keyCharacteristics, bool asymmetric = false) { 1081 // TODO(swillden): Distinguish which params should be in which auth list. 1082 1083 AuthorizationSet auths(keyCharacteristics.teeEnforced); 1084 auths.push_back(AuthorizationSet(keyCharacteristics.softwareEnforced)); 1085 1086 if (!SupportsSymmetric() && asymmetric) { 1087 EXPECT_TRUE(auths.Contains(TAG_ORIGIN, KeyOrigin::UNKNOWN)); 1088 } else { 1089 EXPECT_TRUE(auths.Contains(TAG_ORIGIN, KeyOrigin::GENERATED)); 1090 } 1091 1092 EXPECT_TRUE(auths.Contains(TAG_PURPOSE, KeyPurpose::SIGN)); 1093 EXPECT_TRUE(auths.Contains(TAG_PURPOSE, KeyPurpose::VERIFY)); 1094 EXPECT_TRUE(auths.Contains(TAG_USER_ID, 7)) 1095 << "User ID should be 7, was " << auths.GetTagValue(TAG_USER_ID); 1096 1097 // Verify that App ID, App data and ROT are NOT included. 1098 EXPECT_FALSE(auths.Contains(TAG_ROOT_OF_TRUST)); 1099 EXPECT_FALSE(auths.Contains(TAG_APPLICATION_ID)); 1100 EXPECT_FALSE(auths.Contains(TAG_APPLICATION_DATA)); 1101 1102 // Check that some unexpected tags/values are NOT present. 1103 EXPECT_FALSE(auths.Contains(TAG_PURPOSE, KeyPurpose::ENCRYPT)); 1104 EXPECT_FALSE(auths.Contains(TAG_PURPOSE, KeyPurpose::DECRYPT)); 1105 EXPECT_FALSE(auths.Contains(TAG_AUTH_TIMEOUT, 301)); 1106 1107 // Now check that unspecified, defaulted tags are correct. 1108 EXPECT_TRUE(auths.Contains(TAG_CREATION_DATETIME)); 1109 1110 if (SupportsAttestation()) { 1111 EXPECT_TRUE(auths.Contains(TAG_OS_VERSION, os_version())) 1112 << "OS version is " << os_version() << " key reported " 1113 << auths.GetTagValue(TAG_OS_VERSION); 1114 EXPECT_TRUE(auths.Contains(TAG_OS_PATCHLEVEL, os_patch_level())) 1115 << "OS patch level is " << os_patch_level() << " key reported " 1116 << auths.GetTagValue(TAG_OS_PATCHLEVEL); 1117 } 1118 } 1119 }; 1120 1121 /* 1122 * NewKeyGenerationTest.Rsa 1123 * 1124 * Verifies that keymaster can generate all required RSA key sizes, and that the resulting keys have 1125 * correct characteristics. 1126 */ 1127 TEST_F(NewKeyGenerationTest, Rsa) { 1128 for (auto key_size : {1024, 2048, 3072, 4096}) { 1129 HidlBuf key_blob; 1130 KeyCharacteristics key_characteristics; 1131 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1132 .RsaSigningKey(key_size, 3) 1133 .Digest(Digest::NONE) 1134 .Padding(PaddingMode::NONE) 1135 .Authorizations(UserAuths()), 1136 &key_blob, &key_characteristics)); 1137 1138 ASSERT_GT(key_blob.size(), 0U); 1139 CheckBaseParams(key_characteristics, true /* asymmetric */); 1140 1141 AuthorizationSet crypto_params; 1142 if (IsSecure()) { 1143 crypto_params = key_characteristics.teeEnforced; 1144 } else { 1145 crypto_params = key_characteristics.softwareEnforced; 1146 } 1147 1148 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, KM_ALGORITHM_RSA)); 1149 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size)); 1150 EXPECT_TRUE(crypto_params.Contains(TAG_RSA_PUBLIC_EXPONENT, 3)); 1151 1152 CheckedDeleteKey(&key_blob); 1153 } 1154 } 1155 1156 /* 1157 * NewKeyGenerationTest.RsaNoDefaultSize 1158 * 1159 * Verifies that failing to specify a key size for RSA key generation returns UNSUPPORTED_KEY_SIZE. 1160 */ 1161 TEST_F(NewKeyGenerationTest, RsaNoDefaultSize) { 1162 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE, 1163 GenerateKey(AuthorizationSetBuilder() 1164 .Authorization(TAG_ALGORITHM, Algorithm::RSA) 1165 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3) 1166 .SigningKey())); 1167 } 1168 1169 /* 1170 * NewKeyGenerationTest.Ecdsa 1171 * 1172 * Verifies that keymaster can generate all required EC key sizes, and that the resulting keys have 1173 * correct characteristics. 1174 */ 1175 TEST_F(NewKeyGenerationTest, Ecdsa) { 1176 for (auto key_size : {224, 256, 384, 521}) { 1177 HidlBuf key_blob; 1178 KeyCharacteristics key_characteristics; 1179 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1180 .EcdsaSigningKey(key_size) 1181 .Digest(Digest::NONE) 1182 .Authorizations(UserAuths()), 1183 &key_blob, &key_characteristics)); 1184 ASSERT_GT(key_blob.size(), 0U); 1185 CheckBaseParams(key_characteristics, true /* asymmetric */); 1186 1187 AuthorizationSet crypto_params; 1188 if (IsSecure()) { 1189 crypto_params = key_characteristics.teeEnforced; 1190 } else { 1191 crypto_params = key_characteristics.softwareEnforced; 1192 } 1193 1194 EXPECT_TRUE(crypto_params.Contains(TAG_ALGORITHM, Algorithm::EC)); 1195 EXPECT_TRUE(crypto_params.Contains(TAG_KEY_SIZE, key_size)); 1196 1197 CheckedDeleteKey(&key_blob); 1198 } 1199 } 1200 1201 /* 1202 * NewKeyGenerationTest.EcdsaDefaultSize 1203 * 1204 * Verifies that failing to specify a key size for EC key generation returns UNSUPPORTED_KEY_SIZE. 1205 */ 1206 TEST_F(NewKeyGenerationTest, EcdsaDefaultSize) { 1207 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE, 1208 GenerateKey(AuthorizationSetBuilder() 1209 .Authorization(TAG_ALGORITHM, Algorithm::EC) 1210 .SigningKey() 1211 .Digest(Digest::NONE))); 1212 } 1213 1214 /* 1215 * NewKeyGenerationTest.EcdsaInvalidSize 1216 * 1217 * Verifies that failing to specify an invalid key size for EC key generation returns 1218 * UNSUPPORTED_KEY_SIZE. 1219 */ 1220 TEST_F(NewKeyGenerationTest, EcdsaInvalidSize) { 1221 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE, 1222 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(Digest::NONE))); 1223 } 1224 1225 /* 1226 * NewKeyGenerationTest.EcdsaMismatchKeySize 1227 * 1228 * Verifies that specifying mismatched key size and curve for EC key generation returns 1229 * INVALID_ARGUMENT. 1230 */ 1231 TEST_F(NewKeyGenerationTest, EcdsaMismatchKeySize) { 1232 ASSERT_EQ(ErrorCode::INVALID_ARGUMENT, 1233 GenerateKey(AuthorizationSetBuilder() 1234 .EcdsaSigningKey(224) 1235 .Authorization(TAG_EC_CURVE, EcCurve::P_256) 1236 .Digest(Digest::NONE))) 1237 << "(Possibly b/36233343)"; 1238 } 1239 1240 TEST_F(NewKeyGenerationTest, EcdsaAllValidSizes) { 1241 size_t valid_sizes[] = {224, 256, 384, 521}; 1242 for (size_t size : valid_sizes) { 1243 EXPECT_EQ(ErrorCode::OK, 1244 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest(Digest::NONE))) 1245 << "Failed to generate size: " << size; 1246 CheckedDeleteKey(); 1247 } 1248 } 1249 1250 /* 1251 * NewKeyGenerationTest.EcdsaAllValidCurves 1252 * 1253 * Verifies that keymaster supports all required EC curves. 1254 */ 1255 TEST_F(NewKeyGenerationTest, EcdsaAllValidCurves) { 1256 EcCurve curves[] = {EcCurve::P_224, EcCurve::P_256, EcCurve::P_384, EcCurve::P_521}; 1257 for (auto curve : curves) { 1258 EXPECT_EQ( 1259 ErrorCode::OK, 1260 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(curve).Digest(Digest::SHA_2_512))) 1261 << "Failed to generate key on curve: " << curve; 1262 CheckedDeleteKey(); 1263 } 1264 } 1265 1266 /* 1267 * NewKeyGenerationTest.Hmac 1268 * 1269 * Verifies that keymaster supports all required digests, and that the resulting keys have correct 1270 * characteristics. 1271 */ 1272 TEST_F(NewKeyGenerationTest, Hmac) { 1273 for (auto digest : {Digest::MD5, Digest::SHA1, Digest::SHA_2_224, Digest::SHA_2_256, 1274 Digest::SHA_2_384, Digest::SHA_2_512}) { 1275 HidlBuf key_blob; 1276 KeyCharacteristics key_characteristics; 1277 constexpr size_t key_size = 128; 1278 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1279 .HmacKey(key_size) 1280 .Digest(digest) 1281 .Authorization(TAG_MIN_MAC_LENGTH, 128) 1282 .Authorizations(UserAuths()), 1283 &key_blob, &key_characteristics)); 1284 1285 ASSERT_GT(key_blob.size(), 0U); 1286 CheckBaseParams(key_characteristics); 1287 1288 AuthorizationSet teeEnforced = key_characteristics.teeEnforced; 1289 AuthorizationSet softwareEnforced = key_characteristics.softwareEnforced; 1290 if (SupportsAttestation() || SupportsAllDigests()) { 1291 // Either KM2, which must support all, or KM1 that claims full support 1292 EXPECT_TRUE(teeEnforced.Contains(TAG_ALGORITHM, Algorithm::HMAC)); 1293 EXPECT_TRUE(teeEnforced.Contains(TAG_KEY_SIZE, key_size)); 1294 } else if (SupportsSymmetric()) { 1295 if (digest == Digest::SHA1 || digest == Digest::SHA_2_256) { 1296 // KM1 must support SHA1 and SHA256 in hardware 1297 EXPECT_TRUE(teeEnforced.Contains(TAG_ALGORITHM, Algorithm::HMAC)); 1298 EXPECT_TRUE(teeEnforced.Contains(TAG_KEY_SIZE, key_size)); 1299 } else { 1300 // Othere digests may or may not be supported 1301 EXPECT_TRUE(teeEnforced.Contains(TAG_ALGORITHM, Algorithm::HMAC) || 1302 softwareEnforced.Contains(TAG_ALGORITHM, Algorithm::HMAC)); 1303 EXPECT_TRUE(teeEnforced.Contains(TAG_KEY_SIZE, key_size) || 1304 softwareEnforced.Contains(TAG_KEY_SIZE, key_size)); 1305 } 1306 } else { 1307 // KM0 and SW KM do all digests in SW. 1308 EXPECT_TRUE(softwareEnforced.Contains(TAG_ALGORITHM, Algorithm::HMAC)); 1309 EXPECT_TRUE(softwareEnforced.Contains(TAG_KEY_SIZE, key_size)); 1310 } 1311 1312 CheckedDeleteKey(&key_blob); 1313 } 1314 } 1315 1316 /* 1317 * NewKeyGenerationTest.HmacCheckKeySizes 1318 * 1319 * Verifies that keymaster supports all key sizes, and rejects all invalid key sizes. 1320 */ 1321 TEST_F(NewKeyGenerationTest, HmacCheckKeySizes) { 1322 for (size_t key_size = 0; key_size <= 512; ++key_size) { 1323 if (key_size < 64 || key_size % 8 != 0) { 1324 // To keep this test from being very slow, we only test a random fraction of non-byte 1325 // key sizes. We test only ~10% of such cases. Since there are 392 of them, we expect 1326 // to run ~40 of them in each run. 1327 if (key_size % 8 == 0 || random() % 10 == 0) { 1328 EXPECT_EQ(ErrorCode::UNSUPPORTED_KEY_SIZE, 1329 GenerateKey(AuthorizationSetBuilder() 1330 .HmacKey(key_size) 1331 .Digest(Digest::SHA_2_256) 1332 .Authorization(TAG_MIN_MAC_LENGTH, 256))) 1333 << "HMAC key size " << key_size << " invalid (Possibly b/33462346)"; 1334 } 1335 } else { 1336 EXPECT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1337 .HmacKey(key_size) 1338 .Digest(Digest::SHA_2_256) 1339 .Authorization(TAG_MIN_MAC_LENGTH, 256))); 1340 CheckedDeleteKey(); 1341 } 1342 } 1343 } 1344 1345 /* 1346 * NewKeyGenerationTest.HmacCheckMinMacLengths 1347 * 1348 * Verifies that keymaster supports all required MAC lengths and rejects all invalid lengths. This 1349 * test is probabilistic in order to keep the runtime down, but any failure prints out the specific 1350 * MAC length that failed, so reproducing a failed run will be easy. 1351 */ 1352 TEST_F(NewKeyGenerationTest, HmacCheckMinMacLengths) { 1353 for (size_t min_mac_length = 0; min_mac_length <= 256; ++min_mac_length) { 1354 if (min_mac_length < 64 || min_mac_length % 8 != 0) { 1355 // To keep this test from being very long, we only test a random fraction of non-byte 1356 // lengths. We test only ~10% of such cases. Since there are 172 of them, we expect to 1357 // run ~17 of them in each run. 1358 if (min_mac_length % 8 == 0 || random() % 10 == 0) { 1359 EXPECT_EQ(ErrorCode::UNSUPPORTED_MIN_MAC_LENGTH, 1360 GenerateKey(AuthorizationSetBuilder() 1361 .HmacKey(128) 1362 .Digest(Digest::SHA_2_256) 1363 .Authorization(TAG_MIN_MAC_LENGTH, min_mac_length))) 1364 << "HMAC min mac length " << min_mac_length << " invalid."; 1365 } 1366 } else { 1367 EXPECT_EQ(ErrorCode::OK, 1368 GenerateKey(AuthorizationSetBuilder() 1369 .HmacKey(128) 1370 .Digest(Digest::SHA_2_256) 1371 .Authorization(TAG_MIN_MAC_LENGTH, min_mac_length))); 1372 CheckedDeleteKey(); 1373 } 1374 } 1375 } 1376 1377 /* 1378 * NewKeyGenerationTest.HmacMultipleDigests 1379 * 1380 * Verifies that keymaster rejects HMAC key generation with multiple specified digest algorithms. 1381 */ 1382 TEST_F(NewKeyGenerationTest, HmacMultipleDigests) { 1383 ASSERT_EQ(ErrorCode::UNSUPPORTED_DIGEST, 1384 GenerateKey(AuthorizationSetBuilder() 1385 .HmacKey(128) 1386 .Digest(Digest::SHA1) 1387 .Digest(Digest::SHA_2_256) 1388 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 1389 } 1390 1391 /* 1392 * NewKeyGenerationTest.HmacDigestNone 1393 * 1394 * Verifies that keymaster rejects HMAC key generation with no digest or Digest::NONE 1395 */ 1396 TEST_F(NewKeyGenerationTest, HmacDigestNone) { 1397 ASSERT_EQ( 1398 ErrorCode::UNSUPPORTED_DIGEST, 1399 GenerateKey(AuthorizationSetBuilder().HmacKey(128).Authorization(TAG_MIN_MAC_LENGTH, 128))); 1400 1401 ASSERT_EQ(ErrorCode::UNSUPPORTED_DIGEST, 1402 GenerateKey(AuthorizationSetBuilder() 1403 .HmacKey(128) 1404 .Digest(Digest::NONE) 1405 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 1406 } 1407 1408 typedef KeymasterHidlTest GetKeyCharacteristicsTest; 1409 1410 /* 1411 * GetKeyCharacteristicsTest.HmacDigestNone 1412 * 1413 * Verifies that getKeyCharacteristics functions, and that generated and retrieved key 1414 * characteristics match. 1415 */ 1416 TEST_F(GetKeyCharacteristicsTest, SimpleRsa) { 1417 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1418 .RsaSigningKey(1024, 3) 1419 .Digest(Digest::NONE) 1420 .Padding(PaddingMode::NONE))); 1421 1422 KeyCharacteristics retrieved_chars; 1423 ASSERT_EQ(ErrorCode::OK, GetCharacteristics(key_blob_, &retrieved_chars)); 1424 1425 AuthorizationSet gen_sw = key_characteristics_.softwareEnforced; 1426 AuthorizationSet gen_tee = key_characteristics_.teeEnforced; 1427 AuthorizationSet retrieved_sw = retrieved_chars.softwareEnforced; 1428 AuthorizationSet retrieved_tee = retrieved_chars.teeEnforced; 1429 1430 EXPECT_EQ(gen_sw, retrieved_sw); 1431 EXPECT_EQ(gen_tee, retrieved_tee); 1432 } 1433 1434 typedef KeymasterHidlTest SigningOperationsTest; 1435 1436 /* 1437 * SigningOperationsTest.RsaSuccess 1438 * 1439 * Verifies that raw RSA signature operations succeed. 1440 */ 1441 TEST_F(SigningOperationsTest, RsaSuccess) { 1442 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1443 .RsaSigningKey(1024, 3) 1444 .Digest(Digest::NONE) 1445 .Padding(PaddingMode::NONE) 1446 .Authorization(TAG_NO_AUTH_REQUIRED))); 1447 string message = "12345678901234567890123456789012"; 1448 string signature = SignMessage( 1449 message, AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE)); 1450 } 1451 1452 /* 1453 * SigningOperationsTest.RsaPssSha256Success 1454 * 1455 * Verifies that RSA-PSS signature operations succeed. 1456 */ 1457 TEST_F(SigningOperationsTest, RsaPssSha256Success) { 1458 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1459 .RsaSigningKey(1024, 3) 1460 .Digest(Digest::SHA_2_256) 1461 .Padding(PaddingMode::RSA_PSS) 1462 .Authorization(TAG_NO_AUTH_REQUIRED))); 1463 // Use large message, which won't work without digesting. 1464 string message(1024, 'a'); 1465 string signature = SignMessage( 1466 message, AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Padding(PaddingMode::RSA_PSS)); 1467 } 1468 1469 /* 1470 * SigningOperationsTest.RsaPaddingNoneDoesNotAllowOther 1471 * 1472 * Verifies that keymaster rejects signature operations that specify a padding mode when the key 1473 * supports only unpadded operations. 1474 */ 1475 TEST_F(SigningOperationsTest, RsaPaddingNoneDoesNotAllowOther) { 1476 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1477 .RsaSigningKey(1024, 3) 1478 .Digest(Digest::NONE) 1479 .Authorization(TAG_NO_AUTH_REQUIRED) 1480 .Padding(PaddingMode::NONE))); 1481 string message = "12345678901234567890123456789012"; 1482 string signature; 1483 1484 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PADDING_MODE, 1485 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder() 1486 .Digest(Digest::NONE) 1487 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN))); 1488 } 1489 1490 /* 1491 * SigningOperationsTest.RsaPkcs1Sha256Success 1492 * 1493 * Verifies that digested RSA-PKCS1 signature operations succeed. 1494 */ 1495 TEST_F(SigningOperationsTest, RsaPkcs1Sha256Success) { 1496 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1497 .RsaSigningKey(1024, 3) 1498 .Digest(Digest::SHA_2_256) 1499 .Authorization(TAG_NO_AUTH_REQUIRED) 1500 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN))); 1501 string message(1024, 'a'); 1502 string signature = SignMessage(message, AuthorizationSetBuilder() 1503 .Digest(Digest::SHA_2_256) 1504 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)); 1505 } 1506 1507 /* 1508 * SigningOperationsTest.RsaPkcs1NoDigestSuccess 1509 * 1510 * Verifies that undigested RSA-PKCS1 signature operations succeed. 1511 */ 1512 TEST_F(SigningOperationsTest, RsaPkcs1NoDigestSuccess) { 1513 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1514 .RsaSigningKey(1024, 3) 1515 .Digest(Digest::NONE) 1516 .Authorization(TAG_NO_AUTH_REQUIRED) 1517 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN))); 1518 string message(53, 'a'); 1519 string signature = SignMessage( 1520 message, 1521 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::RSA_PKCS1_1_5_SIGN)); 1522 } 1523 1524 /* 1525 * SigningOperationsTest.RsaPkcs1NoDigestTooLarge 1526 * 1527 * Verifies that undigested RSA-PKCS1 signature operations fail with the correct error code when 1528 * given a too-long message. 1529 */ 1530 TEST_F(SigningOperationsTest, RsaPkcs1NoDigestTooLong) { 1531 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1532 .RsaSigningKey(1024, 3) 1533 .Digest(Digest::NONE) 1534 .Authorization(TAG_NO_AUTH_REQUIRED) 1535 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN))); 1536 string message(129, 'a'); 1537 1538 EXPECT_EQ(ErrorCode::OK, 1539 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder() 1540 .Digest(Digest::NONE) 1541 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN))); 1542 string signature; 1543 EXPECT_EQ(ErrorCode::INVALID_INPUT_LENGTH, Finish(message, &signature)); 1544 } 1545 1546 /* 1547 * SigningOperationsTest.RsaPssSha512TooSmallKey 1548 * 1549 * Verifies that undigested RSA-PSS signature operations fail with the correct error code when 1550 * used with a key that is too small for the message. 1551 * 1552 * A PSS-padded message is of length salt_size + digest_size + 16 (sizes in bits), and the keymaster 1553 * specification requires that salt_size == digest_size, so the message will be digest_size * 2 + 1554 * 16. Such a message can only be signed by a given key if the key is at least that size. This test 1555 * uses SHA512, which has a digest_size == 512, so the message size is 1040 bits, too large for a 1556 * 1024-bit key. 1557 */ 1558 TEST_F(SigningOperationsTest, RsaPssSha512TooSmallKey) { 1559 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1560 .RsaSigningKey(1024, 3) 1561 .Digest(Digest::SHA_2_512) 1562 .Authorization(TAG_NO_AUTH_REQUIRED) 1563 .Padding(PaddingMode::RSA_PSS))); 1564 EXPECT_EQ( 1565 ErrorCode::INCOMPATIBLE_DIGEST, 1566 Begin(KeyPurpose::SIGN, 1567 AuthorizationSetBuilder().Digest(Digest::SHA_2_512).Padding(PaddingMode::RSA_PSS))) 1568 << "(Possibly b/33346750)"; 1569 } 1570 1571 /* 1572 * SigningOperationsTest.RsaNoPaddingTooLong 1573 * 1574 * Verifies that raw RSA signature operations fail with the correct error code when 1575 * given a too-long message. 1576 */ 1577 TEST_F(SigningOperationsTest, RsaNoPaddingTooLong) { 1578 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1579 .RsaSigningKey(1024, 3) 1580 .Digest(Digest::NONE) 1581 .Authorization(TAG_NO_AUTH_REQUIRED) 1582 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN))); 1583 // One byte too long 1584 string message(1024 / 8 + 1, 'a'); 1585 ASSERT_EQ(ErrorCode::OK, 1586 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder() 1587 .Digest(Digest::NONE) 1588 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN))); 1589 string result; 1590 ErrorCode finish_error_code = Finish(message, &result); 1591 EXPECT_TRUE(finish_error_code == ErrorCode::INVALID_INPUT_LENGTH || 1592 finish_error_code == ErrorCode::INVALID_ARGUMENT); 1593 1594 // Very large message that should exceed the transfer buffer size of any reasonable TEE. 1595 message = string(128 * 1024, 'a'); 1596 ASSERT_EQ(ErrorCode::OK, 1597 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder() 1598 .Digest(Digest::NONE) 1599 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN))); 1600 finish_error_code = Finish(message, &result); 1601 EXPECT_TRUE(finish_error_code == ErrorCode::INVALID_INPUT_LENGTH || 1602 finish_error_code == ErrorCode::INVALID_ARGUMENT); 1603 } 1604 1605 /* 1606 * SigningOperationsTest.RsaAbort 1607 * 1608 * Verifies that operations can be aborted correctly. Uses an RSA signing operation for the test, 1609 * but the behavior should be algorithm and purpose-independent. 1610 */ 1611 TEST_F(SigningOperationsTest, RsaAbort) { 1612 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1613 .RsaSigningKey(1024, 3) 1614 .Digest(Digest::NONE) 1615 .Authorization(TAG_NO_AUTH_REQUIRED) 1616 .Padding(PaddingMode::NONE))); 1617 1618 ASSERT_EQ(ErrorCode::OK, 1619 Begin(KeyPurpose::SIGN, 1620 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE))); 1621 EXPECT_EQ(ErrorCode::OK, Abort(op_handle_)); 1622 1623 // Another abort should fail 1624 EXPECT_EQ(ErrorCode::INVALID_OPERATION_HANDLE, Abort(op_handle_)); 1625 1626 // Set to sentinel, so TearDown() doesn't try to abort again. 1627 op_handle_ = kOpHandleSentinel; 1628 } 1629 1630 /* 1631 * SigningOperationsTest.RsaUnsupportedPadding 1632 * 1633 * Verifies that RSA operations fail with the correct error (but key gen succeeds) when used with a 1634 * padding mode inappropriate for RSA. 1635 */ 1636 TEST_F(SigningOperationsTest, RsaUnsupportedPadding) { 1637 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1638 .RsaSigningKey(1024, 3) 1639 .Authorization(TAG_NO_AUTH_REQUIRED) 1640 .Digest(Digest::SHA_2_256 /* supported digest */) 1641 .Padding(PaddingMode::PKCS7))); 1642 ASSERT_EQ( 1643 ErrorCode::UNSUPPORTED_PADDING_MODE, 1644 Begin(KeyPurpose::SIGN, 1645 AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Padding(PaddingMode::PKCS7))); 1646 } 1647 1648 /* 1649 * SigningOperationsTest.RsaPssNoDigest 1650 * 1651 * Verifies that RSA PSS operations fail when no digest is used. PSS requires a digest. 1652 */ 1653 TEST_F(SigningOperationsTest, RsaNoDigest) { 1654 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1655 .RsaSigningKey(1024, 3) 1656 .Authorization(TAG_NO_AUTH_REQUIRED) 1657 .Digest(Digest::NONE) 1658 .Padding(PaddingMode::RSA_PSS))); 1659 ASSERT_EQ(ErrorCode::INCOMPATIBLE_DIGEST, 1660 Begin(KeyPurpose::SIGN, 1661 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::RSA_PSS))); 1662 1663 ASSERT_EQ(ErrorCode::UNSUPPORTED_DIGEST, 1664 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder().Padding(PaddingMode::RSA_PSS))); 1665 } 1666 1667 /* 1668 * SigningOperationsTest.RsaPssNoDigest 1669 * 1670 * Verifies that RSA operations fail when no padding mode is specified. PaddingMode::NONE is 1671 * supported in some cases (as validated in other tests), but a mode must be specified. 1672 */ 1673 TEST_F(SigningOperationsTest, RsaNoPadding) { 1674 // Padding must be specified 1675 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1676 .RsaKey(1024, 3) 1677 .Authorization(TAG_NO_AUTH_REQUIRED) 1678 .SigningKey() 1679 .Digest(Digest::NONE))); 1680 ASSERT_EQ(ErrorCode::UNSUPPORTED_PADDING_MODE, 1681 Begin(KeyPurpose::SIGN, AuthorizationSetBuilder().Digest(Digest::NONE))); 1682 } 1683 1684 /* 1685 * SigningOperationsTest.RsaShortMessage 1686 * 1687 * Verifies that raw RSA signatures succeed with a message shorter than the key size. 1688 */ 1689 TEST_F(SigningOperationsTest, RsaTooShortMessage) { 1690 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1691 .Authorization(TAG_NO_AUTH_REQUIRED) 1692 .RsaSigningKey(1024, 3) 1693 .Digest(Digest::NONE) 1694 .Padding(PaddingMode::NONE))); 1695 1696 // Barely shorter 1697 string message(1024 / 8 - 1, 'a'); 1698 SignMessage(message, AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE)); 1699 1700 // Much shorter 1701 message = "a"; 1702 SignMessage(message, AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE)); 1703 } 1704 1705 /* 1706 * SigningOperationsTest.RsaSignWithEncryptionKey 1707 * 1708 * Verifies that RSA encryption keys cannot be used to sign. 1709 */ 1710 TEST_F(SigningOperationsTest, RsaSignWithEncryptionKey) { 1711 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1712 .Authorization(TAG_NO_AUTH_REQUIRED) 1713 .RsaEncryptionKey(1024, 3) 1714 .Digest(Digest::NONE) 1715 .Padding(PaddingMode::NONE))); 1716 ASSERT_EQ(ErrorCode::INCOMPATIBLE_PURPOSE, 1717 Begin(KeyPurpose::SIGN, 1718 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE))); 1719 } 1720 1721 /* 1722 * SigningOperationsTest.RsaSignTooLargeMessage 1723 * 1724 * Verifies that attempting a raw signature of a message which is the same length as the key, but 1725 * numerically larger than the public modulus, fails with the correct error. 1726 */ 1727 TEST_F(SigningOperationsTest, RsaSignTooLargeMessage) { 1728 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1729 .Authorization(TAG_NO_AUTH_REQUIRED) 1730 .RsaSigningKey(1024, 3) 1731 .Digest(Digest::NONE) 1732 .Padding(PaddingMode::NONE))); 1733 1734 // Largest possible message will always be larger than the public modulus. 1735 string message(1024 / 8, static_cast<char>(0xff)); 1736 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::SIGN, AuthorizationSetBuilder() 1737 .Authorization(TAG_NO_AUTH_REQUIRED) 1738 .Digest(Digest::NONE) 1739 .Padding(PaddingMode::NONE))); 1740 string signature; 1741 ASSERT_EQ(ErrorCode::INVALID_ARGUMENT, Finish(message, &signature)); 1742 } 1743 1744 /* 1745 * SigningOperationsTest.EcdsaAllSizesAndHashes 1746 * 1747 * Verifies that ECDSA operations succeed with all possible key sizes and hashes. 1748 */ 1749 TEST_F(SigningOperationsTest, EcdsaAllSizesAndHashes) { 1750 for (auto key_size : {224, 256, 384, 521}) { 1751 for (auto digest : { 1752 Digest::SHA1, Digest::SHA_2_224, Digest::SHA_2_256, Digest::SHA_2_384, 1753 Digest::SHA_2_512, 1754 }) { 1755 ErrorCode error = GenerateKey(AuthorizationSetBuilder() 1756 .Authorization(TAG_NO_AUTH_REQUIRED) 1757 .EcdsaSigningKey(key_size) 1758 .Digest(digest)); 1759 EXPECT_EQ(ErrorCode::OK, error) << "Failed to generate ECDSA key with size " << key_size 1760 << " and digest " << digest; 1761 if (error != ErrorCode::OK) continue; 1762 1763 string message(1024, 'a'); 1764 if (digest == Digest::NONE) message.resize(key_size / 8); 1765 SignMessage(message, AuthorizationSetBuilder().Digest(digest)); 1766 CheckedDeleteKey(); 1767 } 1768 } 1769 } 1770 1771 /* 1772 * SigningOperationsTest.EcdsaAllCurves 1773 * 1774 * Verifies that ECDSA operations succeed with all possible curves. 1775 */ 1776 TEST_F(SigningOperationsTest, EcdsaAllCurves) { 1777 for (auto curve : {EcCurve::P_224, EcCurve::P_256, EcCurve::P_384, EcCurve::P_521}) { 1778 ErrorCode error = GenerateKey(AuthorizationSetBuilder() 1779 .Authorization(TAG_NO_AUTH_REQUIRED) 1780 .EcdsaSigningKey(curve) 1781 .Digest(Digest::SHA_2_256)); 1782 EXPECT_EQ(ErrorCode::OK, error) << "Failed to generate ECDSA key with curve " << curve; 1783 if (error != ErrorCode::OK) continue; 1784 1785 string message(1024, 'a'); 1786 SignMessage(message, AuthorizationSetBuilder().Digest(Digest::SHA_2_256)); 1787 CheckedDeleteKey(); 1788 } 1789 } 1790 1791 /* 1792 * SigningOperationsTest.EcdsaNoDigestHugeData 1793 * 1794 * Verifies that ECDSA operations support very large messages, even without digesting. This should 1795 * work because ECDSA actually only signs the leftmost L_n bits of the message, however large it may 1796 * be. Not using digesting is a bad idea, but in some cases digesting is done by the framework. 1797 */ 1798 TEST_F(SigningOperationsTest, EcdsaNoDigestHugeData) { 1799 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1800 .Authorization(TAG_NO_AUTH_REQUIRED) 1801 .EcdsaSigningKey(224) 1802 .Digest(Digest::NONE))); 1803 string message(2 * 1024, 'a'); 1804 SignMessage(message, AuthorizationSetBuilder().Digest(Digest::NONE)); 1805 } 1806 1807 /* 1808 * SigningOperationsTest.AesEcbSign 1809 * 1810 * Verifies that attempts to use AES keys to sign fail in the correct way. 1811 */ 1812 TEST_F(SigningOperationsTest, AesEcbSign) { 1813 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1814 .Authorization(TAG_NO_AUTH_REQUIRED) 1815 .SigningKey() 1816 .AesEncryptionKey(128) 1817 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB))) 1818 << "(Possibly b/36252957)"; 1819 1820 AuthorizationSet out_params; 1821 EXPECT_EQ(ErrorCode::UNSUPPORTED_PURPOSE, 1822 Begin(KeyPurpose::SIGN, AuthorizationSet() /* in_params */, &out_params)) 1823 << "(Possibly b/36233187)"; 1824 1825 EXPECT_EQ(ErrorCode::UNSUPPORTED_PURPOSE, 1826 Begin(KeyPurpose::VERIFY, AuthorizationSet() /* in_params */, &out_params)) 1827 << "(Possibly b/36233187)"; 1828 } 1829 1830 /* 1831 * SigningOperationsTest.HmacAllDigests 1832 * 1833 * Verifies that HMAC works with all digests. 1834 */ 1835 TEST_F(SigningOperationsTest, HmacAllDigests) { 1836 for (auto digest : {Digest::SHA1, Digest::SHA_2_224, Digest::SHA_2_256, Digest::SHA_2_384, 1837 Digest::SHA_2_512}) { 1838 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1839 .Authorization(TAG_NO_AUTH_REQUIRED) 1840 .HmacKey(128) 1841 .Digest(digest) 1842 .Authorization(TAG_MIN_MAC_LENGTH, 160))) 1843 << "Failed to create HMAC key with digest " << digest; 1844 string message = "12345678901234567890123456789012"; 1845 string signature = MacMessage(message, digest, 160); 1846 EXPECT_EQ(160U / 8U, signature.size()) 1847 << "Failed to sign with HMAC key with digest " << digest; 1848 CheckedDeleteKey(); 1849 } 1850 } 1851 1852 /* 1853 * SigningOperationsTest.HmacSha256TooLargeMacLength 1854 * 1855 * Verifies that HMAC fails in the correct way when asked to generate a MAC larger than the digest 1856 * size. 1857 */ 1858 TEST_F(SigningOperationsTest, HmacSha256TooLargeMacLength) { 1859 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1860 .Authorization(TAG_NO_AUTH_REQUIRED) 1861 .HmacKey(128) 1862 .Digest(Digest::SHA_2_256) 1863 .Authorization(TAG_MIN_MAC_LENGTH, 256))); 1864 AuthorizationSet output_params; 1865 EXPECT_EQ( 1866 ErrorCode::UNSUPPORTED_MAC_LENGTH, 1867 Begin( 1868 KeyPurpose::SIGN, key_blob_, 1869 AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Authorization(TAG_MAC_LENGTH, 264), 1870 &output_params, &op_handle_)); 1871 } 1872 1873 /* 1874 * SigningOperationsTest.HmacSha256TooSmallMacLength 1875 * 1876 * Verifies that HMAC fails in the correct way when asked to generate a MAC smaller than the 1877 * specified minimum MAC length. 1878 */ 1879 TEST_F(SigningOperationsTest, HmacSha256TooSmallMacLength) { 1880 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 1881 .Authorization(TAG_NO_AUTH_REQUIRED) 1882 .HmacKey(128) 1883 .Digest(Digest::SHA_2_256) 1884 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 1885 AuthorizationSet output_params; 1886 EXPECT_EQ( 1887 ErrorCode::INVALID_MAC_LENGTH, 1888 Begin( 1889 KeyPurpose::SIGN, key_blob_, 1890 AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Authorization(TAG_MAC_LENGTH, 120), 1891 &output_params, &op_handle_)); 1892 } 1893 1894 /* 1895 * SigningOperationsTest.HmacRfc4231TestCase3 1896 * 1897 * Validates against the test vectors from RFC 4231 test case 3. 1898 */ 1899 TEST_F(SigningOperationsTest, HmacRfc4231TestCase3) { 1900 string key(20, 0xaa); 1901 string message(50, 0xdd); 1902 uint8_t sha_224_expected[] = { 1903 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a, 1904 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea, 1905 }; 1906 uint8_t sha_256_expected[] = { 1907 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 1908 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 1909 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe, 1910 }; 1911 uint8_t sha_384_expected[] = { 1912 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0, 1913 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb, 1914 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d, 1915 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27, 1916 }; 1917 uint8_t sha_512_expected[] = { 1918 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c, 1919 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8, 1920 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22, 1921 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37, 1922 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb, 1923 }; 1924 1925 CheckHmacTestVector(key, message, Digest::SHA_2_224, make_string(sha_224_expected)); 1926 CheckHmacTestVector(key, message, Digest::SHA_2_256, make_string(sha_256_expected)); 1927 CheckHmacTestVector(key, message, Digest::SHA_2_384, make_string(sha_384_expected)); 1928 CheckHmacTestVector(key, message, Digest::SHA_2_512, make_string(sha_512_expected)); 1929 } 1930 1931 /* 1932 * SigningOperationsTest.HmacRfc4231TestCase5 1933 * 1934 * Validates against the test vectors from RFC 4231 test case 5. 1935 */ 1936 TEST_F(SigningOperationsTest, HmacRfc4231TestCase5) { 1937 string key(20, 0x0c); 1938 string message = "Test With Truncation"; 1939 1940 uint8_t sha_224_expected[] = { 1941 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37, 1942 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8, 1943 }; 1944 uint8_t sha_256_expected[] = { 1945 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0, 1946 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b, 1947 }; 1948 uint8_t sha_384_expected[] = { 1949 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23, 1950 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97, 1951 }; 1952 uint8_t sha_512_expected[] = { 1953 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53, 1954 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6, 1955 }; 1956 1957 CheckHmacTestVector(key, message, Digest::SHA_2_224, make_string(sha_224_expected)); 1958 CheckHmacTestVector(key, message, Digest::SHA_2_256, make_string(sha_256_expected)); 1959 CheckHmacTestVector(key, message, Digest::SHA_2_384, make_string(sha_384_expected)); 1960 CheckHmacTestVector(key, message, Digest::SHA_2_512, make_string(sha_512_expected)); 1961 } 1962 1963 /* 1964 * SigningOperationsTest.HmacRfc4231TestCase6 1965 * 1966 * Validates against the test vectors from RFC 4231 test case 6. 1967 */ 1968 TEST_F(SigningOperationsTest, HmacRfc4231TestCase6) { 1969 string key(131, 0xaa); 1970 string message = "Test Using Larger Than Block-Size Key - Hash Key First"; 1971 1972 uint8_t sha_224_expected[] = { 1973 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d, 1974 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e, 1975 }; 1976 uint8_t sha_256_expected[] = { 1977 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 1978 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 1979 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54, 1980 }; 1981 uint8_t sha_384_expected[] = { 1982 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a, 1983 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f, 1984 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab, 1985 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52, 1986 }; 1987 uint8_t sha_512_expected[] = { 1988 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd, 1989 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b, 1990 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25, 1991 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73, 1992 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98, 1993 }; 1994 1995 CheckHmacTestVector(key, message, Digest::SHA_2_224, make_string(sha_224_expected)); 1996 CheckHmacTestVector(key, message, Digest::SHA_2_256, make_string(sha_256_expected)); 1997 CheckHmacTestVector(key, message, Digest::SHA_2_384, make_string(sha_384_expected)); 1998 CheckHmacTestVector(key, message, Digest::SHA_2_512, make_string(sha_512_expected)); 1999 } 2000 2001 /* 2002 * SigningOperationsTest.HmacRfc4231TestCase7 2003 * 2004 * Validates against the test vectors from RFC 4231 test case 7. 2005 */ 2006 TEST_F(SigningOperationsTest, HmacRfc4231TestCase7) { 2007 string key(131, 0xaa); 2008 string message = "This is a test using a larger than block-size key and a larger than " 2009 "block-size data. The key needs to be hashed before being used by the HMAC " 2010 "algorithm."; 2011 2012 uint8_t sha_224_expected[] = { 2013 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3, 2014 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1, 2015 }; 2016 uint8_t sha_256_expected[] = { 2017 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 2018 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 2019 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2, 2020 }; 2021 uint8_t sha_384_expected[] = { 2022 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25, 2023 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a, 2024 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31, 2025 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e, 2026 }; 2027 uint8_t sha_512_expected[] = { 2028 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e, 2029 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5, 2030 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82, 2031 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb, 2032 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58, 2033 }; 2034 2035 CheckHmacTestVector(key, message, Digest::SHA_2_224, make_string(sha_224_expected)); 2036 CheckHmacTestVector(key, message, Digest::SHA_2_256, make_string(sha_256_expected)); 2037 CheckHmacTestVector(key, message, Digest::SHA_2_384, make_string(sha_384_expected)); 2038 CheckHmacTestVector(key, message, Digest::SHA_2_512, make_string(sha_512_expected)); 2039 } 2040 2041 typedef KeymasterHidlTest VerificationOperationsTest; 2042 2043 /* 2044 * VerificationOperationsTest.RsaSuccess 2045 * 2046 * Verifies that a simple RSA signature/verification sequence succeeds. 2047 */ 2048 TEST_F(VerificationOperationsTest, RsaSuccess) { 2049 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2050 .Authorization(TAG_NO_AUTH_REQUIRED) 2051 .RsaSigningKey(1024, 3) 2052 .Digest(Digest::NONE) 2053 .Padding(PaddingMode::NONE))); 2054 string message = "12345678901234567890123456789012"; 2055 string signature = SignMessage( 2056 message, AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE)); 2057 VerifyMessage(message, signature, 2058 AuthorizationSetBuilder().Digest(Digest::NONE).Padding(PaddingMode::NONE)); 2059 } 2060 2061 /* 2062 * VerificationOperationsTest.RsaSuccess 2063 * 2064 * Verifies RSA signature/verification for all padding modes and digests. 2065 */ 2066 TEST_F(VerificationOperationsTest, RsaAllPaddingsAndDigests) { 2067 ASSERT_EQ(ErrorCode::OK, 2068 GenerateKey(AuthorizationSetBuilder() 2069 .Authorization(TAG_NO_AUTH_REQUIRED) 2070 .RsaSigningKey(2048, 3) 2071 .Digest(Digest::NONE, Digest::MD5, Digest::SHA1, Digest::SHA_2_224, 2072 Digest::SHA_2_256, Digest::SHA_2_384, Digest::SHA_2_512) 2073 .Padding(PaddingMode::NONE) 2074 .Padding(PaddingMode::RSA_PSS) 2075 .Padding(PaddingMode::RSA_PKCS1_1_5_SIGN))); 2076 2077 string message(128, 'a'); 2078 string corrupt_message(message); 2079 ++corrupt_message[corrupt_message.size() / 2]; 2080 2081 for (auto padding : 2082 {PaddingMode::NONE, PaddingMode::RSA_PSS, PaddingMode::RSA_PKCS1_1_5_SIGN}) { 2083 2084 for (auto digest : {Digest::NONE, Digest::MD5, Digest::SHA1, Digest::SHA_2_224, 2085 Digest::SHA_2_256, Digest::SHA_2_384, Digest::SHA_2_512}) { 2086 if (padding == PaddingMode::NONE && digest != Digest::NONE) { 2087 // Digesting only makes sense with padding. 2088 continue; 2089 } 2090 2091 if (padding == PaddingMode::RSA_PSS && digest == Digest::NONE) { 2092 // PSS requires digesting. 2093 continue; 2094 } 2095 2096 string signature = 2097 SignMessage(message, AuthorizationSetBuilder().Digest(digest).Padding(padding)); 2098 VerifyMessage(message, signature, 2099 AuthorizationSetBuilder().Digest(digest).Padding(padding)); 2100 2101 if (digest != Digest::NONE) { 2102 // Verify with OpenSSL. 2103 HidlBuf pubkey; 2104 ASSERT_EQ(ErrorCode::OK, ExportKey(KeyFormat::X509, &pubkey)); 2105 2106 const uint8_t* p = pubkey.data(); 2107 EVP_PKEY_Ptr pkey(d2i_PUBKEY(nullptr /* alloc new */, &p, pubkey.size())); 2108 ASSERT_TRUE(pkey.get()); 2109 2110 EVP_MD_CTX digest_ctx; 2111 EVP_MD_CTX_init(&digest_ctx); 2112 EVP_PKEY_CTX* pkey_ctx; 2113 const EVP_MD* md = openssl_digest(digest); 2114 ASSERT_NE(md, nullptr); 2115 EXPECT_EQ(1, EVP_DigestVerifyInit(&digest_ctx, &pkey_ctx, md, nullptr /* engine */, 2116 pkey.get())); 2117 2118 switch (padding) { 2119 case PaddingMode::RSA_PSS: 2120 EXPECT_GT(EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING), 0); 2121 EXPECT_GT(EVP_PKEY_CTX_set_rsa_pss_saltlen(pkey_ctx, EVP_MD_size(md)), 0); 2122 break; 2123 case PaddingMode::RSA_PKCS1_1_5_SIGN: 2124 // PKCS1 is the default; don't need to set anything. 2125 break; 2126 default: 2127 FAIL(); 2128 break; 2129 } 2130 2131 EXPECT_EQ(1, EVP_DigestVerifyUpdate(&digest_ctx, message.data(), message.size())); 2132 EXPECT_EQ(1, EVP_DigestVerifyFinal( 2133 &digest_ctx, reinterpret_cast<const uint8_t*>(signature.data()), 2134 signature.size())); 2135 EVP_MD_CTX_cleanup(&digest_ctx); 2136 } 2137 2138 // Corrupt signature shouldn't verify. 2139 string corrupt_signature(signature); 2140 ++corrupt_signature[corrupt_signature.size() / 2]; 2141 2142 EXPECT_EQ(ErrorCode::OK, 2143 Begin(KeyPurpose::VERIFY, 2144 AuthorizationSetBuilder().Digest(digest).Padding(padding))); 2145 string result; 2146 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(message, corrupt_signature, &result)); 2147 2148 // Corrupt message shouldn't verify 2149 EXPECT_EQ(ErrorCode::OK, 2150 Begin(KeyPurpose::VERIFY, 2151 AuthorizationSetBuilder().Digest(digest).Padding(padding))); 2152 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(corrupt_message, signature, &result)); 2153 } 2154 } 2155 } 2156 2157 /* 2158 * VerificationOperationsTest.RsaSuccess 2159 * 2160 * Verifies ECDSA signature/verification for all digests and curves. 2161 */ 2162 TEST_F(VerificationOperationsTest, EcdsaAllDigestsAndCurves) { 2163 auto digests = { 2164 Digest::NONE, Digest::SHA1, Digest::SHA_2_224, 2165 Digest::SHA_2_256, Digest::SHA_2_384, Digest::SHA_2_512, 2166 }; 2167 2168 string message = "1234567890"; 2169 string corrupt_message = "2234567890"; 2170 for (auto curve : {EcCurve::P_224, EcCurve::P_256, EcCurve::P_384, EcCurve::P_521}) { 2171 ErrorCode error = GenerateKey(AuthorizationSetBuilder() 2172 .Authorization(TAG_NO_AUTH_REQUIRED) 2173 .EcdsaSigningKey(curve) 2174 .Digest(digests)); 2175 EXPECT_EQ(ErrorCode::OK, error) << "Failed to generate key for EC curve " << curve; 2176 if (error != ErrorCode::OK) { 2177 continue; 2178 } 2179 2180 for (auto digest : digests) { 2181 string signature = SignMessage(message, AuthorizationSetBuilder().Digest(digest)); 2182 VerifyMessage(message, signature, AuthorizationSetBuilder().Digest(digest)); 2183 2184 // Verify with OpenSSL 2185 if (digest != Digest::NONE) { 2186 HidlBuf pubkey; 2187 ASSERT_EQ(ErrorCode::OK, ExportKey(KeyFormat::X509, &pubkey)) 2188 << curve << ' ' << digest; 2189 2190 const uint8_t* p = pubkey.data(); 2191 EVP_PKEY_Ptr pkey(d2i_PUBKEY(nullptr /* alloc new */, &p, pubkey.size())); 2192 ASSERT_TRUE(pkey.get()); 2193 2194 EVP_MD_CTX digest_ctx; 2195 EVP_MD_CTX_init(&digest_ctx); 2196 EVP_PKEY_CTX* pkey_ctx; 2197 const EVP_MD* md = openssl_digest(digest); 2198 2199 EXPECT_EQ(1, EVP_DigestVerifyInit(&digest_ctx, &pkey_ctx, md, nullptr /* engine */, 2200 pkey.get())) 2201 << curve << ' ' << digest; 2202 2203 EXPECT_EQ(1, EVP_DigestVerifyUpdate(&digest_ctx, message.data(), message.size())) 2204 << curve << ' ' << digest; 2205 2206 EXPECT_EQ(1, EVP_DigestVerifyFinal( 2207 &digest_ctx, reinterpret_cast<const uint8_t*>(signature.data()), 2208 signature.size())) 2209 << curve << ' ' << digest; 2210 2211 EVP_MD_CTX_cleanup(&digest_ctx); 2212 } 2213 2214 // Corrupt signature shouldn't verify. 2215 string corrupt_signature(signature); 2216 ++corrupt_signature[corrupt_signature.size() / 2]; 2217 2218 EXPECT_EQ(ErrorCode::OK, 2219 Begin(KeyPurpose::VERIFY, AuthorizationSetBuilder().Digest(digest))) 2220 << curve << ' ' << digest; 2221 2222 string result; 2223 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(message, corrupt_signature, &result)) 2224 << curve << ' ' << digest; 2225 2226 // Corrupt message shouldn't verify 2227 EXPECT_EQ(ErrorCode::OK, 2228 Begin(KeyPurpose::VERIFY, AuthorizationSetBuilder().Digest(digest))) 2229 << curve << ' ' << digest; 2230 2231 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(corrupt_message, signature, &result)) 2232 << curve << ' ' << digest; 2233 } 2234 2235 auto rc = DeleteKey(); 2236 ASSERT_TRUE(rc == ErrorCode::OK || rc == ErrorCode::UNIMPLEMENTED); 2237 } 2238 } 2239 2240 /* 2241 * VerificationOperationsTest.HmacSigningKeyCannotVerify 2242 * 2243 * Verifies HMAC signing and verification, but that a signing key cannot be used to verify. 2244 */ 2245 TEST_F(VerificationOperationsTest, HmacSigningKeyCannotVerify) { 2246 string key_material = "HelloThisIsAKey"; 2247 2248 HidlBuf signing_key, verification_key; 2249 KeyCharacteristics signing_key_chars, verification_key_chars; 2250 EXPECT_EQ(ErrorCode::OK, 2251 ImportKey(AuthorizationSetBuilder() 2252 .Authorization(TAG_NO_AUTH_REQUIRED) 2253 .Authorization(TAG_ALGORITHM, Algorithm::HMAC) 2254 .Authorization(TAG_PURPOSE, KeyPurpose::SIGN) 2255 .Digest(Digest::SHA1) 2256 .Authorization(TAG_MIN_MAC_LENGTH, 160), 2257 KeyFormat::RAW, key_material, &signing_key, &signing_key_chars)); 2258 EXPECT_EQ(ErrorCode::OK, 2259 ImportKey(AuthorizationSetBuilder() 2260 .Authorization(TAG_NO_AUTH_REQUIRED) 2261 .Authorization(TAG_ALGORITHM, Algorithm::HMAC) 2262 .Authorization(TAG_PURPOSE, KeyPurpose::VERIFY) 2263 .Digest(Digest::SHA1) 2264 .Authorization(TAG_MIN_MAC_LENGTH, 160), 2265 KeyFormat::RAW, key_material, &verification_key, &verification_key_chars)); 2266 2267 string message = "This is a message."; 2268 string signature = SignMessage( 2269 signing_key, message, 2270 AuthorizationSetBuilder().Digest(Digest::SHA1).Authorization(TAG_MAC_LENGTH, 160)); 2271 2272 // Signing key should not work. 2273 AuthorizationSet out_params; 2274 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PURPOSE, 2275 Begin(KeyPurpose::VERIFY, signing_key, AuthorizationSetBuilder().Digest(Digest::SHA1), 2276 &out_params, &op_handle_)); 2277 2278 // Verification key should work. 2279 VerifyMessage(verification_key, message, signature, 2280 AuthorizationSetBuilder().Digest(Digest::SHA1)); 2281 2282 CheckedDeleteKey(&signing_key); 2283 CheckedDeleteKey(&verification_key); 2284 } 2285 2286 typedef KeymasterHidlTest ExportKeyTest; 2287 2288 /* 2289 * ExportKeyTest.RsaUnsupportedKeyFormat 2290 * 2291 * Verifies that attempting to export RSA keys in PKCS#8 format fails with the correct error. 2292 */ 2293 TEST_F(ExportKeyTest, RsaUnsupportedKeyFormat) { 2294 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2295 .RsaSigningKey(1024, 3) 2296 .Digest(Digest::NONE) 2297 .Padding(PaddingMode::NONE))); 2298 HidlBuf export_data; 2299 ASSERT_EQ(ErrorCode::UNSUPPORTED_KEY_FORMAT, ExportKey(KeyFormat::PKCS8, &export_data)); 2300 } 2301 2302 /* 2303 * ExportKeyTest.RsaCorruptedKeyBlob 2304 * 2305 * Verifies that attempting to export RSA keys from corrupted key blobs fails. This is essentially 2306 * a poor-man's key blob fuzzer. 2307 */ 2308 TEST_F(ExportKeyTest, RsaCorruptedKeyBlob) { 2309 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2310 .Authorization(TAG_NO_AUTH_REQUIRED) 2311 .RsaSigningKey(1024, 3) 2312 .Digest(Digest::NONE) 2313 .Padding(PaddingMode::NONE))); 2314 for (size_t i = 0; i < key_blob_.size(); ++i) { 2315 HidlBuf corrupted(key_blob_); 2316 ++corrupted[i]; 2317 2318 HidlBuf export_data; 2319 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB, 2320 ExportKey(KeyFormat::X509, corrupted, HidlBuf(), HidlBuf(), &export_data)) 2321 << "Blob corrupted at offset " << i << " erroneously accepted as valid"; 2322 } 2323 } 2324 2325 /* 2326 * ExportKeyTest.RsaCorruptedKeyBlob 2327 * 2328 * Verifies that attempting to export ECDSA keys from corrupted key blobs fails. This is 2329 * essentially a poor-man's key blob fuzzer. 2330 */ 2331 TEST_F(ExportKeyTest, EcCorruptedKeyBlob) { 2332 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2333 .Authorization(TAG_NO_AUTH_REQUIRED) 2334 .EcdsaSigningKey(EcCurve::P_256) 2335 .Digest(Digest::NONE))); 2336 for (size_t i = 0; i < key_blob_.size(); ++i) { 2337 HidlBuf corrupted(key_blob_); 2338 ++corrupted[i]; 2339 2340 HidlBuf export_data; 2341 EXPECT_EQ(ErrorCode::INVALID_KEY_BLOB, 2342 ExportKey(KeyFormat::X509, corrupted, HidlBuf(), HidlBuf(), &export_data)) 2343 << "Blob corrupted at offset " << i << " erroneously accepted as valid"; 2344 } 2345 } 2346 2347 /* 2348 * ExportKeyTest.AesKeyUnexportable 2349 * 2350 * Verifies that attempting to export AES keys fails in the expected way. 2351 */ 2352 TEST_F(ExportKeyTest, AesKeyUnexportable) { 2353 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2354 .Authorization(TAG_NO_AUTH_REQUIRED) 2355 .AesEncryptionKey(128) 2356 .EcbMode() 2357 .Padding(PaddingMode::NONE))); 2358 2359 HidlBuf export_data; 2360 EXPECT_EQ(ErrorCode::UNSUPPORTED_KEY_FORMAT, ExportKey(KeyFormat::X509, &export_data)); 2361 EXPECT_EQ(ErrorCode::UNSUPPORTED_KEY_FORMAT, ExportKey(KeyFormat::PKCS8, &export_data)); 2362 EXPECT_EQ(ErrorCode::UNSUPPORTED_KEY_FORMAT, ExportKey(KeyFormat::RAW, &export_data)); 2363 } 2364 typedef KeymasterHidlTest ImportKeyTest; 2365 2366 /* 2367 * ImportKeyTest.RsaSuccess 2368 * 2369 * Verifies that importing and using an RSA key pair works correctly. 2370 */ 2371 TEST_F(ImportKeyTest, RsaSuccess) { 2372 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder() 2373 .Authorization(TAG_NO_AUTH_REQUIRED) 2374 .RsaSigningKey(1024, 65537) 2375 .Digest(Digest::SHA_2_256) 2376 .Padding(PaddingMode::RSA_PSS), 2377 KeyFormat::PKCS8, rsa_key)); 2378 2379 CheckKm0CryptoParam(TAG_ALGORITHM, Algorithm::RSA); 2380 CheckKm0CryptoParam(TAG_KEY_SIZE, 1024U); 2381 CheckKm0CryptoParam(TAG_RSA_PUBLIC_EXPONENT, 65537U); 2382 CheckKm1CryptoParam(TAG_DIGEST, Digest::SHA_2_256); 2383 CheckKm1CryptoParam(TAG_PADDING, PaddingMode::RSA_PSS); 2384 CheckOrigin(true /* asymmetric */); 2385 2386 string message(1024 / 8, 'a'); 2387 auto params = AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Padding(PaddingMode::RSA_PSS); 2388 string signature = SignMessage(message, params); 2389 VerifyMessage(message, signature, params); 2390 } 2391 2392 /* 2393 * ImportKeyTest.RsaKeySizeMismatch 2394 * 2395 * Verifies that importing an RSA key pair with a size that doesn't match the key fails in the 2396 * correct way. 2397 */ 2398 TEST_F(ImportKeyTest, RsaKeySizeMismatch) { 2399 ASSERT_EQ(ErrorCode::IMPORT_PARAMETER_MISMATCH, 2400 ImportKey(AuthorizationSetBuilder() 2401 .RsaSigningKey(2048 /* Doesn't match key */, 65537) 2402 .Digest(Digest::NONE) 2403 .Padding(PaddingMode::NONE), 2404 KeyFormat::PKCS8, rsa_key)); 2405 } 2406 2407 /* 2408 * ImportKeyTest.RsaPublicExponentMismatch 2409 * 2410 * Verifies that importing an RSA key pair with a public exponent that doesn't match the key fails 2411 * in the correct way. 2412 */ 2413 TEST_F(ImportKeyTest, RsaPublicExponentMismatch) { 2414 ASSERT_EQ(ErrorCode::IMPORT_PARAMETER_MISMATCH, 2415 ImportKey(AuthorizationSetBuilder() 2416 .RsaSigningKey(1024, 3 /* Doesn't match key */) 2417 .Digest(Digest::NONE) 2418 .Padding(PaddingMode::NONE), 2419 KeyFormat::PKCS8, rsa_key)); 2420 } 2421 2422 /* 2423 * ImportKeyTest.EcdsaSuccess 2424 * 2425 * Verifies that importing and using an ECDSA P-256 key pair works correctly. 2426 */ 2427 TEST_F(ImportKeyTest, EcdsaSuccess) { 2428 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder() 2429 .Authorization(TAG_NO_AUTH_REQUIRED) 2430 .EcdsaSigningKey(256) 2431 .Digest(Digest::SHA_2_256), 2432 KeyFormat::PKCS8, ec_256_key)) 2433 << "(Possibly b/33945114)"; 2434 2435 CheckKm0CryptoParam(TAG_ALGORITHM, Algorithm::EC); 2436 CheckKm0CryptoParam(TAG_KEY_SIZE, 256U); 2437 CheckKm1CryptoParam(TAG_DIGEST, Digest::SHA_2_256); 2438 CheckKm2CryptoParam(TAG_EC_CURVE, EcCurve::P_256); 2439 2440 CheckOrigin(true /* asymmetric */); 2441 2442 string message(32, 'a'); 2443 auto params = AuthorizationSetBuilder().Digest(Digest::SHA_2_256); 2444 string signature = SignMessage(message, params); 2445 VerifyMessage(message, signature, params); 2446 } 2447 2448 /* 2449 * ImportKeyTest.Ecdsa521Success 2450 * 2451 * Verifies that importing and using an ECDSA P-521 key pair works correctly. 2452 */ 2453 TEST_F(ImportKeyTest, Ecdsa521Success) { 2454 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder() 2455 .Authorization(TAG_NO_AUTH_REQUIRED) 2456 .EcdsaSigningKey(521) 2457 .Digest(Digest::SHA_2_256), 2458 KeyFormat::PKCS8, ec_521_key)) 2459 << "(Possibly b/33945114)"; 2460 2461 CheckKm0CryptoParam(TAG_ALGORITHM, Algorithm::EC); 2462 CheckKm0CryptoParam(TAG_KEY_SIZE, 521U); 2463 CheckKm1CryptoParam(TAG_DIGEST, Digest::SHA_2_256); 2464 CheckKm2CryptoParam(TAG_EC_CURVE, EcCurve::P_521); 2465 2466 CheckOrigin(true /* asymmetric */); 2467 2468 string message(32, 'a'); 2469 auto params = AuthorizationSetBuilder().Digest(Digest::SHA_2_256); 2470 string signature = SignMessage(message, params); 2471 VerifyMessage(message, signature, params); 2472 } 2473 2474 /* 2475 * ImportKeyTest.EcdsaSizeMismatch 2476 * 2477 * Verifies that importing an ECDSA key pair with a size that doesn't match the key fails in the 2478 * correct way. 2479 */ 2480 TEST_F(ImportKeyTest, EcdsaSizeMismatch) { 2481 ASSERT_EQ(ErrorCode::IMPORT_PARAMETER_MISMATCH, 2482 ImportKey(AuthorizationSetBuilder() 2483 .EcdsaSigningKey(224 /* Doesn't match key */) 2484 .Digest(Digest::NONE), 2485 KeyFormat::PKCS8, ec_256_key)); 2486 } 2487 2488 /* 2489 * ImportKeyTest.EcdsaCurveMismatch 2490 * 2491 * Verifies that importing an ECDSA key pair with a curve that doesn't match the key fails in the 2492 * correct way. 2493 */ 2494 TEST_F(ImportKeyTest, EcdsaCurveMismatch) { 2495 if (SupportsSymmetric() && !SupportsAttestation()) { 2496 // KM1 hardware doesn't know about curves 2497 return; 2498 } 2499 2500 ASSERT_EQ(ErrorCode::IMPORT_PARAMETER_MISMATCH, 2501 ImportKey(AuthorizationSetBuilder() 2502 .EcdsaSigningKey(EcCurve::P_224 /* Doesn't match key */) 2503 .Digest(Digest::NONE), 2504 KeyFormat::PKCS8, ec_256_key)) 2505 << "(Possibly b/36233241)"; 2506 } 2507 2508 /* 2509 * ImportKeyTest.AesSuccess 2510 * 2511 * Verifies that importing and using an AES key works. 2512 */ 2513 TEST_F(ImportKeyTest, AesSuccess) { 2514 string key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 2515 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder() 2516 .Authorization(TAG_NO_AUTH_REQUIRED) 2517 .AesEncryptionKey(key.size() * 8) 2518 .EcbMode() 2519 .Padding(PaddingMode::PKCS7), 2520 KeyFormat::RAW, key)); 2521 2522 CheckKm1CryptoParam(TAG_ALGORITHM, Algorithm::AES); 2523 CheckKm1CryptoParam(TAG_KEY_SIZE, 128U); 2524 CheckKm1CryptoParam(TAG_PADDING, PaddingMode::PKCS7); 2525 CheckKm1CryptoParam(TAG_BLOCK_MODE, BlockMode::ECB); 2526 CheckOrigin(); 2527 2528 string message = "Hello World!"; 2529 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7); 2530 string ciphertext = EncryptMessage(message, params); 2531 string plaintext = DecryptMessage(ciphertext, params); 2532 EXPECT_EQ(message, plaintext); 2533 } 2534 2535 /* 2536 * ImportKeyTest.AesSuccess 2537 * 2538 * Verifies that importing and using an HMAC key works. 2539 */ 2540 TEST_F(ImportKeyTest, HmacKeySuccess) { 2541 string key = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 2542 ASSERT_EQ(ErrorCode::OK, ImportKey(AuthorizationSetBuilder() 2543 .Authorization(TAG_NO_AUTH_REQUIRED) 2544 .HmacKey(key.size() * 8) 2545 .Digest(Digest::SHA_2_256) 2546 .Authorization(TAG_MIN_MAC_LENGTH, 256), 2547 KeyFormat::RAW, key)); 2548 2549 CheckKm1CryptoParam(TAG_ALGORITHM, Algorithm::HMAC); 2550 CheckKm1CryptoParam(TAG_KEY_SIZE, 128U); 2551 CheckKm1CryptoParam(TAG_DIGEST, Digest::SHA_2_256); 2552 CheckOrigin(); 2553 2554 string message = "Hello World!"; 2555 string signature = MacMessage(message, Digest::SHA_2_256, 256); 2556 VerifyMessage(message, signature, AuthorizationSetBuilder().Digest(Digest::SHA_2_256)); 2557 } 2558 2559 typedef KeymasterHidlTest EncryptionOperationsTest; 2560 2561 /* 2562 * EncryptionOperationsTest.RsaNoPaddingSuccess 2563 * 2564 * Verifies that raw RSA encryption works. 2565 */ 2566 TEST_F(EncryptionOperationsTest, RsaNoPaddingSuccess) { 2567 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2568 .Authorization(TAG_NO_AUTH_REQUIRED) 2569 .RsaEncryptionKey(1024, 3) 2570 .Padding(PaddingMode::NONE))); 2571 2572 string message = string(1024 / 8, 'a'); 2573 auto params = AuthorizationSetBuilder().Padding(PaddingMode::NONE); 2574 string ciphertext1 = EncryptMessage(message, params); 2575 EXPECT_EQ(1024U / 8, ciphertext1.size()); 2576 2577 string ciphertext2 = EncryptMessage(message, params); 2578 EXPECT_EQ(1024U / 8, ciphertext2.size()); 2579 2580 // Unpadded RSA is deterministic 2581 EXPECT_EQ(ciphertext1, ciphertext2); 2582 } 2583 2584 /* 2585 * EncryptionOperationsTest.RsaNoPaddingShortMessage 2586 * 2587 * Verifies that raw RSA encryption of short messages works. 2588 */ 2589 TEST_F(EncryptionOperationsTest, RsaNoPaddingShortMessage) { 2590 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2591 .Authorization(TAG_NO_AUTH_REQUIRED) 2592 .RsaEncryptionKey(1024, 3) 2593 .Padding(PaddingMode::NONE))); 2594 2595 string message = "1"; 2596 auto params = AuthorizationSetBuilder().Padding(PaddingMode::NONE); 2597 2598 string ciphertext = EncryptMessage(message, params); 2599 EXPECT_EQ(1024U / 8, ciphertext.size()); 2600 2601 string expected_plaintext = string(1024 / 8 - 1, 0) + message; 2602 string plaintext = DecryptMessage(ciphertext, params); 2603 2604 EXPECT_EQ(expected_plaintext, plaintext); 2605 2606 // Degenerate case, encrypting a numeric 1 yields 0x00..01 as the ciphertext. 2607 message = static_cast<char>(1); 2608 ciphertext = EncryptMessage(message, params); 2609 EXPECT_EQ(1024U / 8, ciphertext.size()); 2610 EXPECT_EQ(ciphertext, string(1024 / 8 - 1, 0) + message); 2611 } 2612 2613 /* 2614 * EncryptionOperationsTest.RsaNoPaddingTooLong 2615 * 2616 * Verifies that raw RSA encryption of too-long messages fails in the expected way. 2617 */ 2618 TEST_F(EncryptionOperationsTest, RsaNoPaddingTooLong) { 2619 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2620 .Authorization(TAG_NO_AUTH_REQUIRED) 2621 .RsaEncryptionKey(1024, 3) 2622 .Padding(PaddingMode::NONE))); 2623 2624 string message(1024 / 8 + 1, 'a'); 2625 2626 auto params = AuthorizationSetBuilder().Padding(PaddingMode::NONE); 2627 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params)); 2628 2629 string result; 2630 EXPECT_EQ(ErrorCode::INVALID_INPUT_LENGTH, Finish(message, &result)); 2631 } 2632 2633 /* 2634 * EncryptionOperationsTest.RsaNoPaddingTooLarge 2635 * 2636 * Verifies that raw RSA encryption of too-large (numerically) messages fails in the expected way. 2637 */ 2638 TEST_F(EncryptionOperationsTest, RsaNoPaddingTooLarge) { 2639 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2640 .Authorization(TAG_NO_AUTH_REQUIRED) 2641 .RsaEncryptionKey(1024, 3) 2642 .Padding(PaddingMode::NONE))); 2643 2644 HidlBuf exported; 2645 ASSERT_EQ(ErrorCode::OK, ExportKey(KeyFormat::X509, &exported)); 2646 2647 const uint8_t* p = exported.data(); 2648 EVP_PKEY_Ptr pkey(d2i_PUBKEY(nullptr /* alloc new */, &p, exported.size())); 2649 RSA_Ptr rsa(EVP_PKEY_get1_RSA(pkey.get())); 2650 2651 size_t modulus_len = BN_num_bytes(rsa->n); 2652 ASSERT_EQ(1024U / 8, modulus_len); 2653 std::unique_ptr<uint8_t[]> modulus_buf(new uint8_t[modulus_len]); 2654 BN_bn2bin(rsa->n, modulus_buf.get()); 2655 2656 // The modulus is too big to encrypt. 2657 string message(reinterpret_cast<const char*>(modulus_buf.get()), modulus_len); 2658 2659 auto params = AuthorizationSetBuilder().Padding(PaddingMode::NONE); 2660 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params)); 2661 2662 string result; 2663 EXPECT_EQ(ErrorCode::INVALID_ARGUMENT, Finish(message, &result)); 2664 2665 // One smaller than the modulus is okay. 2666 BN_sub(rsa->n, rsa->n, BN_value_one()); 2667 modulus_len = BN_num_bytes(rsa->n); 2668 ASSERT_EQ(1024U / 8, modulus_len); 2669 BN_bn2bin(rsa->n, modulus_buf.get()); 2670 message = string(reinterpret_cast<const char*>(modulus_buf.get()), modulus_len); 2671 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params)); 2672 EXPECT_EQ(ErrorCode::OK, Finish(message, &result)); 2673 } 2674 2675 /* 2676 * EncryptionOperationsTest.RsaOaepSuccess 2677 * 2678 * Verifies that RSA-OAEP encryption operations work, with all digests. 2679 */ 2680 TEST_F(EncryptionOperationsTest, RsaOaepSuccess) { 2681 auto digests = {Digest::MD5, Digest::SHA1, Digest::SHA_2_224, 2682 Digest::SHA_2_256, Digest::SHA_2_384, Digest::SHA_2_512}; 2683 2684 size_t key_size = 2048; // Need largish key for SHA-512 test. 2685 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2686 .Authorization(TAG_NO_AUTH_REQUIRED) 2687 .RsaEncryptionKey(key_size, 3) 2688 .Padding(PaddingMode::RSA_OAEP) 2689 .Digest(digests))); 2690 2691 string message = "Hello"; 2692 2693 for (auto digest : digests) { 2694 auto params = AuthorizationSetBuilder().Digest(digest).Padding(PaddingMode::RSA_OAEP); 2695 string ciphertext1 = EncryptMessage(message, params); 2696 if (HasNonfatalFailure()) std::cout << "-->" << digest << std::endl; 2697 EXPECT_EQ(key_size / 8, ciphertext1.size()); 2698 2699 string ciphertext2 = EncryptMessage(message, params); 2700 EXPECT_EQ(key_size / 8, ciphertext2.size()); 2701 2702 // OAEP randomizes padding so every result should be different (with astronomically high 2703 // probability). 2704 EXPECT_NE(ciphertext1, ciphertext2); 2705 2706 string plaintext1 = DecryptMessage(ciphertext1, params); 2707 EXPECT_EQ(message, plaintext1) << "RSA-OAEP failed with digest " << digest; 2708 string plaintext2 = DecryptMessage(ciphertext2, params); 2709 EXPECT_EQ(message, plaintext2) << "RSA-OAEP failed with digest " << digest; 2710 2711 // Decrypting corrupted ciphertext should fail. 2712 size_t offset_to_corrupt = random() % ciphertext1.size(); 2713 char corrupt_byte; 2714 do { 2715 corrupt_byte = static_cast<char>(random() % 256); 2716 } while (corrupt_byte == ciphertext1[offset_to_corrupt]); 2717 ciphertext1[offset_to_corrupt] = corrupt_byte; 2718 2719 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params)); 2720 string result; 2721 EXPECT_EQ(ErrorCode::UNKNOWN_ERROR, Finish(ciphertext1, &result)); 2722 EXPECT_EQ(0U, result.size()); 2723 } 2724 } 2725 2726 /* 2727 * EncryptionOperationsTest.RsaOaepInvalidDigest 2728 * 2729 * Verifies that RSA-OAEP encryption operations fail in the correct way when asked to operate 2730 * without a digest. 2731 */ 2732 TEST_F(EncryptionOperationsTest, RsaOaepInvalidDigest) { 2733 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2734 .Authorization(TAG_NO_AUTH_REQUIRED) 2735 .RsaEncryptionKey(1024, 3) 2736 .Padding(PaddingMode::RSA_OAEP) 2737 .Digest(Digest::NONE))); 2738 string message = "Hello World!"; 2739 2740 auto params = AuthorizationSetBuilder().Padding(PaddingMode::RSA_OAEP).Digest(Digest::NONE); 2741 EXPECT_EQ(ErrorCode::INCOMPATIBLE_DIGEST, Begin(KeyPurpose::ENCRYPT, params)); 2742 } 2743 2744 /* 2745 * EncryptionOperationsTest.RsaOaepInvalidDigest 2746 * 2747 * Verifies that RSA-OAEP encryption operations fail in the correct way when asked to decrypt with a 2748 * different digest than was used to encrypt. 2749 */ 2750 TEST_F(EncryptionOperationsTest, RsaOaepDecryptWithWrongDigest) { 2751 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2752 .Authorization(TAG_NO_AUTH_REQUIRED) 2753 .RsaEncryptionKey(1024, 3) 2754 .Padding(PaddingMode::RSA_OAEP) 2755 .Digest(Digest::SHA_2_256, Digest::SHA_2_224))); 2756 string message = "Hello World!"; 2757 string ciphertext = EncryptMessage( 2758 message, 2759 AuthorizationSetBuilder().Digest(Digest::SHA_2_224).Padding(PaddingMode::RSA_OAEP)); 2760 2761 EXPECT_EQ( 2762 ErrorCode::OK, 2763 Begin(KeyPurpose::DECRYPT, 2764 AuthorizationSetBuilder().Digest(Digest::SHA_2_256).Padding(PaddingMode::RSA_OAEP))); 2765 string result; 2766 EXPECT_EQ(ErrorCode::UNKNOWN_ERROR, Finish(ciphertext, &result)); 2767 EXPECT_EQ(0U, result.size()); 2768 } 2769 2770 /* 2771 * EncryptionOperationsTest.RsaOaepTooLarge 2772 * 2773 * Verifies that RSA-OAEP encryption operations fail in the correct way when asked to encrypt a 2774 * too-large message. 2775 */ 2776 TEST_F(EncryptionOperationsTest, RsaOaepTooLarge) { 2777 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2778 .Authorization(TAG_NO_AUTH_REQUIRED) 2779 .RsaEncryptionKey(1024, 3) 2780 .Padding(PaddingMode::RSA_OAEP) 2781 .Digest(Digest::SHA1))); 2782 constexpr size_t digest_size = 160 /* SHA1 */ / 8; 2783 constexpr size_t oaep_overhead = 2 * digest_size + 2; 2784 string message(1024 / 8 - oaep_overhead + 1, 'a'); 2785 EXPECT_EQ(ErrorCode::OK, 2786 Begin(KeyPurpose::ENCRYPT, 2787 AuthorizationSetBuilder().Padding(PaddingMode::RSA_OAEP).Digest(Digest::SHA1))); 2788 string result; 2789 auto error = Finish(message, &result); 2790 EXPECT_TRUE(error == ErrorCode::INVALID_INPUT_LENGTH || error == ErrorCode::INVALID_ARGUMENT); 2791 EXPECT_EQ(0U, result.size()); 2792 } 2793 2794 /* 2795 * EncryptionOperationsTest.RsaPkcs1Success 2796 * 2797 * Verifies that RSA PKCS encryption/decrypts works. 2798 */ 2799 TEST_F(EncryptionOperationsTest, RsaPkcs1Success) { 2800 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2801 .Authorization(TAG_NO_AUTH_REQUIRED) 2802 .RsaEncryptionKey(1024, 3) 2803 .Padding(PaddingMode::RSA_PKCS1_1_5_ENCRYPT))); 2804 2805 string message = "Hello World!"; 2806 auto params = AuthorizationSetBuilder().Padding(PaddingMode::RSA_PKCS1_1_5_ENCRYPT); 2807 string ciphertext1 = EncryptMessage(message, params); 2808 EXPECT_EQ(1024U / 8, ciphertext1.size()); 2809 2810 string ciphertext2 = EncryptMessage(message, params); 2811 EXPECT_EQ(1024U / 8, ciphertext2.size()); 2812 2813 // PKCS1 v1.5 randomizes padding so every result should be different. 2814 EXPECT_NE(ciphertext1, ciphertext2); 2815 2816 string plaintext = DecryptMessage(ciphertext1, params); 2817 EXPECT_EQ(message, plaintext); 2818 2819 // Decrypting corrupted ciphertext should fail. 2820 size_t offset_to_corrupt = random() % ciphertext1.size(); 2821 char corrupt_byte; 2822 do { 2823 corrupt_byte = static_cast<char>(random() % 256); 2824 } while (corrupt_byte == ciphertext1[offset_to_corrupt]); 2825 ciphertext1[offset_to_corrupt] = corrupt_byte; 2826 2827 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params)); 2828 string result; 2829 EXPECT_EQ(ErrorCode::UNKNOWN_ERROR, Finish(ciphertext1, &result)); 2830 EXPECT_EQ(0U, result.size()); 2831 } 2832 2833 /* 2834 * EncryptionOperationsTest.RsaPkcs1TooLarge 2835 * 2836 * Verifies that RSA PKCS encryption fails in the correct way when the mssage is too large. 2837 */ 2838 TEST_F(EncryptionOperationsTest, RsaPkcs1TooLarge) { 2839 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2840 .Authorization(TAG_NO_AUTH_REQUIRED) 2841 .RsaEncryptionKey(1024, 3) 2842 .Padding(PaddingMode::RSA_PKCS1_1_5_ENCRYPT))); 2843 string message(1024 / 8 - 10, 'a'); 2844 2845 auto params = AuthorizationSetBuilder().Padding(PaddingMode::RSA_PKCS1_1_5_ENCRYPT); 2846 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params)); 2847 string result; 2848 auto error = Finish(message, &result); 2849 EXPECT_TRUE(error == ErrorCode::INVALID_INPUT_LENGTH || error == ErrorCode::INVALID_ARGUMENT); 2850 EXPECT_EQ(0U, result.size()); 2851 } 2852 2853 /* 2854 * EncryptionOperationsTest.EcdsaEncrypt 2855 * 2856 * Verifies that attempting to use ECDSA keys to encrypt fails in the correct way. 2857 */ 2858 TEST_F(EncryptionOperationsTest, EcdsaEncrypt) { 2859 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2860 .Authorization(TAG_NO_AUTH_REQUIRED) 2861 .EcdsaSigningKey(224) 2862 .Digest(Digest::NONE))); 2863 auto params = AuthorizationSetBuilder().Digest(Digest::NONE); 2864 ASSERT_EQ(ErrorCode::UNSUPPORTED_PURPOSE, Begin(KeyPurpose::ENCRYPT, params)) 2865 << "(Possibly b/33543625)"; 2866 ASSERT_EQ(ErrorCode::UNSUPPORTED_PURPOSE, Begin(KeyPurpose::DECRYPT, params)) 2867 << "(Possibly b/33543625)"; 2868 } 2869 2870 /* 2871 * EncryptionOperationsTest.HmacEncrypt 2872 * 2873 * Verifies that attempting to use HMAC keys to encrypt fails in the correct way. 2874 */ 2875 TEST_F(EncryptionOperationsTest, HmacEncrypt) { 2876 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2877 .Authorization(TAG_NO_AUTH_REQUIRED) 2878 .HmacKey(128) 2879 .Digest(Digest::SHA_2_256) 2880 .Padding(PaddingMode::NONE) 2881 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 2882 auto params = AuthorizationSetBuilder() 2883 .Digest(Digest::SHA_2_256) 2884 .Padding(PaddingMode::NONE) 2885 .Authorization(TAG_MAC_LENGTH, 128); 2886 ASSERT_EQ(ErrorCode::UNSUPPORTED_PURPOSE, Begin(KeyPurpose::ENCRYPT, params)) 2887 << "(Possibly b/33543625)"; 2888 ASSERT_EQ(ErrorCode::UNSUPPORTED_PURPOSE, Begin(KeyPurpose::DECRYPT, params)) 2889 << "(Possibly b/33543625)"; 2890 } 2891 2892 /* 2893 * EncryptionOperationsTest.AesEcbRoundTripSuccess 2894 * 2895 * Verifies that AES ECB mode works. 2896 */ 2897 TEST_F(EncryptionOperationsTest, AesEcbRoundTripSuccess) { 2898 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2899 .Authorization(TAG_NO_AUTH_REQUIRED) 2900 .AesEncryptionKey(128) 2901 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB) 2902 .Padding(PaddingMode::NONE))); 2903 2904 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::NONE); 2905 2906 // Two-block message. 2907 string message = "12345678901234567890123456789012"; 2908 string ciphertext1 = EncryptMessage(message, params); 2909 EXPECT_EQ(message.size(), ciphertext1.size()); 2910 2911 string ciphertext2 = EncryptMessage(string(message), params); 2912 EXPECT_EQ(message.size(), ciphertext2.size()); 2913 2914 // ECB is deterministic. 2915 EXPECT_EQ(ciphertext1, ciphertext2); 2916 2917 string plaintext = DecryptMessage(ciphertext1, params); 2918 EXPECT_EQ(message, plaintext); 2919 } 2920 2921 /* 2922 * EncryptionOperationsTest.AesEcbRoundTripSuccess 2923 * 2924 * Verifies that AES encryption fails in the correct way when an unauthorized mode is specified. 2925 */ 2926 TEST_F(EncryptionOperationsTest, AesWrongMode) { 2927 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2928 .Authorization(TAG_NO_AUTH_REQUIRED) 2929 .AesEncryptionKey(128) 2930 .Authorization(TAG_BLOCK_MODE, BlockMode::CBC) 2931 .Padding(PaddingMode::NONE))); 2932 // Two-block message. 2933 string message = "12345678901234567890123456789012"; 2934 EXPECT_EQ( 2935 ErrorCode::INCOMPATIBLE_BLOCK_MODE, 2936 Begin(KeyPurpose::ENCRYPT, 2937 AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::NONE))); 2938 } 2939 2940 /* 2941 * EncryptionOperationsTest.AesEcbNoPaddingWrongInputSize 2942 * 2943 * Verifies that AES encryption fails in the correct way when provided an input that is not a 2944 * multiple of the block size and no padding is specified. 2945 */ 2946 TEST_F(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) { 2947 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2948 .Authorization(TAG_NO_AUTH_REQUIRED) 2949 .AesEncryptionKey(128) 2950 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB) 2951 .Padding(PaddingMode::NONE))); 2952 // Message is slightly shorter than two blocks. 2953 string message(16 * 2 - 1, 'a'); 2954 2955 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::NONE); 2956 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params)); 2957 string ciphertext; 2958 EXPECT_EQ(ErrorCode::INVALID_INPUT_LENGTH, Finish(message, &ciphertext)); 2959 EXPECT_EQ(0U, ciphertext.size()); 2960 } 2961 2962 /* 2963 * EncryptionOperationsTest.AesEcbPkcs7Padding 2964 * 2965 * Verifies that AES PKCS7 padding works for any message length. 2966 */ 2967 TEST_F(EncryptionOperationsTest, AesEcbPkcs7Padding) { 2968 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2969 .Authorization(TAG_NO_AUTH_REQUIRED) 2970 .AesEncryptionKey(128) 2971 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB) 2972 .Padding(PaddingMode::PKCS7))); 2973 2974 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7); 2975 2976 // Try various message lengths; all should work. 2977 for (size_t i = 0; i < 32; ++i) { 2978 string message(i, 'a'); 2979 string ciphertext = EncryptMessage(message, params); 2980 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size()); 2981 string plaintext = DecryptMessage(ciphertext, params); 2982 EXPECT_EQ(message, plaintext); 2983 } 2984 } 2985 2986 /* 2987 * EncryptionOperationsTest.AesEcbWrongPadding 2988 * 2989 * Verifies that AES enryption fails in the correct way when an unauthorized padding mode is 2990 * specified. 2991 */ 2992 TEST_F(EncryptionOperationsTest, AesEcbWrongPadding) { 2993 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 2994 .Authorization(TAG_NO_AUTH_REQUIRED) 2995 .AesEncryptionKey(128) 2996 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB) 2997 .Padding(PaddingMode::NONE))); 2998 2999 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7); 3000 3001 // Try various message lengths; all should fail 3002 for (size_t i = 0; i < 32; ++i) { 3003 string message(i, 'a'); 3004 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PADDING_MODE, Begin(KeyPurpose::ENCRYPT, params)); 3005 } 3006 } 3007 3008 /* 3009 * EncryptionOperationsTest.AesEcbPkcs7PaddingCorrupted 3010 * 3011 * Verifies that AES decryption fails in the correct way when the padding is corrupted. 3012 */ 3013 TEST_F(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) { 3014 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3015 .Authorization(TAG_NO_AUTH_REQUIRED) 3016 .AesEncryptionKey(128) 3017 .Authorization(TAG_BLOCK_MODE, BlockMode::ECB) 3018 .Padding(PaddingMode::PKCS7))); 3019 3020 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::ECB).Padding(PaddingMode::PKCS7); 3021 3022 string message = "a"; 3023 string ciphertext = EncryptMessage(message, params); 3024 EXPECT_EQ(16U, ciphertext.size()); 3025 EXPECT_NE(ciphertext, message); 3026 ++ciphertext[ciphertext.size() / 2]; 3027 3028 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params)); 3029 string plaintext; 3030 EXPECT_EQ(ErrorCode::INVALID_INPUT_LENGTH, Finish(message, &plaintext)); 3031 } 3032 3033 HidlBuf CopyIv(const AuthorizationSet& set) { 3034 auto iv = set.GetTagValue(TAG_NONCE); 3035 EXPECT_TRUE(iv.isOk()); 3036 return iv.value(); 3037 } 3038 3039 /* 3040 * EncryptionOperationsTest.AesCtrRoundTripSuccess 3041 * 3042 * Verifies that AES CTR mode works. 3043 */ 3044 TEST_F(EncryptionOperationsTest, AesCtrRoundTripSuccess) { 3045 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3046 .Authorization(TAG_NO_AUTH_REQUIRED) 3047 .AesEncryptionKey(128) 3048 .Authorization(TAG_BLOCK_MODE, BlockMode::CTR) 3049 .Padding(PaddingMode::NONE))); 3050 3051 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::CTR).Padding(PaddingMode::NONE); 3052 3053 string message = "123"; 3054 AuthorizationSet out_params; 3055 string ciphertext1 = EncryptMessage(message, params, &out_params); 3056 HidlBuf iv1 = CopyIv(out_params); 3057 EXPECT_EQ(16U, iv1.size()); 3058 3059 EXPECT_EQ(message.size(), ciphertext1.size()); 3060 3061 out_params.Clear(); 3062 string ciphertext2 = EncryptMessage(message, params, &out_params); 3063 HidlBuf iv2 = CopyIv(out_params); 3064 EXPECT_EQ(16U, iv2.size()); 3065 3066 // IVs should be random, so ciphertexts should differ. 3067 EXPECT_NE(ciphertext1, ciphertext2); 3068 3069 auto params_iv1 = 3070 AuthorizationSetBuilder().Authorizations(params).Authorization(TAG_NONCE, iv1); 3071 auto params_iv2 = 3072 AuthorizationSetBuilder().Authorizations(params).Authorization(TAG_NONCE, iv2); 3073 3074 string plaintext = DecryptMessage(ciphertext1, params_iv1); 3075 EXPECT_EQ(message, plaintext); 3076 plaintext = DecryptMessage(ciphertext2, params_iv2); 3077 EXPECT_EQ(message, plaintext); 3078 3079 // Using the wrong IV will result in a "valid" decryption, but the data will be garbage. 3080 plaintext = DecryptMessage(ciphertext1, params_iv2); 3081 EXPECT_NE(message, plaintext); 3082 plaintext = DecryptMessage(ciphertext2, params_iv1); 3083 EXPECT_NE(message, plaintext); 3084 } 3085 3086 /* 3087 * EncryptionOperationsTest.AesIncremental 3088 * 3089 * Verifies that AES works, all modes, when provided data in various size increments. 3090 */ 3091 TEST_F(EncryptionOperationsTest, AesIncremental) { 3092 auto block_modes = { 3093 BlockMode::ECB, BlockMode::CBC, BlockMode::CTR, BlockMode::GCM, 3094 }; 3095 3096 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3097 .Authorization(TAG_NO_AUTH_REQUIRED) 3098 .AesEncryptionKey(128) 3099 .BlockMode(block_modes) 3100 .Padding(PaddingMode::NONE) 3101 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3102 3103 for (int increment = 1; increment <= 240; ++increment) { 3104 for (auto block_mode : block_modes) { 3105 string message(240, 'a'); 3106 auto params = AuthorizationSetBuilder() 3107 .BlockMode(block_mode) 3108 .Padding(PaddingMode::NONE) 3109 .Authorization(TAG_MAC_LENGTH, 128) /* for GCM */; 3110 3111 AuthorizationSet output_params; 3112 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params, &output_params)); 3113 3114 string ciphertext; 3115 size_t input_consumed; 3116 string to_send; 3117 for (size_t i = 0; i < message.size(); i += increment) { 3118 to_send.append(message.substr(i, increment)); 3119 EXPECT_EQ(ErrorCode::OK, Update(to_send, &ciphertext, &input_consumed)); 3120 to_send = to_send.substr(input_consumed); 3121 3122 switch (block_mode) { 3123 case BlockMode::ECB: 3124 case BlockMode::CBC: 3125 // Implementations must take as many blocks as possible, leaving less than 3126 // a block. 3127 EXPECT_LE(to_send.length(), 16U); 3128 break; 3129 case BlockMode::GCM: 3130 case BlockMode::CTR: 3131 // Implementations must always take all the data. 3132 EXPECT_EQ(0U, to_send.length()); 3133 break; 3134 } 3135 } 3136 EXPECT_EQ(ErrorCode::OK, Finish(to_send, &ciphertext)) << "Error sending " << to_send; 3137 3138 switch (block_mode) { 3139 case BlockMode::GCM: 3140 EXPECT_EQ(message.size() + 16, ciphertext.size()); 3141 break; 3142 case BlockMode::CTR: 3143 EXPECT_EQ(message.size(), ciphertext.size()); 3144 break; 3145 case BlockMode::CBC: 3146 case BlockMode::ECB: 3147 EXPECT_EQ(message.size() + message.size() % 16, ciphertext.size()); 3148 break; 3149 } 3150 3151 auto iv = output_params.GetTagValue(TAG_NONCE); 3152 switch (block_mode) { 3153 case BlockMode::CBC: 3154 case BlockMode::GCM: 3155 case BlockMode::CTR: 3156 ASSERT_TRUE(iv.isOk()) << "No IV for block mode " << block_mode; 3157 EXPECT_EQ(block_mode == BlockMode::GCM ? 12U : 16U, iv.value().size()); 3158 params.push_back(TAG_NONCE, iv.value()); 3159 break; 3160 3161 case BlockMode::ECB: 3162 EXPECT_FALSE(iv.isOk()) << "ECB mode should not generate IV"; 3163 break; 3164 } 3165 3166 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params)) 3167 << "Decrypt begin() failed for block mode " << block_mode; 3168 3169 string plaintext; 3170 for (size_t i = 0; i < ciphertext.size(); i += increment) { 3171 to_send.append(ciphertext.substr(i, increment)); 3172 EXPECT_EQ(ErrorCode::OK, Update(to_send, &plaintext, &input_consumed)); 3173 to_send = to_send.substr(input_consumed); 3174 } 3175 ErrorCode error = Finish(to_send, &plaintext); 3176 ASSERT_EQ(ErrorCode::OK, error) 3177 << "Decryption failed for block mode " << block_mode << " and increment " 3178 << increment << " (Possibly b/33584622)"; 3179 if (error == ErrorCode::OK) { 3180 ASSERT_EQ(message, plaintext) << "Decryption didn't match for block mode " 3181 << block_mode << " and increment " << increment; 3182 } 3183 } 3184 } 3185 } 3186 3187 struct AesCtrSp80038aTestVector { 3188 const char* key; 3189 const char* nonce; 3190 const char* plaintext; 3191 const char* ciphertext; 3192 }; 3193 3194 // These test vectors are taken from 3195 // http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5. 3196 static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = { 3197 // AES-128 3198 { 3199 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", 3200 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51" 3201 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", 3202 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff" 3203 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee", 3204 }, 3205 // AES-192 3206 { 3207 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", 3208 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51" 3209 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", 3210 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94" 3211 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050", 3212 }, 3213 // AES-256 3214 { 3215 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", 3216 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", 3217 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51" 3218 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", 3219 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5" 3220 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6", 3221 }, 3222 }; 3223 3224 /* 3225 * EncryptionOperationsTest.AesCtrSp80038aTestVector 3226 * 3227 * Verifies AES CTR implementation against SP800-38A test vectors. 3228 */ 3229 TEST_F(EncryptionOperationsTest, AesCtrSp80038aTestVector) { 3230 for (size_t i = 0; i < 3; i++) { 3231 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]); 3232 const string key = hex2str(test.key); 3233 const string nonce = hex2str(test.nonce); 3234 const string plaintext = hex2str(test.plaintext); 3235 const string ciphertext = hex2str(test.ciphertext); 3236 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext); 3237 } 3238 } 3239 3240 /* 3241 * EncryptionOperationsTest.AesCtrIncompatiblePaddingMode 3242 * 3243 * Verifies that keymaster rejects use of CTR mode with PKCS7 padding in the correct way. 3244 */ 3245 TEST_F(EncryptionOperationsTest, AesCtrIncompatiblePaddingMode) { 3246 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3247 .Authorization(TAG_NO_AUTH_REQUIRED) 3248 .AesEncryptionKey(128) 3249 .Authorization(TAG_BLOCK_MODE, BlockMode::CTR) 3250 .Padding(PaddingMode::PKCS7))); 3251 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::CTR).Padding(PaddingMode::NONE); 3252 EXPECT_EQ(ErrorCode::INCOMPATIBLE_PADDING_MODE, Begin(KeyPurpose::ENCRYPT, params)); 3253 } 3254 3255 /* 3256 * EncryptionOperationsTest.AesCtrInvalidCallerNonce 3257 * 3258 * Verifies that keymaster fails correctly when the user supplies an incorrect-size nonce. 3259 */ 3260 TEST_F(EncryptionOperationsTest, AesCtrInvalidCallerNonce) { 3261 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3262 .Authorization(TAG_NO_AUTH_REQUIRED) 3263 .AesEncryptionKey(128) 3264 .Authorization(TAG_BLOCK_MODE, BlockMode::CTR) 3265 .Authorization(TAG_CALLER_NONCE) 3266 .Padding(PaddingMode::NONE))); 3267 3268 auto params = AuthorizationSetBuilder() 3269 .BlockMode(BlockMode::CTR) 3270 .Padding(PaddingMode::NONE) 3271 .Authorization(TAG_NONCE, HidlBuf(string(1, 'a'))); 3272 EXPECT_EQ(ErrorCode::INVALID_NONCE, Begin(KeyPurpose::ENCRYPT, params)); 3273 3274 params = AuthorizationSetBuilder() 3275 .BlockMode(BlockMode::CTR) 3276 .Padding(PaddingMode::NONE) 3277 .Authorization(TAG_NONCE, HidlBuf(string(15, 'a'))); 3278 EXPECT_EQ(ErrorCode::INVALID_NONCE, Begin(KeyPurpose::ENCRYPT, params)); 3279 3280 params = AuthorizationSetBuilder() 3281 .BlockMode(BlockMode::CTR) 3282 .Padding(PaddingMode::NONE) 3283 .Authorization(TAG_NONCE, HidlBuf(string(17, 'a'))); 3284 EXPECT_EQ(ErrorCode::INVALID_NONCE, Begin(KeyPurpose::ENCRYPT, params)); 3285 } 3286 3287 /* 3288 * EncryptionOperationsTest.AesCtrInvalidCallerNonce 3289 * 3290 * Verifies that keymaster fails correctly when the user supplies an incorrect-size nonce. 3291 */ 3292 TEST_F(EncryptionOperationsTest, AesCbcRoundTripSuccess) { 3293 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3294 .Authorization(TAG_NO_AUTH_REQUIRED) 3295 .AesEncryptionKey(128) 3296 .Authorization(TAG_BLOCK_MODE, BlockMode::CBC) 3297 .Padding(PaddingMode::NONE))); 3298 // Two-block message. 3299 string message = "12345678901234567890123456789012"; 3300 auto params = AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::NONE); 3301 AuthorizationSet out_params; 3302 string ciphertext1 = EncryptMessage(message, params, &out_params); 3303 HidlBuf iv1 = CopyIv(out_params); 3304 EXPECT_EQ(message.size(), ciphertext1.size()); 3305 3306 out_params.Clear(); 3307 3308 string ciphertext2 = EncryptMessage(message, params, &out_params); 3309 HidlBuf iv2 = CopyIv(out_params); 3310 EXPECT_EQ(message.size(), ciphertext2.size()); 3311 3312 // IVs should be random, so ciphertexts should differ. 3313 EXPECT_NE(ciphertext1, ciphertext2); 3314 3315 params.push_back(TAG_NONCE, iv1); 3316 string plaintext = DecryptMessage(ciphertext1, params); 3317 EXPECT_EQ(message, plaintext); 3318 } 3319 3320 /* 3321 * EncryptionOperationsTest.AesCallerNonce 3322 * 3323 * Verifies that AES caller-provided nonces work correctly. 3324 */ 3325 TEST_F(EncryptionOperationsTest, AesCallerNonce) { 3326 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3327 .Authorization(TAG_NO_AUTH_REQUIRED) 3328 .AesEncryptionKey(128) 3329 .Authorization(TAG_BLOCK_MODE, BlockMode::CBC) 3330 .Authorization(TAG_CALLER_NONCE) 3331 .Padding(PaddingMode::NONE))); 3332 3333 string message = "12345678901234567890123456789012"; 3334 3335 // Don't specify nonce, should get a random one. 3336 AuthorizationSetBuilder params = 3337 AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::NONE); 3338 AuthorizationSet out_params; 3339 string ciphertext = EncryptMessage(message, params, &out_params); 3340 EXPECT_EQ(message.size(), ciphertext.size()); 3341 EXPECT_EQ(16U, out_params.GetTagValue(TAG_NONCE).value().size()); 3342 3343 params.push_back(TAG_NONCE, out_params.GetTagValue(TAG_NONCE).value()); 3344 string plaintext = DecryptMessage(ciphertext, params); 3345 EXPECT_EQ(message, plaintext); 3346 3347 // Now specify a nonce, should also work. 3348 params = AuthorizationSetBuilder() 3349 .BlockMode(BlockMode::CBC) 3350 .Padding(PaddingMode::NONE) 3351 .Authorization(TAG_NONCE, HidlBuf("abcdefghijklmnop")); 3352 out_params.Clear(); 3353 ciphertext = EncryptMessage(message, params, &out_params); 3354 3355 // Decrypt with correct nonce. 3356 plaintext = DecryptMessage(ciphertext, params); 3357 EXPECT_EQ(message, plaintext); 3358 3359 // Try with wrong nonce. 3360 params = AuthorizationSetBuilder() 3361 .BlockMode(BlockMode::CBC) 3362 .Padding(PaddingMode::NONE) 3363 .Authorization(TAG_NONCE, HidlBuf("aaaaaaaaaaaaaaaa")); 3364 plaintext = DecryptMessage(ciphertext, params); 3365 EXPECT_NE(message, plaintext); 3366 } 3367 3368 /* 3369 * EncryptionOperationsTest.AesCallerNonceProhibited 3370 * 3371 * Verifies that caller-provided nonces are not permitted when not specified in the key 3372 * authorizations. 3373 */ 3374 TEST_F(EncryptionOperationsTest, AesCallerNonceProhibited) { 3375 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3376 .Authorization(TAG_NO_AUTH_REQUIRED) 3377 .AesEncryptionKey(128) 3378 .Authorization(TAG_BLOCK_MODE, BlockMode::CBC) 3379 .Padding(PaddingMode::NONE))); 3380 3381 string message = "12345678901234567890123456789012"; 3382 3383 // Don't specify nonce, should get a random one. 3384 AuthorizationSetBuilder params = 3385 AuthorizationSetBuilder().BlockMode(BlockMode::CBC).Padding(PaddingMode::NONE); 3386 AuthorizationSet out_params; 3387 string ciphertext = EncryptMessage(message, params, &out_params); 3388 EXPECT_EQ(message.size(), ciphertext.size()); 3389 EXPECT_EQ(16U, out_params.GetTagValue(TAG_NONCE).value().size()); 3390 3391 params.push_back(TAG_NONCE, out_params.GetTagValue(TAG_NONCE).value()); 3392 string plaintext = DecryptMessage(ciphertext, params); 3393 EXPECT_EQ(message, plaintext); 3394 3395 // Now specify a nonce, should fail 3396 params = AuthorizationSetBuilder() 3397 .BlockMode(BlockMode::CBC) 3398 .Padding(PaddingMode::NONE) 3399 .Authorization(TAG_NONCE, HidlBuf("abcdefghijklmnop")); 3400 out_params.Clear(); 3401 EXPECT_EQ(ErrorCode::CALLER_NONCE_PROHIBITED, Begin(KeyPurpose::ENCRYPT, params, &out_params)); 3402 } 3403 3404 /* 3405 * EncryptionOperationsTest.AesGcmRoundTripSuccess 3406 * 3407 * Verifies that AES GCM mode works. 3408 */ 3409 TEST_F(EncryptionOperationsTest, AesGcmRoundTripSuccess) { 3410 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3411 .Authorization(TAG_NO_AUTH_REQUIRED) 3412 .AesEncryptionKey(128) 3413 .Authorization(TAG_BLOCK_MODE, BlockMode::GCM) 3414 .Padding(PaddingMode::NONE) 3415 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3416 3417 string aad = "foobar"; 3418 string message = "123456789012345678901234567890123456"; 3419 3420 auto begin_params = AuthorizationSetBuilder() 3421 .BlockMode(BlockMode::GCM) 3422 .Padding(PaddingMode::NONE) 3423 .Authorization(TAG_MAC_LENGTH, 128); 3424 3425 auto update_params = 3426 AuthorizationSetBuilder().Authorization(TAG_ASSOCIATED_DATA, aad.data(), aad.size()); 3427 3428 // Encrypt 3429 AuthorizationSet begin_out_params; 3430 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params)) 3431 << "Begin encrypt"; 3432 string ciphertext; 3433 AuthorizationSet update_out_params; 3434 ASSERT_EQ(ErrorCode::OK, 3435 Finish(op_handle_, update_params, message, "", &update_out_params, &ciphertext)); 3436 3437 // Grab nonce 3438 begin_params.push_back(begin_out_params); 3439 3440 // Decrypt. 3441 ASSERT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params)) << "Begin decrypt"; 3442 string plaintext; 3443 size_t input_consumed; 3444 ASSERT_EQ(ErrorCode::OK, Update(op_handle_, update_params, ciphertext, &update_out_params, 3445 &plaintext, &input_consumed)); 3446 EXPECT_EQ(ciphertext.size(), input_consumed); 3447 EXPECT_EQ(ErrorCode::OK, Finish("", &plaintext)); 3448 3449 EXPECT_EQ(message, plaintext); 3450 } 3451 3452 /* 3453 * EncryptionOperationsTest.AesGcmTooShortTag 3454 * 3455 * Verifies that AES GCM mode fails correctly when a too-short tag length is specified. 3456 */ 3457 TEST_F(EncryptionOperationsTest, AesGcmTooShortTag) { 3458 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3459 .Authorization(TAG_NO_AUTH_REQUIRED) 3460 .AesEncryptionKey(128) 3461 .BlockMode(BlockMode::GCM) 3462 .Padding(PaddingMode::NONE) 3463 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3464 string message = "123456789012345678901234567890123456"; 3465 auto params = AuthorizationSetBuilder() 3466 .BlockMode(BlockMode::GCM) 3467 .Padding(PaddingMode::NONE) 3468 .Authorization(TAG_MAC_LENGTH, 96); 3469 3470 EXPECT_EQ(ErrorCode::INVALID_MAC_LENGTH, Begin(KeyPurpose::ENCRYPT, params)); 3471 } 3472 3473 /* 3474 * EncryptionOperationsTest.AesGcmTooShortTagOnDecrypt 3475 * 3476 * Verifies that AES GCM mode fails correctly when a too-short tag is provided to decryption. 3477 */ 3478 TEST_F(EncryptionOperationsTest, AesGcmTooShortTagOnDecrypt) { 3479 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3480 .Authorization(TAG_NO_AUTH_REQUIRED) 3481 .AesEncryptionKey(128) 3482 .BlockMode(BlockMode::GCM) 3483 .Padding(PaddingMode::NONE) 3484 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3485 string aad = "foobar"; 3486 string message = "123456789012345678901234567890123456"; 3487 auto params = AuthorizationSetBuilder() 3488 .BlockMode(BlockMode::GCM) 3489 .Padding(PaddingMode::NONE) 3490 .Authorization(TAG_MAC_LENGTH, 128); 3491 3492 auto finish_params = 3493 AuthorizationSetBuilder().Authorization(TAG_ASSOCIATED_DATA, aad.data(), aad.size()); 3494 3495 // Encrypt 3496 AuthorizationSet begin_out_params; 3497 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params, &begin_out_params)); 3498 EXPECT_EQ(1U, begin_out_params.size()); 3499 ASSERT_TRUE(begin_out_params.GetTagValue(TAG_NONCE).isOk()); 3500 3501 AuthorizationSet finish_out_params; 3502 string ciphertext; 3503 EXPECT_EQ(ErrorCode::OK, Finish(op_handle_, finish_params, message, "" /* signature */, 3504 &finish_out_params, &ciphertext)); 3505 3506 params = AuthorizationSetBuilder() 3507 .Authorizations(begin_out_params) 3508 .BlockMode(BlockMode::GCM) 3509 .Padding(PaddingMode::NONE) 3510 .Authorization(TAG_MAC_LENGTH, 96); 3511 3512 // Decrypt. 3513 EXPECT_EQ(ErrorCode::INVALID_MAC_LENGTH, Begin(KeyPurpose::DECRYPT, params)); 3514 } 3515 3516 /* 3517 * EncryptionOperationsTest.AesGcmCorruptKey 3518 * 3519 * Verifies that AES GCM mode fails correctly when the decryption key is incorrect. 3520 */ 3521 TEST_F(EncryptionOperationsTest, AesGcmCorruptKey) { 3522 const uint8_t nonce_bytes[] = { 3523 0xb7, 0x94, 0x37, 0xae, 0x08, 0xff, 0x35, 0x5d, 0x7d, 0x8a, 0x4d, 0x0f, 3524 }; 3525 string nonce = make_string(nonce_bytes); 3526 const uint8_t ciphertext_bytes[] = { 3527 0xb3, 0xf6, 0x79, 0x9e, 0x8f, 0x93, 0x26, 0xf2, 0xdf, 0x1e, 0x80, 0xfc, 0xd2, 0xcb, 0x16, 3528 0xd7, 0x8c, 0x9d, 0xc7, 0xcc, 0x14, 0xbb, 0x67, 0x78, 0x62, 0xdc, 0x6c, 0x63, 0x9b, 0x3a, 3529 0x63, 0x38, 0xd2, 0x4b, 0x31, 0x2d, 0x39, 0x89, 0xe5, 0x92, 0x0b, 0x5d, 0xbf, 0xc9, 0x76, 3530 0x76, 0x5e, 0xfb, 0xfe, 0x57, 0xbb, 0x38, 0x59, 0x40, 0xa7, 0xa4, 0x3b, 0xdf, 0x05, 0xbd, 3531 0xda, 0xe3, 0xc9, 0xd6, 0xa2, 0xfb, 0xbd, 0xfc, 0xc0, 0xcb, 0xa0, 3532 }; 3533 string ciphertext = make_string(ciphertext_bytes); 3534 3535 auto params = AuthorizationSetBuilder() 3536 .BlockMode(BlockMode::GCM) 3537 .Padding(PaddingMode::NONE) 3538 .Authorization(TAG_MAC_LENGTH, 128) 3539 .Authorization(TAG_NONCE, nonce.data(), nonce.size()); 3540 3541 auto import_params = AuthorizationSetBuilder() 3542 .Authorization(TAG_NO_AUTH_REQUIRED) 3543 .AesEncryptionKey(128) 3544 .BlockMode(BlockMode::GCM) 3545 .Padding(PaddingMode::NONE) 3546 .Authorization(TAG_CALLER_NONCE) 3547 .Authorization(TAG_MIN_MAC_LENGTH, 128); 3548 3549 // Import correct key and decrypt 3550 const uint8_t key_bytes[] = { 3551 0xba, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d, 3552 0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb, 3553 }; 3554 string key = make_string(key_bytes); 3555 ASSERT_EQ(ErrorCode::OK, ImportKey(import_params, KeyFormat::RAW, key)); 3556 string plaintext = DecryptMessage(ciphertext, params); 3557 CheckedDeleteKey(); 3558 3559 // Corrupt key and attempt to decrypt 3560 key[0] = 0; 3561 ASSERT_EQ(ErrorCode::OK, ImportKey(import_params, KeyFormat::RAW, key)); 3562 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params)); 3563 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, Finish(ciphertext, &plaintext)); 3564 CheckedDeleteKey(); 3565 } 3566 3567 /* 3568 * EncryptionOperationsTest.AesGcmAadNoData 3569 * 3570 * Verifies that AES GCM mode works when provided additional authenticated data, but no data to 3571 * encrypt. 3572 */ 3573 TEST_F(EncryptionOperationsTest, AesGcmAadNoData) { 3574 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3575 .Authorization(TAG_NO_AUTH_REQUIRED) 3576 .AesEncryptionKey(128) 3577 .BlockMode(BlockMode::GCM) 3578 .Padding(PaddingMode::NONE) 3579 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3580 3581 string aad = "1234567890123456"; 3582 auto params = AuthorizationSetBuilder() 3583 .BlockMode(BlockMode::GCM) 3584 .Padding(PaddingMode::NONE) 3585 .Authorization(TAG_MAC_LENGTH, 128); 3586 3587 auto finish_params = 3588 AuthorizationSetBuilder().Authorization(TAG_ASSOCIATED_DATA, aad.data(), aad.size()); 3589 3590 // Encrypt 3591 AuthorizationSet begin_out_params; 3592 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params, &begin_out_params)); 3593 string ciphertext; 3594 AuthorizationSet finish_out_params; 3595 EXPECT_EQ(ErrorCode::OK, Finish(op_handle_, finish_params, "" /* input */, "" /* signature */, 3596 &finish_out_params, &ciphertext)); 3597 EXPECT_TRUE(finish_out_params.empty()); 3598 3599 // Grab nonce 3600 params.push_back(begin_out_params); 3601 3602 // Decrypt. 3603 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params)); 3604 string plaintext; 3605 EXPECT_EQ(ErrorCode::OK, Finish(op_handle_, finish_params, ciphertext, "" /* signature */, 3606 &finish_out_params, &plaintext)) 3607 << "(Possibly b/33615032)"; 3608 3609 EXPECT_TRUE(finish_out_params.empty()); 3610 3611 EXPECT_EQ("", plaintext); 3612 } 3613 3614 /* 3615 * EncryptionOperationsTest.AesGcmMultiPartAad 3616 * 3617 * Verifies that AES GCM mode works when provided additional authenticated data in multiple chunks. 3618 */ 3619 TEST_F(EncryptionOperationsTest, AesGcmMultiPartAad) { 3620 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3621 .Authorization(TAG_NO_AUTH_REQUIRED) 3622 .AesEncryptionKey(128) 3623 .BlockMode(BlockMode::GCM) 3624 .Padding(PaddingMode::NONE) 3625 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3626 3627 string message = "123456789012345678901234567890123456"; 3628 auto begin_params = AuthorizationSetBuilder() 3629 .BlockMode(BlockMode::GCM) 3630 .Padding(PaddingMode::NONE) 3631 .Authorization(TAG_MAC_LENGTH, 128); 3632 AuthorizationSet begin_out_params; 3633 3634 auto update_params = 3635 AuthorizationSetBuilder().Authorization(TAG_ASSOCIATED_DATA, "foo", (size_t)3); 3636 3637 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params)); 3638 3639 // No data, AAD only. 3640 string ciphertext; 3641 size_t input_consumed; 3642 AuthorizationSet update_out_params; 3643 EXPECT_EQ(ErrorCode::OK, Update(op_handle_, update_params, "" /* input */, &update_out_params, 3644 &ciphertext, &input_consumed)); 3645 EXPECT_EQ(0U, input_consumed); 3646 EXPECT_EQ(0U, ciphertext.size()); 3647 EXPECT_TRUE(update_out_params.empty()); 3648 3649 // AAD and data. 3650 EXPECT_EQ(ErrorCode::OK, Update(op_handle_, update_params, message, &update_out_params, 3651 &ciphertext, &input_consumed)); 3652 EXPECT_EQ(message.size(), input_consumed); 3653 EXPECT_EQ(message.size(), ciphertext.size()); 3654 EXPECT_TRUE(update_out_params.empty()); 3655 3656 EXPECT_EQ(ErrorCode::OK, Finish("" /* input */, &ciphertext)); 3657 3658 // Grab nonce. 3659 begin_params.push_back(begin_out_params); 3660 3661 // Decrypt 3662 update_params = 3663 AuthorizationSetBuilder().Authorization(TAG_ASSOCIATED_DATA, "foofoo", (size_t)6); 3664 3665 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params)); 3666 string plaintext; 3667 EXPECT_EQ(ErrorCode::OK, Finish(op_handle_, update_params, ciphertext, "" /* signature */, 3668 &update_out_params, &plaintext)); 3669 EXPECT_TRUE(update_out_params.empty()); 3670 EXPECT_EQ(message, plaintext); 3671 } 3672 3673 /* 3674 * EncryptionOperationsTest.AesGcmAadOutOfOrder 3675 * 3676 * Verifies that AES GCM mode fails correctly when given AAD after data to encipher. 3677 */ 3678 TEST_F(EncryptionOperationsTest, AesGcmAadOutOfOrder) { 3679 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3680 .Authorization(TAG_NO_AUTH_REQUIRED) 3681 .AesEncryptionKey(128) 3682 .BlockMode(BlockMode::GCM) 3683 .Padding(PaddingMode::NONE) 3684 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3685 3686 string message = "123456789012345678901234567890123456"; 3687 auto begin_params = AuthorizationSetBuilder() 3688 .BlockMode(BlockMode::GCM) 3689 .Padding(PaddingMode::NONE) 3690 .Authorization(TAG_MAC_LENGTH, 128); 3691 AuthorizationSet begin_out_params; 3692 3693 auto update_params = 3694 AuthorizationSetBuilder().Authorization(TAG_ASSOCIATED_DATA, "foo", (size_t)3); 3695 3696 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params)); 3697 3698 // No data, AAD only. 3699 string ciphertext; 3700 size_t input_consumed; 3701 AuthorizationSet update_out_params; 3702 EXPECT_EQ(ErrorCode::OK, Update(op_handle_, update_params, "" /* input */, &update_out_params, 3703 &ciphertext, &input_consumed)); 3704 EXPECT_EQ(0U, input_consumed); 3705 EXPECT_EQ(0U, ciphertext.size()); 3706 EXPECT_TRUE(update_out_params.empty()); 3707 3708 // AAD and data. 3709 EXPECT_EQ(ErrorCode::OK, Update(op_handle_, update_params, message, &update_out_params, 3710 &ciphertext, &input_consumed)); 3711 EXPECT_EQ(message.size(), input_consumed); 3712 EXPECT_EQ(message.size(), ciphertext.size()); 3713 EXPECT_TRUE(update_out_params.empty()); 3714 3715 // More AAD 3716 EXPECT_EQ(ErrorCode::INVALID_TAG, Update(op_handle_, update_params, "", &update_out_params, 3717 &ciphertext, &input_consumed)); 3718 3719 op_handle_ = kOpHandleSentinel; 3720 } 3721 3722 /* 3723 * EncryptionOperationsTest.AesGcmBadAad 3724 * 3725 * Verifies that AES GCM decryption fails correctly when additional authenticated date is wrong. 3726 */ 3727 TEST_F(EncryptionOperationsTest, AesGcmBadAad) { 3728 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3729 .Authorization(TAG_NO_AUTH_REQUIRED) 3730 .AesEncryptionKey(128) 3731 .BlockMode(BlockMode::GCM) 3732 .Padding(PaddingMode::NONE) 3733 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3734 3735 string message = "12345678901234567890123456789012"; 3736 auto begin_params = AuthorizationSetBuilder() 3737 .BlockMode(BlockMode::GCM) 3738 .Padding(PaddingMode::NONE) 3739 .Authorization(TAG_MAC_LENGTH, 128); 3740 3741 auto finish_params = 3742 AuthorizationSetBuilder().Authorization(TAG_ASSOCIATED_DATA, "foobar", (size_t)6); 3743 3744 // Encrypt 3745 AuthorizationSet begin_out_params; 3746 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params)); 3747 string ciphertext; 3748 AuthorizationSet finish_out_params; 3749 EXPECT_EQ(ErrorCode::OK, Finish(op_handle_, finish_params, message, "" /* signature */, 3750 &finish_out_params, &ciphertext)); 3751 3752 // Grab nonce 3753 begin_params.push_back(begin_out_params); 3754 3755 finish_params = AuthorizationSetBuilder().Authorization(TAG_ASSOCIATED_DATA, 3756 "barfoo" /* Wrong AAD */, (size_t)6); 3757 3758 // Decrypt. 3759 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params, &begin_out_params)); 3760 string plaintext; 3761 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, 3762 Finish(op_handle_, finish_params, ciphertext, "" /* signature */, &finish_out_params, 3763 &plaintext)); 3764 } 3765 3766 /* 3767 * EncryptionOperationsTest.AesGcmWrongNonce 3768 * 3769 * Verifies that AES GCM decryption fails correctly when the nonce is incorrect. 3770 */ 3771 TEST_F(EncryptionOperationsTest, AesGcmWrongNonce) { 3772 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3773 .Authorization(TAG_NO_AUTH_REQUIRED) 3774 .AesEncryptionKey(128) 3775 .BlockMode(BlockMode::GCM) 3776 .Padding(PaddingMode::NONE) 3777 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3778 3779 string message = "12345678901234567890123456789012"; 3780 auto begin_params = AuthorizationSetBuilder() 3781 .BlockMode(BlockMode::GCM) 3782 .Padding(PaddingMode::NONE) 3783 .Authorization(TAG_MAC_LENGTH, 128); 3784 3785 auto finish_params = 3786 AuthorizationSetBuilder().Authorization(TAG_ASSOCIATED_DATA, "foobar", (size_t)6); 3787 3788 // Encrypt 3789 AuthorizationSet begin_out_params; 3790 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, begin_params, &begin_out_params)); 3791 string ciphertext; 3792 AuthorizationSet finish_out_params; 3793 EXPECT_EQ(ErrorCode::OK, Finish(op_handle_, finish_params, message, "" /* signature */, 3794 &finish_out_params, &ciphertext)); 3795 3796 // Wrong nonce 3797 begin_params.push_back(TAG_NONCE, HidlBuf("123456789012")); 3798 3799 // Decrypt. 3800 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, begin_params, &begin_out_params)); 3801 string plaintext; 3802 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, 3803 Finish(op_handle_, finish_params, ciphertext, "" /* signature */, &finish_out_params, 3804 &plaintext)); 3805 3806 // With wrong nonce, should have gotten garbage plaintext (or none). 3807 EXPECT_NE(message, plaintext); 3808 } 3809 3810 /* 3811 * EncryptionOperationsTest.AesGcmCorruptTag 3812 * 3813 * Verifies that AES GCM decryption fails correctly when the tag is wrong. 3814 */ 3815 TEST_F(EncryptionOperationsTest, AesGcmCorruptTag) { 3816 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3817 .Authorization(TAG_NO_AUTH_REQUIRED) 3818 .AesEncryptionKey(128) 3819 .BlockMode(BlockMode::GCM) 3820 .Padding(PaddingMode::NONE) 3821 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3822 3823 string aad = "1234567890123456"; 3824 string message = "123456789012345678901234567890123456"; 3825 3826 auto params = AuthorizationSetBuilder() 3827 .BlockMode(BlockMode::GCM) 3828 .Padding(PaddingMode::NONE) 3829 .Authorization(TAG_MAC_LENGTH, 128); 3830 3831 auto finish_params = 3832 AuthorizationSetBuilder().Authorization(TAG_ASSOCIATED_DATA, aad.data(), aad.size()); 3833 3834 // Encrypt 3835 AuthorizationSet begin_out_params; 3836 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::ENCRYPT, params, &begin_out_params)); 3837 string ciphertext; 3838 AuthorizationSet finish_out_params; 3839 EXPECT_EQ(ErrorCode::OK, Finish(op_handle_, finish_params, message, "" /* signature */, 3840 &finish_out_params, &ciphertext)); 3841 EXPECT_TRUE(finish_out_params.empty()); 3842 3843 // Corrupt tag 3844 ++(*ciphertext.rbegin()); 3845 3846 // Grab nonce 3847 params.push_back(begin_out_params); 3848 3849 // Decrypt. 3850 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::DECRYPT, params)); 3851 string plaintext; 3852 EXPECT_EQ(ErrorCode::VERIFICATION_FAILED, 3853 Finish(op_handle_, finish_params, ciphertext, "" /* signature */, &finish_out_params, 3854 &plaintext)); 3855 EXPECT_TRUE(finish_out_params.empty()); 3856 } 3857 3858 typedef KeymasterHidlTest MaxOperationsTest; 3859 3860 /* 3861 * MaxOperationsTest.TestLimitAes 3862 * 3863 * Verifies that the max uses per boot tag works correctly with AES keys. 3864 */ 3865 TEST_F(MaxOperationsTest, TestLimitAes) { 3866 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3867 .Authorization(TAG_NO_AUTH_REQUIRED) 3868 .AesEncryptionKey(128) 3869 .EcbMode() 3870 .Padding(PaddingMode::NONE) 3871 .Authorization(TAG_MAX_USES_PER_BOOT, 3))); 3872 3873 string message = "1234567890123456"; 3874 3875 auto params = AuthorizationSetBuilder().EcbMode().Padding(PaddingMode::NONE); 3876 3877 EncryptMessage(message, params); 3878 EncryptMessage(message, params); 3879 EncryptMessage(message, params); 3880 3881 // Fourth time should fail. 3882 EXPECT_EQ(ErrorCode::KEY_MAX_OPS_EXCEEDED, Begin(KeyPurpose::ENCRYPT, params)); 3883 } 3884 3885 /* 3886 * MaxOperationsTest.TestLimitAes 3887 * 3888 * Verifies that the max uses per boot tag works correctly with RSA keys. 3889 */ 3890 TEST_F(MaxOperationsTest, TestLimitRsa) { 3891 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3892 .Authorization(TAG_NO_AUTH_REQUIRED) 3893 .RsaSigningKey(1024, 3) 3894 .NoDigestOrPadding() 3895 .Authorization(TAG_MAX_USES_PER_BOOT, 3))); 3896 3897 string message = "1234567890123456"; 3898 3899 auto params = AuthorizationSetBuilder().NoDigestOrPadding(); 3900 3901 SignMessage(message, params); 3902 SignMessage(message, params); 3903 SignMessage(message, params); 3904 3905 // Fourth time should fail. 3906 EXPECT_EQ(ErrorCode::KEY_MAX_OPS_EXCEEDED, Begin(KeyPurpose::SIGN, params)); 3907 } 3908 3909 typedef KeymasterHidlTest AddEntropyTest; 3910 3911 /* 3912 * AddEntropyTest.AddEntropy 3913 * 3914 * Verifies that the addRngEntropy method doesn't blow up. There's no way to test that entropy is 3915 * actually added. 3916 */ 3917 TEST_F(AddEntropyTest, AddEntropy) { 3918 EXPECT_EQ(ErrorCode::OK, keymaster().addRngEntropy(HidlBuf("foo"))); 3919 } 3920 3921 /* 3922 * AddEntropyTest.AddEmptyEntropy 3923 * 3924 * Verifies that the addRngEntropy method doesn't blow up when given an empty buffer. 3925 */ 3926 TEST_F(AddEntropyTest, AddEmptyEntropy) { 3927 EXPECT_EQ(ErrorCode::OK, keymaster().addRngEntropy(HidlBuf())); 3928 } 3929 3930 /* 3931 * AddEntropyTest.AddLargeEntropy 3932 * 3933 * Verifies that the addRngEntropy method doesn't blow up when given a largish amount of data. 3934 */ 3935 TEST_F(AddEntropyTest, AddLargeEntropy) { 3936 EXPECT_EQ(ErrorCode::OK, keymaster().addRngEntropy(HidlBuf(string(2 * 1024, 'a')))); 3937 } 3938 3939 typedef KeymasterHidlTest AttestationTest; 3940 3941 /* 3942 * AttestationTest.RsaAttestation 3943 * 3944 * Verifies that attesting to RSA keys works and generates the expected output. 3945 */ 3946 TEST_F(AttestationTest, RsaAttestation) { 3947 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3948 .Authorization(TAG_NO_AUTH_REQUIRED) 3949 .RsaSigningKey(1024, 3) 3950 .Digest(Digest::NONE) 3951 .Padding(PaddingMode::NONE) 3952 .Authorization(TAG_INCLUDE_UNIQUE_ID))); 3953 3954 hidl_vec<hidl_vec<uint8_t>> cert_chain; 3955 ASSERT_EQ(ErrorCode::OK, 3956 AttestKey(AuthorizationSetBuilder() 3957 .Authorization(TAG_ATTESTATION_CHALLENGE, HidlBuf("challenge")) 3958 .Authorization(TAG_ATTESTATION_APPLICATION_ID, HidlBuf("foo")), 3959 &cert_chain)); 3960 EXPECT_GE(cert_chain.size(), 2U); 3961 EXPECT_TRUE(verify_chain(cert_chain)); 3962 EXPECT_TRUE( 3963 verify_attestation_record("challenge", "foo", // 3964 key_characteristics_.softwareEnforced, // 3965 key_characteristics_.teeEnforced, // 3966 cert_chain[0])); 3967 } 3968 3969 /* 3970 * AttestationTest.RsaAttestationRequiresAppId 3971 * 3972 * Verifies that attesting to RSA requires app ID. 3973 */ 3974 TEST_F(AttestationTest, RsaAttestationRequiresAppId) { 3975 ASSERT_EQ(ErrorCode::OK, 3976 GenerateKey(AuthorizationSetBuilder() 3977 .Authorization(TAG_NO_AUTH_REQUIRED) 3978 .RsaSigningKey(1024, 3) 3979 .Digest(Digest::NONE) 3980 .Padding(PaddingMode::NONE) 3981 .Authorization(TAG_INCLUDE_UNIQUE_ID))); 3982 3983 hidl_vec<hidl_vec<uint8_t>> cert_chain; 3984 EXPECT_EQ(ErrorCode::ATTESTATION_APPLICATION_ID_MISSING, 3985 AttestKey(AuthorizationSetBuilder().Authorization( 3986 TAG_ATTESTATION_CHALLENGE, HidlBuf("challenge")), 3987 &cert_chain)); 3988 } 3989 3990 /* 3991 * AttestationTest.EcAttestation 3992 * 3993 * Verifies that attesting to EC keys works and generates the expected output. 3994 */ 3995 TEST_F(AttestationTest, EcAttestation) { 3996 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 3997 .Authorization(TAG_NO_AUTH_REQUIRED) 3998 .EcdsaSigningKey(EcCurve::P_256) 3999 .Digest(Digest::SHA_2_256) 4000 .Authorization(TAG_INCLUDE_UNIQUE_ID))); 4001 4002 hidl_vec<hidl_vec<uint8_t>> cert_chain; 4003 ASSERT_EQ(ErrorCode::OK, 4004 AttestKey(AuthorizationSetBuilder() 4005 .Authorization(TAG_ATTESTATION_CHALLENGE, HidlBuf("challenge")) 4006 .Authorization(TAG_ATTESTATION_APPLICATION_ID, HidlBuf("foo")), 4007 &cert_chain)); 4008 EXPECT_GE(cert_chain.size(), 2U); 4009 EXPECT_TRUE(verify_chain(cert_chain)); 4010 4011 EXPECT_TRUE( 4012 verify_attestation_record("challenge", "foo", // 4013 key_characteristics_.softwareEnforced, // 4014 key_characteristics_.teeEnforced, // 4015 cert_chain[0])); 4016 } 4017 4018 /* 4019 * AttestationTest.EcAttestationRequiresAttestationAppId 4020 * 4021 * Verifies that attesting to EC keys requires app ID 4022 */ 4023 TEST_F(AttestationTest, EcAttestationRequiresAttestationAppId) { 4024 ASSERT_EQ(ErrorCode::OK, 4025 GenerateKey(AuthorizationSetBuilder() 4026 .Authorization(TAG_NO_AUTH_REQUIRED) 4027 .EcdsaSigningKey(EcCurve::P_256) 4028 .Digest(Digest::SHA_2_256) 4029 .Authorization(TAG_INCLUDE_UNIQUE_ID))); 4030 4031 hidl_vec<hidl_vec<uint8_t>> cert_chain; 4032 EXPECT_EQ(ErrorCode::ATTESTATION_APPLICATION_ID_MISSING, 4033 AttestKey(AuthorizationSetBuilder().Authorization( 4034 TAG_ATTESTATION_CHALLENGE, HidlBuf("challenge")), 4035 &cert_chain)); 4036 } 4037 4038 /* 4039 * AttestationTest.AesAttestation 4040 * 4041 * Verifies that attesting to AES keys fails in the expected way. 4042 */ 4043 TEST_F(AttestationTest, AesAttestation) { 4044 ASSERT_EQ(ErrorCode::OK, 4045 GenerateKey(AuthorizationSetBuilder() 4046 .Authorization(TAG_NO_AUTH_REQUIRED) 4047 .AesEncryptionKey(128) 4048 .EcbMode() 4049 .Padding(PaddingMode::PKCS7))); 4050 4051 hidl_vec<hidl_vec<uint8_t>> cert_chain; 4052 EXPECT_EQ( 4053 ErrorCode::INCOMPATIBLE_ALGORITHM, 4054 AttestKey( 4055 AuthorizationSetBuilder() 4056 .Authorization(TAG_ATTESTATION_CHALLENGE, HidlBuf("challenge")) 4057 .Authorization(TAG_ATTESTATION_APPLICATION_ID, HidlBuf("foo")), 4058 &cert_chain)); 4059 } 4060 4061 /* 4062 * AttestationTest.HmacAttestation 4063 * 4064 * Verifies that attesting to HMAC keys fails in the expected way. 4065 */ 4066 TEST_F(AttestationTest, HmacAttestation) { 4067 ASSERT_EQ(ErrorCode::OK, 4068 GenerateKey(AuthorizationSetBuilder() 4069 .Authorization(TAG_NO_AUTH_REQUIRED) 4070 .HmacKey(128) 4071 .EcbMode() 4072 .Digest(Digest::SHA_2_256) 4073 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 4074 4075 hidl_vec<hidl_vec<uint8_t>> cert_chain; 4076 EXPECT_EQ( 4077 ErrorCode::INCOMPATIBLE_ALGORITHM, 4078 AttestKey( 4079 AuthorizationSetBuilder() 4080 .Authorization(TAG_ATTESTATION_CHALLENGE, HidlBuf("challenge")) 4081 .Authorization(TAG_ATTESTATION_APPLICATION_ID, HidlBuf("foo")), 4082 &cert_chain)); 4083 } 4084 4085 typedef KeymasterHidlTest KeyDeletionTest; 4086 4087 /** 4088 * KeyDeletionTest.DeleteKey 4089 * 4090 * This test checks that if rollback protection is implemented, DeleteKey invalidates a formerly 4091 * valid key blob. 4092 */ 4093 TEST_F(KeyDeletionTest, DeleteKey) { 4094 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 4095 .RsaSigningKey(1024, 3) 4096 .Digest(Digest::NONE) 4097 .Padding(PaddingMode::NONE) 4098 .Authorization(TAG_NO_AUTH_REQUIRED))); 4099 4100 // Delete must work if rollback protection is implemented 4101 AuthorizationSet teeEnforced(key_characteristics_.teeEnforced); 4102 bool rollback_protected = teeEnforced.Contains(TAG_ROLLBACK_RESISTANT); 4103 4104 if (rollback_protected) { 4105 ASSERT_EQ(ErrorCode::OK, DeleteKey(true /* keep key blob */)); 4106 } else { 4107 auto delete_result = DeleteKey(true /* keep key blob */); 4108 ASSERT_TRUE(delete_result == ErrorCode::OK | delete_result == ErrorCode::UNIMPLEMENTED); 4109 } 4110 4111 string message = "12345678901234567890123456789012"; 4112 AuthorizationSet begin_out_params; 4113 4114 if (rollback_protected) { 4115 EXPECT_EQ( 4116 ErrorCode::INVALID_KEY_BLOB, 4117 Begin(KeyPurpose::SIGN, key_blob_, AuthorizationSetBuilder() 4118 .Digest(Digest::NONE) 4119 .Padding(PaddingMode::NONE), 4120 &begin_out_params, &op_handle_)) 4121 << " (Possibly b/37623742)"; 4122 } else { 4123 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::SIGN, key_blob_, 4124 AuthorizationSetBuilder() 4125 .Digest(Digest::NONE) 4126 .Padding(PaddingMode::NONE), 4127 &begin_out_params, &op_handle_)); 4128 } 4129 AbortIfNeeded(); 4130 key_blob_ = HidlBuf(); 4131 } 4132 4133 /** 4134 * KeyDeletionTest.DeleteInvalidKey 4135 * 4136 * This test checks that the HAL excepts invalid key blobs. 4137 */ 4138 TEST_F(KeyDeletionTest, DeleteInvalidKey) { 4139 // Generate key just to check if rollback protection is implemented 4140 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 4141 .RsaSigningKey(1024, 3) 4142 .Digest(Digest::NONE) 4143 .Padding(PaddingMode::NONE) 4144 .Authorization(TAG_NO_AUTH_REQUIRED))); 4145 4146 // Delete must work if rollback protection is implemented 4147 AuthorizationSet teeEnforced(key_characteristics_.teeEnforced); 4148 bool rollback_protected = teeEnforced.Contains(TAG_ROLLBACK_RESISTANT); 4149 4150 // Delete the key we don't care about the result at this point. 4151 DeleteKey(); 4152 4153 // Now create an invalid key blob and delete it. 4154 key_blob_ = HidlBuf("just some garbage data which is not a valid key blob"); 4155 4156 if (rollback_protected) { 4157 ASSERT_EQ(ErrorCode::OK, DeleteKey()); 4158 } else { 4159 auto delete_result = DeleteKey(); 4160 ASSERT_TRUE(delete_result == ErrorCode::OK | delete_result == ErrorCode::UNIMPLEMENTED); 4161 } 4162 } 4163 4164 /** 4165 * KeyDeletionTest.DeleteAllKeys 4166 * 4167 * This test is disarmed by default. To arm it use --arm_deleteAllKeys. 4168 * 4169 * BEWARE: This test has serious side effects. All user keys will be lost! This includes 4170 * FBE/FDE encryption keys, which means that the device will not even boot until after the 4171 * device has been wiped manually (e.g., fastboot flashall -w), and new FBE/FDE keys have 4172 * been provisioned. Use this test only on dedicated testing devices that have no valuable 4173 * credentials stored in Keystore/Keymaster. 4174 */ 4175 TEST_F(KeyDeletionTest, DeleteAllKeys) { 4176 if (!arm_deleteAllKeys) return; 4177 ASSERT_EQ(ErrorCode::OK, GenerateKey(AuthorizationSetBuilder() 4178 .RsaSigningKey(1024, 3) 4179 .Digest(Digest::NONE) 4180 .Padding(PaddingMode::NONE) 4181 .Authorization(TAG_NO_AUTH_REQUIRED))); 4182 4183 // Delete must work if rollback protection is implemented 4184 AuthorizationSet teeEnforced(key_characteristics_.teeEnforced); 4185 bool rollback_protected = teeEnforced.Contains(TAG_ROLLBACK_RESISTANT); 4186 4187 ASSERT_EQ(ErrorCode::OK, DeleteAllKeys()); 4188 4189 string message = "12345678901234567890123456789012"; 4190 AuthorizationSet begin_out_params; 4191 4192 if (rollback_protected) { 4193 EXPECT_EQ( 4194 ErrorCode::INVALID_KEY_BLOB, 4195 Begin(KeyPurpose::SIGN, key_blob_, AuthorizationSetBuilder() 4196 .Digest(Digest::NONE) 4197 .Padding(PaddingMode::NONE), 4198 &begin_out_params, &op_handle_)); 4199 } else { 4200 EXPECT_EQ(ErrorCode::OK, Begin(KeyPurpose::SIGN, key_blob_, 4201 AuthorizationSetBuilder() 4202 .Digest(Digest::NONE) 4203 .Padding(PaddingMode::NONE), 4204 &begin_out_params, &op_handle_)); 4205 } 4206 AbortIfNeeded(); 4207 key_blob_ = HidlBuf(); 4208 } 4209 4210 } // namespace test 4211 } // namespace V3_0 4212 } // namespace keymaster 4213 } // namespace hardware 4214 } // namespace android 4215 4216 int main(int argc, char** argv) { 4217 using android::hardware::keymaster::V3_0::test::KeymasterHidlEnvironment; 4218 ::testing::AddGlobalTestEnvironment(KeymasterHidlEnvironment::Instance()); 4219 ::testing::InitGoogleTest(&argc, argv); 4220 KeymasterHidlEnvironment::Instance()->init(&argc, argv); 4221 for (int i = 1; i < argc; ++i) { 4222 if (argv[i][0] == '-') { 4223 if (std::string(argv[i]) == "--arm_deleteAllKeys") { 4224 arm_deleteAllKeys = true; 4225 } 4226 if (std::string(argv[i]) == "--dump_attestations") { 4227 dump_Attestations = true; 4228 } 4229 } 4230 } 4231 int status = RUN_ALL_TESTS(); 4232 ALOGI("Test result = %d", status); 4233 return status; 4234 } 4235