1// Copyright 2014 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 XFA_FXFA_XFA_CHECKSUM_H_
8#define XFA_FXFA_XFA_CHECKSUM_H_
9
10#include <memory>
11
12#include "core/fdrm/crypto/fx_crypt.h"
13#include "xfa/fde/xml/cfx_saxreader.h"
14#include "xfa/fxfa/fxfa.h"
15
16class CXFA_SAXReaderHandler;
17class CXFA_ChecksumContext;
18
19class CXFA_SAXContext {
20 public:
21  CXFA_SAXContext() : m_eNode(CFX_SAXItem::Type::Unknown) {}
22
23  CFX_ByteTextBuf m_TextBuf;
24  CFX_ByteString m_bsTagName;
25  CFX_SAXItem::Type m_eNode;
26};
27
28class CXFA_SAXReaderHandler {
29 public:
30  explicit CXFA_SAXReaderHandler(CXFA_ChecksumContext* pContext);
31  ~CXFA_SAXReaderHandler();
32
33  CXFA_SAXContext* OnTagEnter(const CFX_ByteStringC& bsTagName,
34                              CFX_SAXItem::Type eType,
35                              uint32_t dwStartPos);
36  void OnTagAttribute(CXFA_SAXContext* pTag,
37                      const CFX_ByteStringC& bsAttri,
38                      const CFX_ByteStringC& bsValue);
39  void OnTagBreak(CXFA_SAXContext* pTag);
40  void OnTagData(CXFA_SAXContext* pTag,
41                 CFX_SAXItem::Type eType,
42                 const CFX_ByteStringC& bsData,
43                 uint32_t dwStartPos);
44  void OnTagClose(CXFA_SAXContext* pTag, uint32_t dwEndPos);
45  void OnTagEnd(CXFA_SAXContext* pTag,
46                const CFX_ByteStringC& bsTagName,
47                uint32_t dwEndPos);
48
49  void OnTargetData(CXFA_SAXContext* pTag,
50                    CFX_SAXItem::Type eType,
51                    const CFX_ByteStringC& bsData,
52                    uint32_t dwStartPos);
53
54 protected:
55  void UpdateChecksum(bool bCheckSpace);
56
57  CXFA_ChecksumContext* m_pContext;
58  CXFA_SAXContext m_SAXContext;
59};
60
61class CXFA_ChecksumContext {
62 public:
63  CXFA_ChecksumContext();
64  ~CXFA_ChecksumContext();
65
66  void StartChecksum();
67  void Update(const CFX_ByteStringC& bsText);
68  bool UpdateChecksum(const CFX_RetainPtr<IFX_SeekableReadStream>& pSrcFile,
69                      FX_FILESIZE offset = 0,
70                      size_t size = 0);
71  void FinishChecksum();
72  CFX_ByteString GetChecksum() const;
73
74 protected:
75  std::unique_ptr<CFX_SAXReader> m_pSAXReader;
76  std::unique_ptr<CRYPT_sha1_context> m_pByteContext;
77  CFX_ByteString m_bsChecksum;
78};
79
80#endif  // XFA_FXFA_XFA_CHECKSUM_H_
81