1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <fstream> 18 #include <memory> 19 #include <string> 20 #include <vector> 21 22 #include <openssl/evp.h> 23 #include <openssl/x509.h> 24 25 #include <hardware/keymaster0.h> 26 27 #include <keymaster/android_keymaster.h> 28 #include <keymaster/attestation_record.h> 29 #include <keymaster/contexts/pure_soft_keymaster_context.h> 30 #include <keymaster/contexts/soft_keymaster_context.h> 31 #include <keymaster/key_factory.h> 32 #include <keymaster/km_openssl/hmac_key.h> 33 #include <keymaster/km_openssl/openssl_utils.h> 34 #include <keymaster/km_openssl/soft_keymaster_enforcement.h> 35 #include <keymaster/legacy_support/keymaster0_engine.h> 36 #include <keymaster/soft_keymaster_device.h> 37 38 #include "android_keymaster_test_utils.h" 39 40 using std::ifstream; 41 using std::istreambuf_iterator; 42 using std::ofstream; 43 using std::string; 44 using std::unique_ptr; 45 using std::vector; 46 47 extern "C" { 48 int __android_log_print(int prio, const char* tag, const char* fmt); 49 int __android_log_print(int prio, const char* tag, const char* fmt) { 50 (void)prio, (void)tag, (void)fmt; 51 return 0; 52 } 53 } // extern "C" 54 55 namespace { 56 57 // For some reason std::make_unique isn't available. Define make_unique. 58 template <typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { 59 return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); 60 } 61 62 } // namespace 63 64 namespace keymaster { 65 namespace test { 66 67 const uint32_t kOsVersion = 060000; 68 const uint32_t kOsPatchLevel = 201603; 69 70 StdoutLogger logger; 71 72 template <typename T> vector<T> make_vector(const T* array, size_t len) { 73 return vector<T>(array, array + len); 74 } 75 76 /** 77 * KeymasterEnforcement class for use in testing. It's permissive in the sense that it doesn't 78 * check cryptoperiods, but restrictive in the sense that the clock never advances (so rate-limited 79 * keys will only work once). 80 */ 81 class TestKeymasterEnforcement : public SoftKeymasterEnforcement { 82 public: 83 TestKeymasterEnforcement() : SoftKeymasterEnforcement(3, 3) {} 84 85 virtual bool activation_date_valid(uint64_t /* activation_date */) const { return true; } 86 virtual bool expiration_date_passed(uint64_t /* expiration_date */) const { return false; } 87 virtual bool auth_token_timed_out(const hw_auth_token_t& /* token */, 88 uint32_t /* timeout */) const { 89 return false; 90 } 91 virtual uint32_t get_current_time() const { return 0; } 92 virtual bool ValidateTokenSignature(const hw_auth_token_t& /* token */) const { return true; } 93 }; 94 95 /** 96 * Variant of SoftKeymasterContext that provides a TestKeymasterEnforcement. 97 */ 98 class TestKeymasterContext : public SoftKeymasterContext { 99 public: 100 TestKeymasterContext() {} 101 explicit TestKeymasterContext(const string& root_of_trust) 102 : SoftKeymasterContext(root_of_trust) {} 103 104 KeymasterEnforcement* enforcement_policy() override { return &test_policy_; } 105 106 private: 107 TestKeymasterEnforcement test_policy_; 108 }; 109 110 /** 111 * Test instance creator that builds a pure software keymaster2 implementation. 112 */ 113 class SoftKeymasterTestInstanceCreator : public Keymaster2TestInstanceCreator { 114 public: 115 keymaster2_device_t* CreateDevice() const override { 116 std::cerr << "Creating software-only device" << std::endl; 117 context_ = new TestKeymasterContext; 118 SoftKeymasterDevice* device = new SoftKeymasterDevice(context_); 119 AuthorizationSet version_info(AuthorizationSetBuilder() 120 .Authorization(TAG_OS_VERSION, kOsVersion) 121 .Authorization(TAG_OS_PATCHLEVEL, kOsPatchLevel)); 122 device->keymaster2_device()->configure(device->keymaster2_device(), &version_info); 123 return device->keymaster2_device(); 124 } 125 126 bool algorithm_in_km0_hardware(keymaster_algorithm_t) const override { return false; } 127 int keymaster0_calls() const override { return 0; } 128 bool is_keymaster1_hw() const override { return false; } 129 KeymasterContext* keymaster_context() const override { return context_; } 130 string name() const override { return "Soft Keymaster2"; } 131 132 private: 133 mutable TestKeymasterContext* context_; 134 }; 135 136 /** 137 * Test instance creator that builds a SoftKeymasterDevice which wraps a fake hardware keymaster1 138 * instance, with minimal digest support. 139 */ 140 class Sha256OnlyKeymaster1TestInstanceCreator : public Keymaster2TestInstanceCreator { 141 keymaster2_device_t* CreateDevice() const override { 142 std::cerr << "Creating keymaster1-backed device that supports only SHA256"; 143 144 // fake_device doesn't leak because device (below) takes ownership of it. 145 keymaster1_device_t* fake_device = make_device_sha256_only( 146 (new SoftKeymasterDevice(new TestKeymasterContext("PseudoHW")))->keymaster_device()); 147 148 // device doesn't leak; it's cleaned up by device->keymaster_device()->common.close(). 149 context_ = new TestKeymasterContext; 150 SoftKeymasterDevice* device = new SoftKeymasterDevice(context_); 151 device->SetHardwareDevice(fake_device); 152 153 AuthorizationSet version_info(AuthorizationSetBuilder() 154 .Authorization(TAG_OS_VERSION, kOsVersion) 155 .Authorization(TAG_OS_PATCHLEVEL, kOsPatchLevel)); 156 device->keymaster2_device()->configure(device->keymaster2_device(), &version_info); 157 return device->keymaster2_device(); 158 } 159 160 bool algorithm_in_km0_hardware(keymaster_algorithm_t) const override { return false; } 161 int keymaster0_calls() const override { return 0; } 162 int minimal_digest_set() const override { return true; } 163 bool is_keymaster1_hw() const override { return true; } 164 KeymasterContext* keymaster_context() const override { return context_; } 165 string name() const override { return "Wrapped fake keymaster1 w/minimal digests"; } 166 167 private: 168 mutable TestKeymasterContext* context_; 169 }; 170 171 /** 172 * Test instance creator that builds a SoftKeymasterDevice which wraps a fake hardware keymaster1 173 * instance, with full digest support 174 */ 175 class Keymaster1TestInstanceCreator : public Keymaster2TestInstanceCreator { 176 keymaster2_device_t* CreateDevice() const override { 177 std::cerr << "Creating keymaster1-backed device"; 178 179 // fake_device doesn't leak because device (below) takes ownership of it. 180 keymaster1_device_t* fake_device = 181 (new SoftKeymasterDevice(new TestKeymasterContext("PseudoHW")))->keymaster_device(); 182 183 // device doesn't leak; it's cleaned up by device->keymaster_device()->common.close(). 184 context_ = new TestKeymasterContext; 185 SoftKeymasterDevice* device = new SoftKeymasterDevice(context_); 186 device->SetHardwareDevice(fake_device); 187 188 AuthorizationSet version_info(AuthorizationSetBuilder() 189 .Authorization(TAG_OS_VERSION, kOsVersion) 190 .Authorization(TAG_OS_PATCHLEVEL, kOsPatchLevel)); 191 device->keymaster2_device()->configure(device->keymaster2_device(), &version_info); 192 return device->keymaster2_device(); 193 } 194 195 bool algorithm_in_km0_hardware(keymaster_algorithm_t) const override { return false; } 196 int keymaster0_calls() const override { return 0; } 197 int minimal_digest_set() const override { return false; } 198 bool is_keymaster1_hw() const override { return true; } 199 KeymasterContext* keymaster_context() const override { return context_; } 200 string name() const override { return "Wrapped fake keymaster1 w/full digests"; } 201 202 private: 203 mutable TestKeymasterContext* context_; 204 }; 205 206 static auto test_params = testing::Values( 207 InstanceCreatorPtr(new SoftKeymasterTestInstanceCreator), 208 InstanceCreatorPtr(new Keymaster1TestInstanceCreator), 209 InstanceCreatorPtr(new Sha256OnlyKeymaster1TestInstanceCreator)); 210 211 class NewKeyGeneration : public Keymaster2Test { 212 protected: 213 void CheckBaseParams() { 214 AuthorizationSet auths = sw_enforced(); 215 EXPECT_GT(auths.SerializedSize(), 12U); 216 217 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_SIGN)); 218 EXPECT_TRUE(contains(auths, TAG_PURPOSE, KM_PURPOSE_VERIFY)); 219 EXPECT_TRUE(contains(auths, TAG_USER_ID, 7)); 220 EXPECT_TRUE(contains(auths, TAG_USER_AUTH_TYPE, HW_AUTH_PASSWORD)); 221 EXPECT_TRUE(contains(auths, TAG_AUTH_TIMEOUT, 300)); 222 223 // Verify that App ID, App data and ROT are NOT included. 224 EXPECT_FALSE(contains(auths, TAG_ROOT_OF_TRUST)); 225 EXPECT_FALSE(contains(auths, TAG_APPLICATION_ID)); 226 EXPECT_FALSE(contains(auths, TAG_APPLICATION_DATA)); 227 228 // Just for giggles, check that some unexpected tags/values are NOT present. 229 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_ENCRYPT)); 230 EXPECT_FALSE(contains(auths, TAG_PURPOSE, KM_PURPOSE_DECRYPT)); 231 EXPECT_FALSE(contains(auths, TAG_AUTH_TIMEOUT, 301)); 232 233 // Now check that unspecified, defaulted tags are correct. 234 EXPECT_TRUE(contains(auths, KM_TAG_CREATION_DATETIME)); 235 if (GetParam()->is_keymaster1_hw()) { 236 // If the underlying (faked) HW is KM1, it will not have version info. 237 EXPECT_FALSE(auths.Contains(TAG_OS_VERSION)); 238 EXPECT_FALSE(auths.Contains(TAG_OS_PATCHLEVEL)); 239 } else { 240 // In all othe cases; SoftKeymasterDevice keys, or keymaster0 keys wrapped by 241 // SoftKeymasterDevice, version information will be present and up to date. 242 EXPECT_TRUE(contains(auths, TAG_OS_VERSION, kOsVersion)); 243 EXPECT_TRUE(contains(auths, TAG_OS_PATCHLEVEL, kOsPatchLevel)); 244 } 245 } 246 }; 247 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, NewKeyGeneration, test_params); 248 249 TEST_P(NewKeyGeneration, Rsa) { 250 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 251 .RsaSigningKey(256, 3) 252 .Digest(KM_DIGEST_NONE) 253 .Padding(KM_PAD_NONE))); 254 CheckBaseParams(); 255 256 // Check specified tags are all present, and in the right set. 257 AuthorizationSet crypto_params; 258 AuthorizationSet non_crypto_params; 259 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) { 260 EXPECT_NE(0U, hw_enforced().size()); 261 EXPECT_NE(0U, sw_enforced().size()); 262 crypto_params.push_back(hw_enforced()); 263 non_crypto_params.push_back(sw_enforced()); 264 } else { 265 EXPECT_EQ(0U, hw_enforced().size()); 266 EXPECT_NE(0U, sw_enforced().size()); 267 crypto_params.push_back(sw_enforced()); 268 } 269 270 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA)); 271 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_RSA)); 272 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 256)); 273 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 256)); 274 EXPECT_TRUE(contains(crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3)); 275 EXPECT_FALSE(contains(non_crypto_params, TAG_RSA_PUBLIC_EXPONENT, 3)); 276 277 EXPECT_EQ(KM_ERROR_OK, DeleteKey()); 278 279 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 280 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 281 } 282 283 TEST_P(NewKeyGeneration, RsaDefaultSize) { 284 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE, 285 GenerateKey(AuthorizationSetBuilder() 286 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_RSA) 287 .Authorization(TAG_RSA_PUBLIC_EXPONENT, 3) 288 .SigningKey())); 289 290 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 291 } 292 293 TEST_P(NewKeyGeneration, Ecdsa) { 294 ASSERT_EQ(KM_ERROR_OK, 295 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE))); 296 CheckBaseParams(); 297 298 // Check specified tags are all present, and in the right set. 299 AuthorizationSet crypto_params; 300 AuthorizationSet non_crypto_params; 301 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) { 302 EXPECT_NE(0U, hw_enforced().size()); 303 EXPECT_NE(0U, sw_enforced().size()); 304 crypto_params.push_back(hw_enforced()); 305 non_crypto_params.push_back(sw_enforced()); 306 } else { 307 EXPECT_EQ(0U, hw_enforced().size()); 308 EXPECT_NE(0U, sw_enforced().size()); 309 crypto_params.push_back(sw_enforced()); 310 } 311 312 EXPECT_TRUE(contains(crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC)); 313 EXPECT_FALSE(contains(non_crypto_params, TAG_ALGORITHM, KM_ALGORITHM_EC)); 314 EXPECT_TRUE(contains(crypto_params, TAG_KEY_SIZE, 224)); 315 EXPECT_FALSE(contains(non_crypto_params, TAG_KEY_SIZE, 224)); 316 317 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 318 EXPECT_EQ(1, GetParam()->keymaster0_calls()); 319 } 320 321 TEST_P(NewKeyGeneration, EcdsaDefaultSize) { 322 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE, 323 GenerateKey(AuthorizationSetBuilder() 324 .Authorization(TAG_ALGORITHM, KM_ALGORITHM_EC) 325 .SigningKey() 326 .Digest(KM_DIGEST_NONE))); 327 328 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 329 } 330 331 TEST_P(NewKeyGeneration, EcdsaInvalidSize) { 332 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE, 333 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(190).Digest(KM_DIGEST_NONE))); 334 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 335 } 336 337 TEST_P(NewKeyGeneration, EcdsaMismatchKeySize) { 338 ASSERT_EQ(KM_ERROR_INVALID_ARGUMENT, 339 GenerateKey(AuthorizationSetBuilder() 340 .EcdsaSigningKey(224) 341 .Authorization(TAG_EC_CURVE, KM_EC_CURVE_P_256) 342 .Digest(KM_DIGEST_NONE))); 343 } 344 345 TEST_P(NewKeyGeneration, EcdsaAllValidSizes) { 346 size_t valid_sizes[] = {224, 256, 384, 521}; 347 for (size_t size : valid_sizes) { 348 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(size).Digest( 349 KM_DIGEST_NONE))) 350 << "Failed to generate size: " << size; 351 } 352 353 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 354 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 355 } 356 357 TEST_P(NewKeyGeneration, HmacSha256) { 358 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 359 .HmacKey(128) 360 .Digest(KM_DIGEST_SHA_2_256) 361 .Authorization(TAG_MIN_MAC_LENGTH, 256))); 362 363 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 364 } 365 366 TEST_P(NewKeyGeneration, CheckKeySizes) { 367 for (size_t key_size = 0; key_size <= kMaxHmacKeyLengthBits + 10; ++key_size) { 368 if (key_size < kMinHmacKeyLengthBits || key_size > kMaxHmacKeyLengthBits || 369 key_size % 8 != 0) { 370 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_SIZE, 371 GenerateKey(AuthorizationSetBuilder() 372 .HmacKey(key_size) 373 .Digest(KM_DIGEST_SHA_2_256) 374 .Authorization(TAG_MIN_MAC_LENGTH, 256))) 375 << "HMAC key size " << key_size << " invalid."; 376 } else { 377 EXPECT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 378 .HmacKey(key_size) 379 .Digest(KM_DIGEST_SHA_2_256) 380 .Authorization(TAG_MIN_MAC_LENGTH, 256))); 381 } 382 } 383 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 384 } 385 386 TEST_P(NewKeyGeneration, HmacMultipleDigests) { 387 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, 388 GenerateKey(AuthorizationSetBuilder() 389 .HmacKey(128) 390 .Digest(KM_DIGEST_SHA1) 391 .Digest(KM_DIGEST_SHA_2_256) 392 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 393 394 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 395 } 396 397 TEST_P(NewKeyGeneration, HmacDigestNone) { 398 ASSERT_EQ(KM_ERROR_UNSUPPORTED_DIGEST, 399 GenerateKey(AuthorizationSetBuilder() 400 .HmacKey(128) 401 .Digest(KM_DIGEST_NONE) 402 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 403 404 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 405 } 406 407 TEST_P(NewKeyGeneration, HmacSha256TooShortMacLength) { 408 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH, 409 GenerateKey(AuthorizationSetBuilder() 410 .HmacKey(128) 411 .Digest(KM_DIGEST_SHA_2_256) 412 .Authorization(TAG_MIN_MAC_LENGTH, 48))); 413 414 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 415 } 416 417 TEST_P(NewKeyGeneration, HmacSha256NonIntegralOctetMacLength) { 418 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH, 419 GenerateKey(AuthorizationSetBuilder() 420 .HmacKey(128) 421 .Digest(KM_DIGEST_SHA_2_256) 422 .Authorization(TAG_MIN_MAC_LENGTH, 130))); 423 424 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 425 } 426 427 TEST_P(NewKeyGeneration, HmacSha256TooLongMacLength) { 428 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MIN_MAC_LENGTH, 429 GenerateKey(AuthorizationSetBuilder() 430 .HmacKey(128) 431 .Digest(KM_DIGEST_SHA_2_256) 432 .Authorization(TAG_MIN_MAC_LENGTH, 384))); 433 434 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 435 } 436 437 typedef Keymaster2Test GetKeyCharacteristics; 438 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, GetKeyCharacteristics, test_params); 439 440 TEST_P(GetKeyCharacteristics, SimpleRsa) { 441 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 442 .RsaSigningKey(256, 3) 443 .Digest(KM_DIGEST_NONE) 444 .Padding(KM_PAD_NONE))); 445 AuthorizationSet original(sw_enforced()); 446 447 ASSERT_EQ(KM_ERROR_OK, GetCharacteristics()); 448 EXPECT_EQ(original, sw_enforced()); 449 450 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 451 EXPECT_EQ(1, GetParam()->keymaster0_calls()); 452 } 453 454 typedef Keymaster2Test SigningOperationsTest; 455 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, SigningOperationsTest, test_params); 456 457 TEST_P(SigningOperationsTest, RsaSuccess) { 458 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 459 .RsaSigningKey(256, 3) 460 .Digest(KM_DIGEST_NONE) 461 .Padding(KM_PAD_NONE))); 462 string message = "12345678901234567890123456789012"; 463 string signature; 464 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE); 465 466 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 467 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 468 } 469 470 TEST_P(SigningOperationsTest, RsaPssSha256Success) { 471 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 472 .RsaSigningKey(768, 3) 473 .Digest(KM_DIGEST_SHA_2_256) 474 .Padding(KM_PAD_RSA_PSS))); 475 // Use large message, which won't work without digesting. 476 string message(1024, 'a'); 477 string signature; 478 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS); 479 480 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 481 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 482 } 483 484 TEST_P(SigningOperationsTest, RsaPaddingNoneDoesNotAllowOther) { 485 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 486 .RsaSigningKey(512, 3) 487 .Digest(KM_DIGEST_NONE) 488 .Padding(KM_PAD_NONE))); 489 string message = "12345678901234567890123456789012"; 490 string signature; 491 492 AuthorizationSet begin_params(client_params()); 493 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 494 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN); 495 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 496 497 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 498 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 499 } 500 501 TEST_P(SigningOperationsTest, RsaPkcs1Sha256Success) { 502 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 503 .RsaSigningKey(512, 3) 504 .Digest(KM_DIGEST_SHA_2_256) 505 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN))); 506 string message(1024, 'a'); 507 string signature; 508 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN); 509 510 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 511 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 512 } 513 514 TEST_P(SigningOperationsTest, RsaPkcs1NoDigestSuccess) { 515 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 516 .RsaSigningKey(512, 3) 517 .Digest(KM_DIGEST_NONE) 518 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN))); 519 string message(53, 'a'); 520 string signature; 521 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN); 522 523 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 524 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 525 } 526 527 TEST_P(SigningOperationsTest, RsaPkcs1NoDigestTooLarge) { 528 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 529 .RsaSigningKey(512, 3) 530 .Digest(KM_DIGEST_NONE) 531 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN))); 532 string message(54, 'a'); 533 534 AuthorizationSet begin_params(client_params()); 535 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 536 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN); 537 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 538 string result; 539 string signature; 540 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(message, "", &signature)); 541 542 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 543 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 544 } 545 546 TEST_P(SigningOperationsTest, RsaPssSha256TooSmallKey) { 547 // Key must be at least 10 bytes larger than hash, to provide eight bytes of random salt, so 548 // verify that nine bytes larger than hash won't work. 549 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 550 .RsaSigningKey(256 + 9 * 8, 3) 551 .Digest(KM_DIGEST_SHA_2_256) 552 .Padding(KM_PAD_RSA_PSS))); 553 string message(1024, 'a'); 554 string signature; 555 556 AuthorizationSet begin_params(client_params()); 557 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256); 558 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS); 559 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 560 } 561 562 TEST_P(SigningOperationsTest, RsaNoPaddingHugeData) { 563 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 564 .RsaSigningKey(256, 3) 565 .Digest(KM_DIGEST_NONE) 566 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN))); 567 string message(64 * 1024, 'a'); 568 string signature; 569 AuthorizationSet begin_params(client_params()); 570 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 571 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN); 572 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 573 string result; 574 size_t input_consumed; 575 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &result, &input_consumed)); 576 577 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 578 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 579 } 580 581 TEST_P(SigningOperationsTest, RsaAbort) { 582 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 583 .RsaSigningKey(256, 3) 584 .Digest(KM_DIGEST_NONE) 585 .Padding(KM_PAD_NONE))); 586 AuthorizationSet begin_params(client_params()); 587 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 588 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 589 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 590 EXPECT_EQ(KM_ERROR_OK, AbortOperation()); 591 // Another abort should fail 592 EXPECT_EQ(KM_ERROR_INVALID_OPERATION_HANDLE, AbortOperation()); 593 594 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 595 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 596 } 597 598 TEST_P(SigningOperationsTest, RsaUnsupportedPadding) { 599 GenerateKey(AuthorizationSetBuilder() 600 .RsaSigningKey(256, 3) 601 .Digest(KM_DIGEST_SHA_2_256 /* supported digest */) 602 .Padding(KM_PAD_PKCS7)); 603 AuthorizationSet begin_params(client_params()); 604 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256); 605 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 606 607 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 608 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 609 } 610 611 TEST_P(SigningOperationsTest, RsaNoDigest) { 612 // PSS requires a digest. 613 GenerateKey(AuthorizationSetBuilder() 614 .RsaSigningKey(256, 3) 615 .Digest(KM_DIGEST_NONE) 616 .Padding(KM_PAD_RSA_PSS)); 617 AuthorizationSet begin_params(client_params()); 618 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 619 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS); 620 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 621 622 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 623 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 624 } 625 626 TEST_P(SigningOperationsTest, RsaNoPadding) { 627 // Padding must be specified 628 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaKey(256, 3).SigningKey().Digest( 629 KM_DIGEST_NONE))); 630 AuthorizationSet begin_params(client_params()); 631 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 632 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PADDING_MODE, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 633 634 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 635 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 636 } 637 638 TEST_P(SigningOperationsTest, RsaTooShortMessage) { 639 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 640 .RsaSigningKey(256, 3) 641 .Digest(KM_DIGEST_NONE) 642 .Padding(KM_PAD_NONE))); 643 string message = "1234567890123456789012345678901"; 644 string signature; 645 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE); 646 647 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 648 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 649 } 650 651 TEST_P(SigningOperationsTest, RsaSignWithEncryptionKey) { 652 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 653 .RsaEncryptionKey(256, 3) 654 .Digest(KM_DIGEST_NONE) 655 .Padding(KM_PAD_NONE))); 656 AuthorizationSet begin_params(client_params()); 657 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 658 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 659 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 660 661 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 662 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 663 } 664 665 TEST_P(SigningOperationsTest, RsaSignTooLargeMessage) { 666 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 667 .RsaSigningKey(256, 3) 668 .Digest(KM_DIGEST_NONE) 669 .Padding(KM_PAD_NONE))); 670 string message(256 / 8, static_cast<char>(0xff)); 671 string signature; 672 AuthorizationSet begin_params(client_params()); 673 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 674 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 675 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 676 string result; 677 size_t input_consumed; 678 ASSERT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed)); 679 ASSERT_EQ(message.size(), input_consumed); 680 string output; 681 ASSERT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&output)); 682 683 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 684 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 685 } 686 687 TEST_P(SigningOperationsTest, EcdsaSuccess) { 688 ASSERT_EQ(KM_ERROR_OK, 689 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE))); 690 string message(224 / 8, 'a'); 691 string signature; 692 SignMessage(message, &signature, KM_DIGEST_NONE); 693 694 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 695 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 696 } 697 698 TEST_P(SigningOperationsTest, EcdsaSha256Success) { 699 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest( 700 KM_DIGEST_SHA_2_256))); 701 string message(1024, 'a'); 702 string signature; 703 SignMessage(message, &signature, KM_DIGEST_SHA_2_256); 704 705 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 706 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 707 } 708 709 TEST_P(SigningOperationsTest, EcdsaSha384Success) { 710 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest( 711 KM_DIGEST_SHA_2_384))); 712 string message(1024, 'a'); 713 string signature; 714 SignMessage(message, &signature, KM_DIGEST_SHA_2_384); 715 716 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 717 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 718 } 719 720 TEST_P(SigningOperationsTest, EcdsaNoPaddingHugeData) { 721 ASSERT_EQ(KM_ERROR_OK, 722 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE))); 723 string message(64 * 1024, 'a'); 724 string signature; 725 AuthorizationSet begin_params(client_params()); 726 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 727 ASSERT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 728 string result; 729 size_t input_consumed; 730 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed)); 731 732 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 733 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 734 } 735 736 TEST_P(SigningOperationsTest, EcdsaAllSizesAndHashes) { 737 vector<int> key_sizes = {224, 256, 384, 521}; 738 vector<keymaster_digest_t> digests = { 739 KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, 740 KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512, 741 }; 742 743 for (int key_size : key_sizes) { 744 for (keymaster_digest_t digest : digests) { 745 ASSERT_EQ( 746 KM_ERROR_OK, 747 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(key_size).Digest(digest))); 748 749 string message(1024, 'a'); 750 string signature; 751 if (digest == KM_DIGEST_NONE) 752 message.resize(key_size / 8); 753 SignMessage(message, &signature, digest); 754 } 755 } 756 757 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 758 EXPECT_EQ(digests.size() * key_sizes.size() * 3, 759 static_cast<size_t>(GetParam()->keymaster0_calls())); 760 } 761 762 TEST_P(SigningOperationsTest, AesEcbSign) { 763 ASSERT_EQ(KM_ERROR_OK, 764 GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128).Authorization( 765 TAG_BLOCK_MODE, KM_MODE_ECB))); 766 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_SIGN)); 767 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_VERIFY)); 768 769 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 770 } 771 772 TEST_P(SigningOperationsTest, HmacSha1Success) { 773 GenerateKey(AuthorizationSetBuilder() 774 .HmacKey(128) 775 .Digest(KM_DIGEST_SHA1) 776 .Authorization(TAG_MIN_MAC_LENGTH, 160)); 777 string message = "12345678901234567890123456789012"; 778 string signature; 779 MacMessage(message, &signature, 160); 780 ASSERT_EQ(20U, signature.size()); 781 782 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 783 } 784 785 TEST_P(SigningOperationsTest, HmacSha224Success) { 786 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 787 .HmacKey(128) 788 .Digest(KM_DIGEST_SHA_2_224) 789 .Authorization(TAG_MIN_MAC_LENGTH, 160))); 790 string message = "12345678901234567890123456789012"; 791 string signature; 792 MacMessage(message, &signature, 224); 793 ASSERT_EQ(28U, signature.size()); 794 795 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 796 } 797 798 TEST_P(SigningOperationsTest, HmacSha256Success) { 799 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 800 .HmacKey(128) 801 .Digest(KM_DIGEST_SHA_2_256) 802 .Authorization(TAG_MIN_MAC_LENGTH, 256))); 803 string message = "12345678901234567890123456789012"; 804 string signature; 805 MacMessage(message, &signature, 256); 806 ASSERT_EQ(32U, signature.size()); 807 808 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 809 } 810 811 TEST_P(SigningOperationsTest, HmacSha384Success) { 812 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 813 .HmacKey(128) 814 .Digest(KM_DIGEST_SHA_2_384) 815 .Authorization(TAG_MIN_MAC_LENGTH, 384))); 816 817 string message = "12345678901234567890123456789012"; 818 string signature; 819 MacMessage(message, &signature, 384); 820 ASSERT_EQ(48U, signature.size()); 821 822 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 823 } 824 825 TEST_P(SigningOperationsTest, HmacSha512Success) { 826 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 827 .HmacKey(128) 828 .Digest(KM_DIGEST_SHA_2_512) 829 .Authorization(TAG_MIN_MAC_LENGTH, 384))); 830 string message = "12345678901234567890123456789012"; 831 string signature; 832 MacMessage(message, &signature, 512); 833 ASSERT_EQ(64U, signature.size()); 834 835 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 836 } 837 838 TEST_P(SigningOperationsTest, HmacLengthInKey) { 839 // TODO(swillden): unified API should generate an error on key generation. 840 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 841 .HmacKey(128) 842 .Digest(KM_DIGEST_SHA_2_256) 843 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 844 string message = "12345678901234567890123456789012"; 845 string signature; 846 MacMessage(message, &signature, 160); 847 ASSERT_EQ(20U, signature.size()); 848 849 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 850 } 851 852 TEST_P(SigningOperationsTest, HmacRfc4231TestCase3) { 853 string key(20, 0xaa); 854 string message(50, 0xdd); 855 uint8_t sha_224_expected[] = { 856 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6, 0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a, 857 0xd2, 0x64, 0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1, 0xec, 0x83, 0x33, 0xea, 858 }; 859 uint8_t sha_256_expected[] = { 860 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46, 0x85, 0x4d, 0xb8, 861 0xeb, 0xd0, 0x91, 0x81, 0xa7, 0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 862 0xc1, 0x22, 0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe, 863 }; 864 uint8_t sha_384_expected[] = { 865 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a, 0x0a, 0xa2, 0xac, 0xe0, 866 0x14, 0xc8, 0xa8, 0x6f, 0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb, 867 0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b, 0x2a, 0x5a, 0xb3, 0x9d, 868 0xc1, 0x38, 0x14, 0xb9, 0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27, 869 }; 870 uint8_t sha_512_expected[] = { 871 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84, 0xef, 0xb0, 0xf0, 0x75, 0x6c, 872 0x89, 0x0b, 0xe9, 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36, 0x55, 0xf8, 873 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39, 0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22, 874 0xc8, 0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07, 0xb9, 0x46, 0xa3, 0x37, 875 0xbe, 0xe8, 0x94, 0x26, 0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb, 876 }; 877 878 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected)); 879 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected)); 880 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected)); 881 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected)); 882 883 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 884 } 885 886 TEST_P(SigningOperationsTest, HmacRfc4231TestCase4) { 887 uint8_t key_data[25] = { 888 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 889 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 890 }; 891 string key = make_string(key_data); 892 string message(50, 0xcd); 893 uint8_t sha_224_expected[] = { 894 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac, 0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82, 895 0x62, 0x7c, 0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d, 0xe7, 0xaf, 0xec, 0x5a, 896 }; 897 uint8_t sha_256_expected[] = { 898 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e, 0xa4, 0xcc, 0x81, 899 0x98, 0x99, 0xf2, 0x08, 0x3a, 0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 900 0xf8, 0x07, 0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b, 901 }; 902 uint8_t sha_384_expected[] = { 903 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85, 0x19, 0x33, 0xab, 0x62, 904 0x90, 0xaf, 0x6c, 0xa7, 0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c, 905 0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e, 0x68, 0x01, 0xdd, 0x23, 906 0xc4, 0xa7, 0xd6, 0x79, 0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb, 907 }; 908 uint8_t sha_512_expected[] = { 909 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69, 0x90, 0xe5, 0xa8, 0xc5, 0xf6, 910 0x1d, 0x4a, 0xf7, 0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d, 0xe7, 0x6f, 911 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb, 0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e, 912 0xb4, 0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63, 0xa5, 0xf1, 0x97, 0x41, 913 0x12, 0x0c, 0x4f, 0x2d, 0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd, 914 }; 915 916 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected)); 917 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected)); 918 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected)); 919 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected)); 920 921 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 922 } 923 924 TEST_P(SigningOperationsTest, HmacRfc4231TestCase5) { 925 string key(20, 0x0c); 926 string message = "Test With Truncation"; 927 928 uint8_t sha_224_expected[] = { 929 0x0e, 0x2a, 0xea, 0x68, 0xa9, 0x0c, 0x8d, 0x37, 930 0xc9, 0x88, 0xbc, 0xdb, 0x9f, 0xca, 0x6f, 0xa8, 931 }; 932 uint8_t sha_256_expected[] = { 933 0xa3, 0xb6, 0x16, 0x74, 0x73, 0x10, 0x0e, 0xe0, 934 0x6e, 0x0c, 0x79, 0x6c, 0x29, 0x55, 0x55, 0x2b, 935 }; 936 uint8_t sha_384_expected[] = { 937 0x3a, 0xbf, 0x34, 0xc3, 0x50, 0x3b, 0x2a, 0x23, 938 0xa4, 0x6e, 0xfc, 0x61, 0x9b, 0xae, 0xf8, 0x97, 939 }; 940 uint8_t sha_512_expected[] = { 941 0x41, 0x5f, 0xad, 0x62, 0x71, 0x58, 0x0a, 0x53, 942 0x1d, 0x41, 0x79, 0xbc, 0x89, 0x1d, 0x87, 0xa6, 943 }; 944 945 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected)); 946 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected)); 947 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected)); 948 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected)); 949 950 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 951 } 952 953 TEST_P(SigningOperationsTest, HmacRfc4231TestCase6) { 954 string key(131, 0xaa); 955 string message = "Test Using Larger Than Block-Size Key - Hash Key First"; 956 957 uint8_t sha_224_expected[] = { 958 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad, 0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d, 959 0xbc, 0xe2, 0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27, 0x3f, 0xa6, 0x87, 0x0e, 960 }; 961 uint8_t sha_256_expected[] = { 962 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f, 0x0d, 0x8a, 0x26, 963 0xaa, 0xcb, 0xf5, 0xb7, 0x7f, 0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 964 0xc5, 0x14, 0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54, 965 }; 966 uint8_t sha_384_expected[] = { 967 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90, 0x88, 0xd2, 0xc6, 0x3a, 968 0x04, 0x1b, 0xc5, 0xb4, 0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f, 969 0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6, 0x0c, 0x2e, 0xf6, 0xab, 970 0x40, 0x30, 0xfe, 0x82, 0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52, 971 }; 972 uint8_t sha_512_expected[] = { 973 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb, 0xb7, 0x14, 0x93, 0xc1, 0xdd, 974 0x7b, 0xe8, 0xb4, 0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1, 0x12, 0x1b, 975 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52, 0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25, 976 0x98, 0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52, 0x95, 0xe6, 0x4f, 0x73, 977 0xf6, 0x3f, 0x0a, 0xec, 0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98, 978 }; 979 980 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected)); 981 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected)); 982 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected)); 983 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected)); 984 985 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 986 } 987 988 TEST_P(SigningOperationsTest, HmacRfc4231TestCase7) { 989 string key(131, 0xaa); 990 string message = "This is a test using a larger than block-size key and a larger than " 991 "block-size data. The key needs to be hashed before being used by the HMAC " 992 "algorithm."; 993 994 uint8_t sha_224_expected[] = { 995 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02, 0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3, 996 0x9d, 0xbd, 0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9, 0xf6, 0xf5, 0x65, 0xd1, 997 }; 998 uint8_t sha_256_expected[] = { 999 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb, 0x27, 0x63, 0x5f, 1000 0xbc, 0xd5, 0xb0, 0xe9, 0x44, 0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 1001 0x13, 0x93, 0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2, 1002 }; 1003 uint8_t sha_384_expected[] = { 1004 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d, 0x35, 0x1e, 0x2f, 0x25, 1005 0x4e, 0x8f, 0xd3, 0x2c, 0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a, 1006 0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5, 0xa6, 0x78, 0xcc, 0x31, 1007 0xe7, 0x99, 0x17, 0x6d, 0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e, 1008 }; 1009 uint8_t sha_512_expected[] = { 1010 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba, 0xa4, 0xdf, 0xa9, 0xf9, 0x6e, 1011 0x5e, 0x3f, 0xfd, 0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86, 0x5d, 0xf5, 1012 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44, 0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82, 1013 0xb1, 0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15, 0x13, 0x46, 0x76, 0xfb, 1014 0x6d, 0xe0, 0x44, 0x60, 0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58, 1015 }; 1016 1017 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_224, make_string(sha_224_expected)); 1018 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_256, make_string(sha_256_expected)); 1019 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_384, make_string(sha_384_expected)); 1020 CheckHmacTestVector(key, message, KM_DIGEST_SHA_2_512, make_string(sha_512_expected)); 1021 1022 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1023 } 1024 1025 TEST_P(SigningOperationsTest, HmacSha256TooLargeMacLength) { 1026 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1027 .HmacKey(128) 1028 .Digest(KM_DIGEST_SHA_2_256) 1029 .Authorization(TAG_MIN_MAC_LENGTH, 256))); 1030 AuthorizationSet begin_params(client_params()); 1031 begin_params.push_back(TAG_MAC_LENGTH, 264); 1032 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256); 1033 ASSERT_EQ(KM_ERROR_UNSUPPORTED_MAC_LENGTH, 1034 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */)); 1035 1036 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1037 } 1038 1039 TEST_P(SigningOperationsTest, HmacSha256TooSmallMacLength) { 1040 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1041 .HmacKey(128) 1042 .Digest(KM_DIGEST_SHA_2_256) 1043 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 1044 AuthorizationSet begin_params(client_params()); 1045 begin_params.push_back(TAG_MAC_LENGTH, 120); 1046 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256); 1047 ASSERT_EQ(KM_ERROR_INVALID_MAC_LENGTH, 1048 BeginOperation(KM_PURPOSE_SIGN, begin_params, nullptr /* output_params */)); 1049 1050 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1051 } 1052 1053 // TODO(swillden): Add more verification failure tests. 1054 1055 typedef Keymaster2Test VerificationOperationsTest; 1056 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, VerificationOperationsTest, test_params); 1057 1058 TEST_P(VerificationOperationsTest, RsaSuccess) { 1059 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1060 .RsaSigningKey(256, 3) 1061 .Digest(KM_DIGEST_NONE) 1062 .Padding(KM_PAD_NONE))); 1063 string message = "12345678901234567890123456789012"; 1064 string signature; 1065 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE); 1066 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE); 1067 1068 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1069 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1070 } 1071 1072 TEST_P(VerificationOperationsTest, RsaPssSha256Success) { 1073 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1074 .RsaSigningKey(768, 3) 1075 .Digest(KM_DIGEST_SHA_2_256) 1076 .Padding(KM_PAD_RSA_PSS))); 1077 // Use large message, which won't work without digesting. 1078 string message(1024, 'a'); 1079 string signature; 1080 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS); 1081 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS); 1082 1083 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1084 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1085 } 1086 1087 TEST_P(VerificationOperationsTest, RsaPssSha224Success) { 1088 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1089 .RsaSigningKey(512, 3) 1090 .Digest(KM_DIGEST_SHA_2_224) 1091 .Padding(KM_PAD_RSA_PSS))); 1092 // Use large message, which won't work without digesting. 1093 string message(1024, 'a'); 1094 string signature; 1095 SignMessage(message, &signature, KM_DIGEST_SHA_2_224, KM_PAD_RSA_PSS); 1096 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224, KM_PAD_RSA_PSS); 1097 1098 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1099 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1100 1101 // Verify with OpenSSL. 1102 string pubkey; 1103 EXPECT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &pubkey)); 1104 1105 const uint8_t* p = reinterpret_cast<const uint8_t*>(pubkey.data()); 1106 unique_ptr<EVP_PKEY, EVP_PKEY_Delete> pkey( 1107 d2i_PUBKEY(nullptr /* alloc new */, &p, pubkey.size())); 1108 ASSERT_TRUE(pkey.get()); 1109 1110 EVP_MD_CTX digest_ctx; 1111 EVP_MD_CTX_init(&digest_ctx); 1112 EVP_PKEY_CTX* pkey_ctx; 1113 EXPECT_EQ(1, EVP_DigestVerifyInit(&digest_ctx, &pkey_ctx, EVP_sha224(), nullptr /* engine */, 1114 pkey.get())); 1115 EXPECT_EQ(1, EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING)); 1116 EXPECT_EQ(1, EVP_DigestVerifyUpdate(&digest_ctx, message.data(), message.size())); 1117 EXPECT_EQ(1, 1118 EVP_DigestVerifyFinal(&digest_ctx, reinterpret_cast<const uint8_t*>(signature.data()), 1119 signature.size())); 1120 EVP_MD_CTX_cleanup(&digest_ctx); 1121 } 1122 1123 TEST_P(VerificationOperationsTest, RsaPssSha256CorruptSignature) { 1124 GenerateKey(AuthorizationSetBuilder() 1125 .RsaSigningKey(768, 3) 1126 .Digest(KM_DIGEST_SHA_2_256) 1127 .Padding(KM_PAD_RSA_PSS)); 1128 string message(1024, 'a'); 1129 string signature; 1130 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS); 1131 ++signature[signature.size() / 2]; 1132 1133 AuthorizationSet begin_params(client_params()); 1134 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256); 1135 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS); 1136 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params)); 1137 1138 string result; 1139 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(message, signature, &result)); 1140 1141 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1142 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1143 } 1144 1145 TEST_P(VerificationOperationsTest, RsaPssSha256CorruptInput) { 1146 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1147 .RsaSigningKey(768, 3) 1148 .Digest(KM_DIGEST_SHA_2_256) 1149 .Padding(KM_PAD_RSA_PSS))); 1150 // Use large message, which won't work without digesting. 1151 string message(1024, 'a'); 1152 string signature; 1153 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PSS); 1154 ++message[message.size() / 2]; 1155 1156 AuthorizationSet begin_params(client_params()); 1157 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256); 1158 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PSS); 1159 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params)); 1160 1161 string result; 1162 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(message, signature, &result)); 1163 1164 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1165 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1166 } 1167 1168 TEST_P(VerificationOperationsTest, RsaPkcs1Sha256Success) { 1169 GenerateKey(AuthorizationSetBuilder() 1170 .RsaSigningKey(512, 3) 1171 .Digest(KM_DIGEST_SHA_2_256) 1172 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)); 1173 string message(1024, 'a'); 1174 string signature; 1175 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN); 1176 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN); 1177 1178 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1179 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1180 } 1181 1182 TEST_P(VerificationOperationsTest, RsaPks1Sha224Success) { 1183 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1184 .RsaSigningKey(512, 3) 1185 .Digest(KM_DIGEST_SHA_2_224) 1186 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN))); 1187 // Use large message, which won't work without digesting. 1188 string message(1024, 'a'); 1189 string signature; 1190 SignMessage(message, &signature, KM_DIGEST_SHA_2_224, KM_PAD_RSA_PKCS1_1_5_SIGN); 1191 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224, KM_PAD_RSA_PKCS1_1_5_SIGN); 1192 1193 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1194 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1195 1196 // Verify with OpenSSL. 1197 string pubkey; 1198 EXPECT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &pubkey)); 1199 1200 const uint8_t* p = reinterpret_cast<const uint8_t*>(pubkey.data()); 1201 unique_ptr<EVP_PKEY, EVP_PKEY_Delete> pkey( 1202 d2i_PUBKEY(nullptr /* alloc new */, &p, pubkey.size())); 1203 ASSERT_TRUE(pkey.get()); 1204 1205 EVP_MD_CTX digest_ctx; 1206 EVP_MD_CTX_init(&digest_ctx); 1207 EVP_PKEY_CTX* pkey_ctx; 1208 EXPECT_EQ(1, EVP_DigestVerifyInit(&digest_ctx, &pkey_ctx, EVP_sha224(), nullptr /* engine */, 1209 pkey.get())); 1210 EXPECT_EQ(1, EVP_DigestVerifyUpdate(&digest_ctx, message.data(), message.size())); 1211 EXPECT_EQ(1, 1212 EVP_DigestVerifyFinal(&digest_ctx, reinterpret_cast<const uint8_t*>(signature.data()), 1213 signature.size())); 1214 EVP_MD_CTX_cleanup(&digest_ctx); 1215 } 1216 1217 TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptSignature) { 1218 GenerateKey(AuthorizationSetBuilder() 1219 .RsaSigningKey(512, 3) 1220 .Digest(KM_DIGEST_SHA_2_256) 1221 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN)); 1222 string message(1024, 'a'); 1223 string signature; 1224 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN); 1225 ++signature[signature.size() / 2]; 1226 1227 AuthorizationSet begin_params(client_params()); 1228 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256); 1229 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN); 1230 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params)); 1231 1232 string result; 1233 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(message, signature, &result)); 1234 1235 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1236 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1237 } 1238 1239 TEST_P(VerificationOperationsTest, RsaPkcs1Sha256CorruptInput) { 1240 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1241 .RsaSigningKey(512, 3) 1242 .Digest(KM_DIGEST_SHA_2_256) 1243 .Padding(KM_PAD_RSA_PKCS1_1_5_SIGN))); 1244 // Use large message, which won't work without digesting. 1245 string message(1024, 'a'); 1246 string signature; 1247 SignMessage(message, &signature, KM_DIGEST_SHA_2_256, KM_PAD_RSA_PKCS1_1_5_SIGN); 1248 ++message[message.size() / 2]; 1249 1250 AuthorizationSet begin_params(client_params()); 1251 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256); 1252 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN); 1253 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params)); 1254 1255 string result; 1256 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(message, signature, &result)); 1257 1258 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1259 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1260 } 1261 1262 TEST_P(VerificationOperationsTest, RsaAllDigestAndPadCombinations) { 1263 vector<keymaster_digest_t> digests = { 1264 KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224, 1265 KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512, 1266 }; 1267 1268 vector<keymaster_padding_t> padding_modes{ 1269 KM_PAD_NONE, KM_PAD_RSA_PKCS1_1_5_SIGN, KM_PAD_RSA_PSS, 1270 }; 1271 1272 int trial_count = 0; 1273 for (keymaster_padding_t padding_mode : padding_modes) { 1274 for (keymaster_digest_t digest : digests) { 1275 if (digest != KM_DIGEST_NONE && padding_mode == KM_PAD_NONE) 1276 // Digesting requires padding 1277 continue; 1278 1279 // Compute key & message size that will work. 1280 size_t key_bits = 0; 1281 size_t message_len = 1000; 1282 1283 if (digest == KM_DIGEST_NONE) { 1284 key_bits = 256; 1285 switch (padding_mode) { 1286 case KM_PAD_NONE: 1287 // Match key size. 1288 message_len = key_bits / 8; 1289 break; 1290 case KM_PAD_RSA_PKCS1_1_5_SIGN: 1291 message_len = key_bits / 8 - 11; 1292 break; 1293 case KM_PAD_RSA_PSS: 1294 // PSS requires a digest. 1295 continue; 1296 default: 1297 FAIL() << "Missing padding"; 1298 break; 1299 } 1300 } else { 1301 size_t digest_bits; 1302 switch (digest) { 1303 case KM_DIGEST_MD5: 1304 digest_bits = 128; 1305 break; 1306 case KM_DIGEST_SHA1: 1307 digest_bits = 160; 1308 break; 1309 case KM_DIGEST_SHA_2_224: 1310 digest_bits = 224; 1311 break; 1312 case KM_DIGEST_SHA_2_256: 1313 digest_bits = 256; 1314 break; 1315 case KM_DIGEST_SHA_2_384: 1316 digest_bits = 384; 1317 break; 1318 case KM_DIGEST_SHA_2_512: 1319 digest_bits = 512; 1320 break; 1321 default: 1322 FAIL() << "Missing digest"; 1323 } 1324 1325 switch (padding_mode) { 1326 case KM_PAD_RSA_PKCS1_1_5_SIGN: 1327 key_bits = digest_bits + 8 * (11 + 19); 1328 break; 1329 case KM_PAD_RSA_PSS: 1330 key_bits = digest_bits * 2 + 2 * 8; 1331 break; 1332 default: 1333 FAIL() << "Missing padding"; 1334 break; 1335 } 1336 } 1337 1338 // Round up to the nearest multiple of 128. 1339 key_bits = (key_bits + 127) / 128 * 128; 1340 1341 GenerateKey(AuthorizationSetBuilder() 1342 .RsaSigningKey(key_bits, 3) 1343 .Digest(digest) 1344 .Padding(padding_mode)); 1345 string message(message_len, 'a'); 1346 string signature; 1347 SignMessage(message, &signature, digest, padding_mode); 1348 VerifyMessage(message, signature, digest, padding_mode); 1349 ++trial_count; 1350 } 1351 } 1352 1353 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1354 EXPECT_EQ(trial_count * 4, GetParam()->keymaster0_calls()); 1355 } 1356 1357 TEST_P(VerificationOperationsTest, EcdsaSuccess) { 1358 ASSERT_EQ(KM_ERROR_OK, 1359 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE))); 1360 string message = "12345678901234567890123456789012"; 1361 string signature; 1362 SignMessage(message, &signature, KM_DIGEST_NONE); 1363 VerifyMessage(message, signature, KM_DIGEST_NONE); 1364 1365 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1366 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1367 } 1368 1369 TEST_P(VerificationOperationsTest, EcdsaTooShort) { 1370 ASSERT_EQ(KM_ERROR_OK, 1371 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE))); 1372 string message = "12345678901234567890"; 1373 string signature; 1374 SignMessage(message, &signature, KM_DIGEST_NONE); 1375 VerifyMessage(message, signature, KM_DIGEST_NONE); 1376 1377 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1378 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1379 } 1380 1381 TEST_P(VerificationOperationsTest, EcdsaSlightlyTooLong) { 1382 ASSERT_EQ(KM_ERROR_OK, 1383 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(521).Digest(KM_DIGEST_NONE))); 1384 1385 string message(66, 'a'); 1386 string signature; 1387 SignMessage(message, &signature, KM_DIGEST_NONE); 1388 VerifyMessage(message, signature, KM_DIGEST_NONE); 1389 1390 // Modifying low-order bits doesn't matter, because they didn't get signed. Ugh. 1391 message[65] ^= 7; 1392 VerifyMessage(message, signature, KM_DIGEST_NONE); 1393 1394 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1395 EXPECT_EQ(5, GetParam()->keymaster0_calls()); 1396 } 1397 1398 TEST_P(VerificationOperationsTest, EcdsaSha256Success) { 1399 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1400 .EcdsaSigningKey(256) 1401 .Digest(KM_DIGEST_SHA_2_256) 1402 .Digest(KM_DIGEST_NONE))); 1403 string message = "12345678901234567890123456789012"; 1404 string signature; 1405 SignMessage(message, &signature, KM_DIGEST_SHA_2_256); 1406 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256); 1407 1408 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1409 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1410 1411 // Just for giggles, try verifying with the wrong digest. 1412 AuthorizationSet begin_params(client_params()); 1413 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 1414 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params)); 1415 1416 string result; 1417 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(message, signature, &result)); 1418 } 1419 1420 TEST_P(VerificationOperationsTest, EcdsaSha224Success) { 1421 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest( 1422 KM_DIGEST_SHA_2_224))); 1423 1424 string message = "12345678901234567890123456789012"; 1425 string signature; 1426 SignMessage(message, &signature, KM_DIGEST_SHA_2_224); 1427 VerifyMessage(message, signature, KM_DIGEST_SHA_2_224); 1428 1429 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1430 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1431 1432 // Just for giggles, try verifying with the wrong digest. 1433 AuthorizationSet begin_params(client_params()); 1434 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 1435 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params)); 1436 1437 string result; 1438 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(message, signature, &result)); 1439 } 1440 1441 TEST_P(VerificationOperationsTest, EcdsaAllDigestsAndKeySizes) { 1442 keymaster_digest_t digests[] = { 1443 KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224, KM_DIGEST_SHA_2_256, 1444 KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512, 1445 }; 1446 size_t key_sizes[] = {224, 256, 384, 521}; 1447 1448 string message = "1234567890"; 1449 string signature; 1450 1451 for (auto key_size : key_sizes) { 1452 SCOPED_TRACE(testing::Message() << "Key size: " << key_size); 1453 AuthorizationSetBuilder builder; 1454 builder.EcdsaSigningKey(key_size); 1455 for (auto digest : digests) 1456 builder.Digest(digest); 1457 ASSERT_EQ(KM_ERROR_OK, GenerateKey(builder)); 1458 1459 for (auto digest : digests) { 1460 SCOPED_TRACE(testing::Message() << "Digest: " << digest); 1461 SignMessage(message, &signature, digest); 1462 VerifyMessage(message, signature, digest); 1463 } 1464 } 1465 1466 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1467 EXPECT_EQ(static_cast<int>(array_length(key_sizes) * (1 + 3 * array_length(digests))), 1468 GetParam()->keymaster0_calls()); 1469 } 1470 1471 TEST_P(VerificationOperationsTest, HmacSha1Success) { 1472 GenerateKey(AuthorizationSetBuilder() 1473 .HmacKey(128) 1474 .Digest(KM_DIGEST_SHA1) 1475 .Authorization(TAG_MIN_MAC_LENGTH, 128)); 1476 string message = "123456789012345678901234567890123456789012345678"; 1477 string signature; 1478 MacMessage(message, &signature, 160); 1479 VerifyMac(message, signature); 1480 1481 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1482 } 1483 1484 TEST_P(VerificationOperationsTest, HmacSha224Success) { 1485 GenerateKey(AuthorizationSetBuilder() 1486 .HmacKey(128) 1487 .Digest(KM_DIGEST_SHA_2_224) 1488 .Authorization(TAG_MIN_MAC_LENGTH, 128)); 1489 string message = "123456789012345678901234567890123456789012345678"; 1490 string signature; 1491 MacMessage(message, &signature, 224); 1492 VerifyMac(message, signature); 1493 1494 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1495 } 1496 1497 TEST_P(VerificationOperationsTest, HmacSha256Success) { 1498 GenerateKey(AuthorizationSetBuilder() 1499 .HmacKey(128) 1500 .Digest(KM_DIGEST_SHA_2_256) 1501 .Authorization(TAG_MIN_MAC_LENGTH, 128)); 1502 string message = "123456789012345678901234567890123456789012345678"; 1503 string signature; 1504 MacMessage(message, &signature, 256); 1505 VerifyMac(message, signature); 1506 1507 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1508 } 1509 1510 TEST_P(VerificationOperationsTest, HmacSha256TooShortMac) { 1511 GenerateKey(AuthorizationSetBuilder() 1512 .HmacKey(128) 1513 .Digest(KM_DIGEST_SHA_2_256) 1514 .Authorization(TAG_MIN_MAC_LENGTH, 128)); 1515 string message = "123456789012345678901234567890123456789012345678"; 1516 string signature; 1517 MacMessage(message, &signature, 256); 1518 1519 // Shorten to 128 bits, should still work. 1520 signature.resize(128 / 8); 1521 VerifyMac(message, signature); 1522 1523 // Drop one more byte. 1524 signature.resize(signature.length() - 1); 1525 1526 AuthorizationSet begin_params(client_params()); 1527 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_VERIFY, begin_params)); 1528 string result; 1529 EXPECT_EQ(KM_ERROR_INVALID_MAC_LENGTH, FinishOperation(message, signature, &result)); 1530 1531 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1532 } 1533 1534 TEST_P(VerificationOperationsTest, HmacSha384Success) { 1535 GenerateKey(AuthorizationSetBuilder() 1536 .HmacKey(128) 1537 .Digest(KM_DIGEST_SHA_2_384) 1538 .Authorization(TAG_MIN_MAC_LENGTH, 128)); 1539 string message = "123456789012345678901234567890123456789012345678"; 1540 string signature; 1541 MacMessage(message, &signature, 384); 1542 VerifyMac(message, signature); 1543 1544 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1545 } 1546 1547 TEST_P(VerificationOperationsTest, HmacSha512Success) { 1548 GenerateKey(AuthorizationSetBuilder() 1549 .HmacKey(128) 1550 .Digest(KM_DIGEST_SHA_2_512) 1551 .Authorization(TAG_MIN_MAC_LENGTH, 128)); 1552 string message = "123456789012345678901234567890123456789012345678"; 1553 string signature; 1554 MacMessage(message, &signature, 512); 1555 VerifyMac(message, signature); 1556 1557 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1558 } 1559 1560 typedef Keymaster2Test ExportKeyTest; 1561 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ExportKeyTest, test_params); 1562 1563 TEST_P(ExportKeyTest, RsaSuccess) { 1564 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1565 .RsaSigningKey(256, 3) 1566 .Digest(KM_DIGEST_NONE) 1567 .Padding(KM_PAD_NONE))); 1568 string export_data; 1569 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data)); 1570 EXPECT_GT(export_data.length(), 0U); 1571 1572 // TODO(swillden): Verify that the exported key is actually usable to verify signatures. 1573 1574 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1575 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 1576 } 1577 1578 TEST_P(ExportKeyTest, EcdsaSuccess) { 1579 ASSERT_EQ(KM_ERROR_OK, 1580 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE))); 1581 string export_data; 1582 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &export_data)); 1583 EXPECT_GT(export_data.length(), 0U); 1584 1585 // TODO(swillden): Verify that the exported key is actually usable to verify signatures. 1586 1587 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1588 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 1589 } 1590 1591 TEST_P(ExportKeyTest, RsaUnsupportedKeyFormat) { 1592 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1593 .RsaSigningKey(256, 3) 1594 .Digest(KM_DIGEST_NONE) 1595 .Padding(KM_PAD_NONE))); 1596 string export_data; 1597 ASSERT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data)); 1598 1599 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1600 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 1601 } 1602 1603 TEST_P(ExportKeyTest, RsaCorruptedKeyBlob) { 1604 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 1605 .RsaSigningKey(256, 3) 1606 .Digest(KM_DIGEST_NONE) 1607 .Padding(KM_PAD_NONE))); 1608 corrupt_key_blob(); 1609 string export_data; 1610 ASSERT_EQ(KM_ERROR_INVALID_KEY_BLOB, ExportKey(KM_KEY_FORMAT_X509, &export_data)); 1611 1612 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1613 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 1614 } 1615 1616 TEST_P(ExportKeyTest, AesKeyExportFails) { 1617 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().AesEncryptionKey(128))); 1618 string export_data; 1619 1620 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_X509, &export_data)); 1621 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_PKCS8, &export_data)); 1622 EXPECT_EQ(KM_ERROR_UNSUPPORTED_KEY_FORMAT, ExportKey(KM_KEY_FORMAT_RAW, &export_data)); 1623 1624 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1625 } 1626 1627 static string read_file(const string& file_name) { 1628 ifstream file_stream(file_name, std::ios::binary); 1629 istreambuf_iterator<char> file_begin(file_stream); 1630 istreambuf_iterator<char> file_end; 1631 return string(file_begin, file_end); 1632 } 1633 1634 typedef Keymaster2Test ImportKeyTest; 1635 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, ImportKeyTest, test_params); 1636 1637 TEST_P(ImportKeyTest, RsaSuccess) { 1638 string pk8_key = read_file("rsa_privkey_pk8.der"); 1639 ASSERT_EQ(633U, pk8_key.size()); 1640 1641 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder() 1642 .RsaSigningKey(1024, 65537) 1643 .Digest(KM_DIGEST_NONE) 1644 .Padding(KM_PAD_NONE), 1645 KM_KEY_FORMAT_PKCS8, pk8_key)); 1646 1647 // Check values derived from the key. 1648 EXPECT_TRUE(contains(GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA) ? hw_enforced() 1649 : sw_enforced(), 1650 TAG_ALGORITHM, KM_ALGORITHM_RSA)); 1651 EXPECT_TRUE(contains(GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA) ? hw_enforced() 1652 : sw_enforced(), 1653 TAG_KEY_SIZE, 1024)); 1654 EXPECT_TRUE(contains(GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA) ? hw_enforced() 1655 : sw_enforced(), 1656 TAG_RSA_PUBLIC_EXPONENT, 65537U)); 1657 1658 // And values provided by AndroidKeymaster 1659 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1660 EXPECT_TRUE(contains(hw_enforced(), TAG_ORIGIN, KM_ORIGIN_UNKNOWN)); 1661 else 1662 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED)); 1663 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME)); 1664 1665 string message(1024 / 8, 'a'); 1666 string signature; 1667 SignMessage(message, &signature, KM_DIGEST_NONE, KM_PAD_NONE); 1668 VerifyMessage(message, signature, KM_DIGEST_NONE, KM_PAD_NONE); 1669 1670 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 1671 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1672 } 1673 1674 TEST_P(ImportKeyTest, RsaKeySizeMismatch) { 1675 string pk8_key = read_file("rsa_privkey_pk8.der"); 1676 ASSERT_EQ(633U, pk8_key.size()); 1677 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, 1678 ImportKey(AuthorizationSetBuilder() 1679 .RsaSigningKey(2048 /* Doesn't match key */, 3) 1680 .Digest(KM_DIGEST_NONE) 1681 .Padding(KM_PAD_NONE), 1682 KM_KEY_FORMAT_PKCS8, pk8_key)); 1683 1684 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1685 } 1686 1687 TEST_P(ImportKeyTest, RsaPublicExponenMismatch) { 1688 string pk8_key = read_file("rsa_privkey_pk8.der"); 1689 ASSERT_EQ(633U, pk8_key.size()); 1690 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, 1691 ImportKey(AuthorizationSetBuilder() 1692 .RsaSigningKey(256, 3 /* Doesnt' match key */) 1693 .Digest(KM_DIGEST_NONE) 1694 .Padding(KM_PAD_NONE), 1695 KM_KEY_FORMAT_PKCS8, pk8_key)); 1696 1697 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1698 } 1699 1700 TEST_P(ImportKeyTest, EcdsaSuccess) { 1701 string pk8_key = read_file("ec_privkey_pk8.der"); 1702 ASSERT_EQ(138U, pk8_key.size()); 1703 1704 ASSERT_EQ(KM_ERROR_OK, 1705 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE), 1706 KM_KEY_FORMAT_PKCS8, pk8_key)); 1707 1708 // Check values derived from the key. 1709 EXPECT_TRUE(contains(GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC) ? hw_enforced() 1710 : sw_enforced(), 1711 TAG_ALGORITHM, KM_ALGORITHM_EC)); 1712 EXPECT_TRUE(contains(GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC) ? hw_enforced() 1713 : sw_enforced(), 1714 TAG_KEY_SIZE, 256)); 1715 1716 // And values provided by AndroidKeymaster 1717 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1718 EXPECT_TRUE(contains(hw_enforced(), TAG_ORIGIN, KM_ORIGIN_UNKNOWN)); 1719 else 1720 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED)); 1721 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME)); 1722 1723 string message(32, 'a'); 1724 string signature; 1725 SignMessage(message, &signature, KM_DIGEST_NONE); 1726 VerifyMessage(message, signature, KM_DIGEST_NONE); 1727 1728 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1729 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1730 } 1731 1732 TEST_P(ImportKeyTest, EcdsaSizeSpecified) { 1733 string pk8_key = read_file("ec_privkey_pk8.der"); 1734 ASSERT_EQ(138U, pk8_key.size()); 1735 1736 ASSERT_EQ(KM_ERROR_OK, 1737 ImportKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest(KM_DIGEST_NONE), 1738 KM_KEY_FORMAT_PKCS8, pk8_key)); 1739 1740 // Check values derived from the key. 1741 EXPECT_TRUE(contains(GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC) ? hw_enforced() 1742 : sw_enforced(), 1743 TAG_ALGORITHM, KM_ALGORITHM_EC)); 1744 EXPECT_TRUE(contains(GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC) ? hw_enforced() 1745 : sw_enforced(), 1746 TAG_KEY_SIZE, 256)); 1747 1748 // And values provided by AndroidKeymaster 1749 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1750 EXPECT_TRUE(contains(hw_enforced(), TAG_ORIGIN, KM_ORIGIN_UNKNOWN)); 1751 else 1752 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED)); 1753 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME)); 1754 1755 string message(32, 'a'); 1756 string signature; 1757 SignMessage(message, &signature, KM_DIGEST_NONE); 1758 VerifyMessage(message, signature, KM_DIGEST_NONE); 1759 1760 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 1761 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 1762 } 1763 1764 TEST_P(ImportKeyTest, EcdsaSizeMismatch) { 1765 string pk8_key = read_file("ec_privkey_pk8.der"); 1766 ASSERT_EQ(138U, pk8_key.size()); 1767 ASSERT_EQ(KM_ERROR_IMPORT_PARAMETER_MISMATCH, 1768 ImportKey(AuthorizationSetBuilder() 1769 .EcdsaSigningKey(224 /* Doesn't match key */) 1770 .Digest(KM_DIGEST_NONE), 1771 KM_KEY_FORMAT_PKCS8, pk8_key)); 1772 1773 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1774 } 1775 1776 TEST_P(ImportKeyTest, AesKeySuccess) { 1777 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 1778 string key(key_data, sizeof(key_data)); 1779 ASSERT_EQ(KM_ERROR_OK, 1780 ImportKey(AuthorizationSetBuilder().AesEncryptionKey(128).EcbMode().Authorization( 1781 TAG_PADDING, KM_PAD_PKCS7), 1782 KM_KEY_FORMAT_RAW, key)); 1783 1784 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED)); 1785 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME)); 1786 1787 string message = "Hello World!"; 1788 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7); 1789 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7); 1790 EXPECT_EQ(message, plaintext); 1791 1792 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1793 } 1794 1795 TEST_P(ImportKeyTest, HmacSha256KeySuccess) { 1796 char key_data[16] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; 1797 string key(key_data, sizeof(key_data)); 1798 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder() 1799 .HmacKey(sizeof(key_data) * 8) 1800 .Digest(KM_DIGEST_SHA_2_256) 1801 .Authorization(TAG_MIN_MAC_LENGTH, 256), 1802 KM_KEY_FORMAT_RAW, key)); 1803 1804 EXPECT_TRUE(contains(sw_enforced(), TAG_ORIGIN, KM_ORIGIN_IMPORTED)); 1805 EXPECT_TRUE(contains(sw_enforced(), KM_TAG_CREATION_DATETIME)); 1806 1807 string message = "Hello World!"; 1808 string signature; 1809 MacMessage(message, &signature, 256); 1810 VerifyMac(message, signature); 1811 1812 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 1813 } 1814 1815 string wrapped_key = hex2str( 1816 "3082017302010004820100A2B7988012A043CE83E762A4E4D3C86D578B2E1EA5E04138353114A816951308E3222AFA" 1817 "D86CA141C581198E65BC56D9EEDC5B555713BE2C20948DD076AB4980305871317F89DD3A7A67FBBB7AACF6941C06B2" 1818 "65396D894A6DCC7B9FB152FFA8CBF44FF8063748795F3FB506DF8718535289E759075A13A5DDC83EF8470549AA7794" 1819 "3AFBACF6CF82DCE3751E05BFE05F30B998D73E23611E6EAEFC2A497E097A895C4242607B472AE8F19DA77A9A5A4786" 1820 "75541FC813C9213B5CE8C2E598BFBBCD1B369E3D7AEC0274F9B79118D8AA5FBB7634EBD3C4C2AF3B5DA483DF2CFDF1" 1821 "E68A3BFC7B6C0D503AF88E82C9EE841A278B144FF8D39F2DB2ACE9415C120190040CD796B02C370F1FA4CC0124F130" 1822 "280201033023A1083106020100020101A203020120A30402020100A4053103020101A60531030201400420CCD54085" 1823 "5F833A5E1480BFD2D36FAF3AEEE15DF5BEABE2691BC82DDE2A7AA91004107CB81BDDCD09E8F4DF575726279F3229"); 1824 1825 string wrapped_key_masked = hex2str( 1826 "30820173020100048201008CBEE0DC600215FFC85FC26B57DD2331DDF5D3E106C0A68BFEF167AFD428041D9B7C3316" 1827 "110BBB914A86FC24D4EF5C6A4673C9B3CC914C7806453650753B5130C4FE72264A52C1A270286032513F24EB3E033A" 1828 "BCC26A9D6AEFD0D0AD3E922E4E737ECDAD3C4DF2ABDB416378E67381BE0391175EC8F05FDFBC3794B7D0D88298010F" 1829 "E9B6F788BC049D874575D2D4C33DB582B113694738A9151BBC7603D3556B26FEC0279EE1C1CA44D6F7F91F4C424912" 1830 "7F9CC3232DE8B0AEFFD5AFAD4C3D5B846FD26873315606F6457BC19447FD7C6431550D6E6592A0555E61C7A021D149" 1831 "BCEE7A858DD6D4A8E230C6015EEDF0A58F4CAA8A6D0E3A1E3794CAEE7854CE92040C6D9721D08589581AB49204A330" 1832 "280201033023A1083106020100020101A203020120A30402020100A4053103020101A60531030201400420A61C6E24" 1833 "7E25B3E6E69AA78EB03C2D4AC20D1F99A9A024A76F35C8E2CAB9B68D04101FF7A0E793B9EE4AECEBB9AC4C545254"); 1834 1835 string wrapping_key = hex2str( 1836 "308204be020100300d06092a864886f70d0101010500048204a8308204a40201000282010100aec367931d8900ce56" 1837 "b0067f7d70e1fc653f3f34d194c1fed50018fb43db937b06e673a837313d56b1c725150a3fef86acbddc41bb759c28" 1838 "54eae32d35841efb5c18d82bc90a1cb5c1d55adf245b02911f0b7cda88c421ff0ebafe7c0d23be312d7bd5921ffaea" 1839 "1347c157406fef718f682643e4e5d33c6703d61c0cf7ac0bf4645c11f5c1374c3886427411c449796792e0bef75dec" 1840 "858a2123c36753e02a95a96d7c454b504de385a642e0dfc3e60ac3a7ee4991d0d48b0172a95f9536f02ba13cecccb9" 1841 "2b727db5c27e5b2f5cec09600b286af5cf14c42024c61ddfe71c2a8d7458f185234cb00e01d282f10f8fc6721d2aed" 1842 "3f4833cca2bd8fa62821dd55020301000102820100431447b6251908112b1ee76f99f3711a52b6630960046c2de70d" 1843 "e188d833f8b8b91e4d785caeeeaf4f0f74414e2cda40641f7fe24f14c67a88959bdb27766df9e710b630a03adc683b" 1844 "5d2c43080e52bee71e9eaeb6de297a5fea1072070d181c822bccff087d63c940ba8a45f670feb29fb4484d1c95e6d2" 1845 "579ba02aae0a00900c3ebf490e3d2cd7ee8d0e20c536e4dc5a5097272888cddd7e91f228b1c4d7474c55b8fcd618c4" 1846 "a957bbddd5ad7407cc312d8d98a5caf7e08f4a0d6b45bb41c652659d5a5ba05b663737a8696281865ba20fbdd7f851" 1847 "e6c56e8cbe0ddbbf24dc03b2d2cb4c3d540fb0af52e034a2d06698b128e5f101e3b51a34f8d8b4f8618102818100de" 1848 "392e18d682c829266cc3454e1d6166242f32d9a1d10577753e904ea7d08bff841be5bac82a164c5970007047b8c517" 1849 "db8f8f84e37bd5988561bdf503d4dc2bdb38f885434ae42c355f725c9a60f91f0788e1f1a97223b524b5357fdf72e2" 1850 "f696bab7d78e32bf92ba8e1864eab1229e91346130748a6e3c124f9149d71c743502818100c95387c0f9d35f137b57" 1851 "d0d65c397c5e21cc251e47008ed62a542409c8b6b6ac7f8967b3863ca645fcce49582a9aa17349db6c4a95affdae0d" 1852 "ae612e1afac99ed39a2d934c880440aed8832f9843163a47f27f392199dc1202f9a0f9bd08308007cb1e4e7f583093" 1853 "66a7de25f7c3c9b880677c068e1be936e81288815252a8a102818057ff8ca1895080b2cae486ef0adfd791fb0235c0" 1854 "b8b36cd6c136e52e4085f4ea5a063212a4f105a3764743e53281988aba073f6e0027298e1c4378556e0efca0e14ece" 1855 "1af76ad0b030f27af6f0ab35fb73a060d8b1a0e142fa2647e93b32e36d8282ae0a4de50ab7afe85500a16f43a64719" 1856 "d6e2b9439823719cd08bcd03178102818100ba73b0bb28e3f81e9bd1c568713b101241acc607976c4ddccc90e65b65" 1857 "56ca31516058f92b6e09f3b160ff0e374ec40d78ae4d4979fde6ac06a1a400c61dd31254186af30b22c10582a8a43e" 1858 "34fe949c5f3b9755bae7baa7b7b7a6bd03b38cef55c86885fc6c1978b9cee7ef33da507c9df6b9277cff1e6aaa5d57" 1859 "aca528466102818100c931617c77829dfb1270502be9195c8f2830885f57dba869536811e6864236d0c4736a0008a1" 1860 "45af36b8357a7c3d139966d04c4e00934ea1aede3bb6b8ec841dc95e3f579751e2bfdfe27ae778983f959356210723" 1861 "287b0affcc9f727044d48c373f1babde0724fa17a4fd4da0902c7c9b9bf27ba61be6ad02dfddda8f4e6822"); 1862 1863 string zero_masking_key = 1864 hex2str("0000000000000000000000000000000000000000000000000000000000000000"); 1865 string masking_key = hex2str("D796B02C370F1FA4CC0124F14EC8CBEBE987E825246265050F399A51FD477DFC"); 1866 1867 class ImportWrappedKeyTest : public testing::Test { 1868 public: 1869 ImportWrappedKeyTest() : keymaster_(new PureSoftKeymasterContext(), 16) {} 1870 1871 protected: 1872 void SetUp() override { 1873 ConfigureRequest configReq; 1874 configReq.os_version = kOsVersion; 1875 configReq.os_patchlevel = kOsPatchLevel; 1876 ConfigureResponse configRsp; 1877 keymaster_.Configure(configReq, &configRsp); 1878 EXPECT_EQ(KM_ERROR_OK, configRsp.error); 1879 } 1880 1881 keymaster_error_t BeginOperation(keymaster_purpose_t purpose, 1882 const AuthorizationSet& input_set) { 1883 BeginOperationRequest req; 1884 req.purpose = purpose; 1885 req.SetKeyMaterial(blob_); 1886 req.additional_params = input_set; 1887 1888 BeginOperationResponse rsp; 1889 keymaster_.BeginOperation(req, &rsp); 1890 op_handle_ = rsp.op_handle; 1891 1892 return rsp.error; 1893 } 1894 1895 keymaster_error_t FinishOperation(const string& input, string* output) { 1896 FinishOperationRequest req; 1897 req.op_handle = op_handle_; 1898 req.input.Reinitialize(input.data(), input.size()); 1899 1900 FinishOperationResponse rsp; 1901 keymaster_.FinishOperation(req, &rsp); 1902 1903 if (output) { 1904 *output = string(reinterpret_cast<const char*>(rsp.output.peek_read()), 1905 rsp.output.available_read()); 1906 } 1907 1908 return rsp.error; 1909 } 1910 1911 string ProcessMessage(keymaster_purpose_t purpose, const string& message, 1912 const AuthorizationSet& begin_params) { 1913 EXPECT_EQ(KM_ERROR_OK, BeginOperation(purpose, begin_params)); 1914 1915 string result; 1916 EXPECT_EQ(KM_ERROR_OK, FinishOperation(message, &result)); 1917 return result; 1918 } 1919 1920 AndroidKeymaster keymaster_; 1921 KeymasterKeyBlob blob_; 1922 uint64_t op_handle_; 1923 }; 1924 1925 TEST_F(ImportWrappedKeyTest, GoldenKeySuccess) { 1926 ImportKeyRequest import_request; 1927 1928 auto import_params = AuthorizationSetBuilder() 1929 .RsaEncryptionKey(2048, 65537) 1930 .Digest(KM_DIGEST_SHA1) 1931 .Padding(KM_PAD_RSA_OAEP) 1932 .Authorization(TAG_PURPOSE, KM_PURPOSE_WRAP) 1933 .build(); 1934 import_request.key_description.Reinitialize(import_params); 1935 import_request.SetKeyMaterial(reinterpret_cast<const uint8_t*>(wrapping_key.c_str()), 1936 wrapping_key.size()); 1937 import_request.key_format = KM_KEY_FORMAT_PKCS8; 1938 ImportKeyResponse import_response; 1939 keymaster_.ImportKey(import_request, &import_response); 1940 ASSERT_EQ(import_response.error, KM_ERROR_OK); 1941 1942 ImportWrappedKeyRequest request; 1943 KeymasterKeyBlob wrapped_key_blob(reinterpret_cast<const uint8_t*>(wrapped_key.c_str()), 1944 wrapped_key.size()); 1945 request.SetKeyMaterial(wrapped_key_blob, import_response.key_blob); 1946 request.SetMaskingKeyMaterial(reinterpret_cast<const uint8_t*>(zero_masking_key.c_str()), 1947 zero_masking_key.size()); 1948 ImportWrappedKeyResponse response; 1949 1950 keymaster_.ImportWrappedKey(request, &response); 1951 1952 EXPECT_EQ(response.error, KM_ERROR_OK); 1953 // Check that the tags from the wrapped auth list were imported correctly 1954 ASSERT_EQ(response.key_blob.key_material_size > 0, true); 1955 ASSERT_EQ(response.unenforced.Contains(TAG_ALGORITHM), true); 1956 ASSERT_EQ(response.unenforced.Contains(TAG_KEY_SIZE), true); 1957 ASSERT_EQ(response.unenforced.Contains(TAG_PURPOSE), true); 1958 ASSERT_EQ(response.unenforced.Contains(TAG_BLOCK_MODE), true); 1959 1960 blob_ = move(response.key_blob); 1961 1962 string message = "Hello World!"; 1963 auto params = AuthorizationSetBuilder().BlockMode(KM_MODE_ECB).Padding(KM_PAD_PKCS7).build(); 1964 string ciphertext = ProcessMessage(KM_PURPOSE_ENCRYPT, message, params); 1965 string plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext, params); 1966 1967 EXPECT_EQ(message, plaintext); 1968 } 1969 1970 TEST_F(ImportWrappedKeyTest, SuccessMaskingKey) { 1971 ImportKeyRequest import_request; 1972 1973 auto import_params = AuthorizationSetBuilder() 1974 .RsaEncryptionKey(2048, 65537) 1975 .Digest(KM_DIGEST_SHA1) 1976 .Padding(KM_PAD_RSA_OAEP) 1977 .Authorization(TAG_PURPOSE, KM_PURPOSE_WRAP) 1978 .build(); 1979 import_request.key_description.Reinitialize(import_params); 1980 import_request.SetKeyMaterial(reinterpret_cast<const uint8_t*>(wrapping_key.c_str()), 1981 wrapping_key.size()); 1982 1983 import_request.key_format = KM_KEY_FORMAT_PKCS8; 1984 ImportKeyResponse import_response; 1985 keymaster_.ImportKey(import_request, &import_response); 1986 EXPECT_EQ(import_response.error, KM_ERROR_OK); 1987 1988 if (import_response.error != KM_ERROR_OK) return; 1989 1990 ImportWrappedKeyRequest request; 1991 KeymasterKeyBlob wrapped_key_blob(reinterpret_cast<const uint8_t*>(wrapped_key_masked.c_str()), 1992 wrapped_key_masked.size()); 1993 request.SetKeyMaterial(wrapped_key_blob, import_response.key_blob); 1994 request.SetMaskingKeyMaterial(reinterpret_cast<const uint8_t*>(masking_key.c_str()), 1995 masking_key.size()); 1996 ImportWrappedKeyResponse response; 1997 1998 keymaster_.ImportWrappedKey(request, &response); 1999 EXPECT_EQ(response.error, KM_ERROR_OK); 2000 } 2001 2002 TEST_F(ImportWrappedKeyTest, WrongMaskingKey) { 2003 ImportKeyRequest import_request; 2004 2005 auto import_params = AuthorizationSetBuilder() 2006 .RsaEncryptionKey(2048, 65537) 2007 .Digest(KM_DIGEST_SHA1) 2008 .Padding(KM_PAD_RSA_OAEP) 2009 .Authorization(TAG_PURPOSE, KM_PURPOSE_WRAP) 2010 .build(); 2011 import_request.key_description.Reinitialize(import_params); 2012 import_request.SetKeyMaterial(reinterpret_cast<const uint8_t*>(wrapping_key.c_str()), 2013 wrapping_key.size()); 2014 2015 import_request.key_format = KM_KEY_FORMAT_PKCS8; 2016 ImportKeyResponse import_response; 2017 keymaster_.ImportKey(import_request, &import_response); 2018 EXPECT_EQ(import_response.error, KM_ERROR_OK); 2019 2020 if (import_response.error != KM_ERROR_OK) return; 2021 2022 ImportWrappedKeyRequest request; 2023 KeymasterKeyBlob wrapped_key_blob(reinterpret_cast<const uint8_t*>(wrapped_key_masked.c_str()), 2024 wrapped_key_masked.size()); 2025 request.SetKeyMaterial(wrapped_key_blob, import_response.key_blob); 2026 request.SetMaskingKeyMaterial(reinterpret_cast<const uint8_t*>(zero_masking_key.c_str()), 2027 zero_masking_key.size()); 2028 ImportWrappedKeyResponse response; 2029 2030 keymaster_.ImportWrappedKey(request, &response); 2031 EXPECT_EQ(response.error, KM_ERROR_VERIFICATION_FAILED); 2032 } 2033 2034 TEST_F(ImportWrappedKeyTest, WrongPurpose) { 2035 ImportKeyRequest import_request; 2036 2037 auto import_params = AuthorizationSetBuilder() 2038 .RsaEncryptionKey(2048, 65537) 2039 .Digest(KM_DIGEST_SHA1) 2040 .Padding(KM_PAD_RSA_OAEP) 2041 .build(); 2042 import_request.key_description.Reinitialize(import_params); 2043 import_request.SetKeyMaterial(reinterpret_cast<const uint8_t*>(wrapping_key.c_str()), 2044 wrapping_key.size()); 2045 import_request.key_format = KM_KEY_FORMAT_PKCS8; 2046 ImportKeyResponse import_response; 2047 keymaster_.ImportKey(import_request, &import_response); 2048 EXPECT_EQ(import_response.error, KM_ERROR_OK); 2049 2050 if (import_response.error != KM_ERROR_OK) return; 2051 2052 ImportWrappedKeyRequest request; 2053 KeymasterKeyBlob wrapped_key_blob(reinterpret_cast<const uint8_t*>(wrapped_key.c_str()), 2054 wrapped_key.size()); 2055 request.SetKeyMaterial(wrapped_key_blob, import_response.key_blob); 2056 ImportWrappedKeyResponse response; 2057 2058 keymaster_.ImportWrappedKey(request, &response); 2059 EXPECT_EQ(response.error, KM_ERROR_INCOMPATIBLE_PURPOSE); 2060 } 2061 2062 typedef Keymaster2Test EncryptionOperationsTest; 2063 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, EncryptionOperationsTest, test_params); 2064 2065 TEST_P(EncryptionOperationsTest, RsaNoPaddingSuccess) { 2066 ASSERT_EQ(KM_ERROR_OK, 2067 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE))); 2068 2069 string message = "12345678901234567890123456789012"; 2070 string ciphertext1 = EncryptMessage(string(message), KM_PAD_NONE); 2071 EXPECT_EQ(256U / 8, ciphertext1.size()); 2072 2073 string ciphertext2 = EncryptMessage(string(message), KM_PAD_NONE); 2074 EXPECT_EQ(256U / 8, ciphertext2.size()); 2075 2076 // Unpadded RSA is deterministic 2077 EXPECT_EQ(ciphertext1, ciphertext2); 2078 2079 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2080 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 2081 } 2082 2083 TEST_P(EncryptionOperationsTest, RsaNoPaddingTooShort) { 2084 ASSERT_EQ(KM_ERROR_OK, 2085 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE))); 2086 2087 string message = "1"; 2088 2089 string ciphertext = EncryptMessage(message, KM_PAD_NONE); 2090 EXPECT_EQ(256U / 8, ciphertext.size()); 2091 2092 string expected_plaintext = string(256 / 8 - 1, 0) + message; 2093 string plaintext = DecryptMessage(ciphertext, KM_PAD_NONE); 2094 2095 EXPECT_EQ(expected_plaintext, plaintext); 2096 2097 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2098 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 2099 } 2100 2101 TEST_P(EncryptionOperationsTest, RsaNoPaddingTooLong) { 2102 ASSERT_EQ(KM_ERROR_OK, 2103 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE))); 2104 2105 string message = "123456789012345678901234567890123"; 2106 2107 AuthorizationSet begin_params(client_params()); 2108 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 2109 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 2110 2111 string result; 2112 size_t input_consumed; 2113 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, UpdateOperation(message, &result, &input_consumed)); 2114 2115 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2116 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 2117 } 2118 2119 TEST_P(EncryptionOperationsTest, RsaNoPaddingLargerThanModulus) { 2120 ASSERT_EQ(KM_ERROR_OK, 2121 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE))); 2122 2123 string exported; 2124 ASSERT_EQ(KM_ERROR_OK, ExportKey(KM_KEY_FORMAT_X509, &exported)); 2125 2126 const uint8_t* p = reinterpret_cast<const uint8_t*>(exported.data()); 2127 unique_ptr<EVP_PKEY, EVP_PKEY_Delete> pkey( 2128 d2i_PUBKEY(nullptr /* alloc new */, &p, exported.size())); 2129 unique_ptr<RSA, RSA_Delete> rsa(EVP_PKEY_get1_RSA(pkey.get())); 2130 2131 size_t modulus_len = BN_num_bytes(rsa->n); 2132 ASSERT_EQ(256U / 8, modulus_len); 2133 unique_ptr<uint8_t[]> modulus_buf(new uint8_t[modulus_len]); 2134 BN_bn2bin(rsa->n, modulus_buf.get()); 2135 2136 // The modulus is too big to encrypt. 2137 string message(reinterpret_cast<const char*>(modulus_buf.get()), modulus_len); 2138 2139 AuthorizationSet begin_params(client_params()); 2140 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 2141 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 2142 2143 string result; 2144 size_t input_consumed; 2145 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed)); 2146 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&result)); 2147 2148 // One smaller than the modulus is okay. 2149 BN_sub(rsa->n, rsa->n, BN_value_one()); 2150 modulus_len = BN_num_bytes(rsa->n); 2151 ASSERT_EQ(256U / 8, modulus_len); 2152 BN_bn2bin(rsa->n, modulus_buf.get()); 2153 message = string(reinterpret_cast<const char*>(modulus_buf.get()), modulus_len); 2154 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 2155 EXPECT_EQ(KM_ERROR_OK, FinishOperation(message, "", &result)); 2156 2157 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2158 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 2159 } 2160 2161 TEST_P(EncryptionOperationsTest, RsaOaepSuccess) { 2162 size_t key_size = 768; 2163 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2164 .RsaEncryptionKey(key_size, 3) 2165 .Padding(KM_PAD_RSA_OAEP) 2166 .Digest(KM_DIGEST_SHA_2_256))); 2167 2168 string message = "Hello"; 2169 string ciphertext1 = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP); 2170 EXPECT_EQ(key_size / 8, ciphertext1.size()); 2171 2172 string ciphertext2 = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP); 2173 EXPECT_EQ(key_size / 8, ciphertext2.size()); 2174 2175 // OAEP randomizes padding so every result should be different. 2176 EXPECT_NE(ciphertext1, ciphertext2); 2177 2178 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2179 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 2180 } 2181 2182 TEST_P(EncryptionOperationsTest, RsaOaepSha224Success) { 2183 size_t key_size = 768; 2184 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2185 .RsaEncryptionKey(key_size, 3) 2186 .Padding(KM_PAD_RSA_OAEP) 2187 .Digest(KM_DIGEST_SHA_2_224))); 2188 2189 string message = "Hello"; 2190 string ciphertext1 = EncryptMessage(string(message), KM_DIGEST_SHA_2_224, KM_PAD_RSA_OAEP); 2191 EXPECT_EQ(key_size / 8, ciphertext1.size()); 2192 2193 string ciphertext2 = EncryptMessage(string(message), KM_DIGEST_SHA_2_224, KM_PAD_RSA_OAEP); 2194 EXPECT_EQ(key_size / 8, ciphertext2.size()); 2195 2196 // OAEP randomizes padding so every result should be different. 2197 EXPECT_NE(ciphertext1, ciphertext2); 2198 2199 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2200 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 2201 } 2202 2203 TEST_P(EncryptionOperationsTest, RsaOaepRoundTrip) { 2204 size_t key_size = 768; 2205 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2206 .RsaEncryptionKey(key_size, 3) 2207 .Padding(KM_PAD_RSA_OAEP) 2208 .Digest(KM_DIGEST_SHA_2_256))); 2209 string message = "Hello World!"; 2210 string ciphertext = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP); 2211 EXPECT_EQ(key_size / 8, ciphertext.size()); 2212 2213 string plaintext = DecryptMessage(ciphertext, KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP); 2214 EXPECT_EQ(message, plaintext); 2215 2216 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2217 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 2218 } 2219 2220 TEST_P(EncryptionOperationsTest, RsaOaepSha224RoundTrip) { 2221 size_t key_size = 768; 2222 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2223 .RsaEncryptionKey(key_size, 3) 2224 .Padding(KM_PAD_RSA_OAEP) 2225 .Digest(KM_DIGEST_SHA_2_224))); 2226 string message = "Hello World!"; 2227 string ciphertext = EncryptMessage(string(message), KM_DIGEST_SHA_2_224, KM_PAD_RSA_OAEP); 2228 EXPECT_EQ(key_size / 8, ciphertext.size()); 2229 2230 string plaintext = DecryptMessage(ciphertext, KM_DIGEST_SHA_2_224, KM_PAD_RSA_OAEP); 2231 EXPECT_EQ(message, plaintext); 2232 2233 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2234 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 2235 } 2236 2237 TEST_P(EncryptionOperationsTest, RsaOaepInvalidDigest) { 2238 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2239 .RsaEncryptionKey(512, 3) 2240 .Padding(KM_PAD_RSA_OAEP) 2241 .Digest(KM_DIGEST_NONE))); 2242 string message = "Hello World!"; 2243 2244 AuthorizationSet begin_params(client_params()); 2245 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP); 2246 begin_params.push_back(TAG_DIGEST, KM_DIGEST_NONE); 2247 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 2248 2249 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2250 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 2251 } 2252 2253 TEST_P(EncryptionOperationsTest, RsaOaepUnauthorizedDigest) { 2254 if (GetParam()->minimal_digest_set()) 2255 // We don't have two supported digests, so we can't try authorizing one and using another. 2256 return; 2257 2258 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2259 .RsaEncryptionKey(512, 3) 2260 .Padding(KM_PAD_RSA_OAEP) 2261 .Digest(KM_DIGEST_SHA_2_256))); 2262 string message = "Hello World!"; 2263 // Works because encryption is a public key operation. 2264 EncryptMessage(string(message), KM_DIGEST_SHA1, KM_PAD_RSA_OAEP); 2265 2266 AuthorizationSet begin_params(client_params()); 2267 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP); 2268 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA1); 2269 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_DIGEST, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 2270 2271 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2272 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 2273 } 2274 2275 TEST_P(EncryptionOperationsTest, RsaOaepDecryptWithWrongDigest) { 2276 if (GetParam()->minimal_digest_set()) 2277 // We don't have two supported digests, so we can't try encrypting with one and decrypting 2278 // with another. 2279 return; 2280 2281 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2282 .RsaEncryptionKey(768, 3) 2283 .Padding(KM_PAD_RSA_OAEP) 2284 .Digest(KM_DIGEST_SHA_2_256) 2285 .Digest(KM_DIGEST_SHA_2_384))); 2286 string message = "Hello World!"; 2287 string ciphertext = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP); 2288 2289 string result; 2290 size_t input_consumed; 2291 AuthorizationSet begin_params(client_params()); 2292 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP); 2293 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_384); 2294 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 2295 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed)); 2296 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result)); 2297 EXPECT_EQ(0U, result.size()); 2298 2299 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2300 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 2301 } 2302 2303 TEST_P(EncryptionOperationsTest, RsaOaepTooLarge) { 2304 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2305 .RsaEncryptionKey(512, 3) 2306 .Padding(KM_PAD_RSA_OAEP) 2307 .Digest(KM_DIGEST_SHA1))); 2308 string message = "12345678901234567890123"; 2309 string result; 2310 size_t input_consumed; 2311 2312 AuthorizationSet begin_params(client_params()); 2313 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP); 2314 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA1); 2315 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 2316 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed)); 2317 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&result)); 2318 EXPECT_EQ(0U, result.size()); 2319 2320 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2321 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 2322 } 2323 2324 TEST_P(EncryptionOperationsTest, RsaOaepCorruptedDecrypt) { 2325 size_t key_size = 768; 2326 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2327 .RsaEncryptionKey(768, 3) 2328 .Padding(KM_PAD_RSA_OAEP) 2329 .Digest(KM_DIGEST_SHA_2_256))); 2330 string message = "Hello World!"; 2331 string ciphertext = EncryptMessage(string(message), KM_DIGEST_SHA_2_256, KM_PAD_RSA_OAEP); 2332 EXPECT_EQ(key_size / 8, ciphertext.size()); 2333 2334 // Corrupt the ciphertext 2335 ciphertext[key_size / 8 / 2]++; 2336 2337 string result; 2338 size_t input_consumed; 2339 AuthorizationSet begin_params(client_params()); 2340 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_OAEP); 2341 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256); 2342 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 2343 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed)); 2344 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result)); 2345 EXPECT_EQ(0U, result.size()); 2346 2347 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2348 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 2349 } 2350 2351 TEST_P(EncryptionOperationsTest, RsaPkcs1Success) { 2352 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding( 2353 KM_PAD_RSA_PKCS1_1_5_ENCRYPT))); 2354 string message = "Hello World!"; 2355 string ciphertext1 = EncryptMessage(message, KM_PAD_RSA_PKCS1_1_5_ENCRYPT); 2356 EXPECT_EQ(512U / 8, ciphertext1.size()); 2357 2358 string ciphertext2 = EncryptMessage(message, KM_PAD_RSA_PKCS1_1_5_ENCRYPT); 2359 EXPECT_EQ(512U / 8, ciphertext2.size()); 2360 2361 // PKCS1 v1.5 randomizes padding so every result should be different. 2362 EXPECT_NE(ciphertext1, ciphertext2); 2363 2364 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2365 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 2366 } 2367 2368 TEST_P(EncryptionOperationsTest, RsaPkcs1RoundTrip) { 2369 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding( 2370 KM_PAD_RSA_PKCS1_1_5_ENCRYPT))); 2371 string message = "Hello World!"; 2372 string ciphertext = EncryptMessage(message, KM_PAD_RSA_PKCS1_1_5_ENCRYPT); 2373 EXPECT_EQ(512U / 8, ciphertext.size()); 2374 2375 string plaintext = DecryptMessage(ciphertext, KM_PAD_RSA_PKCS1_1_5_ENCRYPT); 2376 EXPECT_EQ(message, plaintext); 2377 2378 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2379 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 2380 } 2381 2382 TEST_P(EncryptionOperationsTest, RsaRoundTripAllCombinations) { 2383 size_t key_size = 2048; 2384 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2385 .RsaEncryptionKey(key_size, 3) 2386 .Padding(KM_PAD_RSA_PKCS1_1_5_ENCRYPT) 2387 .Padding(KM_PAD_RSA_OAEP) 2388 .Digest(KM_DIGEST_NONE) 2389 .Digest(KM_DIGEST_MD5) 2390 .Digest(KM_DIGEST_SHA1) 2391 .Digest(KM_DIGEST_SHA_2_224) 2392 .Digest(KM_DIGEST_SHA_2_256) 2393 .Digest(KM_DIGEST_SHA_2_384) 2394 .Digest(KM_DIGEST_SHA_2_512))); 2395 2396 string message = "Hello World!"; 2397 2398 keymaster_padding_t padding_modes[] = {KM_PAD_RSA_OAEP, KM_PAD_RSA_PKCS1_1_5_ENCRYPT}; 2399 keymaster_digest_t digests[] = { 2400 KM_DIGEST_NONE, KM_DIGEST_MD5, KM_DIGEST_SHA1, KM_DIGEST_SHA_2_224, 2401 KM_DIGEST_SHA_2_256, KM_DIGEST_SHA_2_384, KM_DIGEST_SHA_2_512, 2402 }; 2403 2404 for (auto padding : padding_modes) 2405 for (auto digest : digests) { 2406 if (padding == KM_PAD_RSA_OAEP && digest == KM_DIGEST_NONE) 2407 // OAEP requires a digest. 2408 continue; 2409 2410 string ciphertext = EncryptMessage(message, digest, padding); 2411 EXPECT_EQ(key_size / 8, ciphertext.size()); 2412 2413 string plaintext = DecryptMessage(ciphertext, digest, padding); 2414 EXPECT_EQ(message, plaintext); 2415 } 2416 2417 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2418 EXPECT_EQ(40, GetParam()->keymaster0_calls()); 2419 } 2420 2421 TEST_P(EncryptionOperationsTest, RsaPkcs1TooLarge) { 2422 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding( 2423 KM_PAD_RSA_PKCS1_1_5_ENCRYPT))); 2424 string message = "123456789012345678901234567890123456789012345678901234"; 2425 string result; 2426 size_t input_consumed; 2427 2428 AuthorizationSet begin_params(client_params()); 2429 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT); 2430 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 2431 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(message, &result, &input_consumed)); 2432 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&result)); 2433 EXPECT_EQ(0U, result.size()); 2434 2435 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2436 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 2437 } 2438 2439 TEST_P(EncryptionOperationsTest, RsaPkcs1CorruptedDecrypt) { 2440 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(512, 3).Padding( 2441 KM_PAD_RSA_PKCS1_1_5_ENCRYPT))); 2442 string message = "Hello World!"; 2443 string ciphertext = EncryptMessage(string(message), KM_PAD_RSA_PKCS1_1_5_ENCRYPT); 2444 EXPECT_EQ(512U / 8, ciphertext.size()); 2445 2446 // Corrupt the ciphertext 2447 ciphertext[512 / 8 / 2]++; 2448 2449 string result; 2450 size_t input_consumed; 2451 AuthorizationSet begin_params(client_params()); 2452 begin_params.push_back(TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT); 2453 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 2454 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &result, &input_consumed)); 2455 EXPECT_EQ(KM_ERROR_UNKNOWN_ERROR, FinishOperation(&result)); 2456 EXPECT_EQ(0U, result.size()); 2457 2458 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2459 EXPECT_EQ(4, GetParam()->keymaster0_calls()); 2460 } 2461 2462 TEST_P(EncryptionOperationsTest, RsaEncryptWithSigningKey) { 2463 ASSERT_EQ(KM_ERROR_OK, 2464 GenerateKey(AuthorizationSetBuilder().RsaSigningKey(256, 3).Padding(KM_PAD_NONE))); 2465 2466 AuthorizationSet begin_params(client_params()); 2467 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 2468 ASSERT_EQ(KM_ERROR_INCOMPATIBLE_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 2469 2470 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 2471 EXPECT_EQ(2, GetParam()->keymaster0_calls()); 2472 } 2473 2474 TEST_P(EncryptionOperationsTest, EcdsaEncrypt) { 2475 ASSERT_EQ(KM_ERROR_OK, 2476 GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(224).Digest(KM_DIGEST_NONE))); 2477 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT)); 2478 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT)); 2479 2480 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 2481 EXPECT_EQ(3, GetParam()->keymaster0_calls()); 2482 } 2483 2484 TEST_P(EncryptionOperationsTest, HmacEncrypt) { 2485 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2486 .HmacKey(128) 2487 .Digest(KM_DIGEST_SHA_2_256) 2488 .Padding(KM_PAD_NONE) 2489 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 2490 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_ENCRYPT)); 2491 ASSERT_EQ(KM_ERROR_UNSUPPORTED_PURPOSE, BeginOperation(KM_PURPOSE_DECRYPT)); 2492 2493 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2494 } 2495 2496 TEST_P(EncryptionOperationsTest, AesEcbRoundTripSuccess) { 2497 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2498 .AesEncryptionKey(128) 2499 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 2500 .Padding(KM_PAD_NONE))); 2501 // Two-block message. 2502 string message = "12345678901234567890123456789012"; 2503 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE); 2504 EXPECT_EQ(message.size(), ciphertext1.size()); 2505 2506 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE); 2507 EXPECT_EQ(message.size(), ciphertext2.size()); 2508 2509 // ECB is deterministic. 2510 EXPECT_EQ(ciphertext1, ciphertext2); 2511 2512 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE); 2513 EXPECT_EQ(message, plaintext); 2514 2515 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2516 } 2517 2518 TEST_P(EncryptionOperationsTest, AesEcbNotAuthorized) { 2519 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2520 .AesEncryptionKey(128) 2521 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 2522 .Padding(KM_PAD_NONE))); 2523 // Two-block message. 2524 string message = "12345678901234567890123456789012"; 2525 AuthorizationSet begin_params(client_params()); 2526 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 2527 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 2528 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_BLOCK_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 2529 2530 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2531 } 2532 2533 TEST_P(EncryptionOperationsTest, AesEcbNoPaddingWrongInputSize) { 2534 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2535 .AesEncryptionKey(128) 2536 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 2537 .Padding(KM_PAD_NONE))); 2538 // Message is slightly shorter than two blocks. 2539 string message = "1234567890123456789012345678901"; 2540 2541 AuthorizationSet begin_params(client_params()); 2542 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 2543 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 2544 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 2545 string ciphertext; 2546 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(message, "", &ciphertext)); 2547 2548 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2549 } 2550 2551 TEST_P(EncryptionOperationsTest, AesEcbPkcs7Padding) { 2552 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2553 .AesEncryptionKey(128) 2554 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 2555 .Authorization(TAG_PADDING, KM_PAD_PKCS7))); 2556 2557 // Try various message lengths; all should work. 2558 for (size_t i = 0; i < 32; ++i) { 2559 string message(i, 'a'); 2560 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7); 2561 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size()); 2562 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7); 2563 EXPECT_EQ(message, plaintext); 2564 } 2565 2566 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2567 } 2568 2569 TEST_P(EncryptionOperationsTest, AesEcbNoPaddingKeyWithPkcs7Padding) { 2570 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2571 .AesEncryptionKey(128) 2572 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 2573 .Authorization(TAG_PADDING, KM_PAD_NONE))); 2574 2575 // Try various message lengths; all should fail. 2576 for (size_t i = 0; i < 32; ++i) { 2577 AuthorizationSet begin_params(client_params()); 2578 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 2579 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7); 2580 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, 2581 BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 2582 } 2583 2584 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2585 } 2586 2587 TEST_P(EncryptionOperationsTest, AesEcbPkcs7PaddingCorrupted) { 2588 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2589 .AesEncryptionKey(128) 2590 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 2591 .Authorization(TAG_PADDING, KM_PAD_PKCS7))); 2592 2593 string message = "a"; 2594 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7); 2595 EXPECT_EQ(16U, ciphertext.size()); 2596 EXPECT_NE(ciphertext, message); 2597 ++ciphertext[ciphertext.size() / 2]; 2598 2599 AuthorizationSet begin_params(client_params()); 2600 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 2601 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7); 2602 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 2603 string plaintext; 2604 size_t input_consumed; 2605 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed)); 2606 EXPECT_EQ(ciphertext.size(), input_consumed); 2607 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext)); 2608 2609 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2610 } 2611 2612 TEST_P(EncryptionOperationsTest, AesCtrRoundTripSuccess) { 2613 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2614 .AesEncryptionKey(128) 2615 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR) 2616 .Padding(KM_PAD_NONE))); 2617 string message = "123"; 2618 string iv1; 2619 string ciphertext1 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv1); 2620 EXPECT_EQ(message.size(), ciphertext1.size()); 2621 EXPECT_EQ(16U, iv1.size()); 2622 2623 string iv2; 2624 string ciphertext2 = EncryptMessage(message, KM_MODE_CTR, KM_PAD_NONE, &iv2); 2625 EXPECT_EQ(message.size(), ciphertext2.size()); 2626 EXPECT_EQ(16U, iv2.size()); 2627 2628 // IVs should be random, so ciphertexts should differ. 2629 EXPECT_NE(iv1, iv2); 2630 EXPECT_NE(ciphertext1, ciphertext2); 2631 2632 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CTR, KM_PAD_NONE, iv1); 2633 EXPECT_EQ(message, plaintext); 2634 2635 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2636 } 2637 2638 TEST_P(EncryptionOperationsTest, AesCtrIncremental) { 2639 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2640 .AesEncryptionKey(128) 2641 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR) 2642 .Padding(KM_PAD_NONE))); 2643 2644 int increment = 15; 2645 string message(239, 'a'); 2646 AuthorizationSet input_params(client_params()); 2647 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR); 2648 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 2649 AuthorizationSet output_params; 2650 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params)); 2651 2652 string ciphertext; 2653 size_t input_consumed; 2654 for (size_t i = 0; i < message.size(); i += increment) 2655 EXPECT_EQ(KM_ERROR_OK, 2656 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed)); 2657 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 2658 EXPECT_EQ(message.size(), ciphertext.size()); 2659 2660 // Move TAG_NONCE into input_params 2661 input_params.Reinitialize(output_params); 2662 input_params.push_back(client_params()); 2663 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR); 2664 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 2665 output_params.Clear(); 2666 2667 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params)); 2668 string plaintext; 2669 for (size_t i = 0; i < ciphertext.size(); i += increment) 2670 EXPECT_EQ(KM_ERROR_OK, 2671 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed)); 2672 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext)); 2673 EXPECT_EQ(ciphertext.size(), plaintext.size()); 2674 EXPECT_EQ(message, plaintext); 2675 2676 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2677 } 2678 2679 struct AesCtrSp80038aTestVector { 2680 const char* key; 2681 const char* nonce; 2682 const char* plaintext; 2683 const char* ciphertext; 2684 }; 2685 2686 // These test vectors are taken from 2687 // http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf, section F.5. 2688 static const AesCtrSp80038aTestVector kAesCtrSp80038aTestVectors[] = { 2689 // AES-128 2690 { 2691 "2b7e151628aed2a6abf7158809cf4f3c", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", 2692 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51" 2693 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", 2694 "874d6191b620e3261bef6864990db6ce9806f66b7970fdff8617187bb9fffdff" 2695 "5ae4df3edbd5d35e5b4f09020db03eab1e031dda2fbe03d1792170a0f3009cee", 2696 }, 2697 // AES-192 2698 { 2699 "8e73b0f7da0e6452c810f32b809079e562f8ead2522c6b7b", "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", 2700 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51" 2701 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", 2702 "1abc932417521ca24f2b0459fe7e6e0b090339ec0aa6faefd5ccc2c6f4ce8e94" 2703 "1e36b26bd1ebc670d1bd1d665620abf74f78a7f6d29809585a97daec58c6b050", 2704 }, 2705 // AES-256 2706 { 2707 "603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4", 2708 "f0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", 2709 "6bc1bee22e409f96e93d7e117393172aae2d8a571e03ac9c9eb76fac45af8e51" 2710 "30c81c46a35ce411e5fbc1191a0a52eff69f2445df4f9b17ad2b417be66c3710", 2711 "601ec313775789a5b7a7f504bbf3d228f443e3ca4d62b59aca84e990cacaf5c5" 2712 "2b0930daa23de94ce87017ba2d84988ddfc9c58db67aada613c2dd08457941a6", 2713 }, 2714 }; 2715 2716 TEST_P(EncryptionOperationsTest, AesCtrSp80038aTestVector) { 2717 for (size_t i = 0; i < 3; i++) { 2718 const AesCtrSp80038aTestVector& test(kAesCtrSp80038aTestVectors[i]); 2719 const string key = hex2str(test.key); 2720 const string nonce = hex2str(test.nonce); 2721 const string plaintext = hex2str(test.plaintext); 2722 const string ciphertext = hex2str(test.ciphertext); 2723 CheckAesCtrTestVector(key, nonce, plaintext, ciphertext); 2724 } 2725 2726 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2727 } 2728 2729 TEST_P(EncryptionOperationsTest, AesCtrInvalidPaddingMode) { 2730 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2731 .AesEncryptionKey(128) 2732 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR) 2733 .Authorization(TAG_PADDING, KM_PAD_PKCS7))); 2734 AuthorizationSet begin_params(client_params()); 2735 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR); 2736 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 2737 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 2738 2739 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2740 } 2741 2742 TEST_P(EncryptionOperationsTest, AesCtrInvalidCallerNonce) { 2743 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2744 .AesEncryptionKey(128) 2745 .Authorization(TAG_BLOCK_MODE, KM_MODE_CTR) 2746 .Authorization(TAG_CALLER_NONCE) 2747 .Padding(KM_PAD_NONE))); 2748 2749 AuthorizationSet input_params(client_params()); 2750 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CTR); 2751 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 2752 input_params.push_back(TAG_NONCE, "123", 3); 2753 EXPECT_EQ(KM_ERROR_INVALID_NONCE, BeginOperation(KM_PURPOSE_ENCRYPT, input_params)); 2754 2755 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2756 } 2757 2758 TEST_P(EncryptionOperationsTest, AesCbcRoundTripSuccess) { 2759 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2760 .AesEncryptionKey(128) 2761 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 2762 .Padding(KM_PAD_NONE))); 2763 // Two-block message. 2764 string message = "12345678901234567890123456789012"; 2765 string iv1; 2766 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1); 2767 EXPECT_EQ(message.size(), ciphertext1.size()); 2768 2769 string iv2; 2770 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2); 2771 EXPECT_EQ(message.size(), ciphertext2.size()); 2772 2773 // IVs should be random, so ciphertexts should differ. 2774 EXPECT_NE(iv1, iv2); 2775 EXPECT_NE(ciphertext1, ciphertext2); 2776 2777 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1); 2778 EXPECT_EQ(message, plaintext); 2779 2780 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2781 } 2782 2783 TEST_P(EncryptionOperationsTest, AesCallerNonce) { 2784 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2785 .AesEncryptionKey(128) 2786 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 2787 .Authorization(TAG_CALLER_NONCE) 2788 .Padding(KM_PAD_NONE))); 2789 string message = "12345678901234567890123456789012"; 2790 string iv1; 2791 // Don't specify nonce, should get a random one. 2792 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1); 2793 EXPECT_EQ(message.size(), ciphertext1.size()); 2794 EXPECT_EQ(16U, iv1.size()); 2795 2796 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1); 2797 EXPECT_EQ(message, plaintext); 2798 2799 // Now specify a nonce, should also work. 2800 AuthorizationSet input_params(client_params()); 2801 AuthorizationSet update_params; 2802 AuthorizationSet output_params; 2803 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16); 2804 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 2805 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 2806 string ciphertext2 = 2807 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params); 2808 2809 // Decrypt with correct nonce. 2810 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params, 2811 &output_params); 2812 EXPECT_EQ(message, plaintext); 2813 2814 // Now try with wrong nonce. 2815 input_params.Reinitialize(client_params()); 2816 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 2817 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 2818 input_params.push_back(TAG_NONCE, "aaaaaaaaaaaaaaaa", 16); 2819 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params, 2820 &output_params); 2821 EXPECT_NE(message, plaintext); 2822 2823 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2824 } 2825 2826 TEST_P(EncryptionOperationsTest, AesCallerNonceProhibited) { 2827 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2828 .AesEncryptionKey(128) 2829 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 2830 .Padding(KM_PAD_NONE))); 2831 2832 string message = "12345678901234567890123456789012"; 2833 string iv1; 2834 // Don't specify nonce, should get a random one. 2835 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1); 2836 EXPECT_EQ(message.size(), ciphertext1.size()); 2837 EXPECT_EQ(16U, iv1.size()); 2838 2839 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1); 2840 EXPECT_EQ(message, plaintext); 2841 2842 // Now specify a nonce, should fail. 2843 AuthorizationSet input_params(client_params()); 2844 AuthorizationSet update_params; 2845 AuthorizationSet output_params; 2846 input_params.push_back(TAG_NONCE, "abcdefghijklmnop", 16); 2847 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 2848 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 2849 2850 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED, 2851 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params)); 2852 2853 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2854 } 2855 2856 TEST_P(EncryptionOperationsTest, AesCbcIncrementalNoPadding) { 2857 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2858 .AesEncryptionKey(128) 2859 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 2860 .Padding(KM_PAD_NONE))); 2861 2862 int increment = 15; 2863 string message(240, 'a'); 2864 AuthorizationSet input_params(client_params()); 2865 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 2866 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 2867 AuthorizationSet output_params; 2868 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params)); 2869 2870 string ciphertext; 2871 size_t input_consumed; 2872 for (size_t i = 0; i < message.size(); i += increment) 2873 EXPECT_EQ(KM_ERROR_OK, 2874 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed)); 2875 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 2876 EXPECT_EQ(message.size(), ciphertext.size()); 2877 2878 // Move TAG_NONCE into input_params 2879 input_params.Reinitialize(output_params); 2880 input_params.push_back(client_params()); 2881 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 2882 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 2883 output_params.Clear(); 2884 2885 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params)); 2886 string plaintext; 2887 for (size_t i = 0; i < ciphertext.size(); i += increment) 2888 EXPECT_EQ(KM_ERROR_OK, 2889 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed)); 2890 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext)); 2891 EXPECT_EQ(ciphertext.size(), plaintext.size()); 2892 EXPECT_EQ(message, plaintext); 2893 2894 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2895 } 2896 2897 TEST_P(EncryptionOperationsTest, AesCbcPkcs7Padding) { 2898 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2899 .AesEncryptionKey(128) 2900 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 2901 .Authorization(TAG_PADDING, KM_PAD_PKCS7))); 2902 2903 // Try various message lengths; all should work. 2904 for (size_t i = 0; i < 32; ++i) { 2905 string message(i, 'a'); 2906 string iv; 2907 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv); 2908 EXPECT_EQ(i + 16 - (i % 16), ciphertext.size()); 2909 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv); 2910 EXPECT_EQ(message, plaintext); 2911 } 2912 2913 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2914 } 2915 2916 TEST_P(EncryptionOperationsTest, AesGcmRoundTripSuccess) { 2917 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2918 .AesEncryptionKey(128) 2919 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 2920 .Authorization(TAG_PADDING, KM_PAD_NONE) 2921 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 2922 string aad = "foobar"; 2923 string message = "123456789012345678901234567890123456"; 2924 AuthorizationSet begin_params(client_params()); 2925 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 2926 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 2927 begin_params.push_back(TAG_MAC_LENGTH, 128); 2928 2929 AuthorizationSet update_params; 2930 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size()); 2931 2932 // Encrypt 2933 AuthorizationSet begin_out_params; 2934 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params)); 2935 string ciphertext; 2936 size_t input_consumed; 2937 AuthorizationSet update_out_params; 2938 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext, 2939 &input_consumed)); 2940 EXPECT_EQ(message.size(), input_consumed); 2941 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 2942 2943 // Grab nonce 2944 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE)); 2945 begin_params.push_back(begin_out_params); 2946 2947 // Decrypt. 2948 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 2949 string plaintext; 2950 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params, 2951 &plaintext, &input_consumed)); 2952 EXPECT_EQ(ciphertext.size(), input_consumed); 2953 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext)); 2954 2955 EXPECT_EQ(message, plaintext); 2956 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2957 } 2958 2959 TEST_P(EncryptionOperationsTest, AesGcmTooShortTag) { 2960 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2961 .AesEncryptionKey(128) 2962 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 2963 .Authorization(TAG_PADDING, KM_PAD_NONE) 2964 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 2965 string aad = "foobar"; 2966 string message = "123456789012345678901234567890123456"; 2967 AuthorizationSet begin_params(client_params()); 2968 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 2969 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 2970 begin_params.push_back(TAG_MAC_LENGTH, 96); 2971 2972 AuthorizationSet update_params; 2973 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size()); 2974 2975 AuthorizationSet begin_out_params; 2976 EXPECT_EQ(KM_ERROR_INVALID_MAC_LENGTH, 2977 BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params)); 2978 2979 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 2980 } 2981 2982 TEST_P(EncryptionOperationsTest, AesGcmTooShortTagOnDecrypt) { 2983 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 2984 .AesEncryptionKey(128) 2985 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 2986 .Authorization(TAG_PADDING, KM_PAD_NONE) 2987 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 2988 string aad = "foobar"; 2989 string message = "123456789012345678901234567890123456"; 2990 AuthorizationSet begin_params(client_params()); 2991 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 2992 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 2993 begin_params.push_back(TAG_MAC_LENGTH, 128); 2994 2995 AuthorizationSet update_params; 2996 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size()); 2997 2998 // Encrypt 2999 AuthorizationSet begin_out_params; 3000 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params)); 3001 string ciphertext; 3002 size_t input_consumed; 3003 AuthorizationSet update_out_params; 3004 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext, 3005 &input_consumed)); 3006 EXPECT_EQ(message.size(), input_consumed); 3007 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 3008 3009 // Grab nonce 3010 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE)); 3011 begin_params.Reinitialize(client_params()); 3012 begin_params.push_back(begin_out_params); 3013 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 3014 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3015 begin_params.push_back(TAG_MAC_LENGTH, 96); 3016 3017 // Decrypt. 3018 EXPECT_EQ(KM_ERROR_INVALID_MAC_LENGTH, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 3019 3020 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3021 } 3022 3023 TEST_P(EncryptionOperationsTest, AesGcmCorruptKey) { 3024 uint8_t nonce[] = { 3025 0xb7, 0x94, 0x37, 0xae, 0x08, 0xff, 0x35, 0x5d, 0x7d, 0x8a, 0x4d, 0x0f, 3026 }; 3027 uint8_t ciphertext[] = { 3028 0xb3, 0xf6, 0x79, 0x9e, 0x8f, 0x93, 0x26, 0xf2, 0xdf, 0x1e, 0x80, 0xfc, 0xd2, 0xcb, 0x16, 3029 0xd7, 0x8c, 0x9d, 0xc7, 0xcc, 0x14, 0xbb, 0x67, 0x78, 0x62, 0xdc, 0x6c, 0x63, 0x9b, 0x3a, 3030 0x63, 0x38, 0xd2, 0x4b, 0x31, 0x2d, 0x39, 0x89, 0xe5, 0x92, 0x0b, 0x5d, 0xbf, 0xc9, 0x76, 3031 0x76, 0x5e, 0xfb, 0xfe, 0x57, 0xbb, 0x38, 0x59, 0x40, 0xa7, 0xa4, 0x3b, 0xdf, 0x05, 0xbd, 3032 0xda, 0xe3, 0xc9, 0xd6, 0xa2, 0xfb, 0xbd, 0xfc, 0xc0, 0xcb, 0xa0, 3033 }; 3034 string ciphertext_str(reinterpret_cast<char*>(ciphertext), sizeof(ciphertext)); 3035 3036 AuthorizationSet begin_params(client_params()); 3037 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 3038 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3039 begin_params.push_back(TAG_MAC_LENGTH, 128); 3040 begin_params.push_back(TAG_NONCE, nonce, sizeof(nonce)); 3041 3042 string plaintext; 3043 size_t input_consumed; 3044 3045 // Import correct key and decrypt 3046 uint8_t good_key[] = { 3047 0xba, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d, 3048 0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb, 3049 }; 3050 string good_key_str(reinterpret_cast<char*>(good_key), sizeof(good_key)); 3051 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder() 3052 .AesEncryptionKey(128) 3053 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 3054 .Authorization(TAG_PADDING, KM_PAD_NONE) 3055 .Authorization(TAG_CALLER_NONCE) 3056 .Authorization(TAG_MIN_MAC_LENGTH, 128), 3057 KM_KEY_FORMAT_RAW, good_key_str)); 3058 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 3059 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext_str, &plaintext, &input_consumed)); 3060 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext)); 3061 3062 // Import bad key and decrypt 3063 uint8_t bad_key[] = { 3064 0xbb, 0x76, 0x35, 0x4f, 0x0a, 0xed, 0x6e, 0x8d, 3065 0x91, 0xf4, 0x5c, 0x4f, 0xf5, 0xa0, 0x62, 0xdb, 3066 }; 3067 string bad_key_str(reinterpret_cast<char*>(bad_key), sizeof(bad_key)); 3068 ASSERT_EQ(KM_ERROR_OK, ImportKey(AuthorizationSetBuilder() 3069 .AesEncryptionKey(128) 3070 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 3071 .Authorization(TAG_PADDING, KM_PAD_NONE) 3072 .Authorization(TAG_MIN_MAC_LENGTH, 128), 3073 KM_KEY_FORMAT_RAW, bad_key_str)); 3074 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 3075 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext_str, &plaintext, &input_consumed)); 3076 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext)); 3077 3078 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3079 } 3080 3081 TEST_P(EncryptionOperationsTest, AesGcmAadNoData) { 3082 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3083 .AesEncryptionKey(128) 3084 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 3085 .Authorization(TAG_PADDING, KM_PAD_NONE) 3086 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3087 string aad = "123456789012345678"; 3088 string empty_message; 3089 AuthorizationSet begin_params(client_params()); 3090 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 3091 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3092 begin_params.push_back(TAG_MAC_LENGTH, 128); 3093 3094 AuthorizationSet update_params; 3095 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size()); 3096 3097 // Encrypt 3098 AuthorizationSet begin_out_params; 3099 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params)); 3100 string ciphertext; 3101 size_t input_consumed; 3102 AuthorizationSet update_out_params; 3103 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, empty_message, &update_out_params, 3104 &ciphertext, &input_consumed)); 3105 EXPECT_EQ(0U, input_consumed); 3106 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 3107 3108 // Grab nonce 3109 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE)); 3110 begin_params.push_back(begin_out_params); 3111 3112 // Decrypt. 3113 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 3114 string plaintext; 3115 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params, 3116 &plaintext, &input_consumed)); 3117 EXPECT_EQ(ciphertext.size(), input_consumed); 3118 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext)); 3119 3120 EXPECT_EQ(empty_message, plaintext); 3121 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3122 } 3123 3124 TEST_P(EncryptionOperationsTest, AesGcmIncremental) { 3125 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3126 .AesEncryptionKey(128) 3127 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 3128 .Authorization(TAG_PADDING, KM_PAD_NONE) 3129 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3130 AuthorizationSet begin_params(client_params()); 3131 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 3132 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3133 begin_params.push_back(TAG_MAC_LENGTH, 128); 3134 3135 AuthorizationSet update_params; 3136 update_params.push_back(TAG_ASSOCIATED_DATA, "b", 1); 3137 3138 // Encrypt 3139 AuthorizationSet begin_out_params; 3140 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params)); 3141 string ciphertext; 3142 size_t input_consumed; 3143 AuthorizationSet update_out_params; 3144 3145 // Send AAD, incrementally 3146 for (int i = 0; i < 1000; ++i) { 3147 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "", &update_out_params, &ciphertext, 3148 &input_consumed)); 3149 EXPECT_EQ(0U, input_consumed); 3150 EXPECT_EQ(0U, ciphertext.size()); 3151 } 3152 3153 // Now send data, incrementally, no data. 3154 AuthorizationSet empty_params; 3155 for (int i = 0; i < 1000; ++i) { 3156 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(empty_params, "a", &update_out_params, &ciphertext, 3157 &input_consumed)); 3158 EXPECT_EQ(1U, input_consumed); 3159 } 3160 EXPECT_EQ(1000U, ciphertext.size()); 3161 3162 // And finish. 3163 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 3164 EXPECT_EQ(1016U, ciphertext.size()); 3165 3166 // Grab nonce 3167 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE)); 3168 begin_params.push_back(begin_out_params); 3169 3170 // Decrypt. 3171 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 3172 string plaintext; 3173 3174 // Send AAD, incrementally, no data 3175 for (int i = 0; i < 1000; ++i) { 3176 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "", &update_out_params, &plaintext, 3177 &input_consumed)); 3178 EXPECT_EQ(0U, input_consumed); 3179 EXPECT_EQ(0U, plaintext.size()); 3180 } 3181 3182 // Now send data, incrementally. 3183 for (size_t i = 0; i < ciphertext.length(); ++i) { 3184 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(empty_params, string(ciphertext.data() + i, 1), 3185 &update_out_params, &plaintext, &input_consumed)); 3186 EXPECT_EQ(1U, input_consumed); 3187 } 3188 EXPECT_EQ(1000U, plaintext.size()); 3189 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext)); 3190 3191 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3192 } 3193 3194 TEST_P(EncryptionOperationsTest, AesGcmMultiPartAad) { 3195 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3196 .AesEncryptionKey(128) 3197 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 3198 .Authorization(TAG_PADDING, KM_PAD_NONE) 3199 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3200 string message = "123456789012345678901234567890123456"; 3201 AuthorizationSet begin_params(client_params()); 3202 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 3203 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3204 begin_params.push_back(TAG_MAC_LENGTH, 128); 3205 AuthorizationSet begin_out_params; 3206 3207 AuthorizationSet update_params; 3208 update_params.push_back(TAG_ASSOCIATED_DATA, "foo", 3); 3209 3210 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params)); 3211 3212 // No data, AAD only. 3213 string ciphertext; 3214 size_t input_consumed; 3215 AuthorizationSet update_out_params; 3216 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, "" /* message */, &update_out_params, 3217 &ciphertext, &input_consumed)); 3218 EXPECT_EQ(0U, input_consumed); 3219 3220 // AAD and data. 3221 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext, 3222 &input_consumed)); 3223 EXPECT_EQ(message.size(), input_consumed); 3224 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 3225 3226 // Grab nonce. 3227 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE)); 3228 begin_params.push_back(begin_out_params); 3229 3230 // Decrypt 3231 update_params.Clear(); 3232 update_params.push_back(TAG_ASSOCIATED_DATA, "foofoo", 6); 3233 3234 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 3235 string plaintext; 3236 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params, 3237 &plaintext, &input_consumed)); 3238 EXPECT_EQ(ciphertext.size(), input_consumed); 3239 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext)); 3240 3241 EXPECT_EQ(message, plaintext); 3242 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3243 } 3244 3245 TEST_P(EncryptionOperationsTest, AesGcmBadAad) { 3246 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3247 .AesEncryptionKey(128) 3248 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 3249 .Authorization(TAG_PADDING, KM_PAD_NONE) 3250 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3251 string message = "12345678901234567890123456789012"; 3252 AuthorizationSet begin_params(client_params()); 3253 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 3254 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3255 begin_params.push_back(TAG_MAC_LENGTH, 128); 3256 3257 AuthorizationSet update_params; 3258 update_params.push_back(TAG_ASSOCIATED_DATA, "foobar", 6); 3259 3260 AuthorizationSet finish_params; 3261 AuthorizationSet finish_out_params; 3262 3263 // Encrypt 3264 AuthorizationSet begin_out_params; 3265 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params)); 3266 AuthorizationSet update_out_params; 3267 string ciphertext; 3268 size_t input_consumed; 3269 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext, 3270 &input_consumed)); 3271 EXPECT_EQ(message.size(), input_consumed); 3272 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 3273 3274 // Grab nonce 3275 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE)); 3276 begin_params.push_back(begin_out_params); 3277 3278 update_params.Clear(); 3279 update_params.push_back(TAG_ASSOCIATED_DATA, "barfoo" /* Wrong AAD */, 6); 3280 3281 // Decrypt. 3282 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params)); 3283 string plaintext; 3284 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params, 3285 &plaintext, &input_consumed)); 3286 EXPECT_EQ(ciphertext.size(), input_consumed); 3287 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext)); 3288 3289 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3290 } 3291 3292 TEST_P(EncryptionOperationsTest, AesGcmWrongNonce) { 3293 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3294 .AesEncryptionKey(128) 3295 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 3296 .Authorization(TAG_PADDING, KM_PAD_NONE) 3297 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3298 string message = "12345678901234567890123456789012"; 3299 AuthorizationSet begin_params(client_params()); 3300 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 3301 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3302 begin_params.push_back(TAG_MAC_LENGTH, 128); 3303 3304 AuthorizationSet update_params; 3305 update_params.push_back(TAG_ASSOCIATED_DATA, "foobar", 6); 3306 3307 // Encrypt 3308 AuthorizationSet begin_out_params; 3309 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params)); 3310 AuthorizationSet update_out_params; 3311 string ciphertext; 3312 size_t input_consumed; 3313 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext, 3314 &input_consumed)); 3315 EXPECT_EQ(message.size(), input_consumed); 3316 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 3317 3318 begin_params.push_back(TAG_NONCE, "123456789012", 12); 3319 3320 // Decrypt 3321 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params)); 3322 string plaintext; 3323 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params, 3324 &plaintext, &input_consumed)); 3325 EXPECT_EQ(ciphertext.size(), input_consumed); 3326 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext)); 3327 3328 // With wrong nonce, should have gotten garbage plaintext. 3329 EXPECT_NE(message, plaintext); 3330 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3331 } 3332 3333 TEST_P(EncryptionOperationsTest, AesGcmCorruptTag) { 3334 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3335 .AesEncryptionKey(128) 3336 .Authorization(TAG_BLOCK_MODE, KM_MODE_GCM) 3337 .Authorization(TAG_PADDING, KM_PAD_NONE) 3338 .Authorization(TAG_MIN_MAC_LENGTH, 128))); 3339 string aad = "foobar"; 3340 string message = "123456789012345678901234567890123456"; 3341 AuthorizationSet begin_params(client_params()); 3342 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_GCM); 3343 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3344 begin_params.push_back(TAG_MAC_LENGTH, 128); 3345 AuthorizationSet begin_out_params; 3346 3347 AuthorizationSet update_params; 3348 update_params.push_back(TAG_ASSOCIATED_DATA, aad.data(), aad.size()); 3349 3350 // Encrypt 3351 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &begin_out_params)); 3352 AuthorizationSet update_out_params; 3353 string ciphertext; 3354 size_t input_consumed; 3355 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, message, &update_out_params, &ciphertext, 3356 &input_consumed)); 3357 EXPECT_EQ(message.size(), input_consumed); 3358 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 3359 3360 // Corrupt tag 3361 (*ciphertext.rbegin())++; 3362 3363 // Grab nonce. 3364 EXPECT_NE(-1, begin_out_params.find(TAG_NONCE)); 3365 begin_params.push_back(begin_out_params); 3366 3367 // Decrypt. 3368 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params, &begin_out_params)); 3369 string plaintext; 3370 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(update_params, ciphertext, &update_out_params, 3371 &plaintext, &input_consumed)); 3372 EXPECT_EQ(ciphertext.size(), input_consumed); 3373 EXPECT_EQ(KM_ERROR_VERIFICATION_FAILED, FinishOperation(&plaintext)); 3374 3375 EXPECT_EQ(message, plaintext); 3376 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3377 } 3378 3379 TEST_P(EncryptionOperationsTest, TripleDesEcbRoundTripSuccess) { 3380 auto auths = AuthorizationSetBuilder() 3381 .TripleDesEncryptionKey(112) 3382 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 3383 .Padding(KM_PAD_NONE); 3384 3385 ASSERT_EQ(KM_ERROR_OK, GenerateKey(auths)); 3386 // Two-block message. 3387 string message = "1234567890123456"; 3388 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE); 3389 EXPECT_EQ(message.size(), ciphertext1.size()); 3390 3391 string ciphertext2 = EncryptMessage(string(message), KM_MODE_ECB, KM_PAD_NONE); 3392 EXPECT_EQ(message.size(), ciphertext2.size()); 3393 3394 // ECB is deterministic. 3395 EXPECT_EQ(ciphertext1, ciphertext2); 3396 3397 string plaintext = DecryptMessage(ciphertext1, KM_MODE_ECB, KM_PAD_NONE); 3398 EXPECT_EQ(message, plaintext); 3399 } 3400 3401 TEST_P(EncryptionOperationsTest, TripleDesEcbNotAuthorized) { 3402 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3403 .TripleDesEncryptionKey(112) 3404 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 3405 .Padding(KM_PAD_NONE))); 3406 // Two-block message. 3407 string message = "1234567890123456"; 3408 AuthorizationSet begin_params(client_params()); 3409 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 3410 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3411 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_BLOCK_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 3412 } 3413 3414 TEST_P(EncryptionOperationsTest, TripleDesEcbNoPaddingWrongInputSize) { 3415 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3416 .TripleDesEncryptionKey(112) 3417 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 3418 .Padding(KM_PAD_NONE))); 3419 // Message is slightly shorter than two blocks. 3420 string message = "123456789012345"; 3421 3422 AuthorizationSet begin_params(client_params()); 3423 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 3424 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3425 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 3426 string ciphertext; 3427 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(message, "", &ciphertext)); 3428 } 3429 3430 TEST_P(EncryptionOperationsTest, TripleDesEcbPkcs7Padding) { 3431 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3432 .TripleDesEncryptionKey(112) 3433 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 3434 .Authorization(TAG_PADDING, KM_PAD_PKCS7))); 3435 3436 // Try various message lengths; all should work. 3437 for (size_t i = 0; i < 32; ++i) { 3438 string message(i, 'a'); 3439 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7); 3440 EXPECT_EQ(i + 8 - (i % 8), ciphertext.size()); 3441 string plaintext = DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_PKCS7); 3442 EXPECT_EQ(message, plaintext); 3443 } 3444 } 3445 3446 TEST_P(EncryptionOperationsTest, TripleDesEcbNoPaddingKeyWithPkcs7Padding) { 3447 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3448 .TripleDesEncryptionKey(112) 3449 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 3450 .Authorization(TAG_PADDING, KM_PAD_NONE))); 3451 3452 // Try various message lengths; all should fail. 3453 for (size_t i = 0; i < 32; ++i) { 3454 AuthorizationSet begin_params(client_params()); 3455 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 3456 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7); 3457 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, 3458 BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 3459 } 3460 } 3461 3462 TEST_P(EncryptionOperationsTest, TripleDesEcbPkcs7PaddingCorrupted) { 3463 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3464 .TripleDesEncryptionKey(112) 3465 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 3466 .Authorization(TAG_PADDING, KM_PAD_PKCS7))); 3467 3468 string message = "a"; 3469 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_PKCS7); 3470 EXPECT_EQ(8U, ciphertext.size()); 3471 EXPECT_NE(ciphertext, message); 3472 ++ciphertext[ciphertext.size() / 2]; 3473 3474 AuthorizationSet begin_params(client_params()); 3475 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 3476 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7); 3477 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 3478 string plaintext; 3479 size_t input_consumed; 3480 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed)); 3481 EXPECT_EQ(ciphertext.size(), input_consumed); 3482 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext)); 3483 } 3484 3485 struct TripleDesTestVector { 3486 const char* name; 3487 const keymaster_purpose_t purpose; 3488 const keymaster_block_mode_t block_mode; 3489 const keymaster_padding_t padding_mode; 3490 const char* key; 3491 const char* iv; 3492 const char* input; 3493 const char* output; 3494 }; 3495 3496 // These test vectors are from NIST CAVP, plus a few custom variants to test padding, since all of 3497 // the NIST vectors are multiples of the block size. 3498 static const TripleDesTestVector kTripleDesTestVectors[] = { 3499 { 3500 "TECBMMT2 Encrypt 0", KM_PURPOSE_ENCRYPT, KM_MODE_ECB, KM_PAD_NONE, 3501 "ad192fd064b5579e7a4fb3c8f794f22a", // key 3502 "", // IV 3503 "13bad542f3652d67", // input 3504 "908e543cf2cb254f", // output 3505 }, 3506 { 3507 "TECBMMT2 Encrypt 0 PKCS7", KM_PURPOSE_ENCRYPT, KM_MODE_ECB, KM_PAD_PKCS7, 3508 "ad192fd064b5579e7a4fb3c8f794f22a", // key 3509 "", // IV 3510 "13bad542f3652d6700", // input 3511 "908e543cf2cb254fc40165289a89008c", // output 3512 }, 3513 { 3514 "TECBMMT2 Encrypt 0 PKCS7 decrypted", KM_PURPOSE_DECRYPT, KM_MODE_ECB, KM_PAD_PKCS7, 3515 "ad192fd064b5579e7a4fb3c8f794f22a", // key 3516 "", // IV 3517 "908e543cf2cb254fc40165289a89008c", // input 3518 "13bad542f3652d6700", // output 3519 }, 3520 { 3521 "TECBMMT2 Encrypt 1", KM_PURPOSE_ENCRYPT, KM_MODE_ECB, KM_PAD_NONE, 3522 "259df16e7af804fe83b90e9bf7c7e557", // key 3523 "", // IV 3524 "a4619c433bbd6787c07c81728f9ac9fa", // input 3525 "9e06de155c483c6bcfd834dbc8bd5830", // output 3526 }, 3527 { 3528 "TECBMMT2 Decrypt 0", KM_PURPOSE_DECRYPT, KM_MODE_ECB, KM_PAD_NONE, 3529 "b32ff42092024adf2076b9d3d9f19e6d", // key 3530 "", // IV 3531 "2f3f2a49bba807a5", // input 3532 "2249973fa135fb52", // output 3533 }, 3534 { 3535 "TECBMMT2 Decrypt 1", KM_PURPOSE_DECRYPT, KM_MODE_ECB, KM_PAD_NONE, 3536 "023dfbe6621aa17cc219eae9cdecd923", // key 3537 "", // IV 3538 "54045dc71d8d565b227ec19f06fef912", // input 3539 "9b071622181e6412de6066429401410d", // output 3540 }, 3541 { 3542 "TECBMMT3 Encrypt 0", KM_PURPOSE_ENCRYPT, KM_MODE_ECB, KM_PAD_NONE, 3543 "a2b5bc67da13dc92cd9d344aa238544a0e1fa79ef76810cd", // key 3544 "", // IV 3545 "329d86bdf1bc5af4", // input 3546 "d946c2756d78633f", // output 3547 }, 3548 { 3549 "TECBMMT3 Encrypt 1", KM_PURPOSE_ENCRYPT, KM_MODE_ECB, KM_PAD_NONE, 3550 "49e692290d2a5e46bace79b9648a4c5d491004c262dc9d49", // key 3551 "", // IV 3552 "6b1540781b01ce1997adae102dbf3c5b", // input 3553 "4d0dc182d6e481ac4a3dc6ab6976ccae", // output 3554 }, 3555 { 3556 "TECBMMT3 Decrypt 0", KM_PURPOSE_DECRYPT, KM_MODE_ECB, KM_PAD_NONE, 3557 "52daec2ac7dc1958377392682f37860b2cc1ea2304bab0e9", // key 3558 "", // IV 3559 "6daad94ce08acfe7", // input 3560 "660e7d32dcc90e79", // output 3561 }, 3562 { 3563 "TECBMMT3 Decrypt 1", KM_PURPOSE_DECRYPT, KM_MODE_ECB, KM_PAD_NONE, 3564 "7f8fe3d3f4a48394fb682c2919926d6ddfce8932529229ce", // key 3565 "", // IV 3566 "e9653a0a1f05d31b9acd12d73aa9879d", // input 3567 "9b2ae9d998efe62f1b592e7e1df8ff38", // output 3568 }, 3569 { 3570 "TCBCMMT2 Encrypt 0", KM_PURPOSE_ENCRYPT, KM_MODE_CBC, KM_PAD_NONE, 3571 "34a41a8c293176c1b30732ecfe38ae8a", // key 3572 "f55b4855228bd0b4", // IV 3573 "7dd880d2a9ab411c", // input 3574 "c91892948b6cadb4", // output 3575 }, 3576 { 3577 "TCBCMMT2 Encrypt 1", KM_PURPOSE_ENCRYPT, KM_MODE_CBC, KM_PAD_NONE, 3578 "70a88fa1dfb9942fa77f40157ffef2ad", // key 3579 "ece08ce2fdc6ce80", // IV 3580 "bc225304d5a3a5c9918fc5006cbc40cc", // input 3581 "27f67dc87af7ddb4b68f63fa7c2d454a", // output 3582 }, 3583 { 3584 "TCBCMMT2 Decrypt 0", KM_PURPOSE_DECRYPT, KM_MODE_CBC, KM_PAD_NONE, 3585 "4ff47fda89209bda8c85f7fe80192007", // key 3586 "d5bc4891dabe48b9", // IV 3587 "7e154b28c353adef", // input 3588 "712b961ea9a1d0af", // output 3589 }, 3590 { 3591 "TCBCMMT2 Decrypt 1", KM_PURPOSE_DECRYPT, KM_MODE_CBC, KM_PAD_NONE, 3592 "464092cdbf736d38fb1fe6a12a94ae0e", // key 3593 "5423455f00023b01", // IV 3594 "3f6050b74ed64416bc23d53b0469ed7a", // input 3595 "9cbe7d1b5cdd1864c3095ba810575960", // output 3596 }, 3597 { 3598 "TCBCMMT3 Encrypt 0", KM_PURPOSE_ENCRYPT, KM_MODE_CBC, KM_PAD_NONE, 3599 "b5cb1504802326c73df186e3e352a20de643b0d63ee30e37", // key 3600 "43f791134c5647ba", // IV 3601 "dcc153cef81d6f24", // input 3602 "92538bd8af18d3ba", // output 3603 }, 3604 { 3605 "TCBCMMT3 Encrypt 1", KM_PURPOSE_ENCRYPT, KM_MODE_CBC, KM_PAD_NONE, 3606 "a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f7358", // key 3607 "c2e999cb6249023c", // IV 3608 "c689aee38a301bb316da75db36f110b5", // input 3609 "e9afaba5ec75ea1bbe65506655bb4ecb", // output 3610 }, 3611 { 3612 "TCBCMMT3 Encrypt 1 PKCS7 variant", KM_PURPOSE_ENCRYPT, KM_MODE_CBC, KM_PAD_PKCS7, 3613 "a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f7358", // key 3614 "c2e999cb6249023c", // IV 3615 "c689aee38a301bb316da75db36f110b500", // input 3616 "e9afaba5ec75ea1bbe65506655bb4ecb825aa27ec0656156", // output 3617 }, 3618 { 3619 "TCBCMMT3 Encrypt 1 PKCS7 decrypted", KM_PURPOSE_DECRYPT, KM_MODE_CBC, KM_PAD_PKCS7, 3620 "a49d7564199e97cb529d2c9d97bf2f98d35edf57ba1f7358", // key 3621 "c2e999cb6249023c", // IV 3622 "e9afaba5ec75ea1bbe65506655bb4ecb825aa27ec0656156", // input 3623 "c689aee38a301bb316da75db36f110b500", // output 3624 }, 3625 { 3626 "TCBCMMT3 Decrypt 0", KM_PURPOSE_DECRYPT, KM_MODE_CBC, KM_PAD_NONE, 3627 "5eb6040d46082c7aa7d06dfd08dfeac8c18364c1548c3ba1", // key 3628 "41746c7e442d3681", // IV 3629 "c53a7b0ec40600fe", // input 3630 "d4f00eb455de1034", // output 3631 }, 3632 { 3633 "TCBCMMT3 Decrypt 1", KM_PURPOSE_DECRYPT, KM_MODE_CBC, KM_PAD_NONE, 3634 "5b1cce7c0dc1ec49130dfb4af45785ab9179e567f2c7d549", // key 3635 "3982bc02c3727d45", // IV 3636 "6006f10adef52991fcc777a1238bbb65", // input 3637 "edae09288e9e3bc05746d872b48e3b29", // output 3638 }, 3639 }; 3640 3641 TEST_P(EncryptionOperationsTest, TripleDesTestVector) { 3642 for (auto& test : array_range(kTripleDesTestVectors)) { 3643 SCOPED_TRACE(test.name); 3644 CheckTripleDesTestVector(test.purpose, test.block_mode, test.padding_mode, 3645 hex2str(test.key), hex2str(test.iv), hex2str(test.input), 3646 hex2str(test.output)); 3647 } 3648 } 3649 3650 TEST_P(EncryptionOperationsTest, TripleDesCbcRoundTripSuccess) { 3651 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3652 .TripleDesEncryptionKey(112) 3653 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 3654 .Padding(KM_PAD_NONE))); 3655 // Two-block message. 3656 string message = "1234567890123456"; 3657 string iv1; 3658 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1); 3659 EXPECT_EQ(message.size(), ciphertext1.size()); 3660 3661 string iv2; 3662 string ciphertext2 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv2); 3663 EXPECT_EQ(message.size(), ciphertext2.size()); 3664 3665 // IVs should be random, so ciphertexts should differ. 3666 EXPECT_NE(iv1, iv2); 3667 EXPECT_NE(ciphertext1, ciphertext2); 3668 3669 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1); 3670 EXPECT_EQ(message, plaintext); 3671 3672 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3673 } 3674 3675 TEST_P(EncryptionOperationsTest, TripleDesCallerIv) { 3676 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3677 .TripleDesEncryptionKey(112) 3678 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 3679 .Authorization(TAG_CALLER_NONCE) 3680 .Padding(KM_PAD_NONE))); 3681 string message = "1234567890123456"; 3682 string iv1; 3683 // Don't specify IV, should get a random one. 3684 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1); 3685 EXPECT_EQ(message.size(), ciphertext1.size()); 3686 EXPECT_EQ(8U, iv1.size()); 3687 3688 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1); 3689 EXPECT_EQ(message, plaintext); 3690 3691 // Now specify an IV, should also work. 3692 AuthorizationSet input_params(client_params()); 3693 AuthorizationSet update_params; 3694 AuthorizationSet output_params; 3695 input_params.push_back(TAG_NONCE, "abcdefgh", 8); 3696 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 3697 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 3698 string ciphertext2 = 3699 ProcessMessage(KM_PURPOSE_ENCRYPT, message, input_params, update_params, &output_params); 3700 3701 // Decrypt with correct IV. 3702 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params, 3703 &output_params); 3704 EXPECT_EQ(message, plaintext); 3705 3706 // Now try with wrong IV. 3707 input_params.Reinitialize(client_params()); 3708 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 3709 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 3710 input_params.push_back(TAG_NONCE, "aaaaaaaa", 8); 3711 plaintext = ProcessMessage(KM_PURPOSE_DECRYPT, ciphertext2, input_params, update_params, 3712 &output_params); 3713 EXPECT_NE(message, plaintext); 3714 } 3715 3716 TEST_P(EncryptionOperationsTest, TripleDesCallerNonceProhibited) { 3717 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3718 .TripleDesEncryptionKey(112) 3719 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 3720 .Padding(KM_PAD_NONE))); 3721 3722 string message = "12345678901234567890123456789012"; 3723 string iv1; 3724 // Don't specify nonce, should get a random one. 3725 string ciphertext1 = EncryptMessage(message, KM_MODE_CBC, KM_PAD_NONE, &iv1); 3726 EXPECT_EQ(message.size(), ciphertext1.size()); 3727 EXPECT_EQ(8U, iv1.size()); 3728 3729 string plaintext = DecryptMessage(ciphertext1, KM_MODE_CBC, KM_PAD_NONE, iv1); 3730 EXPECT_EQ(message, plaintext); 3731 3732 // Now specify a nonce, should fail. 3733 AuthorizationSet input_params(client_params()); 3734 AuthorizationSet update_params; 3735 AuthorizationSet output_params; 3736 input_params.push_back(TAG_NONCE, "abcdefgh", 8); 3737 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 3738 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 3739 3740 EXPECT_EQ(KM_ERROR_CALLER_NONCE_PROHIBITED, 3741 BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params)); 3742 } 3743 3744 TEST_P(EncryptionOperationsTest, TripleDesCbcNotAuthorized) { 3745 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3746 .TripleDesEncryptionKey(112) 3747 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 3748 .Padding(KM_PAD_NONE))); 3749 // Two-block message. 3750 string message = "1234567890123456"; 3751 AuthorizationSet begin_params(client_params()); 3752 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 3753 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3754 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_BLOCK_MODE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 3755 } 3756 3757 TEST_P(EncryptionOperationsTest, TripleDesCbcNoPaddingWrongInputSize) { 3758 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3759 .TripleDesEncryptionKey(112) 3760 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 3761 .Padding(KM_PAD_NONE))); 3762 // Message is slightly shorter than two blocks. 3763 string message = "123456789012345"; 3764 3765 AuthorizationSet begin_params(client_params()); 3766 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 3767 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3768 AuthorizationSet output_params; 3769 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params, &output_params)); 3770 string ciphertext; 3771 EXPECT_EQ(KM_ERROR_INVALID_INPUT_LENGTH, FinishOperation(message, "", &ciphertext)); 3772 } 3773 3774 TEST_P(EncryptionOperationsTest, TripleDesCbcPkcs7Padding) { 3775 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3776 .TripleDesEncryptionKey(112) 3777 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 3778 .Authorization(TAG_PADDING, KM_PAD_PKCS7))); 3779 3780 // Try various message lengths; all should work. 3781 for (size_t i = 0; i < 32; ++i) { 3782 string message(i, 'a'); 3783 string iv; 3784 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv); 3785 EXPECT_EQ(i + 8 - (i % 8), ciphertext.size()); 3786 string plaintext = DecryptMessage(ciphertext, KM_MODE_CBC, KM_PAD_PKCS7, iv); 3787 EXPECT_EQ(message, plaintext); 3788 } 3789 } 3790 3791 TEST_P(EncryptionOperationsTest, TripleDesCbcNoPaddingKeyWithPkcs7Padding) { 3792 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3793 .TripleDesEncryptionKey(112) 3794 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 3795 .Authorization(TAG_PADDING, KM_PAD_NONE))); 3796 3797 // Try various message lengths; all should fail. 3798 for (size_t i = 0; i < 32; ++i) { 3799 AuthorizationSet begin_params(client_params()); 3800 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 3801 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7); 3802 EXPECT_EQ(KM_ERROR_INCOMPATIBLE_PADDING_MODE, 3803 BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 3804 } 3805 } 3806 3807 TEST_P(EncryptionOperationsTest, TripleDesCbcPkcs7PaddingCorrupted) { 3808 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3809 .TripleDesEncryptionKey(112) 3810 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 3811 .Authorization(TAG_PADDING, KM_PAD_PKCS7))); 3812 3813 string message = "a"; 3814 string iv; 3815 string ciphertext = EncryptMessage(message, KM_MODE_CBC, KM_PAD_PKCS7, &iv); 3816 EXPECT_EQ(8U, ciphertext.size()); 3817 EXPECT_NE(ciphertext, message); 3818 ++ciphertext[ciphertext.size() / 2]; 3819 3820 AuthorizationSet begin_params(client_params()); 3821 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 3822 begin_params.push_back(TAG_PADDING, KM_PAD_PKCS7); 3823 begin_params.push_back(TAG_NONCE, iv.data(), iv.size()); 3824 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, begin_params)); 3825 string plaintext; 3826 size_t input_consumed; 3827 EXPECT_EQ(KM_ERROR_OK, UpdateOperation(ciphertext, &plaintext, &input_consumed)); 3828 EXPECT_EQ(ciphertext.size(), input_consumed); 3829 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, FinishOperation(&plaintext)); 3830 } 3831 3832 TEST_P(EncryptionOperationsTest, TripleDesCbcIncrementalNoPadding) { 3833 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3834 .TripleDesEncryptionKey(112) 3835 .Authorization(TAG_BLOCK_MODE, KM_MODE_CBC) 3836 .Padding(KM_PAD_NONE))); 3837 3838 int increment = 7; 3839 string message(240, 'a'); 3840 AuthorizationSet input_params(client_params()); 3841 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 3842 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 3843 AuthorizationSet output_params; 3844 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, input_params, &output_params)); 3845 3846 string ciphertext; 3847 size_t input_consumed; 3848 for (size_t i = 0; i < message.size(); i += increment) 3849 EXPECT_EQ(KM_ERROR_OK, 3850 UpdateOperation(message.substr(i, increment), &ciphertext, &input_consumed)); 3851 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&ciphertext)); 3852 EXPECT_EQ(message.size(), ciphertext.size()); 3853 3854 // Move TAG_NONCE into input_params 3855 input_params.Reinitialize(output_params); 3856 input_params.push_back(client_params()); 3857 input_params.push_back(TAG_BLOCK_MODE, KM_MODE_CBC); 3858 input_params.push_back(TAG_PADDING, KM_PAD_NONE); 3859 output_params.Clear(); 3860 3861 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_DECRYPT, input_params, &output_params)); 3862 string plaintext; 3863 for (size_t i = 0; i < ciphertext.size(); i += increment) 3864 EXPECT_EQ(KM_ERROR_OK, 3865 UpdateOperation(ciphertext.substr(i, increment), &plaintext, &input_consumed)); 3866 EXPECT_EQ(KM_ERROR_OK, FinishOperation(&plaintext)); 3867 EXPECT_EQ(ciphertext.size(), plaintext.size()); 3868 EXPECT_EQ(message, plaintext); 3869 3870 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3871 } 3872 3873 typedef Keymaster2Test MaxOperationsTest; 3874 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, MaxOperationsTest, test_params); 3875 3876 TEST_P(MaxOperationsTest, TestLimit) { 3877 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3878 .AesEncryptionKey(128) 3879 .EcbMode() 3880 .Authorization(TAG_PADDING, KM_PAD_NONE) 3881 .Authorization(TAG_MAX_USES_PER_BOOT, 3))); 3882 3883 string message = "1234567890123456"; 3884 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE); 3885 string ciphertext2 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE); 3886 string ciphertext3 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE); 3887 3888 // Fourth time should fail. 3889 AuthorizationSet begin_params(client_params()); 3890 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 3891 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3892 EXPECT_EQ(KM_ERROR_KEY_MAX_OPS_EXCEEDED, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 3893 3894 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3895 } 3896 3897 TEST_P(MaxOperationsTest, TestAbort) { 3898 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 3899 .AesEncryptionKey(128) 3900 .EcbMode() 3901 .Authorization(TAG_PADDING, KM_PAD_NONE) 3902 .Authorization(TAG_MAX_USES_PER_BOOT, 3))); 3903 3904 string message = "1234567890123456"; 3905 string ciphertext1 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE); 3906 string ciphertext2 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE); 3907 string ciphertext3 = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE); 3908 3909 // Fourth time should fail. 3910 AuthorizationSet begin_params(client_params()); 3911 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 3912 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 3913 EXPECT_EQ(KM_ERROR_KEY_MAX_OPS_EXCEEDED, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 3914 3915 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3916 } 3917 3918 typedef Keymaster2Test AddEntropyTest; 3919 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AddEntropyTest, test_params); 3920 3921 TEST_P(AddEntropyTest, AddEntropy) { 3922 // There's no obvious way to test that entropy is actually added, but we can test that the API 3923 // doesn't blow up or return an error. 3924 EXPECT_EQ(KM_ERROR_OK, 3925 device()->add_rng_entropy(device(), reinterpret_cast<const uint8_t*>("foo"), 3)); 3926 3927 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 3928 } 3929 3930 typedef Keymaster2Test AttestationTest; 3931 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, AttestationTest, test_params); 3932 3933 static X509* parse_cert_blob(const keymaster_blob_t& blob) { 3934 const uint8_t* p = blob.data; 3935 return d2i_X509(nullptr, &p, blob.data_length); 3936 } 3937 3938 static bool verify_chain(const keymaster_cert_chain_t& chain) { 3939 for (size_t i = 0; i < chain.entry_count - 1; ++i) { 3940 keymaster_blob_t& key_cert_blob = chain.entries[i]; 3941 keymaster_blob_t& signing_cert_blob = chain.entries[i + 1]; 3942 3943 X509_Ptr key_cert(parse_cert_blob(key_cert_blob)); 3944 X509_Ptr signing_cert(parse_cert_blob(signing_cert_blob)); 3945 EXPECT_TRUE(!!key_cert.get() && !!signing_cert.get()); 3946 if (!key_cert.get() || !signing_cert.get()) 3947 return false; 3948 3949 EVP_PKEY_Ptr signing_pubkey(X509_get_pubkey(signing_cert.get())); 3950 EXPECT_TRUE(!!signing_pubkey.get()); 3951 if (!signing_pubkey.get()) 3952 return false; 3953 3954 EXPECT_EQ(1, X509_verify(key_cert.get(), signing_pubkey.get())) 3955 << "Verification of certificate " << i << " failed"; 3956 } 3957 3958 return true; 3959 } 3960 3961 // Extract attestation record from cert. Returned object is still part of cert; don't free it 3962 // separately. 3963 static ASN1_OCTET_STRING* get_attestation_record(X509* certificate) { 3964 ASN1_OBJECT_Ptr oid(OBJ_txt2obj(kAttestionRecordOid, 1 /* dotted string format */)); 3965 EXPECT_TRUE(!!oid.get()); 3966 if (!oid.get()) 3967 return nullptr; 3968 3969 int location = X509_get_ext_by_OBJ(certificate, oid.get(), -1 /* search from beginning */); 3970 EXPECT_NE(-1, location); 3971 if (location == -1) 3972 return nullptr; 3973 3974 X509_EXTENSION* attest_rec_ext = X509_get_ext(certificate, location); 3975 EXPECT_TRUE(!!attest_rec_ext); 3976 if (!attest_rec_ext) 3977 return nullptr; 3978 3979 ASN1_OCTET_STRING* attest_rec = X509_EXTENSION_get_data(attest_rec_ext); 3980 EXPECT_TRUE(!!attest_rec); 3981 return attest_rec; 3982 } 3983 3984 static bool verify_attestation_record(const string& challenge, 3985 AuthorizationSet expected_sw_enforced, 3986 AuthorizationSet expected_tee_enforced, 3987 uint32_t expected_keymaster_version, 3988 keymaster_security_level_t expected_keymaster_security_level, 3989 const keymaster_blob_t& attestation_cert) { 3990 3991 X509_Ptr cert(parse_cert_blob(attestation_cert)); 3992 EXPECT_TRUE(!!cert.get()); 3993 if (!cert.get()) 3994 return false; 3995 3996 ASN1_OCTET_STRING* attest_rec = get_attestation_record(cert.get()); 3997 EXPECT_TRUE(!!attest_rec); 3998 if (!attest_rec) 3999 return false; 4000 4001 AuthorizationSet att_sw_enforced; 4002 AuthorizationSet att_tee_enforced; 4003 uint32_t att_attestation_version; 4004 uint32_t att_keymaster_version; 4005 keymaster_security_level_t att_attestation_security_level; 4006 keymaster_security_level_t att_keymaster_security_level; 4007 keymaster_blob_t att_challenge = {}; 4008 keymaster_blob_t att_unique_id = {}; 4009 EXPECT_EQ(KM_ERROR_OK, parse_attestation_record( 4010 attest_rec->data, attest_rec->length, &att_attestation_version, 4011 &att_attestation_security_level, &att_keymaster_version, 4012 &att_keymaster_security_level, &att_challenge, &att_sw_enforced, 4013 &att_tee_enforced, &att_unique_id)); 4014 4015 EXPECT_EQ(2U, att_attestation_version); 4016 EXPECT_EQ(KM_SECURITY_LEVEL_SOFTWARE, att_attestation_security_level); 4017 EXPECT_EQ(expected_keymaster_version, att_keymaster_version); 4018 EXPECT_EQ(expected_keymaster_security_level, att_keymaster_security_level); 4019 4020 EXPECT_EQ(challenge.length(), att_challenge.data_length); 4021 EXPECT_EQ(0, memcmp(challenge.data(), att_challenge.data, challenge.length())); 4022 4023 // Add TAG_USER_ID to the relevant attestation list, because user IDs are not included in 4024 // attestations, since they're meaningless off-device. 4025 uint32_t user_id; 4026 if (expected_sw_enforced.GetTagValue(TAG_USER_ID, &user_id)) 4027 att_sw_enforced.push_back(TAG_USER_ID, user_id); 4028 if (expected_tee_enforced.GetTagValue(TAG_USER_ID, &user_id)) 4029 att_tee_enforced.push_back(TAG_USER_ID, user_id); 4030 4031 // Add TAG_INCLUDE_UNIQUE_ID to the relevant attestation list, because that tag is not included 4032 // in the attestation. 4033 if (expected_sw_enforced.GetTagValue(TAG_INCLUDE_UNIQUE_ID)) 4034 att_sw_enforced.push_back(TAG_INCLUDE_UNIQUE_ID); 4035 if (expected_tee_enforced.GetTagValue(TAG_INCLUDE_UNIQUE_ID)) 4036 att_tee_enforced.push_back(TAG_INCLUDE_UNIQUE_ID); 4037 4038 att_sw_enforced.Sort(); 4039 expected_sw_enforced.Sort(); 4040 EXPECT_EQ(expected_sw_enforced, att_sw_enforced); 4041 4042 att_tee_enforced.Sort(); 4043 expected_tee_enforced.Sort(); 4044 EXPECT_EQ(expected_tee_enforced, att_tee_enforced); 4045 4046 delete[] att_challenge.data; 4047 delete[] att_unique_id.data; 4048 4049 return true; 4050 } 4051 4052 TEST_P(AttestationTest, RsaAttestation) { 4053 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 4054 .RsaSigningKey(256, 3) 4055 .Digest(KM_DIGEST_NONE) 4056 .Padding(KM_PAD_NONE) 4057 .Authorization(TAG_INCLUDE_UNIQUE_ID))); 4058 4059 keymaster_cert_chain_t cert_chain; 4060 EXPECT_EQ(KM_ERROR_OK, AttestKey("challenge", "attest_app_id", &cert_chain)); 4061 ASSERT_EQ(3U, cert_chain.entry_count); 4062 EXPECT_TRUE(verify_chain(cert_chain)); 4063 4064 uint32_t expected_keymaster_version; 4065 keymaster_security_level_t expected_keymaster_security_level; 4066 // TODO(swillden): Add a test KM1 that claims to be hardware. 4067 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) { 4068 expected_keymaster_version = 0; 4069 expected_keymaster_security_level = KM_SECURITY_LEVEL_TRUSTED_ENVIRONMENT; 4070 } else { 4071 expected_keymaster_version = 3; 4072 expected_keymaster_security_level = KM_SECURITY_LEVEL_SOFTWARE; 4073 } 4074 4075 EXPECT_TRUE(verify_attestation_record( 4076 "challenge", sw_enforced(), hw_enforced(), expected_keymaster_version, 4077 expected_keymaster_security_level, cert_chain.entries[0])); 4078 4079 keymaster_free_cert_chain(&cert_chain); 4080 } 4081 4082 TEST_P(AttestationTest, EcAttestation) { 4083 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest( 4084 KM_DIGEST_SHA_2_256))); 4085 4086 uint32_t expected_keymaster_version; 4087 keymaster_security_level_t expected_keymaster_security_level; 4088 // TODO(swillden): Add a test KM1 that claims to be hardware. 4089 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) { 4090 expected_keymaster_version = 0; 4091 expected_keymaster_security_level = KM_SECURITY_LEVEL_TRUSTED_ENVIRONMENT; 4092 } else { 4093 expected_keymaster_version = 3; 4094 expected_keymaster_security_level = KM_SECURITY_LEVEL_SOFTWARE; 4095 } 4096 4097 keymaster_cert_chain_t cert_chain; 4098 EXPECT_EQ(KM_ERROR_OK, AttestKey("challenge", "attest_app_id", &cert_chain)); 4099 ASSERT_EQ(3U, cert_chain.entry_count); 4100 EXPECT_TRUE(verify_chain(cert_chain)); 4101 EXPECT_TRUE(verify_attestation_record( 4102 "challenge", sw_enforced(), hw_enforced(), expected_keymaster_version, 4103 expected_keymaster_security_level, cert_chain.entries[0])); 4104 4105 keymaster_free_cert_chain(&cert_chain); 4106 } 4107 4108 typedef Keymaster2Test KeyUpgradeTest; 4109 INSTANTIATE_TEST_CASE_P(AndroidKeymasterTest, KeyUpgradeTest, test_params); 4110 4111 TEST_P(KeyUpgradeTest, AesVersionUpgrade) { 4112 GetParam()->keymaster_context()->SetSystemVersion(1, 1); 4113 4114 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder() 4115 .AesEncryptionKey(128) 4116 .Authorization(TAG_BLOCK_MODE, KM_MODE_ECB) 4117 .Padding(KM_PAD_NONE))); 4118 4119 // Key should operate fine. 4120 string message = "1234567890123456"; 4121 string ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE); 4122 EXPECT_EQ(message, DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_NONE)); 4123 4124 // Increase patch level. Key usage should fail with KM_ERROR_KEY_REQUIRES_UPGRADE. 4125 GetParam()->keymaster_context()->SetSystemVersion(1, 2); 4126 AuthorizationSet begin_params(client_params()); 4127 begin_params.push_back(TAG_BLOCK_MODE, KM_MODE_ECB); 4128 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 4129 if (GetParam()->is_keymaster1_hw()) { 4130 // Keymaster1 hardware can't support version binding. The key will work regardless 4131 // of system version. Just abort the remainder of the test. 4132 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 4133 EXPECT_EQ(KM_ERROR_OK, AbortOperation()); 4134 return; 4135 } 4136 EXPECT_EQ(KM_ERROR_KEY_REQUIRES_UPGRADE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 4137 4138 // Getting characteristics should also fail 4139 EXPECT_EQ(KM_ERROR_KEY_REQUIRES_UPGRADE, GetCharacteristics()); 4140 4141 // Upgrade key. 4142 EXPECT_EQ(KM_ERROR_OK, UpgradeKey(client_params())); 4143 4144 // Key should work again 4145 ciphertext = EncryptMessage(message, KM_MODE_ECB, KM_PAD_NONE); 4146 EXPECT_EQ(message, DecryptMessage(ciphertext, KM_MODE_ECB, KM_PAD_NONE)); 4147 4148 // Decrease patch level. Key usage should fail with KM_ERROR_INVALID_KEY_BLOB. 4149 GetParam()->keymaster_context()->SetSystemVersion(1, 1); 4150 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 4151 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, GetCharacteristics()); 4152 4153 // Upgrade should fail 4154 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, UpgradeKey(client_params())); 4155 4156 EXPECT_EQ(0, GetParam()->keymaster0_calls()); 4157 } 4158 4159 TEST_P(KeyUpgradeTest, RsaVersionUpgrade) { 4160 GetParam()->keymaster_context()->SetSystemVersion(1, 1); 4161 4162 ASSERT_EQ(KM_ERROR_OK, 4163 GenerateKey(AuthorizationSetBuilder().RsaEncryptionKey(256, 3).Padding(KM_PAD_NONE))); 4164 4165 // Key should operate fine. 4166 string message = "12345678901234567890123456789012"; 4167 string ciphertext = EncryptMessage(message, KM_PAD_NONE); 4168 EXPECT_EQ(message, DecryptMessage(ciphertext, KM_PAD_NONE)); 4169 4170 // Increase patch level. Key usage should fail with KM_ERROR_KEY_REQUIRES_UPGRADE. 4171 GetParam()->keymaster_context()->SetSystemVersion(1, 2); 4172 AuthorizationSet begin_params(client_params()); 4173 begin_params.push_back(TAG_PADDING, KM_PAD_NONE); 4174 if (GetParam()->is_keymaster1_hw()) { 4175 // Keymaster1 hardware can't support version binding. The key will work regardless 4176 // of system version. Just abort the remainder of the test. 4177 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 4178 EXPECT_EQ(KM_ERROR_OK, AbortOperation()); 4179 return; 4180 } 4181 EXPECT_EQ(KM_ERROR_KEY_REQUIRES_UPGRADE, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 4182 4183 // Getting characteristics should also fail 4184 EXPECT_EQ(KM_ERROR_KEY_REQUIRES_UPGRADE, GetCharacteristics()); 4185 4186 // Upgrade key. 4187 EXPECT_EQ(KM_ERROR_OK, UpgradeKey(client_params())); 4188 4189 // Key should work again 4190 ciphertext = EncryptMessage(message, KM_PAD_NONE); 4191 EXPECT_EQ(message, DecryptMessage(ciphertext, KM_PAD_NONE)); 4192 4193 // Decrease patch level. Key usage should fail with KM_ERROR_INVALID_KEY_BLOB. 4194 GetParam()->keymaster_context()->SetSystemVersion(1, 1); 4195 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 4196 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, GetCharacteristics()); 4197 4198 // Upgrade should fail 4199 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, UpgradeKey(client_params())); 4200 4201 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_RSA)) 4202 EXPECT_EQ(7, GetParam()->keymaster0_calls()); 4203 } 4204 4205 TEST_P(KeyUpgradeTest, EcVersionUpgrade) { 4206 GetParam()->keymaster_context()->SetSystemVersion(1, 1); 4207 4208 ASSERT_EQ(KM_ERROR_OK, GenerateKey(AuthorizationSetBuilder().EcdsaSigningKey(256).Digest( 4209 KM_DIGEST_SHA_2_256))); 4210 4211 // Key should operate fine. 4212 string message = "1234567890123456"; 4213 string signature; 4214 SignMessage(message, &signature, KM_DIGEST_SHA_2_256); 4215 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256); 4216 4217 // Increase patch level. Key usage should fail with KM_ERROR_KEY_REQUIRES_UPGRADE. 4218 GetParam()->keymaster_context()->SetSystemVersion(1, 2); 4219 AuthorizationSet begin_params(client_params()); 4220 begin_params.push_back(TAG_DIGEST, KM_DIGEST_SHA_2_256); 4221 if (GetParam()->is_keymaster1_hw()) { 4222 // Keymaster1 hardware can't support version binding. The key will work regardless 4223 // of system version. Just abort the remainder of the test. 4224 EXPECT_EQ(KM_ERROR_OK, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 4225 EXPECT_EQ(KM_ERROR_OK, AbortOperation()); 4226 return; 4227 } 4228 EXPECT_EQ(KM_ERROR_KEY_REQUIRES_UPGRADE, BeginOperation(KM_PURPOSE_SIGN, begin_params)); 4229 4230 // Getting characteristics should also fail 4231 EXPECT_EQ(KM_ERROR_KEY_REQUIRES_UPGRADE, GetCharacteristics()); 4232 4233 // Upgrade key. 4234 EXPECT_EQ(KM_ERROR_OK, UpgradeKey(client_params())); 4235 4236 // Key should work again 4237 SignMessage(message, &signature, KM_DIGEST_SHA_2_256); 4238 VerifyMessage(message, signature, KM_DIGEST_SHA_2_256); 4239 4240 // Decrease patch level. Key usage should fail with KM_ERROR_INVALID_KEY_BLOB. 4241 GetParam()->keymaster_context()->SetSystemVersion(1, 1); 4242 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, BeginOperation(KM_PURPOSE_ENCRYPT, begin_params)); 4243 EXPECT_EQ(KM_ERROR_INVALID_KEY_BLOB, GetCharacteristics()); 4244 4245 // Upgrade should fail 4246 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, UpgradeKey(client_params())); 4247 4248 if (GetParam()->algorithm_in_km0_hardware(KM_ALGORITHM_EC)) 4249 EXPECT_EQ(7, GetParam()->keymaster0_calls()); 4250 } 4251 4252 TEST(SoftKeymasterWrapperTest, CheckKeymaster2Device) { 4253 // Make a good fake device, and wrap it. 4254 SoftKeymasterDevice* good_fake(new SoftKeymasterDevice(new TestKeymasterContext)); 4255 4256 // Wrap it and check it. 4257 SoftKeymasterDevice* good_fake_wrapper(new SoftKeymasterDevice(new TestKeymasterContext)); 4258 good_fake_wrapper->SetHardwareDevice(good_fake->keymaster_device()); 4259 EXPECT_TRUE(good_fake_wrapper->Keymaster1DeviceIsGood()); 4260 4261 // Close and clean up wrapper and wrapped 4262 good_fake_wrapper->keymaster_device()->common.close(good_fake_wrapper->hw_device()); 4263 4264 // Make a "bad" (doesn't support all digests) device; 4265 keymaster1_device_t* sha256_only_fake = make_device_sha256_only( 4266 (new SoftKeymasterDevice(new TestKeymasterContext("256")))->keymaster_device()); 4267 4268 // Wrap it and check it. 4269 SoftKeymasterDevice* sha256_only_fake_wrapper( 4270 (new SoftKeymasterDevice(new TestKeymasterContext))); 4271 sha256_only_fake_wrapper->SetHardwareDevice(sha256_only_fake); 4272 EXPECT_FALSE(sha256_only_fake_wrapper->Keymaster1DeviceIsGood()); 4273 4274 // Close and clean up wrapper and wrapped 4275 sha256_only_fake_wrapper->keymaster_device()->common.close( 4276 sha256_only_fake_wrapper->hw_device()); 4277 } 4278 4279 class HmacKeySharingTest : public ::testing::Test { 4280 protected: 4281 using KeymasterVec = std::vector<std::unique_ptr<AndroidKeymaster>>; 4282 using ParamsVec = std::vector<HmacSharingParameters>; 4283 using ByteString = std::basic_string<uint8_t>; 4284 using NonceVec = std::vector<ByteString>; 4285 using ResponseVec = std::vector<ComputeSharedHmacResponse>; 4286 4287 KeymasterVec CreateKeymasters(size_t count) { 4288 KeymasterVec keymasters; 4289 for (size_t i = 0; i < count; ++i) { 4290 keymasters.push_back(make_unique<AndroidKeymaster>(new TestKeymasterContext, 16)); 4291 } 4292 return keymasters; 4293 } 4294 4295 ParamsVec GetHmacSharingParameters(const KeymasterVec& keymasters) { 4296 ParamsVec paramsVec; 4297 for (auto& keymaster : keymasters) { 4298 auto result = keymaster->GetHmacSharingParameters(); 4299 EXPECT_EQ(KM_ERROR_OK, result.error); 4300 if (result.error == KM_ERROR_OK) paramsVec.push_back(move(result.params)); 4301 } 4302 return paramsVec; 4303 } 4304 4305 template <size_t N> ByteString ToByteString(const uint8_t (&a)[N]) { return ByteString(a, N); } 4306 4307 ByteString ToByteString(const keymaster_blob_t& b) { return ByteString(b.data, b.data_length); } 4308 4309 NonceVec CopyNonces(const ParamsVec& paramsVec) { 4310 NonceVec nonces; 4311 for (auto& param : paramsVec) { 4312 nonces.push_back(ToByteString(param.nonce)); 4313 } 4314 return nonces; 4315 } 4316 4317 ResponseVec ComputeSharedHmac(const KeymasterVec& keymasters, const ParamsVec& paramsVec) { 4318 ComputeSharedHmacRequest req; 4319 req.params_array.params_array = const_cast<HmacSharingParameters*>(paramsVec.data()); 4320 auto prevent_deletion_of_paramsVec_data = 4321 finally([&]() { req.params_array.params_array = nullptr; }); 4322 req.params_array.num_params = paramsVec.size(); 4323 4324 ResponseVec responses; 4325 for (auto& keymaster : keymasters) { 4326 responses.push_back(keymaster->ComputeSharedHmac(req)); 4327 } 4328 4329 return responses; 4330 } 4331 4332 bool VerifyResponses(const ByteString& expected, const ResponseVec& responses) { 4333 for (auto& response : responses) { 4334 EXPECT_EQ(KM_ERROR_OK, response.error); 4335 auto this_sharing_check = ToByteString(response.sharing_check); 4336 EXPECT_EQ(expected, this_sharing_check) << "Sharing check values should match."; 4337 if (response.error != KM_ERROR_OK || expected != this_sharing_check) { 4338 return false; 4339 } 4340 } 4341 return true; 4342 } 4343 }; 4344 4345 TEST_F(HmacKeySharingTest, GetParametersIdempotency) { 4346 AndroidKeymaster keymaster(new TestKeymasterContext, 16); 4347 4348 ParamsVec paramsVec; 4349 4350 auto result1 = keymaster.GetHmacSharingParameters(); 4351 EXPECT_EQ(KM_ERROR_OK, result1.error); 4352 paramsVec.push_back(std::move(result1.params)); 4353 4354 auto result2 = keymaster.GetHmacSharingParameters(); 4355 EXPECT_EQ(KM_ERROR_OK, result2.error); 4356 paramsVec.push_back(std::move(result2.params)); 4357 4358 ASSERT_EQ(ToByteString(paramsVec[0].seed), ToByteString(paramsVec[1].seed)) 4359 << "A given keymaster should always return the same seed."; 4360 EXPECT_EQ(ToByteString(paramsVec[0].nonce), ToByteString(paramsVec[1].nonce)) 4361 << "A given keymaster should always return the same nonce until restart."; 4362 } 4363 4364 TEST_F(HmacKeySharingTest, ComputeSharedHmac) { 4365 // ComputeSharedHmac should work with any number of participants; we just test 1 through 4. 4366 for (size_t keymaster_count = 1; keymaster_count <= 4; ++keymaster_count) { 4367 SCOPED_TRACE(testing::Message() << keymaster_count << " keymaster instances"); 4368 4369 auto keymasters = CreateKeymasters(keymaster_count); 4370 auto params = GetHmacSharingParameters(keymasters); 4371 ASSERT_EQ(keymaster_count, params.size()) 4372 << "One or more keymasters failed to provide parameters."; 4373 4374 auto nonces = CopyNonces(params); 4375 EXPECT_EQ(keymaster_count, nonces.size()) << "We should have a nonce per keymaster."; 4376 std::sort(nonces.begin(), nonces.end()); 4377 std::unique(nonces.begin(), nonces.end()); 4378 EXPECT_EQ(keymaster_count, nonces.size()) << "Nonces should all be unique."; 4379 4380 auto responses = ComputeSharedHmac(keymasters, params); 4381 ASSERT_EQ(keymaster_count, responses.size()); 4382 4383 ASSERT_TRUE(VerifyResponses(ToByteString(responses[0].sharing_check), responses)); 4384 } 4385 } 4386 4387 TEST_F(HmacKeySharingTest, ComputeSharedHmacTwice) { 4388 for (size_t keymaster_count = 1; keymaster_count <= 4; ++keymaster_count) { 4389 SCOPED_TRACE(testing::Message() << keymaster_count << " keymaster instances"); 4390 4391 auto keymasters = CreateKeymasters(keymaster_count); 4392 auto params = GetHmacSharingParameters(keymasters); 4393 ASSERT_EQ(keymaster_count, params.size()) 4394 << "One or more keymasters failed to provide parameters."; 4395 4396 auto responses = ComputeSharedHmac(keymasters, params); 4397 ASSERT_EQ(keymaster_count, responses.size()); 4398 4399 ByteString sharing_check_value = ToByteString(responses[0].sharing_check); 4400 ASSERT_TRUE(VerifyResponses(sharing_check_value, responses)); 4401 4402 params = GetHmacSharingParameters(keymasters); 4403 ASSERT_EQ(keymaster_count, params.size()) 4404 << "One or more keymasters failed to provide parameters."; 4405 responses = ComputeSharedHmac(keymasters, params); 4406 4407 // Verify against first check value; we should get the same one every time, because each 4408 // keymaster instance returns the same seed every time, and the same nonce until restart. 4409 ASSERT_TRUE(VerifyResponses(sharing_check_value, responses)); 4410 } 4411 } 4412 4413 TEST_F(HmacKeySharingTest, ComputeSharedHmacCorruptNonce) { 4414 constexpr size_t keymaster_count = 4; 4415 auto keymasters = CreateKeymasters(keymaster_count); 4416 4417 auto params = GetHmacSharingParameters(keymasters); 4418 ASSERT_EQ(keymaster_count, params.size()) 4419 << "One or more keymasters failed to provide parameters."; 4420 4421 // All should be well in the normal case 4422 auto responses = ComputeSharedHmac(keymasters, params); 4423 ASSERT_EQ(keymaster_count, responses.size()); 4424 ByteString sharing_check_value = ToByteString(responses[0].sharing_check); 4425 ASSERT_TRUE(VerifyResponses(sharing_check_value, responses)); 4426 4427 // Pick a random param, a random byte within the param's nonce, and a random bit within 4428 // the byte. Flip that bit. 4429 size_t param_to_tweak = rand() % params.size(); 4430 uint8_t byte_to_tweak = rand() % sizeof(params[param_to_tweak].nonce); 4431 uint8_t bit_to_tweak = rand() % 8; 4432 params[param_to_tweak].nonce[byte_to_tweak] ^= (1 << bit_to_tweak); 4433 4434 responses = ComputeSharedHmac(keymasters, params); 4435 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, responses[param_to_tweak].error) 4436 << "Keymaster that provided tweaked response should fail to compute HMAC key"; 4437 for (size_t i = 0; i < responses.size(); ++i) { 4438 if (i != param_to_tweak) { 4439 EXPECT_EQ(KM_ERROR_OK, responses[i].error) << "Others should succeed"; 4440 EXPECT_NE(sharing_check_value, ToByteString(responses[i].sharing_check)) 4441 << "Others should calculate a different HMAC key, due to the tweaked nonce."; 4442 } 4443 } 4444 } 4445 4446 TEST_F(HmacKeySharingTest, ComputeSharedHmacCorruptSeed) { 4447 constexpr size_t keymaster_count = 4; 4448 auto keymasters = CreateKeymasters(keymaster_count); 4449 4450 auto params = GetHmacSharingParameters(keymasters); 4451 ASSERT_EQ(keymaster_count, params.size()) 4452 << "One or more keymasters failed to provide parameters."; 4453 4454 // All should be well in the normal case 4455 auto responses = ComputeSharedHmac(keymasters, params); 4456 ASSERT_EQ(keymaster_count, responses.size()); 4457 ByteString sharing_check_value = ToByteString(responses[0].sharing_check); 4458 ASSERT_TRUE(VerifyResponses(sharing_check_value, responses)); 4459 4460 // Pick a random param and modify the seed. 4461 auto param_to_tweak = rand() & params.size(); 4462 constexpr uint8_t wrong_seed_value[] = {0xF, 0x0, 0x0}; 4463 params[param_to_tweak].SetSeed({wrong_seed_value, sizeof(wrong_seed_value)}); 4464 auto prevent_deletion_of_wrong_seed = 4465 finally([&]() { params[param_to_tweak].seed.data = nullptr; }); 4466 4467 responses = ComputeSharedHmac(keymasters, params); 4468 EXPECT_EQ(KM_ERROR_INVALID_ARGUMENT, responses[param_to_tweak].error) 4469 << "Keymaster that provided tweaked response should fail to compute HMAC key"; 4470 for (size_t i = 0; i < responses.size(); ++i) { 4471 if (i != param_to_tweak) { 4472 EXPECT_EQ(KM_ERROR_OK, responses[i].error) << "Others should succeed"; 4473 EXPECT_NE(sharing_check_value, ToByteString(responses[i].sharing_check)) 4474 << "Others should calculate a different HMAC key, due to the tweaked seed."; 4475 } 4476 } 4477 } 4478 4479 } // namespace test 4480 } // namespace keymaster 4481