Simplify CPDF_SecurityHandler code.

- Remove parameters that always pass the same member variables.
- Use curly brace initialization instead of memset().
- Use sizeof() in more places instead of hard coded sizes.
- Consistently treat /EncryptMetadata as a boolean.

Change-Id: I8f61e9470f105feda289cc1f3772ced844ce678e
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/63975
Commit-Queue: Lei Zhang <thestig@chromium.org>
Reviewed-by: Tom Sepez <tsepez@chromium.org>
diff --git a/core/fpdfapi/parser/cpdf_security_handler.cpp b/core/fpdfapi/parser/cpdf_security_handler.cpp
index 0c98bfb..cb0bd2b 100644
--- a/core/fpdfapi/parser/cpdf_security_handler.cpp
+++ b/core/fpdfapi/parser/cpdf_security_handler.cpp
@@ -51,7 +51,7 @@
   if (!fileId.IsEmpty())
     CRYPT_MD5Update(&md5, (uint8_t*)fileId.c_str(), fileId.GetLength());
   if (!bIgnoreMeta && revision >= 3 &&
-      !pEncrypt->GetIntegerFor("EncryptMetadata", 1)) {
+      !pEncrypt->GetBooleanFor("EncryptMetadata", true)) {
     uint32_t tag = 0xFFFFFFFF;
     CRYPT_MD5Update(&md5, (uint8_t*)&tag, 4);
   }
@@ -258,8 +258,7 @@
   std::vector<uint8_t> interDigest;
   int i = 0;
   int iBlockSize = 32;
-  CRYPT_aes_context aes;
-  memset(&aes, 0, sizeof(aes));
+  CRYPT_aes_context aes = {};
   while (i < 64 || i < E[iBufLen - 1] + 32) {
     int iRoundSize = password.GetLength() + iBlockSize;
     if (vector) {
@@ -358,13 +357,12 @@
   if (ekey.GetLength() < 32)
     return false;
 
-  CRYPT_aes_context aes;
-  memset(&aes, 0, sizeof(aes));
-  CRYPT_AESSetKey(&aes, digest, 32, false);
+  CRYPT_aes_context aes = {};
+  CRYPT_AESSetKey(&aes, digest, sizeof(digest), false);
   uint8_t iv[16] = {};
   CRYPT_AESSetIV(&aes, iv);
   CRYPT_AESDecrypt(&aes, m_EncryptKey, ekey.raw_str(), 32);
-  CRYPT_AESSetKey(&aes, m_EncryptKey, 32, false);
+  CRYPT_AESSetKey(&aes, m_EncryptKey, sizeof(m_EncryptKey), false);
   CRYPT_AESSetIV(&aes, iv);
   ByteString perms = m_pEncryptDict->GetStringFor("Perms");
   if (perms.IsEmpty())
@@ -558,12 +556,10 @@
     CRYPT_SHA256Update(&sha, reinterpret_cast<uint8_t*>(random),
                        sizeof(random));
     CRYPT_SHA256Finish(&sha, m_EncryptKey);
-    AES256_SetPassword(pEncryptDict, user_password, false, m_EncryptKey);
+    AES256_SetPassword(pEncryptDict, user_password, false);
     if (bDefault)
-      AES256_SetPassword(pEncryptDict, owner_password_copy, true, m_EncryptKey);
-    AES256_SetPerms(pEncryptDict, m_Permissions,
-                    pEncryptDict->GetBooleanFor("EncryptMetadata", true),
-                    m_EncryptKey);
+      AES256_SetPassword(pEncryptDict, owner_password_copy, true);
+    AES256_SetPerms(pEncryptDict);
     return;
   }
   if (bDefault) {
@@ -648,11 +644,10 @@
 
 void CPDF_SecurityHandler::AES256_SetPassword(CPDF_Dictionary* pEncryptDict,
                                               const ByteString& password,
-                                              bool bOwner,
-                                              const uint8_t* key) {
+                                              bool bOwner) {
   CRYPT_sha1_context sha;
   CRYPT_SHA1Start(&sha);
-  CRYPT_SHA1Update(&sha, key, 32);
+  CRYPT_SHA1Update(&sha, m_EncryptKey, sizeof(m_EncryptKey));
   CRYPT_SHA1Update(&sha, (uint8_t*)"hello", 5);
 
   uint8_t digest[20];
@@ -688,30 +683,26 @@
     }
     CRYPT_SHA256Finish(&sha2, digest1);
   }
-  CRYPT_aes_context aes;
-  memset(&aes, 0, sizeof(aes));
+  CRYPT_aes_context aes = {};
   CRYPT_AESSetKey(&aes, digest1, 32, true);
   uint8_t iv[16] = {};
   CRYPT_AESSetIV(&aes, iv);
-  CRYPT_AESEncrypt(&aes, digest1, key, 32);
+  CRYPT_AESEncrypt(&aes, digest1, m_EncryptKey, sizeof(m_EncryptKey));
   pEncryptDict->SetNewFor<CPDF_String>(bOwner ? "OE" : "UE",
                                        ByteString(digest1, 32), false);
 }
 
-void CPDF_SecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict,
-                                           uint32_t permissions,
-                                           bool bEncryptMetadata,
-                                           const uint8_t* key) {
+void CPDF_SecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict) {
   uint8_t buf[16];
-  buf[0] = (uint8_t)permissions;
-  buf[1] = (uint8_t)(permissions >> 8);
-  buf[2] = (uint8_t)(permissions >> 16);
-  buf[3] = (uint8_t)(permissions >> 24);
+  buf[0] = static_cast<uint8_t>(m_Permissions);
+  buf[1] = static_cast<uint8_t>(m_Permissions >> 8);
+  buf[2] = static_cast<uint8_t>(m_Permissions >> 16);
+  buf[3] = static_cast<uint8_t>(m_Permissions >> 24);
   buf[4] = 0xff;
   buf[5] = 0xff;
   buf[6] = 0xff;
   buf[7] = 0xff;
-  buf[8] = bEncryptMetadata ? 'T' : 'F';
+  buf[8] = pEncryptDict->GetBooleanFor("EncryptMetadata", true) ? 'T' : 'F';
   buf[9] = 'a';
   buf[10] = 'd';
   buf[11] = 'b';
@@ -721,9 +712,8 @@
   uint32_t* buf_random = reinterpret_cast<uint32_t*>(&buf[12]);
   FX_Random_GenerateMT(buf_random, 1);
 
-  CRYPT_aes_context aes;
-  memset(&aes, 0, sizeof(aes));
-  CRYPT_AESSetKey(&aes, key, 32, true);
+  CRYPT_aes_context aes = {};
+  CRYPT_AESSetKey(&aes, m_EncryptKey, sizeof(m_EncryptKey), true);
 
   uint8_t iv[16] = {};
   CRYPT_AESSetIV(&aes, iv);
diff --git a/core/fpdfapi/parser/cpdf_security_handler.h b/core/fpdfapi/parser/cpdf_security_handler.h
index ee69283..05eb689 100644
--- a/core/fpdfapi/parser/cpdf_security_handler.h
+++ b/core/fpdfapi/parser/cpdf_security_handler.h
@@ -74,12 +74,8 @@
   bool AES256_CheckPassword(const ByteString& password, bool bOwner);
   void AES256_SetPassword(CPDF_Dictionary* pEncryptDict,
                           const ByteString& password,
-                          bool bOwner,
-                          const uint8_t* key);
-  void AES256_SetPerms(CPDF_Dictionary* pEncryptDict,
-                       uint32_t permission,
-                       bool bEncryptMetadata,
-                       const uint8_t* key);
+                          bool bOwner);
+  void AES256_SetPerms(CPDF_Dictionary* pEncryptDict);
   void OnCreateInternal(CPDF_Dictionary* pEncryptDict,
                         const CPDF_Array* pIdArray,
                         const ByteString& user_password,