Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 41d279a7 authored by Jeff Tinker's avatar Jeff Tinker
Browse files

Revert "Revert "Fix MediaDrm security level APIs""

This reverts commit 5f5e43fa.

Change-Id: I72d585fd3768730eef6ad9effdbda81b32418dea
parent c23849a8
Loading
Loading
Loading
Loading
+47 −45
Original line number Diff line number Diff line
@@ -510,17 +510,54 @@ 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(
        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);
                    }
                );
        } else {
            hResult = mPluginV1_1->openSession_1_1(hSecurityLevel,
                    [&](Status status, const hidl_vec<uint8_t>& id) {
                        if (status == Status::OK) {
                            sessionId = toVector(id);
@@ -528,6 +565,7 @@ status_t DrmHal::openSession(Vector<uint8_t> &sessionId) {
                        err = toStatusT(status);
                    }
                );
        }

        if (!hResult.isOk()) {
            err = DEAD_OBJECT;
@@ -979,42 +1017,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);
+6 −32
Original line number Diff line number Diff line
@@ -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);
+16 −4
Original line number Diff line number Diff line
@@ -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;
    }

+5 −3
Original line number Diff line number Diff line
@@ -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;
+2 −3
Original line number Diff line number Diff line
@@ -63,7 +63,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 +111,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,
Loading