예제 #1
0
        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());
        }
예제 #2
0
        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());
        }
예제 #3
0
        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());
        }
예제 #4
0
        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());
        }
예제 #5
0
        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());
        }
예제 #6
0
        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());
        }