Merge changes from topic "CAS AIDL Integration" am: 277701b5ec

Original change: https://android-review.googlesource.com/c/platform/hardware/interfaces/+/2412039

Change-Id: I271d4f65f44c6338e15c5ca57c447714d88cb7ca
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Yixiao Luo 2023-02-06 19:06:17 +00:00 committed by Automerger Merge Worker
commit dee5b24c6f
10 changed files with 117 additions and 62 deletions

View file

@ -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);

View file

@ -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,
}

View file

@ -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,
}

View file

@ -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;
}

View file

@ -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,
}

View file

@ -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.

View file

@ -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;
}

View file

@ -128,6 +128,19 @@ ScopedAStatus CasImpl::setPrivateData(const vector<uint8_t>& pvtData) {
return toStatus(holder->setPrivateData(pvtData));
}
ScopedAStatus CasImpl::openSessionDefault(vector<uint8_t>* sessionId) {
ALOGV("%s", __FUNCTION__);
shared_ptr<CasPlugin> 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<uint8_t>* sessionId) {
ALOGV("%s", __FUNCTION__);

View file

@ -53,6 +53,8 @@ class CasImpl : public BnCas {
virtual ScopedAStatus setPrivateData(const vector<uint8_t>& pvtData) override;
virtual ScopedAStatus openSessionDefault(vector<uint8_t>* sessionId) override;
virtual ScopedAStatus openSession(SessionIntent intent, ScramblingMode mode,
vector<uint8_t>* sessionId) override;

View file

@ -286,6 +286,7 @@ class MediaCasAidlTest : public testing::TestWithParam<string> {
} OobInputTestParams;
AssertionResult createCasPlugin(int32_t caSystemId);
AssertionResult openCasSessionDefault(vector<uint8_t>* sessionId);
AssertionResult openCasSession(vector<uint8_t>* sessionId, SessionIntent intent,
ScramblingMode mode);
AssertionResult descrambleTestInputBuffer(const shared_ptr<IDescrambler>& descrambler,
@ -331,6 +332,10 @@ AssertionResult MediaCasAidlTest::createCasPlugin(int32_t caSystemId) {
return AssertionResult(mDescrambler != nullptr);
}
AssertionResult MediaCasAidlTest::openCasSessionDefault(vector<uint8_t>* sessionId) {
return AssertionResult(mMediaCas->openSessionDefault(sessionId).isOk());
}
AssertionResult MediaCasAidlTest::openCasSession(vector<uint8_t>* 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<uint8_t> sessionId;
ASSERT_TRUE(openCasSessionDefault(&sessionId));
vector<uint8_t> 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");