diff --git a/SMBLibrary/Server/ConnectionState/SMB1ConnectionState.cs b/SMBLibrary/Server/ConnectionState/SMB1ConnectionState.cs
index b73cd14..5f4c73e 100644
--- a/SMBLibrary/Server/ConnectionState/SMB1ConnectionState.cs
+++ b/SMBLibrary/Server/ConnectionState/SMB1ConnectionState.cs
@@ -52,20 +52,20 @@ namespace SMBLibrary.Server
return null;
}
- public SMB1Session CreateSession(ushort userID, string userName, string machineName, object accessToken)
+ public SMB1Session CreateSession(ushort userID, string userName, string machineName, byte[] sessionKey, object accessToken)
{
- SMB1Session session = new SMB1Session(this, userID, userName, machineName, accessToken);
+ SMB1Session session = new SMB1Session(this, userID, userName, machineName, sessionKey, accessToken);
m_sessions.Add(userID, session);
return session;
}
/// null if all UserID values have already been allocated
- public SMB1Session CreateSession(string userName, string machineName, object accessToken)
+ public SMB1Session CreateSession(string userName, string machineName, byte[] sessionKey, object accessToken)
{
ushort? userID = AllocateUserID();
if (userID.HasValue)
{
- return CreateSession(userID.Value, userName, machineName, accessToken);
+ return CreateSession(userID.Value, userName, machineName, sessionKey, accessToken);
}
return null;
}
diff --git a/SMBLibrary/Server/ConnectionState/SMB1Session.cs b/SMBLibrary/Server/ConnectionState/SMB1Session.cs
index 4650d72..c57b33b 100644
--- a/SMBLibrary/Server/ConnectionState/SMB1Session.cs
+++ b/SMBLibrary/Server/ConnectionState/SMB1Session.cs
@@ -17,6 +17,7 @@ namespace SMBLibrary.Server
private SMB1ConnectionState m_connection;
private ushort m_userID;
+ private byte[] m_sessionKey;
private SecurityContext m_securityContext;
// Key is TID
@@ -29,10 +30,11 @@ namespace SMBLibrary.Server
private Dictionary m_openSearches = new Dictionary();
private ushort m_nextSearchHandle = 1;
- public SMB1Session(SMB1ConnectionState connection, ushort userID, string userName, string machineName, object accessToken)
+ public SMB1Session(SMB1ConnectionState connection, ushort userID, string userName, string machineName, byte[] sessionKey, object accessToken)
{
m_connection = connection;
m_userID = userID;
+ m_sessionKey = sessionKey;
m_securityContext = new SecurityContext(userName, machineName, connection.ClientEndPoint, connection.AuthenticationContext, accessToken);
}
diff --git a/SMBLibrary/Server/SMB1/SessionSetupHelper.cs b/SMBLibrary/Server/SMB1/SessionSetupHelper.cs
index b1770f0..a514eca 100644
--- a/SMBLibrary/Server/SMB1/SessionSetupHelper.cs
+++ b/SMBLibrary/Server/SMB1/SessionSetupHelper.cs
@@ -33,18 +33,19 @@ namespace SMBLibrary.Server.SMB1
return new ErrorResponse(request.CommandName);
}
+ byte[] sessionKey = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.SessionKey) as byte[];
object accessToken = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.AccessToken);
bool? isGuest = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.IsGuest) as bool?;
SMB1Session session;
if (!isGuest.HasValue || !isGuest.Value)
{
state.LogToServer(Severity.Information, "User '{0}' authenticated successfully.", message.UserName);
- session = state.CreateSession(message.UserName, message.WorkStation, accessToken);
+ session = state.CreateSession(message.UserName, message.WorkStation, sessionKey, accessToken);
}
else
{
state.LogToServer(Severity.Information, "User '{0}' failed authentication, logged in as guest.", message.UserName);
- session = state.CreateSession("Guest", message.WorkStation, accessToken);
+ session = state.CreateSession("Guest", message.WorkStation, sessionKey, accessToken);
response.Action = SessionSetupAction.SetupGuest;
}
@@ -110,17 +111,18 @@ namespace SMBLibrary.Server.SMB1
{
string userName = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.UserName) as string;
string machineName = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.MachineName) as string;
+ byte[] sessionKey = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.SessionKey) as byte[];
object accessToken = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.AccessToken);
bool? isGuest = securityProvider.GetContextAttribute(state.AuthenticationContext, GSSAttributeName.IsGuest) as bool?;
if (!isGuest.HasValue || !isGuest.Value)
{
state.LogToServer(Severity.Information, "User '{0}' authenticated successfully.", userName);
- state.CreateSession(header.UID, userName, machineName, accessToken);
+ state.CreateSession(header.UID, userName, machineName, sessionKey, accessToken);
}
else
{
state.LogToServer(Severity.Information, "User '{0}' failed authentication, logged in as guest.", userName);
- state.CreateSession(header.UID, "Guest", machineName, accessToken);
+ state.CreateSession(header.UID, "Guest", machineName, sessionKey, accessToken);
response.Action = SessionSetupAction.SetupGuest;
}
}