2fed2b1f510ca95dd26228b030fd65af0bda86d4
[samba.git] / auth / ntlmssp / ntlmssp.h
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    Copyright (C) Andrew Bartlett 2010
8
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 3 of the License, or
12    (at your option) any later version.
13
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18
19    You should have received a copy of the GNU General Public License
20    along with this program.  If not, see <http://www.gnu.org/licenses/>.
21 */
22
23 #include "../librpc/gen_ndr/ntlmssp.h"
24
25 NTSTATUS gensec_ntlmssp_init(void);
26
27 struct auth_context;
28 struct auth_serversupplied_info;
29 struct tsocket_address;
30 struct auth_user_info_dc;
31 struct gensec_security;
32 struct ntlmssp_state;
33
34 struct gensec_ntlmssp_context {
35         /* For GENSEC users */
36         struct gensec_security *gensec_security;
37         void *server_returned_info;
38
39         /* used by both client and server implementation */
40         struct ntlmssp_state *ntlmssp_state;
41 };
42
43 /* NTLMSSP mode */
44 enum ntlmssp_role
45 {
46         NTLMSSP_SERVER,
47         NTLMSSP_CLIENT
48 };
49
50 /* NTLMSSP message types */
51 enum ntlmssp_message_type
52 {
53         NTLMSSP_INITIAL = 0 /* samba internal state */,
54         NTLMSSP_NEGOTIATE = 1,
55         NTLMSSP_CHALLENGE = 2,
56         NTLMSSP_AUTH      = 3,
57         NTLMSSP_UNKNOWN   = 4,
58         NTLMSSP_DONE      = 5 /* samba final state */
59 };
60
61 #define NTLMSSP_FEATURE_SESSION_KEY        0x00000001
62 #define NTLMSSP_FEATURE_SIGN               0x00000002
63 #define NTLMSSP_FEATURE_SEAL               0x00000004
64 #define NTLMSSP_FEATURE_CCACHE             0x00000008
65
66 union ntlmssp_crypt_state;
67
68 struct ntlmssp_state
69 {
70         enum ntlmssp_role role;
71         uint32_t expected_state;
72
73         bool unicode;
74         bool use_ntlmv2;
75         bool use_ccache;
76         bool use_nt_response;  /* Set to 'False' to debug what happens when the NT response is omited */
77         bool allow_lm_key;     /* The LM_KEY code is not very secure... */
78
79         const char *user;
80         const char *domain;
81         uint8_t *nt_hash;
82         uint8_t *lm_hash;
83
84         struct {
85                 const char *netbios_name;
86                 const char *netbios_domain;
87         } client;
88
89         struct {
90                 bool is_standalone;
91                 const char *netbios_name;
92                 const char *netbios_domain;
93                 const char *dns_name;
94                 const char *dns_domain;
95         } server;
96
97         DATA_BLOB internal_chal; /* Random challenge as supplied to the client for NTLM authentication */
98
99         DATA_BLOB chal; /* Random challenge as input into the actual NTLM (or NTLM2) authentication */
100         DATA_BLOB lm_resp;
101         DATA_BLOB nt_resp;
102         DATA_BLOB session_key;
103
104         uint32_t neg_flags; /* the current state of negotiation with the NTLMSSP partner */
105
106         /**
107          * Private data for the callback functions
108          */
109         void *callback_private;
110
111         /**
112          * Callback to get the 'challenge' used for NTLM authentication.
113          *
114          * @param ntlmssp_state This structure
115          * @return 8 bytes of challenge data, determined by the server to be the challenge for NTLM authentication
116          *
117          */
118         NTSTATUS (*get_challenge)(const struct ntlmssp_state *ntlmssp_state,
119                                   uint8_t challenge[8]);
120
121         /**
122          * Callback to find if the challenge used by NTLM authentication may be modified
123          *
124          * The NTLM2 authentication scheme modifies the effective challenge, but this is not compatiable with the
125          * current 'security=server' implementation..
126          *
127          * @param ntlmssp_state This structure
128          * @return Can the challenge be set to arbitary values?
129          *
130          */
131         bool (*may_set_challenge)(const struct ntlmssp_state *ntlmssp_state);
132
133         /**
134          * Callback to set the 'challenge' used for NTLM authentication.
135          *
136          * The callback may use the void *auth_context to store state information, but the same value is always available
137          * from the DATA_BLOB chal on this structure.
138          *
139          * @param ntlmssp_state This structure
140          * @param challenge 8 bytes of data, agreed by the client and server to be the effective challenge for NTLM2 authentication
141          *
142          */
143         NTSTATUS (*set_challenge)(struct ntlmssp_state *ntlmssp_state, DATA_BLOB *challenge);
144
145         /**
146          * Callback to check the user's password.
147          *
148          * The callback must reads the feilds of this structure for the information it needs on the user
149          * @param ntlmssp_state This structure
150          * @param mem_ctx Talloc context for LM and NT session key to be returned on
151          * @param nt_session_key If an NT session key is returned by the authentication process, return it here
152          * @param lm_session_key If an LM session key is returned by the authentication process, return it here
153          *
154          */
155         NTSTATUS (*check_password)(struct ntlmssp_state *ntlmssp_state, TALLOC_CTX *mem_ctx,
156                                    DATA_BLOB *nt_session_key, DATA_BLOB *lm_session_key);
157
158         union ntlmssp_crypt_state *crypt;
159 };
160
161 /* The following definitions come from libcli/auth/ntlmssp_sign.c  */
162
163 NTSTATUS ntlmssp_sign_packet(struct ntlmssp_state *ntlmssp_state,
164                              TALLOC_CTX *sig_mem_ctx,
165                              const uint8_t *data, size_t length,
166                              const uint8_t *whole_pdu, size_t pdu_length,
167                              DATA_BLOB *sig);
168 NTSTATUS ntlmssp_check_packet(struct ntlmssp_state *ntlmssp_state,
169                               const uint8_t *data, size_t length,
170                               const uint8_t *whole_pdu, size_t pdu_length,
171                               const DATA_BLOB *sig) ;
172 NTSTATUS ntlmssp_seal_packet(struct ntlmssp_state *ntlmssp_state,
173                              TALLOC_CTX *sig_mem_ctx,
174                              uint8_t *data, size_t length,
175                              const uint8_t *whole_pdu, size_t pdu_length,
176                              DATA_BLOB *sig);
177 NTSTATUS ntlmssp_unseal_packet(struct ntlmssp_state *ntlmssp_state,
178                                uint8_t *data, size_t length,
179                                const uint8_t *whole_pdu, size_t pdu_length,
180                                const DATA_BLOB *sig);
181 NTSTATUS ntlmssp_wrap(struct ntlmssp_state *ntlmssp_state,
182                       TALLOC_CTX *out_mem_ctx,
183                       const DATA_BLOB *in,
184                       DATA_BLOB *out);
185 NTSTATUS ntlmssp_unwrap(struct ntlmssp_state *ntlmssp_stae,
186                         TALLOC_CTX *out_mem_ctx,
187                         const DATA_BLOB *in,
188                         DATA_BLOB *out);
189 NTSTATUS ntlmssp_sign_init(struct ntlmssp_state *ntlmssp_state);
190
191 bool ntlmssp_blob_matches_magic(const DATA_BLOB *blob);
192 /* The following definitions come from ../source4/auth/ntlmssp/ntlmssp.c  */
193
194
195 /**
196  * Return the NTLMSSP master session key
197  *
198  * @param ntlmssp_state NTLMSSP State
199  */
200 NTSTATUS gensec_ntlmssp_magic(struct gensec_security *gensec_security,
201                               const DATA_BLOB *first_packet);
202 bool gensec_ntlmssp_have_feature(struct gensec_security *gensec_security,
203                                  uint32_t feature);
204 NTSTATUS gensec_ntlmssp_session_key(struct gensec_security *gensec_security,
205                                     TALLOC_CTX *mem_ctx,
206                                     DATA_BLOB *session_key);
207 NTSTATUS gensec_ntlmssp_start(struct gensec_security *gensec_security);
208
209 /* The following definitions come from ../source4/auth/ntlmssp/ntlmssp_sign.c  */
210
211 NTSTATUS gensec_ntlmssp_sign_packet(struct gensec_security *gensec_security,
212                                     TALLOC_CTX *sig_mem_ctx,
213                                     const uint8_t *data, size_t length,
214                                     const uint8_t *whole_pdu, size_t pdu_length,
215                                     DATA_BLOB *sig);
216 NTSTATUS gensec_ntlmssp_check_packet(struct gensec_security *gensec_security,
217                                      const uint8_t *data, size_t length,
218                                      const uint8_t *whole_pdu, size_t pdu_length,
219                                      const DATA_BLOB *sig);
220 NTSTATUS gensec_ntlmssp_seal_packet(struct gensec_security *gensec_security,
221                                     TALLOC_CTX *sig_mem_ctx,
222                                     uint8_t *data, size_t length,
223                                     const uint8_t *whole_pdu, size_t pdu_length,
224                                     DATA_BLOB *sig);
225 NTSTATUS gensec_ntlmssp_unseal_packet(struct gensec_security *gensec_security,
226                                       uint8_t *data, size_t length,
227                                       const uint8_t *whole_pdu, size_t pdu_length,
228                                       const DATA_BLOB *sig);
229 size_t gensec_ntlmssp_sig_size(struct gensec_security *gensec_security, size_t data_size) ;
230 NTSTATUS gensec_ntlmssp_wrap(struct gensec_security *gensec_security,
231                              TALLOC_CTX *out_mem_ctx,
232                              const DATA_BLOB *in,
233                              DATA_BLOB *out);
234 NTSTATUS gensec_ntlmssp_unwrap(struct gensec_security *gensec_security,
235                                TALLOC_CTX *out_mem_ctx,
236                                const DATA_BLOB *in,
237                                DATA_BLOB *out);