• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /asuswrt-rt-n18u-9.0.0.4.380.2695/release/src-rt-6.x.4708/router/samba-3.0.25b/source/include/
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	NTLMSSP_DONE      = 5 /* samba final state */
39};
40
41/* NTLMSSP negotiation flags */
42#define NTLMSSP_NEGOTIATE_UNICODE          0x00000001
43#define NTLMSSP_NEGOTIATE_OEM              0x00000002
44#define NTLMSSP_REQUEST_TARGET             0x00000004
45#define NTLMSSP_NEGOTIATE_SIGN             0x00000010 /* Message integrity */
46#define NTLMSSP_NEGOTIATE_SEAL             0x00000020 /* Message confidentiality */
47#define NTLMSSP_NEGOTIATE_DATAGRAM_STYLE   0x00000040
48#define NTLMSSP_NEGOTIATE_LM_KEY           0x00000080
49#define NTLMSSP_NEGOTIATE_NETWARE          0x00000100
50#define NTLMSSP_NEGOTIATE_NTLM             0x00000200
51#define NTLMSSP_NEGOTIATE_DOMAIN_SUPPLIED  0x00001000
52#define NTLMSSP_NEGOTIATE_WORKSTATION_SUPPLIED 0x00002000
53#define NTLMSSP_NEGOTIATE_THIS_IS_LOCAL_CALL  0x00004000
54#define NTLMSSP_NEGOTIATE_ALWAYS_SIGN      0x00008000
55#define NTLMSSP_TARGET_TYPE_DOMAIN            0x10000
56#define NTLMSSP_TARGET_TYPE_SERVER            0x20000
57#define NTLMSSP_CHAL_INIT_RESPONSE         0x00010000
58
59#define NTLMSSP_CHAL_ACCEPT_RESPONSE       0x00020000
60#define NTLMSSP_CHAL_NON_NT_SESSION_KEY    0x00040000
61#define NTLMSSP_NEGOTIATE_NTLM2            0x00080000
62#define NTLMSSP_CHAL_TARGET_INFO           0x00800000
63#define NTLMSSP_UNKNOWN_02000000	   0x02000000
64#define NTLMSSP_NEGOTIATE_128              0x20000000 /* 128-bit encryption */
65#define NTLMSSP_NEGOTIATE_KEY_EXCH         0x40000000
66#define NTLMSSP_NEGOTIATE_56               0x80000000
67
68#define NTLMSSP_FEATURE_SESSION_KEY        0x00000001
69#define NTLMSSP_FEATURE_SIGN               0x00000002
70#define NTLMSSP_FEATURE_SEAL               0x00000004
71
72#define NTLMSSP_NAME_TYPE_SERVER      0x01
73#define NTLMSSP_NAME_TYPE_DOMAIN      0x02
74#define NTLMSSP_NAME_TYPE_SERVER_DNS  0x03
75#define NTLMSSP_NAME_TYPE_DOMAIN_DNS  0x04
76
77#define NTLMSSP_SIG_SIZE 16
78
79typedef struct ntlmssp_state
80{
81	TALLOC_CTX *mem_ctx;
82	unsigned int ref_count;
83	enum NTLMSSP_ROLE role;
84	enum server_types server_role;
85	uint32 expected_state;
86
87	BOOL unicode;
88	BOOL use_ntlmv2;
89	char *user;
90	char *domain;
91	char *workstation;
92	unsigned char *nt_hash;
93	unsigned char *lm_hash;
94	char *server_domain;
95
96	DATA_BLOB internal_chal; /* Random challenge as supplied to the client for NTLM authentication */
97
98	DATA_BLOB chal; /* Random challenge as input into the actual NTLM (or NTLM2) authentication */
99 	DATA_BLOB lm_resp;
100	DATA_BLOB nt_resp;
101	DATA_BLOB session_key;
102
103	uint32 neg_flags; /* the current state of negotiation with the NTLMSSP partner */
104
105	void *auth_context;
106
107	/**
108	 * Callback to get the 'challenge' used for NTLM authentication.
109	 *
110	 * @param ntlmssp_state This structure
111	 * @return 8 bytes of challnege data, determined by the server to be the challenge for NTLM authentication
112	 *
113	 */
114	const uint8 *(*get_challenge)(const struct ntlmssp_state *ntlmssp_state);
115
116	/**
117	 * Callback to find if the challenge used by NTLM authentication may be modified
118	 *
119	 * The NTLM2 authentication scheme modifies the effective challenge, but this is not compatiable with the
120	 * current 'security=server' implementation..
121	 *
122	 * @param ntlmssp_state This structure
123	 * @return Can the challenge be set to arbitary values?
124	 *
125	 */
126	BOOL (*may_set_challenge)(const struct ntlmssp_state *ntlmssp_state);
127
128	/**
129	 * Callback to set the 'challenge' used for NTLM authentication.
130	 *
131	 * The callback may use the void *auth_context to store state information, but the same value is always available
132	 * from the DATA_BLOB chal on this structure.
133	 *
134	 * @param ntlmssp_state This structure
135	 * @param challenge 8 bytes of data, agreed by the client and server to be the effective challenge for NTLM2 authentication
136	 *
137	 */
138	NTSTATUS (*set_challenge)(struct ntlmssp_state *ntlmssp_state, DATA_BLOB *challenge);
139
140	/**
141	 * Callback to check the user's password.
142	 *
143	 * The callback must reads the feilds of this structure for the information it needs on the user
144	 * @param ntlmssp_state This structure
145	 * @param nt_session_key If an NT session key is returned by the authentication process, return it here
146	 * @param lm_session_key If an LM session key is returned by the authentication process, return it here
147	 *
148	 */
149	NTSTATUS (*check_password)(struct ntlmssp_state *ntlmssp_state, DATA_BLOB *nt_session_key, DATA_BLOB *lm_session_key);
150
151	const char *(*get_global_myname)(void);
152	const char *(*get_domain)(void);
153
154	/* ntlmv2 */
155
156	unsigned char send_sign_key[16];
157	unsigned char send_seal_key[16];
158	unsigned char recv_sign_key[16];
159	unsigned char recv_seal_key[16];
160
161	unsigned char send_seal_arc4_state[258];
162	unsigned char recv_seal_arc4_state[258];
163
164	uint32 ntlm2_send_seq_num;
165	uint32 ntlm2_recv_seq_num;
166
167	/* ntlmv1 */
168	unsigned char ntlmv1_arc4_state[258];
169	uint32 ntlmv1_seq_num;
170
171	/* it turns out that we don't always get the
172	   response in at the time we want to process it.
173	   Store it here, until we need it */
174	DATA_BLOB stored_response;
175
176} NTLMSSP_STATE;
177