diff --git a/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp b/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp index fb1c03db..9ebee74b 100644 --- a/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp +++ b/libwvdrmengine/oemcrypto/test/oemcrypto_test.cpp @@ -2492,6 +2492,7 @@ class OEMCryptoSessionTestsDecryptTests (size < AES_BLOCK_SIZE))) { memcpy(&(*out_buffer)[buffer_index], &in_buffer[buffer_index], size); + block_offset = 0; // Next block should be complete. } else { if (cipher_mode_ == OEMCrypto_CipherMode_CTR) { uint8_t aes_output[AES_BLOCK_SIZE]; @@ -2501,7 +2502,15 @@ class OEMCryptoSessionTestsDecryptTests aes_output[n + block_offset] ^ in_buffer[buffer_index + n]; } - ctr128_inc64(1, iv); + if (size + block_offset < AES_BLOCK_SIZE) { + // Partial block. Don't increment iv. Compute next block offset. + block_offset = block_offset + size; + } else { + EXPECT_EQ(AES_BLOCK_SIZE, block_offset + size); + // Full block. Increment iv, and set offset to 0 for next block. + ctr128_inc64(1, iv); + block_offset = 0; + } } else { uint8_t aes_input[AES_BLOCK_SIZE]; for (size_t n = 0; n < size; n++) { @@ -2509,13 +2518,12 @@ class OEMCryptoSessionTestsDecryptTests } AES_encrypt(aes_input, &(*out_buffer)[buffer_index], &aes_key); memcpy(iv, &(*out_buffer)[buffer_index], AES_BLOCK_SIZE); + // CBC mode should always start on block boundary. + block_offset = 0; } } buffer_index += size; - block_offset = 0; } - block_offset = - (block_offset + subsample_size_[i].encrypted_size) % AES_BLOCK_SIZE; } }