Exemple #1
0
        //收到公钥数据
        private void OnReceivePublicKey(PacketReader reader)
        {
#if _NC_Compress
            if (m_secure_connection == false || reader.Size != 148)
            {
                this.CloseConnection();
                return;
            }
            int secflag = reader.ReadInt32();
            m_compressneedchecksum = (secflag == (int)PacketFlag.Compress_Need_Checksum);
            byte[] firstkey = reader.ReadBuffer(16);
            byte[] checksum = reader.ReadBuffer(16);

            if (m_encryptfirst == null)
            {
                m_encryptfirst = new TeaEncryption();
            }
            m_encryptfirst.Key = firstkey;
            m_encryptfirst.Decrypt(checksum, 0, checksum.Length);
            for (int i = 0; i < 16; i++)
            {
                if (firstkey[i] != checksum[i])
                {
                    CloseConnection();
                    return;
                }
            }
            if (m_encrypt == null)
            {
                m_encrypt = new TeaEncryption();
                m_encrypt.GenericKey();
            }
            byte[] pairkey = new byte[16];
            Array.Copy(m_encrypt.Key, pairkey, 16);
            m_encryptfirst.Encrypt(pairkey, 0, 16);
            byte[] sendkey = new byte[128];
            Utility.Randomizer.NextBytes(sendkey);
            Buffer.BlockCopy(pairkey, 0, sendkey, 0, 16);
            m_encryptfirst.Decrypt(pairkey, 0, 16);
            SendSessionKeyPacket packet = new SendSessionKeyPacket(sendkey);
            SendPacket(packet, false);
            firstkey          = null;   //clear temp key
            m_connectionState = ConnectionState.Connected;
            //callback
            if (m_listener != null)
            {
                m_listener.OnSecureAccepted(this);
            }
#endif
        }
Exemple #2
0
        /// <summary>
        /// 发送一个消息包
        /// </summary>
        /// <param name="packet"></param>
        /// <param name="needencrypt">是否加密</param>
        /// <returns></returns>
        public override void SendPacket(Packet packet, bool encrypt_if_need)
        {
            if (m_sendlock == null)
            {
                UnityEngine.Debug.Log("m_sendlock == null");
                return;
            }

            lock (this)
            {
                packet.SerialNumber = m_lastSendPacketSerialNumber;
                m_lastSendPacketSerialNumber++;

                byte[]     data       = packet.ToArray();
                int        datalength = packet.Length;
                PacketFlag packetflag = packet.PacketFlag;
                //加密,压缩消息包
                if (m_secure_connection && m_connectionState == ConnectionState.Connected)
                {
                    if (tls_sendSecureBuffer == null)
                    {
                        tls_sendSecureBuffer = new byte[Packet.MaxLength];
                    }
                    //压缩
                    bool compressed = false;
#if _NC_Compress
                    if (data.Length > Packet.NeedCompressMinLength)
                    {
                        int outlen = Compress.LZO.Compress(data, Packet.NoCryptHeaderLength, data.Length - Packet.NoCryptHeaderLength,
                                                           tls_sendSecureBuffer, Packet.NoCryptHeaderLength);
                        if (outlen <= (data.Length - 20))                        //压缩有实际效果
                        {
                            //Buffer.BlockCopy(m_sendSecureBuffer, 0, data, Packet.NoCryptHeaderLength, outlen);
                            datalength = outlen + Packet.NoCryptHeaderLength;
                            Buffer.BlockCopy(data, 0, tls_sendSecureBuffer, 0, Packet.NoCryptHeaderLength);
                            if (m_compressneedchecksum)
                            {
                                uint crccheck = HashHelp.CRC32hash(tls_sendSecureBuffer, Packet.NoCryptHeaderLength, outlen);
                                ArrayUtility.SetInt(tls_sendSecureBuffer, (int)crccheck, datalength);
                                datalength += 4;
                            }
                            packetflag |= PacketFlag.Compressed;
                            data        = tls_sendSecureBuffer;
                            compressed  = true;
                        }
                    }
                    if (encrypt_if_need && m_encrypt != null)
                    {
                        if (!compressed)
                        {
                            Buffer.BlockCopy(data, 0, tls_sendSecureBuffer, 0, datalength);
                            data = tls_sendSecureBuffer;
                        }
                        m_encrypt.Encrypt(data, Packet.NoCryptHeaderLength, datalength - Packet.NoCryptHeaderLength);
                        packetflag |= PacketFlag.Encrypted;
                    }
#endif
                }

                //设置消息长度
                ArrayUtility.SetByte(data, (byte)packetflag, Packet.OffsetFlag);
                ArrayUtility.SetShort(data, (short)datalength, Packet.OffsetLength);
                this.Send(data, datalength);
            }
        }