1/*
2   Unix SMB/CIFS implementation.
3   SMB parameters and setup
4   Copyright (C) Andrew Tridgell 1992-1997
5   Copyright (C) Luke Kenneth Casson Leighton 1996-1997
6   Copyright (C) Paul Ashton 1997
7
8   This program is free software; you can redistribute it and/or modify
9   it under the terms of the GNU General Public License as published by
10   the Free Software Foundation; either version 2 of the License, or
11   (at your option) any later version.
12
13   This program is distributed in the hope that it will be useful,
14   but WITHOUT ANY WARRANTY; without even the implied warranty of
15   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16   GNU General Public License for more details.
17
18   You should have received a copy of the GNU General Public License
19   along with this program; if not, write to the Free Software
20   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21*/
22
23/* NTLMSSP mode */
24enum NTLMSSP_ROLE
25{
26	NTLMSSP_SERVER,
27	NTLMSSP_CLIENT
28};
29
30/* NTLMSSP message types */
31enum NTLM_MESSAGE_TYPE
32{
33	NTLMSSP_INITIAL = 0 /* samba internal state */,
34	NTLMSSP_NEGOTIATE = 1,
35	NTLMSSP_CHALLENGE = 2,
36	NTLMSSP_AUTH      = 3,
37	NTLMSSP_UNKNOWN   = 4
38};
39
40/* NTLMSSP negotiation flags */
41#define NTLMSSP_NEGOTIATE_UNICODE          0x00000001
42#define NTLMSSP_NEGOTIATE_OEM              0x00000002
43#define NTLMSSP_REQUEST_TARGET             0x00000004
44#define NTLMSSP_NEGOTIATE_SIGN             0x00000010 /* Message integrity */
45#define NTLMSSP_NEGOTIATE_SEAL             0x00000020 /* Message confidentiality */
46#define NTLMSSP_NEGOTIATE_DATAGRAM_STYLE   0x00000040
47#define NTLMSSP_NEGOTIATE_LM_KEY           0x00000080
48#define NTLMSSP_NEGOTIATE_NETWARE          0x00000100
49#define NTLMSSP_NEGOTIATE_NTLM             0x00000200
50#define NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED  0x00001000
51#define NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED 0x00002000
52#define NTLMSSP_NEGOTIATE_THIS_IS_LOCAL_CALL  0x00004000
53#define NTLMSSP_NEGOTIATE_ALWAYS_SIGN      0x00008000
54#define NTLMSSP_TARGET_TYPE_DOMAIN            0x10000
55#define NTLMSSP_TARGET_TYPE_SERVER            0x20000
56#define NTLMSSP_CHAL_INIT_RESPONSE         0x00010000
57
58#define NTLMSSP_CHAL_ACCEPT_RESPONSE       0x00020000
59#define NTLMSSP_CHAL_NON_NT_SESSION_KEY    0x00040000
60#define NTLMSSP_NEGOTIATE_NTLM2            0x00080000
61#define NTLMSSP_CHAL_TARGET_INFO           0x00800000
62#define NTLMSSP_NEGOTIATE_128              0x20000000 /* 128-bit encryption */
63#define NTLMSSP_NEGOTIATE_KEY_EXCH         0x40000000
64#define NTLMSSP_NEGOTIATE_080000000        0x80000000
65
66#define NTLMSSP_NAME_TYPE_SERVER      0x01
67#define NTLMSSP_NAME_TYPE_DOMAIN      0x02
68#define NTLMSSP_NAME_TYPE_SERVER_DNS  0x03
69#define NTLMSSP_NAME_TYPE_DOMAIN_DNS  0x04
70
71typedef struct ntlmssp_state
72{
73	TALLOC_CTX *mem_ctx;
74	unsigned int ref_count;
75	enum NTLMSSP_ROLE role;
76	enum server_types server_role;
77	uint32 expected_state;
78
79	BOOL unicode;
80	BOOL use_ntlmv2;
81	char *user;
82	char *domain;
83	char *workstation;
84	char *password;
85	char *server_domain;
86
87	DATA_BLOB internal_chal; /* Random challenge as supplied to the client for NTLM authentication */
88
89	DATA_BLOB chal; /* Random challenge as input into the actual NTLM (or NTLM2) authentication */
90 	DATA_BLOB lm_resp;
91	DATA_BLOB nt_resp;
92	DATA_BLOB session_key;
93
94	uint32 neg_flags; /* the current state of negotiation with the NTLMSSP partner */
95
96	void *auth_context;
97
98	/**
99	 * Callback to get the 'challenge' used for NTLM authentication.
100	 *
101	 * @param ntlmssp_state This structure
102	 * @return 8 bytes of challnege data, determined by the server to be the challenge for NTLM authentication
103	 *
104	 */
105	const uint8 *(*get_challenge)(const struct ntlmssp_state *ntlmssp_state);
106
107	/**
108	 * Callback to find if the challenge used by NTLM authentication may be modified
109	 *
110	 * The NTLM2 authentication scheme modifies the effective challenge, but this is not compatiable with the
111	 * current 'security=server' implementation..
112	 *
113	 * @param ntlmssp_state This structure
114	 * @return Can the challenge be set to arbitary values?
115	 *
116	 */
117	BOOL (*may_set_challenge)(const struct ntlmssp_state *ntlmssp_state);
118
119	/**
120	 * Callback to set the 'challenge' used for NTLM authentication.
121	 *
122	 * The callback may use the void *auth_context to store state information, but the same value is always available
123	 * from the DATA_BLOB chal on this structure.
124	 *
125	 * @param ntlmssp_state This structure
126	 * @param challange 8 bytes of data, agreed by the client and server to be the effective challenge for NTLM2 authentication
127	 *
128	 */
129	NTSTATUS (*set_challenge)(struct ntlmssp_state *ntlmssp_state, DATA_BLOB *challenge);
130
131	/**
132	 * Callback to check the user's password.
133	 *
134	 * The callback must reads the feilds of this structure for the information it needs on the user
135	 * @param ntlmssp_state This structure
136	 * @param nt_session_key If an NT session key is returned by the authentication process, return it here
137	 * @param lm_session_key If an LM session key is returned by the authentication process, return it here
138	 *
139	 */
140	NTSTATUS (*check_password)(struct ntlmssp_state *ntlmssp_state, DATA_BLOB *nt_session_key, DATA_BLOB *lm_session_key);
141
142	const char *(*get_global_myname)(void);
143	const char *(*get_domain)(void);
144
145	/* SMB Signing */
146
147	uint32 ntlmssp_seq_num;
148
149	/* ntlmv2 */
150	unsigned char send_sign_const[16];
151	unsigned char send_seal_const[16];
152	unsigned char recv_sign_const[16];
153	unsigned char recv_seal_const[16];
154
155	unsigned char send_sign_hash[258];
156	unsigned char send_seal_hash[258];
157	unsigned char recv_sign_hash[258];
158	unsigned char recv_seal_hash[258];
159
160	/* ntlmv1 */
161	unsigned char ntlmssp_hash[258];
162
163	/* it turns out that we don't always get the
164	   response in at the time we want to process it.
165	   Store it here, until we need it */
166	DATA_BLOB stored_response;
167
168} NTLMSSP_STATE;
169
170