Merge "Check if license exists before calling remove." into udc-widevine-dev

This commit is contained in:
Alex Dale
2023-11-16 23:06:59 +00:00
committed by Android (Google) Code Review
2 changed files with 97 additions and 19 deletions

View File

@@ -1063,29 +1063,42 @@ Status WVDrmPlugin::unprovisionDevice() {
::ndk::ScopedAStatus WVDrmPlugin::removeOfflineLicense( ::ndk::ScopedAStatus WVDrmPlugin::removeOfflineLicense(
const ::aidl::android::hardware::drm::KeySetId& in_keySetId) { const ::aidl::android::hardware::drm::KeySetId& in_keySetId) {
if (!in_keySetId.keySetId.size()) { if (in_keySetId.keySetId.empty()) {
return toNdkScopedAStatus(Status::BAD_VALUE); return toNdkScopedAStatus(Status::BAD_VALUE);
} }
CdmIdentifier identifier; CdmIdentifier identifier;
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier); const auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
if (status != Status::OK) { if (status != Status::OK) {
return toNdkScopedAStatus(status); return toNdkScopedAStatus(status);
} }
CdmResponseType res(wvcdm::UNKNOWN_ERROR); const std::vector<CdmSecurityLevel> levels = {wvcdm::kSecurityLevelL1,
wvcdm::kSecurityLevelL3};
const CdmKeySetId cdmKeySetId(in_keySetId.keySetId.begin(),
in_keySetId.keySetId.end());
res = mCDM->RemoveOfflineLicense( for (const CdmSecurityLevel level : levels) {
std::string(in_keySetId.keySetId.begin(), in_keySetId.keySetId.end()), std::vector<CdmKeySetId> keySetIds;
wvcdm::kSecurityLevelL1, identifier); const CdmResponseType res =
mCDM->ListStoredLicenses(level, identifier, &keySetIds);
if (!isCdmResponseTypeSuccess(res)) { if (!isCdmResponseTypeSuccess(res)) {
CdmResponseType res = mCDM->RemoveOfflineLicense( // This could failure for several reasons, but none that are
std::string(in_keySetId.keySetId.begin(), in_keySetId.keySetId.end()), // worth returning to the app at this time.
wvcdm::kSecurityLevelL3, identifier); ALOGW("Failed to list stored licenses: res = %d", static_cast<int>(res));
return toNdkScopedAStatus(mapCdmResponseType(res)); continue;
} }
// Check if exists.
return toNdkScopedAStatus(Status::OK); if (keySetIds.empty() || std::find(keySetIds.begin(), keySetIds.end(),
cdmKeySetId) == keySetIds.end()) {
// Does not exist for this security level.
continue;
}
return toNdkScopedAStatus(mapCdmResponseType(
mCDM->RemoveOfflineLicense(cdmKeySetId, level, identifier)));
}
// Could only reach this state if the key set could not be found.
return toNdkScopedAStatus(Status::BAD_VALUE);
} }
::ndk::ScopedAStatus WVDrmPlugin::getPropertyString( ::ndk::ScopedAStatus WVDrmPlugin::getPropertyString(

View File

@@ -2971,13 +2971,78 @@ TEST_F(WVDrmPluginHalTest, GetOfflineLicenseState) {
ASSERT_EQ(OfflineLicenseState::UNKNOWN, result); ASSERT_EQ(OfflineLicenseState::UNKNOWN, result);
} }
TEST_F(WVDrmPluginHalTest, RemoveOfflineLicense) { TEST_F(WVDrmPluginHalTest, RemoveOfflineLicense_L1) {
EXPECT_CALL( // Key set to remove.
*mCdm, RemoveOfflineLicense(_, kSecurityLevelL1, HasOrigin(EMPTY_ORIGIN))) const CdmKeySetId cdmKeySetId = "ksidDEADBEAF";
.Times(1); const KeySetId keySetId{
std::vector<uint8_t>(cdmKeySetId.begin(), cdmKeySetId.end())};
// Desired key set ID found in L1.
const std::vector<CdmKeySetId> cdmKeySetIdsL1 = {"ksid1234", "ksid9876",
"ksid9999", cdmKeySetId,
"ksidBAD", "ksidCAFEB0BA"};
auto ret = mPlugin->removeOfflineLicense(keySetId); EXPECT_CALL(*mCdm, ListStoredLicenses(kSecurityLevelL1, _, NotNull()))
EXPECT_TRUE(ret.isOk()); .WillOnce(DoAll(SetArgPointee<2>(cdmKeySetIdsL1),
testing::Return(CdmResponseType(wvcdm::NO_ERROR))));
// Only call L1.
EXPECT_CALL(*mCdm, RemoveOfflineLicense(cdmKeySetId, kSecurityLevelL1, _))
.WillOnce(testing::Return(CdmResponseType(wvcdm::NO_ERROR)));
EXPECT_CALL(*mCdm, RemoveOfflineLicense(_, kSecurityLevelL3, _)).Times(0);
const auto status = mPlugin->removeOfflineLicense(keySetId);
ASSERT_TRUE(status.isOk());
}
TEST_F(WVDrmPluginHalTest, RemoveOfflineLicense_L3) {
// Key set to remove.
const CdmKeySetId cdmKeySetId = "ksidDEADBEAF";
const KeySetId keySetId{
std::vector<uint8_t>(cdmKeySetId.begin(), cdmKeySetId.end())};
// Desired key set ID is not found in L1.
const std::vector<CdmKeySetId> cdmKeySetIdsL1 = {"ksid1234", "ksid9876",
"ksid9999"};
// Desired key set ID found in L3.
const std::vector<CdmKeySetId> cdmKeySetIdsL3 = {
"ksidDEADC0DE", "ksid1337", cdmKeySetId, "ksidBAD", "ksidCAFEB0BA"};
EXPECT_CALL(*mCdm, ListStoredLicenses(kSecurityLevelL1, _, NotNull()))
.WillOnce(DoAll(SetArgPointee<2>(cdmKeySetIdsL1),
testing::Return(CdmResponseType(wvcdm::NO_ERROR))));
EXPECT_CALL(*mCdm, ListStoredLicenses(kSecurityLevelL3, _, NotNull()))
.WillOnce(DoAll(SetArgPointee<2>(cdmKeySetIdsL3),
testing::Return(CdmResponseType(wvcdm::NO_ERROR))));
// Only call L3.
EXPECT_CALL(*mCdm, RemoveOfflineLicense(_, kSecurityLevelL1, _)).Times(0);
EXPECT_CALL(*mCdm, RemoveOfflineLicense(cdmKeySetId, kSecurityLevelL3, _))
.WillOnce(testing::Return(CdmResponseType(wvcdm::NO_ERROR)));
const auto status = mPlugin->removeOfflineLicense(keySetId);
ASSERT_TRUE(status.isOk());
}
TEST_F(WVDrmPluginHalTest, RemoveOfflineLicense_NotFound) {
// Key set to remove.
const CdmKeySetId cdmKeySetId = "ksidDEADBEAF";
const KeySetId keySetId{
std::vector<uint8_t>(cdmKeySetId.begin(), cdmKeySetId.end())};
// Desired key set ID is not found in L1.
const std::vector<CdmKeySetId> cdmKeySetIdsL1 = {"ksid1234", "ksid9876",
"ksid9999"};
// Desired key set ID is not found in L3.
const std::vector<CdmKeySetId> cdmKeySetIdsL3 = {"ksidDEADC0DE", "ksid1337",
"ksidBAD", "ksidCAFEB0BA"};
EXPECT_CALL(*mCdm, ListStoredLicenses(kSecurityLevelL1, _, NotNull()))
.WillOnce(DoAll(SetArgPointee<2>(cdmKeySetIdsL1),
testing::Return(CdmResponseType(wvcdm::NO_ERROR))));
EXPECT_CALL(*mCdm, ListStoredLicenses(kSecurityLevelL3, _, NotNull()))
.WillOnce(DoAll(SetArgPointee<2>(cdmKeySetIdsL3),
testing::Return(CdmResponseType(wvcdm::NO_ERROR))));
// No call to RemoveOfflineLicense should be made.
EXPECT_CALL(*mCdm, RemoveOfflineLicense(_, _, _)).Times(0);
const auto status = mPlugin->removeOfflineLicense(keySetId);
ASSERT_FALSE(status.isOk());
} }
TEST_F(WVDrmPluginHalTest, CanStoreAtscLicense) { TEST_F(WVDrmPluginHalTest, CanStoreAtscLicense) {