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

Commit edab478b authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add new secure stop methods"

parents fc70138c 15177d7e
Loading
Loading
Loading
Loading
+61 −1
Original line number Diff line number Diff line
@@ -44,6 +44,8 @@ using drm::V1_0::KeyType;
using drm::V1_0::KeyValue;
using drm::V1_1::HdcpLevel;;
using drm::V1_0::SecureStop;
using drm::V1_1::SecureStopRelease;
using drm::V1_0::SecureStopId;
using drm::V1_1::SecurityLevel;
using drm::V1_0::Status;
using ::android::hardware::hidl_array;
@@ -165,6 +167,15 @@ static List<Vector<uint8_t>> toSecureStops(const hidl_vec<SecureStop>&
    return secureStops;
}

static List<Vector<uint8_t>> toSecureStopIds(const hidl_vec<SecureStopId>&
        hSecureStopIds) {
    List<Vector<uint8_t>> secureStopIds;
    for (size_t i = 0; i < hSecureStopIds.size(); i++) {
        secureStopIds.push_back(toVector(hSecureStopIds[i]));
    }
    return secureStopIds;
}

static status_t toStatusT(Status status) {
    switch (status) {
    case Status::OK:
@@ -797,6 +808,32 @@ status_t DrmHal::getSecureStops(List<Vector<uint8_t>> &secureStops) {
}


status_t DrmHal::getSecureStopIds(List<Vector<uint8_t>> &secureStopIds) {
    Mutex::Autolock autoLock(mLock);

    if (mInitCheck != OK) {
        return mInitCheck;
    }

    if (mPluginV1_1 == NULL) {
        return ERROR_DRM_CANNOT_HANDLE;
    }

    status_t err = UNKNOWN_ERROR;

    Return<void> hResult = mPluginV1_1->getSecureStopIds(
            [&](Status status, const hidl_vec<SecureStopId>& hSecureStopIds) {
                if (status == Status::OK) {
                    secureStopIds = toSecureStopIds(hSecureStopIds);
                }
                err = toStatusT(status);
            }
    );

    return hResult.isOk() ? err : DEAD_OBJECT;
}


status_t DrmHal::getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
    Mutex::Autolock autoLock(mLock);
    INIT_CHECK();
@@ -819,13 +856,36 @@ status_t DrmHal::releaseSecureStops(Vector<uint8_t> const &ssRelease) {
    Mutex::Autolock autoLock(mLock);
    INIT_CHECK();

    if (mPluginV1_1 != NULL) {
        SecureStopRelease secureStopRelease;
        secureStopRelease.opaqueData = toHidlVec(ssRelease);
        return toStatusT(mPluginV1_1->releaseSecureStops(secureStopRelease));
    }

    return toStatusT(mPlugin->releaseSecureStop(toHidlVec(ssRelease)));
}

status_t DrmHal::releaseAllSecureStops() {
status_t DrmHal::removeSecureStop(Vector<uint8_t> const &ssid) {
    Mutex::Autolock autoLock(mLock);

    if (mInitCheck != OK) {
        return mInitCheck;
    }

    if (mPluginV1_1 == NULL) {
        return ERROR_DRM_CANNOT_HANDLE;
    }

    return toStatusT(mPluginV1_1->removeSecureStop(toHidlVec(ssid)));
}

status_t DrmHal::removeAllSecureStops() {
    Mutex::Autolock autoLock(mLock);
    INIT_CHECK();

    if (mPluginV1_1 != NULL) {
        return toStatusT(mPluginV1_1->removeAllSecureStops());
    }
    return toStatusT(mPlugin->releaseAllSecureStops());
}

+66 −5
Original line number Diff line number Diff line
@@ -56,11 +56,13 @@ enum {
    VERIFY,
    SET_LISTENER,
    GET_SECURE_STOP,
    RELEASE_ALL_SECURE_STOPS,
    REMOVE_ALL_SECURE_STOPS,
    GET_HDCP_LEVELS,
    GET_NUMBER_OF_SESSIONS,
    GET_SECURITY_LEVEL,
    SET_SECURITY_LEVEL,
    REMOVE_SECURE_STOP,
    GET_SECURE_STOP_IDS
};

struct BpDrm : public BpInterface<IDrm> {
@@ -302,6 +304,25 @@ struct BpDrm : public BpInterface<IDrm> {
        return reply.readInt32();
    }

    virtual status_t getSecureStopIds(List<Vector<uint8_t> > &secureStopIds) {
        Parcel data, reply;
        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());

        status_t status = remote()->transact(GET_SECURE_STOP_IDS, data, &reply);
        if (status != OK) {
            return status;
        }

        secureStopIds.clear();
        uint32_t count = reply.readInt32();
        for (size_t i = 0; i < count; i++) {
            Vector<uint8_t> secureStopId;
            readVector(reply, secureStopId);
            secureStopIds.push_back(secureStopId);
        }
        return reply.readInt32();
    }

    virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) {
        Parcel data, reply;
        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());
@@ -329,11 +350,24 @@ struct BpDrm : public BpInterface<IDrm> {
        return reply.readInt32();
    }

    virtual status_t releaseAllSecureStops() {
    virtual status_t removeSecureStop(Vector<uint8_t> const &ssid) {
        Parcel data, reply;
        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());

        writeVector(data, ssid);
        status_t status = remote()->transact(REMOVE_SECURE_STOP, data, &reply);
        if (status != OK) {
            return status;
        }

        return reply.readInt32();
    }

    virtual status_t removeAllSecureStops() {
        Parcel data, reply;
        data.writeInterfaceToken(IDrm::getInterfaceDescriptor());

        status_t status = remote()->transact(RELEASE_ALL_SECURE_STOPS, data, &reply);
        status_t status = remote()->transact(REMOVE_ALL_SECURE_STOPS, data, &reply);
        if (status != OK) {
            return status;
        }
@@ -854,6 +888,24 @@ status_t BnDrm::onTransact(
            return OK;
        }

        case GET_SECURE_STOP_IDS:
        {
            CHECK_INTERFACE(IDrm, data, reply);
            List<Vector<uint8_t> > secureStopIds;
            status_t result = getSecureStopIds(secureStopIds);
            size_t count = secureStopIds.size();
            reply->writeInt32(count);
            List<Vector<uint8_t> >::iterator iter = secureStopIds.begin();
            while(iter != secureStopIds.end()) {
                size_t size = iter->size();
                reply->writeInt32(size);
                reply->write(iter->array(), iter->size());
                iter++;
            }
            reply->writeInt32(result);
            return OK;
        }

        case GET_SECURE_STOP:
        {
            CHECK_INTERFACE(IDrm, data, reply);
@@ -874,10 +926,19 @@ status_t BnDrm::onTransact(
            return OK;
        }

        case RELEASE_ALL_SECURE_STOPS:
        case REMOVE_SECURE_STOP:
        {
            CHECK_INTERFACE(IDrm, data, reply);
            Vector<uint8_t> ssid;
            readVector(data, ssid);
            reply->writeInt32(removeSecureStop(ssid));
            return OK;
        }

        case REMOVE_ALL_SECURE_STOPS:
        {
            CHECK_INTERFACE(IDrm, data, reply);
            reply->writeInt32(releaseAllSecureStops());
            reply->writeInt32(removeAllSecureStops());
            return OK;
        }

+3 −1
Original line number Diff line number Diff line
@@ -97,10 +97,12 @@ struct DrmHal : public BnDrm,
                                              Vector<uint8_t> &wrappedKey);

    virtual status_t getSecureStops(List<Vector<uint8_t>> &secureStops);
    virtual status_t getSecureStopIds(List<Vector<uint8_t>> &secureStopIds);
    virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop);

    virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease);
    virtual status_t releaseAllSecureStops();
    virtual status_t removeSecureStop(Vector<uint8_t> const &ssid);
    virtual status_t removeAllSecureStops();

    virtual status_t getHdcpLevels(DrmPlugin::HdcpLevel *connectedLevel,
            DrmPlugin::HdcpLevel *maxLevel) const;
+3 −1
Original line number Diff line number Diff line
@@ -74,10 +74,12 @@ struct IDrm : public IInterface {
                                              Vector<uint8_t> &wrappedKey) = 0;

    virtual status_t getSecureStops(List<Vector<uint8_t> > &secureStops) = 0;
    virtual status_t getSecureStopIds(List<Vector<uint8_t> > &secureStopIds) = 0;
    virtual status_t getSecureStop(Vector<uint8_t> const &ssid, Vector<uint8_t> &secureStop) = 0;

    virtual status_t releaseSecureStops(Vector<uint8_t> const &ssRelease) = 0;
    virtual status_t releaseAllSecureStops() = 0;
    virtual status_t removeSecureStop(Vector<uint8_t> const &ssid) = 0;
    virtual status_t removeAllSecureStops() = 0;

    virtual status_t getHdcpLevels(DrmPlugin::HdcpLevel *connectedLevel,
            DrmPlugin::HdcpLevel *maxLevel)