From f6229788b0166316ac28718a05c31ccfb5e694f4 Mon Sep 17 00:00:00 2001 From: Fred Gylys-Colwell Date: Sun, 17 May 2020 11:57:06 -0700 Subject: [PATCH 1/3] Start playback timer in integration tests Merge from Widevine repo of http://go/wvgerrit/100328 Several integration tests in WvCdmRequestLicenseRollbackTest had been testing the duration of a license. However, the license they request sets the playback duration and not the rental duration. That means the timer we are checking does not start until the first playback. To fix the tests, we simply add a decrypt operation right after the license is received. Test: integration tests w/v16 mod mock. Bug: 156854660 Change-Id: Ie4f017c82db8aaf084ad050de3fcb7f51987c97e --- libwvdrmengine/cdm/test/request_license_test.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index c272d474..a9809ce2 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -6233,6 +6233,9 @@ TEST_F(WvCdmRequestLicenseRollbackTest, Streaming_ExpireBeforeRollback) { GenerateKeyRequest(init_data_with_expiry_, kLicenseTypeStreaming); VerifyKeyRequestResponse(config_.license_server(), config_.client_auth()); + // Start playback timer. + EXPECT_EQ(NO_ERROR, Decrypt(session_id_)); + // Elapse time so that the key should now be considered expired. std::this_thread::sleep_for( std::chrono::milliseconds(kExpirationWithWindowMs_)); @@ -6319,6 +6322,9 @@ TEST_F(WvCdmRequestLicenseRollbackTest, nullptr, &session_id_); EXPECT_EQ(wvcdm::KEY_ADDED, decryptor_->RestoreKey(session_id_, key_set_id)); + // Start playback timer. + EXPECT_EQ(NO_ERROR, Decrypt(session_id_)); + RollbackSystemTime(kExpirationWithWindowMs_); // Elapse time so that the key should now be considered expired. @@ -6357,6 +6363,9 @@ TEST_F(WvCdmRequestLicenseRollbackTest, nullptr, &session_id_); EXPECT_EQ(wvcdm::KEY_ADDED, decryptor_->RestoreKey(session_id_, key_set_id)); + // Start playback timer. + EXPECT_EQ(NO_ERROR, Decrypt(session_id_)); + // Elapse time so that the key should now be considered expired. std::this_thread::sleep_for( std::chrono::milliseconds(kExpirationWithWindowMs_)); From e9dfca12190dbf72e3fd1c81f01fdeb593635e1c Mon Sep 17 00:00:00 2001 From: Fred Gylys-Colwell Date: Tue, 19 May 2020 10:58:05 -0700 Subject: [PATCH 2/3] The Entitlement key map was not being cleaned up. Merge from Widevine repo of http://go/wvgerrit/100385 The map now contains unique_ptr instead of raw pointers to ensure the memory is released. Bug: 156780432 OEMCrypto Fuzzing: Fix OEMCrypto Memory Leak. Test: oemcrypto reference code only Change-Id: I78054f9207399f052d6e4bfdfa96824f6e050bac --- .../ref/src/oemcrypto_session_key_table.cpp | 19 +++++-------------- .../ref/src/oemcrypto_session_key_table.h | 11 ++++++----- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session_key_table.cpp b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session_key_table.cpp index e7131975..00c16ed8 100644 --- a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session_key_table.cpp +++ b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session_key_table.cpp @@ -11,17 +11,9 @@ namespace wvoec_ref { -SessionKeyTable::~SessionKeyTable() { - for (KeyMap::iterator i = keys_.begin(); i != keys_.end(); ++i) { - if (nullptr != i->second) { - delete i->second; - } - } -} - bool SessionKeyTable::Insert(const KeyId key_id, const Key& key_data) { if (keys_.find(key_id) != keys_.end()) return false; - keys_[key_id] = new Key(key_data); + keys_[key_id] = std::unique_ptr(new Key(key_data)); return true; } @@ -29,12 +21,11 @@ Key* SessionKeyTable::Find(const KeyId key_id) { if (keys_.find(key_id) == keys_.end()) { return nullptr; } - return keys_[key_id]; + return keys_[key_id].get(); } void SessionKeyTable::Remove(const KeyId key_id) { if (keys_.find(key_id) != keys_.end()) { - delete keys_[key_id]; keys_.erase(key_id); } } @@ -49,7 +40,7 @@ bool EntitlementKeyTable::Insert(const KeyId key_id, const Key& key_data) { // |key_id| and |key_data| are for an entitlement key. Insert a new // entitlement key entry. if (keys_.find(key_id) != keys_.end()) return false; - keys_[key_id] = new EntitlementKey(key_data); + keys_[key_id] = std::unique_ptr(new EntitlementKey(key_data)); // If this is a new insertion, we don't have a content key assigned yet. return true; } @@ -65,7 +56,7 @@ Key* EntitlementKeyTable::Find(const KeyId key_id) { if (keys_.find(it->second) == keys_.end()) { return nullptr; } - return keys_[it->second]; + return keys_[it->second].get(); } void EntitlementKeyTable::Remove(const KeyId key_id) { @@ -108,7 +99,7 @@ EntitlementKey* EntitlementKeyTable::GetEntitlementKey( if (it == keys_.end()) { return nullptr; } - return it->second; + return it->second.get(); } } // namespace wvoec_ref diff --git a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session_key_table.h b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session_key_table.h index c84096be..ad74b873 100644 --- a/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session_key_table.h +++ b/libwvdrmengine/oemcrypto/ref/src/oemcrypto_session_key_table.h @@ -9,6 +9,7 @@ #include #include +#include #include #include "disallow_copy_and_assign.h" @@ -23,18 +24,18 @@ class UsageTable; class UsageTableEntry; typedef std::vector KeyId; -typedef std::map KeyMap; -typedef std::map EntitlementKeyMap; +typedef std::map> KeyMap; +typedef std::map> EntitlementKeyMap; // SessionKeyTable holds the keys for the current session class SessionKeyTable { public: SessionKeyTable() {} - ~SessionKeyTable(); + ~SessionKeyTable() {} bool Insert(const KeyId key_id, const Key& key_data); Key* Find(const KeyId key_id); - Key* FirstKey() { return keys_.begin()->second; } + Key* FirstKey() { return keys_.begin()->second.get(); } void Remove(const KeyId key_id); void UpdateDuration(const KeyControlBlock& control); size_t size() const { return keys_.size(); } @@ -53,7 +54,7 @@ class EntitlementKeyTable { ~EntitlementKeyTable() {} bool Insert(const KeyId key_id, const Key& key_data); Key* Find(const KeyId key_id); - Key* FirstKey() { return keys_.begin()->second; } + Key* FirstKey() { return keys_.begin()->second.get(); } void Remove(const KeyId key_id); void UpdateDuration(const KeyControlBlock& control); size_t size() const { return contentid_to_entitlementid_.size(); } From dd70d63b7669a917eb46117598605806a4b91e28 Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Mon, 18 May 2020 11:38:06 -0700 Subject: [PATCH 3/3] Rolled expected version number for R. [ Merge of http://go/wvgerrit/100403 ] VersionNumberTest.VersionNumberChangeCanary was expecting a version string of "R". However, Android rvc branch is now far enough into development to use a numbered version: version "11". Bug: 156853733 Test: Android license request test Change-Id: I63d33f742c849b672b2d2402ab8423fdf2450f6f --- libwvdrmengine/cdm/test/request_license_test.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index a9809ce2..f3c562af 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -5652,7 +5652,7 @@ TEST(VersionNumberTest, VersionNumberChangeCanary) { android::base::GetProperty("ro.build.version.release", ""); ASSERT_TRUE(release_number.size() > 0); // Reminder to change the Widevine CDM version number. - EXPECT_STREQ("R", release_number.c_str()) + EXPECT_STREQ("11", release_number.c_str()) << "The Android version number has changed. You need to update this test " "and also possibly update the Widevine version number in " "wv_android_constants.h";