Files
Sun1602/Server/SolarAuth/Sessions/Services4Session.h
T
2022-10-26 12:25:11 +08:00

185 lines
5.6 KiB
C++

#ifndef __SERVICES4SESSION_H__
#define __SERVICES4SESSION_H__
#pragma once
#include <ServerBuildVersion.h>
#include <PacketStruct_SM.h>
#include "PacketHandler/PacketHandler.h"
#include <WorkLoad/WorkLoadPacketStream.h>
#include <SolarAuth.CryptFlowPolicy.h>
class Services4Session
{
public:
inline VOID Init()
{
m_PHASE_SHIFT = PHASE_NOACTION;
m_SyncKey = TEMP_SERVER;
m_dwSeqCryptKey = 0;
m_dwServerIPAddress = 0;
m_GlobalServerKey = 0;
//---------------------------------
// <Cryptography>
CRYPTINFO.Init();
//---------------------------------
m_WorkLoadPacketStream.Initialize( WorkLoadPacketStream::c_DefaultUpdateTick, WorkLoadPacketStream::c_DefaultLimitTransferSize );
m_WorkLoad.Initialize();
}
inline VOID SetSyncKey( eSERVER_TYPE syncKey ) { m_SyncKey = syncKey; }
inline eSERVER_TYPE GetSyncKey() { return m_SyncKey; }
inline VOID SetSeqCryptKey( DWORD dwSeqCryptKey ) { m_dwSeqCryptKey = dwSeqCryptKey; }
inline DWORD GetSeqCryptKey() { return m_dwSeqCryptKey; }
inline VOID SetServerIPAddress( DWORD dwServerIPAddress ) { m_dwServerIPAddress = dwServerIPAddress; }
inline DWORD GetServerIPAddress() { return m_dwServerIPAddress; }
inline GLOBAL_SERVER_KEY GetGlobalServerKey() { return m_GlobalServerKey; }
inline VOID SetGlobalServerKey( GLOBAL_SERVER_KEY globalKey ) { m_GlobalServerKey = globalKey; }
inline ePHASE_SHIFT GetPhaseStatus() { return m_PHASE_SHIFT; }
inline VOID SetPhaseStatus( ePHASE_SHIFT phase ) { m_PHASE_SHIFT = phase; }
WORK_LOAD_CONTAINER_SESSION_WORK& GetWorkLoadContainer() { return m_WorkLoad; }
WorkLoadPacketStream& GetWorkLoadPacketStream() { return m_WorkLoadPacketStream; }
PACKET_HANDLER_DELEGATOR GetPacketHandler() { return *m_pPacketHandler; };
// <INTERFACE>
VOID RegisterPacketHandler();
VOID MigrateObject( Services4Session& rTargetService )
{
//rTargetService.m_pPacketHandler
rTargetService.m_PHASE_SHIFT = m_PHASE_SHIFT;
rTargetService.m_SyncKey = MASTER_SERVER; //m_SyncKey;
rTargetService.m_dwSeqCryptKey = m_dwSeqCryptKey;
rTargetService.m_dwServerIPAddress = m_dwServerIPAddress;
rTargetService.m_GlobalServerKey = m_GlobalServerKey;
memcpy( &(rTargetService.CRYPTINFO), &CRYPTINFO, sizeof(CRYPTINFO) );
CRYPTINFO.ClearField_CryptManager();
CRYPTINFO.Release();
}
// <INTERFACEs><CRYPTOGRAPHY>
struct Crypt
{
inline static VOID Init_ServerRoleManager( Services4Session& rService, MSG_SM_CRYPTOGRAPHY_KEY* pMsgKEY );
inline static VOID StartPacketCrypt( Services4Session& rService );
//
inline static VOID ProcPacket4Send();
inline static VOID ProcPacket4Recv();
};
private:
//-------------------------------------------------------------------------------------------------
// Connection Info & Status
//
PACKET_HANDLER_DELEGATOR_P m_pPacketHandler;
ePHASE_SHIFT m_PHASE_SHIFT;
eSERVER_TYPE m_SyncKey;
DWORD m_dwSeqCryptKey;
DWORD m_dwServerIPAddress;
GLOBAL_SERVER_KEY m_GlobalServerKey;
public:
// Cryptography for ServerRole
class sCRYPTINFO
{
BOOL m_bIsCrypted;
ServerSNKey m_RandomSNK;
CryptManagerS2S* m_pCryptManager;
public:
VOID Init() { m_bIsCrypted = FALSE; m_pCryptManager = NULL; }
VOID Release()
{
SAFE_DELETE(m_pCryptManager);
m_bIsCrypted = FALSE;
}
VOID ClearField_CryptManager() { m_pCryptManager = NULL; }
BOOL& IsCrypted() { return m_bIsCrypted; }
ServerSNKey& RandomSNK() { return m_RandomSNK; }
CryptManagerS2S& CryptManager() { return *m_pCryptManager; }
VOID NextRoundSNKey4Send() { m_RandomSNK.NextRoundSNKey4Send(); };
VOID NextRoundSNKey4Recv() { m_RandomSNK.NextRoundSNKey4Recv(); };
BYTE GetSendSNK() { return m_RandomSNK.GetSendSNKey( RandomSNKey::c_dwBaseKey ); };
BYTE GetSendPairSNK() { return m_RandomSNK.GetSendSNKey( RandomSNKey::c_dwPairKey ); };
BYTE GetRecvSNK() { return m_RandomSNK.GetRecvSNKey( RandomSNKey::c_dwBaseKey ); };
BYTE GetRecvPairSNK() { return m_RandomSNK.GetRecvSNKey( RandomSNKey::c_dwPairKey ); };
friend struct Crypt;
} CRYPTINFO;
private:
WorkLoadPacketStream m_WorkLoadPacketStream;
WORK_LOAD_CONTAINER_SESSION_WORK m_WorkLoad;
};
VOID Services4Session::Crypt::Init_ServerRoleManager( Services4Session& rService, MSG_SM_CRYPTOGRAPHY_KEY* pMsgKEY )
{
const DWORD dwRndKeyIncValue = 0x0082A141;
static DWORD dwRndKeyInc = 1;
sCRYPTINFO& rCRYPT = rService.CRYPTINFO;
DWORD dwDefRndKey = CryptFlowPolicy::Utility::GetChunkValue();
DWORD dwRndUsingKey = (dwRndKeyIncValue*(dwRndKeyInc++)) ^ dwDefRndKey;
rCRYPT.RandomSNK().Initialize( dwRndUsingKey, 7, 4 /*C2S_MIDDLE_VERSION_NO, C2S_LOW_VERSION_NO*/ );
rCRYPT.m_pCryptManager = new CryptManagerS2S();
rCRYPT.CryptManager().Initialize( CryptManagerS2S::ROLE_SERVER );
BYTE bySNK = rCRYPT.GetSendSNK();
pMsgKEY->SNKey() = bySNK;
BYTE byCryptInfo =
rCRYPT.CryptManager().CreateCryptKeyStream(
rCRYPT.GetSendPairSNK(),
(CRYPT_KEY_STREAM)pMsgKEY->GetCryptStream(),
dwRndUsingKey
);
pMsgKEY->CryptInfo() = byCryptInfo;
// 암호화 되어 있는 상태일 수도 있다... SendPacket에서는 암호화 유무에 따라서 전송하는 루틴으로 설정
// 아래 루틴은 Init을 호출하는 쪽에서 처리한다.
//pServerSession->SendPacket( pMsgKEY, sizeof(*pMsgKEY) );
//rCRYPT.NextRoundSNKey4Send();
}
VOID Services4Session::Crypt::StartPacketCrypt( Services4Session& rService )
{
sCRYPTINFO& rCRYPT = rService.CRYPTINFO;
if( rCRYPT.CryptManager().StartLogic( TRUE ) )
{
rCRYPT.IsCrypted() = TRUE;
return;
}
ASSERT( !"패킷 암호화 시작 실패" );
}
VOID Services4Session::Crypt::ProcPacket4Send()
{
}
VOID Services4Session::Crypt::ProcPacket4Recv()
{
}
#endif // __SERVICES4SESSION_H__