From 9f0adebb9fc1e8ee721d62718edc57ed401699a7 Mon Sep 17 00:00:00 2001 From: Edwin Wong Date: Thu, 13 Jul 2017 13:50:44 -0700 Subject: [PATCH] Add property to query SRM support and version. Merge from http://go/wvgerrit/29800 Add QUERY_KEY_CURRENT_SRM_VERSION and QUERY_KEY_SRM_UPDATE_SUPPORT. Test: run unit test adb push $OUT/marlin/data/bin/libwvdrmdrmplugin_hidl_test /vendor/bin/. adb shell LD_LIBRARY_PATH="/vendor/lib/mediadrm" \ /vendor/bin/libwvdrmdrmplugin_hidl_test bug: 63390310 Change-Id: Ie51056d22178565bd7b987aa901f7b7616d29328 --- .../cdm/core/include/wv_cdm_constants.h | 3 +++ libwvdrmengine/cdm/core/src/cdm_engine.cpp | 14 ++++++++++ libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp | 4 +++ .../mediadrm/src_hidl/WVDrmPlugin.cpp | 4 +++ .../mediadrm/test/WVDrmPlugin_test.cpp | 27 ++++++++++++++++++- .../test/legacy_src/WVDrmPlugin_test.cpp | 19 ++++++++++++- 6 files changed, 69 insertions(+), 2 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h index 7e10d45e..fd5eb6a7 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h @@ -64,6 +64,9 @@ static const std::string QUERY_KEY_MAX_NUMBER_OF_SESSIONS = "MaxNumberOfSessions"; static const std::string QUERY_KEY_OEMCRYPTO_API_VERSION = "OemCryptoApiVersion"; +static const std::string QUERY_KEY_CURRENT_SRM_VERSION = "CurrentSRMVersion"; +static const std::string QUERY_KEY_SRM_UPDATE_SUPPORT = "SRMUpdateSupport"; + // whether OEM supports SRM update static const std::string QUERY_VALUE_TRUE = "True"; static const std::string QUERY_VALUE_FALSE = "False"; diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index a25c5753..5125f18d 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -640,6 +640,20 @@ CdmResponseType CdmEngine::QueryStatus(SecurityLevel security_level, std::ostringstream api_version_stream; api_version_stream << api_version; *query_response = api_version_stream.str(); + } else if (query_token == QUERY_KEY_CURRENT_SRM_VERSION) { + uint16_t current_srm_version; + if (!crypto_session.GetSrmVersion(¤t_srm_version)) { + LOGW("CdmEngine::QueryStatus: GetCurrentSRMVersion failed"); + return UNKNOWN_ERROR; + } + + std::ostringstream current_srm_version_stream; + current_srm_version_stream << current_srm_version; + *query_response = current_srm_version_stream.str(); + } else if (query_token == QUERY_KEY_SRM_UPDATE_SUPPORT) { + bool is_srm_update_supported = crypto_session.IsSrmUpdateSupported(); + *query_response = + is_srm_update_supported ? QUERY_VALUE_TRUE : QUERY_VALUE_FALSE; } else { LOGW("CdmEngine::QueryStatus: Unknown status requested, token = %s", query_token.c_str()); diff --git a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp index c141b4ba..8d2bcf63 100644 --- a/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src/WVDrmPlugin.cpp @@ -519,6 +519,10 @@ status_t WVDrmPlugin::getPropertyString(const String8& name, value = mPropertySet.app_id().c_str(); } else if (name == "origin") { value = mCdmIdentifier.origin.c_str(); + } else if (name == "CurrentSRMVersion") { + return queryProperty(QUERY_KEY_CURRENT_SRM_VERSION, value); + } else if (name == "SRMUpdateSupport") { + return queryProperty(QUERY_KEY_SRM_UPDATE_SUPPORT, value); } else { ALOGE("App requested unknown string property %s", name.string()); return android::ERROR_DRM_CANNOT_HANDLE; diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index 1fa1563e..9d9a2680 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -683,6 +683,10 @@ Return WVDrmPlugin::getPropertyString(const hidl_string& propertyName, value = mPropertySet.app_id().c_str(); } else if (name == "origin") { value = mCdmIdentifierBuilder.origin().c_str(); + } else if (name == "CurrentSRMVersion") { + status = queryProperty(wvcdm::QUERY_KEY_CURRENT_SRM_VERSION, value); + } else if (name == "SRMUpdateSupport") { + status = queryProperty(wvcdm::QUERY_KEY_SRM_UPDATE_SUPPORT, value); } else { ALOGE("App requested unknown string property %s", name.c_str()); status = android::ERROR_DRM_CANNOT_HANDLE; diff --git a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp index 080f7103..fdb1a060 100644 --- a/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/WVDrmPlugin_test.cpp @@ -93,6 +93,7 @@ using wvcdm::KEY_ID_SIZE; using wvcdm::KEY_IV_SIZE; using wvcdm::KEY_SET_ID_PREFIX; using wvcdm::NEVER_EXPIRES; +using wvcdm::QUERY_KEY_CURRENT_SRM_VERSION; using wvcdm::QUERY_KEY_DEVICE_ID; using wvcdm::QUERY_KEY_MAX_NUMBER_OF_SESSIONS; using wvcdm::QUERY_KEY_NUMBER_OF_OPEN_SESSIONS; @@ -100,6 +101,7 @@ using wvcdm::QUERY_KEY_OEMCRYPTO_API_VERSION; using wvcdm::QUERY_KEY_OEMCRYPTO_SESSION_ID; using wvcdm::QUERY_KEY_PROVISIONING_ID; using wvcdm::QUERY_KEY_SECURITY_LEVEL; +using wvcdm::QUERY_KEY_SRM_UPDATE_SUPPORT; using wvcdm::QUERY_KEY_SYSTEM_ID; using wvcdm::QUERY_VALUE_SECURITY_LEVEL_L1; using wvcdm::QUERY_VALUE_SECURITY_LEVEL_L3; @@ -1056,6 +1058,7 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { static const std::string openSessions = "42"; static const std::string maxSessions = "54"; static const std::string oemCryptoApiVersion = "13"; + static const std::string currentSRMVersion = "1"; std::string serializedMetrics( kSerializedMetrics, kSerializedMetrics + sizeof(kSerializedMetrics)); @@ -1089,6 +1092,14 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { .WillOnce(DoAll(SetArgPointee<2>(oemCryptoApiVersion), testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_SRM_UPDATE_SUPPORT, _)) + .WillOnce(DoAll(SetArgPointee<2>("True"), + testing::Return(wvcdm::NO_ERROR))); + + EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_CURRENT_SRM_VERSION, _)) + .WillOnce(DoAll(SetArgPointee<2>(currentSRMVersion), + testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, GetSerializedMetrics(_)) .WillOnce(SetArgPointee<0>(serializedMetrics)); @@ -1176,7 +1187,21 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { hidl_string("oemCryptoApiVersion"), [&](Status status, hidl_string stringResult) { ASSERT_EQ(Status::OK, status); - EXPECT_EQ(oemCryptoApiVersion, stringResult.c_str()); + EXPECT_STREQ(oemCryptoApiVersion.c_str(), stringResult.c_str()); + }); + + plugin.getPropertyString( + hidl_string("SRMUpdateSupport"), + [&](Status status, hidl_string stringResult) { + ASSERT_EQ(Status::OK, status); + EXPECT_STREQ("True", stringResult.c_str()); + }); + + plugin.getPropertyString( + hidl_string("CurrentSRMVersion"), + [&](Status status, hidl_string stringResult) { + ASSERT_EQ(Status::OK, status); + EXPECT_STREQ(currentSRMVersion.c_str(), stringResult.c_str()); }); plugin.getPropertyByteArray( diff --git a/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp index 61b15756..6798ea73 100644 --- a/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/legacy_src/WVDrmPlugin_test.cpp @@ -848,6 +848,7 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { static const string openSessions = "15"; static const string maxSessions = "18"; static const string oemCryptoApiVersion = "10"; + static const string currentSRMVersion = "1"; string serializedMetrics(kSerializedMetrics, kSerializedMetrics + sizeof(kSerializedMetrics)); @@ -881,6 +882,14 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { .WillOnce(DoAll(SetArgPointee<2>(oemCryptoApiVersion), Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_SRM_UPDATE_SUPPORT, _)) + .WillOnce(DoAll(SetArgPointee<2>("True"), + testing::Return(wvcdm::NO_ERROR))); + + EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_CURRENT_SRM_VERSION, _)) + .WillOnce(DoAll(SetArgPointee<2>(currentSRMVersion), + testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, GetSerializedMetrics(_)) .WillOnce(SetArgPointee<0>(serializedMetrics)); @@ -934,7 +943,15 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { res = plugin.getPropertyString(String8("oemCryptoApiVersion"), stringResult); ASSERT_EQ(OK, res); - EXPECT_EQ(oemCryptoApiVersion, stringResult.string()); + EXPECT_STREQ(oemCryptoApiVersion.c_str(), stringResult.string()); + + res = plugin.getPropertyString(String8("SRMUpdateSupport"), stringResult); + ASSERT_EQ(OK, res); + EXPECT_STREQ("True", stringResult.string()); + + res = plugin.getPropertyString(String8("CurrentSRMVersion"), stringResult); + ASSERT_EQ(OK, res); + EXPECT_STREQ(currentSRMVersion.c_str(), stringResult.string()); vectorResult.clear(); res = plugin.getPropertyByteArray(String8("metrics"), vectorResult);