FreeRDP
Loading...
Searching...
No Matches
libwinpr/sspi/NTLM/ntlm.h
1
20#ifndef WINPR_SSPI_NTLM_PRIVATE_H
21#define WINPR_SSPI_NTLM_PRIVATE_H
22
23#include <winpr/sspi.h>
24#include <winpr/windows.h>
25
26#include <winpr/nt.h>
27#include <winpr/crypto.h>
28#include <winpr/sysinfo.h>
29
30#include "../sspi.h"
31
32#define MESSAGE_TYPE_NEGOTIATE 1
33#define MESSAGE_TYPE_CHALLENGE 2
34#define MESSAGE_TYPE_AUTHENTICATE 3
35
36#define NTLMSSP_NEGOTIATE_56 0x80000000 /* W (0) */
37#define NTLMSSP_NEGOTIATE_KEY_EXCH 0x40000000 /* V (1) */
38#define NTLMSSP_NEGOTIATE_128 0x20000000 /* U (2) */
39#define NTLMSSP_RESERVED1 0x10000000 /* r1 (3) */
40#define NTLMSSP_RESERVED2 0x08000000 /* r2 (4) */
41#define NTLMSSP_RESERVED3 0x04000000 /* r3 (5) */
42#define NTLMSSP_NEGOTIATE_VERSION 0x02000000 /* T (6) */
43#define NTLMSSP_RESERVED4 0x01000000 /* r4 (7) */
44#define NTLMSSP_NEGOTIATE_TARGET_INFO 0x00800000 /* S (8) */
45#define NTLMSSP_REQUEST_NON_NT_SESSION_KEY 0x00400000 /* R (9) */
46#define NTLMSSP_RESERVED5 0x00200000 /* r5 (10) */
47#define NTLMSSP_NEGOTIATE_IDENTIFY 0x00100000 /* Q (11) */
48#define NTLMSSP_NEGOTIATE_EXTENDED_SESSION_SECURITY 0x00080000 /* P (12) */
49#define NTLMSSP_RESERVED6 0x00040000 /* r6 (13) */
50#define NTLMSSP_TARGET_TYPE_SERVER 0x00020000 /* O (14) */
51#define NTLMSSP_TARGET_TYPE_DOMAIN 0x00010000 /* N (15) */
52#define NTLMSSP_NEGOTIATE_ALWAYS_SIGN 0x00008000 /* M (16) */
53#define NTLMSSP_RESERVED7 0x00004000 /* r7 (17) */
54#define NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED 0x00002000 /* L (18) */
55#define NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED 0x00001000 /* K (19) */
56#define NTLMSSP_NEGOTIATE_ANONYMOUS 0x00000800 /* J (20) */
57#define NTLMSSP_RESERVED8 0x00000400 /* r8 (21) */
58#define NTLMSSP_NEGOTIATE_NTLM 0x00000200 /* H (22) */
59#define NTLMSSP_RESERVED9 0x00000100 /* r9 (23) */
60#define NTLMSSP_NEGOTIATE_LM_KEY 0x00000080 /* G (24) */
61#define NTLMSSP_NEGOTIATE_DATAGRAM 0x00000040 /* F (25) */
62#define NTLMSSP_NEGOTIATE_SEAL 0x00000020 /* E (26) */
63#define NTLMSSP_NEGOTIATE_SIGN 0x00000010 /* D (27) */
64#define NTLMSSP_RESERVED10 0x00000008 /* r10 (28) */
65#define NTLMSSP_REQUEST_TARGET 0x00000004 /* C (29) */
66#define NTLMSSP_NEGOTIATE_OEM 0x00000002 /* B (30) */
67#define NTLMSSP_NEGOTIATE_UNICODE 0x00000001 /* A (31) */
68
69typedef enum
70{
71 NTLM_STATE_INITIAL,
72 NTLM_STATE_NEGOTIATE,
73 NTLM_STATE_CHALLENGE,
74 NTLM_STATE_AUTHENTICATE,
75 NTLM_STATE_FINAL
76} NTLM_STATE;
77
78#ifdef __MINGW32__
79typedef MSV1_0_AVID NTLM_AV_ID;
80
81#if __MINGW64_VERSION_MAJOR < 9
82enum
83{
84 MsvAvTimestamp = MsvAvFlags + 1,
85 MsvAvRestrictions,
86 MsvAvTargetName,
87 MsvAvChannelBindings,
88 MsvAvSingleHost = MsvAvRestrictions
89};
90
91#else
92#ifndef MsvAvSingleHost
93#define MsvAvSingleHost MsvAvRestrictions
94#endif
95#endif
96#else
97typedef enum
98{
99 MsvAvEOL,
100 MsvAvNbComputerName,
101 MsvAvNbDomainName,
102 MsvAvDnsComputerName,
103 MsvAvDnsDomainName,
104 MsvAvDnsTreeName,
105 MsvAvFlags,
106 MsvAvTimestamp,
107 MsvAvSingleHost,
108 MsvAvTargetName,
109 MsvAvChannelBindings
110} NTLM_AV_ID;
111#endif /* __MINGW32__ */
112
113typedef struct
114{
115 UINT16 AvId;
116 UINT16 AvLen;
118
119#define MSV_AV_FLAGS_AUTHENTICATION_CONSTRAINED 0x00000001
120#define MSV_AV_FLAGS_MESSAGE_INTEGRITY_CHECK 0x00000002
121#define MSV_AV_FLAGS_TARGET_SPN_UNTRUSTED_SOURCE 0x00000004
122
123#define WINDOWS_MAJOR_VERSION_5 0x05
124#define WINDOWS_MAJOR_VERSION_6 0x06
125#define WINDOWS_MINOR_VERSION_0 0x00
126#define WINDOWS_MINOR_VERSION_1 0x01
127#define WINDOWS_MINOR_VERSION_2 0x02
128#define NTLMSSP_REVISION_W2K3 0x0F
129
130typedef struct
131{
132 UINT8 ProductMajorVersion;
133 UINT8 ProductMinorVersion;
134 UINT16 ProductBuild;
135 BYTE Reserved[3];
136 UINT8 NTLMRevisionCurrent;
138
139typedef struct
140{
141 UINT32 Size;
142 UINT32 Z4;
143 UINT32 DataPresent;
144 UINT32 CustomData;
145 BYTE MachineID[32];
147
148typedef struct
149{
150 BYTE Response[24];
152
153typedef struct
154{
155 UINT8 RespType;
156 UINT8 HiRespType;
157 UINT16 Reserved1;
158 UINT32 Reserved2;
159 BYTE Timestamp[8];
160 BYTE ClientChallenge[8];
161 UINT32 Reserved3;
162 NTLM_AV_PAIR* AvPairs;
163 UINT32 cbAvPairs;
165
166typedef struct
167{
168 BYTE Response[16];
169 NTLMv2_CLIENT_CHALLENGE Challenge;
171
172typedef struct
173{
174 UINT16 Len;
175 UINT16 MaxLen;
176 PBYTE Buffer;
177 UINT32 BufferOffset;
179
180typedef struct
181{
182 BYTE Signature[8];
183 UINT32 MessageType;
185
186typedef struct
187{
188 NTLM_MESSAGE_HEADER header;
189 UINT32 NegotiateFlags;
190 NTLM_VERSION_INFO Version;
191 NTLM_MESSAGE_FIELDS DomainName;
192 NTLM_MESSAGE_FIELDS Workstation;
194
195typedef struct
196{
197 NTLM_MESSAGE_HEADER header;
198 UINT32 NegotiateFlags;
199 BYTE ServerChallenge[8];
200 BYTE Reserved[8];
201 NTLM_VERSION_INFO Version;
202 NTLM_MESSAGE_FIELDS TargetName;
203 NTLM_MESSAGE_FIELDS TargetInfo;
205
206typedef struct
207{
208 NTLM_MESSAGE_HEADER header;
209 UINT32 NegotiateFlags;
210 NTLM_VERSION_INFO Version;
211 NTLM_MESSAGE_FIELDS DomainName;
212 NTLM_MESSAGE_FIELDS UserName;
213 NTLM_MESSAGE_FIELDS Workstation;
214 NTLM_MESSAGE_FIELDS LmChallengeResponse;
215 NTLM_MESSAGE_FIELDS NtChallengeResponse;
216 NTLM_MESSAGE_FIELDS EncryptedRandomSessionKey;
217 BYTE MessageIntegrityCheck[16];
219
220typedef struct
221{
222 BOOL server;
223 BOOL NTLMv2;
224 BOOL UseMIC;
225 NTLM_STATE state;
226 int SendSeqNum;
227 int RecvSeqNum;
228 char* SamFile;
229 BYTE NtlmHash[16];
230 BYTE NtlmV2Hash[16];
231 BYTE MachineID[32];
232 BOOL SendVersionInfo;
233 BOOL confidentiality;
234 WINPR_RC4_CTX* SendRc4Seal;
235 WINPR_RC4_CTX* RecvRc4Seal;
236 BYTE* SendSigningKey;
237 BYTE* RecvSigningKey;
238 BYTE* SendSealingKey;
239 BYTE* RecvSealingKey;
240 UINT32 NegotiateFlags;
241 BOOL UseSamFileDatabase;
242 int LmCompatibilityLevel;
243 int SuppressExtendedProtection;
244 BOOL SendWorkstationName;
245 UNICODE_STRING Workstation;
246 UNICODE_STRING ServicePrincipalName;
247 SSPI_CREDENTIALS* credentials;
248 BYTE* ChannelBindingToken;
249 BYTE ChannelBindingsHash[16];
250 SecPkgContext_Bindings Bindings;
251 BOOL SendSingleHostData;
252 BOOL NegotiateKeyExchange;
253 NTLM_SINGLE_HOST_DATA SingleHostData;
254 NTLM_NEGOTIATE_MESSAGE NEGOTIATE_MESSAGE;
255 NTLM_CHALLENGE_MESSAGE CHALLENGE_MESSAGE;
256 NTLM_AUTHENTICATE_MESSAGE AUTHENTICATE_MESSAGE;
257 size_t MessageIntegrityCheckOffset;
258 SecBuffer NegotiateMessage;
259 SecBuffer ChallengeMessage;
260 SecBuffer AuthenticateMessage;
261 SecBuffer ChallengeTargetInfo;
262 SecBuffer AuthenticateTargetInfo;
263 SecBuffer TargetName;
264 SecBuffer NtChallengeResponse;
265 SecBuffer LmChallengeResponse;
266 NTLMv2_RESPONSE NTLMv2Response;
267 BYTE NtProofString[16];
268 BYTE Timestamp[8];
269 BYTE ChallengeTimestamp[8];
270 BYTE ServerChallenge[8];
271 BYTE ClientChallenge[8];
272 BYTE SessionBaseKey[16];
273 BYTE KeyExchangeKey[16];
274 BYTE RandomSessionKey[16];
275 BYTE ExportedSessionKey[16];
276 BYTE EncryptedRandomSessionKey[16];
277 BYTE ClientSigningKey[16];
278 BYTE ClientSealingKey[16];
279 BYTE ServerSigningKey[16];
280 BYTE ServerSealingKey[16];
281 psSspiNtlmHashCallback HashCallback;
282 void* HashCallbackArg;
284
285char* ntlm_negotiate_flags_string(char* buffer, size_t size, UINT32 flags);
286const char* ntlm_message_type_string(UINT32 messageType);
287
288const char* ntlm_state_string(NTLM_STATE state);
289void ntlm_change_state(NTLM_CONTEXT* ntlm, NTLM_STATE state);
290NTLM_STATE ntlm_get_state(NTLM_CONTEXT* ntlm);
291BOOL ntlm_reset_cipher_state(PSecHandle phContext);
292
293SECURITY_STATUS ntlm_computeProofValue(NTLM_CONTEXT* ntlm, SecBuffer* ntproof);
294SECURITY_STATUS ntlm_computeMicValue(NTLM_CONTEXT* ntlm, SecBuffer* micvalue);
295
296#ifdef WITH_DEBUG_NLA
297#define WITH_DEBUG_NTLM
298#endif
299
300BOOL NTLM_init(void);
301
302WINPR_ATTR_MALLOC(free, 1)
303char* get_computer_name(COMPUTER_NAME_FORMAT type, size_t* pSize);
304
305#endif /* WINPR_SSPI_NTLM_PRIVATE_H */