Blame winpr/libwinpr/sspi/NTLM/ntlm.h

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * NTLM Security Package
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2011-2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifndef WINPR_SSPI_NTLM_PRIVATE_H
Packit 1fb8d4
#define WINPR_SSPI_NTLM_PRIVATE_H
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/sspi.h>
Packit 1fb8d4
#include <winpr/windows.h>
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/nt.h>
Packit 1fb8d4
#include <winpr/crypto.h>
Packit 1fb8d4
#include <winpr/ntlm.h>
Packit 1fb8d4
Packit 1fb8d4
#include "../sspi.h"
Packit 1fb8d4
Packit Service 5a9772
#define MESSAGE_TYPE_NEGOTIATE 1
Packit Service 5a9772
#define MESSAGE_TYPE_CHALLENGE 2
Packit Service 5a9772
#define MESSAGE_TYPE_AUTHENTICATE 3
Packit 1fb8d4
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_56 0x80000000                        /* W   (0) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_KEY_EXCH 0x40000000                  /* V   (1) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_128 0x20000000                       /* U   (2) */
Packit Service 5a9772
#define NTLMSSP_RESERVED1 0x10000000                           /* r1  (3) */
Packit Service 5a9772
#define NTLMSSP_RESERVED2 0x08000000                           /* r2  (4) */
Packit Service 5a9772
#define NTLMSSP_RESERVED3 0x04000000                           /* r3  (5) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_VERSION 0x02000000                   /* T   (6) */
Packit Service 5a9772
#define NTLMSSP_RESERVED4 0x01000000                           /* r4  (7) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_TARGET_INFO 0x00800000               /* S   (8) */
Packit Service 5a9772
#define NTLMSSP_REQUEST_NON_NT_SESSION_KEY 0x00400000          /* R   (9) */
Packit Service 5a9772
#define NTLMSSP_RESERVED5 0x00200000                           /* r5  (10) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_IDENTIFY 0x00100000                  /* Q   (11) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_EXTENDED_SESSION_SECURITY 0x00080000 /* P   (12) */
Packit Service 5a9772
#define NTLMSSP_RESERVED6 0x00040000                           /* r6  (13) */
Packit Service 5a9772
#define NTLMSSP_TARGET_TYPE_SERVER 0x00020000                  /* O   (14) */
Packit Service 5a9772
#define NTLMSSP_TARGET_TYPE_DOMAIN 0x00010000                  /* N   (15) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_ALWAYS_SIGN 0x00008000               /* M   (16) */
Packit Service 5a9772
#define NTLMSSP_RESERVED7 0x00004000                           /* r7  (17) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED 0x00002000      /* L   (18) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED 0x00001000           /* K   (19) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_ANONYMOUS 0x00000800                 /* J   (20) */
Packit Service 5a9772
#define NTLMSSP_RESERVED8 0x00000400                           /* r8  (21) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_NTLM 0x00000200                      /* H   (22) */
Packit Service 5a9772
#define NTLMSSP_RESERVED9 0x00000100                           /* r9  (23) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_LM_KEY 0x00000080                    /* G   (24) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_DATAGRAM 0x00000040                  /* F   (25) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_SEAL 0x00000020                      /* E   (26) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_SIGN 0x00000010                      /* D   (27) */
Packit Service 5a9772
#define NTLMSSP_RESERVED10 0x00000008                          /* r10 (28) */
Packit Service 5a9772
#define NTLMSSP_REQUEST_TARGET 0x00000004                      /* C   (29) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_OEM 0x00000002                       /* B   (30) */
Packit Service 5a9772
#define NTLMSSP_NEGOTIATE_UNICODE 0x00000001                   /* A   (31) */
Packit 1fb8d4
Packit 1fb8d4
enum _NTLM_STATE
Packit 1fb8d4
{
Packit 1fb8d4
	NTLM_STATE_INITIAL,
Packit 1fb8d4
	NTLM_STATE_NEGOTIATE,
Packit 1fb8d4
	NTLM_STATE_CHALLENGE,
Packit 1fb8d4
	NTLM_STATE_AUTHENTICATE,
Packit 1fb8d4
	NTLM_STATE_COMPLETION,
Packit 1fb8d4
	NTLM_STATE_FINAL
Packit 1fb8d4
};
Packit 1fb8d4
typedef enum _NTLM_STATE NTLM_STATE;
Packit 1fb8d4
Packit 1fb8d4
enum _NTLM_AV_ID
Packit 1fb8d4
{
Packit 1fb8d4
	MsvAvEOL,
Packit 1fb8d4
	MsvAvNbComputerName,
Packit 1fb8d4
	MsvAvNbDomainName,
Packit 1fb8d4
	MsvAvDnsComputerName,
Packit 1fb8d4
	MsvAvDnsDomainName,
Packit 1fb8d4
	MsvAvDnsTreeName,
Packit 1fb8d4
	MsvAvFlags,
Packit 1fb8d4
	MsvAvTimestamp,
Packit 1fb8d4
	MsvAvSingleHost,
Packit 1fb8d4
	MsvAvTargetName,
Packit 1fb8d4
	MsvChannelBindings
Packit 1fb8d4
};
Packit 1fb8d4
typedef enum _NTLM_AV_ID NTLM_AV_ID;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLM_AV_PAIR
Packit 1fb8d4
{
Packit 1fb8d4
	UINT16 AvId;
Packit 1fb8d4
	UINT16 AvLen;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLM_AV_PAIR NTLM_AV_PAIR;
Packit 1fb8d4
Packit Service 5a9772
#define MSV_AV_FLAGS_AUTHENTICATION_CONSTRAINED 0x00000001
Packit Service 5a9772
#define MSV_AV_FLAGS_MESSAGE_INTEGRITY_CHECK 0x00000002
Packit Service 5a9772
#define MSV_AV_FLAGS_TARGET_SPN_UNTRUSTED_SOURCE 0x00000004
Packit 1fb8d4
Packit Service 5a9772
#define WINDOWS_MAJOR_VERSION_5 0x05
Packit Service 5a9772
#define WINDOWS_MAJOR_VERSION_6 0x06
Packit Service 5a9772
#define WINDOWS_MINOR_VERSION_0 0x00
Packit Service 5a9772
#define WINDOWS_MINOR_VERSION_1 0x01
Packit Service 5a9772
#define WINDOWS_MINOR_VERSION_2 0x02
Packit Service 5a9772
#define NTLMSSP_REVISION_W2K3 0x0F
Packit 1fb8d4
Packit 1fb8d4
struct _NTLM_VERSION_INFO
Packit 1fb8d4
{
Packit 1fb8d4
	UINT8 ProductMajorVersion;
Packit 1fb8d4
	UINT8 ProductMinorVersion;
Packit 1fb8d4
	UINT16 ProductBuild;
Packit 1fb8d4
	BYTE Reserved[3];
Packit 1fb8d4
	UINT8 NTLMRevisionCurrent;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLM_VERSION_INFO NTLM_VERSION_INFO;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLM_SINGLE_HOST_DATA
Packit 1fb8d4
{
Packit 1fb8d4
	UINT32 Size;
Packit 1fb8d4
	UINT32 Z4;
Packit 1fb8d4
	UINT32 DataPresent;
Packit 1fb8d4
	UINT32 CustomData;
Packit 1fb8d4
	BYTE MachineID[32];
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLM_SINGLE_HOST_DATA NTLM_SINGLE_HOST_DATA;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLM_RESPONSE
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE Response[24];
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLM_RESPONSE NTLM_RESPONSE;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLMv2_CLIENT_CHALLENGE
Packit 1fb8d4
{
Packit 1fb8d4
	UINT8 RespType;
Packit 1fb8d4
	UINT8 HiRespType;
Packit 1fb8d4
	UINT16 Reserved1;
Packit 1fb8d4
	UINT32 Reserved2;
Packit 1fb8d4
	BYTE Timestamp[8];
Packit 1fb8d4
	BYTE ClientChallenge[8];
Packit 1fb8d4
	UINT32 Reserved3;
Packit 1fb8d4
	NTLM_AV_PAIR* AvPairs;
Packit 1fb8d4
	UINT32 cbAvPairs;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLMv2_CLIENT_CHALLENGE NTLMv2_CLIENT_CHALLENGE;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLMv2_RESPONSE
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE Response[16];
Packit 1fb8d4
	NTLMv2_CLIENT_CHALLENGE Challenge;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLMv2_RESPONSE NTLMv2_RESPONSE;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLM_MESSAGE_FIELDS
Packit 1fb8d4
{
Packit 1fb8d4
	UINT16 Len;
Packit 1fb8d4
	UINT16 MaxLen;
Packit 1fb8d4
	PBYTE Buffer;
Packit 1fb8d4
	UINT32 BufferOffset;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLM_MESSAGE_FIELDS NTLM_MESSAGE_FIELDS;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLM_MESSAGE_HEADER
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE Signature[8];
Packit 1fb8d4
	UINT32 MessageType;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLM_MESSAGE_HEADER NTLM_MESSAGE_HEADER;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLM_NEGOTIATE_MESSAGE
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE Signature[8];
Packit 1fb8d4
	UINT32 MessageType;
Packit 1fb8d4
	UINT32 NegotiateFlags;
Packit 1fb8d4
	NTLM_VERSION_INFO Version;
Packit 1fb8d4
	NTLM_MESSAGE_FIELDS DomainName;
Packit 1fb8d4
	NTLM_MESSAGE_FIELDS Workstation;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLM_NEGOTIATE_MESSAGE NTLM_NEGOTIATE_MESSAGE;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLM_CHALLENGE_MESSAGE
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE Signature[8];
Packit 1fb8d4
	UINT32 MessageType;
Packit 1fb8d4
	UINT32 NegotiateFlags;
Packit 1fb8d4
	BYTE ServerChallenge[8];
Packit 1fb8d4
	BYTE Reserved[8];
Packit 1fb8d4
	NTLM_VERSION_INFO Version;
Packit 1fb8d4
	NTLM_MESSAGE_FIELDS TargetName;
Packit 1fb8d4
	NTLM_MESSAGE_FIELDS TargetInfo;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLM_CHALLENGE_MESSAGE NTLM_CHALLENGE_MESSAGE;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLM_AUTHENTICATE_MESSAGE
Packit 1fb8d4
{
Packit 1fb8d4
	BYTE Signature[8];
Packit 1fb8d4
	UINT32 MessageType;
Packit 1fb8d4
	UINT32 NegotiateFlags;
Packit 1fb8d4
	NTLM_VERSION_INFO Version;
Packit 1fb8d4
	NTLM_MESSAGE_FIELDS DomainName;
Packit 1fb8d4
	NTLM_MESSAGE_FIELDS UserName;
Packit 1fb8d4
	NTLM_MESSAGE_FIELDS Workstation;
Packit 1fb8d4
	NTLM_MESSAGE_FIELDS LmChallengeResponse;
Packit 1fb8d4
	NTLM_MESSAGE_FIELDS NtChallengeResponse;
Packit 1fb8d4
	NTLM_MESSAGE_FIELDS EncryptedRandomSessionKey;
Packit 1fb8d4
	BYTE MessageIntegrityCheck[16];
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLM_AUTHENTICATE_MESSAGE NTLM_AUTHENTICATE_MESSAGE;
Packit 1fb8d4
Packit 1fb8d4
struct _NTLM_CONTEXT
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL server;
Packit 1fb8d4
	BOOL NTLMv2;
Packit 1fb8d4
	BOOL UseMIC;
Packit 1fb8d4
	NTLM_STATE state;
Packit 1fb8d4
	int SendSeqNum;
Packit 1fb8d4
	int RecvSeqNum;
Packit 1fb8d4
	char* SamFile;
Packit 1fb8d4
	BYTE NtlmHash[16];
Packit 1fb8d4
	BYTE NtlmV2Hash[16];
Packit 1fb8d4
	BYTE MachineID[32];
Packit 1fb8d4
	BOOL SendVersionInfo;
Packit 1fb8d4
	BOOL confidentiality;
Packit 1fb8d4
	WINPR_RC4_CTX* SendRc4Seal;
Packit 1fb8d4
	WINPR_RC4_CTX* RecvRc4Seal;
Packit 1fb8d4
	BYTE* SendSigningKey;
Packit 1fb8d4
	BYTE* RecvSigningKey;
Packit 1fb8d4
	BYTE* SendSealingKey;
Packit 1fb8d4
	BYTE* RecvSealingKey;
Packit 1fb8d4
	UINT32 NegotiateFlags;
Packit 1fb8d4
	BOOL UseSamFileDatabase;
Packit 1fb8d4
	int LmCompatibilityLevel;
Packit 1fb8d4
	int SuppressExtendedProtection;
Packit 1fb8d4
	BOOL SendWorkstationName;
Packit 1fb8d4
	UNICODE_STRING Workstation;
Packit 1fb8d4
	UNICODE_STRING ServicePrincipalName;
Packit 1fb8d4
	SSPI_CREDENTIALS* credentials;
Packit 1fb8d4
	BYTE* ChannelBindingToken;
Packit 1fb8d4
	BYTE ChannelBindingsHash[16];
Packit 1fb8d4
	SecPkgContext_Bindings Bindings;
Packit 1fb8d4
	BOOL SendSingleHostData;
Packit 1fb8d4
	BOOL NegotiateKeyExchange;
Packit 1fb8d4
	NTLM_SINGLE_HOST_DATA SingleHostData;
Packit 1fb8d4
	NTLM_NEGOTIATE_MESSAGE NEGOTIATE_MESSAGE;
Packit 1fb8d4
	NTLM_CHALLENGE_MESSAGE CHALLENGE_MESSAGE;
Packit 1fb8d4
	NTLM_AUTHENTICATE_MESSAGE AUTHENTICATE_MESSAGE;
Packit 1fb8d4
	UINT32 MessageIntegrityCheckOffset;
Packit 1fb8d4
	SecBuffer NegotiateMessage;
Packit 1fb8d4
	SecBuffer ChallengeMessage;
Packit 1fb8d4
	SecBuffer AuthenticateMessage;
Packit 1fb8d4
	SecBuffer ChallengeTargetInfo;
Packit 1fb8d4
	SecBuffer AuthenticateTargetInfo;
Packit 1fb8d4
	SecBuffer TargetName;
Packit 1fb8d4
	SecBuffer NtChallengeResponse;
Packit 1fb8d4
	SecBuffer LmChallengeResponse;
Packit 1fb8d4
	NTLMv2_RESPONSE NTLMv2Response;
Packit Service 5a9772
	BYTE NtProofString[16];
Packit 1fb8d4
	BYTE Timestamp[8];
Packit 1fb8d4
	BYTE ChallengeTimestamp[8];
Packit 1fb8d4
	BYTE ServerChallenge[8];
Packit 1fb8d4
	BYTE ClientChallenge[8];
Packit 1fb8d4
	BYTE SessionBaseKey[16];
Packit 1fb8d4
	BYTE KeyExchangeKey[16];
Packit 1fb8d4
	BYTE RandomSessionKey[16];
Packit 1fb8d4
	BYTE ExportedSessionKey[16];
Packit 1fb8d4
	BYTE EncryptedRandomSessionKey[16];
Packit 1fb8d4
	BYTE ClientSigningKey[16];
Packit 1fb8d4
	BYTE ClientSealingKey[16];
Packit 1fb8d4
	BYTE ServerSigningKey[16];
Packit 1fb8d4
	BYTE ServerSealingKey[16];
Packit 1fb8d4
	psPeerComputeNtlmHash HashCallback;
Packit 1fb8d4
	void* HashCallbackArg;
Packit 1fb8d4
};
Packit 1fb8d4
typedef struct _NTLM_CONTEXT NTLM_CONTEXT;
Packit 1fb8d4
Packit 1fb8d4
SECURITY_STATUS ntlm_computeProofValue(NTLM_CONTEXT* ntlm, SecBuffer* ntproof);
Packit 1fb8d4
SECURITY_STATUS ntlm_computeMicValue(NTLM_CONTEXT* ntlm, SecBuffer* micvalue);
Packit 1fb8d4
Packit 1fb8d4
#ifdef WITH_DEBUG_NLA
Packit 1fb8d4
#define WITH_DEBUG_NTLM
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#endif /* FREERDP_SSPI_NTLM_PRIVATE_H */