Beispiel #1
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 #2
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 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()
 {
     writer.Flush();
     SetPayload(cache.ToArray());
 }
Beispiel #6
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 #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++;
        }