diff --git a/libwvdrmengine/include_hidl/mapErrors-inl.h b/libwvdrmengine/include_hidl/mapErrors-inl.h index 90057c2b..fc7b2cf1 100644 --- a/libwvdrmengine/include_hidl/mapErrors-inl.h +++ b/libwvdrmengine/include_hidl/mapErrors-inl.h @@ -15,7 +15,7 @@ namespace wvdrm { -static Status mapCdmResponseType(wvcdm::CdmResponseType res) { +static Status mapCdmResponseType_1_0(wvcdm::CdmResponseType res) { switch (res) { case wvcdm::KEY_ADDED: case wvcdm::KEY_MESSAGE: @@ -387,10 +387,319 @@ static Status_V1_2 mapCdmResponseType_1_2( return Status_V1_2::ERROR_DRM_RESOURCE_CONTENTION; default: - return static_cast(mapCdmResponseType(res)); + return static_cast(mapCdmResponseType_1_0(res)); } } +template +static S mapCdmResponseType(wvcdm::CdmResponseType res) { + ::drm::V1_4::Status err = ::drm::V1_4::Status::ERROR_DRM_UNKNOWN; + switch(res) { + case wvcdm::CANNOT_DECRYPT_ZERO_SUBSAMPLES: + err = ::drm::V1_4::Status::CANNOT_DECRYPT_ZERO_SUBSAMPLES; + break; + case wvcdm::CLIENT_ID_AES_ENCRYPT_ERROR: + case wvcdm::CLIENT_ID_AES_INIT_ERROR: + case wvcdm::CLIENT_ID_RSA_ENCRYPT_ERROR: + err = ::drm::V1_4::Status::CRYPTO_LIBRARY_ERROR; + break; + case wvcdm::PROVISIONING_NOT_ALLOWED_FOR_ATSC: + err = ::drm::V1_4::Status::ERROR_DRM_CANNOT_HANDLE; + break; + case wvcdm::CERT_PROVISIONING_REQUEST_ERROR_4: + case wvcdm::CLIENT_IDENTIFICATION_TOKEN_ERROR_1: + case wvcdm::CREATE_USAGE_ENTRY_UNKNOWN_ERROR: + case wvcdm::CREATE_USAGE_TABLE_ERROR: + case wvcdm::DEACTIVATE_USAGE_ENTRY_ERROR: + case wvcdm::EMPTY_LICENSE_RENEWAL: + case wvcdm::EMPTY_LICENSE_REQUEST: + case wvcdm::EXTRACT_SYSTEM_ID_FROM_OEM_CERT_ERROR: + case wvcdm::GENERATE_DERIVED_KEYS_ERROR: + case wvcdm::GENERATE_DERIVED_KEYS_ERROR_2: + case wvcdm::GENERATE_SIGNATURE_ERROR: + case wvcdm::GENERATE_USAGE_REPORT_ERROR: + case wvcdm::GET_DECRYPT_HASH_ERROR: + case wvcdm::GET_DEVICE_ID_ERROR: + case wvcdm::GET_HDCP_CAPABILITY_FAILED: + case wvcdm::GET_MAX_NUMBER_OF_OPEN_SESSIONS_ERROR: + case wvcdm::GET_NUMBER_OF_OPEN_SESSIONS_ERROR: + case wvcdm::GET_PROVISIONING_METHOD_ERROR: + case wvcdm::GET_SRM_VERSION_ERROR: + case wvcdm::GET_TOKEN_FROM_KEYBOX_ERROR: + case wvcdm::GET_TOKEN_FROM_OEM_CERT_ERROR: + case wvcdm::INVALID_DECRYPT_HASH_FORMAT: + case wvcdm::INVALID_SESSION_1: + case wvcdm::INVALID_SESSION_2: + case wvcdm::KEYBOX_TOKEN_TOO_SHORT: + case wvcdm::LOAD_USAGE_ENTRY_UNKNOWN_ERROR: + case wvcdm::LOAD_USAGE_HEADER_UNKNOWN_ERROR: + case wvcdm::MOVE_USAGE_ENTRY_UNKNOWN_ERROR: + case wvcdm::OPEN_CRYPTO_SESSION_ERROR: + case wvcdm::RANDOM_GENERATION_ERROR: + case wvcdm::SET_DECRYPT_HASH_ERROR: + case wvcdm::SHRINK_USAGE_TABLE_HEADER_UNKNOWN_ERROR: + case wvcdm::UNKNOWN_CLIENT_TOKEN_TYPE: + case wvcdm::UNKNOWN_SELECT_KEY_ERROR_1: + case wvcdm::UNKNOWN_SELECT_KEY_ERROR_2: + case wvcdm::UPDATE_USAGE_ENTRY_UNKNOWN_ERROR: + case wvcdm::USAGE_SUPPORT_GET_API_FAILED: + err = ::drm::V1_4::Status::GENERAL_OEM_ERROR; + break; + case wvcdm::CANNOT_DECRYPT_ZERO_SAMPLES: + case wvcdm::CERT_PROVISIONING_REQUEST_ERROR_1: + case wvcdm::CRYPTO_SESSION_NOT_INITIALIZED: + case wvcdm::CRYPTO_SESSION_NOT_OPEN: + case wvcdm::DEVICE_CANNOT_REPROVISION: + case wvcdm::DEVICE_CERTIFICATE_ERROR_1: + case wvcdm::DUPLICATE_SESSION_ID_SPECIFIED: + case wvcdm::EMPTY_KEYSET_ID_ENG_5: + case wvcdm::EMPTY_RESPONSE_ERROR_1: + case wvcdm::EMPTY_SESSION_ID: + case wvcdm::INCORRECT_USAGE_SUPPORT_TYPE_1: + case wvcdm::INCORRECT_USAGE_SUPPORT_TYPE_2: + case wvcdm::INVALID_IV_SIZE: + case wvcdm::INVALID_KEY_SYSTEM: + case wvcdm::INVALID_PARAMETERS_ENG_22: + case wvcdm::INVALID_PARAMETERS_ENG_23: + case wvcdm::INVALID_PARAMETERS_ENG_24: + case wvcdm::INVALID_PARAMETERS_LIC_1: + case wvcdm::INVALID_PARAMETERS_LIC_2: + case wvcdm::INVALID_PARAMETERS_LIC_6: + case wvcdm::INVALID_PARAMETERS_LIC_7: + case wvcdm::INVALID_PROVISIONING_PARAMETERS_1: + case wvcdm::INVALID_PROVISIONING_PARAMETERS_2: + case wvcdm::INVALID_PROVISIONING_REQUEST_PARAM_1: + case wvcdm::INVALID_PROVISIONING_REQUEST_PARAM_2: + case wvcdm::INVALID_SESSION_ID: + case wvcdm::KEYSET_ID_NOT_FOUND_1: + case wvcdm::KEYSET_ID_NOT_FOUND_2: + case wvcdm::KEYSET_ID_NOT_FOUND_3: + case wvcdm::KEY_CONFLICT_1: + case wvcdm::KEY_NOT_FOUND_2: + case wvcdm::KEY_REQUEST_ERROR_1: + case wvcdm::LICENSE_PARSER_NOT_INITIALIZED_1: + case wvcdm::LICENSE_PARSER_NOT_INITIALIZED_2: + case wvcdm::LICENSE_PARSER_NOT_INITIALIZED_3: + case wvcdm::LICENSE_PARSER_NOT_INITIALIZED_4: + case wvcdm::LICENSE_REQUEST_SERVICE_CERTIFICATE_GENERATION_ERROR: + case wvcdm::LICENSE_USAGE_ENTRY_MISSING: + case wvcdm::LOAD_ENTITLED_CONTENT_KEYS_ERROR: + case wvcdm::LOAD_USAGE_ENTRY_GENERATION_SKEW: + case wvcdm::LOAD_USAGE_ENTRY_INVALID_SESSION: + case wvcdm::LOAD_USAGE_ENTRY_SIGNATURE_FAILURE: + case wvcdm::LOAD_USAGE_HEADER_BAD_MAGIC: + case wvcdm::LOAD_USAGE_HEADER_GENERATION_SKEW: + case wvcdm::LOAD_USAGE_HEADER_SIGNATURE_FAILURE: + case wvcdm::LOAD_USAGE_INFO_MISSING: + case wvcdm::MOVE_USAGE_ENTRY_DESTINATION_IN_USE: + case wvcdm::NOT_IMPLEMENTED_ERROR: + case wvcdm::NOT_INITIALIZED_ERROR: + case wvcdm::NO_SRM_VERSION: + case wvcdm::NO_USAGE_ENTRIES: + case wvcdm::PARAMETER_NULL: + case wvcdm::PREPARE_CENC_CONTENT_ID_FAILED: + case wvcdm::PREPARE_WEBM_CONTENT_ID_FAILED: + case wvcdm::REINIT_ERROR: + case wvcdm::REMOVE_OFFLINE_LICENSE_ERROR_2: + case wvcdm::REMOVE_USAGE_INFO_ERROR_3: + case wvcdm::SESSION_NOT_FOUND_11: + case wvcdm::SESSION_NOT_FOUND_12: + case wvcdm::SESSION_NOT_FOUND_13: + case wvcdm::SESSION_NOT_FOUND_14: + case wvcdm::SESSION_NOT_FOUND_15: + case wvcdm::SESSION_NOT_FOUND_16: + case wvcdm::SHRINK_USAGE_TABLE_HEADER_ENTRY_IN_USE: + case wvcdm::STORAGE_PROHIBITED: + case wvcdm::STORE_LICENSE_ERROR_2: + case wvcdm::USAGE_ENTRY_NUMBER_MISMATCH: + case wvcdm::USAGE_GET_ENTRY_RETRIEVE_INVALID_STORAGE_TYPE: + case wvcdm::USAGE_INFORMATION_SUPPORT_FAILED: + case wvcdm::USAGE_INVALID_LOAD_ENTRY: + case wvcdm::USAGE_INVALID_NEW_ENTRY: + case wvcdm::USAGE_INVALID_PARAMETERS_1: + case wvcdm::USAGE_INVALID_PARAMETERS_2: + case wvcdm::USAGE_STORE_ENTRY_RETRIEVE_INVALID_STORAGE_TYPE: + err = ::drm::V1_4::Status::GENERAL_PLUGIN_ERROR; + break; + case wvcdm::CLIENT_ID_GENERATE_RANDOM_ERROR: + err = ::drm::V1_4::Status::ERROR_DRM_RESOURCE_CONTENTION; + break; + case wvcdm::CENC_INIT_DATA_UNAVAILABLE: + case wvcdm::INIT_DATA_NOT_FOUND: + case wvcdm::INVALID_PARAMETERS_LIC_3: + case wvcdm::INVALID_PARAMETERS_LIC_4: + case wvcdm::UNSUPPORTED_INIT_DATA: + case wvcdm::UNSUPPORTED_INIT_DATA_FORMAT: + case wvcdm::WEBM_INIT_DATA_UNAVAILABLE: + err = ::drm::V1_4::Status::INIT_DATA_INVALID; + break; + case wvcdm::EMPTY_KEYSET_ID: + case wvcdm::EMPTY_KEYSET_ID_ENG_1: + case wvcdm::EMPTY_KEYSET_ID_ENG_2: + case wvcdm::EMPTY_KEYSET_ID_ENG_3: + case wvcdm::EMPTY_KEYSET_ID_ENG_4: + case wvcdm::EMPTY_LICENSE_RESPONSE_1: + case wvcdm::EMPTY_LICENSE_RESPONSE_2: + case wvcdm::EMPTY_PROVISIONING_RESPONSE: + case wvcdm::INVALID_PARAMETERS_ENG_13: + case wvcdm::INVALID_PARAMETERS_ENG_14: + case wvcdm::INVALID_PARAMETERS_ENG_15: + case wvcdm::INVALID_PARAMETERS_ENG_16: + case wvcdm::INVALID_QUERY_KEY: + case wvcdm::KEY_NOT_FOUND_1: + case wvcdm::SAMPLE_AND_SUBSAMPLE_SIZE_MISMATCH: + err = ::drm::V1_4::Status::BAD_VALUE; + break; + case wvcdm::KEY_NOT_FOUND_3: + case wvcdm::KEY_NOT_FOUND_4: + case wvcdm::KEY_NOT_FOUND_5: + case wvcdm::KEY_NOT_FOUND_6: + err = ::drm::V1_4::Status::KEY_NOT_LOADED; + break; + case wvcdm::ADD_KEY_ERROR: + case wvcdm::CORE_MESSAGE_NOT_FOUND: + case wvcdm::EMPTY_KEY_DATA_1: + case wvcdm::EMPTY_KEY_DATA_2: + case wvcdm::INVALID_LICENSE_RESPONSE: + case wvcdm::INVALID_LICENSE_TYPE: + case wvcdm::INVALID_SRM_LIST: + case wvcdm::KEY_SIZE_ERROR_1: + case wvcdm::KEY_SIZE_ERROR_2: + case wvcdm::LICENSE_ID_NOT_FOUND: + case wvcdm::LICENSE_RESPONSE_NOT_SIGNED: + case wvcdm::LICENSE_RESPONSE_PARSE_ERROR_1: + case wvcdm::LICENSE_RESPONSE_PARSE_ERROR_2: + case wvcdm::LICENSE_RESPONSE_PARSE_ERROR_3: + case wvcdm::LICENSE_RESPONSE_PARSE_ERROR_4: + case wvcdm::LICENSE_RESPONSE_PARSE_ERROR_5: + case wvcdm::LOAD_KEY_ERROR: + case wvcdm::LOAD_LICENSE_ERROR: + case wvcdm::LOAD_RENEWAL_ERROR: + case wvcdm::LOAD_SRM_ERROR: + case wvcdm::NOT_AN_ENTITLEMENT_SESSION: + case wvcdm::NO_CONTENT_KEY: + case wvcdm::NO_CONTENT_KEY_2: + case wvcdm::NO_DEVICE_KEY_1: + case wvcdm::REFRESH_KEYS_ERROR: + case wvcdm::SESSION_KEYS_NOT_FOUND: + case wvcdm::SIGNATURE_NOT_FOUND: + err = ::drm::V1_4::Status::LICENSE_PARSE_ERROR; + break; + case wvcdm::LICENSE_RENEWAL_PROHIBITED: + case wvcdm::OFFLINE_LICENSE_PROHIBITED: + err = ::drm::V1_4::Status::LICENSE_POLICY_ERROR; + break; + case wvcdm::PARSE_REQUEST_ERROR_2: + case wvcdm::RELEASE_LICENSE_ERROR_1: + case wvcdm::SESSION_KEYS_NOT_FOUND_2: + err = ::drm::V1_4::Status::LICENSE_RELEASE_ERROR; + break; + case wvcdm::KEY_ERROR: + case wvcdm::RELEASE_KEY_ERROR: + case wvcdm::RENEW_KEY_ERROR_1: + err = ::drm::V1_4::Status::LICENSE_REQUEST_REJECTED; + break; + case wvcdm::EMPTY_LICENSE_REQUEST_2: + case wvcdm::EMPTY_LICENSE_REQUEST_3: + case wvcdm::EMPTY_LICENSE_RESPONSE_3: + case wvcdm::EMPTY_LICENSE_RESPONSE_4: + case wvcdm::INVALID_LICENSE_REQUEST_TYPE_1: + case wvcdm::INVALID_LICENSE_REQUEST_TYPE_2: + case wvcdm::INVALID_LICENSE_TYPE_2: + case wvcdm::PARSE_REQUEST_ERROR_1: + case wvcdm::RESTORE_OFFLINE_LICENSE_ERROR_2: + case wvcdm::SIGNATURE_NOT_FOUND_2: + err = ::drm::V1_4::Status::LICENSE_RESTORE_ERROR; + break; + case wvcdm::GET_RELEASED_LICENSE_ERROR: + case wvcdm::RESTORE_OFFLINE_LICENSE_ERROR_3: + err = ::drm::V1_4::Status::LICENSE_STATE_ERROR; + break; + case wvcdm::DEVICE_CERTIFICATE_ERROR_2: + case wvcdm::DEVICE_CERTIFICATE_ERROR_3: + case wvcdm::DEVICE_CERTIFICATE_ERROR_4: + case wvcdm::LICENSE_PARSER_INIT_ERROR: + case wvcdm::PARSE_RESPONSE_ERROR_1: + case wvcdm::PARSE_RESPONSE_ERROR_2: + case wvcdm::PARSE_RESPONSE_ERROR_3: + case wvcdm::PARSE_RESPONSE_ERROR_4: + err = ::drm::V1_4::Status::MALFORMED_CERTIFICATE; + break; + case wvcdm::INVALID_DECRYPT_PARAMETERS_ENG_2: + case wvcdm::INVALID_DECRYPT_PARAMETERS_ENG_4: + err = ::drm::V1_4::Status::MEDIA_FRAMEWORK_ERROR; + break; + case wvcdm::PRIVACY_MODE_ERROR_1: + case wvcdm::PRIVACY_MODE_ERROR_2: + case wvcdm::PRIVACY_MODE_ERROR_3: + err = ::drm::V1_4::Status::MISSING_CERTIFICATE; + break; + case wvcdm::LOAD_DEVICE_RSA_KEY_ERROR: + err = ::drm::V1_4::Status::PROVISIONING_CERTIFICATE_ERROR; + break; + case wvcdm::CERT_PROVISIONING_EMPTY_SERVICE_CERTIFICATE: + case wvcdm::SERVICE_CERTIFICATE_PROVIDER_ID_EMPTY: + err = ::drm::V1_4::Status::PROVISIONING_CONFIGURATION_ERROR; + break; + case wvcdm::CERT_PROVISIONING_INVALID_CERT_TYPE: + case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_1: + case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_2: + case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_3: + case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_4: + case wvcdm::LOAD_PROVISIONING_ERROR: + err = ::drm::V1_4::Status::PROVISIONING_PARSE_ERROR; + break; + case wvcdm::EMPTY_PROVISIONING_CERTIFICATE_1: + case wvcdm::EMPTY_PROVISIONING_CERTIFICATE_2: + err = ::drm::V1_4::Status::RETRYABLE_PROVISIONING_ERROR; + break; + case wvcdm::RELEASE_LICENSE_ERROR_2: + err = ::drm::V1_4::Status::SECURE_STOP_RELEASE_ERROR; + break; + case wvcdm::GET_LICENSE_ERROR: + case wvcdm::GET_OFFLINE_LICENSE_STATE_ERROR_1: + case wvcdm::GET_OFFLINE_LICENSE_STATE_ERROR_2: + case wvcdm::GET_USAGE_INFO_ERROR_1: + case wvcdm::GET_USAGE_INFO_ERROR_2: + case wvcdm::GET_USAGE_INFO_ERROR_3: + case wvcdm::GET_USAGE_INFO_ERROR_4: + case wvcdm::LIST_LICENSE_ERROR_1: + case wvcdm::LIST_LICENSE_ERROR_2: + case wvcdm::LIST_USAGE_ERROR_1: + case wvcdm::LIST_USAGE_ERROR_2: + case wvcdm::LOAD_USAGE_INFO_FILE_ERROR: + case wvcdm::REMOVE_OFFLINE_LICENSE_ERROR_1: + case wvcdm::REMOVE_USAGE_INFO_ERROR_2: + case wvcdm::SESSION_FILE_HANDLE_INIT_ERROR: + case wvcdm::UNPROVISION_ERROR_1: + case wvcdm::USAGE_GET_ENTRY_RETRIEVE_LICENSE_FAILED: + case wvcdm::USAGE_GET_ENTRY_RETRIEVE_USAGE_INFO_FAILED: + case wvcdm::USAGE_INFO_NOT_FOUND: + case wvcdm::USAGE_STORE_ENTRY_RETRIEVE_LICENSE_FAILED: + case wvcdm::USAGE_STORE_ENTRY_RETRIEVE_USAGE_INFO_FAILED: + err = ::drm::V1_4::Status::STORAGE_READ_FAILURE; + break; + case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_7: + case wvcdm::CERT_PROVISIONING_RESPONSE_ERROR_8: + case wvcdm::DELETE_USAGE_ERROR_1: + case wvcdm::DELETE_USAGE_ERROR_2: + case wvcdm::RELEASE_KEY_REQUEST_ERROR: + case wvcdm::REMOVE_ALL_USAGE_INFO_ERROR_5: + case wvcdm::REMOVE_USAGE_INFO_ERROR_1: + case wvcdm::RENEW_KEY_ERROR_2: + case wvcdm::STORE_LICENSE_ERROR_1: + case wvcdm::STORE_USAGE_INFO_ERROR: + case wvcdm::UNPROVISION_ERROR_2: + case wvcdm::UNPROVISION_ERROR_3: + case wvcdm::USAGE_STORE_LICENSE_FAILED: + case wvcdm::USAGE_STORE_USAGE_INFO_FAILED: + err = ::drm::V1_4::Status::STORAGE_WRITE_FAILURE; + break; + default: + return static_cast(mapCdmResponseType_1_2(res)); + } + return static_cast(err); +} static inline bool isCdmResponseTypeSuccess(wvcdm::CdmResponseType res) { return mapCdmResponseType(res) == Status::OK; diff --git a/libwvdrmengine/mediacrypto/src_hidl/WVCryptoPlugin.cpp b/libwvdrmengine/mediacrypto/src_hidl/WVCryptoPlugin.cpp index 079c1387..8ec224b8 100644 --- a/libwvdrmengine/mediacrypto/src_hidl/WVCryptoPlugin.cpp +++ b/libwvdrmengine/mediacrypto/src_hidl/WVCryptoPlugin.cpp @@ -302,7 +302,6 @@ Status_V1_2 WVCryptoPlugin::attemptDecrypt( mSessionId.c_str(), hasProtectedData ? "with" : "without", res); - bool actionableError = true; switch (res) { case wvcdm::INSUFFICIENT_CRYPTO_RESOURCES: errorDetailMsg->assign( @@ -335,17 +334,10 @@ Status_V1_2 WVCryptoPlugin::attemptDecrypt( "Error decrypting data: key prohibited for security level"); break; default: - actionableError = false; break; } - if (actionableError) { - // This error is actionable by the app and should be passed up. - return mapCdmResponseType_1_2(res); - } else { - // Swallow the specifics of other errors to obscure decrypt internals. - return Status_V1_2::ERROR_DRM_UNKNOWN; - } + return mapCdmResponseType(res); } } diff --git a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp index 60dc29d8..596f5848 100644 --- a/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp +++ b/libwvdrmengine/mediadrm/src_hidl/WVDrmPlugin.cpp @@ -543,7 +543,7 @@ Return WVDrmPlugin::getKeyRequest_1_2( if (keyType == KeyType::RELEASE) { // When releasing keys, we do not have a session ID. - status = mapCdmResponseType_1_2(res); + status = mapCdmResponseType(res); } else { // For all other requests, we have a session ID. status = mapAndNotifyOfCdmResponseType_1_2(scopeId, res); @@ -704,7 +704,7 @@ Return WVDrmPlugin::getProvisionRequest_1_2( std::vector request; if (mPropertySet.use_atsc_mode()) { - _hidl_cb(mapCdmResponseType_1_2(wvcdm::PROVISIONING_NOT_ALLOWED_FOR_ATSC), + _hidl_cb(mapCdmResponseType(wvcdm::PROVISIONING_NOT_ALLOWED_FOR_ATSC), toHidlVec(request), hidl_string(defaultUrl)); return Void(); } @@ -736,7 +736,7 @@ Return WVDrmPlugin::getProvisionRequest_1_2( defaultUrl.assign(cdmDefaultUrl.data(), cdmDefaultUrl.size()); } - _hidl_cb(mapCdmResponseType_1_2(res), toHidlVec(request), + _hidl_cb(mapCdmResponseType(res), toHidlVec(request), hidl_string(defaultUrl)); return Void(); } @@ -2075,7 +2075,7 @@ Status WVDrmPlugin::mapAndNotifyOfCdmResponseType( Status_V1_2 WVDrmPlugin::mapAndNotifyOfCdmResponseType_1_2( const std::vector& sessionId, CdmResponseType res) { notifyOfCdmResponseType(sessionId, res); - return mapCdmResponseType_1_2(res); + return mapCdmResponseType(res); } void WVDrmPlugin::notifyOfCdmResponseType(