using System;

namespace S22.Sasl.Mechanisms.Ntlm {
	/// <summary>
	/// The NTLM flags which are contained in a bitfield within the header of
	/// an NTLM message.
	/// </summary>
	[Flags]
	internal enum Flags {
		/// <summary>
		/// Indicates that Unicode strings are supported for use in security
		/// buffer data.
		/// </summary>
		NegotiateUnicode = 0x00000001,
		/// <summary>
		/// Indicates that OEM strings are supported for use in security
		/// buffer data.
		/// </summary>
		NegotiateOEM = 0x00000002,
		/// <summary>
		/// Requests that the server's authentication realm be included in
		/// the Type 2 message.
		/// </summary>
		RequestTarget = 0x00000004,
		/// <summary>
		/// Specifies that authenticated communication between the client and
		/// server should carry a digital signature (message integrity).
		/// </summary>
		NegotiateSign = 0x00000010,
		/// <summary>
		/// Specifies that authenticated communication between the client and
		/// server should be encrypted (message confidentiality).
		/// </summary>
		NegotiateSeal = 0x00000020,
		/// <summary>
		/// Indicates that datagram authentication is being used.
		/// </summary>
		NegotiateDatagramStyle = 0x00000040,
		/// <summary>
		/// Indicates that the Lan Manager Session Key should be used for signing
		/// and sealing authenticated communications.
		/// </summary>
		NegotiateLanManagerKey = 0x00000080,
		/// <summary>
		/// This flag's usage has not been identified.
		/// </summary>
		NegotiateNetware = 0x00000100,
		/// <summary>
		/// Indicates that NTLM authentication is being used.
		/// </summary>
		NegotiateNTLM = 0x00000200,
		/// <summary>
		/// Sent by the client in the Type 3 message to indicate that an anonymous
		/// context has been established. This also affects the response fields.
		/// </summary>
		NegotiateAnonymous = 0x00000800,
		/// <summary>
		/// Sent by the client in the Type 1 message to indicate that the name of
		/// the domain in which the client workstation has membership is included
		/// in the message. This is used by the server to determine whether the
		/// client is eligible for local authentication.
		/// </summary>
		NegotiateDomainSupplied = 0x00001000,
		/// <summary>
		/// Sent by the client in the Type 1 message to indicate that the client
		/// workstation's name is included in the message. This is used by the
		/// server to determine whether the client is eligible for local
		/// authentication.
		/// </summary>
		NegotiateWorkstationSupplied = 0x00002000,
		/// <summary>
		/// Sent by the server to indicate that the server and client are on the
		/// same machine. Implies that the client may use the established local
		/// credentials for authentication instead of calculating a response to
		/// the challenge.
		/// </summary>
		NegotiateLocalCall = 0x00004000,
		/// <summary>
		/// Indicates that authenticated communication between the client and
		/// server should be signed with a "dummy" signature.
		/// </summary>
		NegotiateAlwaysSign = 0x00008000,
		/// <summary>
		/// Sent by the server in the Type 2 message to indicate that the target
		/// authentication realm is a domain.
		/// </summary>
		TargetTypeDomain = 0x00010000,
		/// <summary>
		/// Sent by the server in the Type 2 message to indicate that the target
		/// authentication realm is a server.
		/// </summary>
		TargetTypeServer = 0x00020000,
		/// <summary>
		/// Sent by the server in the Type 2 message to indicate that the target
		/// authentication realm is a share. Presumably, this is for share-level
		/// authentication. Usage is unclear.
		/// </summary>
		TargetTypeShare = 0x00040000,
		/// <summary>
		/// Indicates that the NTLM2 signing and sealing scheme should be used for
		/// protecting authenticated communications. Note that this refers to a
		/// particular session security scheme, and is not related to the use of
		/// NTLMv2 authentication. This flag can, however, have an effect on the
		/// response calculations.
		/// </summary>
		NegotiateNTLM2Key = 0x00080000,
		/// <summary>
		/// This flag's usage has not been identified.
		/// </summary>
		RequestInitResponse = 0x00100000,
		/// <summary>
		/// This flag's usage has not been identified.
		/// </summary>
		RequestAcceptResponse = 0x00200000,
		/// <summary>
		/// This flag's usage has not been identified.
		/// </summary>
		RequestNonNTSessionKey = 0x00400000,
		/// <summary>
		/// Sent by the server in the Type 2 message to indicate that it is including
		/// a Target Information block in the message. The Target Information block
		/// is used in the calculation of the NTLMv2 response.
		/// </summary>
		NegotiateTargetInfo = 0x00800000,
		/// <summary>
		/// Indicates that 128-bit encryption is supported.
		/// </summary>
		Negotiate128 = 0x20000000,
		/// <summary>
		/// Indicates that the client will provide an encrypted master key in the
		/// "Session Key" field of the Type 3 message.
		/// </summary>
		NegotiateKeyExchange = 0x40000000,
		/// <summary>
		/// Indicates that 56-bit encryption is supported.
		/// </summary>
		Negotiate56
	}
}