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

Commit 15177d7e authored by Jeff Tinker's avatar Jeff Tinker
Browse files

Add new secure stop methods

Methods are needed to release a secure stop by ID and
return a list of secure stops.

Tests: gts media tests

bug:67361434
bug:64001680
Change-Id: If6cb180cb4d2e3b655028955d105aee0cb8d70b6
parent 5f07c65a
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)