From a74980b2f1b91727e39e3e558b3bec6a1ad8337b Mon Sep 17 00:00:00 2001 From: Rahul Frias Date: Wed, 2 Oct 2013 15:43:28 -0700 Subject: [PATCH] Address key selection and decryption concurrency issues Decryption calls though multiple threads may result in race conditions between the setting of the key and the actual call to decryption. This results in OEMCrypto errors when the buffer type used in decryption did not match the key selected. This is addressed by having the the two calls be in the same critical section. b/11009857 Change-Id: I74f1a0689ca17114f3cdd029022013b05c415acd --- libwvdrmengine/cdm/core/include/crypto_session.h | 2 ++ libwvdrmengine/cdm/core/src/cdm_session.cpp | 11 ----------- libwvdrmengine/cdm/core/src/crypto_session.cpp | 13 ++++++++++++- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/libwvdrmengine/cdm/core/include/crypto_session.h b/libwvdrmengine/cdm/core/include/crypto_session.h index 588ea58a..f5ca67bb 100644 --- a/libwvdrmengine/cdm/core/include/crypto_session.h +++ b/libwvdrmengine/cdm/core/include/crypto_session.h @@ -92,6 +92,8 @@ class CryptoSession { bool is_destination_buffer_type_valid_; SecurityLevel requested_security_level_; + KeyId key_id_; + CORE_DISALLOW_COPY_AND_ASSIGN(CryptoSession); }; diff --git a/libwvdrmengine/cdm/core/src/cdm_session.cpp b/libwvdrmengine/cdm/core/src/cdm_session.cpp index 4ecce4a5..e3e12e75 100644 --- a/libwvdrmengine/cdm/core/src/cdm_session.cpp +++ b/libwvdrmengine/cdm/core/src/cdm_session.cpp @@ -272,17 +272,6 @@ CdmResponseType CdmSession::Decrypt(const CdmDecryptionParameters& params) { if (crypto_session_.get() == NULL || !crypto_session_->IsOpen()) return UNKNOWN_ERROR; - // Check if key needs to be selected - if (params.is_encrypted) { - if (key_id_.compare(*params.key_id) != 0) { - if (crypto_session_->SelectKey(*params.key_id)) { - key_id_ = *params.key_id; - } else { - return NEED_KEY; - } - } - } - return crypto_session_->Decrypt(params); } diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index e4b6d2f3..fa23002f 100755 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -433,7 +433,6 @@ bool CryptoSession::RefreshKeys(const std::string& message, } bool CryptoSession::SelectKey(const std::string& key_id) { - AutoLock auto_lock(crypto_lock_); const uint8_t* key_id_string = reinterpret_cast(key_id.data()); @@ -550,6 +549,18 @@ CdmResponseType CryptoSession::Decrypt(const CdmDecryptionParameters& params) { if (!SetDestinationBufferType()) return UNKNOWN_ERROR; } + AutoLock auto_lock(crypto_lock_); + // Check if key needs to be selected + if (params.is_encrypted) { + if (key_id_.compare(*params.key_id) != 0) { + if (SelectKey(*params.key_id)) { + key_id_ = *params.key_id; + } else { + return NEED_KEY; + } + } + } + OEMCrypto_DestBufferDesc buffer_descriptor; buffer_descriptor.type = params.is_secure ? destination_buffer_type_ : OEMCrypto_BufferType_Clear;