From 46f26fe6ae4e0a14a78dae7f755db0f9ea3218d7 Mon Sep 17 00:00:00 2001 From: KongQun Yang Date: Wed, 11 Mar 2015 09:37:21 -0700 Subject: [PATCH] Implement OEMCrypto_GetNumberOfOpenSessions Merged from Widevine CDM repo: https://widevine-internal-review.googlesource.com/#/c/13560/ Change-Id: Ie19bf3e57d0c4b1621b95bd5912a751ccfbaaa7b --- .../cdm/core/include/crypto_session.h | 1 + .../cdm/core/include/wv_cdm_constants.h | 2 ++ libwvdrmengine/cdm/core/src/cdm_engine.cpp | 6 ++++ .../cdm/core/src/crypto_session.cpp | 18 ++++++++++++ .../mock/src/oemcrypto_engine_mock.h | 2 ++ .../oemcrypto/mock/src/oemcrypto_mock.cpp | 10 +++++++ .../oemcrypto/test/oemcrypto_test.cpp | 28 ++++++++++++------- 7 files changed, 57 insertions(+), 10 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/crypto_session.h b/libwvdrmengine/cdm/core/include/crypto_session.h index ac5ac9f5..17a56621 100644 --- a/libwvdrmengine/cdm/core/include/crypto_session.h +++ b/libwvdrmengine/cdm/core/include/crypto_session.h @@ -101,6 +101,7 @@ class CryptoSession { virtual bool GetHdcpCapabilities(OemCryptoHdcpVersion* current, OemCryptoHdcpVersion* max); virtual bool GetRandom(size_t data_length, uint8_t* random_data); + virtual bool GetNumberOfOpenSessions(size_t* count); virtual bool GetMaxNumberOfSessions(size_t* max); private: diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h index dff80a1f..094521a8 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_constants.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_constants.h @@ -49,6 +49,8 @@ static const std::string QUERY_KEY_MAX_HDCP_LEVEL = "MaxHdcpLevel"; // maximum supported HDCP level static const std::string QUERY_KEY_USAGE_SUPPORT = "UsageSupport"; // whether usage reporting is supported +static const std::string QUERY_KEY_NUMBER_OF_OPEN_SESSIONS = + "NumberOfOpenSessions"; static const std::string QUERY_KEY_MAX_NUMBER_OF_SESSIONS = "MaxNumberOfSessions"; diff --git a/libwvdrmengine/cdm/core/src/cdm_engine.cpp b/libwvdrmengine/cdm/core/src/cdm_engine.cpp index d4d052f6..001bbf7f 100644 --- a/libwvdrmengine/cdm/core/src/cdm_engine.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_engine.cpp @@ -438,6 +438,12 @@ CdmResponseType CdmEngine::QueryStatus(CdmQueryMap* key_info) { supports_usage_reporting ? QUERY_VALUE_TRUE : QUERY_VALUE_FALSE; } + size_t number_of_open_sessions; + success = crypto_session.GetNumberOfOpenSessions(&number_of_open_sessions); + if (success) { + (*key_info)[QUERY_KEY_NUMBER_OF_OPEN_SESSIONS] = number_of_open_sessions; + } + size_t maximum_number_of_sessions; success = crypto_session.GetMaxNumberOfSessions(&maximum_number_of_sessions); if (success) { diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 083ad49e..aba6500f 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -985,6 +985,24 @@ bool CryptoSession::GetRandom(size_t data_length, uint8_t* random_data) { return true; } +bool CryptoSession::GetNumberOfOpenSessions(size_t* count) { + LOGV("GetNumberOfOpenSessions"); + if (!initialized_) return false; + if (count == NULL) { + LOGE("CryptoSession::GetNumberOfOpenSessions: |count| cannot be NULL"); + return false; + } + + size_t sessions_count; + OEMCryptoResult status = OEMCrypto_GetNumberOfOpenSessions(&sessions_count); + if (OEMCrypto_SUCCESS != status) { + LOGW("OEMCrypto_GetNumberOfOpenSessions fails with %d", status); + return false; + } + *count = sessions_count; + return true; +} + bool CryptoSession::GetMaxNumberOfSessions(size_t* max) { LOGV("GetMaxNumberOfSessions"); if (!initialized_) return false; diff --git a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_mock.h b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_mock.h index 7827a524..c2be6496 100644 --- a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_mock.h +++ b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_mock.h @@ -237,6 +237,8 @@ class CryptoEngine { SessionContext* FindSession(SessionId sid); + size_t GetNumberOfOpenSessions() { return sessions_.size(); } + void set_current_session_(SessionContext* current) { current_session_ = current; } diff --git a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp index efbb56d2..39e4eba0 100644 --- a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp +++ b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp @@ -1024,6 +1024,16 @@ bool OEMCrypto_SupportsUsageTable() { return supports_usage; } +extern "C" +OEMCryptoResult OEMCrypto_GetNumberOfOpenSessions(size_t* count) { + if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { + LOGI("-- OEMCryptoResult OEMCrypto_GetNumberOfOpenSessions(%p)\n", count); + } + if (count == NULL) return OEMCrypto_ERROR_UNKNOWN_FAILURE; + *count = crypto_engine->GetNumberOfOpenSessions(); + return OEMCrypto_SUCCESS; +} + extern "C" OEMCryptoResult OEMCrypto_GetMaxNumberOfSessions(size_t* maximum) { if (LogCategoryEnabled(kLoggingTraceOEMCryptoCalls)) { diff --git a/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp b/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp index 58aa1b36..3a6e7128 100644 --- a/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp +++ b/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp @@ -1740,22 +1740,30 @@ TEST_F(OEMCryptoClientTest, TwoSessionsOpenClose) { } TEST_F(OEMCryptoClientTest, MaxSessionsOpenClose) { + size_t sessions_count; + ASSERT_EQ(OEMCrypto_SUCCESS, + OEMCrypto_GetNumberOfOpenSessions(&sessions_count)); + ASSERT_EQ(0, sessions_count); size_t max_sessions; ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_GetMaxNumberOfSessions(&max_sessions)); ASSERT_GT(max_sessions, 0); - vector s(max_sessions); - for (int i = 0; i < s.size(); i++) { - s[i].open(); - ASSERT_EQ(OEMCrypto_SUCCESS, s[i].getStatus()); - ASSERT_TRUE(s[i].isOpen()); + + vector sessions; + for (int i = 0; i < max_sessions; i++) { + OEMCrypto_SESSION session_id; + ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_OpenSession(&session_id)); + ASSERT_EQ(OEMCrypto_SUCCESS, + OEMCrypto_GetNumberOfOpenSessions(&sessions_count)); + ASSERT_EQ(i + 1, sessions_count); + sessions.push_back(session_id); } - for (int i = 0; i < s.size(); i++) { - s[i].close(); - ASSERT_EQ(OEMCrypto_SUCCESS, s[i].getStatus()); - ASSERT_FALSE(s[i].isOpen()); + for (int i = 0; i < sessions.size(); i++) { + ASSERT_EQ(OEMCrypto_SUCCESS, OEMCrypto_CloseSession(sessions[i])); + ASSERT_EQ(OEMCrypto_SUCCESS, + OEMCrypto_GetNumberOfOpenSessions(&sessions_count)); + ASSERT_EQ(sessions.size() - i - 1, sessions_count); } } -// TODO(kqyang): Add more tests exercising multiple sessions. TEST_F(OEMCryptoClientTest, GenerateNonce) { Session s;