OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "xfa/fxfa/xfa_checksum.h" | 7 #include "xfa/fxfa/xfa_checksum.h" |
8 | 8 |
9 #include "core/fdrm/crypto/fx_crypt.h" | 9 #include "core/fdrm/crypto/fx_crypt.h" |
| 10 #include "third_party/base/ptr_util.h" |
10 | 11 |
11 namespace { | 12 namespace { |
12 | 13 |
13 struct FX_BASE64DATA { | 14 struct FX_BASE64DATA { |
14 uint32_t data1 : 2; | 15 uint32_t data1 : 2; |
15 uint32_t data2 : 6; | 16 uint32_t data2 : 6; |
16 uint32_t data3 : 4; | 17 uint32_t data3 : 4; |
17 uint32_t data4 : 4; | 18 uint32_t data4 : 4; |
18 uint32_t data5 : 6; | 19 uint32_t data5 : 6; |
19 uint32_t data6 : 2; | 20 uint32_t data6 : 2; |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
203 break; | 204 break; |
204 } | 205 } |
205 } | 206 } |
206 } | 207 } |
207 if (bUpdata) { | 208 if (bUpdata) { |
208 m_pContext->Update(CFX_ByteStringC(pBuffer, iLength)); | 209 m_pContext->Update(CFX_ByteStringC(pBuffer, iLength)); |
209 } | 210 } |
210 m_SAXContext.m_TextBuf.Clear(); | 211 m_SAXContext.m_TextBuf.Clear(); |
211 } | 212 } |
212 | 213 |
213 CXFA_ChecksumContext::CXFA_ChecksumContext() | 214 CXFA_ChecksumContext::CXFA_ChecksumContext() {} |
214 : m_pSAXReader(nullptr), m_pByteContext(nullptr) {} | |
215 | 215 |
216 CXFA_ChecksumContext::~CXFA_ChecksumContext() { | 216 CXFA_ChecksumContext::~CXFA_ChecksumContext() {} |
217 FinishChecksum(); | |
218 } | |
219 | 217 |
220 void CXFA_ChecksumContext::StartChecksum() { | 218 void CXFA_ChecksumContext::StartChecksum() { |
221 FinishChecksum(); | 219 FinishChecksum(); |
222 m_pByteContext = FX_Alloc(CRYPT_sha1_context, 1); | 220 m_pByteContext = pdfium::MakeUnique<CRYPT_sha1_context>(); |
223 CRYPT_SHA1Start(m_pByteContext); | 221 CRYPT_SHA1Start(m_pByteContext.get()); |
224 m_bsChecksum.clear(); | 222 m_bsChecksum.clear(); |
225 m_pSAXReader = new CFX_SAXReader; | 223 m_pSAXReader = pdfium::MakeUnique<CFX_SAXReader>(); |
226 } | 224 } |
227 | 225 |
228 bool CXFA_ChecksumContext::UpdateChecksum( | 226 bool CXFA_ChecksumContext::UpdateChecksum( |
229 const CFX_RetainPtr<IFX_SeekableReadStream>& pSrcFile, | 227 const CFX_RetainPtr<IFX_SeekableReadStream>& pSrcFile, |
230 FX_FILESIZE offset, | 228 FX_FILESIZE offset, |
231 size_t size) { | 229 size_t size) { |
232 if (!m_pSAXReader || !pSrcFile) | 230 if (!m_pSAXReader || !pSrcFile) |
233 return false; | 231 return false; |
234 | 232 |
235 if (size < 1) | 233 if (size < 1) |
236 size = pSrcFile->GetSize(); | 234 size = pSrcFile->GetSize(); |
237 | 235 |
238 CXFA_SAXReaderHandler handler(this); | 236 CXFA_SAXReaderHandler handler(this); |
239 m_pSAXReader->SetHandler(&handler); | 237 m_pSAXReader->SetHandler(&handler); |
240 if (m_pSAXReader->StartParse( | 238 if (m_pSAXReader->StartParse( |
241 pSrcFile, (uint32_t)offset, (uint32_t)size, | 239 pSrcFile, (uint32_t)offset, (uint32_t)size, |
242 CFX_SaxParseMode_NotSkipSpace | CFX_SaxParseMode_NotConvert_amp | | 240 CFX_SaxParseMode_NotSkipSpace | CFX_SaxParseMode_NotConvert_amp | |
243 CFX_SaxParseMode_NotConvert_lt | CFX_SaxParseMode_NotConvert_gt | | 241 CFX_SaxParseMode_NotConvert_lt | CFX_SaxParseMode_NotConvert_gt | |
244 CFX_SaxParseMode_NotConvert_sharp) < 0) { | 242 CFX_SaxParseMode_NotConvert_sharp) < 0) { |
245 return false; | 243 return false; |
246 } | 244 } |
247 return m_pSAXReader->ContinueParse(nullptr) > 99; | 245 return m_pSAXReader->ContinueParse(nullptr) > 99; |
248 } | 246 } |
249 | 247 |
250 void CXFA_ChecksumContext::FinishChecksum() { | 248 void CXFA_ChecksumContext::FinishChecksum() { |
251 delete m_pSAXReader; | 249 m_pSAXReader.reset(); |
252 m_pSAXReader = nullptr; | |
253 if (m_pByteContext) { | 250 if (m_pByteContext) { |
254 uint8_t digest[20]; | 251 uint8_t digest[20]; |
255 FXSYS_memset(digest, 0, 20); | 252 FXSYS_memset(digest, 0, 20); |
256 CRYPT_SHA1Finish(m_pByteContext, digest); | 253 CRYPT_SHA1Finish(m_pByteContext.get(), digest); |
257 int32_t nLen = Base64EncodeA(digest, 20, nullptr); | 254 int32_t nLen = Base64EncodeA(digest, 20, nullptr); |
258 FX_CHAR* pBuffer = m_bsChecksum.GetBuffer(nLen); | 255 FX_CHAR* pBuffer = m_bsChecksum.GetBuffer(nLen); |
259 Base64EncodeA(digest, 20, pBuffer); | 256 Base64EncodeA(digest, 20, pBuffer); |
260 m_bsChecksum.ReleaseBuffer(nLen); | 257 m_bsChecksum.ReleaseBuffer(nLen); |
261 FX_Free(m_pByteContext); | 258 m_pByteContext.reset(); |
262 m_pByteContext = nullptr; | |
263 } | 259 } |
264 } | 260 } |
265 | 261 |
266 CFX_ByteString CXFA_ChecksumContext::GetChecksum() const { | 262 CFX_ByteString CXFA_ChecksumContext::GetChecksum() const { |
267 return m_bsChecksum; | 263 return m_bsChecksum; |
268 } | 264 } |
269 | 265 |
270 void CXFA_ChecksumContext::Update(const CFX_ByteStringC& bsText) { | 266 void CXFA_ChecksumContext::Update(const CFX_ByteStringC& bsText) { |
271 if (m_pByteContext) { | 267 if (!m_pByteContext) |
272 CRYPT_SHA1Update(m_pByteContext, bsText.raw_str(), bsText.GetLength()); | 268 return; |
273 } | 269 |
| 270 CRYPT_SHA1Update(m_pByteContext.get(), bsText.raw_str(), bsText.GetLength()); |
274 } | 271 } |
OLD | NEW |