Merge "Android CDM: Restored secure stop tests." into udc-dev
This commit is contained in:
@@ -214,17 +214,17 @@ class CdmEngine {
|
||||
|
||||
// Return the list of IDs associated with usage records for the
|
||||
// current (origin-specific) file system. At least one parameter
|
||||
// |ksids| or |provider_session_tokens| needs to be supplied.
|
||||
virtual CdmResponseType ListUsageIds(
|
||||
const std::string& app_id, CdmSecurityLevel security_level,
|
||||
std::vector<std::string>* ksids,
|
||||
std::vector<std::string>* provider_session_tokens);
|
||||
// |ksids| or |psts| needs to be supplied.
|
||||
virtual CdmResponseType ListUsageIds(const std::string& app_id,
|
||||
CdmSecurityLevel security_level,
|
||||
std::vector<CdmKeySetId>* ksids,
|
||||
std::vector<CdmSecureStopId>* psts);
|
||||
|
||||
// Delete the usage record for the given key_set_id. This removes the
|
||||
// usage record in the file system and the OEMCrypto usage record.
|
||||
virtual CdmResponseType DeleteUsageRecord(const std::string& app_id,
|
||||
CdmSecurityLevel security_level,
|
||||
const std::string& key_set_id);
|
||||
const CdmKeySetId& key_set_id);
|
||||
|
||||
// Get offline license status: active, release or unknown
|
||||
virtual CdmResponseType GetOfflineLicenseState(
|
||||
@@ -245,7 +245,7 @@ class CdmEngine {
|
||||
// in the event of an error.
|
||||
virtual CdmResponseType GetUsageInfo(const std::string& app_id,
|
||||
int* error_detail,
|
||||
CdmUsageInfo* usage_info);
|
||||
CdmUsageReport* usage_report);
|
||||
|
||||
// Retrieve usage info whose PST is specified by |ssid|
|
||||
// If |error_detail| is not null, an additional error code may be provided
|
||||
@@ -253,7 +253,7 @@ class CdmEngine {
|
||||
virtual CdmResponseType GetUsageInfo(const std::string& app_id,
|
||||
const CdmSecureStopId& ssid,
|
||||
int* error_detail,
|
||||
CdmUsageInfo* usage_info);
|
||||
CdmUsageReport* usage_report);
|
||||
|
||||
// Retrieve usage info for a given security level and whose
|
||||
// PST is specified by |ssid|.
|
||||
@@ -263,7 +263,7 @@ class CdmEngine {
|
||||
const CdmSecureStopId& ssid,
|
||||
RequestedSecurityLevel security_level,
|
||||
int* error_detail,
|
||||
CdmUsageInfo* usage_info);
|
||||
CdmUsageReport* usage_report);
|
||||
|
||||
// Remove all usage records for the current origin.
|
||||
virtual CdmResponseType RemoveAllUsageInfo(const std::string& app_id,
|
||||
@@ -276,8 +276,7 @@ class CdmEngine {
|
||||
virtual CdmResponseType RemoveUsageInfo(
|
||||
const std::string& app_id, const CdmSecureStopId& secure_stop_id);
|
||||
|
||||
virtual CdmResponseType ReleaseUsageInfo(
|
||||
const CdmUsageInfoReleaseMessage& message);
|
||||
virtual CdmResponseType ReleaseUsageInfo(const CdmKeyResponse& message);
|
||||
virtual CdmResponseType LoadUsageSession(const CdmKeySetId& key_set_id,
|
||||
CdmKeyMessage* release_message);
|
||||
|
||||
@@ -412,7 +411,7 @@ class CdmEngine {
|
||||
bool ValidateKeySystem(const CdmKeySystem& key_system);
|
||||
CdmResponseType GetUsageInfo(const std::string& app_id,
|
||||
RequestedSecurityLevel requested_security_level,
|
||||
int* error_detail, CdmUsageInfo* usage_info);
|
||||
int* error_detail, CdmUsageReport* usage_report);
|
||||
|
||||
void OnKeyReleaseEvent(const CdmKeySetId& key_set_id);
|
||||
|
||||
|
||||
@@ -184,10 +184,10 @@ class CdmEngineMetricsImpl : public T {
|
||||
}
|
||||
|
||||
CdmResponseType GetUsageInfo(const std::string& app_id, int* error_detail,
|
||||
CdmUsageInfo* usage_info) override {
|
||||
CdmUsageReport* usage_report) override {
|
||||
CdmResponseType sts;
|
||||
int error_detail_alt;
|
||||
M_TIME(sts = T::GetUsageInfo(app_id, &error_detail_alt, usage_info),
|
||||
M_TIME(sts = T::GetUsageInfo(app_id, &error_detail_alt, usage_report),
|
||||
metrics_, cdm_engine_get_usage_info_, sts, error_detail_alt);
|
||||
if (error_detail != nullptr) {
|
||||
*error_detail = error_detail_alt;
|
||||
@@ -197,10 +197,10 @@ class CdmEngineMetricsImpl : public T {
|
||||
|
||||
CdmResponseType GetUsageInfo(const std::string& app_id,
|
||||
const CdmSecureStopId& ssid, int* error_detail,
|
||||
CdmUsageInfo* usage_info) override {
|
||||
CdmUsageReport* usage_report) override {
|
||||
CdmResponseType sts;
|
||||
int error_detail_alt;
|
||||
M_TIME(sts = T::GetUsageInfo(app_id, ssid, &error_detail_alt, usage_info),
|
||||
M_TIME(sts = T::GetUsageInfo(app_id, ssid, &error_detail_alt, usage_report),
|
||||
metrics_, cdm_engine_get_usage_info_, sts, error_detail_alt);
|
||||
if (error_detail != nullptr) {
|
||||
*error_detail = error_detail_alt;
|
||||
@@ -209,14 +209,14 @@ class CdmEngineMetricsImpl : public T {
|
||||
}
|
||||
|
||||
CdmResponseType RemoveAllUsageInfo(const std::string& app_id) override {
|
||||
CdmResponseType sts = T::RemoveAllUsageInfo(app_id);
|
||||
const CdmResponseType sts = T::RemoveAllUsageInfo(app_id);
|
||||
metrics_->cdm_engine_remove_all_usage_info_.Increment(sts);
|
||||
return sts;
|
||||
}
|
||||
|
||||
CdmResponseType RemoveAllUsageInfo(const std::string& app_id,
|
||||
CdmSecurityLevel security_level) override {
|
||||
CdmResponseType sts = T::RemoveAllUsageInfo(app_id, security_level);
|
||||
const CdmResponseType sts = T::RemoveAllUsageInfo(app_id, security_level);
|
||||
metrics_->cdm_engine_remove_all_usage_info_.Increment(sts);
|
||||
return sts;
|
||||
}
|
||||
@@ -224,24 +224,23 @@ class CdmEngineMetricsImpl : public T {
|
||||
CdmResponseType RemoveUsageInfo(
|
||||
const std::string& app_id,
|
||||
const CdmSecureStopId& secure_stop_id) override {
|
||||
CdmResponseType sts = T::RemoveUsageInfo(app_id, secure_stop_id);
|
||||
const CdmResponseType sts = T::RemoveUsageInfo(app_id, secure_stop_id);
|
||||
metrics_->cdm_engine_remove_usage_info_.Increment(sts);
|
||||
return sts;
|
||||
}
|
||||
|
||||
CdmResponseType ReleaseUsageInfo(
|
||||
const CdmUsageInfoReleaseMessage& message) override {
|
||||
CdmResponseType sts = T::ReleaseUsageInfo(message);
|
||||
CdmResponseType ReleaseUsageInfo(const CdmKeyResponse& message) override {
|
||||
const CdmResponseType sts = T::ReleaseUsageInfo(message);
|
||||
metrics_->cdm_engine_release_usage_info_.Increment(sts);
|
||||
return sts;
|
||||
}
|
||||
|
||||
CdmResponseType ListUsageIds(
|
||||
const std::string& app_id, CdmSecurityLevel security_level,
|
||||
std::vector<std::string>* ksids,
|
||||
std::vector<std::string>* provider_session_tokens) override {
|
||||
CdmResponseType sts =
|
||||
T::ListUsageIds(app_id, security_level, ksids, provider_session_tokens);
|
||||
CdmResponseType ListUsageIds(const std::string& app_id,
|
||||
CdmSecurityLevel security_level,
|
||||
std::vector<CdmKeySetId>* ksids,
|
||||
std::vector<CdmSecureStopId>* ssids) override {
|
||||
const CdmResponseType sts =
|
||||
T::ListUsageIds(app_id, security_level, ksids, ssids);
|
||||
metrics_->cdm_engine_get_secure_stop_ids_.Increment(sts);
|
||||
return sts;
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@ using CdmInitData = std::string;
|
||||
using CdmKeyMessage = std::string;
|
||||
using CdmKeyResponse = std::string;
|
||||
using KeyId = std::string;
|
||||
using CdmSecureStopId = std::string;
|
||||
using CdmSessionId = std::string;
|
||||
using CdmKeySetId = std::string;
|
||||
using RequestId = std::string;
|
||||
@@ -39,6 +38,11 @@ using UsageTableHeader = std::string;
|
||||
using UsageEntry = std::string;
|
||||
using UsageEntryIndex = uint32_t;
|
||||
|
||||
// Secure stop related data types.
|
||||
using CdmSecureStopId = std::string;
|
||||
using CdmUsageReport = std::string;
|
||||
using CdmUsageReportList = std::vector<std::string>;
|
||||
|
||||
enum CdmKeyRequestType : uint32_t {
|
||||
kKeyRequestTypeUnknown,
|
||||
kKeyRequestTypeInitial,
|
||||
|
||||
@@ -1302,12 +1302,12 @@ CdmResponseType CdmEngine::ListStoredLicenses(
|
||||
return CdmResponseType(NO_ERROR);
|
||||
}
|
||||
|
||||
CdmResponseType CdmEngine::ListUsageIds(
|
||||
const std::string& app_id, CdmSecurityLevel security_level,
|
||||
std::vector<std::string>* ksids,
|
||||
std::vector<std::string>* provider_session_tokens) {
|
||||
if (!ksids && !provider_session_tokens) {
|
||||
LOGE("Outputs |ksids| and |provider_session_tokens| are null");
|
||||
CdmResponseType CdmEngine::ListUsageIds(const std::string& app_id,
|
||||
CdmSecurityLevel security_level,
|
||||
std::vector<CdmKeySetId>* ksids,
|
||||
std::vector<CdmSecureStopId>* psts) {
|
||||
if (!ksids && !psts) {
|
||||
LOGE("Outputs |ksids| and |psts| are null");
|
||||
return CdmResponseType(INVALID_PARAMETERS_ENG_23);
|
||||
}
|
||||
if (security_level == kSecurityLevelL1 && OkpIsInFallbackMode()) {
|
||||
@@ -1319,7 +1319,7 @@ CdmResponseType CdmEngine::ListUsageIds(
|
||||
LOGE("Unable to initialize device files");
|
||||
return CdmResponseType(LIST_USAGE_ERROR_1);
|
||||
}
|
||||
if (!handle.ListUsageIds(app_id, ksids, provider_session_tokens)) {
|
||||
if (!handle.ListUsageIds(app_id, ksids, psts)) {
|
||||
LOGE("Failed: app_id = %s, security_level = %s", IdToString(app_id),
|
||||
CdmSecurityLevelToString(security_level));
|
||||
return CdmResponseType(LIST_USAGE_ERROR_2);
|
||||
@@ -1329,7 +1329,7 @@ CdmResponseType CdmEngine::ListUsageIds(
|
||||
|
||||
CdmResponseType CdmEngine::DeleteUsageRecord(const std::string& app_id,
|
||||
CdmSecurityLevel security_level,
|
||||
const std::string& key_set_id) {
|
||||
const CdmKeySetId& key_set_id) {
|
||||
LOGI("app_id = %s, key_set_id = %s", IdToString(app_id),
|
||||
IdToString(key_set_id));
|
||||
if (security_level == kSecurityLevelL1 && OkpIsInFallbackMode()) {
|
||||
@@ -1465,18 +1465,18 @@ CdmResponseType CdmEngine::StoreAtscLicense(
|
||||
CdmResponseType CdmEngine::GetUsageInfo(const std::string& app_id,
|
||||
const CdmSecureStopId& ssid,
|
||||
int* error_detail,
|
||||
CdmUsageInfo* usage_info) {
|
||||
CdmUsageReport* usage_report) {
|
||||
// Try to find usage info at the default security level. If the
|
||||
// security level is unprovisioned or we are unable to find it,
|
||||
// try L3.
|
||||
CdmResponseType status =
|
||||
GetUsageInfo(app_id, ssid, kLevelDefault, error_detail, usage_info);
|
||||
GetUsageInfo(app_id, ssid, kLevelDefault, error_detail, usage_report);
|
||||
switch (status.code()) {
|
||||
case NEED_PROVISIONING:
|
||||
case GET_USAGE_INFO_ERROR_1:
|
||||
case GET_USAGE_INFO_ERROR_2:
|
||||
case USAGE_INFO_NOT_FOUND:
|
||||
status = GetUsageInfo(app_id, ssid, kLevel3, error_detail, usage_info);
|
||||
status = GetUsageInfo(app_id, ssid, kLevel3, error_detail, usage_report);
|
||||
return status;
|
||||
default:
|
||||
return status;
|
||||
@@ -1487,15 +1487,17 @@ CdmResponseType CdmEngine::GetUsageInfo(const std::string& app_id,
|
||||
const CdmSecureStopId& ssid,
|
||||
RequestedSecurityLevel security_level,
|
||||
int* error_detail,
|
||||
CdmUsageInfo* usage_info) {
|
||||
CdmUsageReport* usage_report) {
|
||||
LOGI("app_id = %s, ssid = %s", IdToString(app_id), IdToString(ssid));
|
||||
if (!usage_property_set_) {
|
||||
usage_property_set_.reset(new UsagePropertySet());
|
||||
}
|
||||
if (usage_info == nullptr) {
|
||||
LOGE("Output |usage_info| is null");
|
||||
if (usage_report == nullptr) {
|
||||
LOGE("Output |usage_report| is null");
|
||||
return CdmResponseType(PARAMETER_NULL);
|
||||
}
|
||||
usage_report->clear();
|
||||
|
||||
usage_property_set_->set_security_level(security_level);
|
||||
usage_property_set_->set_app_id(app_id);
|
||||
usage_session_.reset(new CdmSession(file_system_, metrics_->AddSession()));
|
||||
@@ -1536,32 +1538,28 @@ CdmResponseType CdmEngine::GetUsageInfo(const std::string& app_id,
|
||||
|
||||
if (KEY_ADDED != status) {
|
||||
LOGE("RestoreUsageSession failed: status = %d", static_cast<int>(status));
|
||||
usage_info->clear();
|
||||
return status;
|
||||
}
|
||||
|
||||
CdmKeyRequest request;
|
||||
status = usage_session_->GenerateReleaseRequest(&request);
|
||||
|
||||
usage_info->clear();
|
||||
usage_info->push_back(request.message);
|
||||
|
||||
if (KEY_MESSAGE != status) {
|
||||
LOGE("GenerateReleaseRequest failed: status = %d",
|
||||
static_cast<int>(status));
|
||||
usage_info->clear();
|
||||
return status;
|
||||
}
|
||||
|
||||
*usage_report = std::move(request.message);
|
||||
return CdmResponseType(KEY_MESSAGE);
|
||||
}
|
||||
|
||||
CdmResponseType CdmEngine::GetUsageInfo(const std::string& app_id,
|
||||
int* error_detail,
|
||||
CdmUsageInfo* usage_info) {
|
||||
CdmUsageReport* usage_report) {
|
||||
LOGI("app_id = %s", IdToString(app_id));
|
||||
if (usage_info == nullptr) {
|
||||
LOGE("Output |usage_info| is null");
|
||||
if (usage_report == nullptr) {
|
||||
LOGE("Output |usage_report| is null");
|
||||
return CdmResponseType(PARAMETER_NULL);
|
||||
}
|
||||
// Return a random usage report from a random security level
|
||||
@@ -1569,15 +1567,15 @@ CdmResponseType CdmEngine::GetUsageInfo(const std::string& app_id,
|
||||
wvutil::CdmRandom::RandomBool() ? kLevelDefault : kLevel3;
|
||||
CdmResponseType status(UNKNOWN_ERROR);
|
||||
do {
|
||||
status = GetUsageInfo(app_id, security_level, error_detail, usage_info);
|
||||
if (KEY_MESSAGE == status && !usage_info->empty()) {
|
||||
status = GetUsageInfo(app_id, security_level, error_detail, usage_report);
|
||||
if (KEY_MESSAGE == status && !usage_report->empty()) {
|
||||
return status;
|
||||
}
|
||||
} while (KEY_CANCELED == status);
|
||||
|
||||
security_level = (kLevel3 == security_level) ? kLevelDefault : kLevel3;
|
||||
do {
|
||||
status = GetUsageInfo(app_id, security_level, error_detail, usage_info);
|
||||
status = GetUsageInfo(app_id, security_level, error_detail, usage_report);
|
||||
if (NEED_PROVISIONING == status)
|
||||
return CdmResponseType(
|
||||
NO_ERROR); // Valid scenario that one of the security
|
||||
@@ -1588,13 +1586,14 @@ CdmResponseType CdmEngine::GetUsageInfo(const std::string& app_id,
|
||||
|
||||
CdmResponseType CdmEngine::GetUsageInfo(
|
||||
const std::string& app_id, RequestedSecurityLevel requested_security_level,
|
||||
int* error_detail, CdmUsageInfo* usage_info) {
|
||||
int* error_detail, CdmUsageReport* usage_report) {
|
||||
LOGI("app_id = %s, security_level = %s", IdToString(app_id),
|
||||
RequestedSecurityLevelToString(requested_security_level));
|
||||
if (usage_info == nullptr) {
|
||||
LOGE("Output |usage_info| is null");
|
||||
if (usage_report == nullptr) {
|
||||
LOGE("Output |usage_report| is null");
|
||||
return CdmResponseType(PARAMETER_NULL);
|
||||
}
|
||||
usage_report->clear();
|
||||
if (requested_security_level == kLevelDefault && OkpIsInFallbackMode()) {
|
||||
LOGD("OKP fallback to L3");
|
||||
requested_security_level = kLevel3;
|
||||
@@ -1627,7 +1626,6 @@ CdmResponseType CdmEngine::GetUsageInfo(
|
||||
}
|
||||
|
||||
if (usage_data.empty()) {
|
||||
usage_info->clear();
|
||||
return CdmResponseType(NO_ERROR);
|
||||
}
|
||||
|
||||
@@ -1637,27 +1635,22 @@ CdmResponseType CdmEngine::GetUsageInfo(
|
||||
// TODO(b/141704872): Make multiple attempts.
|
||||
LOGE("RestoreUsageSession failed: index = %zu, status = %d", index,
|
||||
static_cast<int>(status));
|
||||
usage_info->clear();
|
||||
return status;
|
||||
}
|
||||
|
||||
CdmKeyRequest request;
|
||||
status = usage_session_->GenerateReleaseRequest(&request);
|
||||
|
||||
usage_info->clear();
|
||||
usage_info->push_back(request.message);
|
||||
|
||||
switch (status.code()) {
|
||||
case KEY_MESSAGE:
|
||||
*usage_report = std::move(request.message);
|
||||
break;
|
||||
case KEY_CANCELED: // usage information not present in
|
||||
usage_session_->DeleteLicenseFile(); // OEMCrypto, delete and try again
|
||||
usage_info->clear();
|
||||
break;
|
||||
default:
|
||||
LOGE("GenerateReleaseRequest failed: status = %d",
|
||||
static_cast<int>(status));
|
||||
usage_info->clear();
|
||||
break;
|
||||
}
|
||||
return status;
|
||||
@@ -1782,8 +1775,7 @@ CdmResponseType CdmEngine::RemoveUsageInfo(
|
||||
return CdmResponseType(REMOVE_USAGE_INFO_ERROR_3);
|
||||
}
|
||||
|
||||
CdmResponseType CdmEngine::ReleaseUsageInfo(
|
||||
const CdmUsageInfoReleaseMessage& message) {
|
||||
CdmResponseType CdmEngine::ReleaseUsageInfo(const CdmKeyResponse& message) {
|
||||
LOGI("message_size = %zu", message.size());
|
||||
if (!usage_session_) {
|
||||
LOGE("Usage session not initialized");
|
||||
|
||||
@@ -95,8 +95,8 @@ class MockCdmEngineImpl : public CdmEngine {
|
||||
(override));
|
||||
MOCK_METHOD(CdmResponseType, Unprovision, (CdmSecurityLevel), (override));
|
||||
MOCK_METHOD(CdmResponseType, ListUsageIds,
|
||||
(const std::string&, CdmSecurityLevel, std::vector<std::string>*,
|
||||
std::vector<std::string>*),
|
||||
(const std::string&, CdmSecurityLevel, std::vector<CdmKeySetId>*,
|
||||
std::vector<CdmSecureStopId>*),
|
||||
(override));
|
||||
MOCK_METHOD(CdmResponseType, RemoveAllUsageInfo, (const std::string&),
|
||||
(override));
|
||||
@@ -104,8 +104,8 @@ class MockCdmEngineImpl : public CdmEngine {
|
||||
(const std::string&, CdmSecurityLevel), (override));
|
||||
MOCK_METHOD(CdmResponseType, RemoveUsageInfo,
|
||||
(const std::string&, const CdmSecureStopId&), (override));
|
||||
MOCK_METHOD(CdmResponseType, ReleaseUsageInfo,
|
||||
(const CdmUsageInfoReleaseMessage&), (override));
|
||||
MOCK_METHOD(CdmResponseType, ReleaseUsageInfo, (const CdmKeyResponse&),
|
||||
(override));
|
||||
MOCK_METHOD(CdmResponseType, DecryptV16,
|
||||
(const CdmSessionId&, const CdmDecryptionParametersV16&),
|
||||
(override));
|
||||
@@ -464,17 +464,17 @@ TEST_F(WvCdmEngineMetricsImplTest, ReleaseUsageInfo) {
|
||||
}
|
||||
|
||||
TEST_F(WvCdmEngineMetricsImplTest, ListUsageIds) {
|
||||
std::vector<std::string> ksids;
|
||||
std::vector<std::string> provider_session_tokens;
|
||||
std::vector<CdmKeySetId> ksids;
|
||||
std::vector<CdmSecureStopId> ssids;
|
||||
|
||||
EXPECT_CALL(*test_cdm_metrics_engine_,
|
||||
ListUsageIds(Eq("fake app id"), Eq(kSecurityLevelL2), Eq(&ksids),
|
||||
Eq(&provider_session_tokens)))
|
||||
Eq(&ssids)))
|
||||
.WillOnce(Return(CdmResponseType(UNKNOWN_ERROR)));
|
||||
|
||||
ASSERT_EQ(wvcdm::UNKNOWN_ERROR, test_cdm_metrics_engine_->ListUsageIds(
|
||||
"fake app id", kSecurityLevelL2, &ksids,
|
||||
&provider_session_tokens));
|
||||
ASSERT_EQ(wvcdm::UNKNOWN_ERROR,
|
||||
test_cdm_metrics_engine_->ListUsageIds(
|
||||
"fake app id", kSecurityLevelL2, &ksids, &ssids));
|
||||
|
||||
drm_metrics::WvCdmMetrics metrics_proto;
|
||||
test_cdm_metrics_engine_->GetMetricsSnapshot(&metrics_proto);
|
||||
|
||||
Reference in New Issue
Block a user