Merge changes from topic "fix_set_security_level"

* changes:
  Fix build error in topic fix_set_security_level
  Revert "Revert "Update drm hal to find drm@1.1 factories""
  Revert "Revert "Fix MediaDrm security level APIs""
gugelfrei
TreeHugger Robot 6 years ago committed by Android (Google) Code Review
commit e54461ae13

@ -118,15 +118,24 @@ Vector<sp<ICryptoFactory>> CryptoHal::makeCryptoFactories() {
auto manager = ::IServiceManager::getService();
if (manager != NULL) {
manager->listByInterface(ICryptoFactory::descriptor,
manager->listByInterface(drm::V1_0::ICryptoFactory::descriptor,
[&factories](const hidl_vec<hidl_string> &registered) {
for (const auto &instance : registered) {
auto factory = ICryptoFactory::getService(instance);
auto factory = drm::V1_0::ICryptoFactory::getService(instance);
if (factory != NULL) {
ALOGD("found drm@1.0 ICryptoFactory %s", instance.c_str());
factories.push_back(factory);
}
}
}
);
manager->listByInterface(drm::V1_1::ICryptoFactory::descriptor,
[&factories](const hidl_vec<hidl_string> &registered) {
for (const auto &instance : registered) {
auto factory = drm::V1_1::ICryptoFactory::getService(instance);
if (factory != NULL) {
ALOGD("found drm@1.1 ICryptoFactory %s", instance.c_str());
factories.push_back(factory);
ALOGI("makeCryptoFactories: factory instance %s is %s",
instance.c_str(),
factory->isRemote() ? "Remote" : "Not Remote");
}
}
}
@ -137,7 +146,7 @@ Vector<sp<ICryptoFactory>> CryptoHal::makeCryptoFactories() {
// must be in passthrough mode, load the default passthrough service
auto passthrough = ICryptoFactory::getService();
if (passthrough != NULL) {
ALOGI("makeCryptoFactories: using default crypto instance");
ALOGI("makeCryptoFactories: using default passthrough crypto instance");
factories.push_back(passthrough);
} else {
ALOGE("Failed to find any crypto factories");

@ -21,8 +21,6 @@
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
#include <android/hardware/drm/1.0/IDrmFactory.h>
#include <android/hardware/drm/1.0/IDrmPlugin.h>
#include <android/hardware/drm/1.0/types.h>
#include <android/hidl/manager/1.0/IServiceManager.h>
#include <hidl/ServiceManagement.h>
@ -271,15 +269,24 @@ Vector<sp<IDrmFactory>> DrmHal::makeDrmFactories() {
auto manager = hardware::defaultServiceManager();
if (manager != NULL) {
manager->listByInterface(IDrmFactory::descriptor,
manager->listByInterface(drm::V1_0::IDrmFactory::descriptor,
[&factories](const hidl_vec<hidl_string> &registered) {
for (const auto &instance : registered) {
auto factory = IDrmFactory::getService(instance);
auto factory = drm::V1_0::IDrmFactory::getService(instance);
if (factory != NULL) {
ALOGD("found drm@1.0 IDrmFactory %s", instance.c_str());
factories.push_back(factory);
}
}
}
);
manager->listByInterface(drm::V1_1::IDrmFactory::descriptor,
[&factories](const hidl_vec<hidl_string> &registered) {
for (const auto &instance : registered) {
auto factory = drm::V1_1::IDrmFactory::getService(instance);
if (factory != NULL) {
ALOGD("found drm@1.1 IDrmFactory %s", instance.c_str());
factories.push_back(factory);
ALOGI("makeDrmFactories: factory instance %s is %s",
instance.c_str(),
factory->isRemote() ? "Remote" : "Not Remote");
}
}
}
@ -290,7 +297,7 @@ Vector<sp<IDrmFactory>> DrmHal::makeDrmFactories() {
// must be in passthrough mode, load the default passthrough service
auto passthrough = IDrmFactory::getService();
if (passthrough != NULL) {
ALOGI("makeDrmFactories: using default drm instance");
ALOGI("makeDrmFactories: using default passthrough drm instance");
factories.push_back(passthrough);
} else {
ALOGE("Failed to find any drm factories");
@ -510,24 +517,62 @@ status_t DrmHal::destroyPlugin() {
return OK;
}
status_t DrmHal::openSession(Vector<uint8_t> &sessionId) {
status_t DrmHal::openSession(DrmPlugin::SecurityLevel level,
Vector<uint8_t> &sessionId) {
Mutex::Autolock autoLock(mLock);
INIT_CHECK();
status_t err = UNKNOWN_ERROR;
SecurityLevel hSecurityLevel;
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:
setSecurityLevel = false;
break;
default:
return ERROR_DRM_CANNOT_HANDLE;
}
status_t err = UNKNOWN_ERROR;
bool retry = true;
do {
hidl_vec<uint8_t> hSessionId;
Return<void> hResult = mPlugin->openSession(
[&](Status status, const hidl_vec<uint8_t>& id) {
if (status == Status::OK) {
sessionId = toVector(id);
Return<void> hResult;
if (mPluginV1_1 == NULL || !setSecurityLevel) {
hResult = mPlugin->openSession(
[&](Status status,const hidl_vec<uint8_t>& id) {
if (status == Status::OK) {
sessionId = toVector(id);
}
err = toStatusT(status);
}
err = toStatusT(status);
}
);
);
} else {
hResult = mPluginV1_1->openSession_1_1(hSecurityLevel,
[&](Status status, const hidl_vec<uint8_t>& id) {
if (status == Status::OK) {
sessionId = toVector(id);
}
err = toStatusT(status);
}
);
}
if (!hResult.isOk()) {
err = DEAD_OBJECT;
@ -979,42 +1024,6 @@ status_t DrmHal::getSecurityLevel(Vector<uint8_t> const &sessionId,
return hResult.isOk() ? err : DEAD_OBJECT;
}
status_t DrmHal::setSecurityLevel(Vector<uint8_t> const &sessionId,
const DrmPlugin::SecurityLevel& level) {
Mutex::Autolock autoLock(mLock);
INIT_CHECK();
if (mPluginV1_1 == NULL) {
return ERROR_DRM_CANNOT_HANDLE;
}
SecurityLevel hSecurityLevel;
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;
default:
return ERROR_DRM_CANNOT_HANDLE;
}
Status status = mPluginV1_1->setSecurityLevel(toHidlVec(sessionId),
hSecurityLevel);
return toStatusT(status);
}
status_t DrmHal::getPropertyString(String8 const &name, String8 &value ) const {
Mutex::Autolock autoLock(mLock);
return getPropertyStringInternal(name, value);

@ -60,7 +60,6 @@ enum {
GET_HDCP_LEVELS,
GET_NUMBER_OF_SESSIONS,
GET_SECURITY_LEVEL,
SET_SECURITY_LEVEL,
REMOVE_SECURE_STOP,
GET_SECURE_STOP_IDS
};
@ -121,9 +120,11 @@ struct BpDrm : public BpInterface<IDrm> {
return reply.readInt32();
}
virtual status_t openSession(Vector<uint8_t> &sessionId) {
virtual status_t openSession(DrmPlugin::SecurityLevel securityLevel,
Vector<uint8_t> &sessionId) {
Parcel data, reply;
data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
data.writeInt32(securityLevel);
status_t status = remote()->transact(OPEN_SESSION, data, &reply);
if (status != OK) {
@ -448,23 +449,6 @@ struct BpDrm : public BpInterface<IDrm> {
return reply.readInt32();
}
virtual status_t setSecurityLevel(Vector<uint8_t> const &sessionId,
const DrmPlugin::SecurityLevel& level) {
Parcel data, reply;
data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
writeVector(data, sessionId);
data.writeInt32(static_cast<uint32_t>(level));
status_t status = remote()->transact(SET_SECURITY_LEVEL, data, &reply);
if (status != OK) {
return status;
}
return reply.readInt32();
}
virtual status_t getPropertyByteArray(String8 const &name, Vector<uint8_t> &value) const {
Parcel data, reply;
data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
@ -742,8 +726,10 @@ status_t BnDrm::onTransact(
case OPEN_SESSION:
{
CHECK_INTERFACE(IDrm, data, reply);
DrmPlugin::SecurityLevel level =
static_cast<DrmPlugin::SecurityLevel>(data.readInt32());
Vector<uint8_t> sessionId;
status_t result = openSession(sessionId);
status_t result = openSession(level, sessionId);
writeVector(reply, sessionId);
reply->writeInt32(result);
return OK;
@ -977,18 +963,6 @@ status_t BnDrm::onTransact(
return OK;
}
case SET_SECURITY_LEVEL:
{
CHECK_INTERFACE(IDrm, data, reply);
Vector<uint8_t> sessionId;
readVector(data, sessionId);
DrmPlugin::SecurityLevel level =
static_cast<DrmPlugin::SecurityLevel>(data.readInt32());
status_t result = setSecurityLevel(sessionId, level);
reply->writeInt32(result);
return OK;
}
case GET_PROPERTY_STRING:
{
CHECK_INTERFACE(IDrm, data, reply);

@ -73,12 +73,24 @@ void DrmPlugin::initProperties() {
mByteArrayProperties[kMetricsKey] = valueVector;
}
Return<void> DrmPlugin::openSession(openSession_cb _hidl_cb) {
sp<Session> session = mSessionLibrary->createSession();
std::vector<uint8_t> sessionId = session->sessionId();
setSecurityLevel(sessionId, SecurityLevel::SW_SECURE_CRYPTO);
_hidl_cb(Status::OK, toHidlVec(sessionId));
Status status = setSecurityLevel(sessionId, SecurityLevel::SW_SECURE_CRYPTO);
_hidl_cb(status, toHidlVec(sessionId));
mOpenSessionOkCount++;
return Void();
}
Return<void> DrmPlugin::openSession_1_1(SecurityLevel securityLevel,
openSession_1_1_cb _hidl_cb) {
sp<Session> session = mSessionLibrary->createSession();
std::vector<uint8_t> sessionId = session->sessionId();
Status status = setSecurityLevel(sessionId, securityLevel);
_hidl_cb(status, toHidlVec(sessionId));
mOpenSessionOkCount++;
return Void();
}
@ -344,8 +356,8 @@ Return<Status> DrmPlugin::setSecurityLevel(const hidl_vec<uint8_t>& sessionId,
return Status::BAD_VALUE;
}
if (level > SecurityLevel::HW_SECURE_ALL) {
ALOGE("Cannot set invalid security level");
if (level > SecurityLevel::SW_SECURE_CRYPTO) {
ALOGE("Cannot set security level > max");
return Status::BAD_VALUE;
}

@ -53,6 +53,8 @@ struct DrmPlugin : public IDrmPlugin {
virtual ~DrmPlugin() {}
Return<void> openSession(openSession_cb _hidl_cb) override;
Return<void> openSession_1_1(SecurityLevel securityLevel,
openSession_cb _hidl_cb) override;
Return<Status> closeSession(const hidl_vec<uint8_t>& sessionId) override;
@ -162,9 +164,6 @@ struct DrmPlugin : public IDrmPlugin {
Return<void> getSecurityLevel(const hidl_vec<uint8_t>& sessionId,
getSecurityLevel_cb _hidl_cb) override;
Return<Status> setSecurityLevel(const hidl_vec<uint8_t>& sessionId,
SecurityLevel level) override;
Return<void> getMetrics(getMetrics_cb _hidl_cb) override;
Return<void> getPropertyString(
@ -333,6 +332,9 @@ private:
void initProperties();
void setPlayPolicy();
Return<Status> setSecurityLevel(const hidl_vec<uint8_t>& sessionId,
SecurityLevel level);
std::vector<KeyValue> mPlayPolicy;
std::map<std::string, std::string> mStringProperties;
std::map<std::string, std::vector<uint8_t> > mByteArrayProperties;

@ -20,14 +20,16 @@
#include <android/hardware/drm/1.0/ICryptoFactory.h>
#include <android/hardware/drm/1.0/ICryptoPlugin.h>
#include <android/hardware/drm/1.1/ICryptoFactory.h>
#include <media/ICrypto.h>
#include <utils/KeyedVector.h>
#include <utils/threads.h>
using ::android::hardware::drm::V1_0::ICryptoFactory;
using ::android::hardware::drm::V1_0::ICryptoPlugin;
using ::android::hardware::drm::V1_0::SharedBuffer;
namespace drm = ::android::hardware::drm;
using drm::V1_0::ICryptoFactory;
using drm::V1_0::ICryptoPlugin;
using drm::V1_0::SharedBuffer;
class IMemoryHeap;

@ -18,10 +18,11 @@
#define DRM_HAL_H_
#include <android/hardware/drm/1.0/IDrmFactory.h>
#include <android/hardware/drm/1.0/IDrmPlugin.h>
#include <android/hardware/drm/1.1/IDrmPlugin.h>
#include <android/hardware/drm/1.0/IDrmPluginListener.h>
#include <android/hardware/drm/1.0/IDrmFactory.h>
#include <android/hardware/drm/1.1/IDrmFactory.h>
#include <android/hardware/drm/1.1/IDrmPlugin.h>
#include <media/DrmMetrics.h>
#include <media/IDrm.h>
@ -63,7 +64,8 @@ struct DrmHal : public BnDrm,
virtual status_t destroyPlugin();
virtual status_t openSession(Vector<uint8_t> &sessionId);
virtual status_t openSession(DrmPlugin::SecurityLevel level,
Vector<uint8_t> &sessionId);
virtual status_t closeSession(Vector<uint8_t> const &sessionId);
@ -110,8 +112,6 @@ struct DrmHal : public BnDrm,
uint32_t *maxSessions) const;
virtual status_t getSecurityLevel(Vector<uint8_t> const &sessionId,
DrmPlugin::SecurityLevel *level) const;
virtual status_t setSecurityLevel(Vector<uint8_t> const &sessionId,
const DrmPlugin::SecurityLevel& level);
virtual status_t getPropertyString(String8 const &name, String8 &value ) const;
virtual status_t getPropertyByteArray(String8 const &name,

@ -40,7 +40,8 @@ struct IDrm : public IInterface {
virtual status_t destroyPlugin() = 0;
virtual status_t openSession(Vector<uint8_t> &sessionId) = 0;
virtual status_t openSession(DrmPlugin::SecurityLevel securityLevel,
Vector<uint8_t> &sessionId) = 0;
virtual status_t closeSession(Vector<uint8_t> const &sessionId) = 0;
@ -88,8 +89,6 @@ struct IDrm : public IInterface {
uint32_t *maxSessions) const = 0;
virtual status_t getSecurityLevel(Vector<uint8_t> const &sessionId,
DrmPlugin::SecurityLevel *level) const = 0;
virtual status_t setSecurityLevel(Vector<uint8_t> const &sessionId,
const DrmPlugin::SecurityLevel& level) = 0;
virtual status_t getPropertyString(String8 const &name, String8 &value) const = 0;
virtual status_t getPropertyByteArray(String8 const &name,

@ -12,6 +12,7 @@ cc_test {
"libmediadrm",
"libutils",
"android.hardware.drm@1.0",
"android.hardware.drm@1.1",
],
compile_multilib: "32",

@ -20,7 +20,7 @@
#include <gtest/gtest.h>
#include <media/Drm.h>
#include <media/DrmHal.h>
#include <media/DrmSessionClientInterface.h>
#include <media/DrmSessionManager.h>
#include <media/stagefright/foundation/ADebug.h>

@ -240,7 +240,7 @@ media_status_t AMediaDrm_openSession(AMediaDrm *mObj, AMediaDrmSessionId *sessio
return AMEDIA_ERROR_INVALID_PARAMETER;
}
Vector<uint8_t> session;
status_t status = mObj->mDrm->openSession(session);
status_t status = mObj->mDrm->openSession(DrmPlugin::kSecurityLevelMax, session);
if (status == OK) {
mObj->mIds.push_front(session);
List<idvec_t>::iterator iter = mObj->mIds.begin();

Loading…
Cancel
Save