diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 4ecbad6b..846282a6 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -660,25 +660,28 @@ CdmResponseType CryptoSession::Decrypt(const CdmDecryptionParameters& params) { break; } - OEMCryptoResult sts; - if (params.is_encrypted) { + OEMCryptoResult sts = OEMCrypto_ERROR_NOT_IMPLEMENTED; + if (!params.is_encrypted) { + sts = OEMCrypto_CopyBuffer(requested_security_level_, + params.encrypt_buffer, params.encrypt_length, + &buffer_descriptor, params.subsample_flags); + } + if (params.is_encrypted || sts == OEMCrypto_ERROR_NOT_IMPLEMENTED) { AutoLock auto_lock(crypto_lock_); // Check if key needs to be selected - if (key_id_ != *params.key_id) { - if (SelectKey(*params.key_id)) { - key_id_ = *params.key_id; - } else { - return NEED_KEY; + if (params.is_encrypted) { + if (key_id_ != *params.key_id) { + if (SelectKey(*params.key_id)) { + key_id_ = *params.key_id; + } else { + return NEED_KEY; + } } } sts = OEMCrypto_DecryptCTR( oec_session_id_, params.encrypt_buffer, params.encrypt_length, params.is_encrypted, &(*params.iv).front(), params.block_offset, &buffer_descriptor, params.subsample_flags); - } else { - sts = OEMCrypto_CopyBuffer(requested_security_level_, - params.encrypt_buffer, params.encrypt_length, - &buffer_descriptor, params.subsample_flags); } switch (sts) { diff --git a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_mock.cpp b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_mock.cpp index f93f4540..ed717639 100644 --- a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_mock.cpp +++ b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_engine_mock.cpp @@ -1068,10 +1068,12 @@ OEMCryptoResult SessionContext::DecryptCTR( OEMCryptoBufferType buffer_type) { // If the data is clear, we do not need a current key selected. if (!is_encrypted) { - if (buffer_type == OEMCrypto_BufferType_Direct) - return OEMCrypto_ERROR_NOT_IMPLEMENTED; - memcpy(reinterpret_cast(clear_data), cipher_data, - cipher_data_length); + if (buffer_type != OEMCrypto_BufferType_Direct){ + memcpy(reinterpret_cast(clear_data), cipher_data, + cipher_data_length); + return OEMCrypto_SUCCESS; + } + // For reference implementation, we quietly drop the clear direct video. return OEMCrypto_SUCCESS; } diff --git a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp index f8806ee3..7ca9e8b3 100644 --- a/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp +++ b/libwvdrmengine/oemcrypto/mock/src/oemcrypto_mock.cpp @@ -536,10 +536,11 @@ OEMCryptoResult SetDestination(OEMCrypto_DestBufferDesc* out_buffer, + out_buffer->buffer.secure.offset; *max_length = out_buffer->buffer.secure.max_length; break; - default: case OEMCrypto_BufferType_Direct: - return OEMCrypto_ERROR_NOT_IMPLEMENTED; + *destination = NULL; break; + default: + return OEMCrypto_ERROR_INVALID_CONTEXT; } if (out_buffer->type != OEMCrypto_BufferType_Direct @@ -616,7 +617,7 @@ OEMCryptoResult OEMCrypto_CopyBuffer(const uint8_t *data_addr, &max_length); if (sts != OEMCrypto_SUCCESS) return sts; - memcpy(destination, data_addr, data_length); + if (destination != NULL) memcpy(destination, data_addr, data_length); return OEMCrypto_SUCCESS; }