Files
Sun1602/Server/MolaCrypt/SRC.MOLA_DDA/CryptFlowPolicy.SolarAuth.cpp
2022-10-26 12:25:11 +08:00

189 lines
4.1 KiB
C++

//=============================================================================================================================
/// SolarAuth Cryptography Control class
/**
@author Lee Eun-pa <waverix@webzen.co.kr>
@since 2006. 10. 26
@remark
- SolarAuth 에서 사용되는 기본 암호화 관련 컨트롤 클래스 구현
@note
@history
-
*/
//=============================================================================================================================
#include "stdafx.h"
#include <SolarAuth.CryptFlowPolicy.h>
#pragma pack(push, 1)
// 6Byte
union PacketTokens
{
struct
{
WORD wToken1;
DWORD dwToken2;
} msgBASE_RELOC;
struct
{
DWORD dwToken1;
WORD wToken2;
} msgBASE_NORMAL;
};
#pragma pack(pop)
//
PACKET_CONTROL_SM::uPACKET_STRUCTURE PACKET_CONTROL_SM::sRECV_PACKET_STRUCTURE;
PACKET_CONTROL_SM::uPACKET_STRUCTURE PACKET_CONTROL_SM::sSEND_PACKET_STRUCTURE;
//
DWORD CryptFlowPolicy::Utility::GetChunkValue()
{
SYSTEMTIME st;
GetLocalTime( &st );
DWORD dwValue = (DWORD)st.wYear;
dwValue *= st.wMonth;
dwValue *= st.wDay;
dwValue *= st.wHour;
dwValue *= st.wMinute;
dwValue *= st.wSecond;
return dwValue;
}
DWORD
CryptFlowPolicy::MakePacket::PostRecv_SM_CONNECTION_SYN_1st( BYTE* pMsgACK, DWORD dwServerIPAddress )
{
DWORD dwChunkValue = CryptFlowPolicy::Utility::GetChunkValue();
DWORD dwTickCount = GetTickCount();
DWORD dwMixCryptKey = dwChunkValue ^ dwTickCount;
PacketTokens* pPacket = (PacketTokens*)pMsgACK;
pPacket->msgBASE_NORMAL.dwToken1 = dwMixCryptKey;
pPacket->msgBASE_NORMAL.dwToken1 ^= dwServerIPAddress;
pPacket->msgBASE_RELOC.dwToken2 ^= dwServerIPAddress;
return dwMixCryptKey;
return 0;
}
DWORD
CryptFlowPolicy::MakePacket::PostRecv_SM_CONNECTION_ACK_1st( BYTE* pMsgACK, DWORD dwServerIPAddress )
{
PacketTokens* pPacket = (PacketTokens*)pMsgACK;
pPacket->msgBASE_RELOC.dwToken2 ^= dwServerIPAddress;
pPacket->msgBASE_NORMAL.dwToken1 ^= dwServerIPAddress;
return pPacket->msgBASE_NORMAL.dwToken1;
return 0;
}
DWORD
CryptFlowPolicy::MakePacket::PostRecv_DefConverter( BYTE* pMsgBASE, DWORD dwCryptKey, DWORD dwSeqCryptKey )
{
PacketTokens* pPacket = (PacketTokens*)pMsgBASE;
pPacket->msgBASE_RELOC.dwToken2 ^= (dwCryptKey ^ dwSeqCryptKey);
pPacket->msgBASE_NORMAL.dwToken1 ^= dwSeqCryptKey;
return pPacket->msgBASE_NORMAL.dwToken1;
return 0;
}
DWORD
CryptFlowPolicy::MakePacket::PreSend_DefConverter( BYTE* pMsgBASE, DWORD dwCryptKey, DWORD dwSeqCryptKey )
{
PacketTokens* pPacket = (PacketTokens*)pMsgBASE;
pPacket->msgBASE_NORMAL.dwToken1 ^= dwSeqCryptKey;
pPacket->msgBASE_RELOC.dwToken2 ^= (dwCryptKey ^ dwSeqCryptKey);
return pPacket->msgBASE_NORMAL.dwToken1;
return 0;
}
//
// <WARNING>
// 이것은 Singleton객체가 아닙니다.
// DWORD m_dwMaxObjectCount;
// PVOID m_AMBIGOUS;
union uConvOBJ
{
VOID* pINST;
DWORD* pDWORD;
};
// 너무 많은 수의 개수를 입력하지 마세요. 필요한 만큼만... 100개로 제한합니다.
sOBJECT_CHANGER* sOBJECT_CHANGER::CreateObjectChanger( DWORD dwMaxObjectCount )
{
sOBJECT_CHANGER* pInst = new sOBJECT_CHANGER;
if( dwMaxObjectCount > 100 )
return NULL;
pInst->m_dwMaxObjectCount = dwMaxObjectCount;
pInst->m_AMBIGOUS = new DWORD[dwMaxObjectCount];
memset( pInst->m_AMBIGOUS, 0, sizeof(DWORD)*dwMaxObjectCount );
return pInst;
}
VOID sOBJECT_CHANGER::ReleaseObjectChanger( sOBJECT_CHANGER* pInst )
{
if( pInst )
{
if( pInst->m_AMBIGOUS )
{
delete pInst->m_AMBIGOUS;
pInst->m_dwMaxObjectCount = 0;
pInst->m_AMBIGOUS = NULL;
}
}
}
BOOL sOBJECT_CHANGER::ObjectChangeTo( PVOID targetObj, DWORD toObj )
{
if( !(m_dwMaxObjectCount > toObj) )
return FALSE;
DWORD* m_pDWARRAY = (DWORD*)m_AMBIGOUS;
if( m_pDWARRAY[toObj] && targetObj )
{
uConvOBJ uConv;
uConv.pINST = targetObj;
*uConv.pDWORD = m_pDWARRAY[toObj];
return TRUE;
}
return FALSE;
}
BOOL sOBJECT_CHANGER::_RegisterObject( DWORD dwAlignIndex, PVOID instanceObj )
{
if( !(m_dwMaxObjectCount > dwAlignIndex) )
return FALSE;
if( instanceObj )
{
uConvOBJ uConv;
uConv.pINST = instanceObj;
DWORD dwCode = *uConv.pDWORD;
DWORD* m_pDWARRAY = (DWORD*)m_AMBIGOUS;
m_pDWARRAY[dwAlignIndex] = dwCode;
return TRUE;
}
return FALSE;
}