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