Merge "Filter out key set IDs based on ATSC mode." into udc-widevine-dev
This commit is contained in:
@@ -162,6 +162,18 @@ bool isCsrAccessAllowed() {
|
||||
return (uid == AID_ROOT || uid == AID_SYSTEM || uid == AID_SHELL);
|
||||
}
|
||||
|
||||
bool IsAtscKeySetId(const CdmKeySetId& keySetId) {
|
||||
if (keySetId.empty()) return false;
|
||||
// Pre-installed licenses might not perfectly match ATSC_KEY_SET_ID_PREFIX.
|
||||
// If "atsc" is in the license name, then it is safe to assume
|
||||
// it is an ATSC license.
|
||||
return keySetId.find("atsc") != std::string::npos ||
|
||||
keySetId.find("ATSC") != std::string::npos;
|
||||
}
|
||||
|
||||
bool IsNotAtscKeySetId(const CdmKeySetId& keySetId) {
|
||||
return !IsAtscKeySetId(keySetId);
|
||||
}
|
||||
} // namespace
|
||||
|
||||
WVDrmPlugin::WVDrmPlugin(const android::sp<WvContentDecryptionModule>& cdm,
|
||||
@@ -949,39 +961,53 @@ Status WVDrmPlugin::unprovisionDevice() {
|
||||
|
||||
::ndk::ScopedAStatus WVDrmPlugin::getOfflineLicenseKeySetIds(
|
||||
vector<::aidl::android::hardware::drm::KeySetId>* _aidl_return) {
|
||||
vector<vector<uint8_t>> keySetIds;
|
||||
vector<KeySetId> keySetIdsVec;
|
||||
|
||||
_aidl_return->clear();
|
||||
CdmIdentifier identifier;
|
||||
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
||||
const auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
||||
if (status != Status::OK) {
|
||||
*_aidl_return = keySetIdsVec;
|
||||
return toNdkScopedAStatus(status);
|
||||
}
|
||||
|
||||
vector<CdmSecurityLevel> levels = {wvcdm::kSecurityLevelL1,
|
||||
wvcdm::kSecurityLevelL3};
|
||||
const std::vector<CdmSecurityLevel> levels = {wvcdm::kSecurityLevelL1,
|
||||
wvcdm::kSecurityLevelL3};
|
||||
|
||||
std::vector<CdmKeySetId> allKeySetIds;
|
||||
CdmResponseType res(wvcdm::UNKNOWN_ERROR);
|
||||
|
||||
bool success = false;
|
||||
for (auto level : levels) {
|
||||
vector<CdmKeySetId> cdmKeySetIds;
|
||||
res = mCDM->ListStoredLicenses(level, identifier, &cdmKeySetIds);
|
||||
std::vector<CdmKeySetId> levelKeySetIds;
|
||||
res = mCDM->ListStoredLicenses(level, identifier, &levelKeySetIds);
|
||||
|
||||
if (isCdmResponseTypeSuccess(res)) {
|
||||
keySetIds.clear();
|
||||
for (auto id : cdmKeySetIds) {
|
||||
keySetIds.push_back(StrToVector(id));
|
||||
}
|
||||
KeySetId kid;
|
||||
for (auto id : keySetIds) {
|
||||
kid.keySetId = id;
|
||||
keySetIdsVec.push_back(kid);
|
||||
if (!isCdmResponseTypeSuccess(res)) continue;
|
||||
success = true;
|
||||
if (levelKeySetIds.empty()) continue;
|
||||
if (allKeySetIds.empty()) {
|
||||
allKeySetIds = std::move(levelKeySetIds);
|
||||
} else {
|
||||
allKeySetIds.reserve(allKeySetIds.size() + levelKeySetIds.size());
|
||||
for (CdmKeySetId& keySetId : levelKeySetIds) {
|
||||
allKeySetIds.push_back(std::move(keySetId));
|
||||
}
|
||||
}
|
||||
}
|
||||
*_aidl_return = keySetIdsVec;
|
||||
return toNdkScopedAStatus(mapCdmResponseType(res));
|
||||
|
||||
if (!success) {
|
||||
// Return whatever the last error was.
|
||||
return toNdkScopedAStatus(mapCdmResponseType(res));
|
||||
}
|
||||
|
||||
// Filter out key sets based on ATSC mode.
|
||||
const auto isAllowedKeySetId =
|
||||
mPropertySet.use_atsc_mode() ? IsAtscKeySetId : IsNotAtscKeySetId;
|
||||
std::vector<KeySetId> keySetIds;
|
||||
for (const CdmKeySetId& keySetId : allKeySetIds) {
|
||||
if (isAllowedKeySetId(keySetId)) {
|
||||
keySetIds.push_back(KeySetId{StrToVector(keySetId)});
|
||||
}
|
||||
}
|
||||
|
||||
*_aidl_return = std::move(keySetIds);
|
||||
return toNdkScopedAStatus(mapCdmResponseType(wvcdm::NO_ERROR));
|
||||
}
|
||||
|
||||
::ndk::ScopedAStatus WVDrmPlugin::getOfflineLicenseState(
|
||||
|
||||
Reference in New Issue
Block a user