• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2016 PDFium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
6 
7 #ifndef CORE_FPDFAPI_PARSER_CPDF_SECURITY_HANDLER_H_
8 #define CORE_FPDFAPI_PARSER_CPDF_SECURITY_HANDLER_H_
9 
10 #include <memory>
11 
12 #include "core/fxcrt/fx_string.h"
13 #include "core/fxcrt/fx_system.h"
14 
15 #define FXCIPHER_NONE 0
16 #define FXCIPHER_RC4 1
17 #define FXCIPHER_AES 2
18 #define FXCIPHER_AES2 3
19 
20 class CPDF_Array;
21 class CPDF_CryptoHandler;
22 class CPDF_Dictionary;
23 class CPDF_Parser;
24 
25 class CPDF_SecurityHandler {
26  public:
27   CPDF_SecurityHandler();
28   ~CPDF_SecurityHandler();
29 
30   bool OnInit(const CPDF_Dictionary* pEncryptDict,
31               const CPDF_Array* pIdArray,
32               const ByteString& password);
33   void OnCreate(CPDF_Dictionary* pEncryptDict,
34                 const CPDF_Array* pIdArray,
35                 const ByteString& user_password,
36                 const ByteString& owner_password);
37   void OnCreate(CPDF_Dictionary* pEncryptDict,
38                 const CPDF_Array* pIdArray,
39                 const ByteString& user_password);
40 
41   uint32_t GetPermissions() const;
42   bool IsMetadataEncrypted() const;
43 
44   ByteString GetUserPassword(const ByteString& owner_password,
45                              int32_t key_len) const;
46   bool CheckPassword(const ByteString& user_password,
47                      bool bOwner,
48                      uint8_t* key,
49                      int key_len);
50 
GetCryptoHandler()51   CPDF_CryptoHandler* GetCryptoHandler() const {
52     return m_pCryptoHandler.get();
53   }
54 
55  private:
56   bool LoadDict(const CPDF_Dictionary* pEncryptDict);
57   bool LoadDict(const CPDF_Dictionary* pEncryptDict,
58                 int& cipher,
59                 int& key_len);
60 
61   bool CheckUserPassword(const ByteString& password,
62                          bool bIgnoreEncryptMeta,
63                          uint8_t* key,
64                          int32_t key_len);
65 
66   bool CheckOwnerPassword(const ByteString& password,
67                           uint8_t* key,
68                           int32_t key_len);
69   bool AES256_CheckPassword(const ByteString& password,
70                             bool bOwner,
71                             uint8_t* key);
72   void AES256_SetPassword(CPDF_Dictionary* pEncryptDict,
73                           const ByteString& password,
74                           bool bOwner,
75                           const uint8_t* key);
76   void AES256_SetPerms(CPDF_Dictionary* pEncryptDict,
77                        uint32_t permission,
78                        bool bEncryptMetadata,
79                        const uint8_t* key);
80   void OnCreateInternal(CPDF_Dictionary* pEncryptDict,
81                         const CPDF_Array* pIdArray,
82                         const ByteString& user_password,
83                         const ByteString& owner_password,
84                         bool bDefault);
85   bool CheckSecurity(const ByteString& password);
86 
87   void InitCryptoHandler();
88 
89   int m_Version;
90   int m_Revision;
91   UnownedPtr<const CPDF_Dictionary> m_pEncryptDict;
92   ByteString m_FileId;
93   uint32_t m_Permissions;
94   int m_Cipher;
95   uint8_t m_EncryptKey[32];
96   int m_KeyLen;
97   bool m_bOwnerUnlocked;
98   std::unique_ptr<CPDF_CryptoHandler> m_pCryptoHandler;
99 };
100 
101 #endif  // CORE_FPDFAPI_PARSER_CPDF_SECURITY_HANDLER_H_
102