예제 #1
0
        private void HandleSpecificPacket(KexInit packet)
        {
            _Logger.LogDebug("Received KexInit packet.");

            if (_PendingExchangeContext == null)
            {
                _Logger.LogDebug("Re-exchanging keys!");
                _PendingExchangeContext = new ExchangeContext();
                Send(_KexInitServerToClient);
            }

            _KexInitClientToServer = packet;

            _PendingExchangeContext.KexAlgorithm               = packet.PickKexAlgorithm();
            _PendingExchangeContext.HostKeyAlgorithm           = packet.PickHostKeyAlgorithm();
            _PendingExchangeContext.CipherClientToServer       = packet.PickCipherClientToServer();
            _PendingExchangeContext.CipherServerToClient       = packet.PickCipherServerToClient();
            _PendingExchangeContext.MACAlgorithmClientToServer = packet.PickMACAlgorithmClientToServer();
            _PendingExchangeContext.MACAlgorithmServerToClient = packet.PickMACAlgorithmServerToClient();
            _PendingExchangeContext.CompressionClientToServer  = packet.PickCompressionAlgorithmClientToServer();
            _PendingExchangeContext.CompressionServerToClient  = packet.PickCompressionAlgorithmServerToClient();

            _Logger.LogDebug($"Selected KexAlgorithm: {_PendingExchangeContext.KexAlgorithm.Name}");
            _Logger.LogDebug($"Selected HostKeyAlgorithm: {_PendingExchangeContext.HostKeyAlgorithm.Name}");
            _Logger.LogDebug($"Selected CipherClientToServer: {_PendingExchangeContext.CipherClientToServer.Name}");
            _Logger.LogDebug($"Selected CipherServerToClient: {_PendingExchangeContext.CipherServerToClient.Name}");
            _Logger.LogDebug($"Selected MACAlgorithmClientToServer: {_PendingExchangeContext.MACAlgorithmClientToServer.Name}");
            _Logger.LogDebug($"Selected MACAlgorithmServerToClient: {_PendingExchangeContext.MACAlgorithmServerToClient.Name}");
            _Logger.LogDebug($"Selected CompressionClientToServer: {_PendingExchangeContext.CompressionClientToServer.Name}");
            _Logger.LogDebug($"Selected CompressionServerToClient: {_PendingExchangeContext.CompressionServerToClient.Name}");
        }
예제 #2
0
        private void HandleSpecificPacket(NewKeys packet)
        {
            _Logger.LogDebug("Received NewKeys");

            _ActiveExchangeContext  = _PendingExchangeContext;
            _PendingExchangeContext = null;


            // Reset re-exchange values
            _TotalBytesTransferred = 0;
            _KeyTimeout            = DateTime.UtcNow.AddHours(1);
        }
예제 #3
0
        private void ConsiderReExchange()
        {
            const long OneGB = (1024 * 1024 * 1024);

            if ((_TotalBytesTransferred > OneGB) || (_KeyTimeout < DateTime.UtcNow))
            {
                // Time to get new keys!
                _TotalBytesTransferred = 0;
                _KeyTimeout            = DateTime.UtcNow.AddHours(1);

                _Logger.LogDebug("Trigger re-exchange from server");
                _PendingExchangeContext = new ExchangeContext();
                Send(_KexInitServerToClient);
            }
        }