示例#1
0
        public int getInt()
        {
            int foo = JavaCompat.ToInt32Big(buffer, s);

            s += 4;
            return(foo);
        }
示例#2
0
        internal int getShort()
        {
            int foo = JavaCompat.ToInt16Big(buffer, s);

            s += 2;
            return(foo);
        }
示例#3
0
        public long getLong()
        {
            long foo = JavaCompat.ToInt64Big(buffer, s);

            s += 8;
            return(foo);
        }
示例#4
0
        protected void write(Packet packet)
        {
            if (reply)
            {
                channel.reply = -1;
            }
            session.write(packet);
            if (reply)
            {
                long start   = JavaCompat.CurrentTimeMillis();
                long timeout = channel.connectTimeout;
                while (channel.Connected && channel.reply == -1)
                {
                    try { Thread.Sleep(10); }
                    catch //(Exception ee)
                    {
                    }
                    if (timeout > 0L &&
                        (JavaCompat.CurrentTimeMillis() - start) > timeout)
                    {
                        channel.reply = 0;
                        throw new JSchException("channel request: timeout");
                    }
                }

                if (channel.reply == 0)
                {
                    throw new JSchException("failed to send channel request");
                }
            }
        }
示例#5
0
        public void putInt(int val)
        {
            putByte(JavaCompat.GetBytesBig(val));

            /*
             * uint uval = (uint)val;
             * tmp[0] = (byte)(uval >> 24);
             * tmp[1] = (byte)(uval >> 16);
             * tmp[2] = (byte)(uval >> 8);
             * tmp[3] = (byte)(uval);
             * Array.Copy(tmp, 0, buffer, index, 4);
             * index += 4;
             */
        }
示例#6
0
        public void putLong(long val)
        {
            putByte(JavaCompat.GetBytesBig(val));

            /*
             * ulong uval = (ulong)val;
             * tmp[0] = (byte)(uval >> 56);
             * tmp[1] = (byte)(uval >> 48);
             * tmp[2] = (byte)(uval >> 40);
             * tmp[3] = (byte)(uval >> 32);
             * Array.Copy(tmp, 0, buffer, index, 4);
             * tmp[0] = (byte)(uval >> 24);
             * tmp[1] = (byte)(uval >> 16);
             * tmp[2] = (byte)(uval >> 8);
             * tmp[3] = (byte)(uval);
             * Array.Copy(tmp, 0, buffer, index + 4, 4);
             * index += 8;
             */
        }
示例#7
0
        public void connect(int connectTimeout)
        {
            Session _session = getSession();

            if (!_session.Connected)
            {
                throw new JSchException("session is down");
            }
            this.connectTimeout = connectTimeout;
            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;
                long start   = JavaCompat.CurrentTimeMillis();
                long timeout = connectTimeout;
                while (this.getRecipient() == -1 &&
                       _session.Connected &&
                       retry > 0)
                {
                    if (timeout > 0L)
                    {
                        if ((JavaCompat.CurrentTimeMillis() - start) > timeout)
                        {
                            retry = 0;
                            continue;
                        }
                    }
                    try { Thread.Sleep(50); }
                    catch  { }
                    retry--;
                }
                if (!_session.Connected)
                {
                    throw new JSchException("session is down");
                }
                if (retry == 0)
                {
                    throw new JSchException("channel is not opened.");
                }

                /*
                 * At the failure in opening the channel on the sshd,
                 * 'SSH_MSG_CHANNEL_OPEN_FAILURE' will be sent from sshd and it will
                 * be processed in Session#run().
                 */
                if (this.isClosed())
                {
                    throw new JSchException("channel is not opened.");
                }
                connected = true;
                Start();
            }
            catch (Exception e)
            {
                connected = false;
                if (e is JSchException)
                {
                    throw (JSchException)e;
                }
                throw new JSchException(e.ToString(), e);
            }
        }
示例#8
0
        public override bool next(Buffer _buf)
        {
            int i, j;

            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.Error.WriteLine("type: must be 31 " + j);
                    return(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.err.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.err.print(Integer.toHexString(sig_of_H[ii]&0xff));
                 * System.err.print(": ");
                 * }
                 * Console.Error.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.err.print("H -> "); //dump(H, 0, H.Length);

                i  = 0;
                j  = 0;
                j  = JavaCompat.ToInt32Big(K_S, i);
                i += 4;
                //j =(int)( ((K_S[i++] << 24) & 0xff000000) | ((K_S[i++] << 16) & 0x00ff0000) |
                //((K_S[i++] << 8) & 0x0000ff00) | ((K_S[i++]) & 0x000000ff));
                string alg = Encoding.UTF8.GetString(K_S, i, j);
                i += j;

                bool result = false;

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

                    type = RSA;

                    j  = JavaCompat.ToInt32Big(K_S, i);
                    i += 4;
                    //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   = JavaCompat.ToInt32Big(K_S, i);
                    i  += 4;
                    //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();

                    SignatureRSA sig = null;
                    try
                    {
                        Type c = Type.GetType(session.getConfig("signature.rsa"));
                        sig = (SignatureRSA)(c.newInstance());
                        sig.init();
                    }
                    catch (Exception eee)
                    {
                        Console.Error.WriteLine(eee);
                    }

                    sig.setPubKey(ee, n);
                    sig.update(H);
                    result = sig.verify(sig_of_H);

                    if (JSch.getLogger().isEnabled(Logger.INFO))
                    {
                        JSch.getLogger().log(Logger.INFO,
                                             "ssh_rsa_verify: signature " + result);
                    }
                }
                else if (alg.Equals("ssh-dss"))
                {
                    byte[] q = null;
                    byte[] tmp;
                    byte[] p;
                    byte[] g;

                    type = DSS;
                    j    = JavaCompat.ToInt32Big(K_S, i);
                    i   += 4;
                    //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   = JavaCompat.ToInt32Big(K_S, i);
                    i  += 4;
                    //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   = JavaCompat.ToInt32Big(K_S, i);
                    i  += 4;
                    //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   = JavaCompat.ToInt32Big(K_S, i);
                    i  += 4;
                    //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();
                    SignatureDSA sig = null;
                    try
                    {
                        Type c = Type.GetType(session.getConfig("signature.dss"));
                        sig = (SignatureDSA)(c.newInstance());
                        sig.init();
                    }
                    catch (Exception eeee)
                    {
                        Console.Error.WriteLine(eeee);
                    }
                    sig.setPubKey(f, p, q, g);
                    sig.update(H);
                    result = sig.verify(sig_of_H);

                    if (JSch.getLogger().isEnabled(Logger.INFO))
                    {
                        JSch.getLogger().log(Logger.INFO,
                                             "ssh_dss_verify: signature " + result);
                    }
                }
                else
                {
                    Console.Error.WriteLine("unknown alg");
                }
                state = STATE_END;
                return(result);
            }
            return(false);
        }
示例#9
0
        public override bool next(Buffer _buf)
        {
            int i, j;

            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 != SSH_MSG_KEX_DH_GEX_GROUP)
                {
                    Console.Error.WriteLine("type: must be SSH_MSG_KEX_DH_GEX_GROUP " + j);
                    return(false);
                }

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

                /*
                 * for(int iii=0; iii<p.Length; iii++){
                 * Console.Error.WriteLine("0x"+Integer.toHexString(p[iii]&0xff)+",");
                 * }
                 * Console.Error.WriteLine("");
                 * for(int iii=0; iii<g.Length; iii++){
                 * Console.Error.WriteLine("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)SSH_MSG_KEX_DH_GEX_INIT);
                buf.putMPInt(e);
                session.write(packet);

                if (JSch.getLogger().isEnabled(Logger.INFO))
                {
                    JSch.getLogger().log(Logger.INFO,
                                         "SSH_MSG_KEX_DH_GEX_INIT sent");
                    JSch.getLogger().log(Logger.INFO,
                                         "expecting SSH_MSG_KEX_DH_GEX_REPLY");
                }

                state = SSH_MSG_KEX_DH_GEX_REPLY;
                return(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 != SSH_MSG_KEX_DH_GEX_REPLY)
                {
                    Console.Error.WriteLine("type: must be SSH_MSG_KEX_DH_GEX_REPLY " + j);
                    return(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.err.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.err.print("H -> "); dump(H, 0, H.Length);

                i = 0;
                j = 0;
                j = (int)(((K_S[i++] << 24) & 0xff000000U) | ((K_S[i++] << 16) & 0x00ff0000U) |
                          ((K_S[i++] << 8) & 0x0000ff00U) | ((K_S[i++]) & 0x000000ffU));
                string alg = Encoding.UTF8.GetString(K_S, i, j);
                i += j;

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

                    type = RSA;
                    j    = JavaCompat.ToInt32Big(K_S, i);
                    i   += 4;
                    //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   = JavaCompat.ToInt32Big(K_S, i);
                    i  += 4;
                    //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();

                    SignatureRSA sig = null;
                    try
                    {
                        Type c = Type.GetType(session.getConfig("signature.rsa"));
                        sig = (SignatureRSA)(c.newInstance());
                        sig.init();
                    }
                    catch (Exception eeeee)
                    {
                        Console.Error.WriteLine(eeeee);
                    }

                    sig.setPubKey(ee, n);
                    sig.update(H);
                    result = sig.verify(sig_of_H);

                    if (JSch.getLogger().isEnabled(Logger.INFO))
                    {
                        JSch.getLogger().log(Logger.INFO,
                                             "ssh_rsa_verify: signature " + result);
                    }
                }
                else if (alg.Equals("ssh-dss"))
                {
                    byte[] q = null;
                    byte[] tmp;

                    type = DSS;
                    j    = JavaCompat.ToInt32Big(K_S, i);
                    i   += 4;
                    //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   = JavaCompat.ToInt32Big(K_S, i);
                    i  += 4;
                    //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   = JavaCompat.ToInt32Big(K_S, i);
                    i  += 4;
                    //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   = JavaCompat.ToInt32Big(K_S, i);
                    i  += 4;
                    //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();

                    SignatureDSA sig = null;
                    try
                    {
                        Type c = Type.GetType(session.getConfig("signature.dss"));
                        sig = (SignatureDSA)(c.newInstance());
                        sig.init();
                    }
                    catch (Exception eeeeee)
                    {
                        Console.Error.WriteLine(eeeeee);
                    }

                    sig.setPubKey(f, p, q, g);
                    sig.update(H);
                    result = sig.verify(sig_of_H);

                    if (JSch.getLogger().isEnabled(Logger.INFO))
                    {
                        JSch.getLogger().log(Logger.INFO,
                                             "ssh_dss_verify: signature " + result);
                    }
                }
                else
                {
                    Console.Error.WriteLine("unknown alg");
                }
                state = STATE_END;
                return(result);
            }
            return(false);
        }