Beispiel #1
0
        public void Authenticate(string username, string password)
        {
            PacketGeneral packet_auth = new PacketGeneral(Packet.SSH_MSG_USERAUTH_REQUEST);

            packet_auth.GetStreamWriter().WriteString("ssh-userauth");
            SendPacket(crypto_encryptor, packet_auth);
            Packet packet = RecvPacket(crypto_decryptor);

            if (packet.Message == Packet.SSH_MSG_SERVICE_ACCEPT)
            {
                Console.WriteLine("SSH_MSG_SERVICE_ACCEPT");
            }

            packet_auth = new PacketGeneral(50);
            NetworkByteWriter nbw_cache = packet_auth.GetStreamWriter();

            //SSH_MSG_USERAUTH_REQUEST
            nbw_cache.WriteString(username);
            nbw_cache.WriteString("ssh-connection");
            nbw_cache.WriteString("password");
            nbw_cache.WriteByte((byte)0);
            nbw_cache.WriteString(password);

            SendPacket(crypto_encryptor, packet_auth);

            packet = RecvPacket(crypto_decryptor);

            if (Packet.SSH_MSG_USERAUTH_SUCCESS == packet.Message)
            {
                Console.WriteLine("oh ya!");
            }
        }
Beispiel #2
0
 public PacketGeneral(int message)
     : base()
 {
     cache  = new MemoryStream();
     writer = new NetworkByteWriter(cache);
     writer.WriteByte((byte)message);
 }
Beispiel #3
0
        public bool Connect(string address, int port)
        {
            tcpclient = new TcpClient(address, port);
            NetworkStream ns = tcpclient.GetStream();

            reader = new NetworkByteReader(ns);
            writer = new NetworkByteWriter(ns);
            return(false);
        }
Beispiel #4
0
        public void KeyVerify(string algorithm, HashAlgorithm hash)
        {
            MemoryStream      cache     = new MemoryStream();
            NetworkByteWriter nbr_cache = new NetworkByteWriter(cache);

            nbr_cache.WriteString(verify_v_c);
            nbr_cache.WriteString(verify_v_s);
            nbr_cache.WriteBlob(verify_i_c);
            nbr_cache.WriteBlob(verify_i_s);
            nbr_cache.WriteBlob(verify_k_s);
            nbr_cache.WriteMPInt(verify_e);
            nbr_cache.WriteMPInt(verify_f);
            nbr_cache.WriteMPInt(verify_k);
            nbr_cache.Flush();

            if (algorithm == "ssh-rsa")
            {
                verify_h = hash.ComputeHash(cache.ToArray());

                RSAParameters RSAKeyInfo = new RSAParameters();
                {
                    MemoryStream      ms_tmp  = new MemoryStream(verify_k_s);
                    NetworkByteReader nbr_tmp = new NetworkByteReader(ms_tmp);

                    string     type  = nbr_tmp.ReadString();
                    BigInteger rsa_e = nbr_tmp.ReadMPInt();
                    BigInteger rsa_n = nbr_tmp.ReadMPInt();
                    RSAKeyInfo.Modulus  = NetworkByteUtils.BigIntegerToUnsignedArray(rsa_n);
                    RSAKeyInfo.Exponent = NetworkByteUtils.BigIntegerToUnsignedArray(rsa_e);
                }
                byte[] rsa_signature_blob;
                {
                    MemoryStream      ms_tmp  = new MemoryStream(verify_sig);
                    NetworkByteReader nbr_tmp = new NetworkByteReader(ms_tmp);

                    string type = nbr_tmp.ReadString();
                    rsa_signature_blob = nbr_tmp.ReadBlob();
                }


                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                RSA.ImportParameters(RSAKeyInfo);
                RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
                RSADeformatter.SetHashAlgorithm("SHA1");

                byte[] xx2    = SHA1.Create().ComputeHash(verify_h);
                bool   verify = RSADeformatter.VerifySignature(xx2, rsa_signature_blob);
            }
        }
Beispiel #5
0
        override public void Pack()
        {
            MemoryStream      ms  = new MemoryStream();
            NetworkByteWriter nbw = new NetworkByteWriter(ms);

            nbw.WriteByte((byte)Message);
            nbw.WriteBytes(cookie);
            nbw.WriteNameList(kex_algorithms);
            nbw.WriteNameList(server_host_key_algorithms);
            nbw.WriteNameList(encryption_algorithms_client_to_server);
            nbw.WriteNameList(encryption_algorithms_server_to_client);
            nbw.WriteNameList(mac_algorithms_client_to_server);
            nbw.WriteNameList(mac_algorithms_server_to_client);
            nbw.WriteNameList(compression_algorithms_client_to_server);
            nbw.WriteNameList(compression_algorithms_server_to_client);
            nbw.WriteNameList(languages_client_to_server);
            nbw.WriteNameList(languages_server_to_client);
            nbw.WriteBoolean(first_kex_packet_follows);
            nbw.WriteUInt32(0);
            nbw.Flush();
            SetPayload(ms.ToArray());
        }
 public bool Connect(string address, int port)
 {
     tcpclient = new TcpClient(address, port);
     NetworkStream ns = tcpclient.GetStream();
     reader = new NetworkByteReader(ns);
     writer = new NetworkByteWriter(ns);
     return false;
 }
        public void SendPacket(ICryptoTransform encryptor, Packet packet)
        {
            byte[] payload = packet.GetPayload();
            int blocksize = 16;
            if (encryptor == null)
            {
                uint size = (uint)payload.Length;
                size += 5;
                size = (uint)((size + blocksize) / blocksize * blocksize);

                uint packet_length = size - 4;
                byte padding_length = (byte)(size - 5 - payload.Length);

                MemoryStream ms = new MemoryStream();
                NetworkByteWriter nbw = new NetworkByteWriter(ms);

                nbw.WriteUInt32(packet_length);
                nbw.WriteByte(padding_length);
                nbw.WriteBytes(payload);
                for (int i = 0; i < padding_length; i++ ) nbw.WriteByte(0x0C);
                nbw.Flush();

                writer.WriteBytes(ms.ToArray());
                writer.Flush();
            }
            else
            {
                blocksize = Math.Max(encryptor.InputBlockSize, blocksize);
                uint size = (uint)payload.Length;
                size += (5 + (uint)encryptor.InputBlockSize);
                size = (uint)((size + blocksize) / blocksize * blocksize);

                uint packet_length = size - 4;
                byte padding_length = (byte)(size - 5 - payload.Length);
                MemoryStream ms = new MemoryStream();
                NetworkByteWriter nbw = new NetworkByteWriter(ms);

                nbw.WriteUInt32(packet_length);
                nbw.WriteByte(padding_length);
                nbw.WriteBytes(payload);
                for (int i = 0; i < padding_length; i++) nbw.WriteByte(0x0C);
                nbw.Flush();

                // compute mac
                byte[] cache = ms.ToArray();

                MemoryStream ms_mac = new MemoryStream();
                NetworkByteWriter nbw_mac = new NetworkByteWriter(ms_mac);
                nbw_mac.WriteUInt32((uint)sequence);
                nbw_mac.WriteBytes(cache);
                nbw_mac.Flush();
                byte[] mac = crypto_mac_encryptor.ComputeHash(ms_mac.ToArray());

                crypto_encryptor.TransformBlock(cache, 0, cache.Length, cache, 0);

                writer.WriteBytes(cache);
                writer.Flush();
                if (crypto_mac_encryptor != null)
                {
                    writer.WriteBytes(mac);
                }
            }

            sequence++;
        }
        public Packet RecvPacket(ICryptoTransform decryptor)
        {
            if (decryptor == null)
            {
                Packet packet = new Packet();
                uint packet_length = reader.ReadUInt32();
                byte padding_length = reader.ReadByte();
                byte[] payload = reader.ReadBytes(packet_length - padding_length - 1);
                byte[] padding = reader.ReadBytes(padding_length);
                packet.SetPayload(payload);
                return packet;
            }
            else
            {
                int blocksize = Math.Max(decryptor.InputBlockSize, 8);
                MemoryStream ms_packet = new MemoryStream();
                NetworkByteWriter writer_packet = new NetworkByteWriter(ms_packet);

                byte[] buffer = new byte[blocksize];

                bool first = true;
                int more = 0;
                while (true)
                {
                    // read a block
                    int ret = reader.ReadBytes(buffer, 0, blocksize);
                    // must be a real block size;
                    if (ret != blocksize) return null;
                    decryptor.TransformBlock(buffer, 0, buffer.Length, buffer, 0);
                    writer_packet.WriteBytes(buffer);

                    if (first) // it's first time, need parse packet_length and padding_length
                    {
                        NetworkByteReader reader_buffer = new NetworkByteReader(new MemoryStream(buffer));
                        uint packet_length_t = reader_buffer.ReadUInt32();
                        first = false;

                        more = (int)packet_length_t + 4 - blocksize;
                        if (more % blocksize != 0) return null;
                    }
                    else
                    {
                        more -= blocksize;
                    }
                    if (more <= 0) break;
                }

                byte[] mac = reader.ReadBytes(20);

                ms_packet.Seek(0, SeekOrigin.Begin);
                NetworkByteReader reader_packet = new NetworkByteReader(ms_packet);

                Packet packet = new Packet();
                uint packet_length = reader_packet.ReadUInt32();
                byte padding_length = reader_packet.ReadByte();
                byte[] payload = reader_packet.ReadBytes(packet_length - padding_length - 1);
                byte[] padding = reader_packet.ReadBytes(padding_length);
                packet.SetPayload(payload);

                return packet;
            }
        }
        public void PrepareCryptoTransforms()
        {
            byte[] key_cache;
            HashAlgorithm hash_key = SHA1.Create();
            //
            {
                MemoryStream ms_cache = new MemoryStream();
                NetworkByteWriter nbw_cache = new NetworkByteWriter(ms_cache);
                nbw_cache.WriteMPInt(verify_k);
                nbw_cache.WriteBytes(verify_h);
                nbw_cache.WriteByte((byte)0x41);
                nbw_cache.WriteBytes(verify_h);
                key_cache = ms_cache.ToArray();
            }
            byte[] IVc2s = hash_key.ComputeHash(key_cache);
            int j = key_cache.Length - verify_h.Length - 1;
            key_cache[j] = 0x42;
            byte[] IVs2c = hash_key.ComputeHash(key_cache);
            key_cache[j] = 0x43;
            byte[] Ec2s = hash_key.ComputeHash(key_cache);
            key_cache[j] = 0x44;
            byte[] Es2c = hash_key.ComputeHash(key_cache);
            key_cache[j] = 0x45;
            byte[] MACc2s = hash_key.ComputeHash(key_cache);
            key_cache[j] = 0x46;
            byte[] MACs2c = hash_key.ComputeHash(key_cache);

            {
                byte[] tmp = new byte[16];
                Array.Copy(Ec2s, 0, tmp, 0, tmp.Length);
                Ec2s = tmp;
            }

            {
                byte[] tmp = new byte[16];
                Array.Copy(IVc2s, 0, tmp, 0, tmp.Length);
                IVc2s = tmp;
            }

            {
                byte[] tmp = new byte[16];
                Array.Copy(Es2c, 0, tmp, 0, tmp.Length);
                Es2c = tmp;
            }

            {
                byte[] tmp = new byte[16];
                Array.Copy(IVs2c, 0, tmp, 0, tmp.Length);
                IVs2c = tmp;
            }

            RijndaelManaged rijndael = new RijndaelManaged();
            rijndael.Mode = CipherMode.CBC;
            rijndael.Padding = PaddingMode.None;

            crypto_encryptor = rijndael.CreateEncryptor(Ec2s, IVc2s);
            crypto_decryptor = rijndael.CreateDecryptor(Es2c, IVs2c);

            crypto_mac_encryptor = HMACSHA1.Create();
            ((HMAC)crypto_mac_encryptor).Key = MACc2s;
        }
        public void KeyVerify(string algorithm, HashAlgorithm hash)
        {
            MemoryStream cache = new MemoryStream();
            NetworkByteWriter nbr_cache = new NetworkByteWriter(cache);

            nbr_cache.WriteString(verify_v_c);
            nbr_cache.WriteString(verify_v_s);
            nbr_cache.WriteBlob(verify_i_c);
            nbr_cache.WriteBlob(verify_i_s);
            nbr_cache.WriteBlob(verify_k_s);
            nbr_cache.WriteMPInt(verify_e);
            nbr_cache.WriteMPInt(verify_f);
            nbr_cache.WriteMPInt(verify_k);
            nbr_cache.Flush();

            if (algorithm == "ssh-rsa")
            {
                verify_h = hash.ComputeHash(cache.ToArray());

                RSAParameters RSAKeyInfo = new RSAParameters();
                {
                    MemoryStream ms_tmp = new MemoryStream(verify_k_s);
                    NetworkByteReader nbr_tmp = new NetworkByteReader(ms_tmp);

                    string type = nbr_tmp.ReadString();
                    BigInteger rsa_e = nbr_tmp.ReadMPInt();
                    BigInteger rsa_n = nbr_tmp.ReadMPInt();
                    RSAKeyInfo.Modulus = NetworkByteUtils.BigIntegerToUnsignedArray(rsa_n);
                    RSAKeyInfo.Exponent = NetworkByteUtils.BigIntegerToUnsignedArray(rsa_e);
                }
                byte[] rsa_signature_blob;
                {
                    MemoryStream ms_tmp = new MemoryStream(verify_sig);
                    NetworkByteReader nbr_tmp = new NetworkByteReader(ms_tmp);

                    string type = nbr_tmp.ReadString();
                    rsa_signature_blob = nbr_tmp.ReadBlob();
                }

                RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
                RSA.ImportParameters(RSAKeyInfo);
                RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
                RSADeformatter.SetHashAlgorithm("SHA1");

                byte[] xx2 = SHA1.Create().ComputeHash(verify_h);
                bool verify = RSADeformatter.VerifySignature(xx2, rsa_signature_blob);
            }
        }
Beispiel #11
0
        public override void Pack()
        {
            MemoryStream ms = new MemoryStream();
            NetworkByteWriter nbw = new NetworkByteWriter(ms);

            nbw.WriteByte((byte)Message);
            nbw.WriteBytes(cookie);
            nbw.WriteNameList(kex_algorithms);
            nbw.WriteNameList(server_host_key_algorithms);
            nbw.WriteNameList(encryption_algorithms_client_to_server);
            nbw.WriteNameList(encryption_algorithms_server_to_client);
            nbw.WriteNameList(mac_algorithms_client_to_server);
            nbw.WriteNameList(mac_algorithms_server_to_client);
            nbw.WriteNameList(compression_algorithms_client_to_server);
            nbw.WriteNameList(compression_algorithms_server_to_client);
            nbw.WriteNameList(languages_client_to_server);
            nbw.WriteNameList(languages_server_to_client);
            nbw.WriteBoolean(first_kex_packet_follows);
            nbw.WriteUInt32(0);
            nbw.Flush();
            SetPayload(ms.ToArray());
        }
Beispiel #12
0
 public PacketGeneral(int message)
     : base()
 {
     cache = new MemoryStream();
     writer = new NetworkByteWriter(cache);
     writer.WriteByte((byte)message);
 }
Beispiel #13
0
        public Packet RecvPacket(ICryptoTransform decryptor)
        {
            if (decryptor == null)
            {
                Packet packet         = new Packet();
                uint   packet_length  = reader.ReadUInt32();
                byte   padding_length = reader.ReadByte();
                byte[] payload        = reader.ReadBytes(packet_length - padding_length - 1);
                byte[] padding        = reader.ReadBytes(padding_length);
                packet.SetPayload(payload);
                return(packet);
            }
            else
            {
                int               blocksize     = Math.Max(decryptor.InputBlockSize, 8);
                MemoryStream      ms_packet     = new MemoryStream();
                NetworkByteWriter writer_packet = new NetworkByteWriter(ms_packet);

                byte[] buffer = new byte[blocksize];

                bool first = true;
                int  more  = 0;
                while (true)
                {
                    // read a block
                    int ret = reader.ReadBytes(buffer, 0, blocksize);
                    // must be a real block size;
                    if (ret != blocksize)
                    {
                        return(null);
                    }
                    decryptor.TransformBlock(buffer, 0, buffer.Length, buffer, 0);
                    writer_packet.WriteBytes(buffer);

                    if (first) // it's first time, need parse packet_length and padding_length
                    {
                        NetworkByteReader reader_buffer = new NetworkByteReader(new MemoryStream(buffer));
                        uint packet_length_t            = reader_buffer.ReadUInt32();
                        first = false;

                        more = (int)packet_length_t + 4 - blocksize;
                        if (more % blocksize != 0)
                        {
                            return(null);
                        }
                    }
                    else
                    {
                        more -= blocksize;
                    }
                    if (more <= 0)
                    {
                        break;
                    }
                }

                byte[] mac = reader.ReadBytes(20);


                ms_packet.Seek(0, SeekOrigin.Begin);
                NetworkByteReader reader_packet = new NetworkByteReader(ms_packet);

                Packet packet         = new Packet();
                uint   packet_length  = reader_packet.ReadUInt32();
                byte   padding_length = reader_packet.ReadByte();
                byte[] payload        = reader_packet.ReadBytes(packet_length - padding_length - 1);
                byte[] padding        = reader_packet.ReadBytes(padding_length);
                packet.SetPayload(payload);

                return(packet);
            }
        }
Beispiel #14
0
        public void SendPacket(ICryptoTransform encryptor, Packet packet)
        {
            byte[] payload   = packet.GetPayload();
            int    blocksize = 16;

            if (encryptor == null)
            {
                uint size = (uint)payload.Length;
                size += 5;
                size  = (uint)((size + blocksize) / blocksize * blocksize);

                uint packet_length  = size - 4;
                byte padding_length = (byte)(size - 5 - payload.Length);

                MemoryStream      ms  = new MemoryStream();
                NetworkByteWriter nbw = new NetworkByteWriter(ms);

                nbw.WriteUInt32(packet_length);
                nbw.WriteByte(padding_length);
                nbw.WriteBytes(payload);
                for (int i = 0; i < padding_length; i++)
                {
                    nbw.WriteByte(0x0C);
                }
                nbw.Flush();

                writer.WriteBytes(ms.ToArray());
                writer.Flush();
            }
            else
            {
                blocksize = Math.Max(encryptor.InputBlockSize, blocksize);
                uint size = (uint)payload.Length;
                size += (5 + (uint)encryptor.InputBlockSize);
                size  = (uint)((size + blocksize) / blocksize * blocksize);

                uint              packet_length  = size - 4;
                byte              padding_length = (byte)(size - 5 - payload.Length);
                MemoryStream      ms             = new MemoryStream();
                NetworkByteWriter nbw            = new NetworkByteWriter(ms);

                nbw.WriteUInt32(packet_length);
                nbw.WriteByte(padding_length);
                nbw.WriteBytes(payload);
                for (int i = 0; i < padding_length; i++)
                {
                    nbw.WriteByte(0x0C);
                }
                nbw.Flush();

                // compute mac
                byte[] cache = ms.ToArray();

                MemoryStream      ms_mac  = new MemoryStream();
                NetworkByteWriter nbw_mac = new NetworkByteWriter(ms_mac);
                nbw_mac.WriteUInt32((uint)sequence);
                nbw_mac.WriteBytes(cache);
                nbw_mac.Flush();
                byte[] mac = crypto_mac_encryptor.ComputeHash(ms_mac.ToArray());



                crypto_encryptor.TransformBlock(cache, 0, cache.Length, cache, 0);

                writer.WriteBytes(cache);
                writer.Flush();
                if (crypto_mac_encryptor != null)
                {
                    writer.WriteBytes(mac);
                }
            }

            sequence++;
        }
Beispiel #15
0
        public void PrepareCryptoTransforms()
        {
            byte[]        key_cache;
            HashAlgorithm hash_key = SHA1.Create();

            //
            {
                MemoryStream      ms_cache  = new MemoryStream();
                NetworkByteWriter nbw_cache = new NetworkByteWriter(ms_cache);
                nbw_cache.WriteMPInt(verify_k);
                nbw_cache.WriteBytes(verify_h);
                nbw_cache.WriteByte((byte)0x41);
                nbw_cache.WriteBytes(verify_h);
                key_cache = ms_cache.ToArray();
            }
            byte[] IVc2s = hash_key.ComputeHash(key_cache);
            int    j     = key_cache.Length - verify_h.Length - 1;

            key_cache[j] = 0x42;
            byte[] IVs2c = hash_key.ComputeHash(key_cache);
            key_cache[j] = 0x43;
            byte[] Ec2s = hash_key.ComputeHash(key_cache);
            key_cache[j] = 0x44;
            byte[] Es2c = hash_key.ComputeHash(key_cache);
            key_cache[j] = 0x45;
            byte[] MACc2s = hash_key.ComputeHash(key_cache);
            key_cache[j] = 0x46;
            byte[] MACs2c = hash_key.ComputeHash(key_cache);


            {
                byte[] tmp = new byte[16];
                Array.Copy(Ec2s, 0, tmp, 0, tmp.Length);
                Ec2s = tmp;
            }

            {
                byte[] tmp = new byte[16];
                Array.Copy(IVc2s, 0, tmp, 0, tmp.Length);
                IVc2s = tmp;
            }

            {
                byte[] tmp = new byte[16];
                Array.Copy(Es2c, 0, tmp, 0, tmp.Length);
                Es2c = tmp;
            }

            {
                byte[] tmp = new byte[16];
                Array.Copy(IVs2c, 0, tmp, 0, tmp.Length);
                IVs2c = tmp;
            }

            RijndaelManaged rijndael = new RijndaelManaged();

            rijndael.Mode    = CipherMode.CBC;
            rijndael.Padding = PaddingMode.None;


            crypto_encryptor = rijndael.CreateEncryptor(Ec2s, IVc2s);
            crypto_decryptor = rijndael.CreateDecryptor(Es2c, IVs2c);

            crypto_mac_encryptor             = HMACSHA1.Create();
            ((HMAC)crypto_mac_encryptor).Key = MACc2s;
        }
Beispiel #16
0
        public void OpenChannel(VideoTerminal x)
        {
            PacketGeneral     packet_openchannel = new PacketGeneral(90);
            NetworkByteWriter nbw = packet_openchannel.GetStreamWriter();

            nbw.WriteString("session");
            nbw.WriteUInt32(0);
            nbw.WriteUInt32(1048576);
            nbw.WriteUInt32(16384);

            SendPacket(crypto_encryptor, packet_openchannel);

            Packet            packet = RecvPacket(crypto_decryptor);
            NetworkByteReader nbr    = packet.GenerateReader();

            nbr.ReadByte();
            uint recipient_channel = nbr.ReadUInt32();

            uint sender_channel      = nbr.ReadUInt32();
            uint initial_window_size = nbr.ReadUInt32();
            uint maximum_packet_size = nbr.ReadUInt32();


            PacketGeneral packet_pty = new PacketGeneral(Packet.SSH_MSG_CHANNEL_REQUEST);

            nbw = packet_pty.GetStreamWriter();
            nbw.WriteUInt32(recipient_channel);
            nbw.WriteString("pty-req");
            nbw.WriteByte(0);
            nbw.WriteString("vt100");
            nbw.WriteUInt32(80);
            nbw.WriteUInt32(24);
            nbw.WriteUInt32(640);
            nbw.WriteUInt32(480);
            nbw.WriteString("");
            SendPacket(crypto_encryptor, packet_pty);

            PacketGeneral packet_shell = new PacketGeneral(Packet.SSH_MSG_CHANNEL_REQUEST);

            nbw = packet_shell.GetStreamWriter();
            nbw.WriteUInt32(recipient_channel);
            nbw.WriteString("shell");
            nbw.WriteByte(0);
            SendPacket(crypto_encryptor, packet_shell);


            while (true)
            {
                if (RecvAvailable())
                {
                    packet = RecvPacket(crypto_decryptor);
                    switch (packet.Message)
                    {
                    case Packet.SSH_MSG_CHANNEL_WINDOW_ADJUST:
                        break;

                    case Packet.SSH_MSG_CHANNEL_DATA:
                        PacketChannelData p = new PacketChannelData(packet);
                        p.Parse();
                        x.HandleServerData(p.data);
                        break;

                    default:
                        break;
                    }
                }
                else
                {
                    string data = x.GetClientData();
                    if (data.Length != 0)
                    {
                        PacketGeneral packet_key = new PacketGeneral(Packet.SSH_MSG_CHANNEL_DATA);
                        nbw = packet_key.GetStreamWriter();
                        nbw.WriteUInt32(recipient_channel);
                        nbw.WriteString(data);
                        SendPacket(crypto_encryptor, packet_key);
                    }
                }
            }
        }