#include "stdafx.h" #include "BBTanStream.h" #define BBTAN_TWINKLE_EXPORTER(name) \ BYTE* pSTK_FRM = (BYTE*)(name) ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // ////////////////////////////////////////////////////////////////////////// #pragma warning(push) #pragma warning(disable:4307) #define CALC_GENDER_NO1(convNo1, convNo2) \ ( \ (convNo1) \ ^(GETRNDNO_RNG08_T3(convNo2)< #define BBTAN_RECURSIVE_HANDLER_NAME( no ) \ BBTAN_RECURSIVE_HANDLER_##no #define BBTAN_RECURSIVE_HANDLER_NAME2( no ) \ BBTAN_RECURSIVE_HANDLER2_##no // #define BBTAN_RECURSIVE_HANDLER_DECL( no ) \ static BOOL BBTAN_RECURSIVE_HANDLER_##no( uRND_CONVKEY& rKEY, BYTE* pBYTE, WORD wRemain, BYTE& rbyLinkedNo ) #define BBTAN_RECURSIVE_HANDLER_DECL2( no ) \ static BOOL BBTAN_RECURSIVE_HANDLER2_##no( uRND_CONVKEY& rKEY, BYTE* pBYTE, WORD wRemain, BYTE& rbyLinkedNo ) // #define BBTAN_CHECK_ACTION_HANDLER_CALL( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ INLINE_CHECK_ACTION_FUNCTION_IMPL_##No1st##_##No2nd( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) #define BBTAN_CHECK_ACTION_HANDLER_CALL2( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ INLINE_CHECK_ACTION_FUNCTION_IMPL_##No3rd##_##No4th( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) // #define BBTAN_RECURSIVE_HANDLER_CALL( no, wSize, ref ) \ BBTAN_RECURSIVE_HANDLER_##no( rKEY, pBYTE, wSize, ref ) #define BBTAN_RECURSIVE_HANDLER_CALL2( no, wSize, ref ) \ BBTAN_RECURSIVE_HANDLER2_##no( rKEY, pBYTE, wSize, ref ) // #define BBTAN_RECURSIVE_HANDLER( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ BBTAN_RECURSIVE_HANDLER_DECL(No1st) { \ BBTAN_TWINKLE_EXPORTER(&BBTAN_RECURSIVE_HANDLER_NAME(No1st));CALLSTACK_TRACING(); \ if( PreCalculator( pBYTE, wRemain ) ) return TRUE; \ BBTAN_CHECK_ACTION_HANDLER_CALL(No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4); \ PostCalculator( pBYTE, wRemain, rbyLinkedNo ); \ BYTE* mpBYTE = pBYTE; WORD mwRemain = wRemain; BYTE mrbyLinkedNo = rbyLinkedNo; \ BOOL bSUCCESS = TRUE; \ if( rKEY.RNDBLOCK[ARRAY4_RNDIDX(No3rd)] > rKEY.RNDBLOCK[ARRAY4_RNDIDX(No4th)] ) { \ rKEY.RNDBLOCK[ARRAY4_RNDIDX(No2nd)] += convNo2; rKEY.RNDBLOCK[ARRAY4_RNDIDX(No3rd)] += convNo4; \ bSUCCESS = BBTAN_RECURSIVE_HANDLER_CALL(No2nd, wRemain, rbyLinkedNo); \ } else {rKEY.RNDBLOCK[ARRAY4_RNDIDX(No3rd)] += convNo3; rKEY.RNDBLOCK[ARRAY4_RNDIDX(No1st)] += convNo1; \ bSUCCESS = BBTAN_RECURSIVE_HANDLER_CALL2(No2nd, wRemain, rbyLinkedNo); } \ if( bSUCCESS ) { \ pBYTE = mpBYTE; wRemain = mwRemain>>2; rbyLinkedNo ^= mrbyLinkedNo; \ if( rKEY.RNDBLOCK[ARRAY4_RNDIDX(No1st)] > rKEY.RNDBLOCK[ARRAY4_RNDIDX(No2nd)] ) { \ rKEY.RNDBLOCK[ARRAY4_RNDIDX(No1st)] += convNo1; rKEY.RNDBLOCK[ARRAY4_RNDIDX(No4th)] += convNo2; \ bSUCCESS = BBTAN_RECURSIVE_HANDLER_CALL2(No3rd, wRemain, rbyLinkedNo); \ } else { \ rKEY.RNDBLOCK[ARRAY4_RNDIDX(No2nd)] += convNo3; rKEY.RNDBLOCK[ARRAY4_RNDIDX(No3rd)] += convNo2; \ bSUCCESS = BBTAN_RECURSIVE_HANDLER_CALL2(No4th, wRemain, rbyLinkedNo); \ } } \ return bSUCCESS; \ } #define BBTAN_RECURSIVE_HANDLER2( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ BBTAN_RECURSIVE_HANDLER_DECL2(No3rd) { \ BBTAN_TWINKLE_EXPORTER(&BBTAN_RECURSIVE_HANDLER_NAME2(No3rd));CALLSTACK_TRACING(); \ if( PreCalculator( pBYTE, wRemain ) ) return TRUE; \ BBTAN_CHECK_ACTION_HANDLER_CALL2(No3rd, No4th, No1st, No2nd, convNo1, convNo2, convNo3, convNo4); \ PostCalculator( pBYTE, wRemain, rbyLinkedNo ); \ BYTE* mpBYTE = pBYTE; WORD mwRemain = wRemain; BYTE mrbyLinkedNo = rbyLinkedNo; \ BOOL bSUCCESS = TRUE; \ if( rKEY.RNDBLOCK[ARRAY4_RNDIDX(No1st)] > rKEY.RNDBLOCK[ARRAY4_RNDIDX(No3rd)] ) { \ rKEY.RNDBLOCK[ARRAY4_RNDIDX(No2nd)] += convNo1; rKEY.RNDBLOCK[ARRAY4_RNDIDX(No1st)] += convNo3; \ bSUCCESS = BBTAN_RECURSIVE_HANDLER_CALL2(No4th, wRemain, rbyLinkedNo); \ } else {rKEY.RNDBLOCK[ARRAY4_RNDIDX(No3rd)] += convNo4; rKEY.RNDBLOCK[ARRAY4_RNDIDX(No4th)] += convNo2; \ bSUCCESS = BBTAN_RECURSIVE_HANDLER_CALL(No4th, wRemain, rbyLinkedNo); } \ if( bSUCCESS ) { \ pBYTE = mpBYTE; wRemain = mwRemain>>2; rbyLinkedNo ^= mrbyLinkedNo; \ if( rKEY.RNDBLOCK[ARRAY4_RNDIDX(No3rd)] > rKEY.RNDBLOCK[ARRAY4_RNDIDX(No4th)] ) { \ rKEY.RNDBLOCK[ARRAY4_RNDIDX(No1st)] += convNo4; rKEY.RNDBLOCK[ARRAY4_RNDIDX(No3rd)] += convNo1; \ bSUCCESS = BBTAN_RECURSIVE_HANDLER_CALL(No4th, wRemain, rbyLinkedNo); \ } else { \ rKEY.RNDBLOCK[ARRAY4_RNDIDX(No3rd)] += convNo2; rKEY.RNDBLOCK[ARRAY4_RNDIDX(No4th)] += convNo3; \ bSUCCESS = BBTAN_RECURSIVE_HANDLER_CALL(No3rd, wRemain, rbyLinkedNo); \ } } \ return bSUCCESS; \ } // BBTAN_CHECK_ACTION_HANDLER_CALL(No2nd, No1st, convNo1, convNo2); \ ////////////////////////////////////////////////////////////////////////// // #undef BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE #define BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ BBTAN_RECURSIVE_HANDLER_DECL(No1st); #include BBTAN_STREAM_TYPE2NAME #undef BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE #define BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ BBTAN_RECURSIVE_HANDLER_DECL2(No1st); #include BBTAN_STREAM_TYPE2NAME // #undef BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE #define BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ BBTAN_RECURSIVE_HANDLER(No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4); #include BBTAN_STREAM_TYPE2NAME #undef BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE #define BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ BBTAN_RECURSIVE_HANDLER2(No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4); #include BBTAN_STREAM_TYPE2NAME ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// #undef BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE #undef BBTAN_RECURSIVE_HANDLER_NAME #undef BBTAN_RECURSIVE_HANDLER_DECL #undef BBTAN_RECURSIVE_HANDLER_NAME2 #undef BBTAN_RECURSIVE_HANDLER_DECL2 //#undef BBTAN_RECURSIVE_HANDLER_CALL #undef BBTAN_RECURSIVE_HANDLER #undef CALC_GENDER_NO1 #undef CALC_GENDER_NO2 #define CALC_GENDER_NO1(convNo1, convNo2) \ ( \ (convNo1) \ ^(GETRNDNO_RNG04_T2(convNo1)< #define BBTAN_RECURSIVE_HANDLER_DECL( no ) \ static BOOL BBTAN_RECURSIVE_HANDLER_ROOT_##no( uRND_CONVKEY& rKEY, BYTE* pBYTE, WORD wRemain, BYTE& rbyLinkedNo ) //#define BBTAN_RECURSIVE_HANDLER_CALL( no, ref ) \ // BBTAN_RECURSIVE_HANDLER_ROOT_##no( pBYTE, wRemain, ref ) #define BBTAN_RECURSIVE_HANDLER( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ BBTAN_RECURSIVE_HANDLER_DECL(No1st) { \ BBTAN_TWINKLE_EXPORTER(&BBTAN_RECURSIVE_HANDLER_NAME(No1st)); \ WORD wMSG_BASE_RND = wRemain; \ if( wMSG_BASE_RND > 8 ) \ wMSG_BASE_RND = (7&rKEY.RNDBLOCK[0]) + RANGE_RND_000_004(wRemain); \ if( PreCalculator( pBYTE, wMSG_BASE_RND ) ) return TRUE; \ BBTAN_CHECK_ACTION_HANDLER_CALL(No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4); \ PostCalculator( pBYTE, wMSG_BASE_RND, rbyLinkedNo ); \ return BBTAN_RECURSIVE_HANDLER_CALL(No2nd, wMSG_BASE_RND, rbyLinkedNo); } #undef BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE #define BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ BBTAN_RECURSIVE_HANDLER_DECL(No1st); #include BBTAN_STREAM_TYPE2NAME #undef BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE #define BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ BBTAN_RECURSIVE_HANDLER(No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4); #include BBTAN_STREAM_TYPE2NAME #pragma warning (pop) ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// VOID BBTanStream::Init_T2() { ConvertBBTanHandler stk_Handlers[256] = { #undef BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE #define BBTAN_RECURSIVE_HANDLER_DEFINE_REFINE( No1st, No2nd, No3rd, No4th, convNo1, convNo2, convNo3, convNo4 ) \ BBTAN_RECURSIVE_HANDLER_NAME(No1st), #include BBTAN_STREAM_TYPE2NAME }; #if SERVER_CODE __DEBUGGING_OUTPUT0( "CryptManager::Init_T2-server" ); #else __DEBUGGING_OUTPUT0( "CryptManager::Init_T2-client" ); #endif ConvertBBTanHandler* pOff = stk_Handlers; for( DWORD dwIdx=0 ; dwIdx<256 ; ++dwIdx, ++pOff ) { #if SERVER_CODE m_Receiver.insert( m_Receiver.end(), make_pair( (BYTE)dwIdx, *pOff ) ); #else //CLIENT_CODE m_Sender.insert( m_Sender.end(), make_pair( (BYTE)dwIdx, *pOff ) ); #endif // } }