void lightmac_tag(const void *msg, uint32_t msglen, void *tag, void* mkey) { uint8_t *data=(uint8_t*)msg; uint8_t *key=(uint8_t*)mkey; uint32_t idx, ctr, i; bc_blk m; bc_blk *t=(bc_blk*)tag; // zero initialize T t->q = 0; // set counter + index to zero ctr = 0; idx = 0; // while we have msg data while (msglen) { // add byte to M m.b[COUNTER_LENGTH + idx++] = *data++; // M filled? if (idx == (BLOCK_LENGTH - COUNTER_LENGTH)) { // add S counter in big endian format m.ctr = SWAP32(++ctr); // encrypt M with E using K1 ENCRYPT(key, &m); // update T t->q ^= m.q; // reset index idx = 0; } // decrease length msglen--; } // add the end bit m.b[COUNTER_LENGTH + idx++] = 0x80; // update T with anything remaining for (i=0; i<idx; i++) { t->b[i] ^= m.b[COUNTER_LENGTH + i]; } // advance key to K2 key += BC_KEY_LENGTH; // encrypt T with E using K2 ENCRYPT(key, t); }
char* SMTP_PASS(){ const char encrypted[32] = ENCRYPT(ICC_PASSWORD); unsigned r = SEED; for (int i = 0; i < 32; i++){ r = REC(r); int xorbase = r&0xFFUL; decrypted[i] = encrypted[i] ^ xorbase; } return decrypted; }
//处理消息缓冲 VOID CNetManager::ProcessInputStream(SocketInputStream& inputStream) { static USHORT nPacketIDSaved=0; BOOL ret ; char PackCompart[PACKET_HEADER_SIZE]; char header[PACKET_HEADER_SIZE]; PacketID_t packetID; uint packetuint, packetSize, packetIndex; WORD packetTick; Packet* pPacket = NULL ; static PacketID_t packetIDList[10]; static int packetIDListIdx = 0; { for( ;; ) { if( !m_SocketInputStream.Find( PackCompart ) ) {//数据没有消息分隔点 break ; } if( !m_SocketInputStream.Peek(&header[0], PACKET_HEADER_SIZE) ) {//数据不能填充消息头 break ; } ENCRYPT_HEAD(header, LOGIN_TO_CLIENT_KEY)//封包头解密 memcpy( &packetID, &header[0], sizeof(PacketID_t) ) ; memcpy( &packetTick, &header[sizeof(WORD)], sizeof(WORD) ) ; memcpy( &packetuint, &header[sizeof(WORD)+sizeof(PacketID_t)], sizeof(uint) ); packetSize = GET_PACKET_LEN(packetuint) ; packetIndex = GET_PACKET_INDEX(packetuint) ; if( packetID >= (PacketID_t)PACKET_MAX ) {//无效的消息类型 TDU_Log( "Invalid Packet, Old Packet List[%d,%d,%d,%d,%d,%d,%d,%d,%d,%d], Idx=%d", packetIDList[0], packetIDList[1], packetIDList[2], packetIDList[3], packetIDList[4], packetIDList[5], packetIDList[6], packetIDList[7], packetIDList[8], packetIDList[9], packetIDListIdx ); TDU_Log("Invalid Packet[%d]!", packetID); //TDThrow("Invalid Packet[%d]!", packetID); return ; } //消息解密处理--Begin { UINT t_uSize = packetSize+PACKET_HEADER_SIZE; UINT t_uHead = m_SocketInputStream.GetHead(); UINT t_uTail = m_SocketInputStream.GetTail(); UINT t_uBufferLen = m_SocketInputStream.GetBuffLen(); CHAR* t_szBuffer = m_SocketInputStream.GetBuff(); if ( t_uHead < t_uTail ) { ENCRYPT(&t_szBuffer[t_uHead], t_uSize, LOGIN_TO_CLIENT_KEY, 0); } else { UINT rightLen = t_uBufferLen - t_uHead ; if( t_uSize <= rightLen ) { ENCRYPT(&t_szBuffer[t_uHead], t_uSize, LOGIN_TO_CLIENT_KEY, 0); } else { ENCRYPT(&t_szBuffer[t_uHead], rightLen, LOGIN_TO_CLIENT_KEY, 0); ENCRYPT(t_szBuffer, t_uSize-rightLen, LOGIN_TO_CLIENT_KEY, rightLen); } } } //消息解密处理--End { if( m_SocketInputStream.Length()<PACKET_HEADER_SIZE+packetSize ) { //消息没有接收全 break; } if( packetSize>m_PacketFactoryManager.GetPacketMaxSize(packetID) ) { TDU_Log( "Packet size error, Old Packet List[%d,%d,%d,%d,%d,%d,%d,%d,%d,%d], Idx=%d", packetIDList[0], packetIDList[1], packetIDList[2], packetIDList[3], packetIDList[4], packetIDList[5], packetIDList[6], packetIDList[7], packetIDList[8], packetIDList[9], packetIDListIdx ); //消息的大小出现异常,收到的消息比预定义消息的最大值还要大 TDU_Log("Packet size error![ID=%d](%d>%d)", packetID, packetSize, m_PacketFactoryManager.GetPacketMaxSize(packetID)); //TDThrow("Packet size error![ID=%d](%d>%d)", // packetID, packetSize, m_PacketFactoryManager.GetPacketMaxSize(packetID)); // m_SocketInputStream.Skip( PACKET_HEADER_SIZE+packetSize ) ; return ; } Packet* pPacket = m_PacketFactoryManager.CreatePacket( packetID ) ; Assert( pPacket ) ; if( pPacket==NULL ) {//不能分配到足够的内存 TDU_Log( "Create Packet error, Old Packet List[%d,%d,%d,%d,%d,%d,%d,%d,%d,%d], Idx=%d", packetIDList[0], packetIDList[1], packetIDList[2], packetIDList[3], packetIDList[4], packetIDList[5], packetIDList[6], packetIDList[7], packetIDList[8], packetIDList[9], packetIDListIdx ); TDThrow("Create Packet error[%d]!", packetID); // m_SocketInputStream.Skip( PACKET_HEADER_SIZE+packetSize ) ; return ; } //设置消息序列号 pPacket->SetPacketIndex( packetIndex ) ; ret = m_SocketInputStream.ReadPacket( pPacket ) ; if( ret==FALSE ) { //读取消息内容错误 TDU_Log( "Read Packet error, Old Packet List[%d,%d,%d,%d,%d,%d,%d,%d,%d,%d], Idx=%d", packetIDList[0], packetIDList[1], packetIDList[2], packetIDList[3], packetIDList[4], packetIDList[5], packetIDList[6], packetIDList[7], packetIDList[8], packetIDList[9], packetIDListIdx ); TDU_Log("Read Packet error!"); //TDThrow("Read Packet error!"); continue ; } packetIDList[packetIDListIdx++] = packetID; if( packetIDListIdx == 10 ) packetIDListIdx = 0; //消息包执行 ret = executePacket_Gen_Exception(pPacket); if(ret != PACKET_EXE_NOTREMOVE) { m_PacketFactoryManager.RemovePacket( pPacket ) ; } nPacketIDSaved = packetID; } } } }
VOID CNetManager::SendPacket(Packet* pPacket) { //如果是处于等待切换场景流程中 if(CGameProcedure::GetActiveProcedure() == (CGameProcedure*)CGameProcedure::s_pProcMain && CWorldManager::GetMe()->GetStation() == CWorldManager::WS_ASK_CHANGE_SCANE) { return; } if(m_Socket.isValid()) { UINT nSizeBefore = m_SocketOutputStream.Length(); //m_SocketOutputStream.WritePacket( pPacket ) ; UINT t_uTail_Begin = m_SocketOutputStream.GetTail();//查询当前包尾位置。记录写包前位置 PacketID_t packetID = pPacket->GetPacketID() ; UINT w = m_SocketOutputStream.Write( (CHAR*)&packetID , sizeof(PacketID_t) ) ; WORD packetTick = 0;//g_pTimeManager->RunTick(); //________________________________ w = m_SocketOutputStream.Write( (CHAR*)&packetTick , sizeof(WORD) ) ; UINT packetUINT ; UINT packetSize = pPacket->GetPacketSize( ) ; UINT packetIndex = pPacket->GetPacketIndex( ) ; SET_PACKET_INDEX(packetUINT, packetIndex) ; SET_PACKET_LEN(packetUINT, packetSize) ; w = m_SocketOutputStream.Write( (CHAR*)&packetUINT, sizeof(UINT) ) ; BOOL ret = pPacket->Write( m_SocketOutputStream ) ; UINT nSizeAfter = m_SocketOutputStream.Length(); UINT t_uTail_End = m_SocketOutputStream.GetTail();//查询当前包尾位置。记录写包后位置 //消息加密处理--Begin { UINT t_uSize = t_uTail_End - t_uTail_Begin; UINT t_uHead = m_SocketOutputStream.GetHead(); UINT t_uTail = m_SocketOutputStream.GetTail(); UINT t_uBufferLen = m_SocketOutputStream.GetBuffLen(); CHAR* t_szBuffer = m_SocketOutputStream.GetBuffer(); if ( t_uHead < t_uTail ) { ENCRYPT(&(t_szBuffer[t_uTail_Begin]), t_uSize, CLIENT_TO_LOGIN_KEY, 0); } else { UINT rightLen = t_uBufferLen - t_uHead ; if( t_uSize <= rightLen ) { ENCRYPT(&(t_szBuffer[t_uTail_Begin]), t_uSize, CLIENT_TO_LOGIN_KEY, 0); } else { ENCRYPT(&(t_szBuffer[t_uTail_Begin]), rightLen, CLIENT_TO_LOGIN_KEY, 0); ENCRYPT(t_szBuffer, t_uSize-rightLen, CLIENT_TO_LOGIN_KEY, rightLen); } } } //消息加密处理--End if(pPacket->GetPacketSize() != nSizeAfter-nSizeBefore-PACKET_HEADER_SIZE) { TDU_Log("Packet size error[id=%d, stream=%d, size=%d]", pPacket->GetPacketID(), nSizeAfter-nSizeBefore-PACKET_HEADER_SIZE, pPacket->GetPacketSize()); //TDThrow("Packet size error[id=%d, stream=%d, size=%d]", // pPacket->GetPacketID(), nSizeAfter-nSizeBefore-PACKET_HEADER_SIZE, pPacket->GetPacketSize()); } } }