コード例 #1
0
ファイル: Session.cs プロジェクト: suntabu/FxSsh
        private void HandleMessage(KeyExchangeDhInitMessage message)
        {
            var kexAlg       = _keyExchangeAlgorithms[_exchangeContext.KeyExchange]();
            var hostKeyAlg   = _publicKeyAlgorithms[_exchangeContext.PublicKey](_hostKey[_exchangeContext.PublicKey].ToString());
            var clientCipher = _encryptionAlgorithms[_exchangeContext.ClientEncryption]();
            var serverCipher = _encryptionAlgorithms[_exchangeContext.ServerEncryption]();
            var serverHmac   = _hmacAlgorithms[_exchangeContext.ServerHmac]();
            var clientHmac   = _hmacAlgorithms[_exchangeContext.ClientHmac]();

            var clientExchangeValue = message.E;
            var serverExchangeValue = kexAlg.CreateKeyExchange();
            var sharedSecret        = kexAlg.DecryptKeyExchange(clientExchangeValue);
            var hostKeyAndCerts     = hostKeyAlg.CreateKeyAndCertificatesData();
            var exchangeHash        = ComputeExchangeHash(kexAlg, hostKeyAndCerts, clientExchangeValue, serverExchangeValue, sharedSecret);

            if (SessionId == null)
            {
                SessionId = exchangeHash;
            }

            var clientCipherIV  = ComputeEncryptionKey(kexAlg, exchangeHash, clientCipher.BlockSize >> 3, sharedSecret, 'A');
            var serverCipherIV  = ComputeEncryptionKey(kexAlg, exchangeHash, serverCipher.BlockSize >> 3, sharedSecret, 'B');
            var clientCipherKey = ComputeEncryptionKey(kexAlg, exchangeHash, clientCipher.KeySize >> 3, sharedSecret, 'C');
            var serverCipherKey = ComputeEncryptionKey(kexAlg, exchangeHash, serverCipher.KeySize >> 3, sharedSecret, 'D');
            var clientHmacKey   = ComputeEncryptionKey(kexAlg, exchangeHash, clientHmac.KeySize >> 3, sharedSecret, 'E');
            var serverHmacKey   = ComputeEncryptionKey(kexAlg, exchangeHash, serverHmac.KeySize >> 3, sharedSecret, 'F');

            _exchangeContext.NewAlgorithms = new Algorithms
            {
                KeyExchange       = kexAlg,
                PublicKey         = hostKeyAlg,
                ClientEncryption  = clientCipher.Cipher(clientCipherKey, clientCipherIV, false),
                ServerEncryption  = serverCipher.Cipher(serverCipherKey, serverCipherIV, true),
                ClientHmac        = clientHmac.Hmac(clientHmacKey),
                ServerHmac        = serverHmac.Hmac(serverHmacKey),
                ClientCompression = _compressionAlgorithms[_exchangeContext.ClientCompression](),
                ServerCompression = _compressionAlgorithms[_exchangeContext.ServerCompression](),
            };

            var reply = new KeyExchangeDhReplyMessage
            {
                HostKey   = hostKeyAndCerts,
                F         = serverExchangeValue,
                Signature = hostKeyAlg.CreateSignatureData(exchangeHash),
            };

            SendMessage(reply);
            SendMessage(new NewKeysMessage());
        }
コード例 #2
0
        public void KeyExchangeDhReplyMessageConstructorTest()
        {
            KeyExchangeDhReplyMessage target = new KeyExchangeDhReplyMessage();

            Assert.Inconclusive("TODO: Implement code to verify target");
        }