示例#1
0
        public static byte[] UnPack(byte[] data, out uint sess)
        {
            sess = 0;
            var len = data.Length;

            if (len == Const.HeartBeatLength)
            {
                return(new byte[] { });
            }
            //先检查下最小长度//
            if (len < Const.PackageSessionLength + Const.PackageHmacLength)
            {
                DebugLogger.DebugNetworkError("Receve Data Length Error! Got " + len + " Byte, Less than Session Length plus Hmac Length");
                throw new NetworkingException((int)ErrorCode.DataError);
            }
            string hmac_pkg    = NetCrypter.CryptData(data, 0, len - Const.PackageHmacLength);
            string hmac_server = Encoding.Default.GetString(data, len - Const.PackageHmacLength, Const.PackageHmacLength);

            if (hmac_pkg != hmac_server)
            {
                DebugLogger.DebugNetworkError("HMAC Invalid! hmac_pkg:" + hmac_pkg + ", hmac_server: " + hmac_server);
                throw new NetworkingException((int)ErrorCode.DataError);
            }
            int dataLength = len - Const.PackageHmacLength - Const.PackageSessionLength;

            //获得SessionID//
            sess = NetUtil.bigEndian2UInt(data, dataLength, Const.PackageSessionLength);
            //拷贝获得的接收数据//
            var ReceiveData = new byte[dataLength];

            Buffer.BlockCopy(data, 0, ReceiveData, 0, dataLength);
            return(ReceiveData);
        }
示例#2
0
        public static byte[] Pack(uint sess, string opCode, byte[] data)
        {
            int index  = 0;
            int msglen = data.Length + Const.PackageSessionLength + Const.PackageHmacLength;

            byte[] header   = NetUtil.ushort2bigEndian((ushort)msglen);
            var    SendData = new byte[header.Length + msglen];

            // 拷贝文件长度数据
            Buffer.BlockCopy(header, 0, SendData, index, header.Length);
            index += header.Length;
            //先将数据拷贝到数据包//
            Buffer.BlockCopy(data, 0, SendData, index, data.Length);
            index += data.Length;
            //获得Session的Byte数据//
            byte[] session = NetUtil.uInt2BigEndian(sess);
            //拷贝Session数据//
            Buffer.BlockCopy(session, 0, SendData, index, session.Length);
            index += session.Length;
            //计算Hmac数据//
            byte[] hmac = Encoding.Default.GetBytes(NetCrypter.CryptData(SendData, header.Length, index));
            //拷贝Hmac数据//
            Buffer.BlockCopy(hmac, 0, SendData, index, hmac.Length);
            return(SendData);
        }
示例#3
0
        public static byte[] GenHandShake(string uid, string gameServer, string subid, uint connectionIndex)
        {
            int clientReceivedSeq = 0;

            DebugLogger.Debug("GenHandShake uid:" + uid + " gameServer:" + gameServer + " subid:" + subid);
            string handshake = string.Format
                               (
                "{0}@{1}#{2}:{3}:{4}",
                Convert.ToBase64String(Encoding.Default.GetBytes(uid)),
                Convert.ToBase64String(Encoding.Default.GetBytes(gameServer)),
                Convert.ToBase64String(Encoding.Default.GetBytes(subid)),
                connectionIndex,
                clientReceivedSeq
                               );
            string hmac_encode64 = handshake + ":" + NetCrypter.CryptData(handshake);

            byte[] hmac_encode64_bits = Encoding.Default.GetBytes(hmac_encode64);
            return(hmac_encode64_bits);
        }