private bool ProcessPacket(SSH2Packet packet) { //Debug.WriteLine("ProcessPacket pt="+pt); SSH2DataReader r = new SSH2DataReader(packet.Data); PacketType pt = r.ReadPacketType(); if(pt==PacketType.SSH_MSG_DISCONNECT) { int errorcode = r.ReadInt32(); byte[] tmpdata = r.ReadString(); string description = Encoding.UTF8.GetString(tmpdata, 0 ,tmpdata.Length); _eventReceiver.OnConnectionClosed(); return false; } else if(_waitingForPortForwardingResponse) { if(pt!=PacketType.SSH_MSG_REQUEST_SUCCESS) _eventReceiver.OnUnknownMessage((byte)pt, r.Image); _waitingForPortForwardingResponse = false; return true; } else if(pt==PacketType.SSH_MSG_CHANNEL_OPEN) { ProcessPortforwardingRequest(_eventReceiver, r); return true; } else if(pt>=PacketType.SSH_MSG_CHANNEL_OPEN_CONFIRMATION && pt<=PacketType.SSH_MSG_CHANNEL_FAILURE) { int local_channel = r.ReadInt32(); ChannelEntry e = FindChannelEntry(local_channel); if(e!=null) //throw new Exception("Unknown channel "+local_channel); ((SSH2Channel)e._channel).ProcessPacket(e._receiver, pt, 5+r.Rest, r); else Debug.WriteLine("unexpected channel pt="+pt+" local_channel="+local_channel.ToString()); return true; } else if(pt==PacketType.SSH_MSG_IGNORE) { _eventReceiver.OnIgnoreMessage(r.ReadString()); return true; } else if(_asyncKeyExchanger!=null) { _asyncKeyExchanger.AsyncProcessPacket(packet); return true; } else if(pt==PacketType.SSH_MSG_KEXINIT) { //Debug.WriteLine("Host sent KEXINIT"); _asyncKeyExchanger = new KeyExchanger(this, _sessionID); _asyncKeyExchanger.AsyncProcessPacket(packet); return true; } else { _eventReceiver.OnUnknownMessage((byte)pt, r.Image); return false; } }
public void ReexchangeKeys() { _asyncKeyExchanger = new KeyExchanger(this, _sessionID); _asyncKeyExchanger.AsyncStartReexchange(); }
internal void RefreshKeys(byte[] sessionID, Cipher tc, Cipher rc, MAC tm, MAC rm) { _sessionID = sessionID; _tCipher = tc; _tMAC = tm; _packetBuilder.SetCipher(rc, _param.CheckMACError? rm : null); _asyncKeyExchanger = null; }
public AuthenticationResult DoConnect(AbstractSocket target) { _stream = target; KeyExchanger kex = new KeyExchanger(this, null); if(!kex.SynchronousKexExchange()) { _stream.Close(); return GranadosRT.Routrek.SSHC.AuthenticationResult.Failure; } //Step3 user authentication ServiceRequest("ssh-userauth"); _authenticationResult = UserAuth(); return _authenticationResult; }