//============================================================================================================================= /// SolarAuth Cryptography Control class /** @author Lee Eun-pa @since 2006. 10. 26 @remark - SolarAuth, Master¿¡¼­ »ç¿ëµÇ´Â ±âº» ¾Ïȣȭ °ü·Ã ÄÁÆ®·Ñ Ŭ·¡½º @note @history - */ //============================================================================================================================= #pragma once #ifndef __CRYPT_FLOW_POLICY_H #define __CRYPT_FLOW_POLICY_H // #include // About Cryptography #include #include class CryptFlowPolicy { public: struct Utility { static DWORD GetChunkValue(); inline static DWORD GetIPAddress( const CHAR* strIPAddress ) { return (DWORD)inet_addr( strIPAddress ); } }; struct MakePacket { // Master -> SolarAuth // // 2: dwServerIPAddress : DWORD // »ó´ë Master¼­¹ö°¡ ÀÎ½Ä °¡´ÉÇÑ ¼­¹ö IP (public) : SolarAuth°¡ ¹Þ¾ÆµéÀÌ´Â IP¿Í ´Ù¸¦ ¼ö ÀÖ´Ù. (ex.NAT) // // random CRYPT_KEY by SolarAuth : DWORD static DWORD PostRecv_SM_CONNECTION_SYN_1st( BYTE* pMsgACK, DWORD dwServerIPAddress ); // SolarAuth -> Master // // encodeµÈ ÆÐŶ decode, ÇØ´ç ÆÐŶÀÇ µ¥ÀÌÅÍ´Â decodeµÈ´Ù. // // random CRYPT_KEY by SolarAuth : DWORD static DWORD PostRecv_SM_CONNECTION_ACK_1st( BYTE* pMsgACK, DWORD dwServerIPAddress ); // // random CRYPT_KEY by SolarAuth : DWORD static DWORD PostRecv_DefConverter( BYTE* pMsgBASE, DWORD dwCryptKey, DWORD dwSeqCryptKey ); // // random CRYPT_KEY by SolarAuth : DWORD static DWORD PreSend_DefConverter( BYTE* pMsgBASE, DWORD dwCryptKey, DWORD dwSeqCryptKey ); // Master -> SolarAuth // // random CRYPT_KEY by SolarAuth : DWORD static VOID PostRecv_SM_CONNECTION_SYN_2nd( BYTE* pMsgACK, DWORD dwCryptKey, DWORD dwSeqCryptKey ) { PostRecv_DefConverter( pMsgACK, dwCryptKey, dwSeqCryptKey ); } // SolarAuth -> Master // // random CRYPT_KEY by SolarAuth : DWORD static VOID PostRecv_SM_CONNECTION_ACK_2nd( BYTE* pMsgACK, DWORD dwCryptKey, DWORD dwSeqCryptKey ) { PostRecv_DefConverter( pMsgACK, dwCryptKey, dwSeqCryptKey ); } }; }; // // À̰ÍÀº Singleton°´Ã¼°¡ ¾Æ´Õ´Ï´Ù. class sOBJECT_CHANGER { private: sOBJECT_CHANGER() : m_dwMaxObjectCount(0), m_AMBIGOUS(NULL) {} public: // ³Ê¹« ¸¹Àº ¼öÀÇ °³¼ö¸¦ ÀÔ·ÂÇÏÁö ¸¶¼¼¿ä. ÇÊ¿äÇÑ ¸¸Å­¸¸... 100°³·Î Á¦ÇÑÇÕ´Ï´Ù. static sOBJECT_CHANGER* CreateObjectChanger( DWORD dwMaxObjectCount ); static VOID ReleaseObjectChanger( sOBJECT_CHANGER* pInst ); // »ý¼ºÀÚ¿¡ ÇÏ´Â ÀÏ ¾ø´Â ÂÊÀÌ ÁÁ°ÚÁÒ? template inline BOOL RegisterObject( DWORD dwAlignIndex ) { BYTE instObj[sizeof(_TYPE_)]; _TYPE_* pInst = new (instObj) _TYPE_; return _RegisterObject( dwAlignIndex, pInst ); } BOOL ObjectChangeTo( PVOID targetObj, DWORD toObj ); private: BOOL _RegisterObject( DWORD dwAlignIndex, PVOID instanceObj ); private: DWORD m_dwMaxObjectCount; PVOID m_AMBIGOUS; }; #pragma pack(push,1) // ¾ÏȣȭµÈ ÆÐŶ Ç®±âÀ§ÇÑ... struct MSG_SM_CRYPTOGRAPHY_PACKET_ENCODED { BYTE m_bySN; // Sequence Number : received BYTE m_byCRC; BYTE m_byStream[1]; // ÆÐŶ¸¶´Ù ´Ù¸¥ Å©±â¸¦ °¡Áú °ÍÀÌ´Ù. BYTE& GetSNKey() { return m_bySN; } VOID SetSNKey( BYTE bySNKey ) { m_bySN = bySNKey; } BYTE& GetCRC() { return m_byCRC; } VOID SetCRC( BYTE byCRC ) { m_byCRC = byCRC; } BYTE* GetPacketStream() { return m_byStream; } DWORD GetHeaderSize() { return (sizeof(BYTE)*2); } }; // ÆÐŶ ¾Ïȣȭ Çϱâ À§ÇÑ... struct MSG_SM_CRYPTOGRAPHY_PACKET_ENCODING { BYTE m_bySN; // Sequence Number : sending BYTE m_byCRC; BYTE m_byStream[1]; // ÆÐŶ¸¶´Ù ´Ù¸¥ Å©±â¸¦ °¡Áú °ÍÀÌ´Ù. BYTE& GetSNKey() { return m_bySN; } VOID SetSNKey( BYTE bySNKey ) { m_bySN = bySNKey; } BYTE& GetCRC() { return m_byCRC; } VOID SetCRC( BYTE byCRC ) { m_byCRC = byCRC; } BYTE* GetPacketStream() { return m_byStream; } DWORD GetHeaderSize() { return (sizeof(BYTE)*2); } }; // // Agent ±âÁØ¿ë struct PACKET_CONTROL_SM { static const DWORD MAX_PACKET_SIZE = 16384; union uPACKET_STRUCTURE { BYTE PacketStream[PACKET_CONTROL_SM::MAX_PACKET_SIZE]; struct { DWORD dwBLANK; BYTE pS2S_PacketPtr[1]; } PK_NORMAL; struct { WORD wBLANK; union { MSG_SM_CRYPTOGRAPHY_PACKET_ENCODING pMSG_ENCODING[1]; MSG_SM_CRYPTOGRAPHY_PACKET_ENCODED pMSG_ENCODED[1]; }; } PK_ENDECODE; }; static uPACKET_STRUCTURE sRECV_PACKET_STRUCTURE; static uPACKET_STRUCTURE sSEND_PACKET_STRUCTURE; // Default PacketPointer static BYTE* GetBasePacketPtr4Send() { return (BYTE*)sSEND_PACKET_STRUCTURE.PK_NORMAL.pS2S_PacketPtr; } // Default PacketPointer static BYTE* GetBasePacketPtr4Recv() { return (BYTE*)sRECV_PACKET_STRUCTURE.PK_NORMAL.pS2S_PacketPtr; } // User(crypt) static MSG_SM_CRYPTOGRAPHY_PACKET_ENCODED* GetPacketPtr_ENCODED() { return sRECV_PACKET_STRUCTURE.PK_ENDECODE.pMSG_ENCODED; } // User(crypt) static MSG_SM_CRYPTOGRAPHY_PACKET_ENCODING* GetPacketPtr_ENCODING() { return sSEND_PACKET_STRUCTURE.PK_ENDECODE.pMSG_ENCODING; } }; #pragma pack(pop) #endif //__CRYPT_FLOW_POLICY_H