From b76eccf32d291f7fce03ba82f56ede28b87e3a4e Mon Sep 17 00:00:00 2001 From: Rahul Frias Date: Tue, 5 Apr 2016 16:44:31 -0700 Subject: [PATCH] Return ERROR_INSUFFICIENT_OUTPUT_PROTECTION when appropriate [ Merge from http://go/wvgerrit/17429 ] This is to correct for when HDCP validation failure at the OEMCrypto level ends up returning a CryptoException through MediaCrypto with error code Unknown Error (-2998). b/27849488 Change-Id: Ib3a9b1c3a17b9323f3d079a678cf88dedeec3b4b --- libwvdrmengine/cdm/core/include/wv_cdm_types.h | 3 ++- libwvdrmengine/cdm/core/src/crypto_session.cpp | 2 ++ libwvdrmengine/cdm/core/test/test_printers.cpp | 3 +++ libwvdrmengine/include/mapErrors-inl.h | 2 ++ libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp | 10 ++++++++++ 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index bf61cfaf..7861e0e4 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -216,7 +216,8 @@ enum CdmResponseType { SESSION_FILE_HANDLE_INIT_ERROR, INCORRECT_CRYPTO_MODE, INVALID_PARAMETERS_ENG_5, - DECRYPT_ERROR + DECRYPT_ERROR, + INSUFFICIENT_OUTPUT_PROTECTION, }; enum CdmKeyStatus { diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index d447215f..86289c47 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -715,6 +715,8 @@ CdmResponseType CryptoSession::Decrypt(const CdmDecryptionParameters& params) { case OEMCrypto_ERROR_DECRYPT_FAILED: case OEMCrypto_ERROR_UNKNOWN_FAILURE: return DECRYPT_ERROR; + case OEMCrypto_ERROR_INSUFFICIENT_HDCP: + return INSUFFICIENT_OUTPUT_PROTECTION; default: return UNKNOWN_ERROR; } diff --git a/libwvdrmengine/cdm/core/test/test_printers.cpp b/libwvdrmengine/cdm/core/test/test_printers.cpp index 06f8be45..10181c82 100644 --- a/libwvdrmengine/cdm/core/test/test_printers.cpp +++ b/libwvdrmengine/cdm/core/test/test_printers.cpp @@ -341,6 +341,9 @@ void PrintTo(const enum CdmResponseType& value, ::std::ostream* os) { break; case DECRYPT_ERROR: *os << "DECRYPT_ERROR"; break; + case INSUFFICIENT_OUTPUT_PROTECTION: + *os << "INSUFFICIENT_OUTPUT_PROTECTION"; + break; default: *os << "Unknown CdmResponseType"; break; diff --git a/libwvdrmengine/include/mapErrors-inl.h b/libwvdrmengine/include/mapErrors-inl.h index d74b5791..f983bfd8 100644 --- a/libwvdrmengine/include/mapErrors-inl.h +++ b/libwvdrmengine/include/mapErrors-inl.h @@ -361,6 +361,8 @@ static android::status_t mapCdmResponseType(wvcdm::CdmResponseType res) { return android::ERROR_DRM_CANNOT_HANDLE; case wvcdm::DECRYPT_ERROR: return android::ERROR_DRM_CANNOT_HANDLE; + case wvcdm::INSUFFICIENT_OUTPUT_PROTECTION: + return android::ERROR_DRM_INSUFFICIENT_OUTPUT_PROTECTION; 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 bc9f9423..9f06bb0b 100644 --- a/libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp +++ b/libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp @@ -217,6 +217,11 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE], "Error decrypting data: unspecified error"); // This error is actionable by the app and should be passed up. return mapCdmResponseType(res); + } else if (res == wvcdm::INSUFFICIENT_OUTPUT_PROTECTION) { + errorDetailMsg->setTo( + "Error decrypting data: insufficient output protection"); + // 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; @@ -268,6 +273,11 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE], "Error decrypting data: unspecified error"); // This error is actionable by the app and should be passed up. return mapCdmResponseType(res); + } else if (res == wvcdm::INSUFFICIENT_OUTPUT_PROTECTION) { + errorDetailMsg->setTo( + "Error decrypting data: insufficient output protection"); + // 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;