private byte[] ComputeEncryptionKey(KexAlgorithm kexAlg, byte[] exchangeHash, int blockSize, byte[] sharedSecret, char letter) { var keyBuffer = new byte[blockSize]; var keyBufferIndex = 0; byte[] currentHash = null; while (keyBufferIndex < blockSize) { using (var worker = new SshDataWorker()) { worker.WriteMpint(sharedSecret); worker.Write(exchangeHash); if (currentHash == null) { worker.Write((byte)letter); worker.Write(this.SessionId); } else { worker.Write(currentHash); } currentHash = kexAlg.ComputeHash(worker.ToByteArray()); } var currentHashLength = Math.Min(currentHash.Length, blockSize - keyBufferIndex); Array.Copy(currentHash, 0, keyBuffer, keyBufferIndex, currentHashLength); keyBufferIndex += currentHashLength; } return(keyBuffer); }
private byte[] ComputeExchangeHash(KexAlgorithm kexAlg, byte[] hostKeyAndCerts, byte[] clientExchangeValue, byte[] serverExchangeValue, byte[] sharedSecret) { using (var worker = new SshDataWorker()) { worker.Write(this.ClientVersion, Encoding.ASCII); worker.Write(this.ServerVersion, Encoding.ASCII); worker.WriteBinary(this.exchangeContext.ClientKexInitPayload); worker.WriteBinary(this.exchangeContext.ServerKexInitPayload); worker.WriteBinary(hostKeyAndCerts); worker.WriteMpint(clientExchangeValue); worker.WriteMpint(serverExchangeValue); worker.WriteMpint(sharedSecret); return(kexAlg.ComputeHash(worker.ToByteArray())); } }