Beispiel #1
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 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;
        }
Beispiel #5
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 #6
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 #7
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 #8
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;
        }