From ae1711acc04f1093ceec731811632106407e36fa Mon Sep 17 00:00:00 2001 From: Fred Gylys-Colwell Date: Tue, 31 Mar 2015 15:09:45 -0700 Subject: [PATCH] Add backward compatibility to OEMCrypto_CopyBuffer Merge from Widevine repository of http://go/wvgerrit/13912 This CL falls back to OEMCrypto_DecryptCTR if the oemcrypto library does not implement OEMCrypto_CopyBuffer. This allows devices with oem crypto version 9 to function as they previously did. Change-Id: Id3a4a94b1fd559f426ee260cfbf7077fa9101d8b --- .../cdm/core/src/crypto_session.cpp | 25 +++++++++++-------- .../mock/src/oemcrypto_engine_mock.cpp | 10 +++++--- .../oemcrypto/mock/src/oemcrypto_mock.cpp | 7 +++--- 3 files changed, 24 insertions(+), 18 deletions(-) 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; }