コード例 #1
0
        public void ToString_CommentsIsNull()
        {
            var sshIdentification = new SshIdentification("2.0", "SSH.NET_2020.0.0");

            Assert.AreEqual("SSH-2.0-SSH.NET_2020.0.0", sshIdentification.ToString());

            sshIdentification = new SshIdentification("2.0", "SSH.NET_2020.0.0", null);
            Assert.AreEqual("SSH-2.0-SSH.NET_2020.0.0", sshIdentification.ToString());
        }
コード例 #2
0
        public void Ctor_ProtocolVersionAndSoftwareVersion()
        {
            const string protocolVersion = "1.5";
            const string softwareVersion = "SSH.NET_2020.0.0";

            var sshIdentification = new SshIdentification(protocolVersion, softwareVersion);

            Assert.AreSame(protocolVersion, sshIdentification.ProtocolVersion);
            Assert.AreSame(softwareVersion, sshIdentification.SoftwareVersion);
            Assert.IsNull(sshIdentification.Comments);
        }
コード例 #3
0
        public void Ctor_ProtocolVersionAndSoftwareVersionAndComments()
        {
            const string protocolVersion = "1.5";
            const string softwareVersion = "SSH.NET_2020.0.0";
            const string comments        = "Beware, dangerous!";

            var sshIdentification = new SshIdentification(protocolVersion, softwareVersion, comments);

            Assert.AreSame(protocolVersion, sshIdentification.ProtocolVersion);
            Assert.AreSame(softwareVersion, sshIdentification.SoftwareVersion);
            Assert.AreSame(comments, sshIdentification.Comments);
        }
コード例 #4
0
ファイル: SshSocket.cs プロジェクト: neoscrib/secureshell
        private IPacket PrivateReadPacket()
        {
            IPacket p = null;

            switch (SocketModeRx)
            {
            case Mode.Ascii:
            {
                p = new SshIdentification(pr.ReadLine().ToByteArray());
                break;
            }

            case Mode.PlainText:
            {
                ServerSequence++;
                int  packetLength  = pr.ReadInt32();
                byte paddingLength = pr.ReadByte();
                var  payload       = pr.ReadBytes(packetLength - paddingLength - 1);
                pr.ReadBytes(paddingLength);
                p = PacketFactory.Create(session, payload);
                break;
            }

            case Mode.CipherText:
            {
                if (Decryptor == null)
                {
                    session.KexProcessor.Wait();
                }

                int  packetLength  = pr.ReadInt32();
                byte paddingLength = pr.ReadByte();
                var  payload       = pr.ReadBytes(packetLength - paddingLength - 1);
                var  padding       = pr.ReadBytes(paddingLength);

                var hmac = DecryptorMac;
                hmac.WriteUInt32(ServerSequence++);
                hmac.WriteInt32(packetLength);
                hmac.Write(paddingLength);
                hmac.Write(payload);
                hmac.Write(padding);

                if (rxCompressionEnabled || (rxCompressionEnabled = IsRxCompressionEnabled()))
                {
                    if (RxZlibTransform == null)
                    {
                        RxZlibTransform = new ZlibTransform(CompressionMode.Decompress);
                    }

                    var length = RxZlibTransform.TransformBlock(payload, 0, payload.Length, zlibRxBuffer, 0);
                    Debug.WriteLine(string.Format("Compression In: In: {0}; Out: {1}; TotalIn: {2}; TotalOut: {3}; TotalRatio: {4}",
                                                  payload.Length, length, RxZlibTransform.TotalIn, RxZlibTransform.TotalOut, RxZlibTransform.Ratio));
                    payload = new byte[length];
                    Buffer.BlockCopy(zlibRxBuffer, 0, payload, 0, length);
                }

                // mac isn't encrypted, read directly from network stream
                byte[] mac = new byte[hmac.BlockSize];
                st.Read(mac, 0, hmac.BlockSize);

                if (!hmac.IsMatch(mac))
                {
                    throw new CryptographicException("MAC couldn't be verified!");
                }
                hmac.Reset();

                p = PacketFactory.Create(session, payload);
                break;
            }
            }

            if (p.Code == MessageCode.SSH_MSG_IDENTIFICATION)
            {
                SocketModeRx = Mode.PlainText;
            }
            if (p.Code == MessageCode.SSH_MSG_NEWKEYS)
            {
                SocketModeRx = Mode.CipherText;
            }
            return(p);
        }
        protected virtual void SetupData()
        {
            Random = new Random();

            _serverEndPoint = new IPEndPoint(IPAddress.Loopback, 8122);
            ConnectionInfo  = new ConnectionInfo(
                _serverEndPoint.Address.ToString(),
                _serverEndPoint.Port,
                "user",
                new PasswordAuthenticationMethod("user", "password"))
            {
                Timeout = TimeSpan.FromSeconds(20)
            };
            _keyExchangeAlgorithm = Random.Next().ToString(CultureInfo.InvariantCulture);
            SessionId             = new byte[10];
            Random.NextBytes(SessionId);
            DisconnectedRegister        = new List <EventArgs>();
            DisconnectReceivedRegister  = new List <MessageEventArgs <DisconnectMessage> >();
            ErrorOccurredRegister       = new List <ExceptionEventArgs>();
            ServerBytesReceivedRegister = new List <byte[]>();
            ServerIdentification        = new SshIdentification("2.0", "OurServerStub");
            _authenticationStarted      = false;
            _disconnectMessage          = new DisconnectMessage(DisconnectReason.ServiceNotAvailable, "Not today!");
            _socketFactory = new SocketFactory();

            Session = new Session(ConnectionInfo, _serviceFactoryMock.Object, _socketFactoryMock.Object);
            Session.Disconnected            += (sender, args) => DisconnectedRegister.Add(args);
            Session.DisconnectReceived      += (sender, args) => DisconnectReceivedRegister.Add(args);
            Session.ErrorOccured            += (sender, args) => ErrorOccurredRegister.Add(args);
            Session.KeyExchangeInitReceived += (sender, args) =>
            {
                var newKeysMessage = new NewKeysMessage();
                var newKeys        = newKeysMessage.GetPacket(8, null);
                ServerSocket.Send(newKeys, 4, newKeys.Length - 4, SocketFlags.None);
            };

            ServerListener            = new AsyncSocketListener(_serverEndPoint);
            ServerListener.Connected += socket =>
            {
                ServerSocket = socket;

                // Since we're mocking the protocol version exchange, we'll immediately stat KEX upon
                // having established the connection instead of when the client has been identified

                var keyExchangeInitMessage = new KeyExchangeInitMessage
                {
                    CompressionAlgorithmsClientToServer = new string[0],
                    CompressionAlgorithmsServerToClient = new string[0],
                    EncryptionAlgorithmsClientToServer  = new string[0],
                    EncryptionAlgorithmsServerToClient  = new string[0],
                    KeyExchangeAlgorithms       = new[] { _keyExchangeAlgorithm },
                    LanguagesClientToServer     = new string[0],
                    LanguagesServerToClient     = new string[0],
                    MacAlgorithmsClientToServer = new string[0],
                    MacAlgorithmsServerToClient = new string[0],
                    ServerHostKeyAlgorithms     = new string[0]
                };
                var keyExchangeInit = keyExchangeInitMessage.GetPacket(8, null);
                ServerSocket.Send(keyExchangeInit, 4, keyExchangeInit.Length - 4, SocketFlags.None);
            };
            ServerListener.BytesReceived += (received, socket) =>
            {
                ServerBytesReceivedRegister.Add(received);

                if (!_authenticationStarted)
                {
                    var serviceAcceptMessage = ServiceAcceptMessageBuilder.Create(ServiceName.UserAuthentication).Build();
                    ServerSocket.Send(serviceAcceptMessage, 0, serviceAcceptMessage.Length, SocketFlags.None);
                    _authenticationStarted = true;
                }
            };

            ServerListener.Start();

            ClientSocket = new DirectConnector(_socketFactory).Connect(ConnectionInfo);
        }
コード例 #6
0
        public void ToString_Comments()
        {
            var sshIdentification = new SshIdentification("2.0", "SSH.NET", "Beware, dangerous");

            Assert.AreEqual("SSH-2.0-SSH.NET Beware, dangerous", sshIdentification.ToString());
        }
コード例 #7
0
 protected void Act()
 {
     _actual = _protocolVersionExchange.Start(_clientVersion, _client, _timeout);
 }