Merge "Add securityLevel to MediaDrm isCryptoSchemeSupported API"

gugelfrei
Jeff Tinker 6 years ago committed by Android (Google) Code Review
commit 04a71420a8

@ -145,6 +145,23 @@ static DrmPlugin::SecurityLevel toSecurityLevel(SecurityLevel level) {
}
}
static SecurityLevel toHidlSecurityLevel(DrmPlugin::SecurityLevel level) {
switch(level) {
case DrmPlugin::kSecurityLevelSwSecureCrypto:
return SecurityLevel::SW_SECURE_CRYPTO;
case DrmPlugin::kSecurityLevelSwSecureDecode:
return SecurityLevel::SW_SECURE_DECODE;
case DrmPlugin::kSecurityLevelHwSecureCrypto:
return SecurityLevel::HW_SECURE_CRYPTO;
case DrmPlugin::kSecurityLevelHwSecureDecode:
return SecurityLevel::HW_SECURE_DECODE;
case DrmPlugin::kSecurityLevelHwSecureAll:
return SecurityLevel::HW_SECURE_ALL;
default:
return SecurityLevel::UNKNOWN;
}
}
static DrmPlugin::OfflineLicenseState toOfflineLicenseState(
OfflineLicenseState licenseState) {
switch(licenseState) {
@ -569,16 +586,39 @@ Return<void> DrmHal::sendSessionLostState(
return Void();
}
bool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
bool DrmHal::matchMimeTypeAndSecurityLevel(sp<IDrmFactory> &factory,
const uint8_t uuid[16],
const String8 &mimeType,
DrmPlugin::SecurityLevel level) {
if (mimeType == "") {
return true;
} else if (!factory->isContentTypeSupported(mimeType.string())) {
return false;
}
if (level == DrmPlugin::kSecurityLevelUnknown) {
return true;
} else {
sp<drm::V1_2::IDrmFactory> factoryV1_2 = drm::V1_2::IDrmFactory::castFrom(factory);
if (factoryV1_2 == NULL) {
return true;
} else if (factoryV1_2->isCryptoSchemeSupported_1_2(uuid,
mimeType.string(), toHidlSecurityLevel(level))) {
return true;
}
}
return false;
}
bool DrmHal::isCryptoSchemeSupported(const uint8_t uuid[16],
const String8 &mimeType,
DrmPlugin::SecurityLevel level) {
Mutex::Autolock autoLock(mLock);
for (size_t i = 0; i < mFactories.size(); i++) {
if (mFactories[i]->isCryptoSchemeSupported(uuid)) {
if (mimeType != "") {
if (mFactories[i]->isContentTypeSupported(mimeType.string())) {
return true;
}
} else {
sp<IDrmFactory> factory = mFactories[i];
if (factory->isCryptoSchemeSupported(uuid)) {
if (matchMimeTypeAndSecurityLevel(factory, uuid, mimeType, level)) {
return true;
}
}
@ -634,30 +674,15 @@ status_t DrmHal::openSession(DrmPlugin::SecurityLevel level,
Mutex::Autolock autoLock(mLock);
INIT_CHECK();
SecurityLevel hSecurityLevel;
SecurityLevel hSecurityLevel = toHidlSecurityLevel(level);
bool setSecurityLevel = true;
switch(level) {
case DrmPlugin::kSecurityLevelSwSecureCrypto:
hSecurityLevel = SecurityLevel::SW_SECURE_CRYPTO;
break;
case DrmPlugin::kSecurityLevelSwSecureDecode:
hSecurityLevel = SecurityLevel::SW_SECURE_DECODE;
break;
case DrmPlugin::kSecurityLevelHwSecureCrypto:
hSecurityLevel = SecurityLevel::HW_SECURE_CRYPTO;
break;
case DrmPlugin::kSecurityLevelHwSecureDecode:
hSecurityLevel = SecurityLevel::HW_SECURE_DECODE;
break;
case DrmPlugin::kSecurityLevelHwSecureAll:
hSecurityLevel = SecurityLevel::HW_SECURE_ALL;
break;
case DrmPlugin::kSecurityLevelMax:
if (level == DrmPlugin::kSecurityLevelMax) {
setSecurityLevel = false;
break;
default:
return ERROR_DRM_CANNOT_HANDLE;
} else {
if (hSecurityLevel == SecurityLevel::UNKNOWN) {
return ERROR_DRM_CANNOT_HANDLE;
}
}
status_t err = UNKNOWN_ERROR;

@ -83,11 +83,14 @@ struct BpDrm : public BpInterface<IDrm> {
return reply.readInt32();
}
virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) {
virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType,
DrmPlugin::SecurityLevel level) {
Parcel data, reply;
data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
data.write(uuid, 16);
data.writeString8(mimeType);
data.writeInt32(level);
status_t status = remote()->transact(IS_CRYPTO_SUPPORTED, data, &reply);
if (status != OK) {
ALOGE("isCryptoSchemeSupported: binder call failed: %d", status);
@ -123,11 +126,11 @@ struct BpDrm : public BpInterface<IDrm> {
return reply.readInt32();
}
virtual status_t openSession(DrmPlugin::SecurityLevel securityLevel,
virtual status_t openSession(DrmPlugin::SecurityLevel level,
Vector<uint8_t> &sessionId) {
Parcel data, reply;
data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
data.writeInt32(securityLevel);
data.writeInt32(level);
status_t status = remote()->transact(OPEN_SESSION, data, &reply);
if (status != OK) {
@ -768,7 +771,9 @@ status_t BnDrm::onTransact(
uint8_t uuid[16];
data.read(uuid, sizeof(uuid));
String8 mimeType = data.readString8();
reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType));
DrmPlugin::SecurityLevel level =
static_cast<DrmPlugin::SecurityLevel>(data.readInt32());
reply->writeInt32(isCryptoSchemeSupported(uuid, mimeType, level));
return OK;
}

@ -34,6 +34,7 @@ namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::Status;
using ::android::hardware::drm::V1_1::SecurityLevel;
using ::android::hardware::Void;
Return<bool> DrmFactory::isCryptoSchemeSupported(
@ -41,6 +42,13 @@ Return<bool> DrmFactory::isCryptoSchemeSupported(
return clearkeydrm::isClearKeyUUID(uuid.data());
}
Return<bool> DrmFactory::isCryptoSchemeSupported_1_2(const hidl_array<uint8_t, 16>& uuid,
const hidl_string &mimeType,
SecurityLevel level) {
return isCryptoSchemeSupported(uuid) && isContentTypeSupported(mimeType) &&
level == SecurityLevel::SW_SECURE_CRYPTO;
}
Return<bool> DrmFactory::isContentTypeSupported(const hidl_string &mimeType) {
// This should match the mimeTypes handed by InitDataParser.
return mimeType == kIsoBmffVideoMimeType ||

@ -28,6 +28,7 @@ namespace V1_2 {
namespace clearkey {
using ::android::hardware::drm::V1_0::KeyValue;
using ::android::hardware::drm::V1_1::SecurityLevel;
using ::android::hardware::hidl_vec;
const uint8_t kBlockSize = 16; //AES_BLOCK_SIZE;

@ -39,6 +39,10 @@ struct DrmFactory : public IDrmFactory {
Return<bool> isCryptoSchemeSupported(const hidl_array<uint8_t, 16>& uuid)
override;
Return<bool> isCryptoSchemeSupported_1_2(const hidl_array<uint8_t, 16>& uuid,
const hidl_string& mimeType,
SecurityLevel level) override;
Return<bool> isContentTypeSupported(const hidl_string &mimeType)
override;

@ -38,6 +38,7 @@ using drm::V1_0::IDrmFactory;
using drm::V1_0::IDrmPlugin;
using drm::V1_0::IDrmPluginListener;
using drm::V1_0::KeyStatus;
using drm::V1_1::SecurityLevel;
using drm::V1_2::OfflineLicenseState;
using ::android::hardware::hidl_vec;
using ::android::hardware::Return;
@ -62,7 +63,9 @@ struct DrmHal : public BnDrm,
virtual status_t initCheck() const;
virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType);
virtual bool isCryptoSchemeSupported(const uint8_t uuid[16],
const String8& mimeType,
DrmPlugin::SecurityLevel level);
virtual status_t createPlugin(const uint8_t uuid[16],
const String8 &appPackageName);
@ -223,6 +226,10 @@ private:
status_t getPropertyStringInternal(String8 const &name, String8 &value) const;
status_t getPropertyByteArrayInternal(String8 const &name,
Vector<uint8_t> &value) const;
bool matchMimeTypeAndSecurityLevel(sp<IDrmFactory> &factory,
const uint8_t uuid[16],
const String8 &mimeType,
DrmPlugin::SecurityLevel level);
DISALLOW_EVIL_CONSTRUCTORS(DrmHal);
};

@ -34,7 +34,9 @@ struct IDrm : public IInterface {
virtual status_t initCheck() const = 0;
virtual bool isCryptoSchemeSupported(const uint8_t uuid[16], const String8 &mimeType) = 0;
virtual bool isCryptoSchemeSupported(const uint8_t uuid[16],
const String8 &mimeType,
DrmPlugin::SecurityLevel securityLevel) = 0;
virtual status_t createPlugin(const uint8_t uuid[16],
const String8 &appPackageName) = 0;

@ -159,7 +159,8 @@ Vector<DrmUUID> NuPlayerDrm::getSupportedDrmSchemes(const void *pssh, size_t pss
if (drm != NULL) {
for (size_t i = 0; i < psshDRMs.size(); i++) {
DrmUUID uuid = psshDRMs[i];
if (drm->isCryptoSchemeSupported(uuid.ptr(), String8()))
if (drm->isCryptoSchemeSupported(uuid.ptr(), String8(),
DrmPlugin::kSecurityLevelUnknown))
supportedDRMs.add(uuid);
}

@ -274,7 +274,7 @@ bool AMediaDrm_isCryptoSchemeSupported(const AMediaUUID uuid, const char *mimeTy
}
String8 mimeStr = mimeType ? String8(mimeType) : String8("");
return drm->isCryptoSchemeSupported(uuid, mimeStr);
return drm->isCryptoSchemeSupported(uuid, mimeStr, DrmPlugin::kSecurityLevelUnknown);
}
EXPORT

Loading…
Cancel
Save