diff --git a/libwvdrmengine/cdm/core/include/wv_cdm_types.h b/libwvdrmengine/cdm/core/include/wv_cdm_types.h index 7861e0e4..daac1f26 100644 --- a/libwvdrmengine/cdm/core/include/wv_cdm_types.h +++ b/libwvdrmengine/cdm/core/include/wv_cdm_types.h @@ -282,11 +282,9 @@ enum CdmCipherMode { struct CdmCencPatternEncryptionDescriptor { size_t encrypt_blocks; // number of 16 byte blocks to decrypt size_t skip_blocks; // number of 16 byte blocks to leave in clear - size_t offset_blocks; // offset into the pattern for this call, in blocks CdmCencPatternEncryptionDescriptor() : encrypt_blocks(0), - skip_blocks(0), - offset_blocks(0) {} + skip_blocks(0) {} }; struct CdmDecryptionParameters { diff --git a/libwvdrmengine/cdm/core/src/crypto_session.cpp b/libwvdrmengine/cdm/core/src/crypto_session.cpp index 12bd62e6..d17dab5a 100644 --- a/libwvdrmengine/cdm/core/src/crypto_session.cpp +++ b/libwvdrmengine/cdm/core/src/crypto_session.cpp @@ -689,7 +689,7 @@ CdmResponseType CryptoSession::Decrypt(const CdmDecryptionParameters& params) { OEMCrypto_CENCEncryptPatternDesc pattern_descriptor; pattern_descriptor.encrypt = params.pattern_descriptor.encrypt_blocks; pattern_descriptor.skip = params.pattern_descriptor.skip_blocks; - pattern_descriptor.offset = params.pattern_descriptor.offset_blocks; + pattern_descriptor.offset = 0; // Deprecated field AutoLock auto_lock(crypto_lock_); // Check if key needs to be selected if (params.is_encrypted) { diff --git a/libwvdrmengine/mediacrypto/include/WVCryptoPlugin.h b/libwvdrmengine/mediacrypto/include/WVCryptoPlugin.h index 9ba78b5c..e50dbf8e 100644 --- a/libwvdrmengine/mediacrypto/include/WVCryptoPlugin.h +++ b/libwvdrmengine/mediacrypto/include/WVCryptoPlugin.h @@ -47,7 +47,7 @@ class WVCryptoPlugin : public android::CryptoPlugin { wvcdm::CdmSessionId configureTestMode(const void* data, size_t size); static wvcdm::CdmResponseType countEncryptedBlocksInPatternedRange( size_t range, size_t startingOffset, const Pattern& pattern, - size_t startingPatternOffset, uint64_t* result); + uint64_t* result); static void incrementIV(uint64_t increaseBy, std::vector* ivPtr); }; diff --git a/libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp b/libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp index 9f06bb0b..faa9f8bf 100644 --- a/libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp +++ b/libwvdrmengine/mediacrypto/src/WVCryptoPlugin.cpp @@ -146,7 +146,6 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE], size_t blockOffset = 0; const size_t patternLengthInBytes = (pattern.mEncryptBlocks + pattern.mSkipBlocks) * kAESBlockSize; - size_t patternOffsetInBytes = 0; for (size_t i = 0; i < numSubSamples; ++i) { const SubSample& subSample = subSamples[i]; @@ -187,7 +186,6 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE], params.encrypt_buffer = source + offset; params.encrypt_length = subSample.mNumBytesOfClearData; params.block_offset = 0; - params.pattern_descriptor.offset_blocks = 0; params.decrypt_buffer_offset = offset; params.subsample_flags = clearFlags; @@ -238,12 +236,6 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE], params.encrypt_buffer = source + offset; params.encrypt_length = subSample.mNumBytesOfEncryptedData; params.block_offset = blockOffset; - // Note that the pattern offset calculation relies intentionally on - // integer division's flooring behavior. If we are partway through a - // crypto block, we should return the offset of the pattern block we are - // partway through. - size_t patternOffsetInBlocks = patternOffsetInBytes / kAESBlockSize; - params.pattern_descriptor.offset_blocks = patternOffsetInBlocks; params.decrypt_buffer_offset = offset; params.subsample_flags = encryptedFlags; @@ -301,7 +293,7 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE], } else { res = countEncryptedBlocksInPatternedRange( subSample.mNumBytesOfEncryptedData, blockOffset, pattern, - patternOffsetInBlocks, &increment); + &increment); if (!isCdmResponseTypeSuccess(res)) { // Swallow the specifics of the error to obscure decrypt internals. return kErrorCDMGeneric; @@ -312,12 +304,6 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE], // Update the block offset blockOffset = (blockOffset + subSample.mNumBytesOfEncryptedData) % kAESBlockSize; - - if (patternLengthInBytes > 0) { - patternOffsetInBytes = - (patternOffsetInBytes + subSample.mNumBytesOfEncryptedData) % - patternLengthInBytes; - } } else if (mode == kMode_AES_CBC && patternLengthInBytes == 0) { // If there is no pattern, assume cbc1 mode and update the IV. @@ -363,14 +349,13 @@ ssize_t WVCryptoPlugin::decrypt(bool secure, const uint8_t key[KEY_ID_SIZE], CdmResponseType WVCryptoPlugin::countEncryptedBlocksInPatternedRange( size_t range, size_t startingOffset, const Pattern& pattern, - size_t startingPatternOffset, uint64_t* result) { + uint64_t* result) { uint64_t blocksPassed = 0; size_t bytesRemaining = range; - size_t patternOffset = startingPatternOffset; + size_t patternPosition = 0; size_t patternLength = pattern.mEncryptBlocks + pattern.mSkipBlocks; - if (result == NULL || startingOffset >= kAESBlockSize || - startingPatternOffset >= patternLength) { + if (result == NULL || startingOffset >= kAESBlockSize) { return wvcdm::UNKNOWN_ERROR; } @@ -379,10 +364,10 @@ CdmResponseType WVCryptoPlugin::countEncryptedBlocksInPatternedRange( size_t bytesNeededToCompleteABlock = kAESBlockSize - startingOffset; while (bytesRemaining >= bytesNeededToCompleteABlock) { bytesRemaining -= bytesNeededToCompleteABlock; - if (patternOffset < pattern.mEncryptBlocks) { + if (patternPosition < pattern.mEncryptBlocks) { ++blocksPassed; } - patternOffset = (patternOffset + 1) % patternLength; + patternPosition = (patternPosition + 1) % patternLength; // After the first block, we only concern ourselves with complete blocks. bytesNeededToCompleteABlock = kAESBlockSize;