internal static SMB2Command GetNegotiateResponse(NegotiateRequest request, GSSProvider securityProvider, ConnectionState state, Guid serverGuid, DateTime serverStartTime) { NegotiateResponse response = new NegotiateResponse(); if (request.Dialects.Contains(SMB2Dialect.SMB210)) { state.Dialect = SMBDialect.SMB210; response.DialectRevision = SMB2Dialect.SMB210; } else if (request.Dialects.Contains(SMB2Dialect.SMB202)) { state.Dialect = SMBDialect.SMB202; response.DialectRevision = SMB2Dialect.SMB202; } else { return(new ErrorResponse(request.CommandName, NTStatus.STATUS_NOT_SUPPORTED)); } response.SecurityMode = SecurityMode.SigningEnabled; response.ServerGuid = serverGuid; response.MaxTransactSize = 65536; response.MaxReadSize = 65536; response.MaxWriteSize = 65536; response.SystemTime = DateTime.Now; response.ServerStartTime = serverStartTime; response.SecurityBuffer = securityProvider.GetSPNEGOTokenInitBytes(); return(response); }
// Special case - SMB2 client initially connecting using SMB1 internal static SMB2Command GetNegotiateResponse(List <string> smb2Dialects, GSSProvider securityProvider, ConnectionState state, Guid serverGuid, DateTime serverStartTime) { NegotiateResponse response = new NegotiateResponse(); response.Header.Credits = 1; if (smb2Dialects.Contains(SMB2xxxDialect)) { response.DialectRevision = SMB2Dialect.SMB2xx; } else if (smb2Dialects.Contains(SMB2002Dialect)) { state.Dialect = SMBDialect.SMB202; response.DialectRevision = SMB2Dialect.SMB202; } else { throw new ArgumentException("SMB2 dialect is not present"); } response.SecurityMode = SecurityMode.SigningEnabled; response.ServerGuid = serverGuid; response.MaxTransactSize = 65536; response.MaxReadSize = 65536; response.MaxWriteSize = 65536; response.SystemTime = DateTime.Now; response.ServerStartTime = serverStartTime; response.SecurityBuffer = securityProvider.GetSPNEGOTokenInitBytes(); return(response); }
internal static SMB2Command GetNegotiateResponse(NegotiateRequest request, GSSProvider securityProvider, ConnectionState state, SMBTransportType transportType, Guid serverGuid, DateTime serverStartTime, bool enableSMB3) { NegotiateResponse response = new NegotiateResponse(); 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; } else if (request.Dialects.Contains(SMB2Dialect.SMB202)) { state.Dialect = SMBDialect.SMB202; response.DialectRevision = SMB2Dialect.SMB202; } else { state.LogToServer(Severity.Verbose, "Negotiate failure: None of the requested SMB2 dialects is supported"); return(new ErrorResponse(request.CommandName, NTStatus.STATUS_NOT_SUPPORTED)); } response.SecurityMode = SecurityMode.SigningEnabled; response.ServerGuid = serverGuid; if (state.Dialect != SMBDialect.SMB202 && transportType == SMBTransportType.DirectTCPTransport) { response.Capabilities = Capabilities.LargeMTU; response.MaxTransactSize = ServerMaxTransactSizeLargeMTU; response.MaxReadSize = ServerMaxReadSizeLargeMTU; response.MaxWriteSize = ServerMaxWriteSizeLargeMTU; // [MS-SMB2] 3.3.5.2 Receiving Any Message - If the length of the message exceeds Connection.MaxTransactSize + 256, the server MUST disconnect the connection. int maxPacketSize = SessionPacket.HeaderLength + (int)ServerMaxTransactSizeLargeMTU + 256; if (maxPacketSize > state.ReceiveBuffer.Buffer.Length) { state.ReceiveBuffer.IncreaseBufferSize(maxPacketSize); } } else { response.MaxTransactSize = ServerMaxTransactSize; response.MaxReadSize = ServerMaxReadSize; response.MaxWriteSize = ServerMaxWriteSize; } response.SystemTime = DateTime.Now; response.ServerStartTime = serverStartTime; response.SecurityBuffer = securityProvider.GetSPNEGOTokenInitBytes(); return(response); }
// Special case - SMB2 client initially connecting using SMB1 internal static SMB2Command GetNegotiateResponse(List <string> smb2Dialects, GSSProvider securityProvider, ConnectionState state, SMBTransportType transportType, Guid serverGuid, DateTime serverStartTime) { NegotiateResponse response = new NegotiateResponse(); response.Header.Credits = 1; if (smb2Dialects.Contains(SMB2xxxDialect)) { response.DialectRevision = SMB2Dialect.SMB2xx; } else if (smb2Dialects.Contains(SMB2002Dialect)) { state.Dialect = SMBDialect.SMB202; response.DialectRevision = SMB2Dialect.SMB202; } else { throw new ArgumentException("SMB2 dialect is not present"); } response.SecurityMode = SecurityMode.SigningEnabled; response.ServerGuid = serverGuid; if (state.Dialect != SMBDialect.SMB202 && transportType == SMBTransportType.DirectTCPTransport) { response.Capabilities = Capabilities.LargeMTU; response.MaxTransactSize = ServerMaxTransactSizeLargeMTU; response.MaxReadSize = ServerMaxReadSizeLargeMTU; response.MaxWriteSize = ServerMaxWriteSizeLargeMTU; // [MS-SMB2] 3.3.5.2 Receiving Any Message - If the length of the message exceeds Connection.MaxTransactSize + 256, the server MUST disconnect the connection. int maxPacketSize = SessionPacket.HeaderLength + (int)ServerMaxTransactSizeLargeMTU + 256; if (maxPacketSize > state.ReceiveBuffer.Buffer.Length) { state.ReceiveBuffer.IncreaseBufferSize(maxPacketSize); } } else { response.MaxTransactSize = ServerMaxTransactSize; response.MaxReadSize = ServerMaxReadSize; response.MaxWriteSize = ServerMaxWriteSize; } response.SystemTime = DateTime.Now; response.ServerStartTime = serverStartTime; response.SecurityBuffer = securityProvider.GetSPNEGOTokenInitBytes(); return(response); }