/libssh2

Primary LanguageCBSD 3-Clause "New" or "Revised" LicenseBSD-3-Clause

libssh2 - SSH2 library
======================

libssh2 is a library implementing the SSH2 protocol, available under
the revised BSD license.

Web site: http://www.libssh2.org/

Mailing list: http://cool.haxx.se/mailman/listinfo/libssh2-devel

To build libssh2 you will need CMake v2.8 or later [1] and one of the
following cryptography libraries:

* OpenSSL
* Libgcrypt
* WinCNG

Getting started
---------------

If you are happy with the default options, make a new build directory,
change to it, configure the build environment and build the project:

  mkdir bin
  cd bin
  cmake ..
  cmake --build .

libssh2 will be built as a static library and will use any
cryptography library available.  The library binary will be put in
`bin/src`, with the examples in `bin/example` and the tests in
`bin/tests`.

Customising the build
---------------------

Of course, you might want to customise the build options.  You can
pass the options to CMake on the command line:

  cmake -D<option>=<value> ..

The following options are available:

 * `BUILD_SHARED_LIBS=OFF`

    Determines whether libssh2 is built as a static library or as a
    shared library (.dll/.so).  Can be `ON` or `OFF`.

 * `CRYPTO_BACKEND=`

    Chooses a specific cryptography library to use for cryptographic
    operations.  Can be `OpenSSL` (http://www.openssl.org),
    `Libgcrypt` (http://www.gnupg.org/), `WinCNG` (Windows Vista+) or
    blank to use any library available.

    CMake will attempt to locate the libraries automatically.  See [2]
    for more information.

 * `ENABLE_ZLIB_COMPRESSION=OFF`

    Will use zlib (http://www.zlib.org) for payload compression.  Can
    be `ON` or `OFF`.

 * `ENABLE_CRYPT_NONE=OFF`

    The SSH2 Transport allows for unencrypted data transmission using
    the "none" cipher.  Because this is such a huge security hole, it
    is typically disabled on SSH2 implementations and is disabled in
    libssh2 by default as well.

    Enabling this option will allow for "none" as a negotiable method,
    however it still requires that the method be advertized by the
    remote end and that no more-preferable methods are available.

 * `ENABLE_MAC_NONE=OFF`

    The SSH2 Transport also allows implementations to forego a message
    authentication code.  While this is less of a security risk than
    using a "none" cipher, it is still not recommended as disabling
    MAC hashes removes a layer of security.

    Enabling this option will allow for "none" as a negotiable method,
    however it still requires that the method be advertized by the
    remote end and that no more-preferable methods are available.

 * `ENABLE_GEX_NEW=ON`

    The diffie-hellman-group-exchange-sha1 (dh-gex) key exchange
    method originally defined an exchange negotiation using packet
    type 30 to request a generation pair based on a single target
    value.  Later refinement of dh-gex provided for range and target
    values.  By default libssh2 will use the newer range method.

    If you experience trouble connecting to an old SSH server using
    dh-gex, try this option to fallback on the older more reliable
    method.

 * `ENABLE_DEBUG_LOGGING=ON` in Debug, `=OFF` in Release

    Will enable the libssh2_trace() function for showing debug traces.

Build tools
-----------

The previous examples used CMake to start the build using:

  cmake --build .

Alternatively, once CMake has configured your project, you can just
use your own build tool, e.g GNU make, Visual Studio, etc., from that
point onwards.

Tests
-----

To test the build, run the appropriate test target for your build
system.  For example:

  cmake --build . --target test
or
  cmake --build . --target RUN_TESTS

How do I use libssh2 in my project if my project doesn't use CMake?
-------------------------------------------------------------------

If you are not using CMake for your own project, install libssh2

  cmake <libssh2 source location>
  cmake --build .
  cmake --build . --target install
or
  cmake --build . --target INSTALL

and then specify the install location to your project in the normal
way for your build environment.  If you don't like the default install
location, add `-DCMAKE_INSTALL_PREFIX=<chosen prefix>` when initially
configuring the project.

How can I use libssh2 in my project if it also uses CMake?
----------------------------------------------------------

If your own project also uses CMake, you don't need to worry about
setting it up with libssh2's location.  Just add just the following
lines and CMake will find libssh2 on your system, set up the necessary
paths and link the library with your binary.

    find_package(Libssh2 REQUIRED CONFIG)
    target_link_libraries(my_project_target Libssh2::libssh2)

Of course, you still have to make libssh2 available on your system
first.  You can install it in the traditional way shown above, but you
don't have to.  Instead you can just build it, which will export its
location to the user package registry [3] where `find_package` will
find it.

You can even combine the two steps using a so-called 'superbuild'
project [4] that downloads, builds and exports libssh2, and then
builds your project:

    include(ExternalProject)

    ExternalProject_Add(
        Libssh2
        URL <libssh2 download location>
        URL_HASH SHA1=<libssh2 archive SHA1>
	INSTALL_COMMAND "")

    ExternalProject_Add(
        MyProject DEPENDS Libssh2
        SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src
        INSTALL_COMMAND "")

[1] http://www.cmake.org/cmake/resources/software.html
[2] http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html
[3] http://www.cmake.org/cmake/help/v3.0/manual/cmake-packages.7.html#package-registry
[4] http://www.kitware.com/media/html/BuildingExternalProjectsWithCMake2.8.html