diff --git a/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp b/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp index 7ecd1712..db0f36e7 100644 --- a/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp +++ b/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp @@ -265,7 +265,7 @@ TEST_F(OEMCryptoClientTest, FreeUnallocatedSecureBufferNoFailure) { */ TEST_F(OEMCryptoClientTest, VersionNumber) { const std::string log_message = - "OEMCrypto unit tests for API 17.0. Tests last updated 2021-12-03"; + "OEMCrypto unit tests for API 17.0. Tests last updated 2022-02-18"; cout << " " << log_message << "\n"; cout << " " << "These tests are part of Android T." @@ -1569,59 +1569,6 @@ class OEMCryptoSessionTests : public OEMCryptoClientTest { license_messages.EncryptAndSignResponse(); return license_messages.LoadResponse(); } - - void TestLoadLicenseForHugeBufferLengths( - const std::function f, bool check_status, - bool update_core_message_substring_values) { - auto oemcrypto_function = [&](size_t message_length) { - Session s; - LicenseRoundTrip license_messages(&s); - s.open(); - InstallTestRSAKey(&s); - bool verify_keys_loaded = true; - license_messages.SignAndVerifyRequest(); - license_messages.CreateDefaultResponse(); - if (update_core_message_substring_values) { - // Make the license message big enough so that updated core message - // substring offset and length values from tests are still able to read - // data from license_message buffer rather than reading some garbage - // data. - license_messages.set_message_size( - sizeof(license_messages.response_data()) + message_length); - } - f(message_length, &license_messages); - if (update_core_message_substring_values) { - // We will be updating offset for these tests, which will cause verify - // keys to fail with an assertion. Hence skipping verification. - verify_keys_loaded = false; - } - license_messages.EncryptAndSignResponse(); - OEMCryptoResult result = - license_messages.LoadResponse(&s, verify_keys_loaded); - s.close(); - return result; - }; - TestHugeLengthDoesNotCrashAPI(oemcrypto_function, check_status); - } - - void TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( - const std::function f) { - Session s; - LicenseRoundTrip license_messages(&s); - s.open(); - InstallTestRSAKey(&s); - license_messages.SignAndVerifyRequest(); - license_messages.CreateDefaultResponse(); - size_t message_length = sizeof(license_messages.response_data()); - f(message_length, &license_messages); - license_messages.EncryptAndSignResponse(); - OEMCryptoResult result = license_messages.LoadResponse(); - s.close(); - // Verifying error is not due to signature failure which can be caused due - // to test code. - ASSERT_NE(OEMCrypto_ERROR_SIGNATURE_FAILURE, result); - ASSERT_NE(OEMCrypto_SUCCESS, result); - } }; TEST_F(OEMCryptoSessionTests, @@ -1695,6 +1642,77 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus); } +class OEMCryptoLicenseOverflowTest : public OEMCryptoSessionTests, + public WithParamInterface { + public: + OEMCryptoLicenseOverflowTest() : license_api_version_(kCurrentAPI) {} + + void SetUp() override { + OEMCryptoSessionTests::SetUp(); + license_api_version_ = GetParam(); + } + + void TearDown() override { OEMCryptoSessionTests::TearDown(); } + + void TestLoadLicenseForHugeBufferLengths( + const std::function f, bool check_status, + bool update_core_message_substring_values) { + auto oemcrypto_function = [&](size_t message_length) { + Session s; + LicenseRoundTrip license_messages(&s); + license_messages.set_api_version(license_api_version_); + s.open(); + InstallTestRSAKey(&s); + bool verify_keys_loaded = true; + license_messages.SignAndVerifyRequest(); + license_messages.CreateDefaultResponse(); + if (update_core_message_substring_values) { + // Make the license message big enough so that updated core message + // substring offset and length values from tests are still able to read + // data from license_message buffer rather than reading some garbage + // data. + license_messages.set_message_size( + sizeof(license_messages.response_data()) + message_length); + } + f(message_length, &license_messages); + if (update_core_message_substring_values) { + // We will be updating offset for these tests, which will cause verify + // keys to fail with an assertion. Hence skipping verification. + verify_keys_loaded = false; + } + license_messages.EncryptAndSignResponse(); + OEMCryptoResult result = + license_messages.LoadResponse(&s, verify_keys_loaded); + s.close(); + return result; + }; + TestHugeLengthDoesNotCrashAPI(oemcrypto_function, check_status); + } + + void TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( + const std::function f) { + Session s; + LicenseRoundTrip license_messages(&s); + license_messages.set_api_version(license_api_version_); + s.open(); + InstallTestRSAKey(&s); + license_messages.SignAndVerifyRequest(); + license_messages.CreateDefaultResponse(); + size_t message_length = sizeof(license_messages.response_data()); + OEMCryptoResult result = license_messages.LoadResponse(); + f(message_length, &license_messages); + license_messages.EncryptAndSignResponse(); + s.close(); + // Verifying error is not due to signature failure which can be caused due + // to test code. + ASSERT_NE(OEMCrypto_ERROR_SIGNATURE_FAILURE, result); + ASSERT_NE(OEMCrypto_SUCCESS, result); + } + + protected: + uint32_t license_api_version_; +}; + // This class is for testing a single license with the default API version // of 16. Used for buffer overflow tests. class OEMCryptoMemoryLicenseTest : public OEMCryptoLicenseTestAPI16 { @@ -3424,7 +3442,7 @@ TEST_F(OEMCryptoSessionTests, TestHugeLengthDoesNotCrashAPI(oemcrypto_function, !kCheckStatus); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringKeyIdLength) { TestLoadLicenseForHugeBufferLengths( [](size_t length, LicenseRoundTrip* license_messages) { @@ -3434,7 +3452,7 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringKeyIdOffset) { TestLoadLicenseForHugeBufferLengths( [](size_t offset, LicenseRoundTrip* license_messages) { @@ -3443,7 +3461,7 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringKeyIdLength) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3452,7 +3470,7 @@ TEST_F(OEMCryptoSessionTests, }); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringKeyIdOffset) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3461,7 +3479,7 @@ TEST_F(OEMCryptoSessionTests, }); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringKeyDataIvLength) { TestLoadLicenseForHugeBufferLengths( [](size_t length, LicenseRoundTrip* license_messages) { @@ -3471,7 +3489,7 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringKeyDataIvOffset) { TestLoadLicenseForHugeBufferLengths( [](size_t offset, LicenseRoundTrip* license_messages) { @@ -3481,8 +3499,8 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringKeyDataIvLength) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3492,8 +3510,8 @@ TEST_F( }); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringKeyDataIvOffset) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3503,7 +3521,7 @@ TEST_F( }); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringKeyDataLength) { TestLoadLicenseForHugeBufferLengths( [](size_t length, LicenseRoundTrip* license_messages) { @@ -3513,7 +3531,7 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringKeyDataOffset) { TestLoadLicenseForHugeBufferLengths( [](size_t offset, LicenseRoundTrip* license_messages) { @@ -3522,8 +3540,8 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringKeyDataLength) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3533,8 +3551,8 @@ TEST_F( }); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringKeyDataOffset) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3544,8 +3562,8 @@ TEST_F( }); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringKeyControlIvLength) { TestLoadLicenseForHugeBufferLengths( [](size_t length, LicenseRoundTrip* license_messages) { @@ -3555,8 +3573,8 @@ TEST_F( !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringKeyControlIvOffset) { TestLoadLicenseForHugeBufferLengths( [](size_t offset, LicenseRoundTrip* license_messages) { @@ -3566,8 +3584,8 @@ TEST_F( !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringKeyControlIvLength) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3578,8 +3596,8 @@ TEST_F( }); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringKeyControlIvOffset) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3590,7 +3608,7 @@ TEST_F( }); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringKeyControlLength) { TestLoadLicenseForHugeBufferLengths( [](size_t length, LicenseRoundTrip* license_messages) { @@ -3600,7 +3618,7 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringKeyControlOffset) { TestLoadLicenseForHugeBufferLengths( [](size_t offset, LicenseRoundTrip* license_messages) { @@ -3610,8 +3628,8 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringKeyControlLength) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3621,8 +3639,8 @@ TEST_F( }); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringKeyControlOffset) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3632,7 +3650,7 @@ TEST_F( }); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringEncMacKeyIvLength) { TestLoadLicenseForHugeBufferLengths( [](size_t length, LicenseRoundTrip* license_messages) { @@ -3641,7 +3659,7 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringEncMacKeyIvOffset) { TestLoadLicenseForHugeBufferLengths( [](size_t offset, LicenseRoundTrip* license_messages) { @@ -3650,8 +3668,8 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringEncMacKeyIvLength) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3662,8 +3680,8 @@ TEST_F( }); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringEncMacKeyIvOffset) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3674,7 +3692,7 @@ TEST_F( }); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringEncMacKeyLength) { TestLoadLicenseForHugeBufferLengths( [](size_t length, LicenseRoundTrip* license_messages) { @@ -3683,7 +3701,7 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringEncMacKeyOffset) { TestLoadLicenseForHugeBufferLengths( [](size_t offset, LicenseRoundTrip* license_messages) { @@ -3692,8 +3710,8 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringEncMacKeyLength) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3702,8 +3720,8 @@ TEST_F( }); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringEncMacKeyOffset) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3712,7 +3730,7 @@ TEST_F( }); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringPstLength) { TestLoadLicenseForHugeBufferLengths( [](size_t length, LicenseRoundTrip* license_messages) { @@ -3721,7 +3739,7 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringPstOffset) { TestLoadLicenseForHugeBufferLengths( [](size_t offset, LicenseRoundTrip* license_messages) { @@ -3730,7 +3748,7 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringPstLength) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3739,7 +3757,7 @@ TEST_F(OEMCryptoSessionTests, }); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringPstOffset) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3748,8 +3766,8 @@ TEST_F(OEMCryptoSessionTests, }); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringSrmRestrictionDataLength) { TestLoadLicenseForHugeBufferLengths( [](size_t length, LicenseRoundTrip* license_messages) { @@ -3758,8 +3776,8 @@ TEST_F( !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageSubstringSrmRestrictionDataOffset) { TestLoadLicenseForHugeBufferLengths( [](size_t offset, LicenseRoundTrip* license_messages) { @@ -3768,8 +3786,8 @@ TEST_F( !kCheckStatus, kUpdateCoreMessageSubstringValues); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringSrmRestrictionDataLength) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3780,8 +3798,8 @@ TEST_F( }); } -TEST_F( - OEMCryptoSessionTests, +TEST_P( + OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForOutOfRangeCoreMessageSubstringSrmRestrictionDataOffset) { TestLoadLicenseForOutOfRangeSubStringOffSetAndLengths( [](size_t response_message_length, LicenseRoundTrip* license_messages) { @@ -3792,7 +3810,8 @@ TEST_F( }); } -TEST_F(OEMCryptoSessionTests, OEMCryptoMemoryLoadLicenseForHugeResponseLength) { +TEST_P(OEMCryptoLicenseOverflowTest, + OEMCryptoMemoryLoadLicenseForHugeResponseLength) { TestLoadLicenseForHugeBufferLengths( [](size_t message_size, LicenseRoundTrip* license_messages) { license_messages->set_message_size(message_size); @@ -3800,7 +3819,7 @@ TEST_F(OEMCryptoSessionTests, OEMCryptoMemoryLoadLicenseForHugeResponseLength) { !kCheckStatus, !kUpdateCoreMessageSubstringValues); } -TEST_F(OEMCryptoSessionTests, +TEST_P(OEMCryptoLicenseOverflowTest, OEMCryptoMemoryLoadLicenseForHugeCoreMessageLength) { TestLoadLicenseForHugeBufferLengths( [](size_t message_size, LicenseRoundTrip* license_messages) { @@ -3809,6 +3828,9 @@ TEST_F(OEMCryptoSessionTests, !kCheckStatus, !kUpdateCoreMessageSubstringValues); } +INSTANTIATE_TEST_SUITE_P(TestAll, OEMCryptoLicenseOverflowTest, + Range(kCurrentAPI - 1, kCurrentAPI + 1)); + TEST_F(OEMCryptoSessionTests, OEMCryptoMemoryLoadRenewalForHugeResponseLength) { auto oemcrypto_function = [&](size_t message_size) { Session s;