107 Commits

Author SHA1 Message Date
Ryan Esteves 737c3e5f9d Added ChangeDirectoryAsync to SftpClient (#1504)
* Add ChangeDirectoryAsync

* Added async tests for ChangeDirectoryAsync
2024-09-24 21:19:26 +02:00
Ryan Esteves 4c5d0c075e Added ExistsAsync and GetAsync to SftpClient (#1501)
* Added ExistsAsync to SftpClient

* Added GetAsync to SftpClient

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-09-21 18:07:37 +02:00
mus65 3b55ba3a0a Update SonarAnalyzer.CSharp (#1494)
* Update SonarAnalyzer.CSharp

* fix S3993: Custom attributes should be marked with "System.AttributeUsageAttribute"

https://rules.sonarsource.com/csharp/RSPEC-3993/

* fix S6966: Awaitable method should be used

Introduced abstractions for CancellationTokenSource.CancelAsync()
and Stream.DisposeAsync() to avoid #ifdef.

Supressed pipeStream.WriteAsync because it deadlocks the test.
I assume because PipeStream doesn't override WriteAsync.

https://rules.sonarsource.com/csharp/RSPEC-6966/

temp

* fix S3431: "[ExpectedException]" should not be used

Removed the Connect() from Multifactor_PublicKeyWithEmptyPassPhrase
because the Exception is already thrown in the factory.

https://rules.sonarsource.com/csharp/RSPEC-3431/

* fix S2325: Methods and properties that don't access instance data should be static

This one is pretty redundant with CA1822 (which is also disabled in the
tests).

It caught a few more cases in the library itself, most of which can't
be changed because they are public API.

https://rules.sonarsource.com/csharp/RSPEC-2325/

* fix S127: "for" loop stop conditions should be invariant

not sure if this one is worth having. The only cases it found
are imho legitimate or not worth fixing, so I supressed them.

https://rules.sonarsource.com/csharp/RSPEC-127/

* fix S1964: An abstract class should have both abstract and concrete methods

Suppressed for public APIs, changed ExtendedReplyInfo to interface.

https://rules.sonarsource.com/csharp/RSPEC-1694/

* Remove redundant test

this is already covered by Test_PrivateKey_SSH2_Encrypted_ShouldThrowSshPassPhraseNullOrEmptyExceptionWhenPassphraseIsNull

* Revert "fix S2325: Methods and properties that don't access instance data should be static"

suppress it instead

This reverts commit 2020604958.

* Revert "fix S127: "for" loop stop conditions should be invariant"

suppress it instead

This reverts commit 1d8b4ac335.
2024-09-19 18:56:32 +02:00
Rob Hague aac10fba3d Miscellaneous cleanup/throw helpers (#1491)
* PrivateKeyFile stuff

* Extract from net7 branch

* more ThrowHelper stuff
2024-09-19 07:53:05 +02:00
mus65 dde5f67b2e Migrate to NuGet Central Package Management (#1488)
* Migrate to NuGet Central Package Management

* set CentralPackageVersionOverrideEnabled to false
2024-09-11 21:41:13 +02:00
mus65 666930974d fix "client not connected" after SFTP reconnect (#1484)
* fix "client not connected" after SFTP reconnect

if the server closes the session and the client reconnects,
this currently leads to a broken state because the session
is re-created, but the SFTP subsession is not and still
references the old session.

This causes all operations to fail with "client not connected" or
even throwing the "An established connection was aborted by the server."
exception of the old session.

Always re-create the SFTP subsession to fix this.

fixes #1474

* Dispose old session on reconnect
2024-09-06 22:05:15 +02:00
Scott Xu fe827a529a [ECDsa] Falls back to use BouncyCastle if BCL (Mono) doesn't support (#1461)
* Use BouncyCastle ECDsa when runtime is Mono

* Falls back to use BouncyCastle if CngKey.Import throws NotImplementedException (in Mono)

* Take NETStandard into consideration

* Adjust some comments

* Change #if NETFRAEWORK to #if NET462 for CngKey

* Separate implementations

* Consolidate Ecdsa property and HashAlgorithm property

* Rename Import_Cng and Import_Bcl to Import; Rename Export_Cng and Export_Bcl to Export;

* Add comments

* refactor

* add host key tests

---------

Co-authored-by: Robert Hague <rh@johnstreetcapital.com>
Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-08-31 13:00:51 +02:00
Scott Xu ebb31bb16e AesGcmCipher uses BouncyCastle as a fallback if BCL does not support. (#1450)
* [AesGcmCipher] Use BouncyCastle as a fallback if BCL does not support.

* Switch back to collection initializer

* Remove conditional compilation

* Throw SshConnectionException with Reason MacError when authentication tag mismatch

* Separate BCL and BouncyCastle implementation

* Update AesGcmCipher.BclImpl.cs

* Naming enhancement

* Remove empty line

* Disable S1199. See https://github.com/sshnet/SSH.NET/pull/1371#discussion_r1704293356

* Set InnerException when MAC error. Remove Message check.

* Store KeyParameter as private field

* Use GcmCipher.ProcessAadBytes to avoid the copy of associated data

* Move nonce to constructor to avoid creating AeadParameters each packet

* Use const int for tag size

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-08-19 14:13:10 +02:00
Rob Hague fe65570ebc Use System.Security.Cryptography for DSA (#1458)
* Use System.Security.Cryptography for DSA

This is the analogue of the RSA change #1373 for DSA. This has a couple of caveats:

- The BCL supports only FIPS 186-compliant keys, that is, public (P, Q) lengths
  of (512 <= P <= 1024, 160) for FIPS 186-1/186-2; and (2048, 256), (3072, 256)
  for FIPS 186-3/186-4. The latter also specifies (2048, 224) but due to a quirk
  in the Windows API, the BCL does not support Q values of length 224[^1].
- OpenSSH, based on the SSH spec, only supports (supported) Q values of length 160,
  but appears to also work in non-FIPS-compliant cases such as in our integration
  tests with a (2048, 160) host key. That test now fails and I changed that host key
  to (1024, 160).

This basically means that (1024, 160) is the largest DSA key size supported by both
SSH.NET and OpenSSH. However, given that OpenSSH deprecated DSA in 2015[^2], and the
alternative that I have been considering is just to delete support for DSA in the
library, this change seems reasonable to me. I don't think we can justify keeping the
current handwritten code around.

I think we may still consider dropping DSA from the library, I just had this branch
laying around and figured I'd finish it off.

[^1]: https://github.com/dotnet/runtime/blob/fadd8313653f71abd0068c8bf914be88edb2c8d3/src/libraries/Common/src/System/Security/Cryptography/DSACng.ImportExport.cs#L259-L265
[^2]: https://www.openssh.com/txt/release-7.0

* Appease mono

* test experiment

* Revert "Appease mono"

This reverts commit 881eefe5e8.
2024-08-11 07:48:58 +02:00
Scott Xu 889f4f66ca Enable all net48 integration tests (#1456)
* Enable all net48 integration tests

* Skip ECDsa in net48 integration tests

* Stabilise tests

* Stabilise tests

* Stabilise tests

* Stabilise tests

* Spelling
2024-08-02 14:32:08 +02:00
Scott Xu 486b69dc98 Add support for AEAD ChaCha20Poly1305 Cipher (#1416)
* Implements ChaCha20 cipher algorithm.

* Implements chacha20-poly1305@openssh.com

* Update Cipher.cs

* Update ChaCha20Poly1305Cipher.cs

* Note that the length of the concatenation of 'packet_length',
'padding_length', 'payload', and 'random padding' MUST be a multiple
of the cipher block size or 8, whichever is larger.
See https://www.rfc-editor.org/rfc/rfc4253#section-6

* Use Chaos.Nacl Poly1305Donna

* Fix build. Fix typo. Update README

* Update README.md

* Fix build

* Remove trailing whitespace

* Fix build

* Change to BouncyCastle

* Inherit from SymmetricCipher instead of StreamCipher since StreamCipher is deleted

* Resolve conflicts

* Move field to local variable

* Compute poly key stream once

* Update test/Renci.SshNet.IntegrationTests/CipherTests.cs

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

* Fix build; Add net48 integration test in CI

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-07-27 09:43:48 +02:00
Scott Xu c614f54f0a Zlib compression uses BouncyCastle as a fallback if BCL does not support. (#1453)
Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-07-25 12:24:44 +02:00
Rob Hague 8ea108af1c Drop legacy algorithms part 1 (#1442)
This drops some of the algorithms long-considered legacy/insecure.

The idea is both to improve the theoretical security of the library by not offering
these algorithms, and to improve the practical security of the library by not having
hand-written, barely tested crypto code.

The overarching goal is for the library to have minimal exposure to crypto
implementation, relying firstly on the .NET base libraries, and secondly on
third-party providers, such as BouncyCastle.

This change covers deleting the cipher algorithms arcfour, blowfish, twofish, cast.
It covers deleting the MD5-based and truncated HMAC algorithms.

These were all disabled in OpenSSH server (sshd) in 2014[^1]:

> sshd(8): The default set of ciphers and MACs has been altered to
> remove unsafe algorithms. In particular, CBC ciphers and arcfour*
> are disabled by default.
>
> The full set of algorithms remains available if configured
> explicitly via the Ciphers and MACs sshd_config options.

and in the client in 2016[^2]:

> This release disables a number of legacy cryptographic algorithms
> by default in ssh:
>
>  * Several ciphers blowfish-cbc, cast128-cbc, all arcfour variants
>    and the rijndael-cbc aliases for AES.
>
>  * MD5-based and truncated HMAC algorithms.
>
> These algorithms are already disabled by default in sshd.

This change also drops PKCS5Padding, which is a line-for-line copy of PKCS7Padding,
and StreamCipher, which is now unused (and useless anyway).

[^1]: https://www.openssh.com/txt/release-6.7
[^2]: https://www.openssh.com/txt/release-7.2

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-07-17 08:20:10 +02:00
mus65 f512a41a1b Don't treat NuGet audit Warnings as Errors and fix warning (#1443)
.NET 9 Preview 6 now also scans transitive dependencies, which
causes a build failure in the test projects:

warning NU1902: Package 'BouncyCastle.Cryptography' 2.2.1 has a known moderate severity vulnerability, https://github.com/advisories/GHSA-8xfc-gm6g-vgpv

Don't treat these as errors and update Testcontainers to fix the warning.
2024-07-13 12:07:56 +02:00
Rob Hague 3bc568471e Add SshCommand.ExecuteAsync (#1426)
* Add SshCommand.ExecuteAsync

After the previous change (#1423), this basically entails swapping out the
IAsyncResult for a TaskCompletionSource and hooking up the cancellation/timeout
logic.

As with the prior Begin/End implementation, the initiation of the command
(SendExecRequest) happens synchronously, so there's a bit of room for improvement
there, but otherwise it is the Task-based async that we know and like.

I chose to make it void (Task)- returning instead of string like in the existing
overloads, so that OutputStream is not automatically consumed (and encoded as a
string) when that may not be desired. As in #650, I was initially considering
changing the other overloads to be void-returning as well, but decided that it was
not worth the break since most people will probably want to change over to
ExecuteAsync anyway.

* Update examples

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-06-19 13:02:19 +02:00
mus65 1b71e8fea4 fix build with .NET 9.0 SDK (#1427)
* .NET 9: fix CA1872

see https://learn.microsoft.com/en-us/dotnet/fundamentals/code-analysis/quality-rules/ca1872

* .NET 9: fix CA2022

see https://github.com/dotnet/roslyn-analyzers/pull/7208

Most of these could be safely ignored because of the following assert.
As far as I can see, The SftpFileStream.Read() implementation guarentees
that the specified number of bytes is read anyway.

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-06-16 11:35:20 +02:00
Scott Xu 9dc7db9de8 Support creating Shell(Stream) without PTY (#1419)
* Support creating Shell(Stream) without PTY
Fixes https://github.com/sshnet/SSH.NET/issues/1418

* Add integration test for "PermitTTY no"

* Fix Integration Test

* Remove duplicate shell request

* Put common operations in a shared constructor. Update xml doc comments.

* Update comments and method overriding

* Update per code review

* Update integration tests

* Renaming

* Make `bufferSize` optional

* Try fix the test

* Update per code review

* try agian

* try again

* docs

* doc

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-06-16 10:27:06 +02:00
Rob Hague ac395dd64c A couple of changes/fixes in SshCommand (#1423)
* Send "signal" and set the wait handle on completion always

* Make ExitStatus nullable
2024-06-09 21:44:44 +02:00
mus65 dda27a3177 fix flaky SFTP file time tests (#1414)
* fix flaky SFTP file time tests

These asserts currently assume that DateTime.Now and the
creation timestamp on the server happen within the same second.

Note that I didn't change the asserts below where an explicit
timestamp is set. From my understanding, these should not be affected.

example: https://ci.appveyor.com/project/drieseng/ssh-net/builds/49850731/job/u6lk0cyipbxkp4jd

* remove asserts
2024-06-04 21:55:38 +02:00
Rob Hague fdbc4d3e36 Fix a few issues with PipeStream (#1399)
Apply similar treatment to PipeStream as #1322 did to ShellStream

PipeStream now behaves much more Stream-like. In particular, it performs partial
reads (instead of blocking until a certain amount of data is available), blocks
until data is available (instead of returning 0 prematurely) and removes the
Stream-unlike properties `BlockLastReadBuffer` and `MaxBufferLength`.

Sadly I gave up trying to make a benchmark compatible with all the quirks of the
previous implementation, but a dumb throughput test (reading and writing simultaneously)
shows about 5.2GB/s with this implementation compared to 140MB/s previously.

Some cleanup of its usage in the library followed.

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2024-05-23 15:30:05 +02:00
mus65 1143ad3d24 fix flaky Sftp_BeginUploadFile test (#1402)
* fix flaky Sftp_BeginUploadFile test

this test can randomly fail because it assumes that the callback
has been called when the AsyncWaitHandle was set. But this is not
necessarily the case because AsyncResult.SetAsCompleted does it
the other way around.

example: https://ci.appveyor.com/project/drieseng/ssh-net/builds/49831002/job/1237d4lg46j22pf0

* use ManualResetEventSlim

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-05-18 21:25:03 +02:00
mus65 fe5ed423a0 fix flaky Connectivity Tests (#1403)
these two tests were not waiting for the interruption (all other usages
of BreakConnections() did). This could cause random failures because
e.g. the wrong exception is thrown.

example: https://ci.appveyor.com/project/drieseng/ssh-net/builds/49831433/job/4urb0upx63bvxcgu

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
2024-05-18 14:17:10 +02:00
mus65 c0a353a4de Cleanup formatting and style and enforce it in CI (#1380)
* Preparation to enforce formatting and style in CI

- enabled IDE0055 to enforce formatting on build
- disabled SA1137 and SA1025 because they are already
  covered by IDE0055
- disabled SA1021 because it conflicts with csharp_space_after_cast

* Cleanup formatting and style on codebase

This commit has no manual changes, it is the result
of running "dotnet format whitespace" and "dotnet format style"

* new formatting fixes after merge

* appveyor: set git autocrlf

as suggested by sharwell to hopefully fix Windows CI.

* use autocrlf input

to hopefully fix Linux tests

* fix formatting

* use autocrlf input for Linux only

* set csharp_space_after_cast to false

* Revert SA1021 suppression

---------

Co-authored-by: Robert Hague <rh@johnstreetcapital.com>
2024-05-17 22:34:27 +02:00
Rob Hague 0cfeb6bb94 Tweak AsyncSocketListener in tests (#1382)
* Tweak AsyncSocketListener in tests

Some CI runs have been crashing lately from within AsyncSocketListener.
This moves a bit of disconnection & exception handling around. It probably won't
fix the underlying tests which would have otherwise failed, but it might stop the
process from outright crashing.

Also reference the same code for the integration tests.

* Simplify the diff

* Stabilise a couple of tests
2024-05-10 11:37:01 +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 Xu 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
Scott Xu 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 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 Carle 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
Wojciech Nagórski 442f0a9706 2024.0.0 (#1330) 2024-02-20 21:29:53 +01:00
Jean-Sebastien Carle 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
Rob Hague 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
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 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
Wojciech Nagórski dec04f26e0 2023.0.2 version (#1314) 2024-02-11 20:15:11 +01:00
Ferenc Vizkeleti 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 Hague 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 Hague 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 4c2dcd5613 Upgrade packages (#1279) 2023-12-29 05:06:50 +01:00
Rob Hague b0d01df91f Try to stabilise a few tests (#1278)
* Try to stabilise a few tests

* Fix random 0 buffer sizes

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2023-12-22 08:37:30 +01:00
Jacob Slusser f172ac587c Removes MessageAttribute in favor of properties on Message class (#1270)
* Exludes the test projects from code coverage reports

* Removes MessageAttribute in favor of properties on Message class

* Benchmark for removal of MessageAttribute
2023-12-10 17:46:35 +01:00
Jacob Slusser 4c4883eed0 Standardizes additional file types in .editorconfig (#1266)
* Updates .gitignore to exclude test results

* Adds .editorconfig for xml, csproj, and props files

Formats xml, csproj, and props files

* Hides stylecop.json from Solution Explorer projects
2023-12-09 07:39:33 +01:00
Rob Hague 6d9d03205b Rebased AsyncResult fix (#1184)
* 🐛 AsyncResult contains invalid value

- AsyncResult should contain invalid value immediately after async operation is marked as completed
- there was race condition problems with callback method which is invoked on different thread so updating of value is done without any synchronization. So in some cases async operation is marked as completed but async result value is not yet updated and contains invalid value

* Revert test

---------

Co-authored-by: Miroslav Pokorný <m.pokorny@quadient.com>
2023-12-04 09:48:56 +01:00
Rob Hague a027c76d7a Fail with a friendlier error message when response has not been set (#1245)
Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2023-12-02 14:16:22 +01:00
Scott Xu 4c7bd35a71 Add support for .NET 8.0 (#1255)
* Add support for .NET 8.0

* Fix CA1512: Use 'ArgumentOutOfRangeException.ThrowIfNegative' instead of explicitly throwing a new exception instance (https://learn.microsoft.com/dotnet/fundamentals/code-analysis/quality-rules/ca1512)

* Use `ThrowIfGreaterThan` instead of `ThrowIfNegative`+calculation, to supply the correct parameter name.

* .NET 8 is faster :-)

* Use the explicit version, in case newer version SDK breaks our tests
2023-12-01 22:56:48 +01:00
Wojciech Nagórski d3641a0676 Test integration tests (#1250)
* Test integration tests

* Update appveyor.yml

* Update appveyor.yml

* Update Dockerfile

* Update appveyor.yml

* test?

* Test

* Enable docker

* Update appveyor.yml

* Update appveyor.yml

* Fix & Show additional information

* Try to fix connection problems

* Fix build

* remove artifacts

* Enable logging

* Log Information only

* Update appveyor.yml

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

* Update appveyor.yml

* Update appveyor.yml

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

* Update appveyor.yml

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

* Update appveyor.yml

* Update appveyor.yml

* Update appveyor.yml

* Update appveyor.yml

* Update appveyor.yml

* Update appveyor.yml

* Update appveyor.yml

* Update appveyor.yml

* Update appveyor.yml

* sleep after restarting

* Update RemoteSshd.cs

* Fix tests

* Dispose ports

* Small improvements

* Fix build

* Small fixes

* Revert not related changes

* Test linux and windows

* fix

* test_script

* Use real commands

* Fixes

* fix?

* Add Appveyor TestLogger

* Fix linux tests

* Fix tests

* Try to fix tests

* Revert

* Give time before

* fix

* revert

* Give some time to process all messages after connect

* ForwardedPortDynamicTest_Stop_PortStarted_ChannelNotBound

* fix netsh

* trace

* Update appveyor.yml

* Update appveyor.yml

* etl2pcapng

* Update appveyor.yml

???

* Update appveyor.yml

* Update appveyor.yml

* Update appveyor.yml

* Update appveyor.yml

* come on !!

* Update appveyor.yml

* Fixes tests for linux

* Reverts

* Fix build

* Update TestMethodForPlatformAttribute.cs

* Update TestMethodForPlatformAttribute.cs

* Update appveyor.yml

* Issue #1253

* Install .NET SDK

* next try

* fix?

* try

* Finishing

* Fixes

* apt-get install dotnet-sdk-7.0

* Finish?

* Add environment APPVEYOR_BAKE_IMAGE

* Update test/Renci.SshNet.Tests/Classes/Connection/DirectConnectorTest_Connect_TimeoutConnectingToServer.cs

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

* Fix review

* Fix

* Update appveyor.yml

* Update appveyor.yml

* Delete .runsettings

---------

Co-authored-by: Rob Hague <rob.hague00@gmail.com>
Co-authored-by: Robert Hague <rh@johnstreetcapital.com>
Co-authored-by: Scott Xu <scott-xu@msn.com>
2023-11-30 19:19:00 +01:00
Wojciech Nagórski 54d01621aa Enable trace logging for Integration tests (#1242) 2023-11-16 08:58:22 +01:00
Rob Hague 5021f6d4bb Use System.Security.Cryptography in AesCipher (#1235)
* Use System.Security.Cryptography in AesCipher

* don't set the IV - it is unused by ECB

* Dispose ciphers in Session if applicable

---------

Co-authored-by: Wojciech Nagórski <wojtpl2@gmail.com>
2023-11-16 07:05:22 +01:00