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

Commit d40d6968 authored by Robert Shih's avatar Robert Shih
Browse files

Clearkey support for U MediaDrm error details

Bug: 265808292
Test: MediaDrmClearkeyTest
Change-Id: I2c4cf9c03152fcb20a277a37d68c743651b1773b
parent aca826f7
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ cc_defaults {
    static_libs: [
        "android.hardware.common-V2-ndk",
        "libclearkeybase",
        "libjsoncpp",
    ],

    local_include_dirs: ["include"],
@@ -99,6 +100,7 @@ cc_defaults {
    static_libs: [
        "android.hardware.common-V2-ndk",
        "libclearkeybase_fuzz",
        "libjsoncpp",
    ],

    local_include_dirs: ["include"],
@@ -114,9 +116,6 @@ cc_fuzz {
        "fuzz_aidl_clearkey_service_defaults",
        "service_fuzzer_defaults",
    ],
    static_libs: [
        "liblog",
    ],
    srcs: ["fuzzer.cpp"],
    fuzz_config: {
        cc: [
+41 −3
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@
#define LOG_TAG "clearkey-DrmPlugin"

#include <aidl/android/hardware/drm/DrmMetric.h>
#include <android-base/parseint.h>
#include <utils/Log.h>

#include <inttypes.h>
@@ -83,12 +84,14 @@ DrmPlugin::DrmPlugin(SessionLibrary* sessionLibrary)
void DrmPlugin::initProperties() {
    mStringProperties.clear();
    mStringProperties[kVendorKey] = kAidlVendorValue;
    mStringProperties[kVersionKey] = kAidlVersionValue;
    mStringProperties[kVersionKey] = kVersionValue;
    mStringProperties[kPluginDescriptionKey] = kAidlPluginDescriptionValue;
    mStringProperties[kAlgorithmsKey] = kAidlAlgorithmsValue;
    mStringProperties[kListenerTestSupportKey] = kAidlListenerTestSupportValue;
    mStringProperties[kDrmErrorTestKey] = kAidlDrmErrorTestValue;
    mStringProperties[kAidlVersionKey] = kAidlVersionValue;
    mStringProperties[kOemErrorKey] = "0";
    mStringProperties[kErrorContextKey] = "0";

    std::vector<uint8_t> valueVector;
    valueVector.clear();
@@ -102,6 +105,26 @@ void DrmPlugin::initProperties() {
    mByteArrayProperties[kMetricsKey] = valueVector;
}

int32_t DrmPlugin::getIntProperty(const std::string& prop, int32_t defaultVal) const {
    if (!mStringProperties.count(prop)) {
        return defaultVal;
    }
    int32_t out = defaultVal;
    if (!::android::base::ParseInt(mStringProperties.at(prop), &out)) {
        return defaultVal;
    }
    return out;
}

int32_t DrmPlugin::getOemError() const {
    return getIntProperty(kOemErrorKey);
}

int32_t DrmPlugin::getErrorContext() const {
    return getIntProperty(kErrorContextKey);
}

//
// The secure stop in ClearKey implementation is not installed securely.
// This function merely creates a test environment for testing secure stops APIs.
// The content in this secure stop is implementation dependent, the clearkey
@@ -127,7 +150,10 @@ void DrmPlugin::installSecureStop(const std::vector<uint8_t>& sessionId) {
        mSessionLibrary->destroySession(session);
        if (session->getMockError() != clearkeydrm::OK) {
            sendSessionLostState(in_sessionId);
            return toNdkScopedAStatus(Status::ERROR_DRM_INVALID_STATE);
            return toNdkScopedAStatus(Status::ERROR_DRM_INVALID_STATE,
                                      nullptr,
                                      getOemError(),
                                      getErrorContext());
        }
        mCloseSessionOkCount++;
        return toNdkScopedAStatus(Status::OK);
@@ -198,7 +224,8 @@ void DrmPlugin::installSecureStop(const std::vector<uint8_t>& sessionId) {
        if (!session.get()) {
            return toNdkScopedAStatus(Status::ERROR_DRM_SESSION_NOT_OPENED);
        } else if (session->getMockError() != clearkeydrm::OK) {
            return toNdkScopedAStatus(session->getMockError());
            auto err = static_cast<Status>(session->getMockError());
            return toNdkScopedAStatus(err, nullptr, getOemError(), getErrorContext());
        }
        keyRequestType = KeyRequestType::INITIAL;
    }
@@ -381,6 +408,10 @@ void DrmPlugin::installSecureStop(const std::vector<uint8_t>& sessionId) {
        value = mStringProperties[kDrmErrorTestKey];
    } else if (name == kAidlVersionKey) {
        value = mStringProperties[kAidlVersionKey];
    } else if (name == kOemErrorKey) {
        value = mStringProperties[kOemErrorKey];
    } else if (name == kErrorContextKey) {
        value = mStringProperties[kErrorContextKey];
    } else {
        ALOGE("App requested unknown string property %s", name.c_str());
        status = Status::ERROR_DRM_CANNOT_HANDLE;
@@ -920,6 +951,13 @@ void DrmPlugin::sendSessionLostState(const std::vector<uint8_t>& in_sessionId) {
        }
    }

    if (in_propertyName == kOemErrorKey || in_propertyName == kErrorContextKey) {
        int32_t err = 0;
        if (!::android::base::ParseInt(in_value, &err)) {
            return toNdkScopedAStatus(Status::BAD_VALUE);
        }
    }

    mStringProperties[key] = std::string(in_value.c_str());
    return toNdkScopedAStatus(Status::OK);
}
+26 −8
Original line number Diff line number Diff line
@@ -15,9 +15,12 @@
 */
#pragma once

#include <cstdint>
#include <string>
#include <vector>

#include <json/json.h>

#include <android/binder_auto_utils.h>
#include "aidl/android/hardware/drm/Status.h"
#include "ClearKeyTypes.h"
@@ -41,17 +44,32 @@ inline ::aidl::android::hardware::drm::Status toMockStatus(
}

inline ::ndk::ScopedAStatus toNdkScopedAStatus(::aidl::android::hardware::drm::Status status,
                                               const char* msg = nullptr) {
                                               const char* msg = nullptr,
                                               int32_t oemError = 0,
                                               int32_t errorContext = 0) {


    if (Status::OK == status) {
        return ::ndk::ScopedAStatus::ok();
    } else {
    }

    Json::Value errObj(Json::objectValue);
    auto err = static_cast<int32_t>(status);
        if (msg) {
            return ::ndk::ScopedAStatus::fromServiceSpecificErrorWithMessage(err, msg);
        } else {
            return ::ndk::ScopedAStatus::fromServiceSpecificError(err);
    errObj["cdmError"] = err;

    if (oemError) {
        errObj["oemError"] = oemError;
    }
    if (errorContext) {
        errObj["context"] = errorContext;
    }
    if (msg) {
        errObj["errorMessage"] = msg;
    }

    Json::FastWriter writer;
    return ::ndk::ScopedAStatus::fromServiceSpecificErrorWithMessage(
        err, writer.write(errObj).c_str());
}

inline ::ndk::ScopedAStatus toNdkScopedAStatus(clearkeydrm::CdmResponseType res) {
+3 −0
Original line number Diff line number Diff line
@@ -148,6 +148,9 @@ struct DrmPlugin : public BnDrmPlugin {

  private:
    void initProperties();
    int32_t getIntProperty(const std::string& prop, int32_t defaultVal = 0) const;
    int32_t getOemError() const;
    int32_t getErrorContext() const;
    void installSecureStop(const std::vector<uint8_t>& sessionId);
    bool makeKeySetId(std::string* keySetId);
    void setPlayPolicy();
+3 −1
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ namespace clearkeydrm {
static const std::string kVendorKey("vendor");
static const std::string kVendorValue("Google");
static const std::string kVersionKey("version");
static const std::string kVersionValue("1.2");
static const std::string kVersionValue("14"); // sync with Android OS version
static const std::string kPluginDescriptionKey("description");
static const std::string kPluginDescriptionValue("ClearKey CDM");
static const std::string kAlgorithmsKey("algorithms");
@@ -35,6 +35,8 @@ static const std::string kLostStateValue("lostState");
static const std::string kFrameTooLargeValue("frameTooLarge");
static const std::string kInvalidStateValue("invalidState");
static const std::string kAidlVersionKey("aidlVersion");
static const std::string kOemErrorKey("oemError");
static const std::string kErrorContextKey("errorContext");

static const std::string kDeviceIdKey("deviceId");
static const uint8_t kTestDeviceIdData[] = {0x0, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7,