Commit Graph
1498 Commits
Author SHA1 Message Date
4e1e2436af Fix ArgumentException usage in BlockCipher (#818)
Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-04-27 20:52:34 +02:00
c8b527397a Handle timeout correctly on Socks5 Proxy (#1342)
* Add timeouts when reading from sockets in Socks5Connector

* Add a Socks5 timeout test for a connection reply

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-04-27 20:49:24 +02:00
Scott XuandRob Hague ce45129308 Fix potential side-channel timing attack issue (#1375)
* Fix potential side-channel timing attack issue

* Eliminate the extra allocation

* Remove serverHash variable

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-04-24 23:49:20 +02:00
Scott XuandRob Hague 94397d47ed Implement OpenSSH strict key exchange extension (#1366)
* Implement OpenSSH strict key exchange extension

* The pseudo-algorithm
is only valid in the initial SSH2_MSG_KEXINIT and MUST be ignored
if they are present in subsequent SSH2_MSG_KEXINIT packets.

* Only send strict kex pseudo algorithm for the first kex.
Strictly disable non-kex massages in strict kex mode.

* Unit tests for strict kex

* More unit tests

* More unit tests

* Correct file name

* Update SessionTest_ConnectingBase.cs

* More unit tests

* Delete SessionTest_Connecting_ServerSendsMaxIgnoreMessagesBeforeKexInit.cs

* Add a comment about throwing exception when inbound sequence number is about to wrap during init kex.

* Delete SessionTest_Connecting_ServerSendsDebugMessageAfterKexInit_NoStrictKex.cs

* Fix build

* Update test/Renci.SshNet.Tests/Classes/SessionTest_Connected.cs

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-04-24 22:36:28 +02:00
Rob Hague 71423c17f9 Add an AOT compatibility test app (#1378)
* Add an AOT compatibility test app

Following the guides at
https://learn.microsoft.com/en-us/dotnet/core/deploying/trimming/prepare-libraries-for-trimming?pivots=dotnet-8-0
and https://devblogs.microsoft.com/dotnet/creating-aot-compatible-libraries/,
add an application which is published for AOT in CI.

This process fully verifies all code-paths in the library and its dependencies
for trimming/AOT, which the analyzers are not themselves able to do.

(As a side benefit, now we are also checking the library builds in Release)

* Test failure scenario

* Revert "Test failure scenario"

This reverts commit 6ff943b502.
2024-04-19 13:00:57 +02:00
Scott XuandRob Hague 3dc3fc8b1c Add support for AEAD AES 128/256 GCM Ciphers (.NET 6.0 onward only) (#1369)
* Init AeadCipher

* Move AeadCipher to parent folder. Move EncryptBlock/DecryptBlock from SymmetricCipher to BlockCipher

* simplify parameter name

* Implement AesGcmCipher

* Update README

* Remove protected IV from AeadCipher; Set offset to outbound sequence just like other ciphers

* Rename associatedData to packetLengthField

* Use Span<byte> to avoid unnecessary allocations

* Use `Span` to improve performance when `IncrementCounter()`

* Add `IsAead` property to `CipherInfo`. Include packet length field and tag field in offset and length when call AesGcm's `Decrypt(...)` method. Do not determine HMAC if cipher is AesGcm during kex.

* Fix build

* Fix UT

* Check `AesGcm.IsSupported` before add to the `Encryptions` collection.
Guard AES-GCM with `NET6_0_OR_GREATER`.
Insert AES-GCM ciphers right after AES-CTR ciphers but before AES-CBC ciphers, which is similar with OpenSSH:
```
debug2: ciphers ctos: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
debug2: ciphers stoc: chacha20-poly1305@openssh.com,aes128-ctr,aes192-ctr,aes256-ctr,aes128-gcm@openssh.com,aes256-gcm@openssh.com
```
Although Dictionary's order is not defined, from observation, it is in the same order with add. Anyway that would be another topic.

* Suppress CA1859 "Use concrete types when possible for improved performance" for `ConnectionInfo.Encryptions`.
Test `Aes128Gcm` and `Aes256Gcm` only when `NET6_0_OR_GREATER`

* Update xml doc comments. Do not treat AesGcmCipher separately in Session.cs

* Fix build

* Fix build

* Update the comment as ChaCha20Poly1305 uses a separated key to encypt the packet length and the size it 4.

* Update src/Renci.SshNet/Security/Cryptography/Cipher.cs

Co-authored-by: Rob Hague <rob.hague00@gmail.com>

* Make `AesGcmCipher` internal.
Assert offset when decrypt.

* Fix nullable error in build

* typos

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-04-18 20:06:19 +02:00
Rob Hague 953e1366f2 Fix nullable error in build (#1377) 2024-04-18 19:26:52 +02:00
mus65 0fb38718e6 remove end_of_line from .editorconfig (#1372)
* git: checkout cs files with crlf

* remove end_of_line from .editorconfig

instead of forcing crlf checkout in git
2024-04-17 21:44:20 +02:00
Scott XuandRob Hague b553f81f8a Add support for Zlib compression (.NET 6.0 onward only) (#1326)
* Integrate `ZLibStream` from .NET 6.0+ with SSH.NET.

* OpenSSH server does not support zlib (pre-auth); OpenSSH client still supports zlib (pre-auth)

* Correct compression algorithm name; Update README.md

* Integrate `ZLibStream` from .NET 6.0+ with SSH.NET.

* OpenSSH server does not support zlib (pre-auth); OpenSSH client still supports zlib (pre-auth)

* Correct compression algorithm name; Update README.md

* Test the compression by upload/download file

* Refactor compression.

* Move delayed compression logic to base class.

* seal Zlib

* update unit test

* update unit test to see if it can trigger integration test

* Flush zlibStream

* Fix integration test

* update test

* Update ConnectionInfo.cs

Co-authored-by: Rob Hague <rob.hague00@gmail.com>

* Update README.md

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-04-17 21:39:27 +02:00
Jean-Sebastien Carle dd36d5b98a Added support for GitHub pages using docfx (#1358)
* Added support for GitHub pages using docfx

* Fixed StyleCop warning.

* Fixed other StyleCop warnings.
2024-04-17 21:32:54 +02:00
mus65 4cab7e5cf6 enable nullable on BaseClient and SftpClient (#1339)
* enable nullable on BaseClient and SftpClient

* SftpClient: use nameof for ArgumentException
2024-04-17 21:31:26 +02:00
Wojciech Nagórski 17f4030502 Add Rob-Hague to CODEOWNERS (#1376) 2024-04-17 13:43:36 +02:00
Rob Hague 7b58819537 Remove enormous array allocations in tests causing instability in CI (#1367)
* debugging CI

* apt-get

* print memory

* x

* x

* Remove some unbounded random.Next() calls

Some of which are causing giant array allocations unnecessarily. Should stabilise CI.

* cleanup
2024-04-06 21:37:59 +02:00
mus65andRob Hague 70a0a08dae Handle unknown channel messages correctly (#1363)
* Handle unknown channel messages correctly

See discussion #1218 . Some servers send custom channel messages
like 'keepalive@proftpd.org' as keep alive messages. This currently
causes a NotSupportedException.

According to the spec https://datatracker.ietf.org/doc/html/rfc4254#section-5.4 :

"If the request is not recognized or is not
supported for the channel, SSH_MSG_CHANNEL_FAILURE is returned."

Send a failure message back instead of throwing an exception.

* consider WantReply before sending failure reply

* Use RemoteChannelNumber for failure message

* fix wrong ChannelNumber in SshCommand Channel Response

not directly related to the PR, was noticed during Code Review.

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-04-04 16:31:04 +02:00
8bd08eda2b SftpClient: handle the SFTP session being closed by the server (#1362)
* SftpClient: handle the SFTP session being closed by the server

If the server closes the SFTP session but keeps the TCP connection open,
this currently causes IsConnected to return true, but any operation
fails with "the session is not open".

SftpClient.IsConnected now also check sftpSession.IsOpen. Connect()
and ConnectAsync() were reworked to take into account that the Session
may already/still be open, but the SFTP session may not. This is needed
so a reconnect works.

fixes #843 and #1153

* Always re-create session

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
Co-authored-by: Igor Milavec <igor.milavec@gmail.com>
2024-04-04 12:41:51 +02:00
Jean-Sebastien CarleandRob Hague 9be67c0c99 Cleanup and muting of analyzer warnings (#1357)
* Fixed warnings in tests.

* Fixed warnings in main project.

* Fix public key.

* Further warning cleanup.

* Muted remaining warnings.

* Final cleanup.

* Fix warning.

* Fix test classes.

* Fix more internals.

* Revert "internal" in test projects

* Revert more internals.

* Revert all non-analyzer changes.

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-04-03 21:57:35 +02:00
zeotuan db3d7e8d03 Fix CancelAsync Cause Deadlock (#1345)
* Fix CancelAsync Cause Deadlock

* Fix CancelAsync Cause Deadlock

* Support manual cancelling if exit-signal does not cancel

* Fix switch with duplicate case

* Revert wait exit response, use existing OperationCancelledException

* Not executing callback when command is cancelled
2024-03-24 14:55:26 +01:00
Scott Xu 3e6fc4f3ff Use BCL Timeout (#1353) 2024-03-14 13:02:22 +01:00
Rob Hague b3c68ba049 Use latest .NET 8 SDK in Ubuntu build (#1352)
* Use latest .NET 8 SDK in Ubuntu build

Should fix build errors due to 8.0.100 deprecation: https://ci.appveyor.com/project/drieseng/ssh-net/build/job/w78f3klwhahrxwa7

* Actually, seems like it's already installed
2024-03-10 07:39:28 +01:00
staecthSICKAG 0876e88330 Changed Private Key Regex to be more tolerant regarding new lines at end of key file (#1344) 2024-03-06 06:42:01 +01:00
Scott Xu e66a032308 Remove feature binary serialization (#1325)
* Drop RIPEMD160

* Replace FEATURE_BINARY_SERIALIZATION with NETFRAMEWORK
2024-03-05 07:03:31 +01:00
mus65 c044fd40c6 fix link to tests in README (#1338) 2024-02-24 12:45:49 +01:00
Rob Hague 69f145159a Fix ShellStream when receiving data larger than buffer length (#1337) 2024-02-24 09:25:54 +01:00
Wojciech Nagórski 5b9c669f1b Update README.md 2024-02-21 20:29:26 +01:00
Wojciech Nagórski a314700e47 Microsoft.Bcl.AsyncInterfaces version >= 1.0.0 (#1334) 2024.0.0 2024-02-21 19:51:12 +01:00
Scott Xu b3ec023052 Add Closed event to ShellStream. (#1332)
* Add `Closed` event to `ShellStream`. Lib consumer could hook to this event to detect if channel is closed by server **in time**.

* handle `Closed` event on different thread. No need to block original thread.
2024-02-21 08:48:02 +01:00
Wojciech Nagórski 442f0a9706 2024.0.0 (#1330) 2024-02-20 21:29:53 +01:00
Jean-Sebastien Carle f8b3ef30fc Moved IDE0005 warning configuration. (#1329) 2024-02-20 21:25:42 +01:00
Jean-Sebastien CarleandWojciech Nagórski b47b35c19b Updated dependencies. (#1328)
* Updated dependencies.

* Reverted Microsoft.Bcl.AsyncInterfaces back to version 1.0.0.

Also added a note so we no longer try to upgrade it.

* Reverted back to Moq.

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-02-20 21:19:24 +01:00
Jean-Sebastien Carle 4b9c3bf144 Limit TimeSpan timeouts to Int32 MaxValue (#1321)
* Added guard clauses to various timeouts to ensure they don't exceed an Int32 in milliseconds.

* Fixed guard clauses.

* Updated build tags.

* Added guard clauses to various timeouts to ensure they don't exceed an Int32 in milliseconds.

* Fixed tests.

* Added additional tests.

* Replaced NoWarn with .editorconfig setting

* Fixed references to parameter names.
2024-02-20 21:17:47 +01:00
Rob HagueandWojciech Nagórski 664595d30b Restore the write buffer to ShellStream (#1327)
* Restore Write/Flush tests

* Restore write buffer to ShellStream and painfully fix the mocks

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-02-18 06:38:11 +01:00
Scott Xu 59a0f9030a Drop RIPEMD160 (#1324) 2024-02-18 05:20:57 +01:00
Rob HagueandWojciech Nagórski 06af2ec6c0 Fix a few issues with ShellStream (#1322)
* Fix a few issues with ShellStream

The main change is to replace the Queue<byte> with a byte[] and a couple of
variables which index the start and end of the data. The remainder is mainly
slightly more careful locking semantics.

It also implements Expect(string) separately so that it can work on the bytes
and skip a lot of encoding work (this is where I wish ShellStream derived from
StreamReader).

One possibly contentious point: in fixing the Write behaviour I chose to
remove the "outgoing" buffer and immediately send the data across the channel.
Write(string) and WriteLine(string) were already doing this, and I felt it
was better to change Write(byte[]) to match rather than changing the string
methods.

* Integrate expectSize (as "windowSize" parameter)

* Rename "windowSize" to "lookback"

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-02-16 20:11:22 +01:00
Rob Hague 2b19eecc16 CI: remove install of net8.0 sdk on VS image (#1323)
It is installed on the image now: https://www.appveyor.com/docs/windows-images-software/#net-framework
2024-02-16 14:58:31 +01:00
Scott Xu 7cfe62b9f1 Support ETM (Encrypt-then-MAC) variants for HMAC (#1316)
* Support ETM (Encrypt-then-MAC) variants for HMAC

* Support ETM (Encrypt-then-MAC) variants for HMAC

* Remove `ETM` property from `HashInfo`

* Add support for HmacMd5Etm, HmacMd5_96_Etm, HmacSha1Etm and HmacSha1_96_Etm
Explicitly specify etm even if false

* Add Encrypt-then-MAC variants to README.md

* Add back empty span to prevent auto link

* Store ETM in `HashInfo`;
Change `HMAC Create[...]Hash()` to `HashAlgorithm Create[...]Hash(out bool isEncryptThenMAC)`
2024-02-16 13:24:54 +01:00
Jean-Sebastien Carle d07827b6c8 Fixed dequeuing of incoming queue (#1319)
* Fixed dequeuing of incoming queue.

* Adjusted return of Expect to make sure it returns the full incoming queue.
2024-02-13 19:16:41 +01:00
bcaf354ccb Significantly improve performance of ShellStream's Expect methods (#1207)
* Significantly improved performance and fixed bug with ShellStream's Expect methods.

* Fix whitespace.

* Fixed test.

* Improve ShellStream Expect

* Fixed typo.

* Doubled expectBuffer's default size and added a large expect test.

* Added guard clauses to ShellStream constructor and adjusted Common_CreateMoreChannelsThanMaxSessions test.

* Fixed XMLDoc spelling mistakes.

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
Co-authored-by: Wojciech Nagórski <wojciech.nagorski@intel.com>
2024-02-13 13:41:47 +01:00
Scott XuandRob Hague 7d357e8203 No need to collect nuget packages in appveyor.yml as the packages are not generated when build (#1317)
* Update appveyor.yml

No nupkg nor snupkg is generated at this moment. We can add these 2 lines back later if we decide to generate nuget packages when build.

* Update appveyor.yml

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-02-13 12:34:11 +01:00
Wojciech Nagórski 3bfac50ad0 Improve ShellStream Expect (#1315) 2024-02-11 23:06:25 +01:00
Wojciech Nagórski dec04f26e0 2023.0.2 version (#1314) 2024-02-11 20:15:11 +01:00
Rob Hague e23f381dea Add tests and benchmarks for ShellStream.Read and Expect (#1313)
Most of them are ignored because they fail.
2024-02-11 10:00:38 +01:00
2d0e03b8ce Added SshCommand.InputStream to allow writing to stdin of SshCommand (#1293)
* Making all unit tests pass locally.
Excluded MD5 tests on net462 because I get System.InvalidOperationException: 'This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.'
SshdConfig: do not throw for "Include", just do nothing.
Modified failing dos2unix parameters in Dockerfile.TestServer.
Forceing LF line ending for key files used by integration tests, otherwise using them causes error.
SftpClientTest.Test_Sftp_Multiple_Async_Upload_And_Download_10Files_5MB_Each times out for maxFiles=10, decreasing to 2 to make the test pass.

* Added SshCommand.InputStream.

* Added an integration test for SshCommand.InputStream.

* Reverting changes made to unit tests unrelated to this PR.

* Moved ChannelInputStream's EOF sending from Write to Dispose. Replace SshCommand.InputStream with CreateInputStream to emphasise that a (disposable) resource is created here. EndExecute also closes the _inputStream to make sure that EOF is sent (in case the user forgot to dispose the input stream). Added more unit tests: sending the input one byte at a time, not disposing the input stream, calling CreateInputStream before BeginExecute or AfterEndExecute throws exception.

* Fixing review comments.

* Fix build error after #1286

---------

Co-authored-by: ferenc.vizkeleti <ferenc.vizkeleti@innopay.hu>
Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-02-06 18:02:19 +01:00
Rob HagueandWojciech Nagórski bfe6718fce Allow the integration tests to run on .NET Framework (#1286)
* Allow the integration tests to run on .NET Framework

* Update appveyor.yml

* Update appveyor.yml

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-02-06 13:30:01 +01:00
Rob HagueandWojciech Nagórski 47eabe7574 Tweak semaphore usage in Session (#1304)
- Change _connectAndLazySemaphoreInitLock to a SemaphoreSlim and use it in
  ConnectAsync.
- Rename it to _connectLock and only use it for connecting. Replace its
  other usages (on SessionSemaphore and NextChannelNumber) with Interlocked
  operations.
- Remove AuthenticationConnection semaphore. This static member placed a
  process-wide limit on the number of connections an application can make.
  I agree with the argument in
  https://github.com/sshnet/SSH.NET/issues/409#issuecomment-457415542
  (and in several other issues/PRs) that this should not be something
  that the library attempts to control.

The last change broke a few tests which do things like making 100 connections.
I was tempted to delete these tests as I don't think they have much value, but
instead I just limited their concurrency.

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-02-06 13:16:11 +01:00
Rob Hague 54a001adea Use BinaryPrimitives in Pack (#1305) 2024-02-06 11:50:33 +01:00
Rob HagueandWojciech Nagórski 379e3ddc8a Update gitignore (#1261)
Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-02-01 21:31:54 +01:00
Scott XuandRob Hague 323b514be7 Merge nuspec and CommonAssemblyInfo into csproj (#1256)
* GeneratePackageOnBuild
IncludeSymbols

* Add packages to artifacts

* Update src/Renci.SshNet/Renci.SshNet.csproj

Co-authored-by: Rob Hague <rob.hague00@gmail.com>

* Update Renci.SshNet.csproj

Co-authored-by: Rob Hague <rob.hague00@gmail.com>

* Delete build/nuget/SSH.NET.nuspec

* Delete SSH.NET.nuspec from .sln file

* Update Renci.SshNet.csproj

* Update build.proj

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-01-28 19:00:24 +01:00
Wojciech NagórskiandRob Hague 0371af9aaf Integration benchmark tests (#1298)
* Integration benchmark tests

* Fixes

* Write with encoding

* Update src/Renci.SshNet/Common/SshDataStream.cs

Co-authored-by: Rob Hague <rob.hague00@gmail.com>

* Add more benchmarks

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-01-28 11:05:42 +01:00
Rob HagueandWojciech Nagórski 64b428f7bf Enable trim analysis and fix warnings (#1216)
* Enable trim analysis and fix warnings

* Use EnableTrimAnalyzer instead of IsTrimmable

I don't know how IsTrimmable works with references
(i.e. to SshNet.Security.Cryptography)

* Add additional aot/trimming related analyzers

* Initialise the hash instance in the constructor

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-01-26 08:20:53 +01:00
Wojciech Nagórski 0a7ef46f0f Fix build script (#1295) 2024-01-25 21:31:14 +01:00