diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index c56e6610..bf61cfaf 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -215,7 +215,8 @@ enum CdmResponseType { LOAD_USAGE_INFO_MISSING, SESSION_FILE_HANDLE_INIT_ERROR, INCORRECT_CRYPTO_MODE, - INVALID_PARAMETERS_ENG_5 + INVALID_PARAMETERS_ENG_5, + DECRYPT_ERROR }; enum CdmKeyStatus { diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 9cb3dacc..d447215f 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -710,6 +710,11 @@ CdmResponseType CryptoSession::Decrypt(const CdmDecryptionParameters& params) { return INSUFFICIENT_CRYPTO_RESOURCES; case OEMCrypto_ERROR_KEY_EXPIRED: return NEED_KEY; + case OEMCrypto_ERROR_INVALID_SESSION: + return SESSION_NOT_FOUND_FOR_DECRYPT; + case OEMCrypto_ERROR_DECRYPT_FAILED: + case OEMCrypto_ERROR_UNKNOWN_FAILURE: + return DECRYPT_ERROR; default: return UNKNOWN_ERROR; } diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp index f532e025..06f8be45 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.cpp +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -332,11 +332,15 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { case EMPTY_LICENSE_REQUEST: *os << "EMPTY_LICENSE_REQUEST"; break; case DUPLICATE_SESSION_ID_SPECIFIED: *os << "DUPLICATE_SESSION_ID_SPECIFIED"; + break; case LICENSE_RENEWAL_PROHIBITED: *os << "LICENSE_RENEWAL_PROHIBITED"; + break; case SESSION_FILE_HANDLE_INIT_ERROR: *os << "SESSION_FILE_HANDLE_INIT_ERROR"; break; case INCORRECT_CRYPTO_MODE: *os << "INCORRECT_CRYPTO_MODE"; break; + case DECRYPT_ERROR: *os << "DECRYPT_ERROR"; + break; default: *os << "Unknown CdmResponseType"; break; diff --git a/libwvdrmengine/include/mapErrors-inl.h b/libwvdrmengine/include/mapErrors-inl.h index 52393cf7..d74b5791 100644 --- a/libwvdrmengine/include/mapErrors-inl.h +++ b/libwvdrmengine/include/mapErrors-inl.h @@ -359,6 +359,8 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return android::ERROR_DRM_UNKNOWN; case wvcdm::SECURE_BUFFER_REQUIRED: return android::ERROR_DRM_CANNOT_HANDLE; + case wvcdm::DECRYPT_ERROR: + return android::ERROR_DRM_CANNOT_HANDLE; case wvcdm::UNUSED_1: case wvcdm::UNUSED_2: case wvcdm::UNUSED_3: diff --git a/libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp b/libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp index 60aba8e1..bc9f9423 100644 --- a/libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp +++ b/libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp @@ -212,6 +212,11 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE], "Error decrypting data: session not found, possibly reclaimed"); // This error is actionable by the app and should be passed up. return mapCdmResponseType(res); + } else if (res == wvcdm::DECRYPT_ERROR) { + errorDetailMsg->setTo( + "Error decrypting data: unspecified error"); + // This error is actionable by the app and should be passed up. + return mapCdmResponseType(res); } else { // Swallow the specifics of other errors to obscure decrypt internals. return kErrorCDMGeneric; @@ -253,6 +258,16 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE], "Error decrypting data: requested key has not been loaded"); // This error is actionable by the app and should be passed up. return mapCdmResponseType(res); + } else if (res == wvcdm::SESSION_NOT_FOUND_FOR_DECRYPT) { + errorDetailMsg->setTo( + "Error decrypting data: session not found, possibly reclaimed"); + // This error is actionable by the app and should be passed up. + return mapCdmResponseType(res); + } else if (res == wvcdm::DECRYPT_ERROR) { + errorDetailMsg->setTo( + "Error decrypting data: unspecified error"); + // This error is actionable by the app and should be passed up. + return mapCdmResponseType(res); } else { // Swallow the specifics of other errors to obscure decrypt internals. return kErrorCDMGeneric;