|
|
|
|
@@ -181,20 +181,20 @@ void WVDrmPlugin::Close() {
|
|
|
|
|
mCryptoSessions.clear();
|
|
|
|
|
if (mCdmIdentifierBuilder.is_sealed()) {
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
ALOGE("Failed to get cdm identifier %d", status);
|
|
|
|
|
ALOGE("Failed to get cdm identifier %d", status.get());
|
|
|
|
|
} else {
|
|
|
|
|
status = mapCdmResponseType(mCDM->CloseCdm(identifier));
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
ALOGE("Failed to close cdm. status %d", status);
|
|
|
|
|
ALOGE("Failed to close cdm. status %d", status.get());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::openSessionCommon(vector<uint8_t>& sessionId) {
|
|
|
|
|
Status status = Status::OK;
|
|
|
|
|
WvStatus WVDrmPlugin::openSessionCommon(vector<uint8_t>& sessionId) {
|
|
|
|
|
WvStatus status(Status::OK);
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
@@ -207,8 +207,7 @@ Status WVDrmPlugin::openSessionCommon(vector<uint8_t>& sessionId) {
|
|
|
|
|
identifier, this, &cdmSessionId);
|
|
|
|
|
|
|
|
|
|
if (!isCdmResponseTypeSuccess(res)) {
|
|
|
|
|
status = mapAndNotifyOfCdmResponseType(sessionId, res);
|
|
|
|
|
return status;
|
|
|
|
|
return mapAndNotifyOfCdmResponseType(sessionId, res);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool success = false;
|
|
|
|
|
@@ -230,21 +229,20 @@ Status WVDrmPlugin::openSessionCommon(vector<uint8_t>& sessionId) {
|
|
|
|
|
if (success) {
|
|
|
|
|
// Marshal Session ID
|
|
|
|
|
sessionId = StrToVector(cdmSessionId);
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
} else {
|
|
|
|
|
mCDM->CloseSession(cdmSessionId);
|
|
|
|
|
|
|
|
|
|
if (!isCdmResponseTypeSuccess(res)) {
|
|
|
|
|
// We got an error code we can return.
|
|
|
|
|
status = mapAndNotifyOfCdmResponseType(sessionId, res);
|
|
|
|
|
return mapAndNotifyOfCdmResponseType(sessionId, res);
|
|
|
|
|
} else {
|
|
|
|
|
// We got a failure that did not give us an error code, such as a failure
|
|
|
|
|
// of AttachEventListener() or the key being missing from the map.
|
|
|
|
|
ALOGW("Returns UNKNOWN error for legacy status kErrorCDMGeneric");
|
|
|
|
|
status = Status::ERROR_DRM_UNKNOWN;
|
|
|
|
|
return WvStatus(Status::ERROR_DRM_UNKNOWN);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return status;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SecurityLevel WVDrmPlugin::mapSecurityLevel(const std::string& level) {
|
|
|
|
|
@@ -276,10 +274,10 @@ SecurityLevel WVDrmPlugin::mapSecurityLevel(const std::string& level) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string native_security_level;
|
|
|
|
|
Status status =
|
|
|
|
|
auto status =
|
|
|
|
|
queryProperty(wvcdm::kLevelDefault, wvcdm::QUERY_KEY_SECURITY_LEVEL,
|
|
|
|
|
native_security_level);
|
|
|
|
|
if (Status::OK != status) {
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
*_aidl_return = sessionId;
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
}
|
|
|
|
|
@@ -298,7 +296,7 @@ SecurityLevel WVDrmPlugin::mapSecurityLevel(const std::string& level) {
|
|
|
|
|
setPropertyString("securityLevel", std::string(wvcdm_security_level));
|
|
|
|
|
|
|
|
|
|
status = openSessionCommon(sessionId);
|
|
|
|
|
if (Status::OK == status) {
|
|
|
|
|
if (status == Status::OK) {
|
|
|
|
|
SecurityLevel currentSecurityLevel = SecurityLevel::UNKNOWN;
|
|
|
|
|
const auto ret = getSecurityLevel(sessionId, ¤tSecurityLevel);
|
|
|
|
|
if (!ret.isOk() || in_securityLevel != currentSecurityLevel) {
|
|
|
|
|
@@ -306,7 +304,7 @@ SecurityLevel WVDrmPlugin::mapSecurityLevel(const std::string& level) {
|
|
|
|
|
in_securityLevel);
|
|
|
|
|
closeSession(sessionId);
|
|
|
|
|
sessionId.clear();
|
|
|
|
|
status = Status::ERROR_DRM_INVALID_STATE;
|
|
|
|
|
status = WvStatus(Status::ERROR_DRM_INVALID_STATE);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
*_aidl_return = sessionId;
|
|
|
|
|
@@ -341,13 +339,12 @@ SecurityLevel WVDrmPlugin::mapSecurityLevel(const std::string& level) {
|
|
|
|
|
return toNdkScopedAStatus(Status::BAD_VALUE);
|
|
|
|
|
}
|
|
|
|
|
KeyRequestType requestType = KeyRequestType::UNKNOWN;
|
|
|
|
|
Status status = Status::OK;
|
|
|
|
|
WvStatus status(Status::OK);
|
|
|
|
|
std::string defaultUrl;
|
|
|
|
|
vector<uint8_t> request;
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
status =
|
|
|
|
|
static_cast<Status>(mCdmIdentifierBuilder.getCdmIdentifier(&identifier));
|
|
|
|
|
status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
_aidl_return->request = request;
|
|
|
|
|
_aidl_return->requestType = KeyRequestType::UNKNOWN;
|
|
|
|
|
@@ -491,7 +488,7 @@ SecurityLevel WVDrmPlugin::mapSecurityLevel(const std::string& level) {
|
|
|
|
|
keySetId = StrToVector(cdmKeySetId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status status = Status::OK;
|
|
|
|
|
WvStatus status(Status::OK);
|
|
|
|
|
if (isRelease) {
|
|
|
|
|
// When releasing keys, we do not have a session ID.
|
|
|
|
|
status = mapCdmResponseType(res);
|
|
|
|
|
@@ -502,7 +499,7 @@ SecurityLevel WVDrmPlugin::mapSecurityLevel(const std::string& level) {
|
|
|
|
|
// don't return the error. This is because "NEED_KEY" from AddKey() is an
|
|
|
|
|
// expected behavior when sending a privacy certificate.
|
|
|
|
|
if (res == wvcdm::NEED_KEY && mPropertySet.use_privacy_mode()) {
|
|
|
|
|
status = Status::OK;
|
|
|
|
|
status = WvStatus(Status::OK);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_aidl_return->keySetId = keySetId;
|
|
|
|
|
@@ -571,7 +568,7 @@ SecurityLevel WVDrmPlugin::mapSecurityLevel(const std::string& level) {
|
|
|
|
|
const std::string& in_certificateType,
|
|
|
|
|
const std::string& in_certificateAuthority,
|
|
|
|
|
::aidl::android::hardware::drm::ProvisionRequest* _aidl_return) {
|
|
|
|
|
Status status = Status::OK;
|
|
|
|
|
WvStatus status(Status::OK);
|
|
|
|
|
std::string defaultUrl;
|
|
|
|
|
vector<uint8_t> request;
|
|
|
|
|
|
|
|
|
|
@@ -629,7 +626,7 @@ SecurityLevel WVDrmPlugin::mapSecurityLevel(const std::string& level) {
|
|
|
|
|
vector<uint8_t> wrappedKey;
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
_aidl_return->certificate = certificate;
|
|
|
|
|
_aidl_return->wrappedKey = wrappedKey;
|
|
|
|
|
@@ -664,7 +661,7 @@ SecurityLevel WVDrmPlugin::mapSecurityLevel(const std::string& level) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
return unprovision(kDefaultCdmIdentifier);
|
|
|
|
|
return unprovision(kDefaultCdmIdentifier).get();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
::ndk::ScopedAStatus WVDrmPlugin::getSecureStop(
|
|
|
|
|
@@ -679,7 +676,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
SecureStop secureStop;
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
*_aidl_return = SecureStop();
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
@@ -710,7 +707,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
vector<SecureStop> secureStopsVec;
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
*_aidl_return = secureStopsVec;
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
@@ -756,7 +753,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
}
|
|
|
|
|
@@ -770,7 +767,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
::ndk::ScopedAStatus WVDrmPlugin::getMetrics(
|
|
|
|
|
vector<::aidl::android::hardware::drm::DrmMetricGroup>* _aidl_return) {
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
*_aidl_return = vector<DrmMetricGroup>();
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
@@ -795,7 +792,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
vector<SecureStopId> secureStopIds;
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
*_aidl_return = secureStopIds;
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
@@ -825,7 +822,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
}
|
|
|
|
|
@@ -843,7 +840,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
}
|
|
|
|
|
@@ -857,7 +854,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
|
|
|
|
|
::ndk::ScopedAStatus WVDrmPlugin::removeAllSecureStops() {
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
}
|
|
|
|
|
@@ -873,7 +870,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
HdcpLevel maxLevel = HdcpLevel::HDCP_NO_OUTPUT;
|
|
|
|
|
|
|
|
|
|
std::string level;
|
|
|
|
|
Status status = queryProperty(wvcdm::QUERY_KEY_CURRENT_HDCP_LEVEL, level);
|
|
|
|
|
auto status = queryProperty(wvcdm::QUERY_KEY_CURRENT_HDCP_LEVEL, level);
|
|
|
|
|
if (status == Status::OK) {
|
|
|
|
|
connectedLevel = mapHdcpLevel(level);
|
|
|
|
|
} else {
|
|
|
|
|
@@ -904,8 +901,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
uint32_t maxSessions = 1;
|
|
|
|
|
|
|
|
|
|
std::string value;
|
|
|
|
|
Status status =
|
|
|
|
|
queryProperty(wvcdm::QUERY_KEY_NUMBER_OF_OPEN_SESSIONS, value);
|
|
|
|
|
auto status = queryProperty(wvcdm::QUERY_KEY_NUMBER_OF_OPEN_SESSIONS, value);
|
|
|
|
|
if (status == Status::OK) {
|
|
|
|
|
currentSessions = std::strtoul(value.c_str(), nullptr, 10);
|
|
|
|
|
} else {
|
|
|
|
|
@@ -963,7 +959,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
vector<KeySetId> keySetIdsVec;
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
*_aidl_return = keySetIdsVec;
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
@@ -1005,7 +1001,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
*_aidl_return = licenseState;
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
@@ -1052,7 +1048,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
auto status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
}
|
|
|
|
|
@@ -1066,15 +1062,15 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
CdmResponseType res = mCDM->RemoveOfflineLicense(
|
|
|
|
|
std::string(in_keySetId.keySetId.begin(), in_keySetId.keySetId.end()),
|
|
|
|
|
wvcdm::kSecurityLevelL3, identifier);
|
|
|
|
|
status = mapCdmResponseType(res);
|
|
|
|
|
return toNdkScopedAStatus(mapCdmResponseType(res));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return toNdkScopedAStatus(status);
|
|
|
|
|
return toNdkScopedAStatus(Status::OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
::ndk::ScopedAStatus WVDrmPlugin::getPropertyString(
|
|
|
|
|
const std::string& in_propertyName, std::string* _aidl_return) {
|
|
|
|
|
Status status = Status::OK;
|
|
|
|
|
WvStatus status(Status::OK);
|
|
|
|
|
std::string name(in_propertyName.c_str());
|
|
|
|
|
std::string value;
|
|
|
|
|
|
|
|
|
|
@@ -1169,7 +1165,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
|
|
|
|
|
::ndk::ScopedAStatus WVDrmPlugin::getPropertyByteArray(
|
|
|
|
|
const std::string& in_propertyName, vector<uint8_t>* _aidl_return) {
|
|
|
|
|
Status status = Status::OK;
|
|
|
|
|
WvStatus status(Status::OK);
|
|
|
|
|
std::string name(in_propertyName.c_str());
|
|
|
|
|
vector<uint8_t> value;
|
|
|
|
|
|
|
|
|
|
@@ -1198,7 +1194,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
status = mCdmIdentifierBuilder.getCdmIdentifier(&identifier);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
ALOGE("Unexpected error retrieving cdm identifier: %d", status);
|
|
|
|
|
ALOGE("Unexpected error retrieving cdm identifier: %d", status.get());
|
|
|
|
|
} else {
|
|
|
|
|
status = mapCdmResponseType(mCDM->GetMetrics(identifier, &metrics));
|
|
|
|
|
}
|
|
|
|
|
@@ -1206,14 +1202,14 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
if (status == Status::OK) {
|
|
|
|
|
std::string serialized_metrics;
|
|
|
|
|
if (!metrics.SerializeToString(&serialized_metrics)) {
|
|
|
|
|
status = Status::ERROR_DRM_UNKNOWN;
|
|
|
|
|
status = WvStatus(Status::ERROR_DRM_UNKNOWN);
|
|
|
|
|
} else {
|
|
|
|
|
value = StrToVector(serialized_metrics);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
ALOGE("App requested unknown byte array property %s", name.c_str());
|
|
|
|
|
status = Status::ERROR_DRM_CANNOT_HANDLE;
|
|
|
|
|
status = WvStatus(Status::ERROR_DRM_CANNOT_HANDLE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
*_aidl_return = value;
|
|
|
|
|
@@ -1232,7 +1228,7 @@ Status WVDrmPlugin::unprovisionDevice() {
|
|
|
|
|
} else if (_value == wvcdm::QUERY_VALUE_SECURITY_LEVEL_L1.c_str()) {
|
|
|
|
|
// We must be sure we CAN set the security level to L1.
|
|
|
|
|
std::string current_security_level;
|
|
|
|
|
Status status =
|
|
|
|
|
auto status =
|
|
|
|
|
queryProperty(wvcdm::kLevelDefault, wvcdm::QUERY_KEY_SECURITY_LEVEL,
|
|
|
|
|
current_security_level);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
@@ -1836,14 +1832,14 @@ void WVDrmPlugin::OnSessionLostState(const CdmSessionId& cdmSessionId) {
|
|
|
|
|
sendSessionLostState(sessionId);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::queryProperty(const std::string& property,
|
|
|
|
|
std::string& stringValue) const {
|
|
|
|
|
WvStatus WVDrmPlugin::queryProperty(const std::string& property,
|
|
|
|
|
std::string& stringValue) const {
|
|
|
|
|
return queryProperty(getRequestedSecurityLevel(), property, stringValue);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::queryProperty(RequestedSecurityLevel securityLevel,
|
|
|
|
|
const std::string& property,
|
|
|
|
|
std::string& stringValue) const {
|
|
|
|
|
WvStatus WVDrmPlugin::queryProperty(RequestedSecurityLevel securityLevel,
|
|
|
|
|
const std::string& property,
|
|
|
|
|
std::string& stringValue) const {
|
|
|
|
|
CdmResponseType res =
|
|
|
|
|
mCDM->QueryStatus(securityLevel, property, &stringValue);
|
|
|
|
|
|
|
|
|
|
@@ -1859,13 +1855,13 @@ Status WVDrmPlugin::queryProperty(RequestedSecurityLevel securityLevel,
|
|
|
|
|
return binder;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::queryProperty(const std::string& property,
|
|
|
|
|
vector<uint8_t>& vector_value) const {
|
|
|
|
|
WvStatus WVDrmPlugin::queryProperty(const std::string& property,
|
|
|
|
|
vector<uint8_t>& vector_value) const {
|
|
|
|
|
std::string string_value;
|
|
|
|
|
Status status = queryProperty(property, string_value);
|
|
|
|
|
auto status = queryProperty(property, string_value);
|
|
|
|
|
if (status != Status::OK) return status;
|
|
|
|
|
vector_value = StrToVector(string_value);
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool WVDrmPlugin::isProvisioned(wvcdm::CdmSecurityLevel securityLevel,
|
|
|
|
|
@@ -1875,7 +1871,7 @@ bool WVDrmPlugin::isProvisioned(wvcdm::CdmSecurityLevel securityLevel,
|
|
|
|
|
return mCDM->IsProvisioned(securityLevel, origin, spoid, atsc_mode_enabled);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::mapAndNotifyOfCdmResponseType(
|
|
|
|
|
WvStatus WVDrmPlugin::mapAndNotifyOfCdmResponseType(
|
|
|
|
|
const vector<uint8_t>& sessionId, CdmResponseType res) {
|
|
|
|
|
notifyOfCdmResponseType(sessionId, res);
|
|
|
|
|
return mapCdmResponseType(res);
|
|
|
|
|
@@ -1964,7 +1960,7 @@ bool WVDrmPlugin::initDataResemblesPSSH(const vector<uint8_t>& initData) {
|
|
|
|
|
return id == kPsshTag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::unprovision(const CdmIdentifier& identifier) {
|
|
|
|
|
WvStatus WVDrmPlugin::unprovision(const CdmIdentifier& identifier) {
|
|
|
|
|
if (mPropertySet.use_atsc_mode())
|
|
|
|
|
return mapCdmResponseType(wvcdm::PROVISIONING_NOT_ALLOWED_FOR_ATSC);
|
|
|
|
|
|
|
|
|
|
@@ -1990,44 +1986,44 @@ WVDrmPlugin::CdmIdentifierBuilder::CdmIdentifierBuilder(
|
|
|
|
|
mCdmIdentifier.user_id = wvutil::GetIpcCallingUid();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::CdmIdentifierBuilder::getCdmIdentifier(
|
|
|
|
|
WvStatus WVDrmPlugin::CdmIdentifierBuilder::getCdmIdentifier(
|
|
|
|
|
CdmIdentifier* identifier) {
|
|
|
|
|
if (!mIsIdentifierSealed) {
|
|
|
|
|
Status res = calculateSpoid();
|
|
|
|
|
auto res = calculateSpoid();
|
|
|
|
|
if (res != Status::OK) return res;
|
|
|
|
|
mIsIdentifierSealed = true;
|
|
|
|
|
}
|
|
|
|
|
*identifier = mCdmIdentifier;
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::CdmIdentifierBuilder::getDeviceUniqueId(std::string* id) {
|
|
|
|
|
WvStatus WVDrmPlugin::CdmIdentifierBuilder::getDeviceUniqueId(std::string* id) {
|
|
|
|
|
if (mUseSpoid) {
|
|
|
|
|
CdmIdentifier identifier;
|
|
|
|
|
Status res = getCdmIdentifier(&identifier);
|
|
|
|
|
auto res = getCdmIdentifier(&identifier);
|
|
|
|
|
if (res != Status::OK) return res;
|
|
|
|
|
|
|
|
|
|
*id = identifier.spoid;
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
} else {
|
|
|
|
|
return getOemcryptoDeviceId(id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::CdmIdentifierBuilder::getProvisioningUniqueId(
|
|
|
|
|
WvStatus WVDrmPlugin::CdmIdentifierBuilder::getProvisioningUniqueId(
|
|
|
|
|
std::string* id) {
|
|
|
|
|
if (mUseSpoid) {
|
|
|
|
|
// To fake a provisioning-unique ID on SPOID devices where we can't expose
|
|
|
|
|
// the real provisioning-unique ID, we just use the SPOID and invert all
|
|
|
|
|
// the bits.
|
|
|
|
|
Status res = getDeviceUniqueId(id);
|
|
|
|
|
auto res = getDeviceUniqueId(id);
|
|
|
|
|
if (res != Status::OK) return res;
|
|
|
|
|
|
|
|
|
|
for (char& c : *id) {
|
|
|
|
|
c = ~c;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
} else {
|
|
|
|
|
return mParent.queryProperty(wvcdm::QUERY_KEY_PROVISIONING_ID, *id);
|
|
|
|
|
}
|
|
|
|
|
@@ -2046,16 +2042,16 @@ bool WVDrmPlugin::CdmIdentifierBuilder::set_use_atsc_mode(bool enable) {
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::CdmIdentifierBuilder::calculateSpoid() {
|
|
|
|
|
if (!mUseSpoid) return Status::OK;
|
|
|
|
|
WvStatus WVDrmPlugin::CdmIdentifierBuilder::calculateSpoid() {
|
|
|
|
|
if (!mUseSpoid) return WvStatus(Status::OK);
|
|
|
|
|
|
|
|
|
|
// Calculate SPOID for default security level if appropriate
|
|
|
|
|
std::string deviceId;
|
|
|
|
|
if (mParent.getRequestedSecurityLevel() == wvcdm::kLevelDefault) {
|
|
|
|
|
Status res = getOemcryptoDeviceId(&deviceId);
|
|
|
|
|
auto res = getOemcryptoDeviceId(&deviceId);
|
|
|
|
|
if (res != Status::OK) return res;
|
|
|
|
|
|
|
|
|
|
return calculateSpoid(deviceId, &mCdmIdentifier.spoid);
|
|
|
|
|
return WvStatus(calculateSpoid(deviceId, &mCdmIdentifier.spoid));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If requested security level is L3, possibilities are
|
|
|
|
|
@@ -2066,12 +2062,12 @@ Status WVDrmPlugin::CdmIdentifierBuilder::calculateSpoid() {
|
|
|
|
|
// provisioned with this SPOID, return this SPOID. Check (c) next. Get L1
|
|
|
|
|
// device ID, calculate SPOID and if provisioned with this SPOID, return
|
|
|
|
|
// this SPOID. On any errors in (c) or not provisioned return L3 SPOID.
|
|
|
|
|
Status res = getOemcryptoDeviceId(wvcdm::kLevel3, &deviceId);
|
|
|
|
|
auto res = getOemcryptoDeviceId(wvcdm::kLevel3, &deviceId);
|
|
|
|
|
if (res != Status::OK) return res;
|
|
|
|
|
|
|
|
|
|
std::string spoidL3;
|
|
|
|
|
res = calculateSpoid(deviceId, &spoidL3);
|
|
|
|
|
if (res != Status::OK) return res;
|
|
|
|
|
auto status = calculateSpoid(deviceId, &spoidL3);
|
|
|
|
|
if (status != Status::OK) return WvStatus(status);
|
|
|
|
|
|
|
|
|
|
bool atsc_mode_enabled =
|
|
|
|
|
mCdmIdentifier.app_package_name == wvcdm::ATSC_APP_PACKAGE_NAME;
|
|
|
|
|
@@ -2079,7 +2075,7 @@ Status WVDrmPlugin::CdmIdentifierBuilder::calculateSpoid() {
|
|
|
|
|
if (mParent.isProvisioned(wvcdm::kSecurityLevelL3, origin(), spoidL3,
|
|
|
|
|
atsc_mode_enabled)) {
|
|
|
|
|
mCdmIdentifier.spoid = spoidL3;
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Not provisioned with CdmIdentifier containing SPOID with L3 device ID.
|
|
|
|
|
@@ -2088,33 +2084,33 @@ Status WVDrmPlugin::CdmIdentifierBuilder::calculateSpoid() {
|
|
|
|
|
res = getOemcryptoDeviceId(wvcdm::kLevelDefault, &deviceIdLevelDefault);
|
|
|
|
|
if (res != Status::OK) {
|
|
|
|
|
mCdmIdentifier.spoid = spoidL3;
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If the L3 and default security level IDs are identical then the
|
|
|
|
|
// device does not support L1.
|
|
|
|
|
if (deviceId == deviceIdLevelDefault) {
|
|
|
|
|
mCdmIdentifier.spoid = spoidL3;
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
std::string spoidLevelDefault;
|
|
|
|
|
res = calculateSpoid(deviceIdLevelDefault, &spoidLevelDefault);
|
|
|
|
|
if (res != Status::OK) {
|
|
|
|
|
status = calculateSpoid(deviceIdLevelDefault, &spoidLevelDefault);
|
|
|
|
|
if (status != Status::OK) {
|
|
|
|
|
mCdmIdentifier.spoid = spoidL3;
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (mParent.isProvisioned(wvcdm::kSecurityLevelL1, origin(),
|
|
|
|
|
spoidLevelDefault, atsc_mode_enabled)) {
|
|
|
|
|
mCdmIdentifier.spoid = spoidLevelDefault;
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Not provisioned with CdmIdentifier containing SPOID with L1 or L3
|
|
|
|
|
// device ID. Return L3 SPOID.
|
|
|
|
|
mCdmIdentifier.spoid = spoidL3;
|
|
|
|
|
return Status::OK;
|
|
|
|
|
return WvStatus(Status::OK);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::CdmIdentifierBuilder::calculateSpoid(
|
|
|
|
|
@@ -2138,12 +2134,12 @@ Status WVDrmPlugin::CdmIdentifierBuilder::calculateSpoid(
|
|
|
|
|
return Status::OK;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::CdmIdentifierBuilder::getOemcryptoDeviceId(
|
|
|
|
|
WvStatus WVDrmPlugin::CdmIdentifierBuilder::getOemcryptoDeviceId(
|
|
|
|
|
std::string* id) {
|
|
|
|
|
return mParent.queryProperty(wvcdm::QUERY_KEY_DEVICE_ID, *id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Status WVDrmPlugin::CdmIdentifierBuilder::getOemcryptoDeviceId(
|
|
|
|
|
WvStatus WVDrmPlugin::CdmIdentifierBuilder::getOemcryptoDeviceId(
|
|
|
|
|
wvcdm::RequestedSecurityLevel securityLevel, std::string* id) {
|
|
|
|
|
return mParent.queryProperty(securityLevel, wvcdm::QUERY_KEY_DEVICE_ID, *id);
|
|
|
|
|
}
|
|
|
|
|
|