//writer util private SSH2DataWriter OpenWriter(AgentForwadPacketType pt) { SSH2DataWriter wr = new SSH2DataWriter(); wr.WriteInt32(0); //length field wr.WriteByte((byte)pt); return wr; }
private byte[] DeriveKey(BigInteger key, byte[] hash, char ch, int length) { byte[] result = new byte[length]; SSH2DataWriter wr = new SSH2DataWriter(); wr.WriteBigInteger(key); wr.Write(hash); wr.WriteByte((byte)ch); wr.Write(_sessionID); byte[] h1 = new SHA1CryptoServiceProvider().ComputeHash(wr.ToByteArray()); if (h1.Length >= length) { Array.Copy(h1, 0, result, 0, length); return result; } else { wr = new SSH2DataWriter(); wr.WriteBigInteger(key); wr.Write(_sessionID); wr.Write(h1); byte[] h2 = new SHA1CryptoServiceProvider().ComputeHash(wr.ToByteArray()); if (h1.Length + h2.Length >= length) { Array.Copy(h1, 0, result, 0, h1.Length); Array.Copy(h2, 0, result, h1.Length, length - h1.Length); return result; } else throw new SSHException("necessary key length is too big"); //long key is not supported } }