diff --git a/src/Renci.SshNet/Messages/Authentication/BannerMessage.cs b/src/Renci.SshNet/Messages/Authentication/BannerMessage.cs
index 90652a34f..15f46386b 100644
--- a/src/Renci.SshNet/Messages/Authentication/BannerMessage.cs
+++ b/src/Renci.SshNet/Messages/Authentication/BannerMessage.cs
@@ -3,12 +3,29 @@
///
/// Represents SSH_MSG_USERAUTH_BANNER message.
///
- [Message("SSH_MSG_USERAUTH_BANNER", 53)]
public class BannerMessage : Message
{
private byte[] _message;
private byte[] _language;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_USERAUTH_BANNER";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 53;
+ }
+ }
+
///
/// Gets banner message.
///
diff --git a/src/Renci.SshNet/Messages/Authentication/FailureMessage.cs b/src/Renci.SshNet/Messages/Authentication/FailureMessage.cs
index f02705ecb..1904fa1de 100644
--- a/src/Renci.SshNet/Messages/Authentication/FailureMessage.cs
+++ b/src/Renci.SshNet/Messages/Authentication/FailureMessage.cs
@@ -5,9 +5,26 @@ namespace Renci.SshNet.Messages.Authentication
///
/// Represents SSH_MSG_USERAUTH_FAILURE message.
///
- [Message("SSH_MSG_USERAUTH_FAILURE", 51)]
public class FailureMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_USERAUTH_FAILURE";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 51;
+ }
+ }
+
///
/// Gets or sets the allowed authentications if available.
///
diff --git a/src/Renci.SshNet/Messages/Authentication/InformationRequestMessage.cs b/src/Renci.SshNet/Messages/Authentication/InformationRequestMessage.cs
index 7110222ac..9a45bcf2b 100644
--- a/src/Renci.SshNet/Messages/Authentication/InformationRequestMessage.cs
+++ b/src/Renci.SshNet/Messages/Authentication/InformationRequestMessage.cs
@@ -8,9 +8,26 @@ namespace Renci.SshNet.Messages.Authentication
///
/// Represents SSH_MSG_USERAUTH_INFO_REQUEST message.
///
- [Message("SSH_MSG_USERAUTH_INFO_REQUEST", 60)]
internal sealed class InformationRequestMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_USERAUTH_INFO_REQUEST";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 60;
+ }
+ }
+
///
/// Gets information request name.
///
diff --git a/src/Renci.SshNet/Messages/Authentication/InformationResponseMessage.cs b/src/Renci.SshNet/Messages/Authentication/InformationResponseMessage.cs
index 9e3227342..27e4fe65b 100644
--- a/src/Renci.SshNet/Messages/Authentication/InformationResponseMessage.cs
+++ b/src/Renci.SshNet/Messages/Authentication/InformationResponseMessage.cs
@@ -6,9 +6,26 @@ namespace Renci.SshNet.Messages.Authentication
///
/// Represents SSH_MSG_USERAUTH_INFO_RESPONSE message.
///
- [Message("SSH_MSG_USERAUTH_INFO_RESPONSE", 61)]
internal sealed class InformationResponseMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_USERAUTH_INFO_RESPONSE";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 61;
+ }
+ }
+
///
/// Gets authentication responses.
///
diff --git a/src/Renci.SshNet/Messages/Authentication/PasswordChangeRequiredMessage.cs b/src/Renci.SshNet/Messages/Authentication/PasswordChangeRequiredMessage.cs
index a87b53dfb..8cff4d1d7 100644
--- a/src/Renci.SshNet/Messages/Authentication/PasswordChangeRequiredMessage.cs
+++ b/src/Renci.SshNet/Messages/Authentication/PasswordChangeRequiredMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_USERAUTH_PASSWD_CHANGEREQ message.
///
- [Message("SSH_MSG_USERAUTH_PASSWD_CHANGEREQ", 60)]
internal sealed class PasswordChangeRequiredMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_USERAUTH_PASSWD_CHANGEREQ";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 60;
+ }
+ }
+
///
/// Gets password change request message as UTF-8 encoded byte array.
///
diff --git a/src/Renci.SshNet/Messages/Authentication/PublicKeyMessage.cs b/src/Renci.SshNet/Messages/Authentication/PublicKeyMessage.cs
index b917ab99a..491d1262c 100644
--- a/src/Renci.SshNet/Messages/Authentication/PublicKeyMessage.cs
+++ b/src/Renci.SshNet/Messages/Authentication/PublicKeyMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_USERAUTH_PK_OK message.
///
- [Message("SSH_MSG_USERAUTH_PK_OK", 60)]
internal sealed class PublicKeyMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_USERAUTH_PK_OK";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 60;
+ }
+ }
+
///
/// Gets the name of the public key algorithm as ASCII encoded byte array.
///
diff --git a/src/Renci.SshNet/Messages/Authentication/RequestMessage.cs b/src/Renci.SshNet/Messages/Authentication/RequestMessage.cs
index 57f60849f..58daa10fc 100644
--- a/src/Renci.SshNet/Messages/Authentication/RequestMessage.cs
+++ b/src/Renci.SshNet/Messages/Authentication/RequestMessage.cs
@@ -6,9 +6,26 @@ namespace Renci.SshNet.Messages.Authentication
///
/// Represents SSH_MSG_USERAUTH_REQUEST message. Server as a base message for other user authentication requests.
///
- [Message("SSH_MSG_USERAUTH_REQUEST", AuthenticationMessageCode)]
public abstract class RequestMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_USERAUTH_REQUEST";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return AuthenticationMessageCode;
+ }
+ }
+
///
/// Returns the authentication message code for SSH_MSG_USERAUTH_REQUEST.
///
diff --git a/src/Renci.SshNet/Messages/Authentication/SuccessMessage.cs b/src/Renci.SshNet/Messages/Authentication/SuccessMessage.cs
index e21544211..03ed4a9a0 100644
--- a/src/Renci.SshNet/Messages/Authentication/SuccessMessage.cs
+++ b/src/Renci.SshNet/Messages/Authentication/SuccessMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_USERAUTH_SUCCESS message.
///
- [Message("SSH_MSG_USERAUTH_SUCCESS", 52)]
public class SuccessMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_USERAUTH_SUCCESS";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 52;
+ }
+ }
+
///
/// Called when type specific data need to be loaded.
///
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelCloseMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelCloseMessage.cs
index dfb430134..c66294a79 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelCloseMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelCloseMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_CHANNEL_CLOSE message.
///
- [Message("SSH_MSG_CHANNEL_CLOSE", 97)]
public class ChannelCloseMessage : ChannelMessage
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_CLOSE";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 97;
+ }
+ }
+
///
/// Initializes a new instance of the class.
///
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelDataMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelDataMessage.cs
index 8a764d798..f387a7c36 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelDataMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelDataMessage.cs
@@ -5,10 +5,25 @@ namespace Renci.SshNet.Messages.Connection
///
/// Represents SSH_MSG_CHANNEL_DATA message.
///
- [Message("SSH_MSG_CHANNEL_DATA", MessageNumber)]
public class ChannelDataMessage : ChannelMessage
{
- internal const byte MessageNumber = 94;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_DATA";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 94;
+ }
+ }
///
/// Gets the message data.
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelEofMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelEofMessage.cs
index 0ad028242..1a7ca9bce 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelEofMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelEofMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_CHANNEL_EOF message.
///
- [Message("SSH_MSG_CHANNEL_EOF", 96)]
public class ChannelEofMessage : ChannelMessage
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_EOF";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 96;
+ }
+ }
+
///
/// Initializes a new instance of the class.
///
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelExtendedDataMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelExtendedDataMessage.cs
index 4546a7343..c3788ff3a 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelExtendedDataMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelExtendedDataMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_CHANNEL_EXTENDED_DATA message.
///
- [Message("SSH_MSG_CHANNEL_EXTENDED_DATA", 95)]
public class ChannelExtendedDataMessage : ChannelMessage
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_EXTENDED_DATA";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 95;
+ }
+ }
+
///
/// Gets message data type code.
///
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelFailureMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelFailureMessage.cs
index 5987534ca..a6b24d2da 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelFailureMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelFailureMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_CHANNEL_FAILURE message.
///
- [Message("SSH_MSG_CHANNEL_FAILURE", 100)]
public class ChannelFailureMessage : ChannelMessage
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_FAILURE";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 100;
+ }
+ }
+
///
/// Initializes a new instance of the class.
///
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelOpen/ChannelOpenMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelOpen/ChannelOpenMessage.cs
index 3a18bb22f..a45eda441 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelOpen/ChannelOpenMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelOpen/ChannelOpenMessage.cs
@@ -6,13 +6,28 @@ namespace Renci.SshNet.Messages.Connection
///
/// Represents SSH_MSG_CHANNEL_OPEN message.
///
- [Message("SSH_MSG_CHANNEL_OPEN", MessageNumber)]
public class ChannelOpenMessage : Message
{
- internal const byte MessageNumber = 90;
-
private byte[] _infoBytes;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_OPEN";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 90;
+ }
+ }
+
///
/// Gets the type of the channel as ASCII encoded byte array.
///
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelOpenConfirmationMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelOpenConfirmationMessage.cs
index 0213136df..ae6db2bf9 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelOpenConfirmationMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelOpenConfirmationMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_CHANNEL_OPEN_CONFIRMATION message.
///
- [Message("SSH_MSG_CHANNEL_OPEN_CONFIRMATION", 91)]
public class ChannelOpenConfirmationMessage : ChannelMessage
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_OPEN_CONFIRMATION";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 91;
+ }
+ }
+
///
/// Gets the remote channel number.
///
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelOpenFailureMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelOpenFailureMessage.cs
index 4488f9f5f..e68ab0358 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelOpenFailureMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelOpenFailureMessage.cs
@@ -3,7 +3,6 @@
///
/// Represents SSH_MSG_CHANNEL_OPEN_FAILURE message.
///
- [Message("SSH_MSG_CHANNEL_OPEN_FAILURE", 92)]
public class ChannelOpenFailureMessage : ChannelMessage
{
internal const uint AdministrativelyProhibited = 1;
@@ -14,6 +13,24 @@ public class ChannelOpenFailureMessage : ChannelMessage
private byte[] _description;
private byte[] _language;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_OPEN_FAILURE";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 92;
+ }
+ }
+
///
/// Gets failure reason code.
///
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelRequest/ChannelRequestMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelRequest/ChannelRequestMessage.cs
index fd9ad03b6..695c35b29 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelRequest/ChannelRequestMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelRequest/ChannelRequestMessage.cs
@@ -3,12 +3,29 @@
///
/// Represents SSH_MSG_CHANNEL_REQUEST message.
///
- [Message("SSH_MSG_CHANNEL_REQUEST", 98)]
public class ChannelRequestMessage : ChannelMessage
{
private string _requestName;
private byte[] _requestNameBytes;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_REQUEST";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 98;
+ }
+ }
+
///
/// Gets the name of the request.
///
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelSuccessMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelSuccessMessage.cs
index 50d302f21..c554f32e9 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelSuccessMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelSuccessMessage.cs
@@ -3,7 +3,6 @@
///
/// Represents SSH_MSG_CHANNEL_SUCCESS message.
///
- [Message("SSH_MSG_CHANNEL_SUCCESS", 99)]
public class ChannelSuccessMessage : ChannelMessage
{
///
@@ -22,6 +21,24 @@ public ChannelSuccessMessage(uint localChannelNumber)
{
}
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_SUCCESS";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 99;
+ }
+ }
+
internal override void Process(Session session)
{
session.OnChannelSuccessReceived(this);
diff --git a/src/Renci.SshNet/Messages/Connection/ChannelWindowAdjustMessage.cs b/src/Renci.SshNet/Messages/Connection/ChannelWindowAdjustMessage.cs
index 315c98c8a..3e6ad90d1 100644
--- a/src/Renci.SshNet/Messages/Connection/ChannelWindowAdjustMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/ChannelWindowAdjustMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_CHANNEL_SUCCESS message.
///
- [Message("SSH_MSG_CHANNEL_WINDOW_ADJUST", 93)]
public class ChannelWindowAdjustMessage : ChannelMessage
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_CHANNEL_WINDOW_ADJUST";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 93;
+ }
+ }
+
///
/// Gets number of bytes to add to the window.
///
diff --git a/src/Renci.SshNet/Messages/Connection/GlobalRequestMessage.cs b/src/Renci.SshNet/Messages/Connection/GlobalRequestMessage.cs
index 6e0ca3a21..d34778e54 100644
--- a/src/Renci.SshNet/Messages/Connection/GlobalRequestMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/GlobalRequestMessage.cs
@@ -3,11 +3,28 @@
///
/// Represents SSH_MSG_GLOBAL_REQUEST message.
///
- [Message("SSH_MSG_GLOBAL_REQUEST", 80)]
public class GlobalRequestMessage : Message
{
private byte[] _requestName;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_GLOBAL_REQUEST";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 80;
+ }
+ }
+
///
/// Gets the name of the request.
///
diff --git a/src/Renci.SshNet/Messages/Connection/RequestFailureMessage.cs b/src/Renci.SshNet/Messages/Connection/RequestFailureMessage.cs
index 553f95473..8602f5089 100644
--- a/src/Renci.SshNet/Messages/Connection/RequestFailureMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/RequestFailureMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_REQUEST_FAILURE message.
///
- [Message("SSH_MSG_REQUEST_FAILURE", 82)]
public class RequestFailureMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_REQUEST_FAILURE";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 82;
+ }
+ }
+
///
/// Called when type specific data need to be loaded.
///
diff --git a/src/Renci.SshNet/Messages/Connection/RequestSuccessMessage.cs b/src/Renci.SshNet/Messages/Connection/RequestSuccessMessage.cs
index 00ad1059d..68f5a2f84 100644
--- a/src/Renci.SshNet/Messages/Connection/RequestSuccessMessage.cs
+++ b/src/Renci.SshNet/Messages/Connection/RequestSuccessMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_REQUEST_SUCCESS message.
///
- [Message("SSH_MSG_REQUEST_SUCCESS", 81)]
public class RequestSuccessMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_REQUEST_SUCCESS";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 81;
+ }
+ }
+
///
/// Gets the bound port.
///
diff --git a/src/Renci.SshNet/Messages/Message.cs b/src/Renci.SshNet/Messages/Message.cs
index ebe3a2e71..eab59815d 100644
--- a/src/Renci.SshNet/Messages/Message.cs
+++ b/src/Renci.SshNet/Messages/Message.cs
@@ -1,5 +1,4 @@
-using System.Globalization;
-using System.IO;
+using System.IO;
using Renci.SshNet.Abstractions;
using Renci.SshNet.Common;
@@ -13,11 +12,16 @@ namespace Renci.SshNet.Messages
public abstract class Message : SshData
{
///
- /// Gets the size of the message in bytes.
+ /// Gets the message name as defined in RFC 4250.
///
- ///
- /// The size of the messages in bytes.
- ///
+ public abstract string MessageName { get; }
+
+ ///
+ /// Gets the message number as defined in RFC 4250.
+ ///
+ public abstract byte MessageNumber { get; }
+
+ ///
protected override int BufferCapacity
{
get
@@ -26,28 +30,11 @@ protected override int BufferCapacity
}
}
- ///
- /// Writes the message to the specified .
- ///
- /// The to write the message to.
+ ///
protected override void WriteBytes(SshDataStream stream)
{
- var enumerator = GetType().GetCustomAttributes(inherit: true).GetEnumerator();
- try
- {
- if (!enumerator.MoveNext())
- {
- throw new SshException(string.Format(CultureInfo.CurrentCulture, "Type '{0}' is not a valid message type.", GetType().AssemblyQualifiedName));
- }
-
- var messageAttribute = enumerator.Current;
- stream.WriteByte(messageAttribute.Number);
- base.WriteBytes(stream);
- }
- finally
- {
- enumerator.Dispose();
- }
+ stream.WriteByte(MessageNumber);
+ base.WriteBytes(stream);
}
internal byte[] GetPacket(byte paddingMultiplier, Compressor compressor)
@@ -163,23 +150,10 @@ private static byte GetPaddingLength(byte paddingMultiplier, long packetLength)
return paddingLength;
}
- ///
- /// Returns a that represents this instance.
- ///
- ///
- /// A that represents this instance.
- ///
+ ///
public override string ToString()
{
- using (var enumerator = GetType().GetCustomAttributes(inherit: true).GetEnumerator())
- {
- if (!enumerator.MoveNext())
- {
- return string.Format(CultureInfo.CurrentCulture, "'{0}' without Message attribute.", GetType().FullName);
- }
-
- return enumerator.Current.Name;
- }
+ return MessageName;
}
///
diff --git a/src/Renci.SshNet/Messages/MessageAttribute.cs b/src/Renci.SshNet/Messages/MessageAttribute.cs
deleted file mode 100644
index f94d13c32..000000000
--- a/src/Renci.SshNet/Messages/MessageAttribute.cs
+++ /dev/null
@@ -1,38 +0,0 @@
-using System;
-
-namespace Renci.SshNet.Messages
-{
- ///
- /// Indicates that a class represents SSH message. This class cannot be inherited.
- ///
- [AttributeUsage(AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
- public sealed class MessageAttribute : Attribute
- {
- ///
- /// Gets the message name as defined in RFC 4250.
- ///
- ///
- /// The name.
- ///
- public string Name { get; }
-
- ///
- /// Gets the message number as defined in RFC 4250.
- ///
- ///
- /// The number.
- ///
- public byte Number { get; }
-
- ///
- /// Initializes a new instance of the class.
- ///
- /// The name.
- /// The number.
- public MessageAttribute(string name, byte number)
- {
- Name = name;
- Number = number;
- }
- }
-}
diff --git a/src/Renci.SshNet/Messages/Transport/DebugMessage.cs b/src/Renci.SshNet/Messages/Transport/DebugMessage.cs
index f550d95fe..0331107d9 100644
--- a/src/Renci.SshNet/Messages/Transport/DebugMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/DebugMessage.cs
@@ -3,12 +3,29 @@
///
/// Represents SSH_MSG_DEBUG message.
///
- [Message("SSH_MSG_DEBUG", 4)]
public class DebugMessage : Message
{
private byte[] _message;
private byte[] _language;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_DEBUG";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 4;
+ }
+ }
+
///
/// Gets a value indicating whether the message to be always displayed.
///
diff --git a/src/Renci.SshNet/Messages/Transport/DisconnectMessage.cs b/src/Renci.SshNet/Messages/Transport/DisconnectMessage.cs
index b5f43adfc..88ad5a01a 100644
--- a/src/Renci.SshNet/Messages/Transport/DisconnectMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/DisconnectMessage.cs
@@ -3,12 +3,29 @@
///
/// Represents SSH_MSG_DISCONNECT message.
///
- [Message("SSH_MSG_DISCONNECT", 1)]
public class DisconnectMessage : Message, IKeyExchangedAllowed
{
private byte[] _description;
private byte[] _language;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_DISCONNECT";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 1;
+ }
+ }
+
///
/// Gets disconnect reason code.
///
diff --git a/src/Renci.SshNet/Messages/Transport/IgnoreMessage.cs b/src/Renci.SshNet/Messages/Transport/IgnoreMessage.cs
index d657d2d46..b71b28788 100644
--- a/src/Renci.SshNet/Messages/Transport/IgnoreMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/IgnoreMessage.cs
@@ -5,10 +5,25 @@ namespace Renci.SshNet.Messages.Transport
///
/// Represents SSH_MSG_IGNORE message.
///
- [Message("SSH_MSG_IGNORE", MessageNumber)]
public class IgnoreMessage : Message
{
- internal const byte MessageNumber = 2;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_IGNORE";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 2;
+ }
+ }
///
/// Gets ignore message data if this message has been initialised
diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeGroup.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeGroup.cs
index f1010a19d..a17c23e33 100644
--- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeGroup.cs
+++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeGroup.cs
@@ -5,14 +5,29 @@ namespace Renci.SshNet.Messages.Transport
///
/// Represents SSH_MSG_KEX_DH_GEX_GROUP message.
///
- [Message("SSH_MSG_KEX_DH_GEX_GROUP", MessageNumber)]
public class KeyExchangeDhGroupExchangeGroup : Message
{
- internal const byte MessageNumber = 31;
-
private byte[] _safePrime;
private byte[] _subGroup;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_KEX_DH_GEX_GROUP";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 31;
+ }
+ }
+
///
/// Gets the safe prime.
///
diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs
index 381c534b9..c63484739 100644
--- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs
+++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeInit.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_KEX_DH_GEX_INIT message.
///
- [Message("SSH_MSG_KEX_DH_GEX_INIT", 32)]
internal sealed class KeyExchangeDhGroupExchangeInit : Message, IKeyExchangedAllowed
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_KEX_DH_GEX_INIT";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 32;
+ }
+ }
+
///
/// Gets the E value.
///
diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs
index 7b446d962..090dd71ab 100644
--- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs
+++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeReply.cs
@@ -3,10 +3,25 @@
///
/// Represents SSH_MSG_KEX_DH_GEX_REPLY message.
///
- [Message("SSH_MSG_KEX_DH_GEX_REPLY", MessageNumber)]
internal sealed class KeyExchangeDhGroupExchangeReply : Message
{
- internal const byte MessageNumber = 33;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_KEX_DH_GEX_REPLY";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 33;
+ }
+ }
///
/// Gets server public host key and certificates.
diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeRequest.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeRequest.cs
index 9bb6c6bc8..1ad967c8e 100644
--- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeRequest.cs
+++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhGroupExchangeRequest.cs
@@ -3,10 +3,25 @@
///
/// Represents SSH_MSG_KEX_DH_GEX_REQUEST message.
///
- [Message("SSH_MSG_KEX_DH_GEX_REQUEST", MessageNumber)]
internal sealed class KeyExchangeDhGroupExchangeRequest : Message, IKeyExchangedAllowed
{
- internal const byte MessageNumber = 34;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_KEX_DH_GEX_REQUEST";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 34;
+ }
+ }
///
/// Gets the minimum size, in bits, of an acceptable group.
diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs
index 5b681d1b4..3ce030c8d 100644
--- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhInitMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_KEXDH_INIT message.
///
- [Message("SSH_MSG_KEXDH_INIT", 30)]
internal sealed class KeyExchangeDhInitMessage : Message, IKeyExchangedAllowed
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_KEXDH_INIT";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 30;
+ }
+ }
+
///
/// Gets the E value.
///
diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs
index 8f0a1489f..efc280183 100644
--- a/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeDhReplyMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_KEXDH_REPLY message.
///
- [Message("SSH_MSG_KEXDH_REPLY", 31)]
public class KeyExchangeDhReplyMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_KEXDH_REPLY";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 31;
+ }
+ }
+
///
/// Gets server public host key and certificates.
///
diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs
index 2d02d1480..ab5bc1c85 100644
--- a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhInitMessage.cs
@@ -6,9 +6,26 @@ namespace Renci.SshNet.Messages.Transport
///
/// Represents SSH_MSG_KEXECDH_INIT message.
///
- [Message("SSH_MSG_KEX_ECDH_INIT", 30)]
internal sealed class KeyExchangeEcdhInitMessage : Message, IKeyExchangedAllowed
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_KEX_ECDH_INIT";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 30;
+ }
+ }
+
///
/// Gets the client's ephemeral contribution to the ECDH exchange, encoded as an octet string.
///
diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs
index a5626aece..70ed96c00 100644
--- a/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeEcdhReplyMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_KEXECDH_REPLY message.
///
- [Message("SSH_MSG_KEX_ECDH_REPLY", 31)]
public class KeyExchangeEcdhReplyMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_KEX_ECDH_REPLY";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 31;
+ }
+ }
+
///
/// Gets a string encoding an X.509v3 certificate containing the server's ECDSA public host key.
///
diff --git a/src/Renci.SshNet/Messages/Transport/KeyExchangeInitMessage.cs b/src/Renci.SshNet/Messages/Transport/KeyExchangeInitMessage.cs
index 43bcd72bf..7bfce46dc 100644
--- a/src/Renci.SshNet/Messages/Transport/KeyExchangeInitMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/KeyExchangeInitMessage.cs
@@ -5,7 +5,6 @@ namespace Renci.SshNet.Messages.Transport
///
/// Represents SSH_MSG_KEXINIT message.
///
- [Message("SSH_MSG_KEXINIT", 20)]
public class KeyExchangeInitMessage : Message, IKeyExchangedAllowed
{
///
@@ -20,6 +19,24 @@ public KeyExchangeInitMessage()
#region Message Properties
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_KEXINIT";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 20;
+ }
+ }
+
///
/// Gets session cookie.
///
diff --git a/src/Renci.SshNet/Messages/Transport/NewKeysMessage.cs b/src/Renci.SshNet/Messages/Transport/NewKeysMessage.cs
index 838d4373b..ea0f6b754 100644
--- a/src/Renci.SshNet/Messages/Transport/NewKeysMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/NewKeysMessage.cs
@@ -3,9 +3,26 @@
///
/// Represents SSH_MSG_NEWKEYS message.
///
- [Message("SSH_MSG_NEWKEYS", 21)]
public class NewKeysMessage : Message, IKeyExchangedAllowed
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_NEWKEYS";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 21;
+ }
+ }
+
///
/// Called when type specific data need to be loaded.
///
diff --git a/src/Renci.SshNet/Messages/Transport/ServiceAcceptMessage.cs b/src/Renci.SshNet/Messages/Transport/ServiceAcceptMessage.cs
index a7c2a8c6f..ce16d9fd4 100644
--- a/src/Renci.SshNet/Messages/Transport/ServiceAcceptMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/ServiceAcceptMessage.cs
@@ -6,10 +6,25 @@ namespace Renci.SshNet.Messages.Transport
///
/// Represents SSH_MSG_SERVICE_ACCEPT message.
///
- [Message("SSH_MSG_SERVICE_ACCEPT", MessageNumber)]
public class ServiceAcceptMessage : Message
{
- internal const byte MessageNumber = 6;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_SERVICE_ACCEPT";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 6;
+ }
+ }
///
/// Gets the name of the service.
diff --git a/src/Renci.SshNet/Messages/Transport/ServiceRequestMessage.cs b/src/Renci.SshNet/Messages/Transport/ServiceRequestMessage.cs
index c41a4f904..c7b6a6cbf 100644
--- a/src/Renci.SshNet/Messages/Transport/ServiceRequestMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/ServiceRequestMessage.cs
@@ -6,11 +6,28 @@ namespace Renci.SshNet.Messages.Transport
///
/// Represents SSH_MSG_SERVICE_REQUEST message.
///
- [Message("SSH_MSG_SERVICE_REQUEST", 5)]
public class ServiceRequestMessage : Message
{
private readonly byte[] _serviceName;
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_SERVICE_REQUEST";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 5;
+ }
+ }
+
///
/// Gets the name of the service.
///
diff --git a/src/Renci.SshNet/Messages/Transport/UnimplementedMessage.cs b/src/Renci.SshNet/Messages/Transport/UnimplementedMessage.cs
index 323a01439..761156408 100644
--- a/src/Renci.SshNet/Messages/Transport/UnimplementedMessage.cs
+++ b/src/Renci.SshNet/Messages/Transport/UnimplementedMessage.cs
@@ -5,9 +5,26 @@ namespace Renci.SshNet.Messages.Transport
///
/// Represents SSH_MSG_UNIMPLEMENTED message.
///
- [Message("SSH_MSG_UNIMPLEMENTED", 3)]
public class UnimplementedMessage : Message
{
+ ///
+ public override string MessageName
+ {
+ get
+ {
+ return "SSH_MSG_UNIMPLEMENTED";
+ }
+ }
+
+ ///
+ public override byte MessageNumber
+ {
+ get
+ {
+ return 3;
+ }
+ }
+
///
/// Called when type specific data need to be loaded.
///
diff --git a/test/Renci.SshNet.Benchmarks/Messages/MessageBenchmarks.cs b/test/Renci.SshNet.Benchmarks/Messages/MessageBenchmarks.cs
new file mode 100644
index 000000000..5a15773e4
--- /dev/null
+++ b/test/Renci.SshNet.Benchmarks/Messages/MessageBenchmarks.cs
@@ -0,0 +1,35 @@
+using BenchmarkDotNet.Attributes;
+
+using Renci.SshNet.Common;
+using Renci.SshNet.Messages;
+using Renci.SshNet.Messages.Transport;
+
+namespace Renci.SshNet.Benchmarks.Messages
+{
+ [MemoryDiagnoser]
+ public class MessageBenchmarks
+ {
+ [Benchmark]
+ public Message WriteBytes()
+ {
+ using var sshDataStream = new SshDataStream(SshData.DefaultCapacity);
+ var bannerMessage = new WritableDisconnectMessage(DisconnectReason.ServiceNotAvailable, "Goodbye");
+ bannerMessage.WritePrivateBytes(sshDataStream);
+
+ return bannerMessage; // Avoid JIT elimination
+ }
+
+ private sealed class WritableDisconnectMessage : DisconnectMessage
+ {
+ public WritableDisconnectMessage(DisconnectReason reasonCode, string message)
+ : base(reasonCode, message)
+ {
+ }
+
+ public void WritePrivateBytes(SshDataStream sshDataStream)
+ {
+ WriteBytes(sshDataStream);
+ }
+ }
+ }
+}
diff --git a/test/Renci.SshNet.Benchmarks/Renci.SshNet.Benchmarks.csproj b/test/Renci.SshNet.Benchmarks/Renci.SshNet.Benchmarks.csproj
index eee47fcf7..e9e964377 100644
--- a/test/Renci.SshNet.Benchmarks/Renci.SshNet.Benchmarks.csproj
+++ b/test/Renci.SshNet.Benchmarks/Renci.SshNet.Benchmarks.csproj
@@ -1,4 +1,4 @@
-
+
Exe
net8.0
@@ -7,7 +7,7 @@
-
+
diff --git a/test/Renci.SshNet.IntegrationTests/Properties/AssemblyInfo.cs b/test/Renci.SshNet.IntegrationTests/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..a3ec2d895
--- /dev/null
+++ b/test/Renci.SshNet.IntegrationTests/Properties/AssemblyInfo.cs
@@ -0,0 +1,5 @@
+#if NET6_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+
+[assembly: ExcludeFromCodeCoverage]
+#endif // NET6_0_OR_GREATER
diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelDataMessageTest.cs b/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelDataMessageTest.cs
index fbc5e1b46..31002433b 100644
--- a/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelDataMessageTest.cs
+++ b/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelDataMessageTest.cs
@@ -116,7 +116,7 @@ public void GetBytes()
var sshDataStream = new SshDataStream(bytes);
- Assert.AreEqual(ChannelDataMessage.MessageNumber, sshDataStream.ReadByte());
+ Assert.AreEqual(target.MessageNumber, sshDataStream.ReadByte());
Assert.AreEqual(localChannelNumber, sshDataStream.ReadUInt32());
Assert.AreEqual((uint) size, sshDataStream.ReadUInt32());
diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelOpen/ChannelOpenMessageTest.cs b/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelOpen/ChannelOpenMessageTest.cs
index 1a40d8609..d53568a83 100644
--- a/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelOpen/ChannelOpenMessageTest.cs
+++ b/test/Renci.SshNet.Tests/Classes/Messages/Connection/ChannelOpen/ChannelOpenMessageTest.cs
@@ -94,7 +94,7 @@ public void GetBytes()
var sshDataStream = new SshDataStream(bytes);
- Assert.AreEqual(ChannelOpenMessage.MessageNumber, sshDataStream.ReadByte());
+ Assert.AreEqual(target.MessageNumber, sshDataStream.ReadByte());
var actualChannelTypeLength = sshDataStream.ReadUInt32();
Assert.AreEqual((uint) target.ChannelType.Length, actualChannelTypeLength);
@@ -225,16 +225,16 @@ public void Load_ShouldThrowNotSupportedExceptionWhenChannelTypeIsNotSupported()
var maximumPacketSize = (uint)_random.Next(0, int.MaxValue);
var channelName = "dunno_" + _random.Next().ToString(CultureInfo.InvariantCulture);
var channelType = _ascii.GetBytes(channelName);
+ var target = new ChannelOpenMessage();
var sshDataStream = new SshDataStream(1 + 4 + channelType.Length + 4 + 4 + 4);
- sshDataStream.WriteByte(ChannelOpenMessage.MessageNumber);
+ sshDataStream.WriteByte(target.MessageNumber);
sshDataStream.Write((uint) channelType.Length);
sshDataStream.Write(channelType, 0, channelType.Length);
sshDataStream.Write(localChannelNumber);
sshDataStream.Write(initialWindowSize);
sshDataStream.Write(maximumPacketSize);
var bytes = sshDataStream.ToArray();
- var target = new ChannelOpenMessage();
try
{
diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Transport/IgnoreMessageTest.cs b/test/Renci.SshNet.Tests/Classes/Messages/Transport/IgnoreMessageTest.cs
index ecdbf3310..ff8fd86dc 100644
--- a/test/Renci.SshNet.Tests/Classes/Messages/Transport/IgnoreMessageTest.cs
+++ b/test/Renci.SshNet.Tests/Classes/Messages/Transport/IgnoreMessageTest.cs
@@ -68,7 +68,7 @@ public void GetBytes()
var sshDataStream = new SshDataStream(bytes);
- Assert.AreEqual(IgnoreMessage.MessageNumber, sshDataStream.ReadByte());
+ Assert.AreEqual(request.MessageNumber, sshDataStream.ReadByte());
Assert.AreEqual((uint) _data.Length, sshDataStream.ReadUInt32());
var actualData = new byte[_data.Length];
diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeGroupBuilder.cs b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeGroupBuilder.cs
index 4e71bbec4..c2dfe026b 100644
--- a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeGroupBuilder.cs
+++ b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeGroupBuilder.cs
@@ -23,7 +23,8 @@ public KeyExchangeDhGroupExchangeGroupBuilder WithSubGroup(BigInteger subGroup)
public byte[] Build()
{
var sshDataStream = new SshDataStream(0);
- sshDataStream.WriteByte(KeyExchangeDhGroupExchangeGroup.MessageNumber);
+ var target = new KeyExchangeDhGroupExchangeGroup();
+ sshDataStream.WriteByte(target.MessageNumber);
sshDataStream.Write(_safePrime);
sshDataStream.Write(_subGroup);
return sshDataStream.ToArray();
diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyBuilder.cs b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyBuilder.cs
index 81714f368..f257e6de3 100644
--- a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyBuilder.cs
+++ b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeReplyBuilder.cs
@@ -41,7 +41,8 @@ public KeyExchangeDhGroupExchangeReplyBuilder WithSignature(byte[] signature)
public byte[] Build()
{
var sshDataStream = new SshDataStream(0);
- sshDataStream.WriteByte(KeyExchangeDhGroupExchangeReply.MessageNumber);
+ var target = new KeyExchangeDhGroupExchangeReply();
+ sshDataStream.WriteByte(target.MessageNumber);
sshDataStream.Write((uint)(4 + _hostKeyAlgorithm.Length + _hostKeys.Length));
sshDataStream.Write((uint) _hostKeyAlgorithm.Length);
sshDataStream.Write(_hostKeyAlgorithm, 0, _hostKeyAlgorithm.Length);
diff --git a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeRequestTest.cs b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeRequestTest.cs
index 0120c5550..da1d04976 100644
--- a/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeRequestTest.cs
+++ b/test/Renci.SshNet.Tests/Classes/Messages/Transport/KeyExchangeDhGroupExchangeRequestTest.cs
@@ -46,7 +46,7 @@ public void Test_KeyExchangeDhGroupExchangeRequest_GetBytes()
var sshDataStream = new SshDataStream(bytes);
- Assert.AreEqual(KeyExchangeDhGroupExchangeRequest.MessageNumber, sshDataStream.ReadByte());
+ Assert.AreEqual(request.MessageNumber, sshDataStream.ReadByte());
Assert.AreEqual(_minimum, sshDataStream.ReadUInt32());
Assert.AreEqual(_preferred, sshDataStream.ReadUInt32());
Assert.AreEqual(_maximum, sshDataStream.ReadUInt32());
diff --git a/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs b/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs
index 3c1c2fdcf..7fa1ac24e 100644
--- a/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs
+++ b/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs
@@ -244,11 +244,12 @@ public static ServiceAcceptMessageBuilder Create(ServiceName serviceName)
public byte[] Build()
{
var serviceName = _serviceName.ToArray();
+ var target = new ServiceAcceptMessage();
var sshDataStream = new SshDataStream(4 + 1 + 1 + 4 + serviceName.Length);
sshDataStream.Write((uint)(sshDataStream.Capacity - 4)); // packet length
sshDataStream.WriteByte(0); // padding length
- sshDataStream.WriteByte(ServiceAcceptMessage.MessageNumber);
+ sshDataStream.WriteByte(target.MessageNumber);
sshDataStream.WriteBinary(serviceName);
return sshDataStream.ToArray();
}
diff --git a/test/Renci.SshNet.Tests/Classes/SessionTest_Connected_ServerAndClientDisconnectRace.cs b/test/Renci.SshNet.Tests/Classes/SessionTest_Connected_ServerAndClientDisconnectRace.cs
index b565fe1fb..96797d727 100644
--- a/test/Renci.SshNet.Tests/Classes/SessionTest_Connected_ServerAndClientDisconnectRace.cs
+++ b/test/Renci.SshNet.Tests/Classes/SessionTest_Connected_ServerAndClientDisconnectRace.cs
@@ -222,11 +222,12 @@ public static ServiceAcceptMessageBuilder Create(ServiceName serviceName)
public byte[] Build()
{
var serviceName = _serviceName.ToArray();
+ var target = new ServiceAcceptMessage();
var sshDataStream = new SshDataStream(4 + 1 + 1 + 4 + serviceName.Length);
sshDataStream.Write((uint)(sshDataStream.Capacity - 4)); // packet length
sshDataStream.WriteByte(0); // padding length
- sshDataStream.WriteByte(ServiceAcceptMessage.MessageNumber);
+ sshDataStream.WriteByte(target.MessageNumber);
sshDataStream.WriteBinary(serviceName);
return sshDataStream.ToArray();
}
diff --git a/test/Renci.SshNet.Tests/Properties/AssemblyInfo.cs b/test/Renci.SshNet.Tests/Properties/AssemblyInfo.cs
new file mode 100644
index 000000000..a3ec2d895
--- /dev/null
+++ b/test/Renci.SshNet.Tests/Properties/AssemblyInfo.cs
@@ -0,0 +1,5 @@
+#if NET6_0_OR_GREATER
+using System.Diagnostics.CodeAnalysis;
+
+[assembly: ExcludeFromCodeCoverage]
+#endif // NET6_0_OR_GREATER