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

Commit 04a71420 authored by Jeff Tinker's avatar Jeff Tinker Committed by Android (Google) Code Review
Browse files

Merge "Add securityLevel to MediaDrm isCryptoSchemeSupported API"

parents e75dca3f 99dbfa82
Loading
Loading
Loading
Loading
+53 −28
Original line number Diff line number Diff line
@@ -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) {
    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())) {
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++) {
        sp<IDrmFactory> factory = mFactories[i];
        if (factory->isCryptoSchemeSupported(uuid)) {
            if (matchMimeTypeAndSecurityLevel(factory, uuid, mimeType, level)) {
                return true;
            }
        }
@@ -634,31 +674,16 @@ 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:
    } else {
        if (hSecurityLevel == SecurityLevel::UNKNOWN) {
            return ERROR_DRM_CANNOT_HANDLE;
        }
    }

    status_t  err = UNKNOWN_ERROR;
    bool retry = true;
+9 −4
Original line number Diff line number Diff line
@@ -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;
        }

+8 −0
Original line number Diff line number Diff line
@@ -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 ||
+1 −0
Original line number Diff line number Diff line
@@ -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;
+4 −0
Original line number Diff line number Diff line
@@ -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;

Loading