From 97f354486617837c765e9ca6f40dd7bec648299d Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Wed, 23 Mar 2022 17:00:32 -0700 Subject: [PATCH] Added CDM support for Watermarking reporting. [ Merge of http://go/wvgerrit/148552 ] Extended the CDM layer to report OEMCrypto's watermarking support. The reporting of watermarking comes in three (3) mechanisms: 1) ClientCapabilities in license requests 2) CryptoSession metrics when queried to OEMCrypto 3) String property query by apps If OEMCrypto implementents OEMCrypto_GetWatermarkingSupport(), then the reported watermarking support by the CDM will match that of OEMCrypto. If OEMCrypto does not implement OEMCrypto_GetWatermarkingSupport() or an error occurs, it is assumed that OEMCrypto does not support watermarking, and the CDM will report "Not Supported". Bug: 226443788 Test: run_x86_64_tests request_license_test and license_unittest Change-Id: Id929a356c395e6bcf45d371ee6887eec40d35329 --- libwvdrmengine/aidl_src/WVDrmFactory.cpp | 1 + libwvdrmengine/aidl_src/wv_metrics.cpp | 3 ++ .../cdm/core/include/crypto_session.h | 5 +++ .../cdm/core/include/oemcrypto_adapter.h | 2 ++ .../cdm/core/include/wv_cdm_constants.h | 4 +++ .../cdm/core/include/wv_cdm_types.h | 7 ++++ libwvdrmengine/cdm/core/src/cdm_engine.cpp | 22 ++++++++++++ .../cdm/core/src/client_identification.cpp | 22 ++++++++++++ .../cdm/core/src/crypto_session.cpp | 35 +++++++++++++++++++ .../cdm/core/src/license_protocol.proto | 11 ++++++ .../core/src/oemcrypto_adapter_dynamic.cpp | 22 +++++++----- libwvdrmengine/cdm/core/src/wv_cdm_types.cpp | 12 +++++++ .../cdm/core/test/license_unittest.cpp | 20 +++++++++++ .../cdm/metrics/include/metrics_collections.h | 1 + .../cdm/metrics/src/metrics_collections.cpp | 2 ++ .../cdm/metrics/src/wv_metrics.proto | 3 +- .../test/metrics_collections_unittest.cpp | 4 +++ .../cdm/test/request_license_test.cpp | 16 +++++++++ .../mediadrm/aidl_src/WVDrmPlugin.cpp | 2 ++ .../mediadrm/src_hidl/WVDrmPlugin.cpp | 2 ++ libwvdrmengine/src_hidl/WVDrmFactory.cpp | 1 + libwvdrmengine/src_hidl/wv_metrics.cpp | 3 ++ 22 files changed, 191 insertions(+), 9 deletions(-) diff --git a/libwvdrmengine/aidl_src/WVDrmFactory.cpp b/libwvdrmengine/aidl_src/WVDrmFactory.cpp index 50f1388c..537409cd 100644 --- a/libwvdrmengine/aidl_src/WVDrmFactory.cpp +++ b/libwvdrmengine/aidl_src/WVDrmFactory.cpp @@ -239,6 +239,7 @@ void WVDrmFactory::printCdmProperties(int fd) { {"analog capabilities:", wvcdm::QUERY_KEY_ANALOG_OUTPUT_CAPABILITIES}, {"can disable analog output:", wvcdm::QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT}, + {"watermarking support:", wvcdm::QUERY_KEY_WATERMARKING_SUPPORT}, }; string value; diff --git a/libwvdrmengine/aidl_src/wv_metrics.cpp b/libwvdrmengine/aidl_src/wv_metrics.cpp index 8f2713c6..f8ca443d 100644 --- a/libwvdrmengine/aidl_src/wv_metrics.cpp +++ b/libwvdrmengine/aidl_src/wv_metrics.cpp @@ -374,6 +374,9 @@ void FormatCryptoMetrics(const WvCdmMetrics_CryptoMetrics metrics, FORMAT_REPEATED_DISTRIBUTION(oemcrypto_load_provisioning_time_us, indent); FORMAT_OPTIONAL_VALUE(oemcrypto_minor_api_version, indent); FORMAT_OPTIONAL_VALUE(oemcrypto_maximum_usage_table_header_size, indent); + + // OEMCrypto V17 metrics below. + FORMAT_OPTIONAL_VALUE(oemcrypto_watermarking_support, indent); } void FormatSessionMetrics(const WvCdmMetrics_SessionMetrics& metrics, diff --git a/libwvdrmengine/cdm/core/include/crypto_session.h b/libwvdrmengine/cdm/core/include/crypto_session.h index f45a646f..8c02db2a 100644 --- a/libwvdrmengine/cdm/core/include/crypto_session.h +++ b/libwvdrmengine/cdm/core/include/crypto_session.h @@ -216,6 +216,11 @@ class CryptoSession { std::string* info); virtual bool GetBuildInformation(std::string* info); + virtual bool GetWatermarkingSupport(CdmWatermarkingSupport* support); + virtual bool GetWatermarkingSupport( + RequestedSecurityLevel requested_security_level, + CdmWatermarkingSupport* support); + virtual bool GetMaximumUsageTableEntries( RequestedSecurityLevel security_level, size_t* number_of_entries); diff --git a/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h b/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h index da9e4f8d..6d292eaf 100644 --- a/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h +++ b/libwvdrmengine/cdm/core/include/oemcrypto_adapter.h @@ -70,6 +70,8 @@ size_t OEMCrypto_MaximumUsageTableHeaderSize(RequestedSecurityLevel level); OEMCryptoResult OEMCrypto_GetOEMPublicCertificate(uint8_t* public_cert, size_t* public_cert_length, RequestedSecurityLevel level); +OEMCrypto_WatermarkingSupport OEMCrypto_GetWatermarkingSupport( + RequestedSecurityLevel level); } // namespace wvcdm /* The following functions are deprecated in OEMCrypto v13. They are defined diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h index bc9d88ee..a66f3eb3 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h @@ -110,6 +110,7 @@ static const std::string QUERY_KEY_ANALOG_OUTPUT_CAPABILITIES = "AnalogOutputCapabilities"; static const std::string QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT = "CanDisableAnalogOutput"; +static const std::string QUERY_KEY_WATERMARKING_SUPPORT = "WatermarkingSupport"; static const std::string QUERY_VALUE_TRUE = "True"; static const std::string QUERY_VALUE_FALSE = "False"; @@ -137,6 +138,9 @@ static const std::string QUERY_VALUE_OEM_CERTIFICATE = "OEMCertificate"; static const std::string QUERY_VALUE_CGMS_A = "CGMS-A"; static const std::string QUERY_VALUE_BOOT_CERTIFICATE_CHAIN = "BootCertificateChain"; +static const std::string QUERY_VALUE_NOT_SUPPORTED = "NotSupported"; +static const std::string QUERY_VALUE_CONFIGURABLE = "Configurable"; +static const std::string QUERY_VALUE_ALWAYS_ON = "AlwaysOn"; static const std::string ISO_BMFF_VIDEO_MIME_TYPE = "video/mp4"; static const std::string ISO_BMFF_AUDIO_MIME_TYPE = "audio/mp4"; diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index 1dcb769b..7c9e2459 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -593,6 +593,12 @@ enum CdmProvisioningStatus : int32_t { kNeedsOemCertProvisioning, }; +enum CdmWatermarkingSupport : int32_t { + kWatermarkingNotSupported, + kWatermarkingConfigurable, + kWatermarkingAlwaysOn +}; + class CdmKeyAllowedUsage { public: CdmKeyAllowedUsage() { Clear(); } @@ -835,6 +841,7 @@ const char* CdmSecurityLevelToString(CdmSecurityLevel security_level); const char* CdmUsageEntryStorageTypeToString(CdmUsageEntryStorageType type); const char* RequestedSecurityLevelToString( RequestedSecurityLevel security_level); +const char* CdmWatermarkingSupportToString(CdmWatermarkingSupport support); // Converts a generic, unknown enum value to a string representation // containing its numeric value. // The pointer returned from this function is thread_local. diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index 66d194b5..7e3dd60b 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -795,6 +795,28 @@ CdmResponseType CdmEngine::QueryStatus(RequestedSecurityLevel security_level, } return NO_ERROR; } + if (query_token == QUERY_KEY_WATERMARKING_SUPPORT) { + CdmWatermarkingSupport support; + if (!crypto_session->GetWatermarkingSupport(security_level, &support)) { + // Assume not supported. + support = kWatermarkingNotSupported; + } + switch (support) { + case kWatermarkingNotSupported: + *query_response = QUERY_VALUE_NOT_SUPPORTED; + break; + case kWatermarkingConfigurable: + *query_response = QUERY_VALUE_CONFIGURABLE; + break; + case kWatermarkingAlwaysOn: + *query_response = QUERY_VALUE_ALWAYS_ON; + break; + default: + LOGW("Unknown watermarking support: %d", static_cast(support)); + return UNKNOWN_ERROR; + } + return NO_ERROR; + } CdmResponseType status; M_TIME(status = crypto_session->Open(security_level), diff --git a/libwvdrmengine/cdm/core/src/client_identification.cpp b/libwvdrmengine/cdm/core/src/client_identification.cpp index 2f859adb..f3ae6ddc 100644 --- a/libwvdrmengine/cdm/core/src/client_identification.cpp +++ b/libwvdrmengine/cdm/core/src/client_identification.cpp @@ -343,6 +343,28 @@ CdmResponseType ClientIdentification::Prepare( } } + if (is_license_request_) { + CdmWatermarkingSupport support; + if (!crypto_session_->GetWatermarkingSupport(&support)) { + // Assume not supported. + support = kWatermarkingNotSupported; + } + switch (support) { + case kWatermarkingNotSupported: + client_capabilities->set_watermarking_support( + ClientCapabilities::WATERMARKING_NOT_SUPPORTED); + break; + case kWatermarkingConfigurable: + client_capabilities->set_watermarking_support( + ClientCapabilities::WATERMARKING_CONFIGURABLE); + break; + case kWatermarkingAlwaysOn: + client_capabilities->set_watermarking_support( + ClientCapabilities::WATERMARKING_ALWAYS_ON); + break; + } + } + return NO_ERROR; } diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 61321942..f3594dd4 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -2306,6 +2306,41 @@ bool CryptoSession::GetBuildInformation(RequestedSecurityLevel security_level, return true; } +bool CryptoSession::GetWatermarkingSupport(CdmWatermarkingSupport* support) { + RETURN_IF_NOT_OPEN(false); + return GetWatermarkingSupport(requested_security_level_, support); +} + +bool CryptoSession::GetWatermarkingSupport( + RequestedSecurityLevel security_level, CdmWatermarkingSupport* support) { + LOGV("security_level = %s", RequestedSecurityLevelToString(security_level)); + RETURN_IF_UNINITIALIZED(false); + RETURN_IF_NULL(support, false); + const OEMCrypto_WatermarkingSupport oec_support = WithOecReadLock( + "GetWatermarkingSupport", + [&] { return OEMCrypto_GetWatermarkingSupport(security_level); }); + switch (oec_support) { + case OEMCrypto_WatermarkingNotSupported: + *support = kWatermarkingNotSupported; + break; + case OEMCrypto_WatermarkingConfigurable: + *support = kWatermarkingConfigurable; + break; + case OEMCrypto_WatermarkingAlwaysOn: + *support = kWatermarkingAlwaysOn; + break; + case OEMCrypto_WatermarkingError: + default: + LOGE("GetWatermarkingSupport error: security_level = %s, result = %d", + RequestedSecurityLevelToString(security_level), + static_cast(oec_support)); + metrics_->oemcrypto_watermarking_support_.SetError(oec_support); + return false; + } + metrics_->oemcrypto_watermarking_support_.Record(oec_support); + return true; +} + bool CryptoSession::GetMaximumUsageTableEntries( RequestedSecurityLevel security_level, size_t* number_of_entries) { LOGV("Getting maximum usage table entries: security_level = %s", diff --git a/libwvdrmengine/cdm/core/src/license_protocol.proto b/libwvdrmengine/cdm/core/src/license_protocol.proto index 7f00b1fe..79206d67 100644 --- a/libwvdrmengine/cdm/core/src/license_protocol.proto +++ b/libwvdrmengine/cdm/core/src/license_protocol.proto @@ -908,6 +908,13 @@ message ClientIdentification { ANALOG_OUTPUT_SUPPORTS_CGMS_A = 3; } + enum WatermarkingSupport { + WATERMARKING_SUPPORT_UNKNOWN = 0; + WATERMARKING_NOT_SUPPORTED = 1; + WATERMARKING_CONFIGURABLE = 2; + WATERMARKING_ALWAYS_ON = 3; + } + optional bool client_token = 1 [default = false]; optional bool session_token = 2 [default = false]; optional bool video_resolution_constraints = 3 [default = false]; @@ -932,6 +939,10 @@ message ClientIdentification { // the resource rating is unavailable or reporting erroneous values // for that device. optional uint32 resource_rating_tier = 12 [default = 0]; + // Watermarking support of OEMCrypto was introduced in v17. + // Support is optional. + // Value is only required to be set for license requests. + optional WatermarkingSupport watermarking_support = 13; } message ClientCredentials { diff --git a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp index 05532bbd..97c00d65 100644 --- a/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp +++ b/libwvdrmengine/cdm/core/src/oemcrypto_adapter_dynamic.cpp @@ -1896,6 +1896,17 @@ OEMCryptoResult OEMCrypto_SetDebugIgnoreKeyboxCount(uint32_t count) { OEMCryptoResult OEMCrypto_SetAllowTestKeybox(bool allow) { return SetAllowTestKeybox(allow); } + +OEMCrypto_WatermarkingSupport OEMCrypto_GetWatermarkingSupport( + wvcdm::RequestedSecurityLevel level) { + if (!gAdapter) return OEMCrypto_WatermarkingError; + const FunctionPointers* fcn = gAdapter->GetFunctionPointers(level); + if (!fcn) return OEMCrypto_WatermarkingError; + if (fcn->version < 17) return OEMCrypto_WatermarkingNotSupported; + if (fcn->GetWatermarkingSupport == nullptr) + return OEMCrypto_WatermarkingError; + return fcn->GetWatermarkingSupport(); +} } // namespace wvcdm extern "C" OEMCryptoResult OEMCrypto_SetSandbox(const uint8_t* sandbox_id, @@ -3403,12 +3414,7 @@ extern "C" OEMCryptoResult OEMCrypto_GetDTCP2Capability( return fcn->GetDTCP2Capability(capability); } -extern "C" OEMCrypto_WatermarkingSupport OEMCrypto_GetWatermarkingSupport() { - if (!gAdapter) return OEMCrypto_WatermarkingError; - const FunctionPointers* fcn = gAdapter->GetFunctionPointers(kLevelDefault); - if (!fcn) return OEMCrypto_WatermarkingError; - if (fcn->version < 17) return OEMCrypto_WatermarkingError; - if (fcn->GetWatermarkingSupport == nullptr) - return OEMCrypto_WatermarkingError; - return fcn->GetWatermarkingSupport(); +extern "C" OEMCrypto_WatermarkingSupport OEMCrypto_GetWatermarkingSupport( + void) { + return wvcdm::OEMCrypto_GetWatermarkingSupport(kLevelDefault); } diff --git a/libwvdrmengine/cdm/core/src/wv_cdm_types.cpp b/libwvdrmengine/cdm/core/src/wv_cdm_types.cpp index 4d9d1da3..51336811 100644 --- a/libwvdrmengine/cdm/core/src/wv_cdm_types.cpp +++ b/libwvdrmengine/cdm/core/src/wv_cdm_types.cpp @@ -119,6 +119,18 @@ const char* RequestedSecurityLevelToString( return UnknownValueRep(security_level); } +const char* CdmWatermarkingSupportToString(CdmWatermarkingSupport support) { + switch (support) { + case kWatermarkingNotSupported: + return QUERY_VALUE_NOT_SUPPORTED.c_str(); + case kWatermarkingConfigurable: + return QUERY_VALUE_CONFIGURABLE.c_str(); + case kWatermarkingAlwaysOn: + return QUERY_VALUE_ALWAYS_ON.c_str(); + } + return UnknownValueRep(support); +} + const char* UnknownEnumValueToString(int value) { snprintf(tl_unknown_rep_buf, sizeof(tl_unknown_rep_buf), "", value); diff --git a/libwvdrmengine/cdm/core/test/license_unittest.cpp b/libwvdrmengine/cdm/core/test/license_unittest.cpp index 23f16ddd..c1acaa73 100644 --- a/libwvdrmengine/cdm/core/test/license_unittest.cpp +++ b/libwvdrmengine/cdm/core/test/license_unittest.cpp @@ -135,6 +135,7 @@ const std::string kFakeKeyTooLong = a2bs_hex("d4bc8605d662878a46adb2adb6bf3c0b30a54a0c2f"); const std::string kFakeKeyTooShort = a2bs_hex("06e247e7f924208011"); const std::string kFakeIv = a2bs_hex("3d515a3ee0be1687080ac59da9e0d69a"); +const std::string kFakeBuildInfo = "Mock Crypto Session - License Test"; class MockCryptoSession : public TestCryptoSession { public: @@ -154,6 +155,11 @@ class MockCryptoSession : public TestCryptoSession { MOCK_METHOD(CdmResponseType, LoadEntitledContentKeys, (const std::vector& key_array), (override)); MOCK_METHOD(bool, GetResourceRatingTier, (uint32_t*), (override)); + MOCK_METHOD(bool, GetWatermarkingSupport, (CdmWatermarkingSupport*), + (override)); + MOCK_METHOD(bool, GetBuildInformation, (std::string*), (override)); + + CdmSecurityLevel GetSecurityLevel() override { return kSecurityLevelL1; } }; class MockPolicyEngine : public PolicyEngine { @@ -318,6 +324,11 @@ TEST_F(CdmLicenseTest, PrepareKeyRequestValidation) { .WillOnce(DoAll(SetArgPointee<1>(kFakeCoreMessage), SetArgPointee<2>(kLicenseRequestSignature), Return(NO_ERROR))); + EXPECT_CALL(*crypto_session_, GetBuildInformation(NotNull())) + .WillOnce(DoAll(SetArgPointee<0>(kFakeBuildInfo), Return(true))); + EXPECT_CALL(*crypto_session_, GetWatermarkingSupport(NotNull())) + .WillOnce( + DoAll(SetArgPointee<0>(kWatermarkingConfigurable), Return(true))); CreateCdmLicense(); EXPECT_TRUE(cdm_license_->Init(true, kDefaultServiceCertificate, @@ -385,6 +396,8 @@ TEST_F(CdmLicenseTest, PrepareKeyRequestValidation) { ClientCapabilities::ECC_SECP384R1, ClientCapabilities::ECC_SECP521R1)); EXPECT_TRUE(client_capabilities.has_resource_rating_tier()); + EXPECT_EQ(client_capabilities.watermarking_support(), + ClientCapabilities::WATERMARKING_CONFIGURABLE); // Verify Content Identification const LicenseRequest_ContentIdentification& content_id = @@ -442,6 +455,11 @@ TEST_F(CdmLicenseTest, PrepareKeyRequestValidationV15) { .WillOnce(DoAll(SetArgPointee<1>(kFakeCoreMessage), SetArgPointee<2>(kLicenseRequestSignature), Return(NO_ERROR))); + EXPECT_CALL(*crypto_session_, GetBuildInformation(NotNull())) + .WillOnce(DoAll(SetArgPointee<0>(kFakeBuildInfo), Return(true))); + EXPECT_CALL(*crypto_session_, GetWatermarkingSupport(NotNull())) + .WillOnce( + DoAll(SetArgPointee<0>(kWatermarkingNotSupported), Return(true))); CreateCdmLicense(); EXPECT_TRUE(cdm_license_->Init(true, kDefaultServiceCertificate, @@ -509,6 +527,8 @@ TEST_F(CdmLicenseTest, PrepareKeyRequestValidationV15) { ClientCapabilities::ECC_SECP384R1, ClientCapabilities::ECC_SECP521R1)); EXPECT_EQ(resource_rating_tier, client_capabilities.resource_rating_tier()); + EXPECT_EQ(client_capabilities.watermarking_support(), + ClientCapabilities::WATERMARKING_NOT_SUPPORTED); // Verify Content Identification const LicenseRequest_ContentIdentification& content_id = diff --git a/libwvdrmengine/cdm/metrics/include/metrics_collections.h b/libwvdrmengine/cdm/metrics/include/metrics_collections.h index 423a6972..92ea8c54 100644 --- a/libwvdrmengine/cdm/metrics/include/metrics_collections.h +++ b/libwvdrmengine/cdm/metrics/include/metrics_collections.h @@ -297,6 +297,7 @@ class CryptoMetrics { oemcrypto_generate_certificate_key_pair_; EventMetric oemcrypto_install_oem_private_key_; + ValueMetric oemcrypto_watermarking_support_; }; // class CryptoMetrics // This class contains session-scoped metrics. All properties and diff --git a/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp b/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp index 00f1252f..d6b72faa 100644 --- a/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp +++ b/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp @@ -209,6 +209,8 @@ void CryptoMetrics::Serialize( oemcrypto_minor_api_version_.ToProto()); crypto_metrics->set_allocated_oemcrypto_maximum_usage_table_header_size( oemcrypto_maximum_usage_table_header_size_.ToProto()); + crypto_metrics->set_allocated_oemcrypto_watermarking_support( + oemcrypto_watermarking_support_.ToProto()); } SessionMetrics::SessionMetrics() : session_id_(""), completed_(false) {} diff --git a/libwvdrmengine/cdm/metrics/src/wv_metrics.proto b/libwvdrmengine/cdm/metrics/src/wv_metrics.proto index ab92d222..c105f958 100644 --- a/libwvdrmengine/cdm/metrics/src/wv_metrics.proto +++ b/libwvdrmengine/cdm/metrics/src/wv_metrics.proto @@ -92,7 +92,7 @@ message WvCdmMetrics { // This contains metrics that were captured at the CryptoSession level. These // include CryptoSession metrics and most OEMCrypto metrics. - // next id: 85 + // next id: 86 message CryptoMetrics { // Crypto Session Metrics. optional ValueMetric crypto_session_security_level = 1; @@ -192,6 +192,7 @@ message WvCdmMetrics { repeated DistributionMetric oemcrypto_load_provisioning_time_us = 82; optional ValueMetric oemcrypto_minor_api_version = 83; optional ValueMetric oemcrypto_maximum_usage_table_header_size = 84; + optional ValueMetric oemcrypto_watermarking_support = 85; } // This contains metrics that were captured within a CdmSession. This contains diff --git a/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp b/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp index 494347cf..f1417439 100644 --- a/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp +++ b/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp @@ -443,6 +443,8 @@ TEST_F(CryptoMetricsTest, AllCryptoMetrics) { crypto_metrics.oemcrypto_resource_rating_tier_.Record(123); crypto_metrics.oemcrypto_minor_api_version_.Record(234); crypto_metrics.oemcrypto_maximum_usage_table_header_size_.Record(321); + crypto_metrics.oemcrypto_watermarking_support_.Record( + OEMCrypto_WatermarkingAlwaysOn); WvCdmMetrics::CryptoMetrics actual; crypto_metrics.Serialize(&actual); @@ -534,6 +536,8 @@ TEST_F(CryptoMetricsTest, AllCryptoMetrics) { EXPECT_EQ(234, actual.oemcrypto_minor_api_version().int_value()); EXPECT_EQ(321, actual.oemcrypto_maximum_usage_table_header_size().int_value()); + EXPECT_EQ(static_cast(OEMCrypto_WatermarkingAlwaysOn), + actual.oemcrypto_watermarking_support().int_value()); } } // namespace metrics } // namespace wvcdm diff --git a/libwvdrmengine/cdm/test/request_license_test.cpp b/libwvdrmengine/cdm/test/request_license_test.cpp index 2de36756..21cff53d 100644 --- a/libwvdrmengine/cdm/test/request_license_test.cpp +++ b/libwvdrmengine/cdm/test/request_license_test.cpp @@ -5232,6 +5232,14 @@ TEST_F(WvCdmRequestLicenseTest, QueryStatus) { decryptor_->QueryStatus( kLevelDefault, wvcdm::QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT, &value)); EXPECT_THAT(kCanDisableAnalogOutput, Contains(value)); + + EXPECT_EQ(wvcdm::NO_ERROR, + decryptor_->QueryStatus( + kLevelDefault, wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, &value)); + EXPECT_TRUE(value == wvcdm::QUERY_VALUE_NOT_SUPPORTED || + value == wvcdm::QUERY_VALUE_CONFIGURABLE || + value == wvcdm::QUERY_VALUE_ALWAYS_ON) + << "Watermarking support"; } TEST_F(WvCdmRequestLicenseTest, QueryStatusL3) { @@ -5372,6 +5380,14 @@ TEST_F(WvCdmRequestLicenseTest, QueryStatusL3) { decryptor_->QueryStatus( kLevel3, wvcdm::QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT, &value)); EXPECT_THAT(kCanDisableAnalogOutput, Contains(value)); + + EXPECT_EQ(wvcdm::NO_ERROR, + decryptor_->QueryStatus( + kLevelDefault, wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, &value)); + EXPECT_TRUE(value == wvcdm::QUERY_VALUE_NOT_SUPPORTED || + value == wvcdm::QUERY_VALUE_CONFIGURABLE || + value == wvcdm::QUERY_VALUE_ALWAYS_ON) + << "Watermarking support"; } TEST_F(WvCdmRequestLicenseTest, QueryOemCryptoSessionId) { diff --git a/libwvdrmengine/mediadrm/aidl_src/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/aidl_src/WVDrmPlugin.cpp index 4ecb1897..9556a8e0 100644 --- a/libwvdrmengine/mediadrm/aidl_src/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/aidl_src/WVDrmPlugin.cpp @@ -1149,6 +1149,8 @@ Status WVDrmPlugin::unprovisionDevice() { } else { value = kDisable; } + } else if (name == "watermarkingSupport") { + status = queryProperty(wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, 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 5596d59e..77f36508 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -1259,6 +1259,8 @@ Return WVDrmPlugin::getPropertyString(const hidl_string& propertyName, } else { value = kDisable; } + } else if (name == "watermarkingSupport") { + status = queryProperty(wvcdm::QUERY_KEY_WATERMARKING_SUPPORT, value); } else { ALOGE("App requested unknown string property %s", name.c_str()); status = Status::ERROR_DRM_CANNOT_HANDLE; diff --git a/libwvdrmengine/src_hidl/WVDrmFactory.cpp b/libwvdrmengine/src_hidl/WVDrmFactory.cpp index 1b549a4d..785c35e6 100644 --- a/libwvdrmengine/src_hidl/WVDrmFactory.cpp +++ b/libwvdrmengine/src_hidl/WVDrmFactory.cpp @@ -216,6 +216,7 @@ void WVDrmFactory::printCdmProperties(FILE* out) { {"analog capabilities:", wvcdm::QUERY_KEY_ANALOG_OUTPUT_CAPABILITIES}, {"can disable analog output:", wvcdm::QUERY_KEY_CAN_DISABLE_ANALOG_OUTPUT}, + {"watermarking support:", wvcdm::QUERY_KEY_WATERMARKING_SUPPORT}, }; std::string value; diff --git a/libwvdrmengine/src_hidl/wv_metrics.cpp b/libwvdrmengine/src_hidl/wv_metrics.cpp index 23a2f2ac..62f281d8 100644 --- a/libwvdrmengine/src_hidl/wv_metrics.cpp +++ b/libwvdrmengine/src_hidl/wv_metrics.cpp @@ -374,6 +374,9 @@ void FormatCryptoMetrics(const WvCdmMetrics_CryptoMetrics metrics, FORMAT_REPEATED_DISTRIBUTION(oemcrypto_load_provisioning_time_us, indent); FORMAT_OPTIONAL_VALUE(oemcrypto_minor_api_version, indent); FORMAT_OPTIONAL_VALUE(oemcrypto_maximum_usage_table_header_size, indent); + + // OEMCrypto V17 metrics below. + FORMAT_OPTIONAL_VALUE(oemcrypto_watermarking_support, indent); } void FormatSessionMetrics(const WvCdmMetrics_SessionMetrics& metrics,