예제 #1
0
        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);
        }
예제 #2
0
        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()));
            }
        }