Source release 15.2.0
This commit is contained in:
@@ -7,8 +7,7 @@
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#include "cdm_engine.h"
|
||||
#include "clock.h"
|
||||
@@ -24,7 +23,7 @@ namespace {
|
||||
const size_t kKeySetIdLength = 14;
|
||||
|
||||
// Helper function for setting the error detail value.
|
||||
template<typename T>
|
||||
template <typename T>
|
||||
void SetErrorDetail(int* error_detail, T error_code) {
|
||||
if (error_detail != nullptr) {
|
||||
*error_detail = error_code;
|
||||
@@ -64,8 +63,7 @@ CdmSession::CdmSession(FileSystem* file_system,
|
||||
|
||||
CdmSession::~CdmSession() {
|
||||
if (usage_support_type_ == kUsageEntrySupport &&
|
||||
has_provider_session_token() &&
|
||||
usage_table_header_ != NULL &&
|
||||
has_provider_session_token() && usage_table_header_ != NULL &&
|
||||
!is_release_) {
|
||||
UpdateUsageEntryInformation();
|
||||
}
|
||||
@@ -108,8 +106,8 @@ CdmResponseType CdmSession::Init(CdmClientPropertySet* cdm_client_property_set,
|
||||
security_level_ = crypto_session_->GetSecurityLevel();
|
||||
crypto_metrics_->crypto_session_security_level_.Record(security_level_);
|
||||
std::string oemcrypto_build;
|
||||
if(crypto_session_->GetBuildInformation(requested_security_level_,
|
||||
&oemcrypto_build)) {
|
||||
if (crypto_session_->GetBuildInformation(requested_security_level_,
|
||||
&oemcrypto_build)) {
|
||||
metrics_->oemcrypto_build_info_.Record(oemcrypto_build);
|
||||
} else {
|
||||
metrics_->oemcrypto_build_info_.SetError(false);
|
||||
@@ -153,7 +151,8 @@ CdmResponseType CdmSession::Init(CdmClientPropertySet* cdm_client_property_set,
|
||||
crypto_metrics_, crypto_session_load_certificate_private_key_,
|
||||
load_cert_sts);
|
||||
switch (load_cert_sts) {
|
||||
case NO_ERROR: break;
|
||||
case NO_ERROR:
|
||||
break;
|
||||
case SESSION_LOST_STATE_ERROR:
|
||||
case SYSTEM_INVALIDATED_ERROR:
|
||||
return load_cert_sts;
|
||||
@@ -208,9 +207,9 @@ CdmResponseType CdmSession::Init(CdmClientPropertySet* cdm_client_property_set,
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
CdmResponseType CdmSession::RestoreOfflineSession(
|
||||
const CdmKeySetId& key_set_id, CdmLicenseType license_type,
|
||||
int* error_detail) {
|
||||
CdmResponseType CdmSession::RestoreOfflineSession(const CdmKeySetId& key_set_id,
|
||||
CdmLicenseType license_type,
|
||||
int* error_detail) {
|
||||
if (!initialized_) {
|
||||
LOGE("CdmSession::RestoreOfflineSession: not initialized");
|
||||
return NOT_INITIALIZED_ERROR;
|
||||
@@ -238,7 +237,8 @@ CdmResponseType CdmSession::RestoreOfflineSession(
|
||||
"sub error: %d, key set id = %s",
|
||||
sub_error_code, key_set_id.c_str());
|
||||
SetErrorDetail(error_detail, sub_error_code);
|
||||
return GET_LICENSE_ERROR;
|
||||
return sub_error_code == DeviceFiles::kFileNotFound ? KEYSET_ID_NOT_FOUND_4
|
||||
: GET_LICENSE_ERROR;
|
||||
}
|
||||
|
||||
// Attempts to restore a released offline license are treated as a release
|
||||
@@ -340,8 +340,8 @@ CdmResponseType CdmSession::RestoreUsageSession(
|
||||
CdmResponseType sts = NO_ERROR;
|
||||
if (usage_support_type_ == kUsageEntrySupport &&
|
||||
usage_table_header_ != NULL) {
|
||||
sts = usage_table_header_->LoadEntry(
|
||||
crypto_session_.get(), usage_entry_, usage_entry_number_);
|
||||
sts = usage_table_header_->LoadEntry(crypto_session_.get(), usage_entry_,
|
||||
usage_entry_number_);
|
||||
crypto_metrics_->usage_table_header_load_entry_.Increment(sts);
|
||||
if (sts != NO_ERROR) {
|
||||
LOGE("CdmSession::RestoreUsageSession: failed to load usage entry = %d",
|
||||
@@ -390,16 +390,14 @@ CdmResponseType CdmSession::GenerateKeyRequest(
|
||||
// for calling GenerateReleaseRequest and GenerateRenewalRequest.
|
||||
if (result == KEY_MESSAGE) {
|
||||
key_request_type_ = key_request->type;
|
||||
license_request_latency_.Start(); // Start or restart timer.
|
||||
license_request_latency_.Start(); // Start or restart timer.
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
CdmResponseType CdmSession::GenerateKeyRequestInternal(
|
||||
const InitializationData& init_data, CdmLicenseType license_type,
|
||||
const CdmAppParameterMap& app_parameters,
|
||||
CdmKeyRequest* key_request) {
|
||||
|
||||
const CdmAppParameterMap& app_parameters, CdmKeyRequest* key_request) {
|
||||
if (!initialized_) {
|
||||
LOGE("CdmSession::GenerateKeyRequest: not initialized");
|
||||
return NOT_INITIALIZED_ERROR;
|
||||
@@ -423,10 +421,12 @@ CdmResponseType CdmSession::GenerateKeyRequestInternal(
|
||||
case kLicenseTypeRelease:
|
||||
is_release_ = true;
|
||||
break;
|
||||
// TODO(jfore): CdmSession assumes a call to this method once a license has
|
||||
// been received is a call to generate a license renewal message. Use of
|
||||
// this enum differentiates the two calls. See "else if (license_received_)"
|
||||
// below.
|
||||
// TODO(b/132071885): Once a license has been received, CdmSession assumes
|
||||
// that a call to this method is to generate a license renewal/release
|
||||
// or key rotation. Key rotation can be indicated by specifing a license
|
||||
// type kLicenseTypeEmbeddedKeyData or interrogating the PSSH
|
||||
// (See "else if (license_received_)" below). b/132071885 is to evaluate
|
||||
// whether both mechanisms are needed.
|
||||
case kLicenseTypeEmbeddedKeyData:
|
||||
return license_parser_->HandleEmbeddedKeyData(init_data);
|
||||
default:
|
||||
@@ -437,8 +437,17 @@ CdmResponseType CdmSession::GenerateKeyRequestInternal(
|
||||
|
||||
if (is_release_) {
|
||||
return GenerateReleaseRequest(key_request);
|
||||
} else if (license_received_) { // renewal
|
||||
return GenerateRenewalRequest(key_request);
|
||||
} else if (license_received_) {
|
||||
// A call to GenerateKeyRequest after the initial license has been received
|
||||
// is either a renewal/release request or a key rotation event
|
||||
if (init_data.contains_entitled_keys()) {
|
||||
key_request->message.clear();
|
||||
key_request->type = kKeyRequestTypeNone;
|
||||
key_request->url.clear();
|
||||
return license_parser_->HandleEmbeddedKeyData(init_data);
|
||||
} else {
|
||||
return GenerateRenewalRequest(key_request);
|
||||
}
|
||||
} else {
|
||||
key_request->type = kKeyRequestTypeInitial;
|
||||
|
||||
@@ -515,7 +524,8 @@ CdmResponseType CdmSession::AddKeyInternal(const CdmKeyResponse& key_response) {
|
||||
// Update the license sdk and service versions.
|
||||
const VersionInfo& version_info = license_parser_->GetServiceVersion();
|
||||
metrics_->license_sdk_version_.Record(version_info.license_sdk_version());
|
||||
metrics_->license_sdk_version_.Record(version_info.license_service_version());
|
||||
metrics_->license_sdk_version_.Record(
|
||||
version_info.license_service_version());
|
||||
|
||||
// Update or delete entry if usage table header+entries are supported
|
||||
if (usage_support_type_ == kUsageEntrySupport &&
|
||||
@@ -605,9 +615,8 @@ CdmResponseType CdmSession::QueryOemCryptoSessionId(
|
||||
return NOT_INITIALIZED_ERROR;
|
||||
}
|
||||
|
||||
std::stringstream ss;
|
||||
ss << crypto_session_->oec_session_id();
|
||||
(*query_response)[QUERY_KEY_OEMCRYPTO_SESSION_ID] = ss.str();
|
||||
(*query_response)[QUERY_KEY_OEMCRYPTO_SESSION_ID] =
|
||||
std::to_string(crypto_session_->oec_session_id());
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
@@ -628,8 +637,7 @@ CdmResponseType CdmSession::Decrypt(const CdmDecryptionParameters& params) {
|
||||
return INSUFFICIENT_OUTPUT_PROTECTION;
|
||||
return NEED_KEY;
|
||||
}
|
||||
if (!policy_engine_->CanUseKeyForSecurityLevel(*params.key_id,
|
||||
security_level_)) {
|
||||
if (!policy_engine_->CanUseKeyForSecurityLevel(*params.key_id)) {
|
||||
return KEY_PROHIBITED_FOR_SECURITY_LEVEL;
|
||||
}
|
||||
}
|
||||
@@ -674,7 +682,7 @@ CdmResponseType CdmSession::GenerateRenewalRequest(CdmKeyRequest* key_request) {
|
||||
offline_key_renewal_request_ = key_request->message;
|
||||
}
|
||||
key_request_type_ = key_request->type;
|
||||
license_request_latency_.Start(); // Start or restart timer.
|
||||
license_request_latency_.Start(); // Start or restart timer.
|
||||
return KEY_MESSAGE;
|
||||
}
|
||||
|
||||
@@ -740,7 +748,7 @@ CdmResponseType CdmSession::GenerateReleaseRequest(CdmKeyRequest* key_request) {
|
||||
}
|
||||
|
||||
key_request_type_ = key_request->type;
|
||||
license_request_latency_.Start(); // Start or restart timer.
|
||||
license_request_latency_.Start(); // Start or restart timer.
|
||||
|
||||
return KEY_MESSAGE;
|
||||
}
|
||||
@@ -795,8 +803,8 @@ CdmResponseType CdmSession::DeleteUsageEntry(uint32_t usage_entry_number) {
|
||||
return INCORRECT_USAGE_SUPPORT_TYPE_1;
|
||||
}
|
||||
|
||||
sts = usage_table_header_->DeleteEntry(usage_entry_number,
|
||||
file_handle_.get(), crypto_metrics_);
|
||||
sts = usage_table_header_->DeleteEntry(usage_entry_number, file_handle_.get(),
|
||||
crypto_metrics_);
|
||||
crypto_metrics_->usage_table_header_delete_entry_.Increment(sts);
|
||||
return sts;
|
||||
}
|
||||
@@ -825,8 +833,8 @@ bool CdmSession::GenerateKeySetId(CdmKeySetId* key_set_id) {
|
||||
(kKeySetIdLength - sizeof(KEY_SET_ID_PREFIX)) / 2, 0);
|
||||
|
||||
while (key_set_id->empty()) {
|
||||
if (crypto_session_->GetRandom(random_data.size(), &random_data[0])
|
||||
!= NO_ERROR) {
|
||||
if (crypto_session_->GetRandom(random_data.size(), &random_data[0]) !=
|
||||
NO_ERROR) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -896,8 +904,7 @@ CdmResponseType CdmSession::StoreLicense() {
|
||||
}
|
||||
std::vector<std::string> provider_session_tokens;
|
||||
file_handle_->DeleteAllUsageInfoForApp(
|
||||
DeviceFiles::GetUsageInfoFileName(app_id),
|
||||
&provider_session_tokens);
|
||||
DeviceFiles::GetUsageInfoFileName(app_id), &provider_session_tokens);
|
||||
|
||||
return STORE_USAGE_INFO_ERROR;
|
||||
}
|
||||
@@ -924,21 +931,16 @@ CdmResponseType CdmSession::RemoveKeys() {
|
||||
CdmResponseType sts;
|
||||
crypto_session_.reset(CryptoSession::MakeCryptoSession(crypto_metrics_));
|
||||
// Ignore errors
|
||||
M_TIME(
|
||||
sts = crypto_session_->Open(requested_security_level_),
|
||||
crypto_metrics_,
|
||||
crypto_session_open_,
|
||||
sts,
|
||||
requested_security_level_);
|
||||
policy_engine_.reset(new PolicyEngine(
|
||||
session_id_, NULL, crypto_session_.get()));
|
||||
M_TIME(sts = crypto_session_->Open(requested_security_level_),
|
||||
crypto_metrics_, crypto_session_open_, sts, requested_security_level_);
|
||||
policy_engine_.reset(
|
||||
new PolicyEngine(session_id_, NULL, crypto_session_.get()));
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
CdmResponseType CdmSession::RemoveLicense() {
|
||||
CdmResponseType sts = NO_ERROR;
|
||||
if (is_offline_ || has_provider_session_token()) {
|
||||
|
||||
if (usage_support_type_ == kUsageEntrySupport &&
|
||||
has_provider_session_token()) {
|
||||
sts = DeleteUsageEntry(usage_entry_number_);
|
||||
@@ -1048,7 +1050,8 @@ CdmResponseType CdmSession::UpdateUsageEntryInformation() {
|
||||
|
||||
if (is_offline_)
|
||||
StoreLicense(is_release_ ? DeviceFiles::kLicenseStateReleasing
|
||||
: DeviceFiles::kLicenseStateActive, nullptr);
|
||||
: DeviceFiles::kLicenseStateActive,
|
||||
nullptr);
|
||||
else if (!usage_provider_session_token_.empty())
|
||||
UpdateUsageInfo();
|
||||
|
||||
@@ -1122,8 +1125,7 @@ CdmResponseType CdmSession::SetDecryptHash(uint32_t frame_number,
|
||||
return crypto_session_->SetDecryptHash(frame_number, hash);
|
||||
}
|
||||
|
||||
CdmResponseType CdmSession::GetDecryptHashError(
|
||||
std::string* error_string) {
|
||||
CdmResponseType CdmSession::GetDecryptHashError(std::string* error_string) {
|
||||
return crypto_session_->GetDecryptHashError(error_string);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user