示例#1
0
        public static bool TryUnpack(byte[] buf, int size, Encryptor encryptor, out PeerToPeerAccept packet)
        {
            if (!encryptor.TryDecrypt(buf, 9, ref size))
            {
                packet = default;
                return(false);
            }

            int offset = 0;

            if (buf[offset++] != (byte)PeerToPeerAccept.Type)
            {
                packet = default;
                return(false);
            }
            int id       = BinaryUtil.ReadInt(buf, ref offset);
            int nonce    = BinaryUtil.ReadInt(buf, ref offset);
            var revision = buf[offset++];
            var peerSize = buf[offset++];
            var peers    = new PeerInfo[peerSize];

            for (int i = 0; i < peers.Length; i++)
            {
                if (!PeerInfo.TryUnpack(buf, ref offset, out var info))
                {
                    packet = default;
                    return(false);
                }
                peers[i] = info;
            }
            packet = new PeerToPeerAccept(id, nonce, new PeerToPeerList(id, revision, peers));
            return(true);
        }
示例#2
0
        async Task <HandshakeResult> WaitHandshakeAccept()
        {
            while (true)
            {
                var receive = await m_Socket.ReceiveAsync();

                var buf  = receive.Buffer;
                int size = buf.Length;
                if (size == 0 || buf[0] != (byte)PeerToPeerAccept.Type)
                {
                    continue;
                }
                int          offset = 5;
                int          nonce  = BinaryUtil.ReadInt(buf, ref offset);
                EncryptorKey key    = default;
                key.Cookie       = m_Cookie;
                key.MajorVersion = Protocol.MajorVersion;
                key.MinorVersion = Protocol.MinorVersion;
                key.Nonce        = nonce;
                key.ConnectionId = m_SelfId;
                key.Random       = new ArraySegment <byte>(m_Randam);

                var encryptor = m_EncryptorGenerator.Generate(in key);

                if (!PeerToPeerAccept.TryUnpack(buf, size, encryptor, out var packet))
                {
                    throw new Exception("fail unpack HandshakeAccept");
                }
                m_RemoteEP = receive.RemoteEndPoint;
                return(new HandshakeResult(encryptor, packet.GetPeerToPeerList()));
            }
        }
示例#3
0
        public bool OnHandshakeAccept(byte[] buf, int size, out PeerEntry peer, IPEndPoint remoteEP)
        {
            if (size < 9)
            {
                peer = null;
                return(false);
            }
            int offset    = 5;
            int nonce     = BinaryUtil.ReadInt(buf, ref offset);
            var key       = new EncryptorKey(m_Request, m_Info.Randam, nonce);
            var encryptor = m_Connection.m_EncryptorGenerator.Generate(key);

            if (!PeerToPeerAccept.TryUnpack(buf, size, encryptor, out var packet))
            {
                peer = null;
                return(false);
            }

            peer = new PeerEntry(packet.ConnectionId, nonce, encryptor, remoteEP);
            return(true);
        }
示例#4
0
 public void HandshakeAccept(PeerToPeerRequest packet, IPEndPoint remoteEP)
 {
     if (!m_PeerManager.TryGetValue(packet.ConnectionId, out var peer))
     {
         int nonce     = Random.GenInt();
         var randamKey = m_RandamKey ?? GetPeerRandamKey(packet.ConnectionId);
         var key       = new EncryptorKey(packet, randamKey, nonce);
         var encryptor = m_EncryptorGenerator.Generate(in key);
         peer = new PeerEntry(packet.ConnectionId, nonce, encryptor, remoteEP);
         m_PeerManager.Add(peer);
         m_Connection.SendPeerToPeerList();
     }
     if (m_Connection.TryGetPeerToPeerList(out var list))
     {
         var size = new PeerToPeerAccept(m_Connection.SelfId, peer.ClientConnectionId, list).Pack(m_Connection.m_SendBuffer, peer.Encryptor);
         m_Connection.m_Socket.Send(m_Connection.m_SendBuffer, 0, size, remoteEP);
     }
     else
     {
         var size = new PeerToPeerAccept(m_Connection.SelfId, peer.ClientConnectionId).Pack(m_Connection.m_SendBuffer, peer.Encryptor);
         m_Connection.m_Socket.Send(m_Connection.m_SendBuffer, 0, size, remoteEP);
     }
     RemoveTask(packet.ConnectionId);
 }