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