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); }
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())); } }
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); }
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); }