Add usage support query method
[ Merge of http://go/wvgerrit/23522 ] A helper method has been added to CryptoSession to determine whether the TEE supports usage tables, usage table headers+entries or does not provide any support for persistent licenses. In addition * CryptoSession now supports deletion of multiple usage entries rather than a single one. * Typedefs have been added for usage table headers and entries b/34327459 Test: Verified by unit/integration tests on angler. Change-Id: I634d3b7b81ce94d1deccd2a7aaf26b9efde414a8
This commit is contained in:
@@ -31,6 +31,7 @@ std::string EncodeUint32(unsigned int u) {
|
||||
const uint32_t kRsaSignatureLength = 256;
|
||||
const size_t kMaximumChunkSize = 100 * 1024; // 100 KiB
|
||||
const size_t kEstimatedInitialUsageTableHeader = 40;
|
||||
const size_t kOemCryptoApiVersionSupportsBigUsageTables = 13;
|
||||
}
|
||||
|
||||
namespace wvcdm {
|
||||
@@ -46,6 +47,8 @@ CryptoSession::CryptoSession(metrics::MetricsGroup* metrics)
|
||||
update_usage_table_after_close_session_(false),
|
||||
is_destination_buffer_type_valid_(false),
|
||||
requested_security_level_(kLevelDefault),
|
||||
is_usage_support_type_valid_(false),
|
||||
usage_support_type_(kNonSecureUsageSupport),
|
||||
request_id_base_(0),
|
||||
cipher_mode_(kCipherModeCtr) {
|
||||
Init();
|
||||
@@ -120,24 +123,23 @@ void CryptoSession::Terminate() {
|
||||
}
|
||||
|
||||
bool CryptoSession::GetTokenFromKeybox(std::string* token) {
|
||||
OEMCryptoResult status;
|
||||
std::string temp_buffer(KEYBOX_KEY_DATA_SIZE, '\0');
|
||||
// lock is held by caller
|
||||
size_t buf_size = temp_buffer.size();
|
||||
uint8_t* buf = reinterpret_cast<uint8_t*>(&temp_buffer[0]);
|
||||
|
||||
OEMCryptoResult sts;
|
||||
OEMCryptoResult status;
|
||||
M_TIME(
|
||||
sts = OEMCrypto_GetKeyData(
|
||||
status = OEMCrypto_GetKeyData(
|
||||
buf,
|
||||
&buf_size,
|
||||
requested_security_level_),
|
||||
metrics_,
|
||||
oemcrypto_get_key_data_,
|
||||
sts,
|
||||
status,
|
||||
metrics::Pow2Bucket(buf_size),
|
||||
requested_security_level_);
|
||||
if (OEMCrypto_SUCCESS == sts) {
|
||||
if (OEMCrypto_SUCCESS == status) {
|
||||
token->swap(temp_buffer);
|
||||
return true;
|
||||
}
|
||||
@@ -1811,8 +1813,47 @@ CdmResponseType CryptoSession::GenericVerify(const std::string& message,
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::GetUsageSupportType(
|
||||
CdmUsageSupportType* usage_support_type) {
|
||||
LOGV("GetUsageSupportType: id=%ld", (uint32_t)oec_session_id_);
|
||||
|
||||
if (usage_support_type == NULL) {
|
||||
LOGE("GetUsageSupportType: usage_support_type param not provided");
|
||||
return INVALID_PARAMETERS_ENG_23;
|
||||
}
|
||||
|
||||
if (is_usage_support_type_valid_) {
|
||||
*usage_support_type = usage_support_type_;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
bool has_support = false;
|
||||
if (!UsageInformationSupport(&has_support)) {
|
||||
LOGE("GetUsageSupportType: UsageInformationSupport failed");
|
||||
return USAGE_INFORMATION_SUPPORT_FAILED;
|
||||
}
|
||||
|
||||
if (!has_support) {
|
||||
*usage_support_type = usage_support_type_ = kNonSecureUsageSupport;
|
||||
is_usage_support_type_valid_ = true;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
uint32_t api_version = 0;
|
||||
if (!GetApiVersion(&api_version)) {
|
||||
LOGE("GetUsageSupportType: GetApiVersion failed");
|
||||
return USAGE_SUPPORT_GET_API_FAILED;
|
||||
}
|
||||
|
||||
*usage_support_type = usage_support_type_ =
|
||||
(api_version >= kOemCryptoApiVersionSupportsBigUsageTables) ?
|
||||
kUsageEntrySupport : kUsageTableSupport;
|
||||
is_usage_support_type_valid_ = true;
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::CreateUsageTableHeader(
|
||||
std::string* usage_table_header) {
|
||||
CdmUsageTableHeader* usage_table_header) {
|
||||
LOGV("CreateUsageTableHeader: id=%ld", (uint32_t)oec_session_id_);
|
||||
|
||||
if (usage_table_header == NULL) {
|
||||
@@ -1848,7 +1889,7 @@ CdmResponseType CryptoSession::CreateUsageTableHeader(
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::LoadUsageTableHeader(
|
||||
const std::string& usage_table_header) {
|
||||
const CdmUsageTableHeader& usage_table_header) {
|
||||
LOGV("LoadUsageTableHeader: id=%ld", (uint32_t)oec_session_id_);
|
||||
|
||||
OEMCryptoResult result = OEMCrypto_LoadUsageTableHeader(
|
||||
@@ -1908,8 +1949,9 @@ CdmResponseType CryptoSession::CreateUsageEntry(uint32_t* entry_number) {
|
||||
}
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::LoadUsageEntry(uint32_t entry_number,
|
||||
const std::string& usage_entry) {
|
||||
CdmResponseType CryptoSession::LoadUsageEntry(
|
||||
uint32_t entry_number,
|
||||
const CdmUsageEntry& usage_entry) {
|
||||
LOGV("LoadUsageEntry: id=%ld", (uint32_t)oec_session_id_);
|
||||
|
||||
OEMCryptoResult result = OEMCrypto_LoadUsageEntry(
|
||||
@@ -1937,8 +1979,9 @@ CdmResponseType CryptoSession::LoadUsageEntry(uint32_t entry_number,
|
||||
}
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::UpdateUsageEntry(std::string* usage_table_header,
|
||||
std::string* usage_entry) {
|
||||
CdmResponseType CryptoSession::UpdateUsageEntry(
|
||||
CdmUsageTableHeader* usage_table_header,
|
||||
CdmUsageEntry* usage_entry) {
|
||||
LOGV("UpdateUsageEntry: id=%ld", (uint32_t)oec_session_id_);
|
||||
|
||||
if (usage_table_header == NULL) {
|
||||
@@ -1979,27 +2022,26 @@ CdmResponseType CryptoSession::UpdateUsageEntry(std::string* usage_table_header,
|
||||
return NO_ERROR;
|
||||
}
|
||||
|
||||
CdmResponseType CryptoSession::DecrementUsageTableHeaderSize(
|
||||
uint32_t current_usage_table_size, std::string* usage_table_header) {
|
||||
LOGV("DecrementUsageTableHeaderSize: id=%ld", (uint32_t)oec_session_id_);
|
||||
CdmResponseType CryptoSession::ShrinkUsageTableHeader(
|
||||
uint32_t new_entry_count, CdmUsageTableHeader* usage_table_header) {
|
||||
LOGV("ShrinkUsageTableHeader: id=%ld", (uint32_t)oec_session_id_);
|
||||
|
||||
if (usage_table_header == NULL) {
|
||||
LOGE(
|
||||
"DecrementUsageTableHeaderSize: usage_table_header param not "
|
||||
"provided");
|
||||
"ShrinkUsageTableHeader: usage_table_header param not provided");
|
||||
return INVALID_PARAMETERS_ENG_21;
|
||||
}
|
||||
|
||||
size_t usage_table_header_len = 0;
|
||||
OEMCryptoResult result = OEMCrypto_ShrinkUsageTableHeader(
|
||||
requested_security_level_, current_usage_table_size, NULL,
|
||||
requested_security_level_, new_entry_count, NULL,
|
||||
&usage_table_header_len);
|
||||
|
||||
if (result == OEMCrypto_ERROR_SHORT_BUFFER) {
|
||||
usage_table_header->resize(usage_table_header_len);
|
||||
|
||||
result = OEMCrypto_ShrinkUsageTableHeader(
|
||||
requested_security_level_, --current_usage_table_size,
|
||||
requested_security_level_, new_entry_count,
|
||||
reinterpret_cast<uint8_t*>(
|
||||
const_cast<char*>(usage_table_header->data())),
|
||||
&usage_table_header_len);
|
||||
@@ -2007,8 +2049,7 @@ CdmResponseType CryptoSession::DecrementUsageTableHeaderSize(
|
||||
|
||||
if (result != OEMCrypto_SUCCESS) {
|
||||
LOGE(
|
||||
"DecrementUsageTableHeaderSize: OEMCrypto_ShrinkUsageTableHeader "
|
||||
"error: %d",
|
||||
"ShrinkUsageTableHeader: OEMCrypto_ShrinkUsageTableHeader error: %d",
|
||||
result);
|
||||
return SHRINK_USAGE_TABLER_HEADER_UNKNOWN_ERROR;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user