Loading drm/mediadrm/plugins/clearkey/aidl/Android.bp +3 −4 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ cc_defaults { static_libs: [ "android.hardware.common-V2-ndk", "libclearkeybase", "libjsoncpp", ], local_include_dirs: ["include"], Loading Loading @@ -99,6 +100,7 @@ cc_defaults { static_libs: [ "android.hardware.common-V2-ndk", "libclearkeybase_fuzz", "libjsoncpp", ], local_include_dirs: ["include"], Loading @@ -114,9 +116,6 @@ cc_fuzz { "fuzz_aidl_clearkey_service_defaults", "service_fuzzer_defaults", ], static_libs: [ "liblog", ], srcs: ["fuzzer.cpp"], fuzz_config: { cc: [ Loading drm/mediadrm/plugins/clearkey/aidl/DrmPlugin.cpp +41 −3 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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(); Loading @@ -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 Loading @@ -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); Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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); } Loading drm/mediadrm/plugins/clearkey/aidl/include/AidlUtils.h +26 −8 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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) { Loading drm/mediadrm/plugins/clearkey/aidl/include/DrmPlugin.h +3 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading drm/mediadrm/plugins/clearkey/common/include/clearkeydrm/ClearKeyDrmProperties.h +3 −1 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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, Loading Loading
drm/mediadrm/plugins/clearkey/aidl/Android.bp +3 −4 Original line number Diff line number Diff line Loading @@ -37,6 +37,7 @@ cc_defaults { static_libs: [ "android.hardware.common-V2-ndk", "libclearkeybase", "libjsoncpp", ], local_include_dirs: ["include"], Loading Loading @@ -99,6 +100,7 @@ cc_defaults { static_libs: [ "android.hardware.common-V2-ndk", "libclearkeybase_fuzz", "libjsoncpp", ], local_include_dirs: ["include"], Loading @@ -114,9 +116,6 @@ cc_fuzz { "fuzz_aidl_clearkey_service_defaults", "service_fuzzer_defaults", ], static_libs: [ "liblog", ], srcs: ["fuzzer.cpp"], fuzz_config: { cc: [ Loading
drm/mediadrm/plugins/clearkey/aidl/DrmPlugin.cpp +41 −3 Original line number Diff line number Diff line Loading @@ -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> Loading Loading @@ -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(); Loading @@ -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 Loading @@ -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); Loading Loading @@ -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; } Loading Loading @@ -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; Loading Loading @@ -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); } Loading
drm/mediadrm/plugins/clearkey/aidl/include/AidlUtils.h +26 −8 Original line number Diff line number Diff line Loading @@ -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" Loading @@ -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) { Loading
drm/mediadrm/plugins/clearkey/aidl/include/DrmPlugin.h +3 −0 Original line number Diff line number Diff line Loading @@ -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(); Loading
drm/mediadrm/plugins/clearkey/common/include/clearkeydrm/ClearKeyDrmProperties.h +3 −1 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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, Loading