From 9bd3427c7d5703d6faec8d1c1643532c16933c76 Mon Sep 17 00:00:00 2001 From: Venkatarama Avadhani Date: Mon, 30 Jan 2023 11:20:06 +0530 Subject: [PATCH 1/2] CAS: Add openSession with no params Add method to open a session with no arguments. Bug: 266169861 Test: atest CtsMediaMiscTestCases Change-Id: I912de02407716c9a5bcd28dabfa8eb8f45aef727 --- .../current/android/hardware/cas/ICas.aidl | 1 + cas/aidl/android/hardware/cas/ICas.aidl | 8 +++++ cas/aidl/default/CasImpl.cpp | 13 ++++++++ cas/aidl/default/CasImpl.h | 2 ++ .../functional/VtsHalCasAidlTargetTest.cpp | 31 +++++++++++++++++++ 5 files changed, 55 insertions(+) diff --git a/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/ICas.aidl b/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/ICas.aidl index 28c9eb0213..903ab924ca 100644 --- a/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/ICas.aidl +++ b/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/ICas.aidl @@ -36,6 +36,7 @@ package android.hardware.cas; @VintfStability interface ICas { void closeSession(in byte[] sessionId); + byte[] openSessionDefault(); byte[] openSession(in android.hardware.cas.SessionIntent intent, in android.hardware.cas.ScramblingMode mode); void processEcm(in byte[] sessionId, in byte[] ecm); void processEmm(in byte[] emm); diff --git a/cas/aidl/android/hardware/cas/ICas.aidl b/cas/aidl/android/hardware/cas/ICas.aidl index e6494ae747..272cb1052e 100644 --- a/cas/aidl/android/hardware/cas/ICas.aidl +++ b/cas/aidl/android/hardware/cas/ICas.aidl @@ -34,6 +34,14 @@ interface ICas { */ void closeSession(in byte[] sessionId); + /** + * Open a session to descramble one or more streams without specifying intention + * and scrambling mode. + * + * @return sessionId The id of the newly opened session. + */ + byte[] openSessionDefault(); + /** * Open a session to descramble one or more streams by specifying intention * and scrambling mode. diff --git a/cas/aidl/default/CasImpl.cpp b/cas/aidl/default/CasImpl.cpp index 2d31b352bb..f08fcc0f6d 100755 --- a/cas/aidl/default/CasImpl.cpp +++ b/cas/aidl/default/CasImpl.cpp @@ -128,6 +128,19 @@ ScopedAStatus CasImpl::setPrivateData(const vector& pvtData) { return toStatus(holder->setPrivateData(pvtData)); } +ScopedAStatus CasImpl::openSessionDefault(vector* sessionId) { + ALOGV("%s", __FUNCTION__); + + shared_ptr holder = atomic_load(&mPluginHolder); + status_t err = INVALID_OPERATION; + if (holder.get() != nullptr) { + err = holder->openSession(sessionId); + holder.reset(); + } + + return toStatus(err); +} + ScopedAStatus CasImpl::openSession(SessionIntent intent, ScramblingMode mode, vector* sessionId) { ALOGV("%s", __FUNCTION__); diff --git a/cas/aidl/default/CasImpl.h b/cas/aidl/default/CasImpl.h index 84a8115c2f..2488a7fa24 100755 --- a/cas/aidl/default/CasImpl.h +++ b/cas/aidl/default/CasImpl.h @@ -53,6 +53,8 @@ class CasImpl : public BnCas { virtual ScopedAStatus setPrivateData(const vector& pvtData) override; + virtual ScopedAStatus openSessionDefault(vector* sessionId) override; + virtual ScopedAStatus openSession(SessionIntent intent, ScramblingMode mode, vector* sessionId) override; diff --git a/cas/aidl/vts/functional/VtsHalCasAidlTargetTest.cpp b/cas/aidl/vts/functional/VtsHalCasAidlTargetTest.cpp index 266b55d1a1..4c904a8192 100644 --- a/cas/aidl/vts/functional/VtsHalCasAidlTargetTest.cpp +++ b/cas/aidl/vts/functional/VtsHalCasAidlTargetTest.cpp @@ -286,6 +286,7 @@ class MediaCasAidlTest : public testing::TestWithParam { } OobInputTestParams; AssertionResult createCasPlugin(int32_t caSystemId); + AssertionResult openCasSessionDefault(vector* sessionId); AssertionResult openCasSession(vector* sessionId, SessionIntent intent, ScramblingMode mode); AssertionResult descrambleTestInputBuffer(const shared_ptr& descrambler, @@ -331,6 +332,10 @@ AssertionResult MediaCasAidlTest::createCasPlugin(int32_t caSystemId) { return AssertionResult(mDescrambler != nullptr); } +AssertionResult MediaCasAidlTest::openCasSessionDefault(vector* sessionId) { + return AssertionResult(mMediaCas->openSessionDefault(sessionId).isOk()); +} + AssertionResult MediaCasAidlTest::openCasSession(vector* sessionId, SessionIntent intent, ScramblingMode mode) { return AssertionResult(mMediaCas->openSession(intent, mode, sessionId).isOk()); @@ -485,6 +490,32 @@ TEST_P(MediaCasAidlTest, TestClearKeyPluginInstalled) { ADD_FAILURE() << "ClearKey plugin not installed"; } +TEST_P(MediaCasAidlTest, TestClearKeyDefaultSessionClosedAfterRelease) { + description("Test that all sessions are closed after a MediaCas object is released"); + + ASSERT_TRUE(createCasPlugin(CLEAR_KEY_SYSTEM_ID)); + + EXPECT_TRUE(mMediaCas->provision(PROVISION_STR).isOk()); + + vector sessionId; + ASSERT_TRUE(openCasSessionDefault(&sessionId)); + + vector streamSessionId; + ASSERT_TRUE(openCasSessionDefault(&streamSessionId)); + + EXPECT_TRUE(mMediaCas->release().isOk()); + + if (mDescrambler != nullptr) { + auto status = mDescrambler->setMediaCasSession(sessionId); + EXPECT_FALSE(status.isOk()); + EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, status.getServiceSpecificError()); + + status = mDescrambler->setMediaCasSession(streamSessionId); + EXPECT_FALSE(status.isOk()); + EXPECT_EQ(Status::ERROR_CAS_SESSION_NOT_OPENED, status.getServiceSpecificError()); + } +} + TEST_P(MediaCasAidlTest, TestClearKeySessionClosedAfterRelease) { description("Test that all sessions are closed after a MediaCas object is released"); From 21222d705a52086dab61b6d4adb42ecdddc7232d Mon Sep 17 00:00:00 2001 From: Venkatarama Avadhani Date: Tue, 31 Jan 2023 20:44:37 +0530 Subject: [PATCH 2/2] CAS: Correct Status enum values Bug: 266169861 Test: atest CtsMediaMiscTestCases Change-Id: I4acda6a416cb72972e3fde0879d13254acb04fe0 --- .../android/hardware/cas/ScramblingMode.aidl | 28 ++++++------- .../android/hardware/cas/SessionIntent.aidl | 8 ++-- .../current/android/hardware/cas/Status.aidl | 42 +++++++++---------- .../android/hardware/cas/StatusEvent.aidl | 4 +- cas/aidl/android/hardware/cas/Status.aidl | 42 +++++++++---------- 5 files changed, 62 insertions(+), 62 deletions(-) diff --git a/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/ScramblingMode.aidl b/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/ScramblingMode.aidl index a0b08c93f1..9d542cc63e 100644 --- a/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/ScramblingMode.aidl +++ b/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/ScramblingMode.aidl @@ -36,18 +36,18 @@ package android.hardware.cas; @Backing(type="int") @VintfStability enum ScramblingMode { RESERVED = 0, - DVB_CSA1 = 1, - DVB_CSA2 = 2, - DVB_CSA3_STANDARD = 3, - DVB_CSA3_MINIMAL = 4, - DVB_CSA3_ENHANCE = 5, - DVB_CISSA_V1 = 6, - DVB_IDSA = 7, - MULTI2 = 8, - AES128 = 9, - AES_ECB = 10, - AES_SCTE52 = 11, - TDES_ECB = 12, - TDES_SCTE52 = 13, - AES_CBC = 14, + DVB_CSA1, + DVB_CSA2, + DVB_CSA3_STANDARD, + DVB_CSA3_MINIMAL, + DVB_CSA3_ENHANCE, + DVB_CISSA_V1, + DVB_IDSA, + MULTI2, + AES128, + AES_ECB, + AES_SCTE52, + TDES_ECB, + TDES_SCTE52, + AES_CBC, } diff --git a/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/SessionIntent.aidl b/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/SessionIntent.aidl index ade3001c27..00a2fd778c 100644 --- a/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/SessionIntent.aidl +++ b/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/SessionIntent.aidl @@ -35,8 +35,8 @@ package android.hardware.cas; /* @hide */ @Backing(type="int") @VintfStability enum SessionIntent { - LIVE = 0, - PLAYBACK = 1, - RECORD = 2, - TIMESHIFT = 3, + LIVE, + PLAYBACK, + RECORD, + TIMESHIFT, } diff --git a/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/Status.aidl b/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/Status.aidl index 343c810ed6..3691009d5d 100644 --- a/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/Status.aidl +++ b/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/Status.aidl @@ -36,25 +36,25 @@ package android.hardware.cas; @VintfStability parcelable Status { const int OK = 0; - const int ERROR_CAS_NO_LICENSE = -1; - const int ERROR_CAS_LICENSE_EXPIRED = -2; - const int ERROR_CAS_SESSION_NOT_OPENED = -3; - const int ERROR_CAS_CANNOT_HANDLE = -4; - const int ERROR_CAS_INVALID_STATE = -5; - const int BAD_VALUE = -6; - const int ERROR_CAS_NOT_PROVISIONED = -7; - const int ERROR_CAS_RESOURCE_BUSY = -8; - const int ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION = -9; - const int ERROR_CAS_TAMPER_DETECTED = -10; - const int ERROR_CAS_DEVICE_REVOKED = -11; - const int ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED = -12; - const int ERROR_CAS_DECRYPT = -13; - const int ERROR_CAS_UNKNOWN = -14; - const int ERROR_CAS_NEED_ACTIVATION = -15; - const int ERROR_CAS_NEED_PAIRING = -16; - const int ERROR_CAS_NO_CARD = -17; - const int ERROR_CAS_CARD_MUTE = -18; - const int ERROR_CAS_CARD_INVALID = -19; - const int ERROR_CAS_BLACKOUT = -20; - const int ERROR_CAS_REBOOTING = -21; + const int ERROR_CAS_NO_LICENSE = 1; + const int ERROR_CAS_LICENSE_EXPIRED = 2; + const int ERROR_CAS_SESSION_NOT_OPENED = 3; + const int ERROR_CAS_CANNOT_HANDLE = 4; + const int ERROR_CAS_INVALID_STATE = 5; + const int BAD_VALUE = 6; + const int ERROR_CAS_NOT_PROVISIONED = 7; + const int ERROR_CAS_RESOURCE_BUSY = 8; + const int ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION = 9; + const int ERROR_CAS_TAMPER_DETECTED = 10; + const int ERROR_CAS_DEVICE_REVOKED = 11; + const int ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED = 12; + const int ERROR_CAS_DECRYPT = 13; + const int ERROR_CAS_UNKNOWN = 14; + const int ERROR_CAS_NEED_ACTIVATION = 15; + const int ERROR_CAS_NEED_PAIRING = 16; + const int ERROR_CAS_NO_CARD = 17; + const int ERROR_CAS_CARD_MUTE = 18; + const int ERROR_CAS_CARD_INVALID = 19; + const int ERROR_CAS_BLACKOUT = 20; + const int ERROR_CAS_REBOOTING = 21; } diff --git a/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/StatusEvent.aidl b/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/StatusEvent.aidl index 165c0d4769..0cf37ddfda 100644 --- a/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/StatusEvent.aidl +++ b/cas/aidl/aidl_api/android.hardware.cas/current/android/hardware/cas/StatusEvent.aidl @@ -35,6 +35,6 @@ package android.hardware.cas; /* @hide */ @Backing(type="byte") @VintfStability enum StatusEvent { - PLUGIN_PHYSICAL_MODULE_CHANGED = 0, - PLUGIN_SESSION_NUMBER_CHANGED = 1, + PLUGIN_PHYSICAL_MODULE_CHANGED, + PLUGIN_SESSION_NUMBER_CHANGED, } diff --git a/cas/aidl/android/hardware/cas/Status.aidl b/cas/aidl/android/hardware/cas/Status.aidl index e7ae8ffe27..ba0bd65c2e 100644 --- a/cas/aidl/android/hardware/cas/Status.aidl +++ b/cas/aidl/android/hardware/cas/Status.aidl @@ -31,50 +31,50 @@ parcelable Status { * The CAS plugin must return ERROR_CAS_NO_LICENSE, when descrambling is * attempted and no license keys have been provided. */ - const int ERROR_CAS_NO_LICENSE = -1; + const int ERROR_CAS_NO_LICENSE = 1; /** * ERROR_CAS_LICENSE_EXPIRED must be returned when an attempt is made * to use a license and the keys in that license have expired. */ - const int ERROR_CAS_LICENSE_EXPIRED = -2; + const int ERROR_CAS_LICENSE_EXPIRED = 2; /** * The CAS plugin must return ERROR_CAS_SESSION_NOT_OPENED when an * attempt is made to use a session that has not been opened. */ - const int ERROR_CAS_SESSION_NOT_OPENED = -3; + const int ERROR_CAS_SESSION_NOT_OPENED = 3; /** * The CAS plugin must return ERROR_CAS_CANNOT_HANDLE when an unsupported * data format or operation is attempted. */ - const int ERROR_CAS_CANNOT_HANDLE = -4; + const int ERROR_CAS_CANNOT_HANDLE = 4; /** * ERROR_CAS_INVALID_STATE must be returned when the device is in a state * where it is not able to perform descrambling. */ - const int ERROR_CAS_INVALID_STATE = -5; + const int ERROR_CAS_INVALID_STATE = 5; /** * The CAS plugin must return BAD_VALUE whenever an illegal parameter is * passed to one of the interface functions. */ - const int BAD_VALUE = -6; + const int BAD_VALUE = 6; /** * The CAS plugin must return ERROR_CAS_NOT_PROVISIONED when the device * has not yet been provisioned. */ - const int ERROR_CAS_NOT_PROVISIONED = -7; + const int ERROR_CAS_NOT_PROVISIONED = 7; /** * ERROR_CAS_RESOURCE_BUSY must be returned when resources, such as CAS * sessions or secure buffers are not available to perform a requested * operation because they are already in use. */ - const int ERROR_CAS_RESOURCE_BUSY = -8; + const int ERROR_CAS_RESOURCE_BUSY = 8; /** * The CAS Plugin must return ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION @@ -82,72 +82,72 @@ parcelable Status { * sufficient to meet the requirements in the license policy. HDCP is an * example of a form of output protection. */ - const int ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION = -9; + const int ERROR_CAS_INSUFFICIENT_OUTPUT_PROTECTION = 9; /** * The CAS Plugin must return ERROR_CAS_TAMPER_DETECTED if an attempt to * tamper with the CAS system is detected. */ - const int ERROR_CAS_TAMPER_DETECTED = -10; + const int ERROR_CAS_TAMPER_DETECTED = 10; /** * The CAS Plugin must return ERROR_CAS_DEVICE_REVOKED if the response * indicates that the device has been revoked. Device revocation means * that the device is no longer permitted to play content. */ - const int ERROR_CAS_DEVICE_REVOKED = -11; + const int ERROR_CAS_DEVICE_REVOKED = 11; /** * The CAS plugin must return ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED when * descrambling is failing because the session is not initialized properly. */ - const int ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED = -12; + const int ERROR_CAS_DECRYPT_UNIT_NOT_INITIALIZED = 12; /** * The CAS Plugin must return ERROR_CAS_DECRYPT if the DescramblerPlugin's * descramble operation fails. */ - const int ERROR_CAS_DECRYPT = -13; + const int ERROR_CAS_DECRYPT = 13; /** * ERROR_CAS_UNKNOWN must be returned when a fatal failure occurs and no * other defined error is appropriate. */ - const int ERROR_CAS_UNKNOWN = -14; + const int ERROR_CAS_UNKNOWN = 14; /** * ERROR_CAS_NEED_ACTIVATION is used to trigger device activation process. */ - const int ERROR_CAS_NEED_ACTIVATION = -15; + const int ERROR_CAS_NEED_ACTIVATION = 15; /** * ERROR_CAS_NEED_PAIRING is used to trigger pairing process. */ - const int ERROR_CAS_NEED_PAIRING = -16; + const int ERROR_CAS_NEED_PAIRING = 16; /** * ERROR_CAS_NO_CARD is used to report no smart card for descrambling. */ - const int ERROR_CAS_NO_CARD = -17; + const int ERROR_CAS_NO_CARD = 17; /** * ERROR_CAS_CARD_MUTE is used to report smart card is muted for * descrambling. */ - const int ERROR_CAS_CARD_MUTE = -18; + const int ERROR_CAS_CARD_MUTE = 18; /** * ERROR_CAS_CARD_INVALID is used to report smart card isn't valid. */ - const int ERROR_CAS_CARD_INVALID = -19; + const int ERROR_CAS_CARD_INVALID = 19; /** * ERROR_CAS_BLACKOUT is used to report geographical blackout. */ - const int ERROR_CAS_BLACKOUT = -20; + const int ERROR_CAS_BLACKOUT = 20; /** * ERROR_CAS_REBOOTING is used to report CAS is during rebooting. */ - const int ERROR_CAS_REBOOTING = -21; + const int ERROR_CAS_REBOOTING = 21; }