Correct CryptoException error returned before keys have been loaded

[ Merge of http://go/wvgerrit/25983 ]

Earlier versions of android returned CryptoException with
error code ERROR_NO_KEY, when a decrypt call was received before keys were
loaded. Changes to O resulted in ERROR_SESSION_NOT_OPENED being returned
instead. This CL reverts the behaviour.

Also a change to correct CDM error code numbering in comments.

Test: Verified by unit and integration tests

b/37219830

Change-Id: I43758cd29cf9d1945f878ac352a5f26538b48cdb
This commit is contained in:
Rahul Frias
2017-04-15 02:06:02 -07:00
parent 80798ae11c
commit 3d599197be
6 changed files with 40 additions and 31 deletions

View File

@@ -229,72 +229,74 @@ enum CdmResponseType {
INVALID_PARAMETERS_ENG_8, INVALID_PARAMETERS_ENG_8,
INVALID_PARAMETERS_ENG_9, INVALID_PARAMETERS_ENG_9,
INVALID_PARAMETERS_ENG_10, INVALID_PARAMETERS_ENG_10,
INVALID_PARAMETERS_ENG_11, /* 190 */ INVALID_PARAMETERS_ENG_11,
INVALID_PARAMETERS_ENG_12, INVALID_PARAMETERS_ENG_12, /* 190 */
SESSION_NOT_FOUND_13, SESSION_NOT_FOUND_13,
SESSION_NOT_FOUND_14, SESSION_NOT_FOUND_14,
SESSION_NOT_FOUND_15, SESSION_NOT_FOUND_15,
SESSION_NOT_FOUND_16, /* 195 */ SESSION_NOT_FOUND_16,
KEY_NOT_FOUND_3, KEY_NOT_FOUND_3, /* 195 */
KEY_NOT_FOUND_4, KEY_NOT_FOUND_4,
KEY_NOT_FOUND_5, KEY_NOT_FOUND_5,
KEY_NOT_FOUND_6, KEY_NOT_FOUND_6,
INVALID_SESSION_1, /* 200 */ INVALID_SESSION_1,
NO_DEVICE_KEY_1, NO_DEVICE_KEY_1, /* 200 */
NO_CONTENT_KEY_2, NO_CONTENT_KEY_2,
INSUFFICIENT_CRYPTO_RESOURCES_2, INSUFFICIENT_CRYPTO_RESOURCES_2,
INVALID_PARAMETERS_ENG_13, INVALID_PARAMETERS_ENG_13,
INVALID_PARAMETERS_ENG_14, /* 205 */ INVALID_PARAMETERS_ENG_14,
INVALID_PARAMETERS_ENG_15, INVALID_PARAMETERS_ENG_15, /* 205 */
INVALID_PARAMETERS_ENG_16, INVALID_PARAMETERS_ENG_16,
DEVICE_CERTIFICATE_ERROR_5, DEVICE_CERTIFICATE_ERROR_5,
CERT_PROVISIONING_CLIENT_TOKEN_ERROR_1, CERT_PROVISIONING_CLIENT_TOKEN_ERROR_1,
CERT_PROVISIONING_CLIENT_TOKEN_ERROR_2, /* 210 */ CERT_PROVISIONING_CLIENT_TOKEN_ERROR_2,
LICENSING_CLIENT_TOKEN_ERROR_1, LICENSING_CLIENT_TOKEN_ERROR_1, /* 210 */
ANALOG_OUTPUT_ERROR, ANALOG_OUTPUT_ERROR,
UNKNOWN_SELECT_KEY_ERROR_1, UNKNOWN_SELECT_KEY_ERROR_1,
UNKNOWN_SELECT_KEY_ERROR_2, UNKNOWN_SELECT_KEY_ERROR_2,
CREATE_USAGE_TABLE_ERROR, /* 215 */ CREATE_USAGE_TABLE_ERROR,
LOAD_USAGE_HEADER_GENERATION_SKEW, LOAD_USAGE_HEADER_GENERATION_SKEW, /* 215 */
LOAD_USAGE_HEADER_SIGNATURE_FAILURE, LOAD_USAGE_HEADER_SIGNATURE_FAILURE,
LOAD_USAGE_HEADER_BAD_MAGIC, LOAD_USAGE_HEADER_BAD_MAGIC,
LOAD_USAGE_HEADER_UNKNOWN_ERROR, LOAD_USAGE_HEADER_UNKNOWN_ERROR,
INVALID_PARAMETERS_ENG_17, /* 220 */ INVALID_PARAMETERS_ENG_17,
INVALID_PARAMETERS_ENG_18, INVALID_PARAMETERS_ENG_18, /* 220 */
INSUFFICIENT_CRYPTO_RESOURCES_3, INSUFFICIENT_CRYPTO_RESOURCES_3,
CREATE_USAGE_ENTRY_UNKNOWN_ERROR, CREATE_USAGE_ENTRY_UNKNOWN_ERROR,
LOAD_USAGE_ENTRY_GENERATION_SKEW, LOAD_USAGE_ENTRY_GENERATION_SKEW,
LOAD_USAGE_ENTRY_SIGNATURE_FAILURE, /* 225 */ LOAD_USAGE_ENTRY_SIGNATURE_FAILURE,
LOAD_USAGE_ENTRY_UNKNOWN_ERROR, LOAD_USAGE_ENTRY_UNKNOWN_ERROR, /* 225 */
INVALID_PARAMETERS_ENG_19, INVALID_PARAMETERS_ENG_19,
INVALID_PARAMETERS_ENG_20, INVALID_PARAMETERS_ENG_20,
UPDATE_USAGE_ENTRY_UNKNOWN_ERROR, UPDATE_USAGE_ENTRY_UNKNOWN_ERROR,
INVALID_PARAMETERS_ENG_21, /* 230 */ INVALID_PARAMETERS_ENG_21,
SHRINK_USAGE_TABLER_HEADER_UNKNOWN_ERROR, SHRINK_USAGE_TABLER_HEADER_UNKNOWN_ERROR, /* 230 */
MOVE_USAGE_ENTRY_UNKNOWN_ERROR, MOVE_USAGE_ENTRY_UNKNOWN_ERROR,
COPY_OLD_USAGE_ENTRY_UNKNOWN_ERROR, COPY_OLD_USAGE_ENTRY_UNKNOWN_ERROR,
INVALID_PARAMETERS_ENG_22, INVALID_PARAMETERS_ENG_22,
STORE_LICENSE_ERROR_4, /* 235 */ STORE_LICENSE_ERROR_4,
LIST_LICENSES_ERROR, LIST_LICENSES_ERROR, /* 235 */
INVALID_PARAMETERS_ENG_23, INVALID_PARAMETERS_ENG_23,
USAGE_INFORMATION_SUPPORT_FAILED, USAGE_INFORMATION_SUPPORT_FAILED,
USAGE_SUPPORT_GET_API_FAILED, USAGE_SUPPORT_GET_API_FAILED,
UNEXPECTED_EMPTY_USAGE_ENTRY, /* 240 */ UNEXPECTED_EMPTY_USAGE_ENTRY,
INVALID_USAGE_ENTRY_NUMBER_MODIFICATION, INVALID_USAGE_ENTRY_NUMBER_MODIFICATION, /* 240 */
USAGE_INVALID_NEW_ENTRY, USAGE_INVALID_NEW_ENTRY,
USAGE_INVALID_PARAMETERS_1, USAGE_INVALID_PARAMETERS_1,
USAGE_RETRIEVE_LICENSE_FAILED, USAGE_RETRIEVE_LICENSE_FAILED,
USAGE_RETRIEVE_USAGE_INFO_FAILED, /* 245 */ USAGE_RETRIEVE_USAGE_INFO_FAILED,
USAGE_RETRIEVE_INVALID_STORAGE_TYPE, USAGE_RETRIEVE_INVALID_STORAGE_TYPE, /* 245 */
USAGE_ENTRY_NUMBER_MISMATCH, USAGE_ENTRY_NUMBER_MISMATCH,
USAGE_STORE_LICENSE_FAILED, USAGE_STORE_LICENSE_FAILED,
USAGE_STORE_USAGE_INFO_FAILED, USAGE_STORE_USAGE_INFO_FAILED,
USAGE_INVALID_LOAD_ENTRY, /* 250 */ USAGE_INVALID_LOAD_ENTRY,
RELEASE_ALL_USAGE_INFO_ERROR_4, RELEASE_ALL_USAGE_INFO_ERROR_4, /* 250 */
RELEASE_ALL_USAGE_INFO_ERROR_5, RELEASE_ALL_USAGE_INFO_ERROR_5,
RELEASE_USAGE_INFO_FAILED, RELEASE_USAGE_INFO_FAILED,
INCORRECT_USAGE_SUPPORT_TYPE_1, INCORRECT_USAGE_SUPPORT_TYPE_1,
INCORRECT_USAGE_SUPPORT_TYPE_2, /* 255 */ INCORRECT_USAGE_SUPPORT_TYPE_2,
KEY_PROHIBITED_FOR_SECURITY_LEVEL, /* 255 */
KEY_NOT_FOUND_IN_SESSION,
}; };
enum CdmKeyStatus { enum CdmKeyStatus {

View File

@@ -568,6 +568,12 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) {
case INCORRECT_USAGE_SUPPORT_TYPE_2: case INCORRECT_USAGE_SUPPORT_TYPE_2:
*os << "INCORRECT_USAGE_SUPPORT_TYPE_2"; *os << "INCORRECT_USAGE_SUPPORT_TYPE_2";
break; break;
case KEY_PROHIBITED_FOR_SECURITY_LEVEL:
*os << "KEY_PROHIBITED_FOR_SECURITY_LEVEL";
break;
case KEY_NOT_FOUND_IN_SESSION:
*os << "KEY_NOT_FOUND_IN_SESSION";
break;
default: default:
*os << "Unknown CdmResponseType"; *os << "Unknown CdmResponseType";

View File

@@ -379,10 +379,7 @@ CdmResponseType WvContentDecryptionModule::Decrypt(
cdm_engine->GetMetrics(), cdm_engine->GetMetrics(),
cdm_engine_find_session_for_key_, cdm_engine_find_session_for_key_,
status); status);
if (!status) { if (!status) return KEY_NOT_FOUND_IN_SESSION;
LOGE("WvContentDecryptionModule::Decrypt: unable to find session");
return SESSION_NOT_FOUND_FOR_DECRYPT;
}
} }
CdmResponseType sts; CdmResponseType sts;
M_TIME( M_TIME(

View File

@@ -23,6 +23,7 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) {
return android::OK; return android::OK;
case wvcdm::NEED_KEY: case wvcdm::NEED_KEY:
case wvcdm::DECRYPT_NOT_READY: case wvcdm::DECRYPT_NOT_READY:
case wvcdm::KEY_NOT_FOUND_IN_SESSION:
return android::ERROR_DRM_NO_LICENSE; return android::ERROR_DRM_NO_LICENSE;
case wvcdm::NEED_PROVISIONING: case wvcdm::NEED_PROVISIONING:
return android::ERROR_DRM_NOT_PROVISIONED; return android::ERROR_DRM_NOT_PROVISIONED;
@@ -368,6 +369,7 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) {
return android::ERROR_DRM_CANNOT_HANDLE; return android::ERROR_DRM_CANNOT_HANDLE;
case wvcdm::INSUFFICIENT_OUTPUT_PROTECTION: case wvcdm::INSUFFICIENT_OUTPUT_PROTECTION:
case wvcdm::ANALOG_OUTPUT_ERROR: case wvcdm::ANALOG_OUTPUT_ERROR:
case wvcdm::KEY_PROHIBITED_FOR_SECURITY_LEVEL:
return android::ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION; return android::ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION;
case wvcdm::SESSION_NOT_FOUND_12: case wvcdm::SESSION_NOT_FOUND_12:
return kSessionNotFound12; return kSessionNotFound12;

View File

@@ -306,6 +306,7 @@ status_t WVCryptoPlugin::attemptDecrypt(const CdmDecryptionParameters& params,
"Error decrypting data: insufficient crypto resources"); "Error decrypting data: insufficient crypto resources");
break; break;
case wvcdm::NEED_KEY: case wvcdm::NEED_KEY:
case wvcdm::KEY_NOT_FOUND_IN_SESSION:
errorDetailMsg->setTo( errorDetailMsg->setTo(
"Error decrypting data: requested key has not been loaded"); "Error decrypting data: requested key has not been loaded");
break; break;

View File

@@ -338,6 +338,7 @@ status_t WVCryptoPlugin::attemptDecrypt(const CdmDecryptionParameters& params,
"Error decrypting data: insufficient crypto resources"); "Error decrypting data: insufficient crypto resources");
break; break;
case wvcdm::NEED_KEY: case wvcdm::NEED_KEY:
case wvcdm::KEY_NOT_FOUND_IN_SESSION:
errorDetailMsg->assign( errorDetailMsg->assign(
"Error decrypting data: requested key has not been loaded"); "Error decrypting data: requested key has not been loaded");
break; break;