From cd593979e9f78d3c638d0a701db79f572f517a4b Mon Sep 17 00:00:00 2001 From: Rahul Frias Date: Thu, 26 May 2022 14:48:36 -0700 Subject: [PATCH] Allow provisioning model to be queried [ Merge of http://go/wvgerrit/152674 ] This allows an app to query the provisioning model. Possible values are { "DrmCertificate", "Keybox", "OEMCertificate", "BootCertificateChain" } An app can use these to disntinguish between provisioning models. Provisioning 4.0 (boot certificate chain) requires a double provisioning step. Bug: 234057551 Test: WV unit/integration tests, libwvdrmdrmplugin_hal_test Change-Id: I1611488ec632a0e5a9e1d106b7475e8f5a2a5a13 --- libwvdrmengine/mediadrm/aidl_src/WVDrmPlugin.cpp | 2 ++ libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp | 2 ++ .../mediadrm/test/WVDrmPlugin_hal_test.cpp | 11 +++++++++++ .../mediadrm/test/hidl/WVDrmPlugin_test.cpp | 13 +++++++++++++ 4 files changed, 28 insertions(+) diff --git a/libwvdrmengine/mediadrm/aidl_src/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/aidl_src/WVDrmPlugin.cpp index 745c15fc..1a89edca 100644 --- a/libwvdrmengine/mediadrm/aidl_src/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/aidl_src/WVDrmPlugin.cpp @@ -1154,6 +1154,8 @@ Status WVDrmPlugin::unprovisionDevice() { status = queryProperty(wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, value); } else if (name == "productionReady") { status = queryProperty(wvcdm::QUERY_KEY_PRODUCTION_READY, value); + } else if (name == "provisioningModel") { + status = queryProperty(wvcdm::QUERY_KEY_PROVISIONING_MODEL, value); } else { ALOGE("App requested unknown string property %s", name.c_str()); *_aidl_return = value; diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index ab6b0ecb..8731f0c4 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -1263,6 +1263,8 @@ Return WVDrmPlugin::getPropertyString(const hidl_string& propertyName, status = queryProperty(wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, value); } else if (name == "productionReady") { status = queryProperty(wvcdm::QUERY_KEY_PRODUCTION_READY, value); + } else if (name == "provisioningModel") { + status = queryProperty(wvcdm::QUERY_KEY_PROVISIONING_MODEL, value); } else { ALOGE("App requested unknown string property %s", name.c_str()); status = Status::ERROR_DRM_CANNOT_HANDLE; diff --git a/libwvdrmengine/mediadrm/test/WVDrmPlugin_hal_test.cpp b/libwvdrmengine/mediadrm/test/WVDrmPlugin_hal_test.cpp index 185ad171..c05fd6b4 100644 --- a/libwvdrmengine/mediadrm/test/WVDrmPlugin_hal_test.cpp +++ b/libwvdrmengine/mediadrm/test/WVDrmPlugin_hal_test.cpp @@ -118,6 +118,7 @@ using wvcdm::QUERY_KEY_OEMCRYPTO_API_VERSION; using wvcdm::QUERY_KEY_OEMCRYPTO_BUILD_INFORMATION; using wvcdm::QUERY_KEY_OEMCRYPTO_SESSION_ID; using wvcdm::QUERY_KEY_PROVISIONING_ID; +using wvcdm::QUERY_KEY_PROVISIONING_MODEL; using wvcdm::QUERY_KEY_RESOURCE_RATING_TIER; using wvcdm::QUERY_KEY_SECURITY_LEVEL; using wvcdm::QUERY_KEY_SRM_UPDATE_SUPPORT; @@ -1059,6 +1060,7 @@ TEST_F(WVDrmPluginHalTest, ReturnsExpectedPropertyValues) { static const std::string oemCryptoCrcClearBuffer = "1"; static const std::string oemCryptoPartnerDefinedHash = "2"; static const std::string decryptHashErrorBadHashAndFrameNumber = "53, 1"; + static const std::string provisioningModel = "Zaphod Beeblebrox"; drm_metrics::WvCdmMetrics expected_metrics; std::string serialized_metrics = wvutil::a2bs_hex(kSerializedMetricsHex); ASSERT_TRUE(expected_metrics.ParseFromString(serialized_metrics)); @@ -1120,6 +1122,10 @@ TEST_F(WVDrmPluginHalTest, ReturnsExpectedPropertyValues) { .WillOnce(DoAll(SetArgPointee<1>(decryptHashErrorBadHashAndFrameNumber), testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*mCdm, QueryStatus(_, QUERY_KEY_PROVISIONING_MODEL, _)) + .WillOnce(DoAll(SetArgPointee<2>(provisioningModel), + testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*mCdm, GetMetrics(_, _)) .WillOnce(DoAll(SetArgPointee<1>(expected_metrics), testing::Return(wvcdm::NO_ERROR))); @@ -1216,6 +1222,11 @@ TEST_F(WVDrmPluginHalTest, ReturnsExpectedPropertyValues) { EXPECT_TRUE(ret.isOk()); EXPECT_EQ(decryptHashErrorBadHashAndFrameNumber, stringResult); + ret = mPlugin->getPropertyString(std::string("provisioningModel"), + &stringResult); + EXPECT_TRUE(ret.isOk()); + EXPECT_EQ(provisioningModel, stringResult); + // This call occurs before any open session or other call. This means // that the mCdm identifier is not yet sealed, and metrics return empty // metrics data. diff --git a/libwvdrmengine/mediadrm/test/hidl/WVDrmPlugin_test.cpp b/libwvdrmengine/mediadrm/test/hidl/WVDrmPlugin_test.cpp index b74ad900..527711bf 100644 --- a/libwvdrmengine/mediadrm/test/hidl/WVDrmPlugin_test.cpp +++ b/libwvdrmengine/mediadrm/test/hidl/WVDrmPlugin_test.cpp @@ -111,6 +111,7 @@ using wvcdm::QUERY_KEY_OEMCRYPTO_API_VERSION; using wvcdm::QUERY_KEY_OEMCRYPTO_BUILD_INFORMATION; using wvcdm::QUERY_KEY_OEMCRYPTO_SESSION_ID; using wvcdm::QUERY_KEY_PROVISIONING_ID; +using wvcdm::QUERY_KEY_PROVISIONING_MODEL; using wvcdm::QUERY_KEY_RESOURCE_RATING_TIER; using wvcdm::QUERY_KEY_SECURITY_LEVEL; using wvcdm::QUERY_KEY_SRM_UPDATE_SUPPORT; @@ -1257,6 +1258,7 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { static const std::string oemCryptoCrcClearBuffer = "1"; static const std::string oemCryptoPartnerDefinedHash = "2"; static const std::string decryptHashErrorBadHashAndFrameNumber = "53, 1"; + static const std::string provisioningModel = "Zaphod Beeblebrox"; drm_metrics::WvCdmMetrics expected_metrics; std::string serialized_metrics = wvutil::a2bs_hex(kSerializedMetricsHex); ASSERT_TRUE(expected_metrics.ParseFromString(serialized_metrics)); @@ -1318,6 +1320,10 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { .WillOnce(DoAll(SetArgPointee<1>(decryptHashErrorBadHashAndFrameNumber), testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, QueryStatus(_, QUERY_KEY_PROVISIONING_MODEL, _)) + .WillOnce(DoAll(SetArgPointee<2>(provisioningModel), + testing::Return(wvcdm::NO_ERROR))); + EXPECT_CALL(*cdm, GetMetrics(_, _)) .WillOnce(DoAll(SetArgPointee<1>(expected_metrics), testing::Return(wvcdm::NO_ERROR))); @@ -1450,6 +1456,13 @@ TEST_F(WVDrmPluginTest, ReturnsExpectedPropertyValues) { stringResult); }); + plugin.getPropertyString(hidl_string("provisioningModel"), + [&](Status status, hidl_string stringResult) { + ASSERT_EQ(Status::OK, status); + EXPECT_STREQ(provisioningModel.c_str(), + stringResult.c_str()); + }); + // This call occurs before any open session or other call. This means // that the cdm identifer is not yet sealed, and metrics return empty // metrics data.