Renaming of Usage Table related variables and types.
[ Merge of http://go/wvgerrit/164077 ] This CL makes major changes to the names of variables and types that are related to the usage table, header, entries, entry indexes, and other related data. The renaming followed these rules: 1) "Usage table header" will exclusively refer to the header blob that is OEMCrypto specific. The CDM class "UsageTableHeader" is the CDM-layer's abstraction around the "usage table" concept. The name has been updated to reflect that. 2) The "Cdm" prefix is only used for the CDM-specific data types for the usage table and entry info. It has been removed from OEMCrypto-specific types. - UsageTableHeader -> CdmUsageTable - CdmUsageTableHeader -> UsageTableHeader - CdmUsageEntry -> UsageEntry 3) The "usage_" prefix has been removed from variables when the usage table or usage entries are the subject of the function or class. 4) UsageEntryIndex is the type for entry indexes, instead of directly using uint32_t. This matches how we wrap other types in "wv_cdm_types.h" 5) Changed entry "number" to entry "index". 6) Vectors of elements have been renamed to be either pluralized or have a suffix "_list". 7) "Usage info" was occasionally being used to refer to the usage table or entries generally, rather than specifically secure-stop. - CryptoSession::HasUsageInfoSupport() -> HasUsageTableSupport() The most major change is that the files "usage_table_header*" have been renamed to be "cdm_usage_table*". Bug: 242914226 Test: run_x86_64_tests and request_license_test Change-Id: Iee98446b71f4f2934d3c9e0fb949eb05b84d1f8c
This commit is contained in:
@@ -607,11 +607,11 @@ CdmResponseType CdmEngine::QueryStatus(RequestedSecurityLevel security_level,
|
||||
}
|
||||
if (query_token == QUERY_KEY_USAGE_SUPPORT) {
|
||||
bool supports_usage_reporting;
|
||||
const bool got_info = crypto_session->HasUsageInfoSupport(
|
||||
const bool got_info = crypto_session->HasUsageTableSupport(
|
||||
security_level, &supports_usage_reporting);
|
||||
|
||||
if (!got_info) {
|
||||
LOGW("HasUsageInfoSupport failed");
|
||||
LOGW("HasUsageTableSupport failed");
|
||||
metrics_->GetCryptoMetrics()
|
||||
->crypto_session_usage_information_support_.SetError(got_info);
|
||||
return CdmResponseType(UNKNOWN_ERROR);
|
||||
@@ -1632,7 +1632,7 @@ CdmResponseType CdmEngine::RemoveAllUsageInfo(
|
||||
usage_session_.reset(new CdmSession(file_system_, metrics_->AddSession()));
|
||||
usage_session_->Init(usage_property_set_.get());
|
||||
|
||||
if (usage_session_->supports_usage_info()) {
|
||||
if (usage_session_->SupportsUsageTable()) {
|
||||
std::vector<DeviceFiles::CdmUsageData> usage_data;
|
||||
// Retrieve all usage information but delete only one before
|
||||
// refetching. This is because deleting the usage entry
|
||||
@@ -1647,7 +1647,7 @@ CdmResponseType CdmEngine::RemoveAllUsageInfo(
|
||||
if (usage_data.empty()) break;
|
||||
|
||||
CdmResponseType res =
|
||||
usage_session_->DeleteUsageEntry(usage_data[0].usage_entry_number);
|
||||
usage_session_->DeleteUsageEntry(usage_data[0].usage_entry_index);
|
||||
|
||||
if (res != NO_ERROR) {
|
||||
LOGW("Failed to delete usage entry: status = %d",
|
||||
@@ -1710,21 +1710,21 @@ CdmResponseType CdmEngine::RemoveUsageInfo(
|
||||
|
||||
CdmKeyMessage license_request;
|
||||
CdmKeyResponse license_response;
|
||||
CdmUsageEntry usage_entry;
|
||||
uint32_t usage_entry_number;
|
||||
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_number, &drm_certificate, &wrapped_private_key)) {
|
||||
&usage_entry_index, &drm_certificate, &wrapped_private_key)) {
|
||||
// Try other security level
|
||||
continue;
|
||||
}
|
||||
|
||||
if (usage_session_->supports_usage_info()) {
|
||||
status = usage_session_->DeleteUsageEntry(usage_entry_number);
|
||||
if (usage_session_->SupportsUsageTable()) {
|
||||
status = usage_session_->DeleteUsageEntry(usage_entry_index);
|
||||
if (!handle.DeleteUsageInfo(DeviceFiles::GetUsageInfoFileName(app_id),
|
||||
provider_session_token)) {
|
||||
status = CdmResponseType(REMOVE_USAGE_INFO_ERROR_1);
|
||||
@@ -1791,7 +1791,7 @@ CdmResponseType CdmEngine::LoadUsageSession(const CdmKeySetId& key_set_id,
|
||||
DeviceFiles::GetUsageInfoFileName(app_id), key_set_id,
|
||||
&(usage_data.provider_session_token), &(usage_data.license_request),
|
||||
&(usage_data.license), &(usage_data.usage_entry),
|
||||
&(usage_data.usage_entry_number), &(usage_data.drm_certificate),
|
||||
&(usage_data.usage_entry_index), &(usage_data.drm_certificate),
|
||||
&(usage_data.wrapped_private_key))) {
|
||||
LOGE("Unable to find usage information");
|
||||
return CdmResponseType(LOAD_USAGE_INFO_MISSING);
|
||||
@@ -2120,7 +2120,7 @@ void CdmEngine::OnTimerEvent() {
|
||||
for (CdmSessionList::iterator iter = sessions.begin();
|
||||
iter != sessions.end(); ++iter) {
|
||||
(*iter)->reset_usage_flags();
|
||||
if ((*iter)->supports_usage_info() &&
|
||||
if ((*iter)->SupportsUsageTable() &&
|
||||
(*iter)->has_provider_session_token()) {
|
||||
(*iter)->UpdateUsageEntryInformation();
|
||||
}
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
|
||||
#include "cdm_engine.h"
|
||||
#include "cdm_random.h"
|
||||
#include "cdm_usage_table.h"
|
||||
#include "clock.h"
|
||||
#include "crypto_wrapped_key.h"
|
||||
#include "file_store.h"
|
||||
#include "log.h"
|
||||
#include "properties.h"
|
||||
#include "string_conversions.h"
|
||||
#include "usage_table_header.h"
|
||||
#include "wv_cdm_constants.h"
|
||||
#include "wv_cdm_event_listener.h"
|
||||
|
||||
@@ -81,8 +81,6 @@ CdmSession::CdmSession(wvutil::FileSystem* file_system,
|
||||
requested_security_level_(kLevelDefault),
|
||||
is_initial_usage_update_(true),
|
||||
is_usage_update_needed_(false),
|
||||
usage_table_header_(nullptr),
|
||||
usage_entry_number_(0),
|
||||
mock_license_parser_in_use_(false),
|
||||
mock_policy_engine_in_use_(false) {
|
||||
assert(metrics_); // metrics_ must not be null.
|
||||
@@ -92,7 +90,7 @@ CdmSession::CdmSession(wvutil::FileSystem* file_system,
|
||||
}
|
||||
|
||||
CdmSession::~CdmSession() {
|
||||
if (has_provider_session_token() && supports_usage_info() && !is_release_) {
|
||||
if (has_provider_session_token() && SupportsUsageTable() && !is_release_) {
|
||||
UpdateUsageEntryInformation();
|
||||
}
|
||||
|
||||
@@ -149,8 +147,8 @@ CdmResponseType CdmSession::Init(CdmClientPropertySet* cdm_client_property_set,
|
||||
}
|
||||
|
||||
bool has_support = false;
|
||||
if (crypto_session_->HasUsageInfoSupport(&has_support) && has_support) {
|
||||
usage_table_header_ = crypto_session_->GetUsageTableHeader();
|
||||
if (crypto_session_->HasUsageTableSupport(&has_support) && has_support) {
|
||||
usage_table_ = crypto_session_->GetUsageTable();
|
||||
}
|
||||
|
||||
if (cdm_client_property_set != nullptr)
|
||||
@@ -247,7 +245,7 @@ CdmResponseType CdmSession::RestoreOfflineSession(const CdmKeySetId& key_set_id,
|
||||
offline_release_server_url_ = std::move(license_data.release_server_url);
|
||||
app_parameters_ = std::move(license_data.app_parameters);
|
||||
usage_entry_ = std::move(license_data.usage_entry);
|
||||
usage_entry_number_ = license_data.usage_entry_number;
|
||||
usage_entry_index_ = license_data.usage_entry_index;
|
||||
|
||||
CdmResponseType result = LoadPrivateOrLegacyKey(
|
||||
license_data.drm_certificate, license_data.wrapped_private_key);
|
||||
@@ -273,7 +271,7 @@ CdmResponseType CdmSession::RestoreOfflineSession(const CdmKeySetId& key_set_id,
|
||||
|
||||
std::string provider_session_token;
|
||||
bool sign_fake_request = false; // TODO(b/169483174): remove this variable.
|
||||
if (supports_usage_info()) {
|
||||
if (SupportsUsageTable()) {
|
||||
if (!license_parser_->ExtractProviderSessionToken(
|
||||
key_response_, &provider_session_token)) {
|
||||
provider_session_token.clear();
|
||||
@@ -282,8 +280,8 @@ CdmResponseType CdmSession::RestoreOfflineSession(const CdmKeySetId& key_set_id,
|
||||
LOGE("License usage entry is invalid, cannot restore");
|
||||
return CdmResponseType(LICENSE_USAGE_ENTRY_MISSING);
|
||||
} else {
|
||||
CdmResponseType sts = usage_table_header_->LoadEntry(
|
||||
crypto_session_.get(), usage_entry_, usage_entry_number_);
|
||||
CdmResponseType sts = usage_table_->LoadEntry(
|
||||
crypto_session_.get(), usage_entry_, usage_entry_index_);
|
||||
crypto_metrics_->usage_table_header_load_entry_.Increment(sts);
|
||||
if (sts == LOAD_USAGE_ENTRY_INVALID_SESSION) {
|
||||
LOGE("License loaded in different session: key_set_id = %s",
|
||||
@@ -340,9 +338,9 @@ CdmResponseType CdmSession::RestoreOfflineSession(const CdmKeySetId& key_set_id,
|
||||
}
|
||||
}
|
||||
|
||||
if (!provider_session_token.empty() && supports_usage_info()) {
|
||||
CdmResponseType sts = usage_table_header_->UpdateEntry(
|
||||
usage_entry_number_, crypto_session_.get(), &usage_entry_);
|
||||
if (!provider_session_token.empty() && SupportsUsageTable()) {
|
||||
CdmResponseType sts = usage_table_->UpdateEntry(
|
||||
usage_entry_index_, crypto_session_.get(), &usage_entry_);
|
||||
if (sts != NO_ERROR) {
|
||||
LOGE("Failed to update usage entry: status = %d", static_cast<int>(sts));
|
||||
return sts;
|
||||
@@ -372,7 +370,7 @@ CdmResponseType CdmSession::RestoreUsageSession(
|
||||
key_request_ = usage_data.license_request;
|
||||
key_response_ = usage_data.license;
|
||||
usage_entry_ = usage_data.usage_entry;
|
||||
usage_entry_number_ = usage_data.usage_entry_number;
|
||||
usage_entry_index_ = usage_data.usage_entry_index;
|
||||
usage_provider_session_token_ = usage_data.provider_session_token;
|
||||
|
||||
CdmResponseType status = LoadPrivateOrLegacyKey(
|
||||
@@ -380,9 +378,9 @@ CdmResponseType CdmSession::RestoreUsageSession(
|
||||
if (status != NO_ERROR) return status;
|
||||
|
||||
CdmResponseType sts(NO_ERROR);
|
||||
if (supports_usage_info()) {
|
||||
sts = usage_table_header_->LoadEntry(crypto_session_.get(), usage_entry_,
|
||||
usage_entry_number_);
|
||||
if (SupportsUsageTable()) {
|
||||
sts = usage_table_->LoadEntry(crypto_session_.get(), usage_entry_,
|
||||
usage_entry_index_);
|
||||
crypto_metrics_->usage_table_header_load_entry_.Increment(sts);
|
||||
if (sts != NO_ERROR) {
|
||||
LOGE("Failed to load usage entry: status = %d", static_cast<int>(sts));
|
||||
@@ -398,9 +396,9 @@ CdmResponseType CdmSession::RestoreUsageSession(
|
||||
return CdmResponseType(RELEASE_LICENSE_ERROR_2);
|
||||
}
|
||||
|
||||
if (supports_usage_info()) {
|
||||
sts = usage_table_header_->UpdateEntry(
|
||||
usage_entry_number_, crypto_session_.get(), &usage_entry_);
|
||||
if (SupportsUsageTable()) {
|
||||
sts = usage_table_->UpdateEntry(usage_entry_index_, crypto_session_.get(),
|
||||
&usage_entry_);
|
||||
if (sts != NO_ERROR) {
|
||||
LOGE("Failed to update usage entry: status = %d", static_cast<int>(sts));
|
||||
return sts;
|
||||
@@ -541,16 +539,16 @@ CdmResponseType CdmSession::AddKeyInternal(const CdmKeyResponse& key_response) {
|
||||
// to be created.
|
||||
CdmResponseType sts;
|
||||
std::string provider_session_token;
|
||||
if (supports_usage_info()) {
|
||||
if (SupportsUsageTable()) {
|
||||
if (license_parser_->ExtractProviderSessionToken(key_response,
|
||||
&provider_session_token) &&
|
||||
!provider_session_token.empty()) {
|
||||
std::string app_id;
|
||||
GetApplicationId(&app_id);
|
||||
sts = usage_table_header_->AddEntry(
|
||||
crypto_session_.get(), is_offline_, key_set_id_,
|
||||
DeviceFiles::GetUsageInfoFileName(app_id), key_response,
|
||||
&usage_entry_number_);
|
||||
sts = usage_table_->AddEntry(crypto_session_.get(), is_offline_,
|
||||
key_set_id_,
|
||||
DeviceFiles::GetUsageInfoFileName(app_id),
|
||||
key_response, &usage_entry_index_);
|
||||
crypto_metrics_->usage_table_header_add_entry_.Increment(sts);
|
||||
if (sts != NO_ERROR) return sts;
|
||||
}
|
||||
@@ -565,11 +563,10 @@ CdmResponseType CdmSession::AddKeyInternal(const CdmKeyResponse& key_response) {
|
||||
version_info.license_service_version());
|
||||
|
||||
// Update or invalidate entry if usage table header+entries are supported
|
||||
if (!provider_session_token.empty() && supports_usage_info()) {
|
||||
if (!provider_session_token.empty() && SupportsUsageTable()) {
|
||||
if (sts != KEY_ADDED) {
|
||||
const CdmResponseType invalidate_sts =
|
||||
usage_table_header_->InvalidateEntry(
|
||||
usage_entry_number_, true, file_handle_.get(), crypto_metrics_);
|
||||
const CdmResponseType invalidate_sts = usage_table_->InvalidateEntry(
|
||||
usage_entry_index_, true, file_handle_.get(), crypto_metrics_);
|
||||
crypto_metrics_->usage_table_header_delete_entry_.Increment(
|
||||
invalidate_sts);
|
||||
if (invalidate_sts != NO_ERROR) {
|
||||
@@ -590,9 +587,9 @@ CdmResponseType CdmSession::AddKeyInternal(const CdmKeyResponse& key_response) {
|
||||
license_parser_->provider_session_token().size());
|
||||
|
||||
if ((is_offline_ || has_provider_session_token()) && !is_temporary_) {
|
||||
if (has_provider_session_token() && supports_usage_info()) {
|
||||
usage_table_header_->UpdateEntry(usage_entry_number_,
|
||||
crypto_session_.get(), &usage_entry_);
|
||||
if (has_provider_session_token() && SupportsUsageTable()) {
|
||||
usage_table_->UpdateEntry(usage_entry_index_, crypto_session_.get(),
|
||||
&usage_entry_);
|
||||
}
|
||||
|
||||
if (!is_offline_)
|
||||
@@ -790,16 +787,16 @@ CdmResponseType CdmSession::GenerateReleaseRequest(CdmKeyRequest* key_request) {
|
||||
is_release_ = true;
|
||||
license_request_latency_.Clear();
|
||||
CdmResponseType status = license_parser_->PrepareKeyUpdateRequest(
|
||||
false, app_parameters_, usage_table_header_ == nullptr ? nullptr : this,
|
||||
false, app_parameters_, usage_table_ == nullptr ? nullptr : this,
|
||||
&key_request->message, &key_request->url);
|
||||
|
||||
key_request->type = kKeyRequestTypeRelease;
|
||||
|
||||
if (KEY_MESSAGE != status) return status;
|
||||
|
||||
if (has_provider_session_token() && supports_usage_info()) {
|
||||
status = usage_table_header_->UpdateEntry(
|
||||
usage_entry_number_, crypto_session_.get(), &usage_entry_);
|
||||
if (has_provider_session_token() && SupportsUsageTable()) {
|
||||
status = usage_table_->UpdateEntry(usage_entry_index_,
|
||||
crypto_session_.get(), &usage_entry_);
|
||||
|
||||
if (status != NO_ERROR) {
|
||||
LOGE("Update usage entry failed: status = %d", static_cast<int>(status));
|
||||
@@ -811,7 +808,7 @@ CdmResponseType CdmSession::GenerateReleaseRequest(CdmKeyRequest* key_request) {
|
||||
if (!StoreLicense(kLicenseStateReleasing, nullptr))
|
||||
return CdmResponseType(RELEASE_KEY_REQUEST_ERROR);
|
||||
} else if (!usage_provider_session_token_.empty()) {
|
||||
if (supports_usage_info()) {
|
||||
if (SupportsUsageTable()) {
|
||||
if (!UpdateUsageInfo()) return CdmResponseType(RELEASE_USAGE_INFO_FAILED);
|
||||
}
|
||||
}
|
||||
@@ -840,12 +837,12 @@ CdmResponseType CdmSession::ReleaseKey(const CdmKeyResponse& key_response) {
|
||||
return RemoveLicense();
|
||||
}
|
||||
|
||||
CdmResponseType CdmSession::DeleteUsageEntry(uint32_t usage_entry_number) {
|
||||
CdmResponseType CdmSession::DeleteUsageEntry(uint32_t usage_entry_index) {
|
||||
if (!initialized_) {
|
||||
LOGE("CDM session not initialized");
|
||||
return CdmResponseType(NOT_INITIALIZED_ERROR);
|
||||
}
|
||||
if (!supports_usage_info()) {
|
||||
if (!SupportsUsageTable()) {
|
||||
LOGE("Cannot delete entry, usage table not supported");
|
||||
return CdmResponseType(INCORRECT_USAGE_SUPPORT_TYPE_1);
|
||||
}
|
||||
@@ -860,19 +857,19 @@ CdmResponseType CdmSession::DeleteUsageEntry(uint32_t usage_entry_number) {
|
||||
crypto_metrics_, crypto_session_open_, sts, requested_security_level_);
|
||||
if (sts != NO_ERROR) return sts;
|
||||
|
||||
usage_table_header_ = nullptr;
|
||||
usage_table_ = nullptr;
|
||||
bool has_support = false;
|
||||
if (crypto_session_->HasUsageInfoSupport(&has_support) && has_support) {
|
||||
usage_table_header_ = crypto_session_->GetUsageTableHeader();
|
||||
if (crypto_session_->HasUsageTableSupport(&has_support) && has_support) {
|
||||
usage_table_ = crypto_session_->GetUsageTable();
|
||||
}
|
||||
|
||||
if (usage_table_header_ == nullptr) {
|
||||
if (usage_table_ == nullptr) {
|
||||
LOGE("Usage table header unavailable");
|
||||
return CdmResponseType(INCORRECT_USAGE_SUPPORT_TYPE_1);
|
||||
}
|
||||
|
||||
sts = usage_table_header_->InvalidateEntry(
|
||||
usage_entry_number, true, file_handle_.get(), crypto_metrics_);
|
||||
sts = usage_table_->InvalidateEntry(usage_entry_index, true,
|
||||
file_handle_.get(), crypto_metrics_);
|
||||
crypto_metrics_->usage_table_header_delete_entry_.Increment(sts);
|
||||
return sts;
|
||||
}
|
||||
@@ -954,11 +951,11 @@ CdmResponseType CdmSession::StoreLicense() {
|
||||
if (!file_handle_->StoreUsageInfo(
|
||||
provider_session_token, key_request_, key_response_,
|
||||
DeviceFiles::GetUsageInfoFileName(app_id), key_set_id_, usage_entry_,
|
||||
usage_entry_number_, drm_certificate_, wrapped_private_key_)) {
|
||||
usage_entry_index_, drm_certificate_, wrapped_private_key_)) {
|
||||
LOGE("Unable to store usage info");
|
||||
// Usage info file is corrupt. Delete current usage entry and file.
|
||||
if (supports_usage_info()) {
|
||||
DeleteUsageEntry(usage_entry_number_);
|
||||
if (SupportsUsageTable()) {
|
||||
DeleteUsageEntry(usage_entry_index_);
|
||||
} else {
|
||||
LOGW("Cannot store, usage table not supported");
|
||||
}
|
||||
@@ -987,7 +984,7 @@ bool CdmSession::StoreLicense(CdmOfflineLicenseState state, int* error_detail) {
|
||||
policy_engine_->GetGracePeriodEndTime(),
|
||||
app_parameters_,
|
||||
usage_entry_,
|
||||
usage_entry_number_,
|
||||
usage_entry_index_,
|
||||
drm_certificate_,
|
||||
wrapped_private_key_};
|
||||
|
||||
@@ -1011,8 +1008,8 @@ CdmResponseType CdmSession::RemoveKeys() {
|
||||
|
||||
CdmResponseType CdmSession::RemoveLicense() {
|
||||
if (is_offline_ || has_provider_session_token()) {
|
||||
if (has_provider_session_token() && supports_usage_info()) {
|
||||
DeleteUsageEntry(usage_entry_number_);
|
||||
if (has_provider_session_token() && SupportsUsageTable()) {
|
||||
DeleteUsageEntry(usage_entry_index_);
|
||||
}
|
||||
DeleteLicenseFile();
|
||||
}
|
||||
@@ -1061,9 +1058,9 @@ void CdmSession::GetApplicationId(std::string* app_id) {
|
||||
}
|
||||
|
||||
CdmResponseType CdmSession::UpdateUsageEntryInformation() {
|
||||
if (!has_provider_session_token() || !supports_usage_info()) {
|
||||
if (!has_provider_session_token() || !SupportsUsageTable()) {
|
||||
LOGE("Unexpected state: usage_support = %s, PST present = %s, ",
|
||||
supports_usage_info() ? "true" : "false",
|
||||
SupportsUsageTable() ? "true" : "false",
|
||||
has_provider_session_token() ? "yes" : "no");
|
||||
return CdmResponseType(INCORRECT_USAGE_SUPPORT_TYPE_2);
|
||||
}
|
||||
@@ -1072,8 +1069,8 @@ CdmResponseType CdmSession::UpdateUsageEntryInformation() {
|
||||
// TODO(blueeyes): Add measurements to all UpdateEntry calls in a way that
|
||||
// allos us to isolate this particular use case within
|
||||
// UpdateUsageEntryInformation.
|
||||
M_TIME(sts = usage_table_header_->UpdateEntry(
|
||||
usage_entry_number_, crypto_session_.get(), &usage_entry_),
|
||||
M_TIME(sts = usage_table_->UpdateEntry(usage_entry_index_,
|
||||
crypto_session_.get(), &usage_entry_),
|
||||
crypto_metrics_, usage_table_header_update_entry_, sts);
|
||||
|
||||
if (sts != NO_ERROR) return sts;
|
||||
@@ -1159,7 +1156,7 @@ bool CdmSession::UpdateUsageInfo() {
|
||||
usage_data.license = key_response_;
|
||||
usage_data.key_set_id = key_set_id_;
|
||||
usage_data.usage_entry = usage_entry_;
|
||||
usage_data.usage_entry_number = usage_entry_number_;
|
||||
usage_data.usage_entry_index = usage_entry_index_;
|
||||
|
||||
return file_handle_->UpdateUsageInfo(
|
||||
DeviceFiles::GetUsageInfoFileName(app_id), usage_provider_session_token_,
|
||||
@@ -1178,15 +1175,15 @@ bool CdmSession::VerifyOfflineUsageEntry() {
|
||||
// Check that the current license is the same as the expected
|
||||
// entry in the usage table. It is possible that the license has
|
||||
// been removed from the usage table but the license file remains.
|
||||
if (usage_entry_number_ >= usage_table_header_->size()) {
|
||||
LOGD("License usage entry does not exist: entry_number = %u, size = %zu",
|
||||
usage_entry_number_, usage_table_header_->size());
|
||||
if (usage_entry_index_ >= usage_table_->size()) {
|
||||
LOGD("License usage entry does not exist: entry_index = %u, size = %zu",
|
||||
usage_entry_index_, usage_table_->size());
|
||||
return false;
|
||||
}
|
||||
const CdmUsageEntryInfo& usage_entry_info =
|
||||
usage_table_header_->usage_entry_info().at(usage_entry_number_);
|
||||
if (usage_entry_info.storage_type != kStorageLicense ||
|
||||
usage_entry_info.key_set_id != key_set_id_) {
|
||||
const CdmUsageEntryInfo& entry_info =
|
||||
usage_table_->entry_info_list().at(usage_entry_index_);
|
||||
if (entry_info.storage_type != kStorageLicense ||
|
||||
entry_info.key_set_id != key_set_id_) {
|
||||
LOGD("License usage entry does not match");
|
||||
return false;
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -229,9 +229,9 @@ CdmResponseType ClientIdentification::Prepare(
|
||||
client_capabilities->set_client_token(true);
|
||||
|
||||
if (is_license_request_) {
|
||||
bool supports_usage_information;
|
||||
if (crypto_session_->HasUsageInfoSupport(&supports_usage_information)) {
|
||||
client_capabilities->set_session_token(supports_usage_information);
|
||||
bool supports_usage_table;
|
||||
if (crypto_session_->HasUsageTableSupport(&supports_usage_table)) {
|
||||
client_capabilities->set_session_token(supports_usage_table);
|
||||
}
|
||||
|
||||
client_capabilities->set_anti_rollback_usage_table(
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include "advance_iv_ctr.h"
|
||||
#include "arraysize.h"
|
||||
#include "cdm_random.h"
|
||||
#include "cdm_usage_table.h"
|
||||
#include "content_key_session.h"
|
||||
#include "crypto_key.h"
|
||||
#include "entitlement_key_session.h"
|
||||
@@ -28,7 +29,6 @@
|
||||
#include "properties.h"
|
||||
#include "pst_report.h"
|
||||
#include "string_conversions.h"
|
||||
#include "usage_table_header.h"
|
||||
#include "wv_cdm_constants.h"
|
||||
|
||||
// Stringify turns macro arguments into static C strings.
|
||||
@@ -211,8 +211,8 @@ bool CryptoSession::initialized_ = false;
|
||||
bool CryptoSession::needs_keybox_provisioning_ = false;
|
||||
int CryptoSession::session_count_ = 0;
|
||||
int CryptoSession::termination_counter_ = 0;
|
||||
std::unique_ptr<UsageTableHeader> CryptoSession::usage_table_header_l1_;
|
||||
std::unique_ptr<UsageTableHeader> CryptoSession::usage_table_header_l3_;
|
||||
std::unique_ptr<CdmUsageTable> CryptoSession::usage_table_l1_;
|
||||
std::unique_ptr<CdmUsageTable> CryptoSession::usage_table_l3_;
|
||||
std::recursive_mutex CryptoSession::usage_table_mutex_;
|
||||
std::atomic<uint64_t> CryptoSession::request_id_index_source_(0);
|
||||
std::unique_ptr<okp::SystemFallbackPolicy>
|
||||
@@ -400,8 +400,8 @@ void CryptoSession::ReinitializeForTest() {
|
||||
}
|
||||
initialized_ = false;
|
||||
// Tables will be reinitialized by tests when needed.
|
||||
usage_table_header_l1_.reset();
|
||||
usage_table_header_l3_.reset();
|
||||
usage_table_l1_.reset();
|
||||
usage_table_l3_.reset();
|
||||
}
|
||||
// Give up if we cannot initialize at all.
|
||||
const OEMCryptoResult status = OEMCrypto_Initialize();
|
||||
@@ -479,8 +479,8 @@ bool CryptoSession::TryTerminate() {
|
||||
});
|
||||
if (terminated) {
|
||||
UsageTableLock lock(usage_table_mutex_);
|
||||
usage_table_header_l1_.reset();
|
||||
usage_table_header_l3_.reset();
|
||||
usage_table_l1_.reset();
|
||||
usage_table_l3_.reset();
|
||||
}
|
||||
return terminated;
|
||||
}
|
||||
@@ -491,9 +491,9 @@ void CryptoSession::DisableDelayedTermination() {
|
||||
[&] { termination_counter_ = 0; });
|
||||
}
|
||||
|
||||
bool CryptoSession::SetUpUsageTableHeader(
|
||||
bool CryptoSession::SetUpUsageTable(
|
||||
RequestedSecurityLevel requested_security_level) {
|
||||
if (usage_table_header_ != nullptr) {
|
||||
if (usage_table_ != nullptr) {
|
||||
LOGE("Usage table is already set up for the current crypto session");
|
||||
return false;
|
||||
}
|
||||
@@ -508,7 +508,7 @@ bool CryptoSession::SetUpUsageTableHeader(
|
||||
|
||||
// Check if usage support is available.
|
||||
bool supports_usage_table = false;
|
||||
if (!HasUsageInfoSupport(requested_security_level, &supports_usage_table)) {
|
||||
if (!HasUsageTableSupport(requested_security_level, &supports_usage_table)) {
|
||||
metrics_->oemcrypto_usage_table_support_.SetError(
|
||||
USAGE_INFORMATION_SUPPORT_FAILED);
|
||||
return false;
|
||||
@@ -519,30 +519,28 @@ bool CryptoSession::SetUpUsageTableHeader(
|
||||
return false;
|
||||
}
|
||||
|
||||
LOGV("Usage table lock: SetUpUsageTableHeader()");
|
||||
LOGV("Usage table lock: SetUpUsageTable()");
|
||||
UsageTableLock auto_lock(usage_table_mutex_);
|
||||
// TODO(b/141350978): Prevent any recursive logic.
|
||||
|
||||
// Manipulate only the usage table for the requested security level.
|
||||
std::unique_ptr<UsageTableHeader>& header = security_level == kSecurityLevelL1
|
||||
? usage_table_header_l1_
|
||||
: usage_table_header_l3_;
|
||||
if (!header) {
|
||||
std::unique_ptr<CdmUsageTable>& table =
|
||||
security_level == kSecurityLevelL1 ? usage_table_l1_ : usage_table_l3_;
|
||||
if (!table) {
|
||||
// This may be called twice within the same thread when the table
|
||||
// is initialized. On the second call |header| will not be null,
|
||||
// causing this block to be skipped.
|
||||
header.reset(new UsageTableHeader());
|
||||
if (!header->Init(security_level, this)) {
|
||||
table.reset(new CdmUsageTable());
|
||||
if (!table->Init(security_level, this)) {
|
||||
LOGE("Failed to initialize and sync usage usage table");
|
||||
// Must be cleared globally to prevent the next session to be
|
||||
// opened from using the invalid UsageTableHeader.
|
||||
header.reset();
|
||||
// opened from using the invalid CdmUsageTable.
|
||||
table.reset();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
usage_table_header_ = header.get();
|
||||
metrics_->usage_table_header_initial_size_.Record(
|
||||
usage_table_header_->size());
|
||||
usage_table_ = table.get();
|
||||
metrics_->usage_table_header_initial_size_.Record(usage_table_->size());
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -890,7 +888,7 @@ CdmResponseType CryptoSession::Open(
|
||||
RETURN_IF_UNINITIALIZED(CRYPTO_SESSION_NOT_INITIALIZED);
|
||||
if (open_) return CdmResponseType(NO_ERROR);
|
||||
|
||||
if (!SetUpUsageTableHeader(requested_security_level)) {
|
||||
if (!SetUpUsageTable(requested_security_level)) {
|
||||
// Ignore errors since we do not know when a session is opened,
|
||||
// if it is intended to be used for offline/usage session related
|
||||
// or otherwise.
|
||||
@@ -962,7 +960,7 @@ void CryptoSession::Close() {
|
||||
metrics_->oemcrypto_close_session_.Increment(close_sts);
|
||||
|
||||
// Clear cached values.
|
||||
has_usage_info_support_ = kBooleanUnset;
|
||||
has_usage_table_support_ = kBooleanUnset;
|
||||
oem_token_.clear();
|
||||
system_id_ = NULL_SYSTEM_ID;
|
||||
pre_provision_token_type_ = kClientTokenUninitialized;
|
||||
@@ -975,7 +973,7 @@ void CryptoSession::Close() {
|
||||
case OEMCrypto_SUCCESS:
|
||||
case OEMCrypto_ERROR_INVALID_SESSION:
|
||||
case OEMCrypto_ERROR_SYSTEM_INVALIDATED:
|
||||
usage_table_header_ = nullptr;
|
||||
usage_table_ = nullptr;
|
||||
open_ = false;
|
||||
break;
|
||||
case OEMCrypto_ERROR_CLOSE_SESSION_FAILED:
|
||||
@@ -1837,38 +1835,38 @@ CdmResponseType CryptoSession::Decrypt(
|
||||
}
|
||||
}
|
||||
|
||||
bool CryptoSession::HasUsageInfoSupport(bool* has_support) {
|
||||
bool CryptoSession::HasUsageTableSupport(bool* has_support) {
|
||||
RETURN_IF_NOT_OPEN(false);
|
||||
RETURN_IF_NULL(has_support, false);
|
||||
return WithOecReadLock("HasUsageInfoSupport", [&] {
|
||||
return WithOecReadLock("HasUsageTableSupport", [&] {
|
||||
// Use cached value if set.
|
||||
if (has_usage_info_support_ != kBooleanUnset) {
|
||||
*has_support = (has_usage_info_support_ == kBooleanTrue);
|
||||
if (has_usage_table_support_ != kBooleanUnset) {
|
||||
*has_support = (has_usage_table_support_ == kBooleanTrue);
|
||||
return true;
|
||||
}
|
||||
if (!HasUsageInfoSupportInternal(requested_security_level_, has_support)) {
|
||||
if (!HasUsageTableSupportInternal(requested_security_level_, has_support)) {
|
||||
return false;
|
||||
}
|
||||
// Cache result if successful.
|
||||
has_usage_info_support_ = (*has_support ? kBooleanTrue : kBooleanFalse);
|
||||
has_usage_table_support_ = (*has_support ? kBooleanTrue : kBooleanFalse);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
bool CryptoSession::HasUsageInfoSupport(
|
||||
bool CryptoSession::HasUsageTableSupport(
|
||||
RequestedSecurityLevel requested_security_level, bool* has_support) {
|
||||
RETURN_IF_UNINITIALIZED(false);
|
||||
RETURN_IF_NULL(has_support, false);
|
||||
return WithOecReadLock("HasUsageInfoSupport", [&] {
|
||||
return HasUsageInfoSupportInternal(requested_security_level, has_support);
|
||||
return WithOecReadLock("HasUsageTableSupport", [&] {
|
||||
return HasUsageTableSupportInternal(requested_security_level, has_support);
|
||||
});
|
||||
}
|
||||
|
||||
bool CryptoSession::HasUsageInfoSupportInternal(
|
||||
bool CryptoSession::HasUsageTableSupportInternal(
|
||||
RequestedSecurityLevel requested_security_level, bool* has_support) {
|
||||
LOGV("requested_security_level = %s",
|
||||
RequestedSecurityLevelToString(requested_security_level));
|
||||
*has_support = WithOecReadLock("HasUsageInfoSupport", [&] {
|
||||
*has_support = WithOecReadLock("HasUsageTableSupport", [&] {
|
||||
return OEMCrypto_SupportsUsageTable(requested_security_level);
|
||||
});
|
||||
return true;
|
||||
@@ -2646,7 +2644,7 @@ CdmResponseType CryptoSession::GenericVerify(const std::string& message,
|
||||
|
||||
CdmResponseType CryptoSession::CreateUsageTableHeader(
|
||||
RequestedSecurityLevel requested_security_level,
|
||||
CdmUsageTableHeader* usage_table_header) {
|
||||
UsageTableHeader* usage_table_header) {
|
||||
LOGV("Creating usage table header: requested_security_level = %s",
|
||||
RequestedSecurityLevelToString(requested_security_level));
|
||||
RETURN_IF_NULL(usage_table_header, PARAMETER_NULL);
|
||||
@@ -2687,7 +2685,7 @@ CdmResponseType CryptoSession::CreateUsageTableHeader(
|
||||
|
||||
CdmResponseType CryptoSession::LoadUsageTableHeader(
|
||||
RequestedSecurityLevel requested_security_level,
|
||||
const CdmUsageTableHeader& usage_table_header) {
|
||||
const UsageTableHeader& usage_table_header) {
|
||||
LOGV("Loading usage table header: requested_security_level = %s",
|
||||
RequestedSecurityLevelToString(requested_security_level));
|
||||
|
||||
@@ -2728,7 +2726,7 @@ CdmResponseType CryptoSession::LoadUsageTableHeader(
|
||||
|
||||
CdmResponseType CryptoSession::ShrinkUsageTableHeader(
|
||||
RequestedSecurityLevel requested_security_level, uint32_t new_entry_count,
|
||||
CdmUsageTableHeader* usage_table_header) {
|
||||
UsageTableHeader* usage_table_header) {
|
||||
LOGV("Shrinking usage table header: requested_security_level = %s",
|
||||
RequestedSecurityLevelToString(requested_security_level));
|
||||
RETURN_IF_NULL(usage_table_header, PARAMETER_NULL);
|
||||
@@ -2766,14 +2764,14 @@ CdmResponseType CryptoSession::ShrinkUsageTableHeader(
|
||||
}
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::CreateUsageEntry(uint32_t* entry_number) {
|
||||
CdmResponseType CryptoSession::CreateUsageEntry(UsageEntryIndex* entry_index) {
|
||||
LOGV("Creating usage entry: id = %u", oec_session_id_);
|
||||
|
||||
RETURN_IF_NULL(entry_number, PARAMETER_NULL);
|
||||
RETURN_IF_NULL(entry_index, PARAMETER_NULL);
|
||||
|
||||
OEMCryptoResult result;
|
||||
WithOecWriteLock("CreateUsageEntry", [&] {
|
||||
result = OEMCrypto_CreateNewUsageEntry(oec_session_id_, entry_number);
|
||||
result = OEMCrypto_CreateNewUsageEntry(oec_session_id_, entry_index);
|
||||
metrics_->oemcrypto_create_new_usage_entry_.Increment(result);
|
||||
});
|
||||
|
||||
@@ -2796,14 +2794,14 @@ CdmResponseType CryptoSession::CreateUsageEntry(uint32_t* entry_number) {
|
||||
}
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::LoadUsageEntry(
|
||||
uint32_t entry_number, const CdmUsageEntry& usage_entry) {
|
||||
CdmResponseType CryptoSession::LoadUsageEntry(UsageEntryIndex entry_index,
|
||||
const UsageEntry& usage_entry) {
|
||||
LOGV("Loading usage entry: id = %u", oec_session_id_);
|
||||
|
||||
OEMCryptoResult result;
|
||||
WithOecWriteLock("LoadUsageEntry", [&] {
|
||||
result = OEMCrypto_LoadUsageEntry(
|
||||
oec_session_id_, entry_number,
|
||||
oec_session_id_, entry_index,
|
||||
reinterpret_cast<const uint8_t*>(usage_entry.data()),
|
||||
usage_entry.size());
|
||||
metrics_->oemcrypto_load_usage_entry_.Increment(result);
|
||||
@@ -2839,7 +2837,7 @@ CdmResponseType CryptoSession::LoadUsageEntry(
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::UpdateUsageEntry(
|
||||
CdmUsageTableHeader* usage_table_header, CdmUsageEntry* usage_entry) {
|
||||
UsageTableHeader* usage_table_header, UsageEntry* usage_entry) {
|
||||
LOGV("Updating usage entry: id = %u", oec_session_id_);
|
||||
|
||||
RETURN_IF_NULL(usage_table_header, PARAMETER_NULL);
|
||||
@@ -2880,19 +2878,19 @@ CdmResponseType CryptoSession::UpdateUsageEntry(
|
||||
"UpdateUsageEntry");
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::MoveUsageEntry(uint32_t new_entry_number) {
|
||||
CdmResponseType CryptoSession::MoveUsageEntry(UsageEntryIndex new_entry_index) {
|
||||
LOGV("Moving usage entry: id = %u", oec_session_id_);
|
||||
|
||||
OEMCryptoResult result;
|
||||
WithOecWriteLock("MoveUsageEntry", [&] {
|
||||
result = OEMCrypto_MoveEntry(oec_session_id_, new_entry_number);
|
||||
result = OEMCrypto_MoveEntry(oec_session_id_, new_entry_index);
|
||||
metrics_->oemcrypto_move_entry_.Increment(result);
|
||||
});
|
||||
|
||||
switch (result) {
|
||||
case OEMCrypto_ERROR_ENTRY_IN_USE:
|
||||
LOGW("OEMCrypto_MoveEntry failed: Destination index in use: index = %u",
|
||||
new_entry_number);
|
||||
new_entry_index);
|
||||
return CRYPTO_ERROR(MOVE_USAGE_ENTRY_DESTINATION_IN_USE, result);
|
||||
default:
|
||||
return MapOEMCryptoResult(result, MOVE_USAGE_ENTRY_UNKNOWN_ERROR,
|
||||
|
||||
@@ -838,7 +838,7 @@ bool DeviceFiles::StoreLicense(const CdmLicenseData& license_data,
|
||||
app_params->set_value(iter->second);
|
||||
}
|
||||
license->set_usage_entry(license_data.usage_entry);
|
||||
license->set_usage_entry_number(license_data.usage_entry_number);
|
||||
license->set_usage_entry_index(license_data.usage_entry_index);
|
||||
if (!license_data.drm_certificate.empty()) {
|
||||
DeviceCertificate* device_certificate = license->mutable_drm_certificate();
|
||||
if (!SetDeviceCertificate(license_data.drm_certificate,
|
||||
@@ -929,8 +929,8 @@ bool DeviceFiles::RetrieveLicense(const std::string& key_set_id,
|
||||
license.app_parameters(i).value();
|
||||
}
|
||||
license_data->usage_entry = license.usage_entry();
|
||||
license_data->usage_entry_number =
|
||||
static_cast<uint32_t>(license.usage_entry_number());
|
||||
license_data->usage_entry_index =
|
||||
static_cast<uint32_t>(license.usage_entry_index());
|
||||
|
||||
if (!license.has_drm_certificate()) {
|
||||
license_data->drm_certificate.clear();
|
||||
@@ -1010,8 +1010,8 @@ bool DeviceFiles::UnreserveLicenseId(const std::string& key_set_id) {
|
||||
bool DeviceFiles::StoreUsageInfo(
|
||||
const std::string& provider_session_token, const CdmKeyMessage& key_request,
|
||||
const CdmKeyResponse& key_response, const std::string& usage_info_file_name,
|
||||
const std::string& key_set_id, const std::string& usage_entry,
|
||||
uint32_t usage_entry_number, const std::string& drm_certificate,
|
||||
const std::string& key_set_id, const UsageEntry& usage_entry,
|
||||
UsageEntryIndex usage_entry_index, const std::string& drm_certificate,
|
||||
const CryptoWrappedKey& wrapped_private_key) {
|
||||
RETURN_FALSE_IF_UNINITIALIZED();
|
||||
video_widevine_client::sdk::File file;
|
||||
@@ -1034,7 +1034,7 @@ bool DeviceFiles::StoreUsageInfo(
|
||||
provider_session->set_license(key_response.data(), key_response.size());
|
||||
provider_session->set_key_set_id(key_set_id.data(), key_set_id.size());
|
||||
provider_session->set_usage_entry(usage_entry);
|
||||
provider_session->set_usage_entry_number(usage_entry_number);
|
||||
provider_session->set_usage_entry_index(usage_entry_index);
|
||||
|
||||
if (drm_certificate.size() > 0) {
|
||||
uint32_t drm_certificate_id;
|
||||
@@ -1235,15 +1235,15 @@ bool DeviceFiles::RetrieveUsageInfo(const std::string& usage_info_file_name,
|
||||
const std::string& provider_session_token,
|
||||
CdmKeyMessage* license_request,
|
||||
CdmKeyResponse* license,
|
||||
std::string* usage_entry,
|
||||
uint32_t* usage_entry_number,
|
||||
UsageEntry* usage_entry,
|
||||
UsageEntryIndex* usage_entry_index,
|
||||
std::string* drm_certificate,
|
||||
CryptoWrappedKey* wrapped_private_key) {
|
||||
RETURN_FALSE_IF_UNINITIALIZED();
|
||||
RETURN_FALSE_IF_NULL(license_request);
|
||||
RETURN_FALSE_IF_NULL(license);
|
||||
RETURN_FALSE_IF_NULL(usage_entry);
|
||||
RETURN_FALSE_IF_NULL(usage_entry_number);
|
||||
RETURN_FALSE_IF_NULL(usage_entry_index);
|
||||
RETURN_FALSE_IF_NULL(drm_certificate);
|
||||
RETURN_FALSE_IF_NULL(wrapped_private_key);
|
||||
|
||||
@@ -1259,8 +1259,8 @@ bool DeviceFiles::RetrieveUsageInfo(const std::string& usage_info_file_name,
|
||||
*license_request = file.usage_info().sessions(index).license_request();
|
||||
*license = file.usage_info().sessions(index).license();
|
||||
*usage_entry = file.usage_info().sessions(index).usage_entry();
|
||||
*usage_entry_number = static_cast<uint32_t>(
|
||||
file.usage_info().sessions(index).usage_entry_number());
|
||||
*usage_entry_index = static_cast<UsageEntryIndex>(
|
||||
file.usage_info().sessions(index).usage_entry_index());
|
||||
|
||||
if (!file.usage_info().sessions(index).has_drm_certificate_id()) {
|
||||
drm_certificate->clear();
|
||||
@@ -1285,14 +1285,14 @@ bool DeviceFiles::RetrieveUsageInfo(const std::string& usage_info_file_name,
|
||||
bool DeviceFiles::RetrieveUsageInfoByKeySetId(
|
||||
const std::string& usage_info_file_name, const std::string& key_set_id,
|
||||
std::string* provider_session_token, CdmKeyMessage* license_request,
|
||||
CdmKeyResponse* license, std::string* usage_entry,
|
||||
uint32_t* usage_entry_number, std::string* drm_certificate,
|
||||
CdmKeyResponse* license, UsageEntry* usage_entry,
|
||||
UsageEntryIndex* usage_entry_index, std::string* drm_certificate,
|
||||
CryptoWrappedKey* wrapped_private_key) {
|
||||
RETURN_FALSE_IF_UNINITIALIZED();
|
||||
RETURN_FALSE_IF_NULL(license_request);
|
||||
RETURN_FALSE_IF_NULL(license);
|
||||
RETURN_FALSE_IF_NULL(usage_entry);
|
||||
RETURN_FALSE_IF_NULL(usage_entry_number);
|
||||
RETURN_FALSE_IF_NULL(usage_entry_index);
|
||||
RETURN_FALSE_IF_NULL(drm_certificate);
|
||||
RETURN_FALSE_IF_NULL(wrapped_private_key);
|
||||
|
||||
@@ -1309,8 +1309,8 @@ bool DeviceFiles::RetrieveUsageInfoByKeySetId(
|
||||
*license_request = file.usage_info().sessions(index).license_request();
|
||||
*license = file.usage_info().sessions(index).license();
|
||||
*usage_entry = file.usage_info().sessions(index).usage_entry();
|
||||
*usage_entry_number = static_cast<uint32_t>(
|
||||
file.usage_info().sessions(index).usage_entry_number());
|
||||
*usage_entry_index = static_cast<UsageEntryIndex>(
|
||||
file.usage_info().sessions(index).usage_entry_index());
|
||||
|
||||
if (!file.usage_info().sessions(index).has_drm_certificate_id()) {
|
||||
drm_certificate->clear();
|
||||
@@ -1354,7 +1354,7 @@ bool DeviceFiles::StoreUsageInfo(const std::string& usage_info_file_name,
|
||||
provider_session->set_key_set_id(usage_data[i].key_set_id.data(),
|
||||
usage_data[i].key_set_id.size());
|
||||
provider_session->set_usage_entry(usage_data[i].usage_entry);
|
||||
provider_session->set_usage_entry_number(usage_data[i].usage_entry_number);
|
||||
provider_session->set_usage_entry_index(usage_data[i].usage_entry_index);
|
||||
|
||||
if (usage_data[i].drm_certificate.size() > 0) {
|
||||
uint32_t drm_certificate_id;
|
||||
@@ -1399,7 +1399,7 @@ bool DeviceFiles::UpdateUsageInfo(const std::string& usage_info_file_name,
|
||||
provider_session->set_license(usage_data.license);
|
||||
provider_session->set_key_set_id(usage_data.key_set_id);
|
||||
provider_session->set_usage_entry(usage_data.usage_entry);
|
||||
provider_session->set_usage_entry_number(usage_data.usage_entry_number);
|
||||
provider_session->set_usage_entry_index(usage_data.usage_entry_index);
|
||||
|
||||
if (usage_data.drm_certificate.size() > 0) {
|
||||
uint32_t drm_certificate_id;
|
||||
@@ -1448,8 +1448,8 @@ bool DeviceFiles::RetrieveUsageInfo(const std::string& usage_info_file_name,
|
||||
(*usage_data)[i].license = file.usage_info().sessions(i).license();
|
||||
(*usage_data)[i].key_set_id = file.usage_info().sessions(i).key_set_id();
|
||||
(*usage_data)[i].usage_entry = file.usage_info().sessions(i).usage_entry();
|
||||
(*usage_data)[i].usage_entry_number = static_cast<uint32_t>(
|
||||
file.usage_info().sessions(i).usage_entry_number());
|
||||
(*usage_data)[i].usage_entry_index = static_cast<uint32_t>(
|
||||
file.usage_info().sessions(i).usage_entry_index());
|
||||
|
||||
if (!file.usage_info().sessions(i).has_drm_certificate_id()) {
|
||||
(*usage_data)[i].drm_certificate.clear();
|
||||
@@ -1490,8 +1490,8 @@ bool DeviceFiles::RetrieveUsageInfo(const std::string& usage_info_file_name,
|
||||
usage_data->license = file.usage_info().sessions(index).license();
|
||||
usage_data->key_set_id = file.usage_info().sessions(index).key_set_id();
|
||||
usage_data->usage_entry = file.usage_info().sessions(index).usage_entry();
|
||||
usage_data->usage_entry_number = static_cast<uint32_t>(
|
||||
file.usage_info().sessions(index).usage_entry_number());
|
||||
usage_data->usage_entry_index = static_cast<uint32_t>(
|
||||
file.usage_info().sessions(index).usage_entry_index());
|
||||
|
||||
if (!file.usage_info().sessions(index).has_drm_certificate_id()) {
|
||||
usage_data->drm_certificate.clear();
|
||||
@@ -1629,8 +1629,8 @@ bool DeviceFiles::DeleteHlsAttributes(const std::string& key_set_id) {
|
||||
}
|
||||
|
||||
bool DeviceFiles::StoreUsageTableInfo(
|
||||
const CdmUsageTableHeader& usage_table_header,
|
||||
const std::vector<CdmUsageEntryInfo>& usage_entry_info) {
|
||||
const UsageTableHeader& table_header,
|
||||
const std::vector<CdmUsageEntryInfo>& entry_info_list) {
|
||||
RETURN_FALSE_IF_UNINITIALIZED();
|
||||
|
||||
// Fill in file information
|
||||
@@ -1640,25 +1640,24 @@ bool DeviceFiles::StoreUsageTableInfo(
|
||||
file.set_version(video_widevine_client::sdk::File::VERSION_1);
|
||||
|
||||
UsageTableInfo* usage_table_info = file.mutable_usage_table_info();
|
||||
usage_table_info->set_usage_table_header(usage_table_header);
|
||||
for (size_t i = 0; i < usage_entry_info.size(); ++i) {
|
||||
usage_table_info->set_table_header(table_header);
|
||||
for (size_t i = 0; i < entry_info_list.size(); ++i) {
|
||||
UsageTableInfo_UsageEntryInfo* info =
|
||||
usage_table_info->add_usage_entry_info();
|
||||
info->set_key_set_id(usage_entry_info[i].key_set_id);
|
||||
switch (usage_entry_info[i].storage_type) {
|
||||
usage_table_info->add_entry_info_list();
|
||||
info->set_key_set_id(entry_info_list[i].key_set_id);
|
||||
switch (entry_info_list[i].storage_type) {
|
||||
case kStorageLicense:
|
||||
info->set_storage(
|
||||
UsageTableInfo_UsageEntryInfo_UsageEntryStorage_LICENSE);
|
||||
info->set_last_use_time(usage_entry_info[i].last_use_time);
|
||||
info->set_last_use_time(entry_info_list[i].last_use_time);
|
||||
info->set_offline_license_expiry_time(
|
||||
usage_entry_info[i].offline_license_expiry_time);
|
||||
entry_info_list[i].offline_license_expiry_time);
|
||||
break;
|
||||
case kStorageUsageInfo:
|
||||
info->set_storage(
|
||||
UsageTableInfo_UsageEntryInfo_UsageEntryStorage_USAGE_INFO);
|
||||
info->set_usage_info_file_name(
|
||||
usage_entry_info[i].usage_info_file_name);
|
||||
info->set_last_use_time(usage_entry_info[i].last_use_time);
|
||||
info->set_usage_info_file_name(entry_info_list[i].usage_info_file_name);
|
||||
info->set_last_use_time(entry_info_list[i].last_use_time);
|
||||
break;
|
||||
case kStorageTypeUnknown:
|
||||
default:
|
||||
@@ -1677,11 +1676,11 @@ bool DeviceFiles::StoreUsageTableInfo(
|
||||
}
|
||||
|
||||
bool DeviceFiles::RetrieveUsageTableInfo(
|
||||
CdmUsageTableHeader* usage_table_header,
|
||||
std::vector<CdmUsageEntryInfo>* usage_entry_info, bool* lru_upgrade) {
|
||||
UsageTableHeader* table_header,
|
||||
std::vector<CdmUsageEntryInfo>* entry_info_list, bool* lru_upgrade) {
|
||||
RETURN_FALSE_IF_UNINITIALIZED();
|
||||
RETURN_FALSE_IF_NULL(usage_table_header);
|
||||
RETURN_FALSE_IF_NULL(usage_entry_info);
|
||||
RETURN_FALSE_IF_NULL(table_header);
|
||||
RETURN_FALSE_IF_NULL(entry_info_list);
|
||||
RETURN_FALSE_IF_NULL(lru_upgrade);
|
||||
|
||||
video_widevine_client::sdk::File file;
|
||||
@@ -1713,28 +1712,28 @@ bool DeviceFiles::RetrieveUsageTableInfo(
|
||||
|
||||
*lru_upgrade = !usage_table_info.use_lru();
|
||||
|
||||
*usage_table_header = usage_table_info.usage_table_header();
|
||||
usage_entry_info->resize(usage_table_info.usage_entry_info_size());
|
||||
for (int i = 0; i < usage_table_info.usage_entry_info_size(); ++i) {
|
||||
*table_header = usage_table_info.table_header();
|
||||
entry_info_list->resize(usage_table_info.entry_info_list_size());
|
||||
for (int i = 0; i < usage_table_info.entry_info_list_size(); ++i) {
|
||||
const UsageTableInfo_UsageEntryInfo& info =
|
||||
usage_table_info.usage_entry_info(i);
|
||||
(*usage_entry_info)[i].key_set_id = info.key_set_id();
|
||||
usage_table_info.entry_info_list(i);
|
||||
(*entry_info_list)[i].key_set_id = info.key_set_id();
|
||||
switch (info.storage()) {
|
||||
case UsageTableInfo_UsageEntryInfo_UsageEntryStorage_LICENSE:
|
||||
(*usage_entry_info)[i].storage_type = kStorageLicense;
|
||||
(*usage_entry_info)[i].last_use_time = info.last_use_time();
|
||||
(*usage_entry_info)[i].offline_license_expiry_time =
|
||||
(*entry_info_list)[i].storage_type = kStorageLicense;
|
||||
(*entry_info_list)[i].last_use_time = info.last_use_time();
|
||||
(*entry_info_list)[i].offline_license_expiry_time =
|
||||
info.offline_license_expiry_time();
|
||||
break;
|
||||
case UsageTableInfo_UsageEntryInfo_UsageEntryStorage_USAGE_INFO:
|
||||
(*usage_entry_info)[i].storage_type = kStorageUsageInfo;
|
||||
(*usage_entry_info)[i].usage_info_file_name =
|
||||
(*entry_info_list)[i].storage_type = kStorageUsageInfo;
|
||||
(*entry_info_list)[i].usage_info_file_name =
|
||||
info.usage_info_file_name();
|
||||
(*usage_entry_info)[i].last_use_time = info.last_use_time();
|
||||
(*entry_info_list)[i].last_use_time = info.last_use_time();
|
||||
break;
|
||||
case UsageTableInfo_UsageEntryInfo_UsageEntryStorage_UNKNOWN:
|
||||
default:
|
||||
(*usage_entry_info)[i].storage_type = kStorageTypeUnknown;
|
||||
(*entry_info_list)[i].storage_type = kStorageTypeUnknown;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -75,7 +75,7 @@ message License {
|
||||
// ignored if there is no grace period.
|
||||
optional int64 grace_period_end_time = 11 [default = 0];
|
||||
optional bytes usage_entry = 12;
|
||||
optional int64 usage_entry_number = 13;
|
||||
optional int64 usage_entry_index = 13;
|
||||
optional DeviceCertificate drm_certificate = 14;
|
||||
}
|
||||
|
||||
@@ -88,7 +88,7 @@ message UsageInfo {
|
||||
optional bytes license = 3;
|
||||
optional bytes key_set_id = 4;
|
||||
optional bytes usage_entry = 5;
|
||||
optional int64 usage_entry_number = 6;
|
||||
optional int64 usage_entry_index = 6;
|
||||
// If not present, use the legacy DRM certificate rather than
|
||||
// one in DrmDeviceCertificate
|
||||
optional uint32 drm_certificate_id = 7;
|
||||
@@ -131,8 +131,8 @@ message UsageTableInfo {
|
||||
optional int64 offline_license_expiry_time = 5 [default = 0];
|
||||
}
|
||||
|
||||
optional bytes usage_table_header = 1;
|
||||
repeated UsageEntryInfo usage_entry_info = 2;
|
||||
optional bytes table_header = 1;
|
||||
repeated UsageEntryInfo entry_info_list = 2;
|
||||
optional bool use_lru = 3 [default = false];
|
||||
}
|
||||
|
||||
|
||||
@@ -466,7 +466,7 @@ CdmResponseType CdmLicense::PrepareKeyUpdateRequest(
|
||||
}
|
||||
|
||||
// TODO(rfrias): Refactor to avoid needing to call CdmSession
|
||||
if (cdm_session && cdm_session->supports_usage_info()) {
|
||||
if (cdm_session && cdm_session->SupportsUsageTable()) {
|
||||
const CdmResponseType status = cdm_session->UpdateUsageEntryInformation();
|
||||
if (NO_ERROR != status) return status;
|
||||
}
|
||||
@@ -822,7 +822,7 @@ CdmResponseType CdmLicense::RestoreOfflineLicense(
|
||||
}
|
||||
|
||||
if (!provider_session_token_.empty()) {
|
||||
if (cdm_session && cdm_session->supports_usage_info()) {
|
||||
if (cdm_session && cdm_session->SupportsUsageTable()) {
|
||||
const CdmResponseType status = cdm_session->UpdateUsageEntryInformation();
|
||||
if (NO_ERROR != status) return sts;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user