diff --git a/SMBLibrary/Server/Enums/SMBDialect.cs b/SMBLibrary/Server/Enums/SMBDialect.cs
index b15a469..a69337a 100644
--- a/SMBLibrary/Server/Enums/SMBDialect.cs
+++ b/SMBLibrary/Server/Enums/SMBDialect.cs
@@ -7,5 +7,6 @@ namespace SMBLibrary.Server
NTLM012, // NT LM 0.12
SMB202, // SMB 2.0.2
SMB210, // SMB 2.1
+ SMB300, // SMB 3.0
}
}
diff --git a/SMBLibrary/Server/SMB2/NegotiateHelper.cs b/SMBLibrary/Server/SMB2/NegotiateHelper.cs
index 54a1a6e..d366176 100644
--- a/SMBLibrary/Server/SMB2/NegotiateHelper.cs
+++ b/SMBLibrary/Server/SMB2/NegotiateHelper.cs
@@ -73,10 +73,15 @@ namespace SMBLibrary.Server.SMB2
return response;
}
- internal static SMB2Command GetNegotiateResponse(NegotiateRequest request, GSSProvider securityProvider, ConnectionState state, SMBTransportType transportType, Guid serverGuid, DateTime serverStartTime)
+ internal static SMB2Command GetNegotiateResponse(NegotiateRequest request, GSSProvider securityProvider, ConnectionState state, SMBTransportType transportType, Guid serverGuid, DateTime serverStartTime, bool enableSMB3)
{
NegotiateResponse response = new NegotiateResponse();
- if (request.Dialects.Contains(SMB2Dialect.SMB210))
+ if (enableSMB3 && request.Dialects.Contains(SMB2Dialect.SMB300))
+ {
+ state.Dialect = SMBDialect.SMB300;
+ response.DialectRevision = SMB2Dialect.SMB300;
+ }
+ else if (request.Dialects.Contains(SMB2Dialect.SMB210))
{
state.Dialect = SMBDialect.SMB210;
response.DialectRevision = SMB2Dialect.SMB210;
diff --git a/SMBLibrary/Server/SMBServer.SMB2.cs b/SMBLibrary/Server/SMBServer.SMB2.cs
index 65671ec..babd50d 100644
--- a/SMBLibrary/Server/SMBServer.SMB2.cs
+++ b/SMBLibrary/Server/SMBServer.SMB2.cs
@@ -83,7 +83,7 @@ namespace SMBLibrary.Server
if (command is NegotiateRequest)
{
NegotiateRequest request = (NegotiateRequest)command;
- SMB2Command response = NegotiateHelper.GetNegotiateResponse(request, m_securityProvider, state, m_transport, m_serverGuid, m_serverStartTime);
+ SMB2Command response = NegotiateHelper.GetNegotiateResponse(request, m_securityProvider, state, m_transport, m_serverGuid, m_serverStartTime, m_enableSMB3);
if (state.Dialect != SMBDialect.NotSet)
{
state = new SMB2ConnectionState(state);
@@ -260,6 +260,8 @@ namespace SMBLibrary.Server
return SMB2Dialect.SMB202;
case SMBDialect.SMB210:
return SMB2Dialect.SMB210;
+ case SMBDialect.SMB300:
+ return SMB2Dialect.SMB300;
default:
throw new ArgumentException("Unsupported SMB2 Dialect: " + smbDialect.ToString());
}
diff --git a/SMBLibrary/Server/SMBServer.cs b/SMBLibrary/Server/SMBServer.cs
index 41bfe24..c85a266 100644
--- a/SMBLibrary/Server/SMBServer.cs
+++ b/SMBLibrary/Server/SMBServer.cs
@@ -38,6 +38,7 @@ namespace SMBLibrary.Server
private SMBTransportType m_transport;
private bool m_enableSMB1;
private bool m_enableSMB2;
+ private bool m_enableSMB3;
private Socket m_listenerSocket;
private bool m_listening;
private DateTime m_serverStartTime;
@@ -61,7 +62,12 @@ namespace SMBLibrary.Server
public void Start(IPAddress serverAddress, SMBTransportType transport, bool enableSMB1, bool enableSMB2)
{
- Start(serverAddress, transport, enableSMB1, enableSMB2, null);
+ Start(serverAddress, transport, enableSMB1, enableSMB2, false);
+ }
+
+ public void Start(IPAddress serverAddress, SMBTransportType transport, bool enableSMB1, bool enableSMB2, bool enableSMB3)
+ {
+ Start(serverAddress, transport, enableSMB1, enableSMB2, enableSMB3, null);
}
///
@@ -70,15 +76,21 @@ namespace SMBLibrary.Server
/// to prevent such connections from hanging around indefinitely, this parameter can be used.
///
///
- public void Start(IPAddress serverAddress, SMBTransportType transport, bool enableSMB1, bool enableSMB2, TimeSpan? connectionInactivityTimeout)
+ public void Start(IPAddress serverAddress, SMBTransportType transport, bool enableSMB1, bool enableSMB2, bool enableSMB3, TimeSpan? connectionInactivityTimeout)
{
if (!m_listening)
{
+ if (enableSMB3 && !enableSMB2)
+ {
+ throw new ArgumentException("SMB2 must be enabled for SMB3 to be enabled");
+ }
+
Log(Severity.Information, "Starting server");
m_serverAddress = serverAddress;
m_transport = transport;
m_enableSMB1 = enableSMB1;
m_enableSMB2 = enableSMB2;
+ m_enableSMB3 = enableSMB3;
m_listening = true;
m_serverStartTime = DateTime.Now;
@@ -290,7 +302,7 @@ namespace SMBLibrary.Server
// Note: To be compatible with SMB2 specifications, we must accept SMB_COM_NEGOTIATE.
// We will disconnect the connection if m_enableSMB1 == false and the client does not support SMB2.
bool acceptSMB1 = (state.Dialect == SMBDialect.NotSet || state.Dialect == SMBDialect.NTLM012);
- bool acceptSMB2 = (m_enableSMB2 && (state.Dialect == SMBDialect.NotSet || state.Dialect == SMBDialect.SMB202 || state.Dialect == SMBDialect.SMB210));
+ bool acceptSMB2 = (m_enableSMB2 && (state.Dialect == SMBDialect.NotSet || state.Dialect == SMBDialect.SMB202 || state.Dialect == SMBDialect.SMB210 || state.Dialect == SMBDialect.SMB300));
if (SMB1Header.IsValidSMB1Header(packet.Trailer))
{