This CL adds usage tables to the OEMCrypto reference implementation (mock) and unit tests. There is also a new parameter called oem_crypto_require_usage_tables that determines if the usage tables are required or not. This is set to true for Android and false for all other platforms. This CL is most of OEMCrypto version 9 updates. This CL is a copy of https://widevine-internal-review.googlesource.com/#/c/9720 https://widevine-internal-review.googlesource.com/#/c/9874 https://widevine-internal-review.googlesource.com/#/c/9873 Change-Id: I78c4f7651306f9f79ba2260c3e04fb1eca7e20e3
123 lines
4.2 KiB
C++
123 lines
4.2 KiB
C++
// Copyright 2013 Google Inc. All Rights Reserved.
|
|
|
|
#include "log.h"
|
|
#include "properties_configuration.h"
|
|
#include "wv_cdm_constants.h"
|
|
|
|
namespace {
|
|
const char* kSecurityLevelDirs[] = {"L1/", "L3/"};
|
|
} // namespace
|
|
|
|
namespace wvcdm {
|
|
bool Properties::begin_license_usage_when_received_;
|
|
bool Properties::require_explicit_renew_request_;
|
|
bool Properties::oem_crypto_use_secure_buffers_;
|
|
bool Properties::oem_crypto_use_fifo_;
|
|
bool Properties::oem_crypto_use_userspace_buffers_;
|
|
bool Properties::oem_crypto_require_usage_tables_;
|
|
bool Properties::use_certificates_as_identification_;
|
|
bool Properties::decrypt_with_empty_session_support_;
|
|
bool Properties::security_level_path_backward_compatibility_support_;
|
|
scoped_ptr<CdmClientPropertySetMap> Properties::session_property_set_;
|
|
|
|
void Properties::Init() {
|
|
begin_license_usage_when_received_ = kPropertyBeginLicenseUsageWhenReceived;
|
|
require_explicit_renew_request_ = kPropertyRequireExplicitRenewRequest;
|
|
oem_crypto_use_secure_buffers_ = kPropertyOemCryptoUseSecureBuffers;
|
|
oem_crypto_use_fifo_ = kPropertyOemCryptoUseFifo;
|
|
oem_crypto_use_userspace_buffers_ = kPropertyOemCryptoUseUserSpaceBuffers;
|
|
oem_crypto_require_usage_tables_ = kPropertyOemCryptoRequireUsageTable;
|
|
use_certificates_as_identification_ =
|
|
kPropertyUseCertificatesAsIdentification;
|
|
decrypt_with_empty_session_support_ = kDecryptWithEmptySessionSupport;
|
|
security_level_path_backward_compatibility_support_ =
|
|
kSecurityLevelPathBackwardCompatibilitySupport;
|
|
session_property_set_.reset(new CdmClientPropertySetMap());
|
|
}
|
|
|
|
bool Properties::AddSessionPropertySet(
|
|
const CdmSessionId& session_id, const CdmClientPropertySet* property_set) {
|
|
if (NULL == session_property_set_.get()) {
|
|
return false;
|
|
}
|
|
std::pair<CdmClientPropertySetMap::iterator, bool> result =
|
|
session_property_set_->insert(
|
|
std::pair<const CdmSessionId, const CdmClientPropertySet*>(
|
|
session_id, property_set));
|
|
return result.second;
|
|
}
|
|
|
|
bool Properties::RemoveSessionPropertySet(const CdmSessionId& session_id) {
|
|
if (NULL == session_property_set_.get()) {
|
|
return false;
|
|
}
|
|
return (1 == session_property_set_->erase(session_id));
|
|
}
|
|
|
|
const CdmClientPropertySet* Properties::GetCdmClientPropertySet(
|
|
const CdmSessionId& session_id) {
|
|
if (NULL != session_property_set_.get()) {
|
|
CdmClientPropertySetMap::const_iterator it =
|
|
session_property_set_->find(session_id);
|
|
if (it != session_property_set_->end()) {
|
|
return it->second;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
const std::string Properties::GetSecurityLevel(const CdmSessionId& session_id) {
|
|
const CdmClientPropertySet* property_set =
|
|
GetCdmClientPropertySet(session_id);
|
|
if (NULL == property_set) {
|
|
LOGE("Properties::GetSecurityLevel: cannot find property set for %s",
|
|
session_id.c_str());
|
|
return "";
|
|
}
|
|
return property_set->security_level();
|
|
}
|
|
|
|
const std::vector<uint8_t> Properties::GetServiceCertificate(
|
|
const CdmSessionId& session_id) {
|
|
const CdmClientPropertySet* property_set =
|
|
GetCdmClientPropertySet(session_id);
|
|
if (NULL == property_set) {
|
|
LOGE("Properties::GetServiceCertificate: cannot find property set for %s",
|
|
session_id.c_str());
|
|
return std::vector<uint8_t>();
|
|
}
|
|
return property_set->service_certificate();
|
|
}
|
|
|
|
bool Properties::UsePrivacyMode(const CdmSessionId& session_id) {
|
|
const CdmClientPropertySet* property_set =
|
|
GetCdmClientPropertySet(session_id);
|
|
if (NULL == property_set) {
|
|
LOGE("Properties::UsePrivacyMode: cannot find property set for %s",
|
|
session_id.c_str());
|
|
return false;
|
|
}
|
|
return property_set->use_privacy_mode();
|
|
}
|
|
|
|
uint32_t Properties::GetSessionSharingId(const CdmSessionId& session_id) {
|
|
const CdmClientPropertySet* property_set =
|
|
GetCdmClientPropertySet(session_id);
|
|
if (NULL == property_set) {
|
|
LOGE("Properties::GetSessionSharingId: cannot find property set for %s",
|
|
session_id.c_str());
|
|
return 0;
|
|
}
|
|
return property_set->session_sharing_id();
|
|
}
|
|
|
|
bool Properties::GetSecurityLevelDirectories(std::vector<std::string>* dirs) {
|
|
dirs->resize(sizeof(kSecurityLevelDirs) / sizeof(const char*));
|
|
for (size_t i = 0; i < dirs->size(); ++i) {
|
|
(*dirs)[i] = kSecurityLevelDirs[i];
|
|
}
|
|
return true;
|
|
}
|
|
|
|
} // namespace wvcdm
|