From 47fc031576ffd1211fa893caaba42394e0714ff2 Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Wed, 27 Jan 2021 13:30:12 -0800 Subject: [PATCH] Include DRM key type to SessionMetrics. [ Merge of http://go/wvgerrit/111903 ] CDM metrics has been updated to include the DRM key type. The CDM session records the key type when the wrapped DRM key is successfully loaded into an OEMCrypto session. Now that the API refers to a general DRM key rather than an RSA key, the timer metric for loading the DRM key has been renamed on the client to reflect this. Test: Metric unit tests Bug: 140813486 Change-Id: I9069f13ac7c979cc8556e08591e1cf8f623d0a84 --- libwvdrmengine/cdm/core/src/cdm_session.cpp | 19 +++++++++++++++++-- .../cdm/core/src/crypto_session.cpp | 2 +- .../cdm/metrics/include/metrics_collections.h | 3 ++- .../cdm/metrics/src/metrics_collections.cpp | 6 ++++-- .../cdm/metrics/src/wv_metrics.proto | 8 ++++---- .../test/metrics_collections_unittest.cpp | 8 +++++--- .../src_hidl/hidl_metrics_adapter.cpp | 4 ++-- .../test/hidl_metrics_adapter_unittest.cpp | 2 +- libwvdrmengine/src_hidl/wv_metrics.cpp | 2 +- .../tools/metrics_dump/src/wv_metrics.cpp | 2 +- 10 files changed, 38 insertions(+), 18 deletions(-) diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index f993f5de..3091a723 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -38,6 +38,7 @@ return false; \ } +namespace wvcdm { namespace { const size_t kKeySetIdLength = 14; @@ -49,10 +50,22 @@ void SetErrorDetail(int* error_detail, T error_code) { } } +int DrmKeyTypeToMetricValue(CryptoWrappedKey::Type type) { + constexpr int kUnknownMetricType = -1; + constexpr int kRsaMetricType = 0; + constexpr int kEccMetricType = 1; + switch (type) { + case CryptoWrappedKey::kRsa: + return kRsaMetricType; + case CryptoWrappedKey::kEcc: + return kEccMetricType; + default: + LOGE("Unexpected DRM key type: %d", static_cast(type)); + return kUnknownMetricType; + } +} } // namespace -namespace wvcdm { - CdmSession::CdmSession(FileSystem* file_system, std::shared_ptr metrics) : metrics_(metrics), @@ -187,6 +200,8 @@ CdmResponseType CdmSession::Init(CdmClientPropertySet* cdm_client_property_set, load_cert_sts); switch (load_cert_sts) { case NO_ERROR: + metrics_->drm_certificate_key_type_.Record( + DrmKeyTypeToMetricValue(private_key.type())); break; case SESSION_LOST_STATE_ERROR: case SYSTEM_INVALIDATED_ERROR: diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 45a9baed..45a9f9ee 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -1300,7 +1300,7 @@ CdmResponseType CryptoSession::LoadCertificatePrivateKey( oec_session_id_, key_type, reinterpret_cast(wrapped_key.data()), wrapped_key.size()), - metrics_, oemcrypto_load_device_rsa_key_, sts); + metrics_, oemcrypto_load_device_drm_key_, sts); }); return MapOEMCryptoResult(sts, LOAD_DEVICE_RSA_KEY_ERROR, diff --git a/libwvdrmengine/cdm/metrics/include/metrics_collections.h b/libwvdrmengine/cdm/metrics/include/metrics_collections.h index ffa8a591..1f556d89 100644 --- a/libwvdrmengine/cdm/metrics/include/metrics_collections.h +++ b/libwvdrmengine/cdm/metrics/include/metrics_collections.h @@ -234,7 +234,7 @@ class CryptoMetrics { ValueMetric oemcrypto_is_anti_rollback_hw_present_; ValueMetric oemcrypto_is_keybox_valid_; EventMetric - oemcrypto_load_device_rsa_key_; + oemcrypto_load_device_drm_key_; EventMetric oemcrypto_load_entitled_keys_; EventMetric @@ -338,6 +338,7 @@ class SessionMetrics { ValueMetric license_sdk_version_; ValueMetric license_service_version_; ValueMetric playback_id_; + ValueMetric drm_certificate_key_type_; // Serialize the session metrics to the provided |metric_group|. // |metric_group| is owned by the caller and must not be null. diff --git a/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp b/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp index c2152052..8bc7fb63 100644 --- a/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp +++ b/libwvdrmengine/cdm/metrics/src/metrics_collections.cpp @@ -140,8 +140,8 @@ void CryptoMetrics::Serialize(WvCdmMetrics::CryptoMetrics *crypto_metrics) oemcrypto_is_anti_rollback_hw_present_.ToProto()); crypto_metrics->set_allocated_oemcrypto_is_keybox_valid( oemcrypto_is_keybox_valid_.ToProto()); - oemcrypto_load_device_rsa_key_.ToProto( - crypto_metrics->mutable_oemcrypto_load_device_rsa_key_time_us()); + oemcrypto_load_device_drm_key_.ToProto( + crypto_metrics->mutable_oemcrypto_load_device_drm_key_time_us()); oemcrypto_load_entitled_keys_.ToProto( crypto_metrics->mutable_oemcrypto_load_entitled_keys_time_us()); oemcrypto_load_keys_.ToProto( @@ -247,6 +247,8 @@ void SessionMetrics::SerializeSessionMetrics( session_metrics->set_allocated_license_service_version( license_service_version_.ToProto()); session_metrics->set_allocated_playback_id(playback_id_.ToProto()); + session_metrics->set_allocated_drm_certificate_key_type( + drm_certificate_key_type_.ToProto()); } OemCryptoDynamicAdapterMetrics::OemCryptoDynamicAdapterMetrics() diff --git a/libwvdrmengine/cdm/metrics/src/wv_metrics.proto b/libwvdrmengine/cdm/metrics/src/wv_metrics.proto index ea97fdcc..5fc59717 100644 --- a/libwvdrmengine/cdm/metrics/src/wv_metrics.proto +++ b/libwvdrmengine/cdm/metrics/src/wv_metrics.proto @@ -155,7 +155,7 @@ message WvCdmMetrics { repeated DistributionMetric oemcrypto_initialize_time_us = 38; optional ValueMetric oemcrypto_is_anti_rollback_hw_present = 39; optional ValueMetric oemcrypto_is_keybox_valid = 40; - repeated DistributionMetric oemcrypto_load_device_rsa_key_time_us = 41; + repeated DistributionMetric oemcrypto_load_device_drm_key_time_us = 41; repeated DistributionMetric oemcrypto_load_entitled_keys_time_us = 42; repeated DistributionMetric oemcrypto_load_keys_time_us = 43; optional ValueMetric oemcrypto_max_hdcp_capability = 44; @@ -182,8 +182,6 @@ message WvCdmMetrics { optional ValueMetric oemcrypto_set_sandbox = 70; repeated CounterMetric oemcrypto_set_decrypt_hash = 71; optional ValueMetric oemcrypto_resource_rating_tier = 72; - // TODO(b/142684157): Remove this comment before closing bug. - // OemCrypto V16 metrics start at 77 (4 new metrics pending review). repeated DistributionMetric oemcrypto_prep_and_sign_license_request_time_us = 77; repeated DistributionMetric @@ -199,7 +197,7 @@ message WvCdmMetrics { // This contains metrics that were captured within a CdmSession. This contains // nested CryptoMetrics that were captured in the context of the session. - // next id: 9 + // next id: 13 message SessionMetrics { optional ValueMetric session_id = 1; optional CryptoMetrics crypto_metrics = 2; @@ -212,6 +210,8 @@ message WvCdmMetrics { optional ValueMetric license_sdk_version = 9; optional ValueMetric license_service_version = 10; optional ValueMetric playback_id = 11; + // Value is enumerated based on the OEMCrypto document: RSA = 0, ECC = 1 + optional ValueMetric drm_certificate_key_type = 12; } // These are metrics recorded at the Engine level. This includes CryptoSession diff --git a/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp b/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp index 156af527..069c2109 100644 --- a/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp +++ b/libwvdrmengine/cdm/metrics/test/metrics_collections_unittest.cpp @@ -276,6 +276,7 @@ TEST_F(SessionMetricsTest, AllSessionMetrics) { session_metrics.oemcrypto_build_info_.Record("test build info"); session_metrics.license_sdk_version_.Record("test license sdk version"); session_metrics.license_service_version_.Record("test license service version"); + session_metrics.drm_certificate_key_type_.Record(1); // Record a CryptoMetrics metric in the session. session_metrics.GetCryptoMetrics()->crypto_session_generic_decrypt_ @@ -297,6 +298,7 @@ TEST_F(SessionMetricsTest, AllSessionMetrics) { actual.license_service_version().string_value().c_str()); EXPECT_GT( actual.crypto_metrics().crypto_session_generic_decrypt_time_us_size(), 0); + EXPECT_EQ(1, actual.drm_certificate_key_type().int_value()); } TEST_F(SessionMetricsTest, EmptySessionMetrics) { @@ -404,8 +406,8 @@ TEST_F(CryptoMetricsTest, AllCryptoMetrics) { .Record(1.0, OEMCrypto_ERROR_INIT_FAILED); crypto_metrics.oemcrypto_is_anti_rollback_hw_present_.Record(true); crypto_metrics.oemcrypto_is_keybox_valid_.Record(true); - crypto_metrics.oemcrypto_load_device_rsa_key_ - .Record(1.0, OEMCrypto_ERROR_INIT_FAILED); + crypto_metrics.oemcrypto_load_device_drm_key_.Record( + 1.0, OEMCrypto_ERROR_INIT_FAILED); crypto_metrics.oemcrypto_load_keys_.Record(1.0, OEMCrypto_ERROR_INIT_FAILED); crypto_metrics.oemcrypto_refresh_keys_ .Record(1.0, OEMCrypto_ERROR_INIT_FAILED); @@ -509,7 +511,7 @@ TEST_F(CryptoMetricsTest, AllCryptoMetrics) { EXPECT_GT(actual.oemcrypto_initialize_time_us_size(), 0); EXPECT_EQ(true, actual.oemcrypto_is_anti_rollback_hw_present().int_value()); EXPECT_EQ(true, actual.oemcrypto_is_keybox_valid().int_value()); - EXPECT_GT(actual.oemcrypto_load_device_rsa_key_time_us_size(), 0); + EXPECT_GT(actual.oemcrypto_load_device_drm_key_time_us_size(), 0); EXPECT_GT(actual.oemcrypto_load_keys_time_us_size(), 0); EXPECT_GT(actual.oemcrypto_refresh_keys_time_us_size(), 0); EXPECT_GT(actual.oemcrypto_report_usage_size(), 0); diff --git a/libwvdrmengine/mediadrm/src_hidl/hidl_metrics_adapter.cpp b/libwvdrmengine/mediadrm/src_hidl/hidl_metrics_adapter.cpp index 2e7dbe47..c770a669 100644 --- a/libwvdrmengine/mediadrm/src_hidl/hidl_metrics_adapter.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/hidl_metrics_adapter.cpp @@ -570,8 +570,8 @@ void HidlMetricsAdapter::AddCryptoMetrics( proto_metrics.oemcrypto_is_keybox_valid()); } group_builder->AddDistributions( - "oemcrypto_load_device_rsa_key_time_us", - proto_metrics.oemcrypto_load_device_rsa_key_time_us()); + "oemcrypto_load_device_drm_key_time_us", + proto_metrics.oemcrypto_load_device_drm_key_time_us()); group_builder->AddDistributions( "oemcrypto_load_entitled_keys_time_us", proto_metrics.oemcrypto_load_entitled_keys_time_us()); diff --git a/libwvdrmengine/mediadrm/test/hidl_metrics_adapter_unittest.cpp b/libwvdrmengine/mediadrm/test/hidl_metrics_adapter_unittest.cpp index 525c0f8c..ef43174c 100644 --- a/libwvdrmengine/mediadrm/test/hidl_metrics_adapter_unittest.cpp +++ b/libwvdrmengine/mediadrm/test/hidl_metrics_adapter_unittest.cpp @@ -378,7 +378,7 @@ TEST(HidlMetricsAdapterTest, EngineAndSessionAllMetrics) { crypto_metrics.mutable_oemcrypto_is_anti_rollback_hw_present ()->set_int_value(1); crypto_metrics.mutable_oemcrypto_is_keybox_valid()->set_int_value(1); - crypto_metrics.add_oemcrypto_load_device_rsa_key_time_us()->set_min(1.0f); + crypto_metrics.add_oemcrypto_load_device_drm_key_time_us()->set_min(1.0f); crypto_metrics.add_oemcrypto_load_entitled_keys_time_us()->set_min(1.0f); crypto_metrics.add_oemcrypto_load_keys_time_us()->set_min(1.0f); crypto_metrics.mutable_oemcrypto_max_hdcp_capability()->set_int_value(1); diff --git a/libwvdrmengine/src_hidl/wv_metrics.cpp b/libwvdrmengine/src_hidl/wv_metrics.cpp index 8cdf171b..23a2f2ac 100644 --- a/libwvdrmengine/src_hidl/wv_metrics.cpp +++ b/libwvdrmengine/src_hidl/wv_metrics.cpp @@ -333,7 +333,7 @@ void FormatCryptoMetrics(const WvCdmMetrics_CryptoMetrics metrics, FORMAT_REPEATED_DISTRIBUTION(oemcrypto_initialize_time_us, indent); FORMAT_OPTIONAL_VALUE(oemcrypto_is_anti_rollback_hw_present, indent); FORMAT_OPTIONAL_VALUE(oemcrypto_is_keybox_valid, indent); - FORMAT_REPEATED_DISTRIBUTION(oemcrypto_load_device_rsa_key_time_us, indent); + FORMAT_REPEATED_DISTRIBUTION(oemcrypto_load_device_drm_key_time_us, indent); FORMAT_REPEATED_DISTRIBUTION(oemcrypto_load_entitled_keys_time_us, indent); FORMAT_REPEATED_DISTRIBUTION(oemcrypto_load_keys_time_us, indent); FORMAT_OPTIONAL_HDCP_CAPABILITY(oemcrypto_max_hdcp_capability, indent); diff --git a/libwvdrmengine/tools/metrics_dump/src/wv_metrics.cpp b/libwvdrmengine/tools/metrics_dump/src/wv_metrics.cpp index aa494619..78d4980f 100644 --- a/libwvdrmengine/tools/metrics_dump/src/wv_metrics.cpp +++ b/libwvdrmengine/tools/metrics_dump/src/wv_metrics.cpp @@ -330,7 +330,7 @@ void FormatCryptoMetrics(const drm_metrics::WvCdmMetrics_CryptoMetrics metrics, FORMAT_REPEATED_DISTRIBUTION(oemcrypto_initialize_time_us, indent); FORMAT_OPTIONAL_VALUE(oemcrypto_is_anti_rollback_hw_present, indent); FORMAT_OPTIONAL_VALUE(oemcrypto_is_keybox_valid, indent); - FORMAT_REPEATED_DISTRIBUTION(oemcrypto_load_device_rsa_key_time_us, indent); + FORMAT_REPEATED_DISTRIBUTION(oemcrypto_load_device_drm_key_time_us, indent); FORMAT_REPEATED_DISTRIBUTION(oemcrypto_load_entitled_keys_time_us, indent); FORMAT_REPEATED_DISTRIBUTION(oemcrypto_load_keys_time_us, indent); FORMAT_OPTIONAL_HDCP_CAPABILITY(oemcrypto_max_hdcp_capability, indent);