summaryrefslogtreecommitdiff
path: root/core/fpdfapi
diff options
context:
space:
mode:
Diffstat (limited to 'core/fpdfapi')
-rw-r--r--core/fpdfapi/edit/cpdf_creator.cpp30
-rw-r--r--core/fpdfapi/edit/cpdf_creator.h5
-rw-r--r--core/fpdfapi/parser/cpdf_parser.cpp19
-rw-r--r--core/fpdfapi/parser/cpdf_parser.h5
-rw-r--r--core/fpdfapi/parser/cpdf_security_handler.cpp5
-rw-r--r--core/fpdfapi/parser/cpdf_security_handler.h10
6 files changed, 45 insertions, 29 deletions
diff --git a/core/fpdfapi/edit/cpdf_creator.cpp b/core/fpdfapi/edit/cpdf_creator.cpp
index e176d85044..3fa6817957 100644
--- a/core/fpdfapi/edit/cpdf_creator.cpp
+++ b/core/fpdfapi/edit/cpdf_creator.cpp
@@ -145,7 +145,7 @@ CPDF_Creator::CPDF_Creator(CPDF_Document* pDoc,
m_bSecurityChanged(false),
m_pEncryptDict(m_pParser ? m_pParser->GetEncryptDict() : nullptr),
m_dwEncryptObjNum(0),
- m_pCryptoHandler(m_pParser ? m_pParser->GetCryptoHandler() : nullptr),
+ m_pSecurityHandler(m_pParser ? m_pParser->GetSecurityHandler() : nullptr),
m_pMetadata(nullptr),
m_dwLastObjNum(m_pDocument->GetLastObjNum()),
m_Archive(pdfium::MakeUnique<CFX_FileBufferArchive>(archive)),
@@ -196,7 +196,7 @@ bool CPDF_Creator::WriteIndirectObj(uint32_t objnum, const CPDF_Object* pObj) {
if (pObj->IsStream()) {
CPDF_CryptoHandler* pHandler =
- pObj != m_pMetadata ? m_pCryptoHandler.Get() : nullptr;
+ pObj != m_pMetadata ? GetCryptoHandler() : nullptr;
if (!WriteStream(pObj, objnum, pHandler))
return false;
} else if (!WriteDirectObj(objnum, pObj, true)) {
@@ -222,12 +222,12 @@ bool CPDF_Creator::WriteDirectObj(uint32_t objnum,
case CPDF_Object::STRING: {
ByteString str = pObj->GetString();
bool bHex = pObj->AsString()->IsHex();
- if (!m_pCryptoHandler || !bEncrypt) {
+ if (!GetCryptoHandler() || !bEncrypt) {
if (!pObj->WriteTo(m_Archive.get()))
return false;
break;
}
- CPDF_Encryptor encryptor(m_pCryptoHandler.Get(), objnum,
+ CPDF_Encryptor encryptor(GetCryptoHandler(), objnum,
(uint8_t*)str.c_str(), str.GetLength());
ByteString content = PDF_EncodeString(
ByteString(encryptor.GetData(), encryptor.GetSize()), bHex);
@@ -238,8 +238,8 @@ bool CPDF_Creator::WriteDirectObj(uint32_t objnum,
case CPDF_Object::STREAM: {
CPDF_FlateEncoder encoder(const_cast<CPDF_Stream*>(pObj->AsStream()),
true);
- CPDF_Encryptor encryptor(m_pCryptoHandler.Get(), objnum,
- encoder.GetData(), encoder.GetSize());
+ CPDF_Encryptor encryptor(GetCryptoHandler(), objnum, encoder.GetData(),
+ encoder.GetSize());
if (static_cast<uint32_t>(encoder.GetDict()->GetIntegerFor("Length")) !=
encryptor.GetSize()) {
encoder.CloneDict();
@@ -277,7 +277,7 @@ bool CPDF_Creator::WriteDirectObj(uint32_t objnum,
break;
}
case CPDF_Object::DICTIONARY: {
- if (!m_pCryptoHandler || pObj == m_pEncryptDict) {
+ if (!GetCryptoHandler() || pObj == m_pEncryptDict) {
if (!pObj->WriteTo(m_Archive.get()))
return false;
break;
@@ -804,11 +804,11 @@ void CPDF_Creator::InitID() {
if (m_pEncryptDict->GetStringFor("Filter") == "Standard") {
ByteString user_pass = m_pParser->GetPassword();
uint32_t flag = PDF_ENCRYPT_CONTENT;
- CPDF_SecurityHandler handler;
- handler.OnCreate(m_pEncryptDict.Get(), m_pIDArray.get(),
- user_pass.raw_str(), user_pass.GetLength(), flag);
- m_pCryptoHandler = pdfium::MakeUnique<CPDF_CryptoHandler>();
- m_pCryptoHandler->Init(m_pEncryptDict.Get(), &handler);
+ m_pSecurityHandler = pdfium::MakeUnique<CPDF_SecurityHandler>();
+ m_pSecurityHandler->OnCreate(m_pEncryptDict.Get(), m_pIDArray.get(),
+ user_pass.raw_str(), user_pass.GetLength(),
+ flag);
+ m_pSecurityHandler->InitCryptoHandler();
m_bSecurityChanged = true;
}
}
@@ -848,7 +848,11 @@ bool CPDF_Creator::SetFileVersion(int32_t fileVersion) {
}
void CPDF_Creator::RemoveSecurity() {
- m_pCryptoHandler.Reset();
+ m_pSecurityHandler.Reset();
m_bSecurityChanged = true;
m_pEncryptDict = nullptr;
}
+
+CPDF_CryptoHandler* CPDF_Creator::GetCryptoHandler() {
+ return m_pSecurityHandler ? m_pSecurityHandler->GetCryptoHandler() : nullptr;
+}
diff --git a/core/fpdfapi/edit/cpdf_creator.h b/core/fpdfapi/edit/cpdf_creator.h
index 4e8f9e8dbe..4c1d0f1800 100644
--- a/core/fpdfapi/edit/cpdf_creator.h
+++ b/core/fpdfapi/edit/cpdf_creator.h
@@ -18,6 +18,7 @@
class CPDF_Array;
class CPDF_CryptoHandler;
+class CPDF_SecurityHandler;
class CPDF_Dictionary;
class CPDF_Document;
class CPDF_Object;
@@ -41,7 +42,7 @@ class CPDF_Creator {
uint32_t GetNextObjectNumber() { return ++m_dwLastObjNum; }
uint32_t GetLastObjectNumber() const { return m_dwLastObjNum; }
- CPDF_CryptoHandler* GetCryptoHandler() { return m_pCryptoHandler.Get(); }
+ CPDF_CryptoHandler* GetCryptoHandler();
CPDF_Document* GetDocument() const { return m_pDocument.Get(); }
CPDF_Array* GetIDArray() const { return m_pIDArray.get(); }
CPDF_Dictionary* GetEncryptDict() const { return m_pEncryptDict.Get(); }
@@ -86,7 +87,7 @@ class CPDF_Creator {
bool m_bSecurityChanged;
UnownedPtr<CPDF_Dictionary> m_pEncryptDict;
uint32_t m_dwEncryptObjNum;
- fxcrt::MaybeOwned<CPDF_CryptoHandler> m_pCryptoHandler;
+ fxcrt::MaybeOwned<CPDF_SecurityHandler> m_pSecurityHandler;
UnownedPtr<CPDF_Object> m_pMetadata;
uint32_t m_dwLastObjNum;
std::unique_ptr<IFX_ArchiveStream> m_Archive;
diff --git a/core/fpdfapi/parser/cpdf_parser.cpp b/core/fpdfapi/parser/cpdf_parser.cpp
index 17f49c6324..a1b8a2deba 100644
--- a/core/fpdfapi/parser/cpdf_parser.cpp
+++ b/core/fpdfapi/parser/cpdf_parser.cpp
@@ -155,10 +155,6 @@ void CPDF_Parser::SetEncryptDictionary(CPDF_Dictionary* pDict) {
m_pEncryptDict = pDict;
}
-CPDF_CryptoHandler* CPDF_Parser::GetCryptoHandler() const {
- return m_pCryptoHandler.get();
-}
-
RetainPtr<IFX_SeekableReadStream> CPDF_Parser::GetFileAccess() const {
return m_pSyntax->GetFileAccess();
}
@@ -315,17 +311,15 @@ CPDF_Parser::Error CPDF_Parser::SetEncryptHandler() {
m_Password))
return PASSWORD_ERROR;
- m_pSecurityHandler = std::move(pSecurityHandler);
- auto pCryptoHandler = pdfium::MakeUnique<CPDF_CryptoHandler>();
- if (!pCryptoHandler->Init(m_pEncryptDict.Get(), m_pSecurityHandler.get()))
+ if (!pSecurityHandler->InitCryptoHandler())
return HANDLER_ERROR;
- m_pCryptoHandler = std::move(pCryptoHandler);
+
+ m_pSecurityHandler = std::move(pSecurityHandler);
}
return SUCCESS;
}
void CPDF_Parser::ReleaseEncryptHandler() {
- m_pCryptoHandler.reset();
m_pSecurityHandler.reset();
SetEncryptDictionary(nullptr);
}
@@ -1276,9 +1270,12 @@ std::unique_ptr<CPDF_Object> CPDF_Parser::ParseIndirectObjectAtInternal(
if (result && objnum && result->GetObjNum() != objnum)
return nullptr;
- const bool should_decrypt = m_pCryptoHandler && objnum != m_MetadataObjnum;
+ const bool should_decrypt = m_pSecurityHandler &&
+ m_pSecurityHandler->GetCryptoHandler() &&
+ objnum != m_MetadataObjnum;
if (should_decrypt)
- result = m_pCryptoHandler->DecryptObjectTree(std::move(result));
+ result = m_pSecurityHandler->GetCryptoHandler()->DecryptObjectTree(
+ std::move(result));
return result;
}
diff --git a/core/fpdfapi/parser/cpdf_parser.h b/core/fpdfapi/parser/cpdf_parser.h
index 0c7d29f728..2dee1ab9e1 100644
--- a/core/fpdfapi/parser/cpdf_parser.h
+++ b/core/fpdfapi/parser/cpdf_parser.h
@@ -76,7 +76,9 @@ class CPDF_Parser {
FX_FILESIZE GetObjectPositionOrZero(uint32_t objnum) const;
uint16_t GetObjectGenNum(uint32_t objnum) const;
bool IsObjectFreeOrNull(uint32_t objnum) const;
- CPDF_CryptoHandler* GetCryptoHandler() const;
+ CPDF_SecurityHandler* GetSecurityHandler() const {
+ return m_pSecurityHandler.get();
+ }
RetainPtr<IFX_SeekableReadStream> GetFileAccess() const;
bool IsObjectFree(uint32_t objnum) const;
@@ -221,7 +223,6 @@ class CPDF_Parser {
// All indirect object numbers that are being parsed.
std::set<uint32_t> m_ParsingObjNums;
- std::unique_ptr<CPDF_CryptoHandler> m_pCryptoHandler;
uint32_t m_MetadataObjnum = 0;
};
diff --git a/core/fpdfapi/parser/cpdf_security_handler.cpp b/core/fpdfapi/parser/cpdf_security_handler.cpp
index dce2ac4fdc..03c15458a9 100644
--- a/core/fpdfapi/parser/cpdf_security_handler.cpp
+++ b/core/fpdfapi/parser/cpdf_security_handler.cpp
@@ -706,3 +706,8 @@ void CPDF_SecurityHandler::AES256_SetPerms(CPDF_Dictionary* pEncryptDict,
CRYPT_AESEncrypt(&aes, buf1, buf, 16);
pEncryptDict->SetNewFor<CPDF_String>("Perms", ByteString(buf1, 16), false);
}
+
+bool CPDF_SecurityHandler::InitCryptoHandler() {
+ m_pCryptoHandler = pdfium::MakeUnique<CPDF_CryptoHandler>();
+ return m_pCryptoHandler->Init(m_pEncryptDict.Get(), this);
+}
diff --git a/core/fpdfapi/parser/cpdf_security_handler.h b/core/fpdfapi/parser/cpdf_security_handler.h
index 8b55fa21a7..c03d97c411 100644
--- a/core/fpdfapi/parser/cpdf_security_handler.h
+++ b/core/fpdfapi/parser/cpdf_security_handler.h
@@ -7,7 +7,8 @@
#ifndef CORE_FPDFAPI_PARSER_CPDF_SECURITY_HANDLER_H_
#define CORE_FPDFAPI_PARSER_CPDF_SECURITY_HANDLER_H_
-#include "core/fpdfapi/parser/cpdf_crypto_handler.h"
+#include <memory>
+
#include "core/fxcrt/fx_string.h"
#include "core/fxcrt/fx_system.h"
@@ -19,6 +20,7 @@
#define PDF_ENCRYPT_CONTENT 0
class CPDF_Array;
+class CPDF_CryptoHandler;
class CPDF_Dictionary;
class CPDF_Parser;
@@ -57,6 +59,11 @@ class CPDF_SecurityHandler {
uint8_t* key,
int key_len);
+ bool InitCryptoHandler();
+ CPDF_CryptoHandler* GetCryptoHandler() const {
+ return m_pCryptoHandler.get();
+ }
+
private:
bool LoadDict(CPDF_Dictionary* pEncryptDict);
bool LoadDict(CPDF_Dictionary* pEncryptDict,
@@ -107,6 +114,7 @@ class CPDF_SecurityHandler {
uint8_t m_EncryptKey[32];
int m_KeyLen;
bool m_bOwnerUnlocked;
+ std::unique_ptr<CPDF_CryptoHandler> m_pCryptoHandler;
};
#endif // CORE_FPDFAPI_PARSER_CPDF_SECURITY_HANDLER_H_