Add level 3 libs and address build warnings
* Fix strict aliasing error in gcc [ Merge of http://go/wvgerrit/15856 ] This also ensures the alignment of 64-bit memory access in a portable way, without using compiler-specific mechanisms like attributes or platform-specific mechanisms like memalign. (The aliasing error does not show up in clang.) * Return kNotSupported for non-Widevine init data [ Merge of http://go/wvgerrit/15853 ] This also improves logging for the init data parser by including a verbose message for non-Widevine PSSHs and by using a new IsEOF() method to avoid misleading "Unable to read atom size" logs. * Cast RSA_size() to int [ Merge of http://go/wvgerrit/15880 ] It has been suggested that this may be unsigned on some versions of OpenSSL or BoringSSL. * Be strict about warnings for CE CDM [ Merge of http://go/wvgerrit/15831 ] * Enable all warnings and treat warnings as errors in the CE build. * Fix all existing warnings (mostly unused variables, consts, and functions, and one signed/unsigned comparison). * Exclude protobuf warnings rather than maintain a divergent copy. * Fix release build errors [ Merge of http://go/wvgerrit/15855 ] * Level 3 Build With Android Emulator [ Merge of http://go/wvgerrit/15778 ] This CL rebuilds the level 3 libraries with the android emulator sdk_phone_*. This seems to avoid problems with the x86 build using incorrect compiler flags. These libraries work for arm, x86, mips, arm64, and x86_64. The level 3 library is disabled for mips64. Versions: level3/mips/libwvlevel3.a Level3 Library Sep 30 2015 18:29:50 level3/arm/libwvlevel3.a Level3 Library Sep 28 2015 13:18:25 level3/x86/libwvlevel3.a Level3 Library Sep 28 2015 13:08:28 Change-Id: I1e50aa78bdc84ecb905f2e55297d4f48b140341c
This commit is contained in:
@@ -1369,8 +1369,14 @@ OEMCryptoResult SessionContext::DecryptCTR(
|
||||
}
|
||||
|
||||
// Local copy (will be modified).
|
||||
uint8_t aes_iv[AES_BLOCK_SIZE];
|
||||
memcpy(aes_iv, &iv[0], AES_BLOCK_SIZE);
|
||||
// Allocated as 64-bit ints to enforce 64-bit alignment for later access as a
|
||||
// 64-bit value.
|
||||
uint64_t aes_iv[2];
|
||||
assert(sizeof(aes_iv) == AES_BLOCK_SIZE);
|
||||
// The double-cast is needed to comply with strict aliasing rules.
|
||||
uint8_t *aes_iv_u8 =
|
||||
reinterpret_cast<uint8_t*>(reinterpret_cast<void*>(aes_iv));
|
||||
memcpy(aes_iv_u8, &iv[0], AES_BLOCK_SIZE);
|
||||
|
||||
// The CENC spec specifies we increment only the low 64 bits of the IV
|
||||
// counter, and leave the high 64 bits alone. This is different from the
|
||||
@@ -1387,12 +1393,12 @@ OEMCryptoResult SessionContext::DecryptCTR(
|
||||
LOGE("[DecryptCTR(): FAILURE]");
|
||||
return OEMCrypto_ERROR_DECRYPT_FAILED;
|
||||
}
|
||||
AES_encrypt(aes_iv, ecount_buf, &aes_key);
|
||||
AES_encrypt(aes_iv_u8, ecount_buf, &aes_key);
|
||||
for (int n = block_offset; n < AES_BLOCK_SIZE && l < cipher_data_length;
|
||||
++n, ++l) {
|
||||
clear_data[l] = cipher_data[l] ^ ecount_buf[n];
|
||||
}
|
||||
ctr128_inc64(aes_iv);
|
||||
ctr128_inc64(aes_iv_u8);
|
||||
block_offset = 0;
|
||||
}
|
||||
|
||||
@@ -1403,7 +1409,7 @@ OEMCryptoResult SessionContext::DecryptCTR(
|
||||
EVP_CIPHER_CTX ctx;
|
||||
EVP_CIPHER_CTX_init(&ctx);
|
||||
EVP_CIPHER_CTX_set_padding(&ctx, 0);
|
||||
if (!EVP_DecryptInit_ex(&ctx, EVP_aes_128_ctr(), NULL, key_u8, aes_iv)) {
|
||||
if (!EVP_DecryptInit_ex(&ctx, EVP_aes_128_ctr(), NULL, key_u8, aes_iv_u8)) {
|
||||
LOGE("[DecryptCTR(): EVP_INIT ERROR]");
|
||||
return OEMCrypto_ERROR_DECRYPT_FAILED;
|
||||
}
|
||||
@@ -1412,9 +1418,9 @@ OEMCryptoResult SessionContext::DecryptCTR(
|
||||
// value is 0xFF the counter is near wrapping. In this case we calculate
|
||||
// the number of bytes we can safely decrypt before the counter wraps.
|
||||
uint64_t decrypt_length = 0;
|
||||
if (aes_iv[8] == 0xFF) {
|
||||
uint64_t bytes_before_iv_wrap = (~wvcdm::ntohll64(
|
||||
*reinterpret_cast<uint64_t*>(&aes_iv[8])) + 1) * AES_BLOCK_SIZE;
|
||||
if (aes_iv_u8[8] == 0xFF) {
|
||||
uint64_t bottom_64_bits = wvcdm::ntohll64(aes_iv[1]);
|
||||
uint64_t bytes_before_iv_wrap = (~bottom_64_bits + 1) * AES_BLOCK_SIZE;
|
||||
decrypt_length =
|
||||
bytes_before_iv_wrap < remaining ? bytes_before_iv_wrap : remaining;
|
||||
} else {
|
||||
@@ -1439,8 +1445,8 @@ OEMCryptoResult SessionContext::DecryptCTR(
|
||||
|
||||
// If remaining is not zero, reset the iv before the second pass.
|
||||
if (remaining) {
|
||||
memcpy(aes_iv, &iv[0], AES_BLOCK_SIZE);
|
||||
memset(&aes_iv[8], 0, AES_BLOCK_SIZE / 2);
|
||||
memcpy(aes_iv_u8, &iv[0], AES_BLOCK_SIZE);
|
||||
memset(&aes_iv_u8[8], 0, AES_BLOCK_SIZE / 2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user