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); }
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"); } } }
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"); } } }
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); }
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); }
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 { } }
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()); } }
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); }
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); }
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; } } }
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); }
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); }
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); }
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); }
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])); } } } }
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); }
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); }
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); }
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); } }
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; } }
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); }
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; } }
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; }
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; } } }
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; }
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; }
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; }
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; }
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); } } }
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; }
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); }
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()); } }