bool CPDF_CryptoHandler::CryptStream(void* context, const uint8_t* src_buf, uint32_t src_size, CFX_BinaryBuf& dest_buf, bool bEncrypt) { if (!context) { return false; } if (m_Cipher == FXCIPHER_NONE) { dest_buf.AppendBlock(src_buf, src_size); return true; } if (m_Cipher == FXCIPHER_RC4) { int old_size = dest_buf.GetSize(); dest_buf.AppendBlock(src_buf, src_size); CRYPT_ArcFourCrypt(reinterpret_cast<CRYPT_rc4_context*>(context), dest_buf.GetBuffer() + old_size, src_size); return true; } AESCryptContext* pContext = reinterpret_cast<AESCryptContext*>(context); if (pContext->m_bIV && bEncrypt) { dest_buf.AppendBlock(pContext->m_Block, 16); pContext->m_bIV = false; } uint32_t src_off = 0; uint32_t src_left = src_size; while (1) { uint32_t copy_size = 16 - pContext->m_BlockOffset; if (copy_size > src_left) { copy_size = src_left; } FXSYS_memcpy(pContext->m_Block + pContext->m_BlockOffset, src_buf + src_off, copy_size); src_off += copy_size; src_left -= copy_size; pContext->m_BlockOffset += copy_size; if (pContext->m_BlockOffset == 16) { if (!bEncrypt && pContext->m_bIV) { CRYPT_AESSetIV(pContext->m_Context, pContext->m_Block); pContext->m_bIV = false; pContext->m_BlockOffset = 0; } else if (src_off < src_size) { uint8_t block_buf[16]; if (bEncrypt) { CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16); } else { CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16); } dest_buf.AppendBlock(block_buf, 16); pContext->m_BlockOffset = 0; } } if (!src_left) { break; } } return true; }
bool CPDF_CryptoHandler::CryptFinish(void* context, CFX_BinaryBuf& dest_buf, bool bEncrypt) { if (!context) { return false; } if (m_Cipher == FXCIPHER_NONE) { return true; } if (m_Cipher == FXCIPHER_RC4) { FX_Free(context); return true; } AESCryptContext* pContext = (AESCryptContext*)context; if (bEncrypt) { uint8_t block_buf[16]; if (pContext->m_BlockOffset == 16) { CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16); dest_buf.AppendBlock(block_buf, 16); pContext->m_BlockOffset = 0; } FXSYS_memset(pContext->m_Block + pContext->m_BlockOffset, (uint8_t)(16 - pContext->m_BlockOffset), 16 - pContext->m_BlockOffset); CRYPT_AESEncrypt(pContext->m_Context, block_buf, pContext->m_Block, 16); dest_buf.AppendBlock(block_buf, 16); } else if (pContext->m_BlockOffset == 16) { uint8_t block_buf[16]; CRYPT_AESDecrypt(pContext->m_Context, block_buf, pContext->m_Block, 16); if (block_buf[15] <= 16) { dest_buf.AppendBlock(block_buf, 16 - block_buf[15]); } } FX_Free(pContext); return true; }
void CFX_BinaryBuf::TakeOver(CFX_BinaryBuf& other) { AttachData(other.GetBuffer(), other.GetSize()); other.DetachBuffer(); }
void CJS_GlobalData::MakeByteString(const CFX_ByteString& name, CJS_KeyValue* pData, CFX_BinaryBuf& sData) { switch (pData->nType) { case JS_GlobalDataType::NUMBER: { uint32_t dwNameLen = (uint32_t)name.GetLength(); sData.AppendBlock(&dwNameLen, sizeof(uint32_t)); sData.AppendString(name); sData.AppendBlock(&pData->nType, sizeof(uint16_t)); double dData = pData->dData; sData.AppendBlock(&dData, sizeof(double)); } break; case JS_GlobalDataType::BOOLEAN: { uint32_t dwNameLen = (uint32_t)name.GetLength(); sData.AppendBlock(&dwNameLen, sizeof(uint32_t)); sData.AppendString(name); sData.AppendBlock(&pData->nType, sizeof(uint16_t)); uint16_t wData = (uint16_t)pData->bData; sData.AppendBlock(&wData, sizeof(uint16_t)); } break; case JS_GlobalDataType::STRING: { uint32_t dwNameLen = (uint32_t)name.GetLength(); sData.AppendBlock(&dwNameLen, sizeof(uint32_t)); sData.AppendString(name); sData.AppendBlock(&pData->nType, sizeof(uint16_t)); uint32_t dwDataLen = (uint32_t)pData->sData.GetLength(); sData.AppendBlock(&dwDataLen, sizeof(uint32_t)); sData.AppendString(pData->sData); } break; case JS_GlobalDataType::NULLOBJ: { uint32_t dwNameLen = (uint32_t)name.GetLength(); sData.AppendBlock(&dwNameLen, sizeof(uint32_t)); sData.AppendString(name); sData.AppendBlock(&pData->nType, sizeof(uint32_t)); } break; default: break; } }
void CJS_GlobalData::SaveGlobalPersisitentVariables() { uint32_t nCount = 0; CFX_BinaryBuf sData; for (const auto& pElement : m_arrayGlobalData) { if (pElement->bPersistent) { CFX_BinaryBuf sElement; MakeByteString(pElement->data.sKey, &pElement->data, sElement); if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA) break; sData.AppendBlock(sElement.GetBuffer(), sElement.GetSize()); nCount++; } } CFX_BinaryBuf sFile; uint16_t wType = (uint16_t)(('X' << 8) | 'F'); sFile.AppendBlock(&wType, sizeof(uint16_t)); uint16_t wVersion = 2; sFile.AppendBlock(&wVersion, sizeof(uint16_t)); sFile.AppendBlock(&nCount, sizeof(uint32_t)); uint32_t dwSize = sData.GetSize(); sFile.AppendBlock(&dwSize, sizeof(uint32_t)); sFile.AppendBlock(sData.GetBuffer(), sData.GetSize()); CRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY, sizeof(JS_RC4KEY)); WriteFileBuffer(m_sFilePath.c_str(), (const FX_CHAR*)sFile.GetBuffer(), sFile.GetSize()); }
void CJS_GlobalData::MakeByteString(const CFX_ByteString& name, CJS_KeyValue* pData, CFX_BinaryBuf& sData) { FX_WORD wType = (FX_WORD)pData->nType; switch (wType) { case JS_GLOBALDATA_TYPE_NUMBER: { FX_DWORD dwNameLen = (FX_DWORD)name.GetLength(); sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD)); sData.AppendString(name); sData.AppendBlock(&wType, sizeof(FX_WORD)); double dData = pData->dData; sData.AppendBlock(&dData, sizeof(double)); } break; case JS_GLOBALDATA_TYPE_BOOLEAN: { FX_DWORD dwNameLen = (FX_DWORD)name.GetLength(); sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD)); sData.AppendString(name); sData.AppendBlock(&wType, sizeof(FX_WORD)); FX_WORD wData = (FX_WORD)pData->bData; sData.AppendBlock(&wData, sizeof(FX_WORD)); } break; case JS_GLOBALDATA_TYPE_STRING: { FX_DWORD dwNameLen = (FX_DWORD)name.GetLength(); sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD)); sData.AppendString(name); sData.AppendBlock(&wType, sizeof(FX_WORD)); FX_DWORD dwDataLen = (FX_DWORD)pData->sData.GetLength(); sData.AppendBlock(&dwDataLen, sizeof(FX_DWORD)); sData.AppendString(pData->sData); } break; case JS_GLOBALDATA_TYPE_NULL: { FX_DWORD dwNameLen = (FX_DWORD)name.GetLength(); sData.AppendBlock(&dwNameLen, sizeof(FX_DWORD)); sData.AppendString(name); sData.AppendBlock(&wType, sizeof(FX_DWORD)); } break; default: break; } }
void CJS_GlobalData::SaveGlobalPersisitentVariables() { FX_DWORD nCount = 0; CFX_BinaryBuf sData; for (int i = 0, sz = m_arrayGlobalData.GetSize(); i < sz; i++) { CJS_GlobalData_Element* pElement = m_arrayGlobalData.GetAt(i); if (pElement->bPersistent) { CFX_BinaryBuf sElement; MakeByteString(pElement->data.sKey, &pElement->data, sElement); if (sData.GetSize() + sElement.GetSize() > JS_MAXGLOBALDATA) break; sData.AppendBlock(sElement.GetBuffer(), sElement.GetSize()); nCount++; } } CFX_BinaryBuf sFile; FX_WORD wType = (FX_WORD)(('X' << 8) | 'F'); sFile.AppendBlock(&wType, sizeof(FX_WORD)); FX_WORD wVersion = 2; sFile.AppendBlock(&wVersion, sizeof(FX_WORD)); sFile.AppendBlock(&nCount, sizeof(FX_DWORD)); FX_DWORD dwSize = sData.GetSize(); sFile.AppendBlock(&dwSize, sizeof(FX_DWORD)); sFile.AppendBlock(sData.GetBuffer(), sData.GetSize()); CRYPT_ArcFourCryptBlock(sFile.GetBuffer(), sFile.GetSize(), JS_RC4KEY, sizeof(JS_RC4KEY)); WriteFileBuffer(m_sFilePath.c_str(), (const FX_CHAR*)sFile.GetBuffer(), sFile.GetSize()); }