
Release Notes:
==============

build263 2020-07-20

- Add gradle build.

- Add OSGi support.

- Message authentication: add support for hmac-sha2-256 and hmac-sha2-512.

- Key exchange: add support for diffie-hellman-group14-sha256, diffie-hellman-group16-sha512 and diffie-hellman-group18-sha512.

build261, 2013-08-09

- Joint work by Christian Plattner and David Kocher.

- Hosted at https://code.google.com/p/ganymed-ssh-2/ with a shared SVN repository.

- Requires Java 5 or later.

- Added basic SSH server implementation. This is a proof of concept, use at your own risk, the interface may change.
  Beware of side channel attacks and other nifty stuff. See BasicServer.java example.

- Provide POM for Maven 3 build.

- Performance gains with request parallelism in requests for read and write write operations
  in SFTPv3Client.

- Fixed softwareversion string in client-server handshake.

- Bugfix for infinite timeout on socket connect.

- SFTPInputStream and SFTPOutputStream to read or write from a SFTPv3FileHandle
  compatible with standard I/O operations in Java. 

- SCPClient returning SCPInputStream and SCPOutputStream for get and put operations respectively
  compatible with stanard I/O operations in Java.

- Option to attach a packet listener to SFTPv3Client for logging purposes.

- Fixed a bug in KnownHosts.getPreferredServerHostkeyAlgorithmOrder (it always returned null,
  which is a valid return value but wrong).

- Added accessor to query session state and isConnected() in SFTPv3Client returning a boolean.

- Adjusted channel window size.

- Custom PEMDecryptException to catch PEM decoding failure.

- Option to pass custom user agent string for identification string.

- Continue silently when invalid key is found in known hosts file.

- Add support for file append mode in SFTPv3Client.

- Option to pass charset for commands executed on the remote machine.

- Add method to get local socket address from LocalPortForwarder.

- Allow to remove connection monitors.

- Add a connection monitor only if it was not added yet.

build251beta1, 2010-08-23:

- Due to the slightly changed semantics of Thread.interrupt() and Object.wait() in JDK 6,
  the code had to be adapted in several places. Please do not use Ganymed SSH-2 build250
  on JDK 6, as the Kex and Streamgobbler code may occasionally consume all CPU resources.
  
  Background: the JDK 6 javadocs for Object.wait say: "If the current thread is interrupted
  by any thread before or while it is waiting, then an InterruptedException is thrown."
  Unfortunately the Java 1.5 documentation does not say "before", only "while it is waiting".
  
  Thanks to Elias Horness.
  
build250, 2010-03-15:

- Ganymed SSH-2 for Java is back.
  The software can be downloaded from http://www.cleondris.ch/ssh2

- Fixed the use of default platform character encodings.

- Fixes for buggy servers.

- Wait for the reply to the ServiceRequest packet before sending the next request.

- Re-assign the interrupted flag after a InterruptedException.

build211beta4, 2006-12-05: (never officially released)

- Added Connection.sendIgnorePacket(...) methods which allow to send SSH_MSG_IGNORE packets.
  Thanks to Andrei Tchijov.

- Added support for the "none" authentication method.

- Revised the SHA-1 code. Highly optimized. Speed should be more than doubled.

- Changed references to the correct RFCs (instead of the drafts) in the javadocs (where possible).

- Fixed the write() method in the SFTP code. Unsatisfiable preconditions stopped the method
  from writing any bytes. As stated in the documentation, the SFTP code is still experimental.
  Thanks to Andreas Pueschel.

- Added a new createLocalPortForwarder(InetSocketAddress addr, ...) method which allows to
  specify the local address and port to bind to. Thanks to Andrei Tchijov.

- Slightly updated the FAQ.

build210, 2006-10-06:

- Added HTTP proxy support. See Connection.setProxyData() and the HTTPProxyData class.
  Thanks to Jean-Pierre Schmit for providing example code.
  
- Added basic support for SFTP (v3).
  
- Beta users: removed support for automatic split of huge read transfers in SFTP,
  as it was not possible to return EOF in a clean way. The write method still splits huge
  transfers (in blocks of 32768 bytes). Thanks to Zhong Li.
  
- SCP enhancement. It is now possible to specify an empty target directory name when sending
  files. This is analogous to using "scp file user@host:" (thanks to Bernd Eggink).

- SCP enhancement. It is now possible to receive a remote file and pipe it directly into
  an OutputStream. Thanks to Bernd Eggink.

- SCP enhancement. It is now possible to specify a different remote filename when sending
  a file. Thanks to Thomas Tatzel.

- Added more verbose error messages in case a channel open operation fails (e.g., resource
  shortage on the server). Related to this, added a comment to the FAQ regarding the limitation
  on the number of concurrent sessions per connection in OpenSSH. Thanks to Ron Warshawsky.

- Added a feature (ConnectionMonitor) to get notified when a connection breaks.
  Thanks to Daniel Ritz (Alcatel).

- It is now possible to override the used SecureRandom instance (Connection.setSecureRandom()).

- Added getters for the server's hostname and port to the Connection class.

- Added examples for HTTP proxy usage as well as local/remote port forwarding.

- Added support for SSH_MSG_KEX_DH_GEX_REQUEST_OLD in the DHGexParameters class (there
  is a new, additional constructor). Please check the Javadoc for DHGexParameters.

- Clarified in the javadoc the issue of re-using Connection objects. Changed the exception
  message in case connect() is invoked on an already connected connection.

- Added an entry to the FAQ regarding pumping data into remote files.
  Thanks to Daniel Schwager.

- Changed JDialog.show() to JDialog.setVisible(true) in the SwingShell example.
  The show() method is deprecated in Java 5.0. Thanks to Carlo Dapor.

- Fixed the behavior of the local port forwarder code. Trying to listen on an already bound port
  will not fail silently anymore. Also, the accept thread will continue accepting connections
  even if there was a problem with the establishment of the underlying ssh-forwarding of a
  previous incoming connection (e.g., one tried to establish a forwarding to a remote port that
  is not in state open (yet)). Thanks to Claudio Nieder (Inodes, Switzerland) and
  Daniel Ritz (Alcatel) for pointing this out.
  Note: the interface for managing port forwardings needs to be further improved.

- Tried to implement a workaround for the Sun JVM bug 5092063. Changed InetAddress.getByAddress(byte[])
  in the "TransportManager.parseIPv4Address" method (which already is a workaround for JDK's that
  use the resolver for dotted IP addresses, independently from the 5092063 bug) to
  InetAddress.getByAddress(String, byte[]). Thanks to Alain Philipin.

- Fixed a bug in KnownHosts.addHostkeyToFile. Hostnames were converted to lowercase which is
  not good in case of hashed hostnames (it leads to a different BASE64 encoding and therefore
  hashes won't match). Thanks to [unknown].

- Fixed a typo in the SCP client (tag for modification times is 'T' and not 'P').
  Thanks to Andreas Sahlbach.

- Stupid performance enhancement in the Logger, it did unnecessary calls to System.currentTimeMillis().

- The LICENCE.txt file is now also included in the pre-compiled jar. Of course, redistributions in
  binary form must *still* include the contents of LICENCE.txt in the documentation and/or other
  materials provided with the distribution.
  
- Small cleanups in the TransportManager code.

build209, 2006-02-14:

- A major release, many new features. Thanks to all who supported me with feedback!

- Added remote port forwarding support.
  Please consult the docs for Connection.requestRemotePortForwarding().

- Added X11 forwarding support. Please consult Session.requestX11Forwarding().
  X11 support is based on joint work with Simon Hartl (simon.hartl (at) gmx.net). Thanks, Simon!

- The SCPClient constructor is now public. The factory method is still there (in the Connection
  class), however, it will probably be marked as deprecated and eventually be removed in the future.

- Added startSubSystem() method to the Session class. Now it is possible to implement subsystems,
  e.g., sftp, outside of the library.

- For advanced users: there is now a much better condition wait interface in the Session class.
  It is now also possible to wait for the arrival of "exit-status" and "exit-signal".
  The Session.waitUntilDataAvailable() method still works, but is marked as deprecated.

  Users that used the beta version, please be aware of the following change: calling the close()
  method on a Session object will immediatelly raise the ChannelCondition.CLOSED/EOF conditions
  on the underlying channel - even though the remote side may not have yet responded with a
  SSH_MSG_CHANNEL_CLOSE message (however, in the background the library still expects the server
  to send the SSH_MSG_CHANNEL_CLOSE message). See below for an explanation.

- The behavior of Session.close() has changed. If you *kill* a Session (i.e., call Session.close()
  before EOF (or CLOSE) has been sent by the remote side), then immediatelly EOF will (locally)
  be raised for both stdout and stderr. Further incoming data (for that particular Session) will
  be ignored. However, remote data that arrived before we sent our SSH_MSG_CHANNEL_CLOSE message
  is still available (you can think of having appended the EOF marker to the end of the local
  incoming stdout and stderr queues).
  
  The reason to do this is simply because some SSH servers do sometimes not reply to our
  SSH_MSG_CHANNEL_CLOSE message (event though they should). As a consequence, a local reader may
  wait forever for the remote SSH_MSG_CHANNEL_EOF or SSH_MSG_CHANNEL_CLOSE messages to arrive.
  If you are interested, then you can try to reproduce the problem: Execute something like
  "tail -f /dev/null" (which should do nothing forever) and then concurrently close the Session
  (enable debug mode to see the SSH packets on the wire) to check how standard compliant your server
  implementation is). Thanks to Cristiano Sadun.

- The Session code does not anymore make use of the synchronized attribute for any of its methods.
  This has the advantage that a call to Session.close() will never by blocked by concurrent
  calls to the Session object. However, note that in the worst case the call may still block until
  we can send our SSH_MSG_CHANNEL_CLOSE over the TCP connection.

- The SCP client can now also be used to directly inject the contents of a given byte array
  into a remote file (thanks to Dieter Baier for suggesting this).

- Added support for specifying timeouts for connection establishment.
  Thanks to Rob Hasselbaum and Ben XYZ.

- Performance improvement: we use only a single SecureRandom object per connection
  (until now there were multiple instances).

- Fixed the Swingshell example program, it did not read in the known_hosts file on startup.
  (thanks to Ashwani Kumar).

- There was a typo in the CBCMode class (srcoff was ignored), however since we always pass
  a zero offset the bug did not show up (thanks to Alex Pakhomov).

- While implementing X11 support, found a strange X11 bug in OpenSSH (reported, openssh bug 1076).
  12.10.2005: has been fixed for OpenSSH 4.3 by the OpenSSH crowd.

- Changed the SingleThreadStdoutStderr example so that it uses the new condition wait interface.

- Efficiently handle IPv4 addresses (when creating the underlying socket), there was a report
  that some JDK's try to lookup dotted addresses with the resolver.
  (thanks to Alexander Kitaev).

- Added setTCPNoDelay() method to the Connection class.

- Improved handling of unsupported global/channel requests received from the server.

- The KEX code is now more robust. Also, the ServerHostKeyVerifier callback (if specified) will be called
  before doing any DH calculation.

- Major cleanup (i.e., rewrite) of the SSH channel code.

- Cleanup up Session class, removed unnecessary IOExceptions.

- Implemented 2^32-1 conformance for channel windows.

- I got several times questions by e-mail from people that have problems with "putty" keys.
  Added an entry to the FAQ.

- Added an entry to the FAQ regarding how to handle servers with disabled password authentication
  (thanks to Nicolas Raoul).

- Upcoming: SFTP support (in the meantime almost a running gag).

- Changed the name from "Ganymed SSH2" to "Ganymed SSH-2". Will this improve the G**gle ranking? =)

- Latest javadoc is now also online.


build208, 2005-08-24:

- Added support for RSA private keys (PEM format), also revised code for RSA signature verification.

- Extended support for encrypted PEM files.
  Supported encryptions: DES-CBC, DES-EDE3-CBC, AES-128-CBC, AES-192-CBC and AES-256-CBC.
  
- Added rather complete support for known_hosts files (in KnownHosts.java).
  The parser is able to understand the same pseudo-regex (*,?,!) syntax as OpenSSH clients.
  The class includes support for hostkey comparison as well as functionality to add accepted keys
  to a known_hosts file. One can also create OpenSSH compatible fingerprints (Hex and Bubblebabble).
  Hashed hostname entries are understood and can also be generated.
  
- Restructured the examples section, added more examples. The examples should cover most issues.
  There is also a _very_ basic terminal emulator, see SwingShell.java.

- It is now possible to override the default server hostkey algorithm order (for the key exchange)
  with the Connection.setServerHostKeyAlgorithms method. This makes sense in combination with
  known_hosts support (e.g., if you already know the server's public ssh-dss key, then
  you probably prefer the "ssh-dss" over the "ssh-rsa" algorithm).
  The used server hostkey algorithm is now also reflected in ConnectionInfo.

- The default server hostkey algorithm order is now "ssh-rsa", "ssh-dss".

- Important: revised Input- and OutputStream code, everything is now unbuffered
  (less memory consumption, more direct interface, see also StreamGobbler class and the FAQ).

- Added StreamGobbler helper class.

- Method verifyServerHostKey() in the ServerHostKeyVerifier may now throw exceptions
  (an alternative to returning "false").

- All background threads (the per-connection receive thread as well as all threads
  used in forwarders and StreamGobblers) now use setDaemon(true) on startup.

- Added "diffie-hellman-group14-sha1" support to the key exchange code.

- Added chained IOExceptions where applicable (IOException initialization with initCause()).

- Cleaned up packet building code, removed unnecessary server-side methods.

- Cleaned up javadoc of SCPClient: replaced umask with mode.

- Fixed a bug in the server identification string parser. This actually prevented a successful
  key exchange with some ssh servers (the server's signature was rejected).
  Thanks to Alex Molochnikov for the initial bug report and for helping in tracking down the issue.

- Fixed a buffer re-allocation bug in the beta version of the StreamGobbler class
  (thanks to Marc Lijour).

- Fixed flawed UINT64 support (thanks to Bob Simons).

- Fixed a bug in the build script of the beta builds (sftp beta directory was not completely removed)
  (thanks to Richard Hash).

- Use zero based padding for unencrypted traffic.

- Changed again the client identification string (the one presented to the server).

- Created a FAQ, available on the website and in the distribution.
  
- Revised javadoc comments. Also, the generated documentation is now located in the subdirectory
  "javadoc" instead of "doc" (in the distribution).

- Added README.txt to the distribution.


build207, 2005-07-21:

- Added "Keyboard Interactive" authentication method:
  authenticateWithKeyboardInteractive() in Connection.java,
  also have a look at InteractiveCallback.java.

- Extended authentication interface in Connection.java (backwards compatible).
  New functionality: getRemainingAuthMethods(), isAuthMethodAvailable(),
  isAuthenticationComplete() and isAuthenticationPartialSuccess().

- Using an authentication method not supported by the server leads now to an exception
  (instead of returning "false"). Use isAuthMethodAvailable() if you want to check
  for the availability of an authentication method.

- Fixed a bug in SCPClient which sometimes lead to failed downloads.

- Improved channel window handling.

- Removed bogus (CVS) version string from Connection.java

- Changed client identification string to "Ganymed_buildXXX".

- Changed the jar file naming scheme (ganymed-ssh2-buildXXX.jar).

- Started adding logging support for debugging purposes (currently only for development).

- Cleanup of javadoc and comments at several places.

- Reversed order of entries in HISTORY.TXT


build206, 2005-07-04:

- Fixed small resource issue with SCP (thanks to Michaël Giraud).

- Added LocalStreamForwarder.

- Added HISTORY.TXT


build205, 2005-06-27:

- Initial release.

