//收到公钥数据 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 }
/// <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); } }