From 5ff3ad6c57f80951d9e37187f70413a336d97bf3 Mon Sep 17 00:00:00 2001 From: Robert Shih Date: Sat, 9 Nov 2019 08:26:49 -0800 Subject: [PATCH] DrmUtils: helpers to create hidl Drm Factories/Plugins Bug: 134787536 Test: testPocCVE_2016_0811 Change-Id: I05814014786d5ddf72998528dad0abdf551ec5af --- drm/libmediadrm/DrmUtils.cpp | 44 ++++++++++++++++--- drm/libmediadrm/interface/mediadrm/DrmUtils.h | 6 +++ 2 files changed, 45 insertions(+), 5 deletions(-) diff --git a/drm/libmediadrm/DrmUtils.cpp b/drm/libmediadrm/DrmUtils.cpp index 3a765918ae..a126a1d13e 100644 --- a/drm/libmediadrm/DrmUtils.cpp +++ b/drm/libmediadrm/DrmUtils.cpp @@ -19,8 +19,12 @@ #include #include +#include +#include #include +#include #include +#include #include #include @@ -59,7 +63,7 @@ Hal *MakeObject(status_t *pstatus) { } template -void MakeCryptoFactories(const uint8_t uuid[16], V &cryptoFactories) { +void MakeHidlFactories(const uint8_t uuid[16], V &factories) { sp serviceManager = HServiceManager::getService(); if (serviceManager == nullptr) { ALOGE("Failed to get service manager"); @@ -72,7 +76,7 @@ void MakeCryptoFactories(const uint8_t uuid[16], V &cryptoFactories) { if (factory != nullptr) { ALOGI("found %s %s", Hal::descriptor, instance.c_str()); if (factory->isCryptoSchemeSupported(uuid)) { - cryptoFactories.push_back(factory); + factories.push_back(factory); } } } @@ -94,6 +98,19 @@ hidl_array toHidlArray16(const uint8_t *ptr) { return hidl_array(ptr); } +sp<::V1_0::IDrmPlugin> MakeDrmPlugin(const sp<::V1_0::IDrmFactory> &factory, + const uint8_t uuid[16], const char *appPackageName) { + sp<::V1_0::IDrmPlugin> plugin; + factory->createPlugin(toHidlArray16(uuid), hidl_string(appPackageName), + [&](::V1_0::Status status, const sp<::V1_0::IDrmPlugin> &hPlugin) { + if (status != ::V1_0::Status::OK) { + return; + } + plugin = hPlugin; + }); + return plugin; +} + sp<::V1_0::ICryptoPlugin> MakeCryptoPlugin(const sp<::V1_0::ICryptoFactory> &factory, const uint8_t uuid[16], const void *initData, size_t initDataSize) { @@ -122,11 +139,28 @@ sp MakeCrypto(status_t *pstatus) { return MakeObject(pstatus); } +std::vector> MakeDrmFactories(const uint8_t uuid[16]) { + std::vector> drmFactories; + MakeHidlFactories<::V1_0::IDrmFactory>(uuid, drmFactories); + MakeHidlFactories<::V1_1::IDrmFactory>(uuid, drmFactories); + MakeHidlFactories<::V1_2::IDrmFactory>(uuid, drmFactories); + return drmFactories; +} + +std::vector> MakeDrmPlugins(const uint8_t uuid[16], + const char *appPackageName) { + std::vector> plugins; + for (const auto &factory : MakeDrmFactories(uuid)) { + plugins.push_back(MakeDrmPlugin(factory, uuid, appPackageName)); + } + return plugins; +} + std::vector> MakeCryptoFactories(const uint8_t uuid[16]) { std::vector> cryptoFactories; - MakeCryptoFactories<::V1_0::ICryptoFactory>(uuid, cryptoFactories); - MakeCryptoFactories<::V1_1::ICryptoFactory>(uuid, cryptoFactories); - MakeCryptoFactories<::V1_2::ICryptoFactory>(uuid, cryptoFactories); + MakeHidlFactories<::V1_0::ICryptoFactory>(uuid, cryptoFactories); + MakeHidlFactories<::V1_1::ICryptoFactory>(uuid, cryptoFactories); + MakeHidlFactories<::V1_2::ICryptoFactory>(uuid, cryptoFactories); return cryptoFactories; } diff --git a/drm/libmediadrm/interface/mediadrm/DrmUtils.h b/drm/libmediadrm/interface/mediadrm/DrmUtils.h index ab6f64570d..3017274fef 100644 --- a/drm/libmediadrm/interface/mediadrm/DrmUtils.h +++ b/drm/libmediadrm/interface/mediadrm/DrmUtils.h @@ -18,6 +18,7 @@ #define ANDROID_DRMUTILS_H #include +#include #include // for status_t #include #include @@ -81,6 +82,11 @@ void WriteKeysChange( obj.writeInt32(hasNewUsableKey); } +std::vector> MakeDrmFactories(const uint8_t uuid[16]); + +std::vector> MakeDrmPlugins(const uint8_t uuid[16], + const char *appPackageName); + std::vector> MakeCryptoFactories(const uint8_t uuid[16]); std::vector> MakeCryptoPlugins(const uint8_t uuid[16],