public int getInt() { int foo = JavaCompat.ToInt32Big(buffer, s); s += 4; return(foo); }
internal int getShort() { int foo = JavaCompat.ToInt16Big(buffer, s); s += 2; return(foo); }
public long getLong() { long foo = JavaCompat.ToInt64Big(buffer, s); s += 8; return(foo); }
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"); } } }
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; */ }
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; */ }
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); } }
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); }
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); }