From 2c05c651386b4d7ffed6e345945d3a88e5e9808e Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Tue, 7 Feb 2023 22:32:24 -0800 Subject: [PATCH] Delete secure stops by key set ID. [ Merge of http://go/wvgerrit/165617 ] Similar to the issue with updating secure stops by PST (see http://go/wvgerrit/165597), when deleting different secure stops with the same PST results in unintended behavior. This CL changes how the CDM identifies which secure stop to delete from storaged based on the key set ID rather than the PST. Bug: 263316107 Test: device_files_unittest Test: GTS MediaDrmParameterizedTests and MediaDrmStressTest Change-Id: Ic3843a1435f252f052c7189423c211c28ed74eaa --- .../cdm/core/include/device_files.h | 2 +- libwvdrmengine/cdm/core/src/cdm_engine.cpp | 20 ++++++------------- libwvdrmengine/cdm/core/src/cdm_session.cpp | 3 +-- .../cdm/core/src/cdm_usage_table.cpp | 2 +- libwvdrmengine/cdm/core/src/device_files.cpp | 10 ++++++---- .../core/test/cdm_usage_table_unittest.cpp | 2 +- 6 files changed, 16 insertions(+), 23 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/device_files.h b/libwvdrmengine/cdm/core/include/device_files.h index 89539977..6f4ddd62 100644 --- a/libwvdrmengine/cdm/core/include/device_files.h +++ b/libwvdrmengine/cdm/core/include/device_files.h @@ -199,7 +199,7 @@ class DeviceFiles { std::string* provider_session_token); virtual bool DeleteUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token); + const CdmKeySetId& key_set_id); // Deletes a set of provider sessions from the specified usage info. // Sessions removed are based on the provided |key_set_ids|. If diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index 60a8c0d9..b6723f1a 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -1685,7 +1685,7 @@ CdmResponseType CdmEngine::RemoveAllUsageInfo( } if (!handle.DeleteUsageInfo(DeviceFiles::GetUsageInfoFileName(app_id), - usage_data[0].provider_session_token)) { + usage_data[0].key_set_id)) { LOGW("Failed to delete usage info"); break; } @@ -1737,25 +1737,17 @@ CdmResponseType CdmEngine::RemoveUsageInfo( new CdmSession(file_system_, metrics_->AddSession())); usage_session_->Init(usage_property_set_.get()); - CdmKeyMessage license_request; - CdmKeyResponse license_response; - UsageEntry usage_entry; - UsageEntryIndex usage_entry_index; - std::string drm_certificate; - CryptoWrappedKey wrapped_private_key; - - if (!handle.RetrieveUsageInfo( - DeviceFiles::GetUsageInfoFileName(app_id), provider_session_token, - &license_request, &license_response, &usage_entry, - &usage_entry_index, &drm_certificate, &wrapped_private_key)) { + DeviceFiles::CdmUsageData usage_data; + if (!handle.RetrieveUsageInfo(DeviceFiles::GetUsageInfoFileName(app_id), + provider_session_token, &usage_data)) { // Try other security level continue; } if (usage_session_->SupportsUsageTable()) { - status = usage_session_->DeleteUsageEntry(usage_entry_index); + status = usage_session_->DeleteUsageEntry(usage_data.usage_entry_index); if (!handle.DeleteUsageInfo(DeviceFiles::GetUsageInfoFileName(app_id), - provider_session_token)) { + usage_data.key_set_id)) { status = CdmResponseType(REMOVE_USAGE_INFO_ERROR_1); } usage_session_.reset(); diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index 30940e7f..78de664b 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -1025,8 +1025,7 @@ bool CdmSession::DeleteLicenseFile() { std::string app_id; GetApplicationId(&app_id); return file_handle_->DeleteUsageInfo( - DeviceFiles::GetUsageInfoFileName(app_id), - license_parser_->provider_session_token()); + DeviceFiles::GetUsageInfoFileName(app_id), key_set_id_); } } diff --git a/libwvdrmengine/cdm/core/src/cdm_usage_table.cpp b/libwvdrmengine/cdm/core/src/cdm_usage_table.cpp index c31f3abd..48871593 100644 --- a/libwvdrmengine/cdm/core/src/cdm_usage_table.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_usage_table.cpp @@ -824,7 +824,7 @@ CdmResponseType CdmUsageTable::StoreEntry(UsageEntryIndex entry_index, } device_files->DeleteUsageInfo( entry_info_list_[entry_index].usage_info_file_name, - provider_session_token); + entry_info_list_[entry_index].key_set_id); if (!device_files->StoreUsageInfo( provider_session_token, key_request, key_response, entry_info_list_[entry_index].usage_info_file_name, diff --git a/libwvdrmengine/cdm/core/src/device_files.cpp b/libwvdrmengine/cdm/core/src/device_files.cpp index 5e2e5325..6a727794 100644 --- a/libwvdrmengine/cdm/core/src/device_files.cpp +++ b/libwvdrmengine/cdm/core/src/device_files.cpp @@ -1128,7 +1128,7 @@ bool DeviceFiles::GetProviderSessionToken(const std::string& app_id, } bool DeviceFiles::DeleteUsageInfo(const std::string& usage_info_file_name, - const std::string& provider_session_token) { + const CdmKeySetId& key_set_id) { RETURN_FALSE_IF_UNINITIALIZED(); video_widevine_client::sdk::File file; if (RetrieveHashedFile(usage_info_file_name, &file) != kNoError) { @@ -1140,17 +1140,19 @@ bool DeviceFiles::DeleteUsageInfo(const std::string& usage_info_file_name, int index = 0; bool found = false; for (; index < usage_info->sessions_size(); ++index) { - if (usage_info->sessions(index).token() == provider_session_token) { + const auto& session = usage_info->sessions(index); + if (session.key_set_id() == key_set_id) { found = true; break; } } if (!found) { - LOGE("Unable to find provider session token: pst = %s", - wvutil::b2a_hex(provider_session_token).c_str()); + LOGE("Unable to find usage info: key_set_id = %s", IdToString(key_set_id)); return false; } + LOGD("Deleting usage info: key_set_id = %s, pst = %s", IdToString(key_set_id), + wvutil::b2a_hex(usage_info->sessions(index).token()).c_str()); google::protobuf::RepeatedPtrField* sessions = usage_info->mutable_sessions(); diff --git a/libwvdrmengine/cdm/core/test/cdm_usage_table_unittest.cpp b/libwvdrmengine/cdm/core/test/cdm_usage_table_unittest.cpp index 15658d05..369e2493 100644 --- a/libwvdrmengine/cdm/core/test/cdm_usage_table_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/cdm_usage_table_unittest.cpp @@ -394,7 +394,7 @@ class MockDeviceFiles : public DeviceFiles { MOCK_METHOD(bool, StoreUsageTableInfo, (const UsageTableHeader&, const std::vector&), (override)); - MOCK_METHOD(bool, DeleteUsageInfo, (const std::string&, const std::string&), + MOCK_METHOD(bool, DeleteUsageInfo, (const std::string&, const CdmKeySetId&), (override)); MOCK_METHOD(bool, DeleteMultipleUsageInfoByKeySetIds, (const std::string&, const std::vector&),