1
0
mirror of https://github.com/libssh2/libssh2.git synced 2026-10-24 03:48:58 +03:00
Commit Graph

1253 Commits

Author SHA1 Message Date
Dan Fandrich
906ccae2e3 Add support for AES-GCM crypto protocols
Add support for aes256-gcm@openssh.com and aes128-gcm@openssh.com
ciphers, which are the OpenSSH implementations of AES-GCM cryptography.
It is similar to RFC5647 but has changes to the MAC protocol
negotiation.  These are implemented for recent versions of OpenSSL only.

The ciphers work differently than most previous ones in two big areas:
the cipher includes its own integrated MAC, and the packet length field
in the SSH frame is left unencrypted.  The code changes necessary are
gated by flags in the LIBSSH2_CRYPT_METHOD configuration structure.

These differences mean that both the first and last parts of a block
require special handling during encryption. The first part is where the
packet length field is, which must be kept out of the encryption path
but in the authenticated part (as AAD).  The last part is where the
Authentication Tag is found, which is calculated and appended during
encryption or removed and validated on decryption. As encryption/
decryption is performed on each packet in a loop, one block at a time,
flags indicating when the first and last blocks are being processed are
passed down to the encryption layers.

The strict block-by-block encryption that occurs with other protocols is
inappropriate for AES-GCM, since the packet length shifts the first
encrypted byte 4 bytes into the block. Additionally, the final part of
the block must contain the AES-GCM's Authentication Tag, so it must be
presented to the lower encryption layer whole. These requirements mean
added code to consolidate blocks as they are passed down.

When AES-GCM is negotiated as the cipher, its built-in MAC is
automatically used as the SSH MAC so further MAC negotiation is not
necessary.  The SSH negotiation is skipped when _libssh2_mac_override()
indicates that such a cipher is in use.  The virtual MAC configuration
block mac_method_hmac_aesgcm is then used as the MAC placeholder.

This work was sponsored by Anders Borum.
2023-02-15 22:59:45 -08:00
Anders Borum
7063b745ee support webauthn-sk-ecdsa-sha2-nistp256 signature 2022-09-21 14:39:28 +02:00
Anders Borum
fee76af7a5 adjust signature length for sk-ecdsa-sha2-nistp256 2022-08-18 14:36:18 +02:00
Anders Borum
20b68720e3 support sk-ecdsa-sha2-nistp256@openssh.com 2022-08-15 22:00:25 +02:00
Anders Borum
86517faf4a Support RSA + ED25519 certificate authentication 2022-08-12 17:27:59 +02:00
Anders Borum
fb6ab69e2b support encrypt-then-mac (etm) MACs
Support for calculating MAC (message authentication code) on encrypted data instead of plain text data.

This adds support for the following MACs:
  hmac-sha1-etm@openssh.com
  hmac-sha2-256-etm@openssh.com
  hmac-sha2-512-etm@openssh.com
2021-12-25 17:46:29 +01:00
Anders Borum
1615d0a867 send custom channel requests 2021-12-02 22:23:13 +01:00
Anders Borum
5f7c32c8bf accept hostkeys identifying as rsa-sha2-256/512 2021-11-30 14:07:30 +01:00
Anders Borum
a3dd48e886 upgrade method in gen_publickey_from_rsa_evp 2021-10-29 14:35:02 +02:00
Anders Borum
f08ce8ec98 Merge remote-tracking branch 'origin/sha2' into shellfish 2021-10-28 08:33:11 +02:00
Anders Borum
e180c0601c parse SSH_MSG_EXT_INFO with string_buf 2021-10-28 00:02:54 +02:00
Anders Borum
8222099224 Merge remote-tracking branch 'origin/sha2' into shellfish 2021-10-27 22:03:07 +02:00
Anders Borum
1e66d2f898 only upgrade rsa method when server support it 2021-10-27 22:00:02 +02:00
Anders Borum
d43a8d40fd get server-sig-algs through rfc8308 extension 2021-10-27 21:58:41 +02:00
Anders Borum
3da839fcc1 Merge remote-tracking branch 'origin/sha2' into shellfish 2021-10-26 22:56:21 +02:00
Anders Borum
9cc16ee382 prefer rsa-sha2-256 over ssh-rsa in publickey auth 2021-10-26 22:48:31 +02:00
Anders Borum
3d6a8e2079 Merge remote-tracking branch 'upstream/master' into shellfish
# Conflicts:
#	buildconf
#	configure.ac
#	include/libssh2.h
2021-10-13 22:13:53 +02:00
Viktor Szakats
d39e9ccc5e windows: fix clang and WinCNG warnings
Fix these categories of warning:

- in `wincng.c` disagreement in signed/unsigned char when passing around
  the passphrase string:
  `warning: pointer targets in passing argument [...] differ in signedness [-Wpointer-sign]`
  Fixed by using `const unsigned char *` in all static functions and
  applying/updating casts as necessary.

- in each use of `libssh2_*_init()` macros where the result is not used:
  `warning: value computed is not used [-Wunused-value]`
  Fixed by using `(void)` casts.

- `channel.c:1171:7: warning: 'rc' may be used uninitialized in this function [-Wmaybe-uninitialized]`
  Fixed by initializing this variable with `LIBSSH2_ERROR_CHANNEL_UNKNOWN`.
  While there I replaced a few 0 literals with `LIBSSH2_ERROR_NONE`.

- in `sftp.c`, several of these two warnings:
  `warning: 'data' may be used uninitialized in this function [-Wmaybe-uninitialized]`
  `warning: 'data_len' may be used uninitialized in this function [-Wmaybe-uninitialized]`
  Fixed by initializing these variables with NULL and 0 respectively.

- Also removed the exec attribute from `wincng.h`.

Notes:
- There are many pre-existing checksrc issues.
- The `sftp.c` and `channel.c` warnings may apply to other platforms as well.

Closes #628
2021-10-01 20:09:03 +00:00
Will Cosgrove
f8db95b1d2 formatting 2021-09-02 20:28:42 +00:00
Will Cosgrove
33e98c4595 Remove unnecessary code 2021-08-30 23:07:49 +00:00
Will Cosgrove
b10ccc7633 Host Key RSA 256/512 support libssh2 #536 2021-08-30 23:05:56 +00:00
Will Cosgrove
5d31fc6dae Host Key RSA 256/512 support #536 2021-08-30 17:45:20 +00:00
Will Cosgrove
6f68e8d064 openssl.c: guards around calling FIPS_mode() #596 (#603)
Notes:
FIPS_mode() is not implemented in LibreSSL and this API is removed in OpenSSL 3.0 and was introduced in 0.9.7. Added guards around making this call.

Credit:
Will Cosgrove
2021-05-26 16:43:32 -07:00
Will Cosgrove
36fcd543d9 packet.c: Reset read timeout after received a packet (#576) (#586)
File:
packet.c

Notes:
Attempt keyboard interactive login (Azure AD 2FA login) and use more than 60 seconds to complete the login, the connection fails.

The _libssh2_packet_require function does almost the same as _libssh2_packet_requirev but this function sets state->start = 0 before returning.

Credit:
teottin, Co-authored-by: Tor Erik Ottinsen <tor.ottinsen@kdi.kongsberg.com>
2021-05-12 09:14:09 -07:00
kkoenig
3f9d505353 Support ECDSA certificate authentication (#570)
Files: hostkey.c, userauth.c, test_public_key_auth_succeeds_with_correct_ecdsa_key.c

Notes:
Support ECDSA certificate authentication

Add a test for:
  - Existing ecdsa basic public key authentication
  - ecdsa public key authentication with a signed public key

Credit:
kkoenig
2021-05-12 09:13:19 -07:00
Gabriel Smith
c998f79384 agent.c: Add support for Windows OpenSSH agent (#517)
Files: agent.c, agent.h, agent_win.c

Notes:
* agent: Add support for Windows OpenSSH agent

The implementation was partially taken and modified from that found in
the Portable OpenSSH port to Win32 by the PowerShell team, but mostly
based on the existing Unix OpenSSH agent support.

https://github.com/PowerShell/openssh-portable

Regarding the partial transfer support implementation: partial transfers
are easy to deal with, but you need to track additional state when
non-blocking IO enters the picture. A tracker of how many bytes have
been transfered has been placed in the transfer context struct as that's
where it makes most sense. This tracker isn't placed behind a WIN32
 #ifdef as it will probably be useful for other agent implementations.

* agent: win32 openssh: Disable overlapped IO

Non-blocking IO is not currently supported by the surrounding agent
code, despite a lot of the code having everything set up to handle it.

Credit:
Co-authored-by: Gabriel Smith <gabriel.smith@precisionot.com>
2021-05-11 14:13:37 -07:00
Zenju
58ae048c92 Fix detailed _libssh2_error being overwritten (#473)
Files: openssl.c, pem.c, userauth.c

Notes:
* Fix detailed _libssh2_error being overwritten by generic errors
* Unified error handling

Credit:
Zenju
2021-05-11 14:09:57 -07:00
Paul Capron
b3a8a6d27c Fix _libssh2_random() silently discarding errors (#520)
Notes:
* Make _libssh2_random return code consistent

Previously, _libssh2_random was advertized in HACKING.CRYPTO as
returning `void` (and was implemented that way in os400qc3.c), but that
was in other crypto backends a lie; _libssh2_random is (a macro
expanding) to an int-value expression or function.

Moreover, that returned code was:
  — 0 or success, -1 on error for the MbedTLS & WinCNG crypto backends
But also:
  — 1 on success, -1 or 0 on error for the OpenSSL backend!
  – 1 on success, error cannot happen for libgcrypt!

This commit makes explicit that _libssh2_random can fail (because most of
the underlying crypto functions can indeed fail!), and it makes its result
code consistent: 0 on success, -1 on error.

This is related to issue #519 https://github.com/libssh2/libssh2/issues/519
It fixes the first half of it.

* Don't silent errors of _libssh2_random

Make sure to check the returned code of _libssh2_random(), and
propagates any failure.

A new LIBSSH_ERROR_RANDGEN constant is added to libssh2.h
None of the existing error constants seemed fit.

This commit is related to d74285b684
and to https://github.com/libssh2/libssh2/issues/519 (see the issue
for more info.)  It closes #519.

Credit:
Paul Capron
2021-05-11 14:06:18 -07:00
Will Cosgrove
7118582a7c userauth.c: don't error if using keys without RSA (#555)
file: userauth.c

notes: libssh2 now supports many other key types besides RSA, if the library is built without RSA support and a user attempts RSA auth it shouldn't be an automatic error

credit: 
Will Cosgrove
2021-05-03 14:49:53 -07:00
Marc
b853d7a86e openssl.c: Avoid OpenSSL latent error in FIPS mode (#528)
File:
openssl.c

Notes:
Avoid initing MD5 digest, which is not permitted in OpenSSL FIPS certified cryptography mode.

Credit:
Marc
2021-05-03 14:49:02 -07:00
Laurent Stacul
35695772d0 openssl.c: Fix EVP_Cipher interface change in openssl 3 #463
File:
openssl.c

Notes:
Fixes building with OpenSSL 3, #463.

The change is described there:
f7397f0d58

Credit:
Laurent Stacul, reported by Sergei
2021-05-03 14:47:06 -07:00
Mary
91393d6631 libssh2_priv.h: add iovec on 3ds (#575)
file: libssh2_priv.h
note: include iovec for 3DS
credit: Mary Mstrodl
2021-04-22 13:20:43 -07:00
Viktor Szakats
4bb166a2a8 bcrypt_pbkdf.c: fix clang10 false positive warning (#563)
File: bcrypt_pbkdf.c

Notes:
blf_enc() takes a number of 64-bit blocks to encrypt, but using
sizeof(uint64_t) in the calculation triggers a warning with
clang 10 because the actual data type is uint32_t. Pass
BCRYPT_BLOCKS / 2 for the number of blocks like libc bcrypt(3)
does.

Ref: 04a2240bd8

Fixes #562

Credit:
Viktor Szakats
2021-03-04 13:10:07 -08:00
Will Cosgrove
ae26886671 transport.c: release payload on error (#554)
file: transport.c
notes: If the payload is invalid and there is an early return, we could leak the payload
credit:
Will Cosgrove
2021-02-11 09:18:16 -08:00
Etienne Samson
1adb24fd07 Add a LINT option to CMake (#372)
* ci: make style-checking available locally

* cmake: add a linting target

* tests: check test suite syntax with checksrc.pl
2021-02-02 10:28:28 -08:00
Will Cosgrove
cde13f6201 kex.c: kex_agree_instr() improve string reading (#552)
* kex.c: kex_agree_instr() improve string reading

file: kex.c
notes: if haystack isn't null terminated we should use memchr() not strchar(). We should also make sure we don't walk off the end of the buffer.
credit: 
Will Cosgrove, reviewed by Michael Buckley
2021-02-02 10:11:14 -08:00
Will Cosgrove
c69f1f27dc kex.c: use string_buf in ecdh_sha2_nistp (#551)
* kex.c: use string_buf in ecdh_sha2_nistp

file: kex.c

notes:
use string_buf in ecdh_sha2_nistp() to avoid attempting to parse malformed data
2021-01-30 19:32:14 -08:00
Will Cosgrove
1f76151c92 kex.c: move EC macro outside of if check #549 (#550)
File: kex.c

Notes:
Moved the macro LIBSSH2_KEX_METHOD_EC_SHA_HASH_CREATE_VERIFY outside of the LIBSSH2_ECDSA since it's also now used by the ED25519 code.

Sha 256, 384 and 512 need to be defined for all backends now even if they aren't used directly. I believe this is already the case, but just a heads up.

Credit:
Stefan-Ghinea
2021-01-26 11:41:21 -08:00
Tim Gates
720998f322 kex.c: fix simple typo, niumber -> number (#545)
File: kex.c

Notes:
There is a small typo in src/kex.c.

Should read `number` rather than `niumber`.

Credit:
Tim Gates
2020-12-18 09:58:29 -08:00
Tseng Jun
cfe0bf6498 session.c: Correct a typo which may lead to stack overflow (#533)
File: session.c

Notes:
Seems the author intend to terminate banner_dup buffer, later, print it to the debug console.

Author:
Tseng Jun
2020-11-11 11:18:36 -08:00
Marc Hoersken
6c7769dcc4 wincng: fix random big number generation to match openssl
The old function would set the least significant bits in
the most significant byte instead of the most significant bits.

The old function would also zero pad too much bits in the
most significant byte. This lead to a reduction of key space
in the most significant byte according to the following listing:
- 8 bits reduced to 0 bits => eg. 2048 bits to 2040 bits DH key
- 7 bits reduced to 1 bits => eg. 2047 bits to 2041 bits DH key
- 6 bits reduced to 2 bits => eg. 2046 bits to 2042 bits DH key
- 5 bits reduced to 3 bits => eg. 2045 bits to 2043 bits DH key

No change would occur for the case of 4 significant bits.
For 1 to 3 significant bits in the most significant byte
the DH key would actually be expanded instead of reduced:
- 3 bits expanded to 5 bits => eg. 2043 bits to 2045 bits DH key
- 2 bits expanded to 6 bits => eg. 2042 bits to 2046 bits DH key
- 1 bits expanded to 7 bits => eg. 2041 bits to 2047 bits DH key

There is no case of 0 significant bits in the most significant byte
since this would be a case of 8 significant bits in the next byte.

At the moment only the following case applies due to a fixed
DH key size value currently being used in libssh2:

The DH group_order is fixed to 256 (bytes) which leads to a
2047 bits DH key size by calculating (256 * 8) - 1.

This means the DH keyspace was previously reduced from 2047 bits
to 2041 bits (while the top and bottom bits are always set), so the
keyspace is actually always reduced from 2045 bits to 2039 bits.

All of this is only relevant for Windows versions supporting the
WinCNG backend (Vista or newer) before Windows 10 version 1903.

Closes #521
2020-10-10 19:58:06 +02:00
Will Cosgrove
00d5b0c385 agent.c: formatting
Improved formatting of RECV_SEND_ALL macro.
2020-09-23 13:41:34 -07:00
Will Cosgrove
a1975c5b59 CMakeLists.txt: respect install lib dir #405 (#515)
Files:
CMakeLists.txt

Notes:
Use CMAKE_INSTALL_LIBDIR directory

Credit: Arfrever
2020-09-23 13:21:11 -07:00
Will Cosgrove
f553dcc95d kex.c: group16-sha512 and group18-sha512 support #457 (#468)
Files: kex.c

Notes:
Added key exchange group16-sha512 and group18-sha512. As a result did the following:

Abstracted diffie_hellman_sha256() to diffie_hellman_sha_algo() which is now algorithm agnostic and takes the algorithm as a parameter since we needed sha512 support. Unfortunately it required some helper functions but they are simple.
Deleted diffie_hellman_sha1()
Deleted diffie_hellman_sha1 specific macro
Cleaned up some formatting
Defined sha384 in os400 and wincng backends
Defined LIBSSH2_DH_MAX_MODULUS_BITS to abort the connection if we receive too large of p from the server doing sha1 key exchange.
Reorder the default key exchange list to match OpenSSH and improve security

Credit:
Will Cosgrove
2020-09-23 13:20:00 -07:00
Igor Klevanets
9ae9ff30cb agent.c: Recv and send all bytes via network in agent_transact_unix() (#510)
Files: agent.c

Notes:
Handle sending/receiving partial packet replies in agent.c API.

Credit: Klevanets Igor <cerevra@yandex-team.ru>
2020-09-23 13:15:01 -07:00
Sebastián Katzer
5528f3da02 mbedtls.c: ECDSA support for mbed TLS (#385)
Files:
mbedtls.c, mbedtls.h, .travis.yml

Notes:
This PR adds support for ECDSA for both key exchange and host key algorithms.

The following elliptic curves are supported:

256-bit curve defined by FIPS 186-4 and SEC1
384-bit curve defined by FIPS 186-4 and SEC1
521-bit curve defined by FIPS 186-4 and SEC1

Credit:
Sebastián Katzer
2020-09-01 14:18:09 -07:00
Marc Hoersken
5964268dc7 scp.c: fix indentation in shell_quotearg documentation 2020-08-23 20:53:48 +02:00
Marc Hoersken
5eaa7aa1c0 wincng: make more use of new helper functions (#496) 2020-07-21 21:18:18 +02:00
Marc Hoersken
1894b30b5c wincng: make sure algorithm providers are closed once (#496) 2020-07-21 21:17:53 +02:00
David Benjamin
1a61d0c3ca openssl.c: clean up curve25519 code (#499)
File: openssl.c, openssl.h, crypto.h, kex.c

Notes:
This cleans up a few things in the curve25519 implementation:

- There is no need to create X509_PUBKEYs or PKCS8_PRIV_KEY_INFOs to
  extract key material. EVP_PKEY_get_raw_private_key and
  EVP_PKEY_get_raw_public_key work fine.

- libssh2_x25519_ctx was never used (and occasionally mis-typedefed to
  libssh2_ed25519_ctx). Remove it. The _libssh2_curve25519_new and
  _libssh2_curve25519_gen_k interfaces use the bytes. Note, if it needs
  to be added back, there is no need to roundtrip through
  EVP_PKEY_new_raw_private_key. EVP_PKEY_keygen already generated an
  EVP_PKEY.

- Add some missing error checks.

Credit:
David Benjamin
2020-07-10 10:47:48 -07:00