Exemplo n.º 1
0
 private static byte[] GetPeerHandshakeMessage(ExtendedTorrent torrent, string peerId)
 {
     byte[] handshake = new byte[49 + BitTorrentProtocol.ProtocolNameLength];
     handshake[0] = Convert.ToByte(BitTorrentProtocol.ProtocolNameLength);
     Array.Copy(BitTorrentProtocol.ProtocolNameBytes, 0, handshake, 1, BitTorrentProtocol.ProtocolNameLength);
     Array.Copy(BitConverter.GetBytes((long)0), 0, handshake, BitTorrentProtocol.ProtocolNameLength + 1,
                8); //reserved
     Array.Copy(torrent.GetInfoHashBytes(), 0, handshake, BitTorrentProtocol.ProtocolNameLength + 9, 20);
     Array.Copy(Encoding.ASCII.GetBytes(peerId), 0, handshake, BitTorrentProtocol.ProtocolNameLength + 29, 20);
     return(handshake);
 }
Exemplo n.º 2
0
        /*TBC
         * public static byte[] GetAnnounceRequestPacket(byte[] connectionId, byte[] transactionId, Torrent torrent, int localPort)
         * {
         *  byte[] announcePacket = new byte[98];
         *  Array.Copy(connectionId, 0, announcePacket, 0, 8);
         *  Array.Copy(BitConverter.GetBytes(1).Reverse().ToArray(), 0, announcePacket, 8, 4);//action
         *  Array.Copy(transactionId, 0, announcePacket, 12, 4);
         *  Array.Copy(torrent.GetInfoHashBytes(), 0, announcePacket, 16, 20);
         *  Array.Copy(Encoding.ASCII.GetBytes(GeneratePeerId()), 0, announcePacket, 36, 20);
         *  Array.Copy(BitConverter.GetBytes(torrent).Reverse().ToArray(), 0, announcePacket, 56, 8);//downloaded
         *  Array.Copy(BitConverter.GetBytes(torrent.Left).Reverse().ToArray(), 0, announcePacket, 64, 8);//left
         *  Array.Copy(BitConverter.GetBytes(torrent.Uploaded).Reverse().ToArray(), 0, announcePacket, 72, 8);//uploaded
         *
         *  //4bytes: event (0)  + 4bytes: ip addr (0)
         *  Array.Copy(BitConverter.GetBytes((long)0), 0, announcePacket, 80, 8);
         *  byte[] key = BitConverter.GetBytes(new Random().Next(0, int.MaxValue)).Reverse().ToArray();
         *  Array.Copy(key, 0, announcePacket, 88, 4);
         *  Array.Copy(BitConverter.GetBytes(-1).Reverse().ToArray(), 0, announcePacket, 92, 4);
         *  Array.Copy(BitConverter.GetBytes((ushort)localPort).Reverse().ToArray(), 0, announcePacket, 96, 2);
         *  return announcePacket;
         * }*/

        private static byte[] GetAnnounceRequestPacketZero(byte[] connectionId, byte[] transactionId, ExtendedTorrent torrent, int localPort, string peerId)
        {
            byte[] announcePacket = new byte[98];
            Array.Copy(connectionId, 0, announcePacket, 0, 8);
            Array.Copy(BitConverter.GetBytes(1).Reverse().ToArray(), 0, announcePacket, 8, 4);//action 1 - announce
            Array.Copy(transactionId, 0, announcePacket, 12, 4);
            Array.Copy(torrent.GetInfoHashBytes(), 0, announcePacket, 16, 20);
            Array.Copy(Encoding.ASCII.GetBytes(peerId), 0, announcePacket, 36, 20);
            Array.Copy(BitConverter.GetBytes((long)0), 0, announcePacket, 56, 8);                               //downloaded
            Array.Copy(BitConverter.GetBytes(torrent.TotalSize).Reverse().ToArray(), 0, announcePacket, 64, 8); //left
            Array.Copy(BitConverter.GetBytes((long)0), 0, announcePacket, 72, 8);                               //event 0-none
            //4bytes: event (0)  + 4bytes: ip addr (0)
            Array.Copy(BitConverter.GetBytes((long)0), 0, announcePacket, 80, 8);
            byte[] key = BitConverter.GetBytes(new Random().Next(0, int.MaxValue)).Reverse().ToArray();
            Array.Copy(key, 0, announcePacket, 88, 4);
            Array.Copy(BitConverter.GetBytes(-1), 0, announcePacket, 92, 4);//default
            Array.Copy(BitConverter.GetBytes((ushort)localPort).Reverse().ToArray(), 0, announcePacket, 96, 2);
            return(announcePacket);
        }
Exemplo n.º 3
0
        private static int ValidatePeerHandshake(byte[] response, int responseLength, ExtendedTorrent torrent)
        {
            int peerPstrLength = Convert.ToInt32(response[0]);

            if (responseLength < peerPstrLength + 49)
            {
                return(1);                                      //possible keep alive message
            }
            if (peerPstrLength != BitTorrentProtocol.ProtocolNameLength)
            {
                return(2);
            }
            byte[] peerProtocolNamebytes = response.SubArray(1, peerPstrLength);
            if (!peerProtocolNamebytes.SequenceEqual(BitTorrentProtocol.ProtocolNameBytes))
            {
                return(2); //not BitTorrentProtocol
            }
            byte[] receivedInfoHash = response.SubArray(peerPstrLength + 9, 20);
            if (!receivedInfoHash.SequenceEqual(torrent.GetInfoHashBytes()))
            {
                return(3); //bad info hash
            }
            return(0);     //handshake correct
        }