From fb5c67929f5ebe289176b6044a9906f32204e1e6 Mon Sep 17 00:00:00 2001 From: Alex Dale Date: Wed, 19 Feb 2020 17:32:39 -0800 Subject: [PATCH] CDM handles mixed output warnings. [ Merge of http://go/wvgerrit/94483 ] With OEMCrypto V16 comes a new potential error code from calls to DecryptCENC(). WARNING_MIXED_OUTPUT_PROTECTION may be returned by supporting devices if one of the output devices does not meet the required HDCP level for the decryption key/license; however the output is instead restricted (by OEMCrypto) to devices that are secure. This warning is informative to the CDM; but no action can/should be taken by the CDM. In addition, if DecryptCENC() returns an error/warning, it is likely that the same status code will be returned on subsequent calls to decrypt within the same crypto session. To reduce the number of logs the CDM produces within the same crypto session only changes in error codes are logged. Bug: 140825538 Change-Id: Iaf9da3f0c88889525f73f3153a5977c8416286bb (cherry picked from commit d9c703ef9e9afe29a2d8025a4234e57cd0e86f28) Merged-In: Iaf9da3f0c88889525f73f3153a5977c8416286bb --- .../cdm/core/include/crypto_session.h | 9 +++++++- .../cdm/core/src/crypto_session.cpp | 21 ++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/crypto_session.h b/libwvdrmengine/cdm/core/include/crypto_session.h index f6fc2ccd..747c9ec5 100644 --- a/libwvdrmengine/cdm/core/include/crypto_session.h +++ b/libwvdrmengine/cdm/core/include/crypto_session.h @@ -430,6 +430,13 @@ class CryptoSession { uint32_t api_version_; + // Stores the most recent error code returned from a call to + // OEMCrypto_DecryptCENC. This is used to reduce the total number of + // error logs for decrypt calls, as there could be a large number of + // same error code in sequence of each other. A value of + // OEMCrypto_SUCCESS indicates that no error have yet occurred. + OEMCryptoResult last_decrypt_error_ = OEMCrypto_SUCCESS; + // In order to avoid creating a deadlock if instantiation needs to take any // of the CryptoSession static mutexes, |factory_| is protected by its own // mutex that is only used in the two funtions that interact with it. @@ -437,7 +444,7 @@ class CryptoSession { static std::unique_ptr factory_; CORE_DISALLOW_COPY_AND_ASSIGN(CryptoSession); -}; +}; // class CryptoSession class CryptoSessionFactory { public: diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 93cb28e0..49266886 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -1476,10 +1476,29 @@ CdmResponseType CryptoSession::Decrypt( } // Perform decrypt - OEMCryptoResult sts = + const OEMCryptoResult sts = DecryptMultipleSamples(oec_samples, params.cipher_mode, oec_pattern); + + if (sts != OEMCrypto_SUCCESS && last_decrypt_error_ != sts) { + // Decrypt errors and warnings are only logged when the error code + // changes. This is in anticipation that if an error code is + // returned, then the same error code is likely to be returned in + // the next call. The calling application may make several more + // decrypt requests before the error is handled by the app. + last_decrypt_error_ = sts; + if (sts == OEMCrypto_WARNING_MIXED_OUTPUT_PROTECTION) { + LOGW( + "OEMCrypto_DecryptCENC is warning of mixed HDCP output protection: " + "oec_session_id = %u", + oec_session_id_); + } else { + LOGE("OEMCrypto_DecryptCENC failed: status = %d", static_cast(sts)); + } + } + switch (sts) { case OEMCrypto_SUCCESS: + case OEMCrypto_WARNING_MIXED_OUTPUT_PROTECTION: return NO_ERROR; case OEMCrypto_ERROR_INSUFFICIENT_RESOURCES: return INSUFFICIENT_CRYPTO_RESOURCES_5;