Squashed commit of the following CDM changes:
* Add additional parameters to CDM decryption API https://widevine-internal-review.googlesource.com/#/c/6500/ * Pass Length and Flags Parameters to Decrypt() https://widevine-internal-review.googlesource.com/#/c/6740/ * Remove core files from oemcrypto/mock https://widevine-internal-review.googlesource.com/#/c/6853/ Change-Id: I1c73f5454da20da99130b161543fb990e16e7130
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
|
||||
#include "mapErrors-inl.h"
|
||||
#include "media/stagefright/MediaErrors.h"
|
||||
#include "OEMCryptoCENC.h"
|
||||
#include "openssl/sha.h"
|
||||
#include "utils/Errors.h"
|
||||
#include "utils/String8.h"
|
||||
@@ -83,6 +84,22 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
|
||||
const uint8_t* const source = static_cast<const uint8_t*>(srcPtr);
|
||||
uint8_t* const dest = static_cast<uint8_t*>(dstPtr);
|
||||
|
||||
// Calculate the output buffer size
|
||||
size_t destSize = 0;
|
||||
for (size_t i = 0; i < numSubSamples; i++) {
|
||||
const SubSample &subSample = subSamples[i];
|
||||
destSize += subSample.mNumBytesOfClearData;
|
||||
destSize += subSample.mNumBytesOfEncryptedData;
|
||||
}
|
||||
|
||||
// Set up the decrypt params that do not vary.
|
||||
CdmDecryptionParameters params = CdmDecryptionParameters();
|
||||
params.is_secure = secure;
|
||||
params.key_id = &keyId;
|
||||
params.iv = &ivVector;
|
||||
params.decrypt_buffer = dest;
|
||||
params.decrypt_buffer_length = destSize;
|
||||
|
||||
// Iterate through subsamples, sending them to the CDM serially.
|
||||
size_t offset = 0;
|
||||
static const size_t kAESBlockSize = 16;
|
||||
@@ -97,13 +114,40 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
|
||||
return kErrorExpectedUnencrypted;
|
||||
}
|
||||
|
||||
// Calculate any flags that apply to this subsample's parts.
|
||||
uint8_t clearFlags = 0;
|
||||
uint8_t encryptedFlags = 0;
|
||||
|
||||
// If this is the first subsample…
|
||||
if (i == 0) {
|
||||
// …add OEMCrypto_FirstSubsample to the first part that is present.
|
||||
if (subSample.mNumBytesOfClearData != 0) {
|
||||
clearFlags = clearFlags | OEMCrypto_FirstSubsample;
|
||||
} else {
|
||||
encryptedFlags = encryptedFlags | OEMCrypto_FirstSubsample;
|
||||
}
|
||||
}
|
||||
// If this is the last subsample…
|
||||
if (i == numSubSamples - 1) {
|
||||
// …add OEMCrypto_LastSubsample to the last part that is present
|
||||
if (subSample.mNumBytesOfEncryptedData != 0) {
|
||||
encryptedFlags = encryptedFlags | OEMCrypto_LastSubsample;
|
||||
} else {
|
||||
clearFlags = clearFlags | OEMCrypto_LastSubsample;
|
||||
}
|
||||
}
|
||||
|
||||
// "Decrypt" any unencrypted data. Per the ISO-CENC standard, clear data
|
||||
// comes before encrypted data.
|
||||
if (subSample.mNumBytesOfClearData != 0) {
|
||||
CdmResponseType res = mCDM->Decrypt(mSessionId, false, secure, keyId,
|
||||
source + offset,
|
||||
subSample.mNumBytesOfClearData,
|
||||
ivVector, 0, dest, offset);
|
||||
params.is_encrypted = false;
|
||||
params.encrypt_buffer = source + offset;
|
||||
params.encrypt_length = subSample.mNumBytesOfClearData;
|
||||
params.block_offset = 0;
|
||||
params.decrypt_buffer_offset = offset;
|
||||
params.subsample_flags = clearFlags;
|
||||
|
||||
CdmResponseType res = mCDM->Decrypt(mSessionId, params);
|
||||
|
||||
if (!isCdmResponseTypeSuccess(res)) {
|
||||
ALOGE("Decrypt error result in session %s during unencrypted block: %d",
|
||||
@@ -118,10 +162,14 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE],
|
||||
// Decrypt any encrypted data. Per the ISO-CENC standard, encrypted data
|
||||
// comes after clear data.
|
||||
if (subSample.mNumBytesOfEncryptedData != 0) {
|
||||
CdmResponseType res = mCDM->Decrypt(mSessionId, true, secure, keyId,
|
||||
source + offset,
|
||||
subSample.mNumBytesOfEncryptedData,
|
||||
ivVector, blockOffset, dest, offset);
|
||||
params.is_encrypted = true;
|
||||
params.encrypt_buffer = source + offset;
|
||||
params.encrypt_length = subSample.mNumBytesOfEncryptedData;
|
||||
params.block_offset = blockOffset;
|
||||
params.decrypt_buffer_offset = offset;
|
||||
params.subsample_flags = encryptedFlags;
|
||||
|
||||
CdmResponseType res = mCDM->Decrypt(mSessionId, params);
|
||||
|
||||
if (!isCdmResponseTypeSuccess(res)) {
|
||||
ALOGE("Decrypt error result in session %s during encrypted block: %d",
|
||||
|
||||
Reference in New Issue
Block a user