Merge "Renaming of Usage Table related variables and types."
This commit is contained in:
committed by
Android (Google) Code Review
commit
d933e34824
@@ -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);
|
||||
@@ -1661,7 +1661,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
|
||||
@@ -1676,7 +1676,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",
|
||||
@@ -1739,21 +1739,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);
|
||||
@@ -1820,7 +1820,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);
|
||||
@@ -2149,7 +2149,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();
|
||||
@@ -1015,8 +1015,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;
|
||||
@@ -1039,7 +1039,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;
|
||||
@@ -1240,15 +1240,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);
|
||||
|
||||
@@ -1264,8 +1264,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();
|
||||
@@ -1290,14 +1290,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);
|
||||
|
||||
@@ -1314,8 +1314,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();
|
||||
@@ -1359,7 +1359,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;
|
||||
@@ -1404,7 +1404,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;
|
||||
@@ -1453,8 +1453,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();
|
||||
@@ -1495,8 +1495,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();
|
||||
@@ -1634,8 +1634,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
|
||||
@@ -1645,25 +1645,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:
|
||||
@@ -1682,11 +1681,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;
|
||||
@@ -1718,28 +1717,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