INSUFFICIENT_RESOURCE errors are mapped consistently. am: 6a247ab924

Original change: https://googleplex-android-review.googlesource.com/c/platform/vendor/widevine/+/11956161

Change-Id: I25a403be5994ceb29b15b6d6c53d8f02db2d3bd2
This commit is contained in:
Alex Dale
2020-06-25 02:06:54 +00:00
committed by Automerger Merge Worker
7 changed files with 44 additions and 69 deletions

View File

@@ -253,7 +253,7 @@ enum CdmResponseType {
INVALID_SESSION_1 = 199, INVALID_SESSION_1 = 199,
NO_DEVICE_KEY_1 = 200, NO_DEVICE_KEY_1 = 200,
NO_CONTENT_KEY_2 = 201, NO_CONTENT_KEY_2 = 201,
INSUFFICIENT_CRYPTO_RESOURCES_2 = 202, /* previously INSUFFICIENT_CRYPTO_RESOURCES_2 = 202, */
INVALID_PARAMETERS_ENG_13 = 203, INVALID_PARAMETERS_ENG_13 = 203,
INVALID_PARAMETERS_ENG_14 = 204, INVALID_PARAMETERS_ENG_14 = 204,
INVALID_PARAMETERS_ENG_15 = 205, INVALID_PARAMETERS_ENG_15 = 205,
@@ -272,7 +272,7 @@ enum CdmResponseType {
LOAD_USAGE_HEADER_UNKNOWN_ERROR = 218, LOAD_USAGE_HEADER_UNKNOWN_ERROR = 218,
/* previously INVALID_PARAMETERS_ENG_17 = 219, */ /* previously INVALID_PARAMETERS_ENG_17 = 219, */
/* preivously INVALID_PARAMETERS_ENG_18 = 220, */ /* preivously INVALID_PARAMETERS_ENG_18 = 220, */
INSUFFICIENT_CRYPTO_RESOURCES_3 = 221, /* previously INSUFFICIENT_CRYPTO_RESOURCES_3 = 221, */
CREATE_USAGE_ENTRY_UNKNOWN_ERROR = 222, CREATE_USAGE_ENTRY_UNKNOWN_ERROR = 222,
LOAD_USAGE_ENTRY_GENERATION_SKEW = 223, LOAD_USAGE_ENTRY_GENERATION_SKEW = 223,
LOAD_USAGE_ENTRY_SIGNATURE_FAILURE = 224, LOAD_USAGE_ENTRY_SIGNATURE_FAILURE = 224,
@@ -331,12 +331,12 @@ enum CdmResponseType {
/* previously LICENSE_REQUEST_INVALID_SUBLICENSE = 277, */ /* previously LICENSE_REQUEST_INVALID_SUBLICENSE = 277, */
CERT_PROVISIONING_EMPTY_SERVICE_CERTIFICATE = 278, CERT_PROVISIONING_EMPTY_SERVICE_CERTIFICATE = 278,
LOAD_SYSTEM_ID_ERROR = 279, LOAD_SYSTEM_ID_ERROR = 279,
INSUFFICIENT_CRYPTO_RESOURCES_4 = 280, /* previously INSUFFICIENT_CRYPTO_RESOURCES_4 = 280, */
INSUFFICIENT_CRYPTO_RESOURCES_5 = 281, /* previously INSUFFICIENT_CRYPTO_RESOURCES_5 = 281, */
REMOVE_USAGE_INFO_ERROR_1 = 282, REMOVE_USAGE_INFO_ERROR_1 = 282,
REMOVE_USAGE_INFO_ERROR_2 = 283, REMOVE_USAGE_INFO_ERROR_2 = 283,
REMOVE_USAGE_INFO_ERROR_3 = 284, REMOVE_USAGE_INFO_ERROR_3 = 284,
INSUFFICIENT_CRYPTO_RESOURCES_6 = 285, /* previously INSUFFICIENT_CRYPTO_RESOURCES_6 = 285, */
NOT_AN_ENTITLEMENT_SESSION = 286, NOT_AN_ENTITLEMENT_SESSION = 286,
NO_MATCHING_ENTITLEMENT_KEY = 287, NO_MATCHING_ENTITLEMENT_KEY = 287,
LOAD_ENTITLED_CONTENT_KEYS_ERROR = 288, LOAD_ENTITLED_CONTENT_KEYS_ERROR = 288,

View File

@@ -940,7 +940,7 @@ CdmResponseType CryptoSession::LoadKeys(
update_usage_table_after_close_session_ = true; update_usage_table_after_close_session_ = true;
return KEY_ADDED; return KEY_ADDED;
case OEMCrypto_ERROR_TOO_MANY_KEYS: case OEMCrypto_ERROR_TOO_MANY_KEYS:
return INSUFFICIENT_CRYPTO_RESOURCES_4; return INSUFFICIENT_CRYPTO_RESOURCES;
case OEMCrypto_ERROR_USAGE_TABLE_UNRECOVERABLE: case OEMCrypto_ERROR_USAGE_TABLE_UNRECOVERABLE:
// Handle vendor specific error // Handle vendor specific error
return NEED_PROVISIONING; return NEED_PROVISIONING;
@@ -980,7 +980,7 @@ CdmResponseType CryptoSession::LoadLicense(const std::string& signed_message,
return LOAD_LICENSE_ERROR; return LOAD_LICENSE_ERROR;
case OEMCrypto_ERROR_TOO_MANY_KEYS: case OEMCrypto_ERROR_TOO_MANY_KEYS:
LOGE("Too many keys in license"); LOGE("Too many keys in license");
return INSUFFICIENT_CRYPTO_RESOURCES_4; return INSUFFICIENT_CRYPTO_RESOURCES;
default: default:
break; break;
} }
@@ -1182,16 +1182,15 @@ CdmResponseType CryptoSession::PrepareAndSignProvisioningRequest(
CdmResponseType CryptoSession::LoadEntitledContentKeys( CdmResponseType CryptoSession::LoadEntitledContentKeys(
const std::vector<CryptoKey>& key_array) { const std::vector<CryptoKey>& key_array) {
OEMCryptoResult sts; const OEMCryptoResult sts = WithOecSessionLock(
WithOecSessionLock("LoadEntitledContentKeys", [&] { "LoadEntitledContentKeys",
sts = key_session_->LoadEntitledContentKeys(key_array); [&] { return key_session_->LoadEntitledContentKeys(key_array); });
});
switch (sts) { switch (sts) {
case OEMCrypto_SUCCESS: case OEMCrypto_SUCCESS:
return KEY_ADDED; return KEY_ADDED;
case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES: case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES:
return INSUFFICIENT_CRYPTO_RESOURCES_6; return INSUFFICIENT_CRYPTO_RESOURCES;
case OEMCrypto_ERROR_INVALID_CONTEXT: case OEMCrypto_ERROR_INVALID_CONTEXT:
return NOT_AN_ENTITLEMENT_SESSION; return NOT_AN_ENTITLEMENT_SESSION;
case OEMCrypto_KEY_NOT_ENTITLED: case OEMCrypto_KEY_NOT_ENTITLED:
@@ -1240,39 +1239,46 @@ CdmResponseType CryptoSession::LoadCertificatePrivateKey(
// Private. // Private.
CdmResponseType CryptoSession::SelectKey(const std::string& key_id, CdmResponseType CryptoSession::SelectKey(const std::string& key_id,
CdmCipherMode cipher_mode) { CdmCipherMode cipher_mode) {
OEMCryptoResult sts; const OEMCryptoResult sts = WithOecSessionLock("SelectKey", [&] {
WithOecSessionLock( return key_session_->SelectKey(key_id, cipher_mode);
"SelectKey", [&] { sts = key_session_->SelectKey(key_id, cipher_mode); }); });
switch (sts) { switch (sts) {
// SelectKey errors.
case OEMCrypto_SUCCESS: case OEMCrypto_SUCCESS:
return NO_ERROR; return NO_ERROR;
case OEMCrypto_ERROR_KEY_EXPIRED: case OEMCrypto_ERROR_KEY_EXPIRED:
return NEED_KEY; 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: case OEMCrypto_ERROR_INVALID_SESSION:
return INVALID_SESSION_1; return INVALID_SESSION_1;
case OEMCrypto_ERROR_NO_DEVICE_KEY: case OEMCrypto_ERROR_NO_DEVICE_KEY:
return NO_DEVICE_KEY_1; return NO_DEVICE_KEY_1;
case OEMCrypto_ERROR_NO_CONTENT_KEY: case OEMCrypto_ERROR_NO_CONTENT_KEY:
return NO_CONTENT_KEY_2; 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_CONTROL_INVALID:
case OEMCrypto_ERROR_KEYBOX_INVALID: case OEMCrypto_ERROR_KEYBOX_INVALID:
default:
return UNKNOWN_SELECT_KEY_ERROR_2; 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: case OEMCrypto_WARNING_MIXED_OUTPUT_PROTECTION:
return NO_ERROR; return NO_ERROR;
case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES: case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES:
return INSUFFICIENT_CRYPTO_RESOURCES_5; return INSUFFICIENT_CRYPTO_RESOURCES;
case OEMCrypto_ERROR_KEY_EXPIRED: case OEMCrypto_ERROR_KEY_EXPIRED:
return NEED_KEY; return NEED_KEY;
case OEMCrypto_ERROR_INVALID_SESSION: case OEMCrypto_ERROR_INVALID_SESSION:
@@ -2494,7 +2500,7 @@ CdmResponseType CryptoSession::CreateUsageEntry(uint32_t* entry_number) {
case OEMCrypto_SUCCESS: case OEMCrypto_SUCCESS:
return NO_ERROR; return NO_ERROR;
case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES: case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES:
return INSUFFICIENT_CRYPTO_RESOURCES_3; return INSUFFICIENT_CRYPTO_RESOURCES;
case OEMCrypto_ERROR_SESSION_LOST_STATE: case OEMCrypto_ERROR_SESSION_LOST_STATE:
return SESSION_LOST_STATE_ERROR; return SESSION_LOST_STATE_ERROR;
case OEMCrypto_ERROR_SYSTEM_INVALIDATED: case OEMCrypto_ERROR_SYSTEM_INVALIDATED:

View File

@@ -300,7 +300,7 @@ CdmResponseType UsageTableHeader::AddEntry(
CdmResponseType status = crypto_session->CreateUsageEntry(usage_entry_number); 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", LOGW("Usage table may be full, releasing oldest entry: size = %zu",
usage_entry_info_.size()); usage_entry_info_.size());
status = ReleaseOldestEntry(metrics); status = ReleaseOldestEntry(metrics);

View File

@@ -284,21 +284,6 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
case INSUFFICIENT_CRYPTO_RESOURCES: case INSUFFICIENT_CRYPTO_RESOURCES:
*os << "INSUFFICIENT_CRYPTO_RESOURCES"; *os << "INSUFFICIENT_CRYPTO_RESOURCES";
break; 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: case INSUFFICIENT_OUTPUT_PROTECTION:
*os << "INSUFFICIENT_OUTPUT_PROTECTION"; *os << "INSUFFICIENT_OUTPUT_PROTECTION";
break; break;

View File

@@ -904,10 +904,9 @@ TEST_F(UsageTableHeaderTest,
Return(NO_ERROR))); Return(NO_ERROR)));
EXPECT_CALL(*crypto_session_, CreateUsageEntry(NotNull())) EXPECT_CALL(*crypto_session_, CreateUsageEntry(NotNull()))
.WillOnce(Return(INSUFFICIENT_CRYPTO_RESOURCES_3)) .WillOnce(Return(INSUFFICIENT_CRYPTO_RESOURCES))
.WillOnce( .WillOnce(DoAll(SetArgPointee<0>(expected_usage_entry_number),
DoAll(SetArgPointee<0>(expected_usage_entry_number), Return(NO_ERROR)));
Return(NO_ERROR)));
EXPECT_CALL(*device_files_, StoreUsageTableInfo(kUsageTableHeader, _)) EXPECT_CALL(*device_files_, StoreUsageTableInfo(kUsageTableHeader, _))
.WillOnce(DoAll(SaveArg<1>(&final_usage_entries), Return(true))); .WillOnce(DoAll(SaveArg<1>(&final_usage_entries), Return(true)));
@@ -954,11 +953,11 @@ TEST_F(UsageTableHeaderTest, AddEntry_CreateUsageEntryFailsEveryTime) {
EXPECT_CALL(*crypto_session_, CreateUsageEntry(NotNull())) EXPECT_CALL(*crypto_session_, CreateUsageEntry(NotNull()))
.Times(2) .Times(2)
.WillRepeatedly(Return(INSUFFICIENT_CRYPTO_RESOURCES_3)); .WillRepeatedly(Return(INSUFFICIENT_CRYPTO_RESOURCES));
// Now invoke the method under test // Now invoke the method under test
uint32_t usage_entry_number; uint32_t usage_entry_number;
EXPECT_EQ(INSUFFICIENT_CRYPTO_RESOURCES_3, EXPECT_EQ(INSUFFICIENT_CRYPTO_RESOURCES,
mock_usage_table_header->AddEntry( mock_usage_table_header->AddEntry(
crypto_session_, true /* persistent */, crypto_session_, true /* persistent */,
kUsageEntryInfoOfflineLicense6.key_set_id, kUsageEntryInfoOfflineLicense6.key_set_id,

View File

@@ -212,16 +212,6 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) {
return kIncorrectUsageSupportType2; return kIncorrectUsageSupportType2;
case wvcdm::INIT_DATA_NOT_FOUND: case wvcdm::INIT_DATA_NOT_FOUND:
return kInitDataNotFound; 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: case wvcdm::INVALID_DECRYPT_HASH_FORMAT:
return kInvalidDecryptHashFormat; return kInvalidDecryptHashFormat;
case wvcdm::INVALID_DECRYPT_PARAMETERS_ENG_1: case wvcdm::INVALID_DECRYPT_PARAMETERS_ENG_1:

View File

@@ -225,7 +225,6 @@ static Status mapCdmResponseType(wvcdm::CdmResponseType res) {
case wvcdm::INVALID_SESSION_1: case wvcdm::INVALID_SESSION_1:
case wvcdm::NO_DEVICE_KEY_1: case wvcdm::NO_DEVICE_KEY_1:
case wvcdm::NO_CONTENT_KEY_2: case wvcdm::NO_CONTENT_KEY_2:
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_2:
case wvcdm::INVALID_PARAMETERS_ENG_13: case wvcdm::INVALID_PARAMETERS_ENG_13:
case wvcdm::INVALID_PARAMETERS_ENG_14: case wvcdm::INVALID_PARAMETERS_ENG_14:
case wvcdm::INVALID_PARAMETERS_ENG_15: 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_SIGNATURE_FAILURE:
case wvcdm::LOAD_USAGE_HEADER_BAD_MAGIC: case wvcdm::LOAD_USAGE_HEADER_BAD_MAGIC:
case wvcdm::LOAD_USAGE_HEADER_UNKNOWN_ERROR: 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::CREATE_USAGE_ENTRY_UNKNOWN_ERROR:
case wvcdm::LOAD_USAGE_ENTRY_GENERATION_SKEW: case wvcdm::LOAD_USAGE_ENTRY_GENERATION_SKEW:
case wvcdm::LOAD_USAGE_ENTRY_SIGNATURE_FAILURE: 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_1:
case wvcdm::REMOVE_USAGE_INFO_ERROR_2: case wvcdm::REMOVE_USAGE_INFO_ERROR_2:
case wvcdm::REMOVE_USAGE_INFO_ERROR_3: case wvcdm::REMOVE_USAGE_INFO_ERROR_3:
case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES_6:
case wvcdm::NOT_AN_ENTITLEMENT_SESSION: case wvcdm::NOT_AN_ENTITLEMENT_SESSION:
case wvcdm::LOAD_ENTITLED_CONTENT_KEYS_ERROR: case wvcdm::LOAD_ENTITLED_CONTENT_KEYS_ERROR:
case wvcdm::GET_PROVISIONING_METHOD_ERROR: case wvcdm::GET_PROVISIONING_METHOD_ERROR: