| Index: core/fpdfapi/parser/cpdf_security_handler.cpp
|
| diff --git a/core/fpdfapi/parser/cpdf_security_handler.cpp b/core/fpdfapi/parser/cpdf_security_handler.cpp
|
| index 83fb6254bcde932334eab4008b007cac24292898..80a1f08f945d1a6fef9bbed9335af7528338620a 100644
|
| --- a/core/fpdfapi/parser/cpdf_security_handler.cpp
|
| +++ b/core/fpdfapi/parser/cpdf_security_handler.cpp
|
| @@ -349,41 +349,37 @@ FX_BOOL CPDF_SecurityHandler::AES256_CheckPassword(const uint8_t* password,
|
| CFX_ByteString ekey = m_pEncryptDict
|
| ? m_pEncryptDict->GetStringFor(bOwner ? "OE" : "UE")
|
| : CFX_ByteString();
|
| - if (ekey.GetLength() < 32) {
|
| + if (ekey.GetLength() < 32)
|
| return FALSE;
|
| - }
|
| - uint8_t* aes = FX_Alloc(uint8_t, 2048);
|
| - CRYPT_AESSetKey(aes, 16, digest, 32, FALSE);
|
| +
|
| + std::vector<uint8_t> aes(2048);
|
| + CRYPT_AESSetKey(aes.data(), 16, digest, 32, FALSE);
|
| uint8_t iv[16];
|
| FXSYS_memset(iv, 0, 16);
|
| - CRYPT_AESSetIV(aes, iv);
|
| - CRYPT_AESDecrypt(aes, key, ekey.raw_str(), 32);
|
| - CRYPT_AESSetKey(aes, 16, key, 32, FALSE);
|
| - CRYPT_AESSetIV(aes, iv);
|
| + CRYPT_AESSetIV(aes.data(), iv);
|
| + CRYPT_AESDecrypt(aes.data(), key, ekey.raw_str(), 32);
|
| + CRYPT_AESSetKey(aes.data(), 16, key, 32, FALSE);
|
| + CRYPT_AESSetIV(aes.data(), iv);
|
| CFX_ByteString perms = m_pEncryptDict->GetStringFor("Perms");
|
| - if (perms.IsEmpty()) {
|
| + if (perms.IsEmpty())
|
| return FALSE;
|
| - }
|
| +
|
| uint8_t perms_buf[16];
|
| FXSYS_memset(perms_buf, 0, sizeof(perms_buf));
|
| - uint32_t copy_len = sizeof(perms_buf);
|
| - if (copy_len > (uint32_t)perms.GetLength()) {
|
| - copy_len = perms.GetLength();
|
| - }
|
| + size_t copy_len =
|
| + std::min(sizeof(perms_buf), static_cast<size_t>(perms.GetLength()));
|
| FXSYS_memcpy(perms_buf, perms.raw_str(), copy_len);
|
| uint8_t buf[16];
|
| - CRYPT_AESDecrypt(aes, buf, perms_buf, 16);
|
| - FX_Free(aes);
|
| - if (buf[9] != 'a' || buf[10] != 'd' || buf[11] != 'b') {
|
| + CRYPT_AESDecrypt(aes.data(), buf, perms_buf, 16);
|
| + if (buf[9] != 'a' || buf[10] != 'd' || buf[11] != 'b')
|
| return FALSE;
|
| - }
|
| - if (FXDWORD_GET_LSBFIRST(buf) != m_Permissions) {
|
| +
|
| + if (FXDWORD_GET_LSBFIRST(buf) != m_Permissions)
|
| return FALSE;
|
| - }
|
| - if ((buf[8] == 'T' && !IsMetadataEncrypted()) ||
|
| - (buf[8] == 'F' && IsMetadataEncrypted())) {
|
| +
|
| + bool encrypted = IsMetadataEncrypted();
|
| + if ((buf[8] == 'T' && !encrypted) || (buf[8] == 'F' && encrypted))
|
| return FALSE;
|
| - }
|
| return TRUE;
|
| }
|
|
|
|
|