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:
commit
dee5b24c6f
10 changed files with 117 additions and 62 deletions
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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,
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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__);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
||||
|
|
Loading…
Reference in a new issue