Exemple #1
0
        public override byte[] getPublicKeyBlob()
        {
            byte[] foo = base.getPublicKeyBlob();
            if (foo != null)
            {
                return(foo);
            }

            if (P_array == null)
            {
                return(null);
            }

            var buf = new Buffer(sshdss.Length + 4 +
                                 P_array.Length + 4 +
                                 Q_array.Length + 4 +
                                 G_array.Length + 4 +
                                 pub_array.Length + 4);

            buf.putString(sshdss);
            buf.putString(P_array);
            buf.putString(Q_array);
            buf.putString(G_array);
            buf.putString(pub_array);
            return(buf.buffer);
        }
Exemple #2
0
        byte[] getSignature_rsa(Session session, byte[] data)
        {
            try
            {
                Type         t   = Type.GetType(jsch.getConfig("signature.rsa"));
                SignatureRSA rsa = (SignatureRSA)Activator.CreateInstance(t);

                rsa.init();
                rsa.setPrvKey(e_array, n_array, d_array, p_array, q_array, dmp1_array, dmq1_array, iqmp_array);

                /*
                 * byte[] goo=new byte[4];
                 * goo[0]=(byte)(session.getSessionId().Length>>>24);
                 * goo[1]=(byte)(session.getSessionId().Length>>>16);
                 * goo[2]=(byte)(session.getSessionId().Length>>>8);
                 * goo[3]=(byte)(session.getSessionId().Length);
                 * rsa.update(goo);
                 * rsa.update(session.getSessionId());
                 */
                rsa.update(data);
                byte[] sig = rsa.sign();
                Buffer buf = new Buffer("ssh-rsa".Length + 4 +
                                        sig.Length + 4);
                buf.putString(System.Text.Encoding.Default.GetBytes("ssh-rsa"));
                buf.putString(sig);
                return(buf.buffer);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            return(null);
        }
        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(new String("subsystem").getBytes());
            buf.putByte((byte)(waitForReply() ? 1 : 0));
            buf.putString(subsystem.getBytes());
            session.write(packet);

            if (reply)
            {
                while (channel.reply == -1)
                {
                    try{ Thread.sleep(10); }
                    catch                    //(System.Exception ee)
                    {
                    }
                }
                if (channel.reply == 0)
                {
                    throw new JSchException("failed to send subsystem request");
                }
            }
        }
Exemple #4
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");
				}
			}
		}
Exemple #5
0
        byte[] getSignature_dss(Session session, byte[] data)
        {
            /*
             *      byte[] foo;
             *      int i;
             *      System.out.print("P ");
             *      foo=P_array;
             *      for(i=0;  i<foo.Length; i++){
             *      System.out.print(Integer.toHexString(foo[i]&0xff)+":");
             *      }
             *      System.out.println("");
             *      System.out.print("Q ");
             *      foo=Q_array;
             *      for(i=0;  i<foo.Length; i++){
             *      System.out.print(Integer.toHexString(foo[i]&0xff)+":");
             *      }
             *      System.out.println("");
             *      System.out.print("G ");
             *      foo=G_array;
             *      for(i=0;  i<foo.Length; i++){
             *      System.out.print(Integer.toHexString(foo[i]&0xff)+":");
             *      }
             *      System.out.println("");
             */

            try
            {
                //Type t=Type.GetType(jsch.getConfig("signature.dss"));
                //SignatureDSA dsa=(SignatureDSA)(Activator.CreateInstance(t));
                ISignatureDSA dsa = new Tamir.SharpSsh.jsch.jce.SignatureDSA();
                dsa.init();
                dsa.setPrvKey(prv_array, P_array, Q_array, G_array);

                /*
                 * byte[] goo=new byte[4];
                 * goo[0]=(byte)(session.getSessionId().Length>>>24);
                 * goo[1]=(byte)(session.getSessionId().Length>>>16);
                 * goo[2]=(byte)(session.getSessionId().Length>>>8);
                 * goo[3]=(byte)(session.getSessionId().Length);
                 * dsa.update(goo);
                 * dsa.update(session.getSessionId());
                 */
                dsa.update(data);
                byte[] sig = dsa.sign();
                Buffer buf = new Buffer("ssh-dss".Length + 4 +
                                        sig.Length + 4);
                buf.putString(System.Text.Encoding.Default.GetBytes("ssh-dss"));
                buf.putString(sig);
                return(buf.buffer);
            }
            catch (Exception e)
            {
                Console.WriteLine("e " + e);
            }
            return(null);
        }
		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);
		}
Exemple #7
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);
        }
Exemple #8
0
        internal static void delPort(Session session, int rport)
        {
            lock (pool)
            {
                Object[] foo = null;
                for (int i = 0; i < pool.size(); i++)
                {
                    var 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);
            }

            var buf    = new Buffer(100); // ??
            var 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(80 /*SSH_MSG_GLOBAL_REQUEST*/);
                buf.putString(new Str("cancel-tcpip-forward").getBytes());
                buf.putByte(0);
                buf.putString(new Str("0.0.0.0").getBytes());
                buf.putInt(rport);
                session.write(packet);
            }
            catch (Exception)
            {
                //    throw new JSchException(e.toString());
            }
        }
        public override void connect()
        {
            try
            {
                Buffer buf=new Buffer(150);
                Packet packet=new Packet(buf);
                // send
                // byte   SSH_MSG_CHANNEL_OPEN(90)
                // string channel type         //
                // uint32 sender channel       // 0
                // uint32 initial window size  // 0x100000(65536)
                // uint32 maxmum packet size   // 0x4000(16384)

                packet.reset();
                buf.putByte((byte)90);
                buf.putString(Util.getBytes("direct-tcpip"));
                buf.putInt(id);
                buf.putInt(lwsize);
                buf.putInt(lmpsize);
                buf.putString(Util.getBytes(host));
                buf.putInt(port);
                buf.putString(Util.getBytes(originator_IP_address));
                buf.putInt(originator_port);
                session.write(packet);
                try
                {
                    while(this.getRecipient()==-1)
                    {
                        //Thread.sleep(500);
                        System.Threading.Thread.Sleep(10);
                    }
                }
                catch
                {
                }

                if(this.eof_remote)
                {      // failed to open
                    disconnect();
                    return;
                }

                thread=new Thread(new ThreadStart(this.run));
                thread.Start();
            }
            catch
            {
            }
        }
Exemple #10
0
        internal static void delPort(Session session, int rport)
        {
            lock (pool)
            {
                Object[] foo = null;
                for (int i = 0; i < pool.Count; i++)
                {
                    Object[] bar = (Object[])(pool[i]);
                    if (bar[0] != session)
                    {
                        continue;
                    }
                    if (int.Parse(bar[1] + "") != rport)
                    {
                        continue;
                    }
                    foo = bar;
                    break;
                }
                if (foo == null)
                {
                    return;
                }
                pool.Remove(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("cancel-tcpip-forward".GetBytes());
                buf.putByte((byte)0);
                buf.putString("0.0.0.0".GetBytes());
                buf.putInt(rport);
                session.write(packet);
            }
            catch (Exception)
            {
                //    throw new JSchException(e.toString());
            }
        }
Exemple #11
0
        byte[] getPublicKeyBlob_rsa()
        {
            if (e_array == null)
            {
                return(null);
            }
            Buffer buf = new Buffer("ssh-rsa".Length + 4 +
                                    e_array.Length + 4 +
                                    n_array.Length + 4);

            buf.putString(System.Text.Encoding.Default.GetBytes("ssh-rsa"));
            buf.putString(e_array);
            buf.putString(n_array);
            return(buf.buffer);
        }
Exemple #12
0
 public byte[] getPublicKeyBlob()
 {
     if (_e_array == null)
     {
         return(null);
     }
     else if (_publickeyBlob == null)
     {
         Buffer buf = new Buffer(ALGORITHM_NAME.Length + 4 + _e_array.Length + 4 + _n_array.Length + 4);
         buf.putString(System.Text.Encoding.Default.GetBytes(ALGORITHM_NAME));
         buf.putString(_e_array);
         buf.putString(_n_array);
         _publickeyBlob = buf.buffer;
     }
     return(_publickeyBlob);
 }
Exemple #13
0
        public virtual void connect()
        {
            if (!session.isConnected())
            {
                throw new JSchException("session is down");
            }
            try
            {
                var buf    = new Buffer(100);
                var packet = new Packet(buf);
                // send
                // byte   SSH_MSG_CHANNEL_OPEN(90)
                // string channel type         //
                // uint32 sender channel       // 0
                // uint32 initial window size  // 0x100000(65536)
                // uint32 maxmum packet size   // 0x4000(16384)
                packet.reset();
                buf.putByte(90);
                buf.putString(type);
                buf.putInt(id);
                buf.putInt(lwsize);
                buf.putInt(lmpsize);
                session.write(packet);

                int retry = 1000;
                while (getRecipient() == -1 &&
                       session.isConnected() &&
                       retry > 0)
                {
                    try
                    {
                        Thread.sleep(50);
                    }
                    catch (Exception)
                    {
                    }
                    retry--;
                }
                if (!session.isConnected())
                {
                    throw new JSchException("session is down");
                }
                if (retry == 0)
                {
                    throw new JSchException("channel is not opened.");
                }
                connected = true;
                start();
            }
            catch (Exception e)
            {
                connected = false;
                if (e is JSchException)
                {
                    throw e;
                }
            }
        }
Exemple #14
0
        public void request(Session session, Channel channel)
        {
            var buf    = new Buffer();
            var packet = new Packet(buf);

            packet.reset();
            buf.putByte(Session.SSH_MSG_CHANNEL_REQUEST);
            buf.putInt(channel.getRecipient());
            buf.putString(Util.getBytes("pty-req"));
            buf.putByte((byte)(waitForReply() ? 1 : 0));
            buf.putString(Util.getBytes("vt100"));
            buf.putInt(80);
            buf.putInt(24);
            buf.putInt(640);
            buf.putInt(480);
            buf.putString(Util.getBytes(""));
            session.write(packet);
        }
Exemple #15
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(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);
        }
Exemple #16
0
        byte[] getPublicKeyBlob_dss()
        {
            if (P_array == null)
            {
                return(null);
            }
            Buffer buf = new Buffer("ssh-dss".Length + 4 +
                                    P_array.Length + 4 +
                                    Q_array.Length + 4 +
                                    G_array.Length + 4 +
                                    pub_array.Length + 4);

            buf.putString(System.Text.Encoding.Default.GetBytes("ssh-dss"));
            buf.putString(P_array);
            buf.putString(Q_array);
            buf.putString(G_array);
            buf.putString(pub_array);
            return(buf.buffer);
        }
Exemple #17
0
 public byte[] getSignature(Session session, byte[] data)
 {
     try
     {
         SignatureRSA rsa = new Tamir.SharpSsh.jsch.jce.SignatureRSA();
         rsa.init();
         rsa.setPrvKey(_e_array, _n_array, _d_array, _p_array, _q_array, _dmp1_array, _dmq1_array, _iqmp_array);
         rsa.update(data);
         byte[] sig = rsa.sign();
         Buffer buf = new Buffer(ALGORITHM_NAME.Length + 4 + sig.Length + 4);
         buf.putString(System.Text.Encoding.Default.GetBytes(ALGORITHM_NAME));
         buf.putString(sig);
         return(buf.buffer);
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
     }
     return(null);
 }
Exemple #18
0
        internal void dump(Buffer buf)
        {
            buf.putInt(flags);
            if ((flags & SSH_FILEXFER_ATTR_SIZE) != 0)
            {
                buf.putLong(size);
            }
            if ((flags & SSH_FILEXFER_ATTR_UIDGID) != 0)
            {
                buf.putInt(uid); buf.putInt(gid);
            }
            if ((flags & SSH_FILEXFER_ATTR_PERMISSIONS) != 0)
            {
                buf.putInt(permissions);
            }
            //if ((flags & SSH_FILEXFER_ATTR_ACCESSTIME) != 0) { buf.putInt(atime); }
            //if ((flags & SSH_FILEXFER_ATTR_MODIFYTIME) != 0) { buf.putInt(mtime); }
            if ((flags & SSH_FILEXFER_ATTR_ACMODTIME) != 0)
            {
                buf.putInt(atime);
            }
            if ((flags & SSH_FILEXFER_ATTR_ACMODTIME) != 0)
            {
                buf.putInt(mtime);
            }

            if ((flags & SSH_FILEXFER_ATTR_EXTENDED) != 0)
            {
                int count = extended.Length / 2;
                if (count > 0)
                {
                    for (int i = 0; i < count; i++)
                    {
                        buf.putString(Util.getBytes(extended[i * 2]));
                        buf.putString(Util.getBytes(extended[i * 2 + 1]));
                    }
                }
            }
        }
Exemple #19
0
        public override byte[] getPublicKeyBlob()
        {
            byte[] foo = base.getPublicKeyBlob();
            if (foo != null)
            {
                return(foo);
            }

            if (pub_array == null)
            {
                return(null);
            }

            Buffer buf = new Buffer(sshrsa.Length + 4 +
                                    pub_array.Length + 4 +
                                    n_array.Length + 4);

            buf.putString(sshrsa);
            buf.putString(pub_array);
            buf.putString(n_array);
            return(buf.buffer);
        }
Exemple #20
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);
        }
		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);
		}
        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);
        }
Exemple #23
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);
		}
        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);
        }
        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);
        }
		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);
		}
Exemple #27
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);
        }
        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 = 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(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 (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);
                        var prompt = new String[num];
                        var 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)
                            )
                        {
                            var 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(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;
        }
		public void sendKeepAliveMsg()
		{
			Buffer buf=new Buffer();
			Packet packet=new Packet(buf);
			packet.reset();
			buf.putByte((byte)SSH_MSG_GLOBAL_REQUEST);
			buf.putString(keepalivemsg);
			buf.putByte((byte)1);
			write(packet);
		}
		public void connect(int connectTimeout) 
		{
			if(_isConnected)
			{
				throw new JSchException("session is already connected");
			}
			io=new IO();
			if(random==null)
			{
				try
				{
					Class c=Class.forName(getConfig("random"));
					random=(Random)(c.newInstance());
				}
				catch(Exception e)
				{
					System.Console.Error.WriteLine("connect: random "+e);
				}
			}
			Packet.setRandom(random);

			try	
			{
				int i, j;
				int pad=0;

				if(proxy==null)
				{
					proxy=jsch.getProxy(host);
					if(proxy!=null)
					{
						lock(proxy)
						{
							proxy.close();
						}
					}
				}

				if(proxy==null)
				{
					Stream In;
					Stream Out;
					if(socket_factory==null)
					{
						socket=Util.createSocket(host, port, connectTimeout);
						In=socket.getInputStream();
						Out=socket.getOutputStream();
					}
					else
					{
						socket=socket_factory.createSocket(host, port);
						In=socket_factory.getInputStream(socket);
						Out=socket_factory.getOutputStream(socket);
					}
					//if(timeout>0){ socket.setSoTimeout(timeout); }
					socket.setTcpNoDelay(true);
					io.setInputStream(In);
					io.setOutputStream(Out);
				}
				else
				{
					lock(proxy)
					{
						proxy.connect(socket_factory, host, port, connectTimeout);
						io.setInputStream(proxy.getInputStream());
						io.setOutputStream(proxy.getOutputStream());
						socket=proxy.getSocket();
					}
				}

				if(connectTimeout>0 && socket!=null)
				{
					socket.setSoTimeout(connectTimeout);
				}

				_isConnected=true;

				while(true)
				{

					i=0;
					j=0;
					while(i<buf.buffer.Length)
					{
						j=io.getByte();
						if(j<0)break;
						buf.buffer[i]=(byte)j; i++;
						if(j==10)break;
					}
					if(j<0)
					{
						throw new JSchException("connection is closed by foreign host");
					}

					if(buf.buffer[i-1]==10)
					{    // 0x0a
						i--;
						if(buf.buffer[i-1]==13)
						{  // 0x0d
							i--;
						}
					}

					if(i>4 && (i!=buf.buffer.Length) &&
						(buf.buffer[0]!='S'||buf.buffer[1]!='S'||
						buf.buffer[2]!='H'||buf.buffer[3]!='-'))
					{
						//System.err.println(new String(buf.buffer, 0, i);
						continue;
					}

					if(i==buf.buffer.Length ||
						i<7 ||                                      // SSH-1.99 or SSH-2.0
						(buf.buffer[4]=='1' && buf.buffer[6]!='9')  // SSH-1.5
						)
					{
						throw new JSchException("invalid server's version String");
					}
					break;
				}				

				V_S=new byte[i]; Tamir.SharpSsh.java.System.arraycopy(buf.buffer, 0, V_S, 0, i);
				//System.Console.WriteLine("V_S: ("+i+") ["+new String(V_S)+"]");

				//io.put(V_C, 0, V_C.Length); io.put("\n".getBytes(), 0, 1);
			{
				// Some Cisco devices will miss to read '\n' if it is sent separately.
				byte[] foo=new byte[V_C.Length+1];
				Tamir.SharpSsh.java.System.arraycopy(V_C, 0, foo, 0, V_C.Length);
				foo[foo.Length-1]=(byte)'\n';
				io.put(foo, 0, foo.Length);
			}

				buf=read(buf);
				//System.Console.WriteLine("read: 20 ? "+buf.buffer[5]);
				if(buf.buffer[5]!=SSH_MSG_KEXINIT)
				{
					throw new JSchException("invalid protocol: "+buf.buffer[5]);
				}
				KeyExchange kex=receive_kexinit(buf);

				while(true)
				{
					buf=read(buf);
					if(kex.getState()==buf.buffer[5])
					{
						bool result=kex.next(buf);
						if(!result)
						{
							//System.Console.WriteLine("verify: "+result);
							in_kex=false;
							throw new JSchException("verify: "+result);
						}
					}
					else
					{
						in_kex=false;
						throw new JSchException("invalid protocol(kex): "+buf.buffer[5]);
					}
					if(kex.getState()==KeyExchange.STATE_END)
					{
						break;
					}
				}

				try{ checkHost(host, kex); }
				catch(JSchException ee)
				{
					in_kex=false;
					throw ee;
				}

				send_newkeys();

				// receive SSH_MSG_NEWKEYS(21)
				buf=read(buf);
				//System.Console.WriteLine("read: 21 ? "+buf.buffer[5]);
				if(buf.buffer[5]==SSH_MSG_NEWKEYS)
				{
					receive_newkeys(buf, kex);
				}
				else
				{
					in_kex=false;
					throw new JSchException("invalid protocol(newkyes): "+buf.buffer[5]);
				}

				bool auth=false;
				bool auth_cancel=false;

				UserAuthNone usn=new UserAuthNone(userinfo);
				auth=usn.start(this);

				String methods=null;
				if(!auth)
				{
					methods=usn.getMethods();
					if(methods!=null)
					{
						methods=methods.toLowerCase();
					}
					else
					{
						// methods: publickey,password,keyboard-interactive
						methods="publickey,password,keyboard-interactive";
					}
				}

			loop:
				while(true)
				{

					//System.Console.WriteLine("methods: "+methods);

					while(!auth &&
						methods!=null && methods.Length()>0)
					{

						//System.Console.WriteLine("  methods: "+methods);

						UserAuth us=null;
						if(methods.startsWith("publickey"))
						{
							//System.Console.WriteLine("   jsch.identities.size()="+jsch.identities.size());
							lock(jsch.identities)
							{
								if(jsch.identities.size()>0)
								{
									us=new UserAuthPublicKey(userinfo);
								}
							}
						}
						else if(methods.startsWith("keyboard-interactive"))
						{
							if(userinfo is UIKeyboardInteractive)
							{
								us=new UserAuthKeyboardInteractive(userinfo);
							}
						}
						else if(methods.startsWith("password"))
						{
							us=new UserAuthPassword(userinfo);
						}
						if(us!=null)
						{
							try
							{
								auth=us.start(this);
								auth_cancel=false;
							}
							catch(JSchAuthCancelException ee)
							{
								//System.Console.WriteLine(ee);
								auth_cancel=true;
							}
							catch(JSchPartialAuthException ee)
							{
								methods=ee.getMethods();
								//System.Console.WriteLine("PartialAuth: "+methods);
								auth_cancel=false;
								continue;//loop;
							}
							catch(RuntimeException ee)
							{
								throw ee;
							}
							catch(Exception ee)
							{
								System.Console.WriteLine("ee: "+ee); // SSH_MSG_DISCONNECT: 2 Too many authentication failures
							}
						}
						if(!auth)
						{
							int comma=methods.indexOf(",");
							if(comma==-1) break;
							methods=methods.subString(comma+1);
						}
					}
					break;
				}

				if(connectTimeout>0 || timeout>0)
				{
					socket.setSoTimeout(timeout);
				}

				if(auth)
				{
					isAuthed=true;
					connectThread=new Thread(this);
					connectThread.setName("Connect thread "+host+" session");
					connectThread.start();
					return;
				}
				if(auth_cancel)
					throw new JSchException("Auth cancel");
				throw new JSchException("Auth fail");
			}
			catch(Exception e) 
			{
				in_kex=false;
				if(_isConnected)
				{
					try
					{
						packet.reset();
						buf.putByte((byte)SSH_MSG_DISCONNECT);
						buf.putInt(3);
						buf.putString(new String(e.ToString()).getBytes());
						buf.putString(new String("en").getBytes());
						write(packet);
						disconnect();
					}
					catch(Exception ee)
					{
					}
				}
				_isConnected=false;
				//e.printStackTrace();
				if(e is RuntimeException) throw (RuntimeException)e;
				if(e is JSchException) throw (JSchException)e;
				throw new JSchException("Session.connect: "+e);
			}
		}
Exemple #31
0
        public void connect(int connectTimeout)
        {
            if(random==null)
            {
                try
                {
                    Type t=Type.GetType(getConfig("random"));
                    random=(Random)(Activator.CreateInstance(t));
                }
                catch(Exception e){ Console.Error.WriteLine("connect: random "+e); }
            }
            Packet.setRandom(random);

            try
            {
                int i, j;
                //int pad=0;

                if(proxy==null)
                {
                    proxy=jsch.getProxy(host);
                    if(proxy!=null)
                    {
                        lock(proxy)
                        {
                            proxy.close();
                        }
                    }
                }
                IPEndPoint ipe=null;
                if(proxy==null)
                {
                    Stream ins;
                    Stream outs;
                    if(socket_factory==null)
                    {
                        if(connectTimeout==0)
                        {
                            ipe = new IPEndPoint(Dns.GetHostByName(host).AddressList[0], port);
                            socket=new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp);
                        }
                        //			String message="";
                        //			Thread tmp=new Thread(new Runnable(){
                        //			public void run(){
                        //			try{
                        //				sockp[0]=new Socket(host, port);
                        //				if(done[0]){
                        //				if(sockp[0]!=null){
                        //				sockp[0].close();
                        //				sockp[0]=null;
                        //				}
                        //				}
                        //				else thread.interrupt();
                        //			}
                        //			catch(Exception e){
                        //				ee[0]=e;
                        //				thread.interrupt();
                        //				if(sockp[0]!=null){
                        //				try{
                        //				sockp[0].close();
                        //				sockp[0]=null;
                        //				}catch(Exception eee){}
                        //				}
                        //			}
                        //			}
                        //			});
                        //			tmp.start();
                        //			try{
                        //			Thread.sleep(connectTimeout);
                        //			message="timeout: ";
                        //			}
                        //			catch(java.lang.InterruptedException eee){
                        //			tmp.interrupt();
                        //			tmp=null;
                        //			System.gc();
                        //			}
                        //			done[0]=true;
                        //			if(sockp[0]!=null){
                        //			socket=sockp[0];
                        //			}
                        //			else{
                        //			message+="socket is not established";
                        //			if(ee[0]!=null){
                        //			message=ee[0].toString();
                        //			}
                        //			throw new JSchException(message);
                        //			}
                        //		}
                        socket.Connect(ipe);
                        NetworkStream ns = new NetworkStream( socket );
                        ins=ns;
                        outs=ns;
                    }
                    else
                    {
                        socket=socket_factory.createSocket(host, port);
                        ins=socket_factory.getInputStream(socket);
                        outs=socket_factory.getOutputStream(socket);
                    }
                    if(timeout>0)
                    {
                        socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, timeout);
                    }
                    socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.NoDelay, 1);
                    io.setInputStream(ins);
                    io.setOutputStream(outs);
                }
                else
                {
                    lock(proxy)
                    {
                        proxy.connect(this, host, port);
                        io.setInputStream(proxy.getInputStream());
                        io.setOutputStream(proxy.getOutputStream());
                    }
                }

                isConnected=true;

                i=0;
                while(i<buf.buffer.Length)
                {
                    j=io.getByte();
                    buf.buffer[i]=(byte)j; i++;
                    if(j==10)break;
                }

                if(buf.buffer[i-1]==10)
                {    // 0x0a
                    i--;
                    if(buf.buffer[i-1]==13)
                    {  // 0x0d
                        i--;
                    }
                }

                if(i==buf.buffer.Length ||
                    i<7 ||                                      // SSH-1.99 or SSH-2.0
                    (buf.buffer[4]=='1' && buf.buffer[6]!='9')  // SSH-1.5
                    )
                {
                    throw new JSchException("invalid server's version string");
                }

                V_S=new byte[i]; Array.Copy(buf.buffer, 0, V_S, 0, i);
                //Console.WritLine("V_S: ("+i+") ["+new String(V_S)+"]");

                //io.put(V_C, 0, V_C.length); io.put("\n".getBytes(), 0, 1);
            {
                // Some Cisco devices will miss to read '\n' if it is sent separately.
                byte[] foo=new byte[V_C.Length+1];
                Array.Copy(V_C, 0, foo, 0, V_C.Length);
                foo[foo.Length-1]=(byte)'\n';
                io.put(foo, 0, foo.Length);
            }

                buf=read(buf);
                //Console.WritLine("read: 20 ? "+buf.buffer[5]);
                if(buf.buffer[5]!=SSH_MSG_KEXINIT)
                {
                    throw new JSchException("invalid protocol: "+buf.buffer[5]);
                }
                KeyExchange kex=receive_kexinit(buf);

                bool result;
                while(true)
                {
                    buf=read(buf);
                    if(kex.getState()==buf.buffer[5])
                    {
                        result=kex.next(buf);
                        if(!result)
                        {
                            //Console.WritLine("verify: "+result);
                            throw new JSchException("verify: "+result);
                        }
                    }
                    else
                    {
                        throw new JSchException("invalid protocol(kex): "+buf.buffer[5]);
                    }
                    if(kex.getState()==KeyExchange.STATE_END)
                    {
                        break;
                    }
                }

                checkHost(host, kex);

                send_newkeys();

                // receive SSH_MSG_NEWKEYS(21)
                buf=read(buf);
                //Console.WritLine("read: 21 ? "+buf.buffer[5]);
                if(buf.buffer[5]==SSH_MSG_NEWKEYS)
                {
                    receive_newkeys(buf, kex);
                }
                else
                {
                    throw new JSchException("invalid protocol(newkyes): "+buf.buffer[5]);
                }

                bool auth=false;
                bool auth_cancel=false;

                UserAuthNone usn=new UserAuthNone(userinfo);
                auth=usn.start(this);

                String methods=usn.getMethods();
                // methods: publickey,password,keyboard-interactive
                if(methods==null)
                {
                    methods="publickey,password,keyboard-interactive";
                }

                //loop:
                while(true)
                {

                    //Console.WritLine("methods: "+methods);

                    while(!auth &&
                        methods!=null && methods.Length>0)
                    {

                        //Console.WritLine("  methods: "+methods);

                        UserAuth us=null;
                        if(methods.StartsWith("publickey"))
                        {
                            //Console.WritLine("   jsch.identities.size()="+jsch.identities.size());
                            lock(jsch.identities)
                            {
                                if(jsch.identities.Count>0)
                                {
                                    us=new UserAuthPublicKey(userinfo);
                                }
                            }
                        }
                        else if(methods.StartsWith("keyboard-interactive"))
                        {
                            if(userinfo is UIKeyboardInteractive)
                            {
                                us=new UserAuthKeyboardInteractive(userinfo);
                            }
                        }
                        else if(methods.StartsWith("password"))
                        {
                            us=new UserAuthPassword(userinfo);
                        }
                        if(us!=null)
                        {
                            try
                            {
                                auth=us.start(this);
                                auth_cancel=false;
                            }
                            catch(JSchAuthCancelException ee)
                            {
                                Console.WriteLine(ee);
                                auth_cancel=true;
                            }
                            catch(JSchPartialAuthException ee)
                            {
                                methods=ee.getMethods();
                                //Console.WritLine("PartialAuth: "+methods);
                                auth_cancel=false;
                                continue /*loop*/;
                            }
                            catch(Exception ee)
                            {
                                throw ee;
                            }
                        }
                        if(!auth)
                        {
                            int comma=methods.IndexOf(",");
                            if(comma==-1) break;
                            methods=methods.Substring(comma+1);
                        }
                    }
                    break;
                }

                if(auth)
                {
                    connectThread=new System.Threading.Thread(new System.Threading.ThreadStart(run));
                    connectThread.Start();
                    return;
                }
                if(auth_cancel)
                    throw new JSchException("Auth cancel");
                throw new JSchException("Auth fail");
            }
            catch(Exception e)
            {
                if(isConnected)
                {
                    try
                    {
                        packet.reset();
                        buf.putByte((byte)SSH_MSG_DISCONNECT);
                        buf.putInt(3);
                        buf.putString(Util.getBytes(e.ToString()));
                        buf.putString(Util.getBytes( "en" ));
                        write(packet);
                        disconnect();
                    }
                    catch
                    {
                    }
                }
                isConnected=false;
                //e.printStackTrace();
                //if(e is JSchException) throw (JSchException)e;
                //throw new JSchException("Session.connect: "+e);
                throw e;
            }
        }
Exemple #32
0
        public override bool next(Buffer _buf)
        {
            int  i, j;
            bool result = false;

            switch (state)
            {
            case SSH_MSG_KEXDH_REPLY:
                // The server responds with:
                // byte      SSH_MSG_KEXDH_REPLY(31)
                // string    server public host key and certificates (K_S)
                // mpint     f
                // string    signature of H
                j = _buf.getInt();
                j = _buf.getByte();
                j = _buf.getByte();
                if (j != 31)
                {
                    Console.WriteLine("type: must be 31 " + j);
                    result = false;
                    break;
                }

                K_S = _buf.getString();
                // K_S is server_key_blob, which includes ....
                // string ssh-dss
                // impint p of dsa
                // impint q of dsa
                // impint g of dsa
                // impint pub_key of dsa
                //System.out.print("K_S: "); //dump(K_S, 0, K_S.length);
                byte[] f        = _buf.getMPInt();
                byte[] sig_of_H = _buf.getString();

                /*
                 * for(int ii=0; ii<sig_of_H.length;ii++){
                 * System.out.print(Integer.toHexString(sig_of_H[ii]&0xff));
                 * System.out.print(": ");
                 * }
                 * Console.WriteLine("");
                 */

                dh.setF(f);
                K = dh.getK();

                //The hash H is computed as the HASH hash of the concatenation of the
                //following:
                // string    V_C, the client's version string (CR and NL excluded)
                // string    V_S, the server's version string (CR and NL excluded)
                // string    I_C, the payload of the client's SSH_MSG_KEXINIT
                // string    I_S, the payload of the server's SSH_MSG_KEXINIT
                // string    K_S, the host key
                // mpint     e, exchange value sent by the client
                // mpint     f, exchange value sent by the server
                // mpint     K, the shared secret
                // This value is called the exchange hash, and it is used to authenti-
                // cate the key exchange.
                buf.reset();
                buf.putString(V_C); buf.putString(V_S);
                buf.putString(I_C); buf.putString(I_S);
                buf.putString(K_S);
                buf.putMPInt(e); buf.putMPInt(f);
                buf.putMPInt(K);
                byte[] foo = new byte[buf.getLength()];
                buf.getByte(foo);
                sha.update(foo, 0, foo.Length);
                H = sha.digest();
                //System.out.print("H -> "); //dump(H, 0, H.length);

                i = 0;
                j = 0;
                j = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                    ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                String alg = Util.getString(K_S, i, j);
                i += j;

                result = false;

                if (alg.Equals("ssh-rsa"))
                {
                    byte[] tmp;
                    byte[] ee;
                    byte[] n;

                    type = RSA;

                    j = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                        ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    ee  = tmp;
                    j   = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                          ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    n   = tmp;

                    //	SignatureRSA sig=new SignatureRSA();
                    //	sig.init();

                    ISignatureRSA sig = null;
                    try
                    {
                        sig = new Tamir.SharpSsh.jsch.jce.SignatureRSA();
                        sig.init();
                    }
                    catch (Exception eee)
                    {
                        Console.WriteLine(eee);
                    }

                    sig.setPubKey(ee, n);
                    sig.update(H);
                    result = sig.verify(sig_of_H);
                    //MainClass.dump(ee, n, sig_of_H, H);
                }
                else if (alg.Equals("ssh-dss"))
                {
                    byte[] q = null;
                    byte[] tmp;
                    byte[] p;
                    byte[] g;

                    type = DSS;

                    j = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                        ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    p   = tmp;
                    j   = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                          ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    q   = tmp;
                    j   = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                          ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    g   = tmp;
                    j   = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                          ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    f   = tmp;
                    //	SignatureDSA sig=new SignatureDSA();
                    //	sig.init();
                    ISignatureDSA sig = null;
                    try
                    {
                        sig = new Tamir.SharpSsh.jsch.jce.SignatureDSA();
                        sig.init();
                    }
                    catch (Exception ee)
                    {
                        Console.WriteLine(ee);
                    }
                    sig.setPubKey(f, p, q, g);
                    sig.update(H);
                    result = sig.verify(sig_of_H);
                }
                else
                {
                    Console.WriteLine("unknow alg");
                }
                state = STATE_END;
                break;
            }
            return(result);
        }
Exemple #33
0
        public override byte[] getPublicKeyBlob()
        {
            byte[] foo = base.getPublicKeyBlob();
            if (foo != null) return foo;

            if (pub_array == null) return null;

            Buffer buf = new Buffer(sshrsa.Length + 4 +
                                    pub_array.Length + 4 +
                                    n_array.Length + 4);
            buf.putString(sshrsa);
            buf.putString(pub_array);
            buf.putString(n_array);
            return buf.buffer;
        }
        internal static void delPort(Session session, int rport)
        {
            lock(pool)
            {
                Object[] foo=null;
                for(int i=0; i<pool.Count; i++)
                {
                    Object[] bar=(Object[])(pool[i]);
                    if(!bar[0].Equals(session)) continue;
                    if((int)bar[1]!=rport) continue;
                    foo=bar;
                    break;
                }
                if(foo==null)return;
                pool.Remove(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( Util.getBytes("cancel-tcpip-forward"));
                buf.putByte((byte)0);
                buf.putString(Util.getBytes("0.0.0.0"));
                buf.putInt(rport);
                session.write(packet);
            }
            catch
            {
                //    throw new JSchException(e.toString());
            }
        }
        public override void connect()
        {
            try
            {
                if (!session.isConnected())
                {
                    throw new JSchException("session is down");
                }
                Buffer buf = new Buffer(150);
                Packet packet = new Packet(buf);
                // send
                // byte   SSH_MSG_CHANNEL_OPEN(90)
                // string channel type         //
                // uint32 sender channel       // 0
                // uint32 initial window size  // 0x100000(65536)
                // uint32 maxmum packet size   // 0x4000(16384)

                packet.reset();
                buf.putByte((byte) 90);
                buf.putString(Util.getBytes("direct-tcpip"));
                buf.putInt(id);
                buf.putInt(lwsize);
                buf.putInt(lmpsize);
                buf.putString(Util.getBytes(host));
                buf.putInt(port);
                buf.putString(Util.getBytes(originator_IP_address));
                buf.putInt(originator_port);
                session.write(packet);

                int retry = 1000;
                try
                {
                    while (this.getRecipient() == -1 &&
                           session.isConnected() &&
                           retry > 0 &&
                           !_eof_remote)
                    {
                        //Thread.sleep(500);
                        Thread.Sleep(50);
                        retry--;
                    }
                }
                catch
                {
                }

                if (!session.isConnected())
                {
                    throw new JSchException("session is down");
                }
                if (retry == 0 || this._eof_remote)
                {
                    throw new JSchException("channel is not opened.");
                }
                /*
                if(this.eof_remote){      // failed to open
                  disconnect();
                  return;
                }
                */

                connected = true;

                thread = new JavaThread(this);
                thread.Start();
            }
            catch (Exception e)
            {
                io.close();
                io = null;
                del(this);
                if (e is JSchException)
                {
                    throw (JSchException) e;
                }
            }
        }
		public virtual void connect()
		{
			if(!session.isConnected())
			{
				throw new JSchException("session is down");
			}
			try
			{
				Buffer buf=new Buffer(100);
				Packet packet=new Packet(buf);
				// send
				// byte   SSH_MSG_CHANNEL_OPEN(90)
				// string channel type         //
				// uint32 sender channel       // 0
				// uint32 initial window size  // 0x100000(65536)
				// uint32 maxmum packet size   // 0x4000(16384)
				packet.reset();
				buf.putByte((byte)90);
				buf.putString(this.type);
				buf.putInt(this.id);
				buf.putInt(this.lwsize);
				buf.putInt(this.lmpsize);
				session.write(packet);

				int retry=1000;
				while(this.getRecipient()==-1 &&
					session.isConnected() &&
					retry>0)
				{
					try{Thread.sleep(50);}
					catch(Exception ee){}
					retry--;
				}
				if(!session.isConnected())
				{
					throw new JSchException("session is down");
				}
				if(retry==0)
				{
					throw new JSchException("channel is not opened.");
				}
				connected=true;
				start();
			}
			catch(Exception e)
			{
				connected=false;
				if(e is JSchException) throw (JSchException)e;
			}
		}
Exemple #37
0
        private byte[] getSignature_rsa(Session session, byte[] data)
        {
            try
            {
                Type t = Type.GetType(jsch.getConfig("signature.rsa"));
                SignatureRSA rsa = (SignatureRSA) Activator.CreateInstance(t);

                rsa.init();
                rsa.setPrvKey(e_array, n_array, d_array, p_array, q_array, dmp1_array, dmq1_array, iqmp_array);

                /*
                byte[] goo=new byte[4];
                goo[0]=(byte)(session.getSessionId().Length>>>24);
                goo[1]=(byte)(session.getSessionId().Length>>>16);
                goo[2]=(byte)(session.getSessionId().Length>>>8);
                goo[3]=(byte)(session.getSessionId().Length);
                rsa.update(goo);
                rsa.update(session.getSessionId());
                */
                rsa.update(data);
                byte[] sig = rsa.sign();
                Buffer buf = new Buffer("ssh-rsa".Length + 4 +
                                        sig.Length + 4);
                buf.putString(Encoding.Default.GetBytes("ssh-rsa"));
                buf.putString(sig);
                return buf.buffer;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
            return null;
        }
Exemple #38
0
        public override void connect()
        {
            try
            {
                if (!session.isConnected())
                {
                    throw new JSchException("session is down");
                }
                Buffer buf    = new Buffer(150);
                Packet packet = new Packet(buf);
                // send
                // byte   SSH_MSG_CHANNEL_OPEN(90)
                // string channel type         //
                // uint32 sender channel       // 0
                // uint32 initial window size  // 0x100000(65536)
                // uint32 maxmum packet size   // 0x4000(16384)

                packet.reset();
                buf.putByte((byte)90);
                buf.putString(Util.getBytes("direct-tcpip"));
                buf.putInt(id);
                buf.putInt(lwsize);
                buf.putInt(lmpsize);
                buf.putString(Util.getBytes(host));
                buf.putInt(port);
                buf.putString(Util.getBytes(originator_IP_address));
                buf.putInt(originator_port);
                session.write(packet);

                int retry = 1000;
                try
                {
                    while (this.getRecipient() == -1 &&
                           session.isConnected() &&
                           retry > 0 &&
                           !_eof_remote)
                    {
                        //Thread.sleep(500);
                        Thread.Sleep(50);
                        retry--;
                    }
                }
                catch
                {
                }

                if (!session.isConnected())
                {
                    throw new JSchException("session is down");
                }
                if (retry == 0 || this._eof_remote)
                {
                    throw new JSchException("channel is not opened.");
                }

                /*
                 * if(this.eof_remote){      // failed to open
                 * disconnect();
                 * return;
                 * }
                 */

                connected = true;

                thread = new Thread(this);
                thread.start();
            }
            catch (Exception e)
            {
                io.close();
                io = null;
                Channel.del(this);
                if (e is JSchException)
                {
                    throw (JSchException)e;
                }
            }
        }
Exemple #39
0
        private byte[] getSignature_dss(Session session, byte[] data)
        {
            /*
                byte[] foo;
                int i;
                System.out.print("P ");
                foo=P_array;
                for(i=0;  i<foo.Length; i++){
                System.out.print(Integer.toHexString(foo[i]&0xff)+":");
                }
                System.out.println("");
                System.out.print("Q ");
                foo=Q_array;
                for(i=0;  i<foo.Length; i++){
                System.out.print(Integer.toHexString(foo[i]&0xff)+":");
                }
                System.out.println("");
                System.out.print("G ");
                foo=G_array;
                for(i=0;  i<foo.Length; i++){
                System.out.print(Integer.toHexString(foo[i]&0xff)+":");
                }
                System.out.println("");
            */

            try
            {
                Type t = Type.GetType(jsch.getConfig("signature.dss"));
                SignatureDSA dsa = (SignatureDSA) (Activator.CreateInstance(t));
                dsa.init();
                dsa.setPrvKey(prv_array, P_array, Q_array, G_array);

                /*
                byte[] goo=new byte[4];
                goo[0]=(byte)(session.getSessionId().Length>>>24);
                goo[1]=(byte)(session.getSessionId().Length>>>16);
                goo[2]=(byte)(session.getSessionId().Length>>>8);
                goo[3]=(byte)(session.getSessionId().Length);
                dsa.update(goo);
                dsa.update(session.getSessionId());
                */
                dsa.update(data);
                byte[] sig = dsa.sign();
                Buffer buf = new Buffer("ssh-dss".Length + 4 +
                                        sig.Length + 4);
                buf.putString(Encoding.Default.GetBytes("ssh-dss"));
                buf.putString(sig);
                return buf.buffer;
            }
            catch (Exception e)
            {
                Console.WriteLine("e " + e);
            }
            return null;
        }
Exemple #40
0
		public override byte[] getPublicKeyBlob()
		{
			byte[] foo=base.getPublicKeyBlob();
			if(foo!=null) return foo;

			if(P_array==null) return null;

			Buffer buf=new Buffer(sshdss.Length+4+
				P_array.Length+4+ 
				Q_array.Length+4+ 
				G_array.Length+4+ 
				pub_array.Length+4);
			buf.putString(sshdss);
			buf.putString(P_array);
			buf.putString(Q_array);
			buf.putString(G_array);
			buf.putString(pub_array);
			return buf.buffer;
		}
Exemple #41
0
 private byte[] getPublicKeyBlob_rsa()
 {
     if (e_array == null) return null;
     Buffer buf = new Buffer("ssh-rsa".Length + 4 +
                             e_array.Length + 4 +
                             n_array.Length + 4);
     buf.putString(Encoding.Default.GetBytes("ssh-rsa"));
     buf.putString(e_array);
     buf.putString(n_array);
     return buf.buffer;
 }
Exemple #42
0
 private byte[] getPublicKeyBlob_dss()
 {
     if (P_array == null) return null;
     Buffer buf = new Buffer("ssh-dss".Length + 4 +
                             P_array.Length + 4 +
                             Q_array.Length + 4 +
                             G_array.Length + 4 +
                             pub_array.Length + 4);
     buf.putString(Encoding.Default.GetBytes("ssh-dss"));
     buf.putString(P_array);
     buf.putString(Q_array);
     buf.putString(G_array);
     buf.putString(pub_array);
     return buf.buffer;
 }
Exemple #43
0
        public override bool next(Buffer _buf)
        {
            int  i, j;
            bool result = false;

            switch (state)
            {
            case SSH_MSG_KEX_DH_GEX_GROUP:
                // byte  SSH_MSG_KEX_DH_GEX_GROUP(31)
                // mpint p, safe prime
                // mpint g, generator for subgroup in GF (p)
                _buf.getInt();
                _buf.getByte();
                j = _buf.getByte();
                if (j != 31)
                {
                    Console.WriteLine("type: must be 31 " + j);
                    result = false;
                }

                p = _buf.getMPInt();
                g = _buf.getMPInt();

                /*
                 * for(int iii=0; iii<p.length; iii++){
                 * System.out.println("0x"+Integer.toHexString(p[iii]&0xff)+",");
                 * }
                 * System.out.println("");
                 * for(int iii=0; iii<g.length; iii++){
                 * System.out.println("0x"+Integer.toHexString(g[iii]&0xff)+",");
                 * }
                 */
                dh.setP(p);
                dh.setG(g);

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

                e = dh.getE();

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

                state  = SSH_MSG_KEX_DH_GEX_REPLY;
                result = true;
                break;

            case SSH_MSG_KEX_DH_GEX_REPLY:
                // The server responds with:
                // byte      SSH_MSG_KEX_DH_GEX_REPLY(33)
                // string    server public host key and certificates (K_S)
                // mpint     f
                // string    signature of H
                j = _buf.getInt();
                j = _buf.getByte();
                j = _buf.getByte();
                if (j != 33)
                {
                    Console.WriteLine("type: must be 33 " + j);
                    result = false;
                }

                K_S = _buf.getString();
                // K_S is server_key_blob, which includes ....
                // string ssh-dss
                // impint p of dsa
                // impint q of dsa
                // impint g of dsa
                // impint pub_key of dsa
                //System.out.print("K_S: "); dump(K_S, 0, K_S.length);

                byte[] f        = _buf.getMPInt();
                byte[] sig_of_H = _buf.getString();

                dh.setF(f);
                K = dh.getK();

                //The hash H is computed as the HASH hash of the concatenation of the
                //following:
                // string    V_C, the client's version string (CR and NL excluded)
                // string    V_S, the server's version string (CR and NL excluded)
                // string    I_C, the payload of the client's SSH_MSG_KEXINIT
                // string    I_S, the payload of the server's SSH_MSG_KEXINIT
                // string    K_S, the host key
                // uint32    min, minimal size in bits of an acceptable group
                // uint32   n, preferred size in bits of the group the server should send
                // uint32    max, maximal size in bits of an acceptable group
                // mpint     p, safe prime
                // mpint     g, generator for subgroup
                // mpint     e, exchange value sent by the client
                // mpint     f, exchange value sent by the server
                // mpint     K, the shared secret
                // This value is called the exchange hash, and it is used to authenti-
                // cate the key exchange.

                buf.reset();
                buf.putString(V_C); buf.putString(V_S);
                buf.putString(I_C); buf.putString(I_S);
                buf.putString(K_S);
                buf.putInt(min); buf.putInt(preferred); buf.putInt(max);
                buf.putMPInt(p); buf.putMPInt(g); buf.putMPInt(e); buf.putMPInt(f);
                buf.putMPInt(K);

                byte[] foo = new byte[buf.getLength()];
                buf.getByte(foo);
                sha.update(foo, 0, foo.Length);

                H = sha.digest();

                // System.out.print("H -> "); dump(H, 0, H.length);

                i = 0;
                j = 0;
                j = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                    ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                String alg = Util.getString(K_S, i, j);
                i += j;


                if (alg.Equals("ssh-rsa"))
                {
                    byte[] tmp;
                    byte[] ee;
                    byte[] n;

                    type = RSA;

                    j = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                        ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    ee  = tmp;
                    j   = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                          ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    n   = tmp;

                    //	SignatureRSA sig=new SignatureRSA();
                    //	sig.init();

                    ISignatureRSA sig = null;
                    try
                    {
                        sig = new Tamir.SharpSsh.jsch.jce.SignatureRSA();
                        sig.init();
                    }
                    catch (Exception eee)
                    {
                        Console.WriteLine(eee);
                    }

                    sig.setPubKey(ee, n);
                    sig.update(H);
                    result = sig.verify(sig_of_H);
                }
                else if (alg.Equals("ssh-dss"))
                {
                    byte[] q = null;
                    byte[] tmp;

                    type = DSS;

                    j = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                        ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    p   = tmp;
                    j   = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                          ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    q   = tmp;
                    j   = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                          ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    g   = tmp;
                    j   = (int)((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                          ((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff);
                    tmp = new byte[j]; Array.Copy(K_S, i, tmp, 0, j); i += j;
                    f   = tmp;

                    //	SignatureDSA sig=new SignatureDSA();
                    //	sig.init();

                    ISignatureDSA sig = null;
                    try
                    {
                        sig = new Tamir.SharpSsh.jsch.jce.SignatureDSA();
                        sig.init();
                    }
                    catch (Exception ee)
                    {
                        Console.WriteLine(ee);
                    }

                    sig.setPubKey(f, p, q, g);
                    sig.update(H);
                    result = sig.verify(sig_of_H);
                }
                else
                {
                    Console.WriteLine("unknow alg");
                }
                state = STATE_END;
                break;
            }
            return(result);
        }
		internal void dump(Buffer buf)
		{
			buf.putInt(flags);
			if((flags&SSH_FILEXFER_ATTR_SIZE)!=0){ buf.putLong(size); }
			if((flags&SSH_FILEXFER_ATTR_UIDGID)!=0)
			{
				buf.putInt(uid); buf.putInt(gid);
			}
			if((flags&SSH_FILEXFER_ATTR_PERMISSIONS)!=0)
			{ 
				buf.putInt(permissions);
			}
			if((flags&SSH_FILEXFER_ATTR_ACMODTIME)!=0){ buf.putInt(atime); }
			if((flags&SSH_FILEXFER_ATTR_ACMODTIME)!=0){ buf.putInt(mtime); }
			if((flags&SSH_FILEXFER_ATTR_EXTENDED)!=0)
			{
				int count=extended.Length/2;
				if(count>0)
				{
					for(int i=0; i<count; i++)
					{
						buf.putString(Util.getBytes(extended[i*2]));
						buf.putString(Util.getBytes(extended[i*2+1]));
					}
				}
			}
		}
		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());
			}
		}
		private void setPortForwarding(int rport) 
		{
			lock(grr)
			{
				Buffer buf=new Buffer(100); // ??
				Packet packet=new Packet(buf);

				try
				{
					// byte SSH_MSG_GLOBAL_REQUEST 80
					// String "tcpip-forward"
					// bool want_reply
					// String  address_to_bind
					// uint32  port number to bind
					packet.reset();
					buf.putByte((byte) SSH_MSG_GLOBAL_REQUEST);
					buf.putString( new String( "tcpip-forward" ).getBytes());
					//      buf.putByte((byte)0);
					buf.putByte((byte)1);
					buf.putString(new String("0.0.0.0").getBytes());
					buf.putInt(rport);
					write(packet);
				}
				catch(Exception e)
				{
					throw new JSchException(e.ToString());
				}

				grr.setThread(Thread.currentThread());
				try{ Thread.Sleep(10000);}
				catch(Exception e)
				{
				}
				int reply=grr.getReply();
				grr.setThread(null);
				if(reply==0)
				{
					throw new JSchException("remote port forwarding failed for listen port "+rport);
				}
			}
		}
Exemple #47
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.getBytesUTF8(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;
        }
Exemple #48
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);
        }
Exemple #49
0
        public void setPortForwardingR(int rport, String host, int lport)
        {
            ChannelForwardedTCPIP.addPort(this, rport, host, lport);

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

            try
            {
                // byte SSH_MSG_GLOBAL_REQUEST 80
                // string "tcpip-forward"
                // bool want_reply
                // string  address_to_bind
                // uint32  port number to bind
                packet.reset();
                buf.putByte((byte) SSH_MSG_GLOBAL_REQUEST);
                buf.putString(Util.getBytes("tcpip-forward"));
                buf.putByte((byte)0);
                buf.putString(Util.getBytes("0.0.0.0"));
                buf.putInt(rport);
                write(packet);
            }
            catch(Exception e)
            {
                throw new JSchException(e.ToString());
            }
        }