INSUFFICIENT_RESOURCE errors are mapped consistently.
[ Merge of http://go/wvgerrit/102109 ] The CDM was using unique CDM error codes for the various cases where OEMCrypto would return INSUFFICIENT_RESOURCE. However, these error codes were being incorrectly mapped at the Android level, resulting in incorrect errors in the MediaDRM layer. At no point does the CDM handle different INSUFFICIENT_RESOURCE_x within the same case, as such the use of unique codes are limited. This CL removes the unique codes, and unifies them under the same CDM error code. This CL also extends SelectKey to handle error codes returned by LoadEntitledContentKeys. Bug: 154682842 Test: Unit tests Change-Id: I319fabf6cac60b0dc19ea891609689daeeaeb435
This commit is contained in:
@@ -253,7 +253,7 @@ enum CdmResponseType {
|
||||
INVALID_SESSION_1 = 199,
|
||||
NO_DEVICE_KEY_1 = 200,
|
||||
NO_CONTENT_KEY_2 = 201,
|
||||
INSUFFICIENT_CRYPTO_RESOURCES_2 = 202,
|
||||
/* previously INSUFFICIENT_CRYPTO_RESOURCES_2 = 202, */
|
||||
INVALID_PARAMETERS_ENG_13 = 203,
|
||||
INVALID_PARAMETERS_ENG_14 = 204,
|
||||
INVALID_PARAMETERS_ENG_15 = 205,
|
||||
@@ -272,7 +272,7 @@ enum CdmResponseType {
|
||||
LOAD_USAGE_HEADER_UNKNOWN_ERROR = 218,
|
||||
/* previously INVALID_PARAMETERS_ENG_17 = 219, */
|
||||
/* preivously INVALID_PARAMETERS_ENG_18 = 220, */
|
||||
INSUFFICIENT_CRYPTO_RESOURCES_3 = 221,
|
||||
/* previously INSUFFICIENT_CRYPTO_RESOURCES_3 = 221, */
|
||||
CREATE_USAGE_ENTRY_UNKNOWN_ERROR = 222,
|
||||
LOAD_USAGE_ENTRY_GENERATION_SKEW = 223,
|
||||
LOAD_USAGE_ENTRY_SIGNATURE_FAILURE = 224,
|
||||
@@ -331,12 +331,12 @@ enum CdmResponseType {
|
||||
/* previously LICENSE_REQUEST_INVALID_SUBLICENSE = 277, */
|
||||
CERT_PROVISIONING_EMPTY_SERVICE_CERTIFICATE = 278,
|
||||
LOAD_SYSTEM_ID_ERROR = 279,
|
||||
INSUFFICIENT_CRYPTO_RESOURCES_4 = 280,
|
||||
INSUFFICIENT_CRYPTO_RESOURCES_5 = 281,
|
||||
/* previously INSUFFICIENT_CRYPTO_RESOURCES_4 = 280, */
|
||||
/* previously INSUFFICIENT_CRYPTO_RESOURCES_5 = 281, */
|
||||
REMOVE_USAGE_INFO_ERROR_1 = 282,
|
||||
REMOVE_USAGE_INFO_ERROR_2 = 283,
|
||||
REMOVE_USAGE_INFO_ERROR_3 = 284,
|
||||
INSUFFICIENT_CRYPTO_RESOURCES_6 = 285,
|
||||
/* previously INSUFFICIENT_CRYPTO_RESOURCES_6 = 285, */
|
||||
NOT_AN_ENTITLEMENT_SESSION = 286,
|
||||
NO_MATCHING_ENTITLEMENT_KEY = 287,
|
||||
LOAD_ENTITLED_CONTENT_KEYS_ERROR = 288,
|
||||
|
||||
@@ -940,7 +940,7 @@ CdmResponseType CryptoSession::LoadKeys(
|
||||
update_usage_table_after_close_session_ = true;
|
||||
return KEY_ADDED;
|
||||
case OEMCrypto_ERROR_TOO_MANY_KEYS:
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES_4;
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES;
|
||||
case OEMCrypto_ERROR_USAGE_TABLE_UNRECOVERABLE:
|
||||
// Handle vendor specific error
|
||||
return NEED_PROVISIONING;
|
||||
@@ -980,7 +980,7 @@ CdmResponseType CryptoSession::LoadLicense(const std::string& signed_message,
|
||||
return LOAD_LICENSE_ERROR;
|
||||
case OEMCrypto_ERROR_TOO_MANY_KEYS:
|
||||
LOGE("Too many keys in license");
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES_4;
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1182,16 +1182,15 @@ CdmResponseType CryptoSession::PrepareAndSignProvisioningRequest(
|
||||
|
||||
CdmResponseType CryptoSession::LoadEntitledContentKeys(
|
||||
const std::vector<CryptoKey>& key_array) {
|
||||
OEMCryptoResult sts;
|
||||
WithOecSessionLock("LoadEntitledContentKeys", [&] {
|
||||
sts = key_session_->LoadEntitledContentKeys(key_array);
|
||||
});
|
||||
const OEMCryptoResult sts = WithOecSessionLock(
|
||||
"LoadEntitledContentKeys",
|
||||
[&] { return key_session_->LoadEntitledContentKeys(key_array); });
|
||||
|
||||
switch (sts) {
|
||||
case OEMCrypto_SUCCESS:
|
||||
return KEY_ADDED;
|
||||
case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES:
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES_6;
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES;
|
||||
case OEMCrypto_ERROR_INVALID_CONTEXT:
|
||||
return NOT_AN_ENTITLEMENT_SESSION;
|
||||
case OEMCrypto_KEY_NOT_ENTITLED:
|
||||
@@ -1240,39 +1239,46 @@ CdmResponseType CryptoSession::LoadCertificatePrivateKey(
|
||||
// Private.
|
||||
CdmResponseType CryptoSession::SelectKey(const std::string& key_id,
|
||||
CdmCipherMode cipher_mode) {
|
||||
OEMCryptoResult sts;
|
||||
WithOecSessionLock(
|
||||
"SelectKey", [&] { sts = key_session_->SelectKey(key_id, cipher_mode); });
|
||||
const OEMCryptoResult sts = WithOecSessionLock("SelectKey", [&] {
|
||||
return key_session_->SelectKey(key_id, cipher_mode);
|
||||
});
|
||||
|
||||
switch (sts) {
|
||||
// SelectKey errors.
|
||||
case OEMCrypto_SUCCESS:
|
||||
return NO_ERROR;
|
||||
case OEMCrypto_ERROR_KEY_EXPIRED:
|
||||
return NEED_KEY;
|
||||
case OEMCrypto_ERROR_INSUFFICIENT_HDCP:
|
||||
return INSUFFICIENT_OUTPUT_PROTECTION;
|
||||
case OEMCrypto_ERROR_ANALOG_OUTPUT:
|
||||
return ANALOG_OUTPUT_ERROR;
|
||||
case OEMCrypto_ERROR_INVALID_SESSION:
|
||||
return INVALID_SESSION_1;
|
||||
case OEMCrypto_ERROR_NO_DEVICE_KEY:
|
||||
return NO_DEVICE_KEY_1;
|
||||
case OEMCrypto_ERROR_NO_CONTENT_KEY:
|
||||
return NO_CONTENT_KEY_2;
|
||||
case OEMCrypto_KEY_NOT_LOADED: // obsolete.
|
||||
return NO_CONTENT_KEY_3;
|
||||
case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES:
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES_2;
|
||||
case OEMCrypto_ERROR_UNKNOWN_FAILURE:
|
||||
return UNKNOWN_SELECT_KEY_ERROR_1;
|
||||
case OEMCrypto_ERROR_SESSION_LOST_STATE:
|
||||
return SESSION_LOST_STATE_ERROR;
|
||||
case OEMCrypto_ERROR_SYSTEM_INVALIDATED:
|
||||
return SYSTEM_INVALIDATED_ERROR;
|
||||
case OEMCrypto_ERROR_CONTROL_INVALID:
|
||||
case OEMCrypto_ERROR_KEYBOX_INVALID:
|
||||
default:
|
||||
return UNKNOWN_SELECT_KEY_ERROR_2;
|
||||
case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES:
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES;
|
||||
case OEMCrypto_ERROR_UNKNOWN_FAILURE:
|
||||
return UNKNOWN_SELECT_KEY_ERROR_1;
|
||||
case OEMCrypto_ERROR_ANALOG_OUTPUT:
|
||||
return ANALOG_OUTPUT_ERROR;
|
||||
case OEMCrypto_ERROR_INSUFFICIENT_HDCP:
|
||||
return INSUFFICIENT_OUTPUT_PROTECTION;
|
||||
// LoadEntitledContentKeys errors.
|
||||
// |key_session_| may make calls to OEMCrypto_LoadEntitledContentKeys
|
||||
// if the key selected has not yet been loaded.
|
||||
case OEMCrypto_ERROR_INVALID_CONTEXT:
|
||||
return NOT_AN_ENTITLEMENT_SESSION;
|
||||
case OEMCrypto_KEY_NOT_ENTITLED:
|
||||
return NO_MATCHING_ENTITLEMENT_KEY;
|
||||
// Obsolete errors.
|
||||
case OEMCrypto_KEY_NOT_LOADED:
|
||||
return NO_CONTENT_KEY_3;
|
||||
// Catch all else.
|
||||
default:
|
||||
return MapOEMCryptoResult(sts, UNKNOWN_SELECT_KEY_ERROR_2, "SelectKey");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1527,7 +1533,7 @@ CdmResponseType CryptoSession::Decrypt(
|
||||
case OEMCrypto_WARNING_MIXED_OUTPUT_PROTECTION:
|
||||
return NO_ERROR;
|
||||
case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES:
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES_5;
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES;
|
||||
case OEMCrypto_ERROR_KEY_EXPIRED:
|
||||
return NEED_KEY;
|
||||
case OEMCrypto_ERROR_INVALID_SESSION:
|
||||
@@ -2494,7 +2500,7 @@ CdmResponseType CryptoSession::CreateUsageEntry(uint32_t* entry_number) {
|
||||
case OEMCrypto_SUCCESS:
|
||||
return NO_ERROR;
|
||||
case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES:
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES_3;
|
||||
return INSUFFICIENT_CRYPTO_RESOURCES;
|
||||
case OEMCrypto_ERROR_SESSION_LOST_STATE:
|
||||
return SESSION_LOST_STATE_ERROR;
|
||||
case OEMCrypto_ERROR_SYSTEM_INVALIDATED:
|
||||
|
||||
@@ -300,7 +300,7 @@ CdmResponseType UsageTableHeader::AddEntry(
|
||||
|
||||
CdmResponseType status = crypto_session->CreateUsageEntry(usage_entry_number);
|
||||
|
||||
if (status == INSUFFICIENT_CRYPTO_RESOURCES_3) {
|
||||
if (status == INSUFFICIENT_CRYPTO_RESOURCES) {
|
||||
LOGW("Usage table may be full, releasing oldest entry: size = %zu",
|
||||
usage_entry_info_.size());
|
||||
status = ReleaseOldestEntry(metrics);
|
||||
|
||||
@@ -284,21 +284,6 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES:
|
||||
*os << "INSUFFICIENT_CRYPTO_RESOURCES";
|
||||
break;
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES_2:
|
||||
*os << "INSUFFICIENT_CRYPTO_RESOURCES_2";
|
||||
break;
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES_3:
|
||||
*os << "INSUFFICIENT_CRYPTO_RESOURCES_3";
|
||||
break;
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES_4:
|
||||
*os << "INSUFFICIENT_CRYPTO_RESOURCES_4";
|
||||
break;
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES_5:
|
||||
*os << "INSUFFICIENT_CRYPTO_RESOURCES_5";
|
||||
break;
|
||||
case INSUFFICIENT_CRYPTO_RESOURCES_6:
|
||||
*os << "INSUFFICIENT_CRYPTO_RESOURCES_6";
|
||||
break;
|
||||
case INSUFFICIENT_OUTPUT_PROTECTION:
|
||||
*os << "INSUFFICIENT_OUTPUT_PROTECTION";
|
||||
break;
|
||||
|
||||
@@ -904,9 +904,8 @@ TEST_F(UsageTableHeaderTest,
|
||||
Return(NO_ERROR)));
|
||||
|
||||
EXPECT_CALL(*crypto_session_, CreateUsageEntry(NotNull()))
|
||||
.WillOnce(Return(INSUFFICIENT_CRYPTO_RESOURCES_3))
|
||||
.WillOnce(
|
||||
DoAll(SetArgPointee<0>(expected_usage_entry_number),
|
||||
.WillOnce(Return(INSUFFICIENT_CRYPTO_RESOURCES))
|
||||
.WillOnce(DoAll(SetArgPointee<0>(expected_usage_entry_number),
|
||||
Return(NO_ERROR)));
|
||||
|
||||
EXPECT_CALL(*device_files_, StoreUsageTableInfo(kUsageTableHeader, _))
|
||||
@@ -954,11 +953,11 @@ TEST_F(UsageTableHeaderTest, AddEntry_CreateUsageEntryFailsEveryTime) {
|
||||
|
||||
EXPECT_CALL(*crypto_session_, CreateUsageEntry(NotNull()))
|
||||
.Times(2)
|
||||
.WillRepeatedly(Return(INSUFFICIENT_CRYPTO_RESOURCES_3));
|
||||
.WillRepeatedly(Return(INSUFFICIENT_CRYPTO_RESOURCES));
|
||||
|
||||
// Now invoke the method under test
|
||||
uint32_t usage_entry_number;
|
||||
EXPECT_EQ(INSUFFICIENT_CRYPTO_RESOURCES_3,
|
||||
EXPECT_EQ(INSUFFICIENT_CRYPTO_RESOURCES,
|
||||
mock_usage_table_header->AddEntry(
|
||||
crypto_session_, true /* persistent */,
|
||||
kUsageEntryInfoOfflineLicense6.key_set_id,
|
||||
|
||||
@@ -212,16 +212,6 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) {
|
||||
return kIncorrectUsageSupportType2;
|
||||
case wvcdm::INIT_DATA_NOT_FOUND:
|
||||
return kInitDataNotFound;
|
||||
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_2:
|
||||
return kInsufficientCryptoResources2;
|
||||
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_3:
|
||||
return kInsufficientCryptoResources3;
|
||||
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_4:
|
||||
return kInsufficientCryptoResources4;
|
||||
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_5:
|
||||
return kInsufficientCryptoResources5;
|
||||
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_6:
|
||||
return kInsufficientCryptoResources6;
|
||||
case wvcdm::INVALID_DECRYPT_HASH_FORMAT:
|
||||
return kInvalidDecryptHashFormat;
|
||||
case wvcdm::INVALID_DECRYPT_PARAMETERS_ENG_1:
|
||||
|
||||
@@ -225,7 +225,6 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) {
|
||||
case wvcdm::INVALID_SESSION_1:
|
||||
case wvcdm::NO_DEVICE_KEY_1:
|
||||
case wvcdm::NO_CONTENT_KEY_2:
|
||||
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_2:
|
||||
case wvcdm::INVALID_PARAMETERS_ENG_13:
|
||||
case wvcdm::INVALID_PARAMETERS_ENG_14:
|
||||
case wvcdm::INVALID_PARAMETERS_ENG_15:
|
||||
@@ -238,9 +237,6 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) {
|
||||
case wvcdm::LOAD_USAGE_HEADER_SIGNATURE_FAILURE:
|
||||
case wvcdm::LOAD_USAGE_HEADER_BAD_MAGIC:
|
||||
case wvcdm::LOAD_USAGE_HEADER_UNKNOWN_ERROR:
|
||||
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_3:
|
||||
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_4:
|
||||
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_5:
|
||||
case wvcdm::CREATE_USAGE_ENTRY_UNKNOWN_ERROR:
|
||||
case wvcdm::LOAD_USAGE_ENTRY_GENERATION_SKEW:
|
||||
case wvcdm::LOAD_USAGE_ENTRY_SIGNATURE_FAILURE:
|
||||
@@ -293,7 +289,6 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) {
|
||||
case wvcdm::REMOVE_USAGE_INFO_ERROR_1:
|
||||
case wvcdm::REMOVE_USAGE_INFO_ERROR_2:
|
||||
case wvcdm::REMOVE_USAGE_INFO_ERROR_3:
|
||||
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_6:
|
||||
case wvcdm::NOT_AN_ENTITLEMENT_SESSION:
|
||||
case wvcdm::LOAD_ENTITLED_CONTENT_KEYS_ERROR:
|
||||
case wvcdm::GET_PROVISIONING_METHOD_ERROR:
|
||||
|
||||
Reference in New Issue
Block a user