| 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/include/xfa_checksum.h" | 7 #include "xfa/fxfa/include/xfa_checksum.h" |
| 8 | 8 |
| 9 #include "core/fdrm/crypto/include/fx_crypt.h" | 9 #include "core/fdrm/crypto/include/fx_crypt.h" |
| 10 #include "xfa/fgas/crt/fgas_algorithm.h" | 10 |
| 11 namespace { |
| 12 |
| 13 struct FX_BASE64DATA { |
| 14 uint32_t data1 : 2; |
| 15 uint32_t data2 : 6; |
| 16 uint32_t data3 : 4; |
| 17 uint32_t data4 : 4; |
| 18 uint32_t data5 : 6; |
| 19 uint32_t data6 : 2; |
| 20 uint32_t data7 : 8; |
| 21 }; |
| 22 |
| 23 const FX_CHAR g_FXBase64EncoderMap[64] = { |
| 24 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', |
| 25 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', |
| 26 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', |
| 27 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', |
| 28 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', |
| 29 }; |
| 30 |
| 31 void Base64EncodePiece(const FX_BASE64DATA& src, |
| 32 int32_t iBytes, |
| 33 FX_CHAR dst[4]) { |
| 34 dst[0] = g_FXBase64EncoderMap[src.data2]; |
| 35 uint32_t b = src.data1 << 4; |
| 36 if (iBytes > 1) { |
| 37 b |= src.data4; |
| 38 } |
| 39 dst[1] = g_FXBase64EncoderMap[b]; |
| 40 if (iBytes > 1) { |
| 41 b = src.data3 << 2; |
| 42 if (iBytes > 2) { |
| 43 b |= src.data6; |
| 44 } |
| 45 dst[2] = g_FXBase64EncoderMap[b]; |
| 46 if (iBytes > 2) { |
| 47 dst[3] = g_FXBase64EncoderMap[src.data5]; |
| 48 } else { |
| 49 dst[3] = '='; |
| 50 } |
| 51 } else { |
| 52 dst[2] = dst[3] = '='; |
| 53 } |
| 54 } |
| 55 |
| 56 int32_t Base64EncodeA(const uint8_t* pSrc, int32_t iSrcLen, FX_CHAR* pDst) { |
| 57 ASSERT(pSrc != NULL); |
| 58 if (iSrcLen < 1) { |
| 59 return 0; |
| 60 } |
| 61 if (pDst == NULL) { |
| 62 int32_t iDstLen = iSrcLen / 3 * 4; |
| 63 if ((iSrcLen % 3) != 0) { |
| 64 iDstLen += 4; |
| 65 } |
| 66 return iDstLen; |
| 67 } |
| 68 FX_BASE64DATA srcData; |
| 69 int32_t iBytes = 3; |
| 70 FX_CHAR* pDstEnd = pDst; |
| 71 while (iSrcLen > 0) { |
| 72 if (iSrcLen > 2) { |
| 73 ((uint8_t*)&srcData)[0] = *pSrc++; |
| 74 ((uint8_t*)&srcData)[1] = *pSrc++; |
| 75 ((uint8_t*)&srcData)[2] = *pSrc++; |
| 76 iSrcLen -= 3; |
| 77 } else { |
| 78 *((uint32_t*)&srcData) = 0; |
| 79 ((uint8_t*)&srcData)[0] = *pSrc++; |
| 80 if (iSrcLen > 1) { |
| 81 ((uint8_t*)&srcData)[1] = *pSrc++; |
| 82 } |
| 83 iBytes = iSrcLen; |
| 84 iSrcLen = 0; |
| 85 } |
| 86 Base64EncodePiece(srcData, iBytes, pDstEnd); |
| 87 pDstEnd += 4; |
| 88 } |
| 89 return pDstEnd - pDst; |
| 90 } |
| 91 |
| 92 } // namespace |
| 11 | 93 |
| 12 CXFA_SAXReaderHandler::CXFA_SAXReaderHandler(CXFA_ChecksumContext* pContext) | 94 CXFA_SAXReaderHandler::CXFA_SAXReaderHandler(CXFA_ChecksumContext* pContext) |
| 13 : m_pContext(pContext) { | 95 : m_pContext(pContext) { |
| 14 ASSERT(m_pContext); | 96 ASSERT(m_pContext); |
| 15 } | 97 } |
| 16 CXFA_SAXReaderHandler::~CXFA_SAXReaderHandler() {} | 98 CXFA_SAXReaderHandler::~CXFA_SAXReaderHandler() {} |
| 17 void* CXFA_SAXReaderHandler::OnTagEnter(const CFX_ByteStringC& bsTagName, | 99 void* CXFA_SAXReaderHandler::OnTagEnter(const CFX_ByteStringC& bsTagName, |
| 18 FX_SAXNODE eType, | 100 FX_SAXNODE eType, |
| 19 uint32_t dwStartPos) { | 101 uint32_t dwStartPos) { |
| 20 UpdateChecksum(TRUE); | 102 UpdateChecksum(TRUE); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 return m_pSAXReader->ContinueParse(NULL) > 99; | 242 return m_pSAXReader->ContinueParse(NULL) > 99; |
| 161 } | 243 } |
| 162 | 244 |
| 163 void CXFA_ChecksumContext::FinishChecksum() { | 245 void CXFA_ChecksumContext::FinishChecksum() { |
| 164 delete m_pSAXReader; | 246 delete m_pSAXReader; |
| 165 m_pSAXReader = nullptr; | 247 m_pSAXReader = nullptr; |
| 166 if (m_pByteContext) { | 248 if (m_pByteContext) { |
| 167 uint8_t digest[20]; | 249 uint8_t digest[20]; |
| 168 FXSYS_memset(digest, 0, 20); | 250 FXSYS_memset(digest, 0, 20); |
| 169 CRYPT_SHA1Finish(m_pByteContext, digest); | 251 CRYPT_SHA1Finish(m_pByteContext, digest); |
| 170 int32_t nLen = FX_Base64EncodeA(digest, 20, NULL); | 252 int32_t nLen = Base64EncodeA(digest, 20, NULL); |
| 171 FX_CHAR* pBuffer = m_bsChecksum.GetBuffer(nLen); | 253 FX_CHAR* pBuffer = m_bsChecksum.GetBuffer(nLen); |
| 172 FX_Base64EncodeA(digest, 20, pBuffer); | 254 Base64EncodeA(digest, 20, pBuffer); |
| 173 m_bsChecksum.ReleaseBuffer(nLen); | 255 m_bsChecksum.ReleaseBuffer(nLen); |
| 174 FX_Free(m_pByteContext); | 256 FX_Free(m_pByteContext); |
| 175 m_pByteContext = NULL; | 257 m_pByteContext = NULL; |
| 176 } | 258 } |
| 177 } | 259 } |
| 178 | 260 |
| 179 CFX_ByteString CXFA_ChecksumContext::GetChecksum() const { | 261 CFX_ByteString CXFA_ChecksumContext::GetChecksum() const { |
| 180 return m_bsChecksum; | 262 return m_bsChecksum; |
| 181 } | 263 } |
| 182 | 264 |
| 183 void CXFA_ChecksumContext::Update(const CFX_ByteStringC& bsText) { | 265 void CXFA_ChecksumContext::Update(const CFX_ByteStringC& bsText) { |
| 184 if (m_pByteContext) { | 266 if (m_pByteContext) { |
| 185 CRYPT_SHA1Update(m_pByteContext, bsText.raw_str(), bsText.GetLength()); | 267 CRYPT_SHA1Update(m_pByteContext, bsText.raw_str(), bsText.GetLength()); |
| 186 } | 268 } |
| 187 } | 269 } |
| OLD | NEW |