Files
Sun1602/Server/TheMola/CryptFileReader.cpp
T
2022-10-26 12:25:11 +08:00

176 lines
3.3 KiB
C++

#include "Structure.h"
#include "CryptFile.h"
#include "CryptFileReader.h"
#include <stdio.h>
#include <stdlib.h>
CryptFileReader::~CryptFileReader()
{
m_dwCount = 0;
m_dwMaxCount = 0;
m_dwSize = 0;
m_pLastINFO = NULL;
m_dwKey = 0;
m_dwLKey = 0;
if( m_pChunk )
{
memset( m_pChunk, 0, m_dwBufferSize );
m_dwBufferSize = 0;
delete [] m_pChunk;
m_pChunk = NULL;
}
}
BOOL CryptFileReader::Open( const CHAR* pFileName, const DWORD dwKey )
{
if( !pFileName )
return FALSE;
OFSTRUCT pOF;
HANDLE hFILE = (HANDLE)(__int64)OpenFile( pFileName, &pOF, OF_READ );
if( hFILE == INVALID_HANDLE_VALUE )
return FALSE;
SetFD( hFILE );
DWORD dwFileSize = GetFileSize( GetFD(), NULL );
//m_pChunk = (CRYPT_FILE_CHUNK_RENEW*)malloc( dwFileSize );
m_pChunk = (CRYPT_FILE_CHUNK_RENEW*)new BYTE[dwFileSize];
m_dwBufferSize = dwFileSize;
// <NOTE>
// HEADER + DATA[] 로 계산할 것
//
if( Load( (BYTE*)GetChunk(), dwFileSize ) == FALSE )
{
printf( "Can't load file\n" );
return FALSE;
}
if( !_InitInfo( dwKey ) )
{
printf( "File Incorrupt\n" );
return FALSE;
}
return TRUE;
}
BOOL CryptFileReader::_InitInfo( const DWORD dwKey )
{
m_dwKey = m_dwLKey = dwKey;
if( !IsEncrypted( (BYTE*)&(m_pChunk->Header) ) )
{
return FALSE;
}
m_dwLKey = m_pChunk->Header.INFO.dwRndKey^m_dwKey;
//m_pChunk->Header.INFO.wJumpIndex = 0;
m_dwCount = 0;
//m_dwMaxCount = dwMaxCount;
m_dwSize = m_pChunk->Header.INFO.dwSize;
m_pLastINFO = &(m_pChunk->Header.INFO);
//..wSize;
return TRUE;
}
BOOL CryptFileReader::ReadEncryptedBuffer( const BYTE* pBuffer, const DWORD dwBufSize, const DWORD dwKey )
{
if( !pBuffer )
return FALSE;
m_pChunk = (CRYPT_FILE_CHUNK_RENEW*)new BYTE[dwBufSize];
memcpy( m_pChunk, pBuffer, dwBufSize ); //원본 보호 목적
m_dwBufferSize = dwBufSize;
if( !_InitInfo( dwKey ) )
{
printf( "Invalid Stream\n" );
return FALSE;
}
return TRUE;
}
BOOL CryptFileReader::IsEncrypted( const BYTE* pszBufferHeadPtr )
{
DWORD dwResult = 0;
BOOL bChk = FALSE;
CRYPT_FILE_HEADER* pHeader = (CRYPT_FILE_HEADER*)pszBufferHeadPtr;
bChk = pHeader->byW == 'W';
dwResult |= bChk<<0;
bChk = pHeader->byZ == 'z';
dwResult |= bChk<<1;
bChk = pHeader->byC == 'C';
dwResult |= bChk<<2;
bChk = pHeader->byF == 'F';
dwResult |= bChk<<3;
if( dwResult != 0xF )
return FALSE;
return TRUE;
}
//BOOL CryptFileReader::IsEncrypted()
//{
// DWORD dwResult = 0;
// BOOL bChk = FALSE;
// bChk = m_pChunk->Header.byW == 'W';
// dwResult |= bChk<<0;
// bChk = m_pChunk->Header.byZ == 'z';
// dwResult |= bChk<<1;
// bChk = m_pChunk->Header.byC == 'C';
// dwResult |= bChk<<2;
// bChk = m_pChunk->Header.byF == 'F';
// dwResult |= bChk<<3;
//
// if( dwResult != 0xF )
// return FALSE;
// return TRUE;
//}
//+Decrypt
INT CryptFileReader::Read( BYTE* OUT pBuffer, const DWORD rLen )
{
if( rLen > TOKEN_SIZE || !pBuffer )
return -1;
DWORD count = m_dwCount++;
//32B
CRYPT_FILE_TOKEN* pInfo = (CRYPT_FILE_TOKEN*)m_pChunk->KeyData;
pInfo = pInfo+count;
//pInfo->INFO.wJumpIndex = (WORD)m_dwCount;
DWORD size = (DWORD)(sizeof(CRYPT_FILE_TOKEN)/sizeof(DWORD));
DWORD* pdwInfo = (DWORD*)pInfo;
for( DWORD i=0 ; i<size ; ++i )
{
*pdwInfo ^= m_dwLKey;
pdwInfo++;
}
memcpy( pBuffer, pInfo->TOKEN, rLen );
m_dwLKey = pInfo->INFO.dwRndKey;
return 0;
}
#include "WzCF.Block.cxx"
const BYTE* CryptInfoStream::GetCryptStream()
{
return __CRYPTSTREAM;
}