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 void NTLM_AV_PAIR;
114
115#define MSV_AV_FLAGS_AUTHENTICATION_CONSTRAINED 0x00000001
116#define MSV_AV_FLAGS_MESSAGE_INTEGRITY_CHECK 0x00000002
117#define MSV_AV_FLAGS_TARGET_SPN_UNTRUSTED_SOURCE 0x00000004
118
119#define WINDOWS_MAJOR_VERSION_5 0x05
120#define WINDOWS_MAJOR_VERSION_6 0x06
121#define WINDOWS_MINOR_VERSION_0 0x00
122#define WINDOWS_MINOR_VERSION_1 0x01
123#define WINDOWS_MINOR_VERSION_2 0x02
124#define NTLMSSP_REVISION_W2K3 0x0F
125
126typedef struct
127{
128 UINT8 ProductMajorVersion;
129 UINT8 ProductMinorVersion;
130 UINT16 ProductBuild;
131 BYTE Reserved[3];
132 UINT8 NTLMRevisionCurrent;
134
135typedef struct
136{
137 UINT32 Size;
138 UINT32 Z4;
139 UINT32 DataPresent;
140 UINT32 CustomData;
141 BYTE MachineID[32];
143
144typedef struct
145{
146 BYTE Response[24];
148
149typedef struct
150{
151 UINT8 RespType;
152 UINT8 HiRespType;
153 UINT16 Reserved1;
154 UINT32 Reserved2;
155 BYTE Timestamp[8];
156 BYTE ClientChallenge[8];
157 UINT32 Reserved3;
158 NTLM_AV_PAIR* AvPairs;
159 UINT32 cbAvPairs;
161
162typedef struct
163{
164 BYTE Response[16];
165 NTLMv2_CLIENT_CHALLENGE Challenge;
167
168typedef struct
169{
170 UINT16 Len;
171 UINT16 MaxLen;
172 PBYTE Buffer;
173 UINT32 BufferOffset;
175
176typedef struct
177{
178 BYTE Signature[8];
179 UINT32 MessageType;
181
182typedef struct
183{
184 NTLM_MESSAGE_HEADER header;
185 UINT32 NegotiateFlags;
186 NTLM_VERSION_INFO Version;
187 NTLM_MESSAGE_FIELDS DomainName;
188 NTLM_MESSAGE_FIELDS Workstation;
190
191typedef struct
192{
193 NTLM_MESSAGE_HEADER header;
194 UINT32 NegotiateFlags;
195 BYTE ServerChallenge[8];
196 BYTE Reserved[8];
197 NTLM_VERSION_INFO Version;
198 NTLM_MESSAGE_FIELDS TargetName;
199 NTLM_MESSAGE_FIELDS TargetInfo;
201
202typedef struct
203{
204 NTLM_MESSAGE_HEADER header;
205 UINT32 NegotiateFlags;
206 NTLM_VERSION_INFO Version;
207 NTLM_MESSAGE_FIELDS DomainName;
208 NTLM_MESSAGE_FIELDS UserName;
209 NTLM_MESSAGE_FIELDS Workstation;
210 NTLM_MESSAGE_FIELDS LmChallengeResponse;
211 NTLM_MESSAGE_FIELDS NtChallengeResponse;
212 NTLM_MESSAGE_FIELDS EncryptedRandomSessionKey;
213 BYTE MessageIntegrityCheck[16];
215
216typedef struct
217{
218 BOOL server;
219 BOOL NTLMv2;
220 BOOL UseMIC;
221 NTLM_STATE state;
222 int SendSeqNum;
223 int RecvSeqNum;
224 char* SamFile;
225 BYTE NtlmHash[16];
226 BYTE NtlmV2Hash[16];
227 BYTE MachineID[32];
228 BOOL SendVersionInfo;
229 BOOL confidentiality;
230 WINPR_RC4_CTX* SendRc4Seal;
231 WINPR_RC4_CTX* RecvRc4Seal;
232 BYTE* SendSigningKey;
233 BYTE* RecvSigningKey;
234 BYTE* SendSealingKey;
235 BYTE* RecvSealingKey;
236 UINT32 NegotiateFlags;
237 BOOL UseSamFileDatabase;
238 int LmCompatibilityLevel;
239 int SuppressExtendedProtection;
240 BOOL SendWorkstationName;
241 UNICODE_STRING Workstation;
242 UNICODE_STRING ServicePrincipalName;
243 SSPI_CREDENTIALS* credentials;
244 BYTE* ChannelBindingToken;
245 BYTE ChannelBindingsHash[16];
246 SecPkgContext_Bindings Bindings;
247 BOOL SendSingleHostData;
248 BOOL NegotiateKeyExchange;
249 NTLM_SINGLE_HOST_DATA SingleHostData;
250 NTLM_NEGOTIATE_MESSAGE NEGOTIATE_MESSAGE;
251 NTLM_CHALLENGE_MESSAGE CHALLENGE_MESSAGE;
252 NTLM_AUTHENTICATE_MESSAGE AUTHENTICATE_MESSAGE;
253 size_t MessageIntegrityCheckOffset;
254 SecBuffer NegotiateMessage;
255 SecBuffer ChallengeMessage;
256 SecBuffer AuthenticateMessage;
257 SecBuffer ChallengeTargetInfo;
258 SecBuffer AuthenticateTargetInfo;
259 SecBuffer TargetName;
260 SecBuffer NtChallengeResponse;
261 SecBuffer LmChallengeResponse;
262 NTLMv2_RESPONSE NTLMv2Response;
263 BYTE NtProofString[16];
264 BYTE Timestamp[8];
265 BYTE ChallengeTimestamp[8];
266 BYTE ServerChallenge[8];
267 BYTE ClientChallenge[8];
268 BYTE SessionBaseKey[16];
269 BYTE KeyExchangeKey[16];
270 BYTE RandomSessionKey[16];
271 BYTE ExportedSessionKey[16];
272 BYTE EncryptedRandomSessionKey[16];
273 BYTE ClientSigningKey[16];
274 BYTE ClientSealingKey[16];
275 BYTE ServerSigningKey[16];
276 BYTE ServerSealingKey[16];
277 psSspiNtlmHashCallback HashCallback;
278 void* HashCallbackArg;
279 UNICODE_STRING NbDomainName;
280 UNICODE_STRING NbComputerName;
281 UNICODE_STRING DnsDomainName;
282 UNICODE_STRING DnsComputerName;
284
285WINPR_ATTR_NODISCARD
286char* ntlm_negotiate_flags_string(char* buffer, size_t size, UINT32 flags);
287
288WINPR_ATTR_NODISCARD
289const char* ntlm_message_type_string(UINT32 messageType);
290
291WINPR_ATTR_NODISCARD
292const char* ntlm_state_string(NTLM_STATE state);
293
294void ntlm_change_state(NTLM_CONTEXT* ntlm, NTLM_STATE state);
295
296WINPR_ATTR_NODISCARD
297NTLM_STATE ntlm_get_state(NTLM_CONTEXT* ntlm);
298
299WINPR_ATTR_NODISCARD
300BOOL ntlm_reset_cipher_state(PSecHandle phContext);
301
302WINPR_ATTR_NODISCARD
303SECURITY_STATUS ntlm_computeProofValue(NTLM_CONTEXT* ntlm, SecBuffer* ntproof);
304
305WINPR_ATTR_NODISCARD
306SECURITY_STATUS ntlm_computeMicValue(NTLM_CONTEXT* ntlm, SecBuffer* micvalue);
307
308WINPR_ATTR_NODISCARD
309SECURITY_STATUS ntlm_SetContextWorkstationX(NTLM_CONTEXT* context, BOOL unicode, const void* data,
310 size_t length);
311
312#ifdef WITH_DEBUG_NLA
313#define WITH_DEBUG_NTLM
314#endif
315
316BOOL NTLM_init(void);
317
318void ntlm_free_unicode_string(UNICODE_STRING* string);
319
320WINPR_ATTR_NODISCARD
321UNICODE_STRING ntlm_clone_unicode_string(const UNICODE_STRING* other);
322
323WINPR_ATTR_NODISCARD
324UNICODE_STRING ntlm_from_unicode_string_w(const WCHAR* str, size_t wcharlen);
325
326WINPR_ATTR_NODISCARD
327UNICODE_STRING ntlm_from_unicode_string_utf8(const char* str, size_t wcharlen);
328
329WINPR_ATTR_NODISCARD
330BOOL ntlm_is_unicode_string_empty(const UNICODE_STRING* str);
331
332WINPR_ATTR_NODISCARD
333BOOL ntlm_SecBufferRealloc(SecBuffer* buffer, ULONG len);
334
335#endif /* WINPR_SSPI_NTLM_PRIVATE_H */