Пример #1
0
        public void request(Session session, Channel channel)
        {
            Buffer buf=new Buffer();
            Packet packet=new Packet(buf);

            bool reply=waitForReply();
            if(reply)
            {
                channel.reply=-1;
            }

            packet.reset();
            buf.putByte((byte)Session.SSH_MSG_CHANNEL_REQUEST);
            buf.putInt(channel.getRecipient());
            buf.putString(Util.getBytes("subsystem"));
            buf.putByte((byte)(waitForReply() ? 1 : 0));
            buf.putString(Util.getBytes("sftp"));
            session.write(packet);

            if(reply)
            {
                while(channel.reply==-1)
                {
                    try{System.Threading.Thread.Sleep(10);}
                    catch//(Exception ee)
                    {
                    }
                }
                if(channel.reply==0)
                {
                    throw new JSchException("failed to send sftp request");
                }
            }
        }
Пример #2
0
        public void request(Session session, Channel channel)
        {
            Buffer buf=new Buffer();
            Packet packet=new Packet(buf);

            packet.reset();
            buf.putByte((byte) Session.SSH_MSG_CHANNEL_REQUEST);
            buf.putInt(channel.getRecipient());
            buf.putString( Util.getBytes("signal"));
            buf.putByte((byte)(waitForReply() ? 1 : 0));
            buf.putString(Util.getBytes(signal));
            session.write(packet);
        }
Пример #3
0
        public void request(Session session, Channel channel)
        {
            Buffer buf=new Buffer();
            Packet packet=new Packet(buf);

            // send
            // byte     SSH_MSG_CHANNEL_REQUEST(98)
            // uint32 recipient channel
            // string request type       // "shell"
            // boolean want reply        // 0
            packet.reset();
            buf.putByte((byte) Session.SSH_MSG_CHANNEL_REQUEST);
            buf.putInt(channel.getRecipient());
            buf.putString(Util.getBytes("shell"));
            buf.putByte((byte)(waitForReply() ? 1 : 0));
            session.write(packet);
        }
Пример #4
0
		public void request(Session session, Channel channel)
		{
			Packet packet=session.packet;
			Buffer buf=session.buf;
			// send
			// byte     SSH_MSG_CHANNEL_REQUEST(98)
			// uint32 recipient channel
			// string request type       // "exec"
			// boolean want reply        // 0
			// string command
			packet.reset();
			buf.putByte((byte) Session.SSH_MSG_CHANNEL_REQUEST);
			buf.putInt(channel.getRecipient());
			buf.putString(new Str("exec").getBytes());
			buf.putByte((byte)(waitForReply() ? 1 : 0));
			buf.putString(new Str(command).getBytes());
			session.write(packet);
		}
Пример #5
0
        public virtual bool start(Session session)
        {
            Packet packet=session.packet;
            Buffer buf=session.buf;
            // send
            // byte      SSH_MSG_SERVICE_REQUEST(5)
            // string    service name "ssh-userauth"
            packet.reset();
            buf.putByte((byte)Session.SSH_MSG_SERVICE_REQUEST);
            buf.putString(Util.getBytes("ssh-userauth"));
            session.write(packet);

            // receive
            // byte      SSH_MSG_SERVICE_ACCEPT(6)
            // string    service name
            buf=session.read(buf);
            //System.out.println("read: 6 ? "+buf.buffer[5]);
            return buf.buffer[5]==6;
        }
Пример #6
0
		public void request(Session session, Channel channel) 
		{
			Buffer buf=new Buffer();
			Packet packet=new Packet(buf);

			// byte      SSH_MSG_CHANNEL_REQUEST(98)
			// uint32 recipient channel
			// string request type        // "x11-req"
			// boolean want reply         // 0
			// boolean   single connection
			// string    x11 authentication protocol // "MIT-MAGIC-COOKIE-1".
			// string    x11 authentication cookie
			// uint32    x11 screen number
			packet.reset();
			buf.putByte((byte) Session.SSH_MSG_CHANNEL_REQUEST);
			buf.putInt(channel.getRecipient());
			buf.putString(Util.getBytes("x11-req"));
			buf.putByte((byte)(waitForReply() ? 1 : 0));
			buf.putByte((byte)0);
			buf.putString(Util.getBytes("MIT-MAGIC-COOKIE-1"));
			buf.putString(ChannelX11.getFakedCookie(session));
			buf.putInt(0);
			session.write(packet);
		}
Пример #7
0
        public override void init(Session session,
			byte[] V_S, byte[] V_C, byte[] I_S, byte[] I_C)
        {
            this.session=session;
            this.V_S=V_S;
            this.V_C=V_C;
            this.I_S=I_S;
            this.I_C=I_C;

            //    sha=new SHA1();
            //    sha.init();
            try
            {
                Type t=Type.GetType(session.getConfig("sha-1"));
                sha=(HASH)(Activator.CreateInstance(t));
                sha.init();
            }
            catch(Exception ee)
            {
                Console.WriteLine(ee);
            }

            buf=new Buffer();
            packet=new Packet(buf);

            try
            {
                Type t=Type.GetType(session.getConfig("dh"));
                dh=(DH)(Activator.CreateInstance(t));
                dh.init();
            }
            catch(Exception ee)
            {
                Console.WriteLine(ee);
            }

            dh.setP(p);
            dh.setG(g);

            // The client responds with:
            // byte  SSH_MSG_KEXDH_INIT(30)
            // mpint e <- g^x mod p
            //         x is a random number (1 < x < (p-1)/2)

            e=dh.getE();

            packet.reset();
            buf.putByte((byte)SSH_MSG_KEXDH_INIT);
            buf.putMPInt(e);
            session.write(packet);

            state=SSH_MSG_KEXDH_REPLY;
        }
Пример #8
0
        public override bool start(Session session)
        {
            //    super.start(session);
            //System.out.println("UserAuthPassword: start");
            Packet packet=session.packet;
            Buffer buf=session.buf;
            String username=session.username;
            String password=session.password;
            String dest=username+"@"+session.host;
            if(session.port!=22){
              dest+=(":"+session.port);
            }

            while(true){
              if(password==null){
            if(userinfo==null){
              //throw new JSchException("USERAUTH fail");
              return false;
            }
            if(!userinfo.promptPassword("Password for "+dest)){
              throw new JSchAuthCancelException("password");
              //break;
            }
            password=userinfo.getPassword();
            if(password==null){
              throw new JSchAuthCancelException("password");
              //break;
            }
              }

              byte[] _username=null;
              try{ _username=Util.getBytesUTF8(username); }
              catch{//(java.io.UnsupportedEncodingException e){
            _username=Util.getBytes(username);
              }

              byte[] _password=null;
              try{ _password=Util.getBytes(password); }
              catch{//(java.io.UnsupportedEncodingException e){
            _password=Util.getBytes(password);
              }

              // send
              // byte      SSH_MSG_USERAUTH_REQUEST(50)
              // string    user name
              // string    service name ("ssh-connection")
              // string    "password"
              // boolen    FALSE
              // string    plaintext password (ISO-10646 UTF-8)
              packet.reset();
              buf.putByte((byte)Session.SSH_MSG_USERAUTH_REQUEST);
              buf.putString(_username);
              buf.putString(Util.getBytes("ssh-connection"));
              buf.putString(Util.getBytes("password"));
              buf.putByte((byte)0);
              buf.putString(_password);
              session.write(packet);

              loop:
              while(true){
            // receive
            // byte      SSH_MSG_USERAUTH_SUCCESS(52)
            // string    service name
            buf=session.read(buf);
            //System.out.println("read: 52 ? "+    buf.buffer[5]);
            if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_SUCCESS){
              return true;
            }
            if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_BANNER){
              buf.getInt(); buf.getByte(); buf.getByte();
              byte[] _message=buf.getString();
              byte[] lang=buf.getString();
              String message=null;
              try{ message=Util.getStringUTF8(_message); }
              catch{//(java.io.UnsupportedEncodingException e){
            message=Util.getString(_message);
              }
              if(userinfo!=null){
            userinfo.showMessage(message);
              }
              goto loop;
            }
            if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_FAILURE){
              buf.getInt(); buf.getByte(); buf.getByte();
              byte[] foo=buf.getString();
              int partial_success=buf.getByte();
              //System.out.println(new String(foo)+
              //		 " partial_success:"+(partial_success!=0));
              if(partial_success!=0){
            throw new JSchPartialAuthException(Util.getString(foo));
              }
              break;
            }
            else{
            //        System.out.println("USERAUTH fail ("+buf.buffer[5]+")");
            //	  throw new JSchException("USERAUTH fail ("+buf.buffer[5]+")");
              return false;
            }
              }
              password=null;
            }
            //throw new JSchException("USERAUTH fail");
            //return false;
        }
Пример #9
0
        public void request(Session session, Channel channel)
        {
            Buffer buf=new Buffer();
            Packet packet=new Packet(buf);

            //byte      SSH_MSG_CHANNEL_REQUEST
            //uint32    recipient_channel
            //string    "window-change"
            //boolean   FALSE
            //uint32    terminal width, columns
            //uint32    terminal height, rows
            //uint32    terminal width, pixels
            //uint32    terminal height, pixels
            packet.reset();
            buf.putByte((byte) Session.SSH_MSG_CHANNEL_REQUEST);
            buf.putInt(channel.getRecipient());
            buf.putString(Util.getBytes("window-change"));
            buf.putByte((byte)(waitForReply() ? 1 : 0));
            buf.putInt(width_columns);
            buf.putInt(height_rows);
            buf.putInt(width_pixels);
            buf.putInt(height_pixels);
            session.write(packet);
        }
Пример #10
0
        //private byte[] f;
        public override void init(Session session,
			byte[] V_S, byte[] V_C, byte[] I_S, byte[] I_C)
        {
            this.session=session;
            this.V_S=V_S;
            this.V_C=V_C;
            this.I_S=I_S;
            this.I_C=I_C;

            //    sha=new SHA1();
            //    sha.init();

            try
            {
                Type t=Type.GetType(session.getConfig("sha-1"));
                sha=(HASH)(Activator.CreateInstance(t));
                sha.init();
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }

            buf=new Buffer();
            packet=new Packet(buf);

            try
            {
                Type t=Type.GetType(session.getConfig("dh"));
                dh=(DH)(Activator.CreateInstance(t));
                dh.init();
            }
            catch(Exception e)
            {
                Console.WriteLine(e);
            }

            packet.reset();
            buf.putByte((byte)0x22);
            buf.putInt(min);
            buf.putInt(preferred);
            buf.putInt(max);
            session.write(packet);

            state=SSH_MSG_KEX_DH_GEX_GROUP;
        }
Пример #11
0
        public override bool start(Session session)
        {
            base.start(session);
            //System.out.println("UserAuthNone: start");
            Packet packet=session.packet;
            Buffer buf=session.buf;
            String username=session.username;

            byte[] _username=null;
            try{ _username=Util.getBytesUTF8(username); }
            catch
            {//(java.io.UnsupportedEncodingException e){
                _username=Util.getBytes(username);
            }

            // send
            // byte      SSH_MSG_USERAUTH_REQUEST(50)
            // string    user name
            // string    service name ("ssh-connection")
            // string    "none"
            packet.reset();
            buf.putByte((byte)Session.SSH_MSG_USERAUTH_REQUEST);
            buf.putString(_username);
            buf.putString(Util.getBytes("ssh-connection"));
            buf.putString(Util.getBytes("none"));
            session.write(packet);

            loop:
                while(true)
                {
                    // receive
                    // byte      SSH_MSG_USERAUTH_SUCCESS(52)
                    // string    service name
                    buf=session.read(buf);
                    //System.out.println("UserAuthNone: read: 52 ? "+    buf.buffer[5]);
                    if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_SUCCESS)
                    {
                        return true;
                    }
                    if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_BANNER)
                    {
                        buf.getInt(); buf.getByte(); buf.getByte();
                        byte[] _message=buf.getString();
                        byte[] lang=buf.getString();
                        String message=null;
                        try{ message=Util.getStringUTF8(_message); }
                        catch
                        {//(java.io.UnsupportedEncodingException e){
                            message=Util.getString(_message);
                        }
                        if(userinfo!=null)
                        {
                            userinfo.showMessage(message);
                        }
                        goto loop;
                    }
                    if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_FAILURE)
                    {
                        buf.getInt(); buf.getByte(); buf.getByte();
                        byte[] foo=buf.getString();
                        int partial_success=buf.getByte();
                        methods=Util.getString(foo);
                        //System.out.println("UserAuthNONE: "+methods+
                        //		   " partial_success:"+(partial_success!=0));
                        //	if(partial_success!=0){
                        //	  throw new JSchPartialAuthException(new String(foo));
                        //	}
                        break;
                    }
                    else
                    {
                        //      System.out.println("USERAUTH fail ("+buf.buffer[5]+")");
                        throw new JSchException("USERAUTH fail ("+buf.buffer[5]+")");
                    }
                }
            //throw new JSchException("USERAUTH fail");
            return false;
        }
Пример #12
0
        internal static void delPort(Session session, int rport)
        {
            lock(pool)
            {
                Object[] foo=null;
                for(int i=0; i<pool.size(); i++)
                {
                    Object[] bar=(Object[])(pool.elementAt(i));
                    if(bar[0]!=session) continue;
                    if(((Integer)bar[1]).intValue()!=rport) continue;
                    foo=bar;
                    break;
                }
                if(foo==null)return;
                pool.removeElement(foo);
            }

            Buffer buf=new Buffer(100); // ??
            Packet packet=new Packet(buf);

            try
            {
                // byte SSH_MSG_GLOBAL_REQUEST 80
                // string "cancel-tcpip-forward"
                // boolean want_reply
                // string  address_to_bind (e.g. "127.0.0.1")
                // uint32  port number to bind
                packet.reset();
                buf.putByte((byte) 80/*SSH_MSG_GLOBAL_REQUEST*/);
                buf.putString(new Str("cancel-tcpip-forward").getBytes());
                buf.putByte((byte)0);
                buf.putString(new Str("0.0.0.0").getBytes());
                buf.putInt(rport);
                session.write(packet);
            }
            catch(Exception e)
            {
                //    throw new JSchException(e.toString());
            }
        }
Пример #13
0
  public override bool start(Session session) {
//System.out.println("UserAuthKeyboardInteractive: start");
    Packet packet=session.packet;
    Buffer buf=session.buf;
    String username=session.username;
    String dest=username+"@"+session.host;
    if(session.port!=22){
      dest+=(":"+session.port);
    }

    bool cancel=false;

    byte[] _username=null;
    try{ _username=System.Text.Encoding.UTF8.GetBytes(username); }
    catch{
      _username=Util.getBytes(username);
    }

    while(true){
      // send
      // byte      SSH_MSG_USERAUTH_REQUEST(50)
      // string    user name (ISO-10646 UTF-8, as defined in [RFC-2279])
      // string    service name (US-ASCII) "ssh-userauth" ? "ssh-connection"
      // string    "keyboard-interactive" (US-ASCII)
      // string    language tag (as defined in [RFC-3066])
      // string    submethods (ISO-10646 UTF-8)
      packet.reset();
      buf.putByte((byte)Session.SSH_MSG_USERAUTH_REQUEST);
      buf.putString(_username);
      buf.putString(Util.getBytes("ssh-connection"));
      //buf.putString("ssh-userauth".getBytes());
      buf.putString(Util.getBytes("keyboard-interactive"));
      buf.putString(Util.getBytes(""));
      buf.putString(Util.getBytes(""));
      session.write(packet);

      bool firsttime=true;
      loop:
      while(true){
	// receive
	// byte      SSH_MSG_USERAUTH_SUCCESS(52)
	// string    service name
	try{  buf=session.read(buf); }
	catch(JSchException e){
		e.GetType();
	  return false;
	}
	catch(System.IO.IOException e){
		e.GetType();
	  return false;
	}
	//System.out.println("read: 52 ? "+    buf.buffer[5]);
	if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_SUCCESS){
	  return true;
	}
	if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_BANNER){
	  buf.getInt(); buf.getByte(); buf.getByte();
	  byte[] _message=buf.getString();
	  byte[] lang=buf.getString();
	  String message=null;
	  try{ message=Util.getStringUTF8(_message); }
	  catch{
	    message=Util.getString(_message);
	  }
	  if(userinfo!=null){
	    userinfo.showMessage(message);
	  }
	  goto loop;
	}
	if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_FAILURE){
	  buf.getInt(); buf.getByte(); buf.getByte(); 
	  byte[] foo=buf.getString();
	  int partial_success=buf.getByte();
//	  System.out.println(new String(foo)+
//			     " partial_success:"+(partial_success!=0));

	  if(partial_success!=0){
	    throw new JSchPartialAuthException(Util.getString(foo));
	  }

	  if(firsttime){
	    throw new JSchException("USERAUTH KI is not supported");
	    //return false;
	    //cancel=true;  // ??
	  }
	  break;
	}
	if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_INFO_REQUEST){
	  firsttime=false;
	  buf.getInt(); buf.getByte(); buf.getByte();
	  String name=Util.getString(buf.getString());
	  String instruction=Util.getString(buf.getString());
	  String languate_tag=Util.getString(buf.getString());
	  int num=buf.getInt();
//System.out.println("name: "+name);
//System.out.println("instruction: "+instruction);
//System.out.println("lang: "+languate_tag);
//System.out.println("num: "+num);
	  String[] prompt=new String[num];
	  bool[] echo=new bool[num];
	  for(int i=0; i<num; i++){
	    prompt[i]=Util.getString(buf.getString());
	    echo[i]=(buf.getByte()!=0);
//System.out.println("  "+prompt[i]+","+echo[i]);
	  }

	  String[] response=null;
	  if(num>0
	     ||(name.Length>0 || instruction.Length>0)
	     ){
	    UIKeyboardInteractive kbi=(UIKeyboardInteractive)userinfo;
	    if(userinfo!=null){
	    response=kbi.promptKeyboardInteractive(dest,
						   name,
						   instruction,
						   prompt,
						   echo);
	    }
	  }
	  // byte      SSH_MSG_USERAUTH_INFO_RESPONSE(61)
	  // int       num-responses
	  // string    response[1] (ISO-10646 UTF-8)
	  // ...
	  // string    response[num-responses] (ISO-10646 UTF-8)
//if(response!=null)
//System.out.println("response.length="+response.length);
//else
//System.out.println("response is null");
	  packet.reset();
	  buf.putByte((byte)Session.SSH_MSG_USERAUTH_INFO_RESPONSE);
	  if(num>0 &&
	     (response==null ||  // cancel
	      num!=response.Length)){
	    buf.putInt(0);
	    if(response==null)
	      cancel=true;
	  }
	  else{
	    buf.putInt(num);
	    for(int i=0; i<num; i++){
//System.out.println("response: |"+response[i]+"| <- replace here with **** if you need");
	      buf.putString(Util.getBytes(response[i]));
	    }
	  }
	  session.write(packet);
	  if(cancel)
	    break;
//System.out.println("continue loop");
	  goto loop;
	}
	//throw new JSchException("USERAUTH fail ("+buf.buffer[5]+")");
	return false;
      }
      if(cancel){
	throw new JSchAuthCancelException("keyboard-interactive");
	//break;
      }
    }
    //return false;
  }
Пример #14
0
        public override bool start(Session session)
        {
            //super.start(session);

            //Vector identities=JSch.identities;
            System.Collections.ArrayList identities=session.jsch.identities;

            Packet packet=session.packet;
            Buffer buf=session.buf;

            String passphrase=null;
            String username=session.username;

            byte[] _username=null;
            try{ _username= Util.getBytesUTF8( username); }
            catch
            {//(java.io.UnsupportedEncodingException e){
                _username=Util.getBytes(username);
            }

            for(int i=0; i<identities.Count; i++)
            {
                Identity identity=(Identity)(identities[i]);
                byte[] pubkeyblob=identity.getPublicKeyBlob();

                //System.out.println("UserAuthPublicKey: "+identity+" "+pubkeyblob);

                if(pubkeyblob!=null)
                {
                    // send
                    // byte      SSH_MSG_USERAUTH_REQUEST(50)
                    // string    user name
                    // string    service name ("ssh-connection")
                    // string    "publickey"
                    // boolen    FALSE
                    // string    plaintext password (ISO-10646 UTF-8)
                    packet.reset();
                    buf.putByte((byte)Session.SSH_MSG_USERAUTH_REQUEST);
                    buf.putString(_username);
                    buf.putString(Util.getBytes("ssh-connection"));
                    buf.putString(Util.getBytes("publickey"));
                    buf.putByte((byte)0);
                    buf.putString(Util.getBytes(identity.getAlgName()));
                    buf.putString(pubkeyblob);
                    session.write(packet);

                loop1:
                    while(true)
                    {
                        // receive
                        // byte      SSH_MSG_USERAUTH_PK_OK(52)
                        // string    service name
                        buf=session.read(buf);
                        //System.out.println("read: 60 ? "+    buf.buffer[5]);
                        if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_PK_OK)
                        {
                            break;
                        }
                        else if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_FAILURE)
                        {
                            //	System.out.println("USERAUTH publickey "+session.getIdentity()+
                            //			   " is not acceptable.");
                            break;
                        }
                        else if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_BANNER)
                        {
                            buf.getInt(); buf.getByte(); buf.getByte();
                            byte[] _message=buf.getString();
                            byte[] lang=buf.getString();
                            String message=null;
                            try{ message=Util.getStringUTF8(_message); }
                            catch
                            {//(java.io.UnsupportedEncodingException e){
                                message=Util.getString(_message);
                            }
                            if(userinfo!=null)
                            {
                                userinfo.showMessage(message);
                            }
                            goto loop1;
                        }
                        else
                        {
                            //System.out.println("USERAUTH fail ("+buf.buffer[5]+")");
                            //throw new JSchException("USERAUTH fail ("+buf.buffer[5]+")");
                            break;
                        }
                    }
                    if(buf.buffer[5]!=Session.SSH_MSG_USERAUTH_PK_OK)
                    {
                        continue;
                    }
                }

                //System.out.println("UserAuthPublicKey: identity.isEncrypted()="+identity.isEncrypted());

                int count=5;
                while(true)
                {
                    if((identity.isEncrypted() && passphrase==null))
                    {
                        if(userinfo==null) throw new JSchException("USERAUTH fail");
                        if(identity.isEncrypted() &&
                            !userinfo.promptPassphrase("Passphrase for "+identity.getName()))
                        {
                            throw new JSchAuthCancelException("publickey");
                            //throw new JSchException("USERAUTH cancel");
                            //break;
                        }
                        passphrase=userinfo.getPassphrase();
                    }

                    if(!identity.isEncrypted() || passphrase!=null)
                    {
                        //System.out.println("UserAuthPublicKey: @1 "+passphrase);
                        if(identity.setPassphrase(passphrase))
                            break;
                    }
                    passphrase=null;
                    count--;
                    if(count==0)break;
                }

                //System.out.println("UserAuthPublicKey: identity.isEncrypted()="+identity.isEncrypted());

                if(identity.isEncrypted()) continue;
                if(pubkeyblob==null) pubkeyblob=identity.getPublicKeyBlob();

                //System.out.println("UserAuthPublicKey: pubkeyblob="+pubkeyblob);

                if(pubkeyblob==null) continue;

                // send
                // byte      SSH_MSG_USERAUTH_REQUEST(50)
                // string    user name
                // string    service name ("ssh-connection")
                // string    "publickey"
                // boolen    TRUE
                // string    plaintext password (ISO-10646 UTF-8)
                packet.reset();
                buf.putByte((byte)Session.SSH_MSG_USERAUTH_REQUEST);
                buf.putString(_username);
                buf.putString(Util.getBytes("ssh-connection"));
                buf.putString(Util.getBytes("publickey"));
                buf.putByte((byte)1);
                buf.putString(Util.getBytes(identity.getAlgName()));
                buf.putString(pubkeyblob);

                //      byte[] tmp=new byte[buf.index-5];
                //      System.arraycopy(buf.buffer, 5, tmp, 0, tmp.length);
                //      buf.putString(signature);

                byte[] sid=session.getSessionId();
                uint sidlen=(uint)sid.Length;
                byte[] tmp=new byte[4+sidlen+buf.index-5];
                tmp[0]=(byte)(sidlen>>24);
                tmp[1]=(byte)(sidlen>>16);
                tmp[2]=(byte)(sidlen>>8);
                tmp[3]=(byte)(sidlen);
                Array.Copy(sid, 0, tmp, 4, sidlen);
                Array.Copy(buf.buffer, 5, tmp, 4+sidlen, buf.index-5);

                byte[] signature=identity.getSignature(session, tmp);
                if(signature==null)
                {  // for example, too long key length.
                    break;
                }
                buf.putString(signature);

                session.write(packet);

            loop2:
                while(true)
                {
                    // receive
                    // byte      SSH_MSG_USERAUTH_SUCCESS(52)
                    // string    service name
                    buf=session.read(buf);
                    //System.out.println("read: 52 ? "+    buf.buffer[5]);
                    if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_SUCCESS)
                    {
                        return true;
                    }
                    else if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_BANNER)
                    {
                        buf.getInt(); buf.getByte(); buf.getByte();
                        byte[] _message=buf.getString();
                        byte[] lang=buf.getString();
                        String message=null;
                        try{ message=Util.getStringUTF8(_message); }
                        catch
                        {//(java.io.UnsupportedEncodingException e){
                            message=Util.getString(_message);
                        }
                        if(userinfo!=null)
                        {
                            userinfo.showMessage(message);
                        }
                        goto loop2;
                    }
                    else if(buf.buffer[5]==Session.SSH_MSG_USERAUTH_FAILURE)
                    {
                        buf.getInt(); buf.getByte(); buf.getByte();
                        byte[] foo=buf.getString();
                        int partial_success=buf.getByte();
                        //System.out.println(new String(foo)+
                        //                   " partial_success:"+(partial_success!=0));
                        if(partial_success!=0)
                        {
                            throw new JSchPartialAuthException(Util.getString(foo));
                        }
                        break;
                    }
                    //System.out.println("USERAUTH fail ("+buf.buffer[5]+")");
                    //throw new JSchException("USERAUTH fail ("+buf.buffer[5]+")");
                    break;
                }
            }
            return false;
        }