Create new usage header if old one corrupted
am: 481a1effcb
Change-Id: I5221468430423c348736356984663fcb8013e9dd
This commit is contained in:
@@ -225,7 +225,8 @@ CdmResponseType CdmSession::RestoreOfflineSession(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (usage_support_type_ == kUsageEntrySupport &&
|
if (usage_support_type_ == kUsageEntrySupport &&
|
||||||
provider_session_token.size() > 0) {
|
provider_session_token.size() > 0 &&
|
||||||
|
usage_table_header_ != nullptr) {
|
||||||
CdmResponseType sts = usage_table_header_->LoadEntry(crypto_session_.get(),
|
CdmResponseType sts = usage_table_header_->LoadEntry(crypto_session_.get(),
|
||||||
usage_entry_,
|
usage_entry_,
|
||||||
usage_entry_number_);
|
usage_entry_number_);
|
||||||
@@ -250,7 +251,8 @@ CdmResponseType CdmSession::RestoreOfflineSession(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (usage_support_type_ == kUsageEntrySupport &&
|
if (usage_support_type_ == kUsageEntrySupport &&
|
||||||
provider_session_token.size() > 0) {
|
provider_session_token.size() > 0 &&
|
||||||
|
usage_table_header_ != nullptr) {
|
||||||
CdmResponseType sts =
|
CdmResponseType sts =
|
||||||
usage_table_header_->UpdateEntry(crypto_session_.get(), &usage_entry_);
|
usage_table_header_->UpdateEntry(crypto_session_.get(), &usage_entry_);
|
||||||
if (sts != NO_ERROR) {
|
if (sts != NO_ERROR) {
|
||||||
@@ -282,9 +284,10 @@ CdmResponseType CdmSession::RestoreUsageSession(
|
|||||||
usage_entry_number_ = usage_data.usage_entry_number;
|
usage_entry_number_ = usage_data.usage_entry_number;
|
||||||
usage_provider_session_token_ = usage_data.provider_session_token;
|
usage_provider_session_token_ = usage_data.provider_session_token;
|
||||||
|
|
||||||
if (usage_support_type_ == kUsageEntrySupport) {
|
if (usage_support_type_ == kUsageEntrySupport &&
|
||||||
|
usage_table_header_ != nullptr) {
|
||||||
CdmResponseType sts = usage_table_header_->LoadEntry(
|
CdmResponseType sts = usage_table_header_->LoadEntry(
|
||||||
crypto_session_.get(), usage_entry_, usage_entry_number_);
|
crypto_session_.get(), usage_entry_, usage_entry_number_);
|
||||||
if (sts != NO_ERROR) {
|
if (sts != NO_ERROR) {
|
||||||
LOGE("CdmSession::RestoreUsageSession: failed to load usage entry = %d",
|
LOGE("CdmSession::RestoreUsageSession: failed to load usage entry = %d",
|
||||||
sts);
|
sts);
|
||||||
@@ -296,7 +299,8 @@ CdmResponseType CdmSession::RestoreUsageSession(
|
|||||||
return RELEASE_LICENSE_ERROR_2;
|
return RELEASE_LICENSE_ERROR_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usage_support_type_ == kUsageEntrySupport) {
|
if (usage_support_type_ == kUsageEntrySupport &&
|
||||||
|
usage_table_header_ != nullptr) {
|
||||||
CdmResponseType sts =
|
CdmResponseType sts =
|
||||||
usage_table_header_->UpdateEntry(crypto_session_.get(), &usage_entry_);
|
usage_table_header_->UpdateEntry(crypto_session_.get(), &usage_entry_);
|
||||||
if (sts != NO_ERROR) {
|
if (sts != NO_ERROR) {
|
||||||
@@ -440,7 +444,8 @@ CdmResponseType CdmSession::AddKey(const CdmKeyResponse& key_response) {
|
|||||||
// to be created.
|
// to be created.
|
||||||
CdmResponseType sts;
|
CdmResponseType sts;
|
||||||
std::string provider_session_token;
|
std::string provider_session_token;
|
||||||
if (usage_support_type_ == kUsageEntrySupport) {
|
if (usage_support_type_ == kUsageEntrySupport &&
|
||||||
|
usage_table_header_ != nullptr) {
|
||||||
if (license_parser_->ExtractProviderSessionToken(
|
if (license_parser_->ExtractProviderSessionToken(
|
||||||
key_response, &provider_session_token) &&
|
key_response, &provider_session_token) &&
|
||||||
!provider_session_token.empty()) {
|
!provider_session_token.empty()) {
|
||||||
@@ -456,7 +461,8 @@ CdmResponseType CdmSession::AddKey(const CdmKeyResponse& key_response) {
|
|||||||
|
|
||||||
// Update or delete entry if usage table header+entries are supported
|
// Update or delete entry if usage table header+entries are supported
|
||||||
if (usage_support_type_ == kUsageEntrySupport &&
|
if (usage_support_type_ == kUsageEntrySupport &&
|
||||||
!provider_session_token.empty()) {
|
!provider_session_token.empty() &&
|
||||||
|
usage_table_header_ != nullptr) {
|
||||||
if (sts != KEY_ADDED) {
|
if (sts != KEY_ADDED) {
|
||||||
CdmResponseType sts =
|
CdmResponseType sts =
|
||||||
usage_table_header_->DeleteEntry(usage_entry_number_,
|
usage_table_header_->DeleteEntry(usage_entry_number_,
|
||||||
@@ -475,7 +481,8 @@ CdmResponseType CdmSession::AddKey(const CdmKeyResponse& key_response) {
|
|||||||
|
|
||||||
if (is_offline_ || has_provider_session_token()) {
|
if (is_offline_ || has_provider_session_token()) {
|
||||||
if (has_provider_session_token() &&
|
if (has_provider_session_token() &&
|
||||||
usage_support_type_ == kUsageEntrySupport) {
|
usage_support_type_ == kUsageEntrySupport &&
|
||||||
|
usage_table_header_ != nullptr) {
|
||||||
usage_table_header_->UpdateEntry(crypto_session_.get(), &usage_entry_);
|
usage_table_header_->UpdateEntry(crypto_session_.get(), &usage_entry_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -886,7 +893,8 @@ CdmResponseType CdmSession::UpdateUsageTableInformation() {
|
|||||||
|
|
||||||
CdmResponseType CdmSession::UpdateUsageEntryInformation() {
|
CdmResponseType CdmSession::UpdateUsageEntryInformation() {
|
||||||
if (usage_support_type_ != kUsageEntrySupport ||
|
if (usage_support_type_ != kUsageEntrySupport ||
|
||||||
!has_provider_session_token()) {
|
!has_provider_session_token() &&
|
||||||
|
usage_table_header_ != nullptr) {
|
||||||
LOGE("CdmSession::UpdateUsageEntryInformation: Unexpected usage type "
|
LOGE("CdmSession::UpdateUsageEntryInformation: Unexpected usage type "
|
||||||
"supported: %d", usage_support_type_);
|
"supported: %d", usage_support_type_);
|
||||||
return INCORRECT_USAGE_SUPPORT_TYPE_2;
|
return INCORRECT_USAGE_SUPPORT_TYPE_2;
|
||||||
|
|||||||
@@ -45,22 +45,24 @@ bool UsageTableHeader::Init(CdmSecurityLevel security_level,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file_handle_->RetrieveUsageTableInfo(&usage_table_header_,
|
CdmResponseType status = USAGE_INFO_NOT_FOUND;
|
||||||
|
if (file_handle_->RetrieveUsageTableInfo(&usage_table_header_,
|
||||||
&usage_entry_info_)) {
|
&usage_entry_info_)) {
|
||||||
CdmResponseType status =
|
status = crypto_session->LoadUsageTableHeader(usage_table_header_);
|
||||||
crypto_session->CreateUsageTableHeader(&usage_table_header_);
|
|
||||||
if (status != NO_ERROR) return false;
|
|
||||||
file_handle_->StoreUsageTableInfo(usage_table_header_, usage_entry_info_);
|
|
||||||
} else {
|
|
||||||
CdmResponseType status =
|
|
||||||
crypto_session->LoadUsageTableHeader(usage_table_header_);
|
|
||||||
if (status != NO_ERROR) {
|
if (status != NO_ERROR) {
|
||||||
LOGE(
|
LOGE(
|
||||||
"UsageTableHeader::Init: load usage table failed, security level: %d",
|
"UsageTableHeader::Init: load usage table failed, security level: %d",
|
||||||
security_level);
|
security_level);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (status != NO_ERROR) {
|
||||||
|
file_handle_->DeleteAllLicenses();
|
||||||
|
usage_entry_info_.clear();
|
||||||
|
status = crypto_session->CreateUsageTableHeader(&usage_table_header_);
|
||||||
|
if (status != NO_ERROR) return false;
|
||||||
|
file_handle_->StoreUsageTableInfo(usage_table_header_, usage_entry_info_);
|
||||||
|
}
|
||||||
|
|
||||||
requested_security_level_ =
|
requested_security_level_ =
|
||||||
security_level_ == kSecurityLevelL3 ? kLevel3 : kLevelDefault;
|
security_level_ == kSecurityLevelL3 ? kLevel3 : kLevelDefault;
|
||||||
is_inited_ = true;
|
is_inited_ = true;
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ class MockDeviceFiles : public DeviceFiles {
|
|||||||
bool(const std::string&, const std::string&, std::string*,
|
bool(const std::string&, const std::string&, std::string*,
|
||||||
CdmKeyMessage*, CdmKeyResponse*, CdmUsageEntry*,
|
CdmKeyMessage*, CdmKeyResponse*, CdmUsageEntry*,
|
||||||
uint32_t*));
|
uint32_t*));
|
||||||
|
MOCK_METHOD0(DeleteAllLicenses, bool());
|
||||||
MOCK_METHOD7(StoreUsageInfo,
|
MOCK_METHOD7(StoreUsageInfo,
|
||||||
bool(const std::string&, const CdmKeyMessage&,
|
bool(const std::string&, const CdmKeyMessage&,
|
||||||
const CdmKeyResponse&, const std::string&,
|
const CdmKeyResponse&, const std::string&,
|
||||||
@@ -179,6 +180,7 @@ TEST_P(UsageTableHeaderInitializationTest, CreateUsageTableHeader) {
|
|||||||
EXPECT_CALL(*crypto_session_, CreateUsageTableHeader(NotNull()))
|
EXPECT_CALL(*crypto_session_, CreateUsageTableHeader(NotNull()))
|
||||||
.WillOnce(
|
.WillOnce(
|
||||||
DoAll(SetArgPointee<0>(kEmptyUsageTableHeader), Return(NO_ERROR)));
|
DoAll(SetArgPointee<0>(kEmptyUsageTableHeader), Return(NO_ERROR)));
|
||||||
|
EXPECT_CALL(*device_files_, DeleteAllLicenses()).WillOnce(Return(true));
|
||||||
EXPECT_CALL(*device_files_, StoreUsageTableInfo(kEmptyUsageTableHeader,
|
EXPECT_CALL(*device_files_, StoreUsageTableInfo(kEmptyUsageTableHeader,
|
||||||
kEmptyUsageEntryInfoVector))
|
kEmptyUsageEntryInfoVector))
|
||||||
.WillOnce(Return(true));
|
.WillOnce(Return(true));
|
||||||
@@ -560,7 +562,6 @@ TEST_F(UsageTableHeaderTest,
|
|||||||
usage_entry_info_vector.size() - 3; // kUsageEntryInfoOfflineLicense1
|
usage_entry_info_vector.size() - 3; // kUsageEntryInfoOfflineLicense1
|
||||||
metrics::CryptoMetrics metrics;
|
metrics::CryptoMetrics metrics;
|
||||||
|
|
||||||
device_files_->DeleteAllLicenses();
|
|
||||||
EXPECT_CALL(*crypto_session_, Open(kLevelDefault)).WillOnce(Return(NO_ERROR));
|
EXPECT_CALL(*crypto_session_, Open(kLevelDefault)).WillOnce(Return(NO_ERROR));
|
||||||
EXPECT_CALL(
|
EXPECT_CALL(
|
||||||
*crypto_session_,
|
*crypto_session_,
|
||||||
@@ -1558,4 +1559,27 @@ TEST_F(UsageTableHeaderTest, DeleteEntry_LastEntriesAreSecureStopAndUnknknown) {
|
|||||||
device_files_, &metrics));
|
device_files_, &metrics));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If the crypto session says the usage table header is stale, init should fail.
|
||||||
|
TEST_F(UsageTableHeaderTest, StaleHeader) {
|
||||||
|
const std::vector<CdmUsageEntryInfo> usage_entry_info_vector = {
|
||||||
|
kUsageEntryInfoOfflineLicense1, kUsageEntryInfoSecureStop1,
|
||||||
|
kUsageEntryInfoStorageTypeUnknown, kUsageEntryInfoOfflineLicense2};
|
||||||
|
|
||||||
|
EXPECT_CALL(*device_files_, RetrieveUsageTableInfo(NotNull(), NotNull()))
|
||||||
|
.WillOnce(DoAll(SetArgPointee<0>(kUsageTableHeader),
|
||||||
|
SetArgPointee<1>(usage_entry_info_vector),
|
||||||
|
Return(true)));
|
||||||
|
EXPECT_CALL(*crypto_session_, LoadUsageTableHeader(kUsageTableHeader))
|
||||||
|
.WillOnce(Return(LOAD_USAGE_HEADER_GENERATION_SKEW));
|
||||||
|
EXPECT_CALL(*crypto_session_, CreateUsageTableHeader(NotNull()))
|
||||||
|
.WillOnce(
|
||||||
|
DoAll(SetArgPointee<0>(kEmptyUsageTableHeader), Return(NO_ERROR)));
|
||||||
|
EXPECT_CALL(*device_files_, DeleteAllLicenses()).WillOnce(Return(true));
|
||||||
|
EXPECT_CALL(*device_files_, StoreUsageTableInfo(kEmptyUsageTableHeader,
|
||||||
|
kEmptyUsageEntryInfoVector))
|
||||||
|
.WillOnce(Return(true));
|
||||||
|
|
||||||
|
EXPECT_TRUE(usage_table_header_->Init(kSecurityLevelL1, crypto_session_));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace wvcdm
|
} // namespace wvcdm
|
||||||
|
|||||||
Reference in New Issue
Block a user