public override Result ModifySend(Packet packet, MemoryStream packetBuf, int packetStartPosition) { int BLOCK_SIZE = 16; uint len = Protocol.GetMessageLength(packetBuf, packetStartPosition); // 스트림에 패드 크기를 확보해 둔다. 아래 구현은 서버와 같다. var padSize = BLOCK_SIZE - (len - Protocol.headerSize) % BLOCK_SIZE; var pad = HexStringToBytes("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"); packetBuf.Write(pad, 0, (int)padSize); byte[] buf = packetBuf.GetBuffer(); // 해시 데이터 반영 sender.UpdateHash(buf, packetStartPosition + Protocol.headerSize, (int)(len - Protocol.headerSize)); byte[] encryptedData = sender.TransformFinalBlock(buf, packetStartPosition + Protocol.headerSize, (int)(len - Protocol.headerSize)); Buffer.BlockCopy(encryptedData, 0, buf, packetStartPosition + Protocol.headerSize, encryptedData.Length); // 완료 처리 sender.Complete(); // 패킷 길이 변경 Protocol.SetMessageLength(packetBuf, packetStartPosition, (uint)(encryptedData.Length + Protocol.headerSize)); return(Result.Success()); }
public override Result ModifyRecv(Packet packet, MemoryStream packetBuf, int packetStartPosition) { uint len = Protocol.GetMessageLength(packetBuf, packetStartPosition); // 서버 구현에 맞춤. 비어 있으면 해시 없음 if (len == Protocol.headerSize) { return(Result.Success()); } var buf = packetBuf.GetBuffer(); byte[] hash = crc.ComputeHash( buf, packetStartPosition + Protocol.headerSize, (int)(len - Protocol.headerSize - 4)); var crcIndex = packetStartPosition + (int)(len - 4); bool equal = hash[0] == buf[crcIndex + 0] && hash[1] == buf[crcIndex + 1] && hash[2] == buf[crcIndex + 2] && hash[3] == buf[crcIndex + 3]; if (!equal) { return(Result.Fail(Result.Code.FailInvalidCrc)); } Protocol.SetMessageLength(packetBuf, packetStartPosition, len - 4); return(Result.Success()); }
public override Result ModifySend(Packet packet, MemoryStream packetBuf, int packetStartPosition) { uint len = Protocol.GetMessageLength(packetBuf, packetStartPosition); packetBuf.WriteByte(sendSeq); Protocol.SetMessageLength(packetBuf, packetStartPosition, len + 1); IncSendSeq(); return(Result.Success()); }
public override Result ModifyRecv(Packet packet, MemoryStream packetBuf, int packetStartPosition) { uint len = Protocol.GetMessageLength(packetBuf, packetStartPosition); byte[] buf = packetBuf.GetBuffer(); byte[] decryptedData = recevier.TransformFinalBlock(buf, packetStartPosition + Protocol.headerSize, (int)(len - Protocol.headerSize)); Buffer.BlockCopy(decryptedData, 0, buf, packetStartPosition + Protocol.headerSize, decryptedData.Length); recevier.UpdateHash(decryptedData, 0, decryptedData.Length); // 완료 처리 recevier.Complete(); // 패킷 길이 변경 Protocol.SetMessageLength(packetBuf, packetStartPosition, (uint)(decryptedData.Length + Protocol.headerSize)); return(Result.Success()); }
public override Result ModifyRecv(Packet packet, MemoryStream packetBuf, int packetStartPosition) { uint len = Protocol.GetMessageLength(packetBuf, packetStartPosition); var buf = packetBuf.GetBuffer(); byte seq = buf[packetStartPosition + len - 1]; if (seq != recvSeq) { return(Result.Fail(Result.Code.FailInvalidRecvSequence)); } Protocol.SetMessageLength(packetBuf, packetStartPosition, len - 1); IncRecvSeq(); return(Result.Success()); }
public override Result ModifySend(Packet packet, MemoryStream packetBuf, int packetStartPosition) { uint len = Protocol.GetMessageLength(packetBuf, packetStartPosition); // 서버 구현에 맞춤. 비어 있으면 해시 없음 if (len == Protocol.headerSize) { return(Result.Success()); } var buf = packetBuf.GetBuffer(); byte[] hash = crc.ComputeHash( buf, packetStartPosition + Protocol.headerSize, (int)(len - Protocol.headerSize)); packetBuf.Write(hash, 0, 4); Protocol.SetMessageLength(packetBuf, packetStartPosition, len + 4); return(Result.Success()); }