/src/gss-ntlmssp/src/gss_ntlmssp.h
Line | Count | Source |
1 | | /* Copyright 2013 Simo Sorce <simo@samba.org>, see COPYING for license */ |
2 | | |
3 | | #ifndef _GSS_NTLMSSP_H_ |
4 | | #define _GSS_NTLMSSP_H_ |
5 | | |
6 | | #include "ntlm.h" |
7 | | #include "crypto.h" |
8 | | #include "gssapi_ntlmssp.h" |
9 | | #include "debug.h" |
10 | | |
11 | 2.35k | #define DEF_NB_DOMAIN "WORKSTATION" |
12 | 0 | #define MAX_CHALRESP_LIFETIME 36 * 60 * 60 /* 36 hours in seconds */ |
13 | | |
14 | 0 | #define NTLMSSP_DEFAULT_CLIENT_FLAGS ( \ |
15 | 0 | NTLMSSP_NEGOTIATE_ALWAYS_SIGN | \ |
16 | 0 | NTLMSSP_NEGOTIATE_128 | \ |
17 | 0 | NTLMSSP_NEGOTIATE_56 | \ |
18 | 0 | NTLMSSP_NEGOTIATE_NTLM | \ |
19 | 0 | NTLMSSP_REQUEST_TARGET | \ |
20 | 0 | NTLMSSP_NEGOTIATE_OEM | \ |
21 | 0 | NTLMSSP_NEGOTIATE_UNICODE | \ |
22 | 0 | NTLMSSP_NEGOTIATE_VERSION) |
23 | | |
24 | 1.17k | #define NTLMSSP_DEFAULT_SERVER_FLAGS ( \ |
25 | 1.17k | NTLMSSP_NEGOTIATE_ALWAYS_SIGN | \ |
26 | 1.17k | NTLMSSP_NEGOTIATE_56 | \ |
27 | 1.17k | NTLMSSP_NEGOTIATE_KEY_EXCH | \ |
28 | 1.17k | NTLMSSP_NEGOTIATE_128 | \ |
29 | 1.17k | NTLMSSP_NEGOTIATE_VERSION | \ |
30 | 1.17k | NTLMSSP_NEGOTIATE_ALWAYS_SIGN | \ |
31 | 1.17k | NTLMSSP_NEGOTIATE_OEM_WORKSTATION_SUPPLIED | \ |
32 | 1.17k | NTLMSSP_NEGOTIATE_OEM_DOMAIN_SUPPLIED | \ |
33 | 1.17k | NTLMSSP_NEGOTIATE_NTLM | \ |
34 | 1.17k | NTLMSSP_NEGOTIATE_SEAL | \ |
35 | 1.17k | NTLMSSP_NEGOTIATE_SIGN | \ |
36 | 1.17k | NTLMSSP_REQUEST_TARGET | \ |
37 | 1.17k | NTLMSSP_NEGOTIATE_OEM | \ |
38 | 1.17k | NTLMSSP_NEGOTIATE_UNICODE) |
39 | | |
40 | 0 | #define NTLMSSP_CTX_FLAG_ESTABLISHED 0x01 /* context was established */ |
41 | 0 | #define NTLMSSP_CTX_FLAG_SPNEGO_CAN_MIC 0x02 /* SPNEGO asks for MIC */ |
42 | 0 | #define NTLMSSP_CTX_FLAG_AUTH_WITH_MIC 0x04 /* Auth MIC was created */ |
43 | | |
44 | | struct gssntlm_name_attribute { |
45 | | char *attr_name; /* NULL indicates array termination */ |
46 | | gss_buffer_desc attr_value; |
47 | | }; |
48 | | |
49 | | struct gssntlm_name { |
50 | | enum ntlm_name_type { |
51 | | GSSNTLM_NAME_NULL, |
52 | | GSSNTLM_NAME_ANON, |
53 | | GSSNTLM_NAME_USER, |
54 | | GSSNTLM_NAME_SERVER |
55 | | } type; |
56 | | |
57 | | union { |
58 | | struct { |
59 | | char *domain; |
60 | | char *name; |
61 | | } user; |
62 | | struct { |
63 | | char *spn; |
64 | | char *name; |
65 | | } server; |
66 | | } data; |
67 | | |
68 | | struct gssntlm_name_attribute *attrs; /* Array of name attributes */ |
69 | | }; |
70 | | |
71 | | struct gssntlm_cred { |
72 | | enum ntlm_cred_type { |
73 | | GSSNTLM_CRED_NONE, |
74 | | GSSNTLM_CRED_ANON, |
75 | | GSSNTLM_CRED_USER, |
76 | | GSSNTLM_CRED_SERVER, |
77 | | GSSNTLM_CRED_EXTERNAL, |
78 | | } type; |
79 | | |
80 | | union { |
81 | | struct { |
82 | | int dummy; |
83 | | } anon; |
84 | | struct { |
85 | | struct gssntlm_name user; |
86 | | struct ntlm_key nt_hash; |
87 | | struct ntlm_key lm_hash; |
88 | | } user; |
89 | | struct { |
90 | | struct gssntlm_name name; |
91 | | char *keyfile; |
92 | | } server; |
93 | | struct { |
94 | | struct gssntlm_name user; |
95 | | bool creds_in_cache; |
96 | | } external; |
97 | | } cred; |
98 | | |
99 | | /* set cred options provided default flags |
100 | | * this is currently intentionally not imported/exported |
101 | | * as it is considered an ephemeral local status |
102 | | */ |
103 | | uint32_t neg_flags; |
104 | | }; |
105 | | |
106 | | struct gssntlm_ctx { |
107 | | enum gssntlm_role { |
108 | | GSSNTLM_CLIENT, |
109 | | GSSNTLM_SERVER, |
110 | | GSSNTLM_DOMAIN_SERVER, |
111 | | GSSNTLM_DOMAIN_CONTROLLER |
112 | | } role; |
113 | | |
114 | | enum { |
115 | | NTLMSSP_STAGE_INIT = 0, |
116 | | NTLMSSP_STAGE_NEGOTIATE, |
117 | | NTLMSSP_STAGE_CHALLENGE, |
118 | | NTLMSSP_STAGE_AUTHENTICATE, |
119 | | NTLMSSP_STAGE_DONE |
120 | | } stage; |
121 | | |
122 | | uint8_t sec_req; |
123 | | |
124 | | char *workstation; |
125 | | |
126 | | struct ntlm_ctx *ntlm; |
127 | | struct ntlm_buffer nego_msg; |
128 | | struct ntlm_buffer chal_msg; |
129 | | struct ntlm_buffer auth_msg; |
130 | | |
131 | | struct gssntlm_name source_name; |
132 | | struct gssntlm_name target_name; |
133 | | |
134 | | uint8_t server_chal[8]; |
135 | | |
136 | | /* requested gss fags */ |
137 | | uint32_t gss_flags; |
138 | | |
139 | | /* negotiated flags */ |
140 | | uint32_t neg_flags; |
141 | | |
142 | | struct ntlm_key exported_session_key; |
143 | | struct ntlm_signseal_state crypto_state; |
144 | | |
145 | | uint32_t int_flags; |
146 | | time_t expiration_time; |
147 | | |
148 | | void *external_context; |
149 | | }; |
150 | | |
151 | | #define set_GSSERRS(min, maj) \ |
152 | 3.89k | (void)DEBUG_GSS_ERRORS((retmaj = (maj)), (retmin = (min))) |
153 | 332 | #define set_GSSERR(min) set_GSSERRS((min), GSS_S_FAILURE) |
154 | | |
155 | | static inline uint32_t gssntlmssp_ret_err(uint32_t *s, uint32_t n, uint32_t j) |
156 | 10.5k | { |
157 | 10.5k | if (!s) return GSS_S_CALL_INACCESSIBLE_WRITE; |
158 | 10.5k | *s = n; |
159 | 10.5k | return j; |
160 | 10.5k | } Unexecuted instantiation: fuzz-accept-sec-context.c:gssntlmssp_ret_err Unexecuted instantiation: gss_spi.c:gssntlmssp_ret_err gss_names.c:gssntlmssp_ret_err Line | Count | Source | 156 | 6.95k | { | 157 | 6.95k | if (!s) return GSS_S_CALL_INACCESSIBLE_WRITE; | 158 | 6.95k | *s = n; | 159 | 6.95k | return j; | 160 | 6.95k | } |
gss_creds.c:gssntlmssp_ret_err Line | Count | Source | 156 | 92 | { | 157 | 92 | if (!s) return GSS_S_CALL_INACCESSIBLE_WRITE; | 158 | 92 | *s = n; | 159 | 92 | return j; | 160 | 92 | } |
gss_sec_ctx.c:gssntlmssp_ret_err Line | Count | Source | 156 | 3.53k | { | 157 | 3.53k | if (!s) return GSS_S_CALL_INACCESSIBLE_WRITE; | 158 | 3.53k | *s = n; | 159 | 3.53k | return j; | 160 | 3.53k | } |
Unexecuted instantiation: gss_signseal.c:gssntlmssp_ret_err Unexecuted instantiation: gss_serialize.c:gssntlmssp_ret_err Unexecuted instantiation: external.c:gssntlmssp_ret_err Unexecuted instantiation: gss_auth.c:gssntlmssp_ret_err Unexecuted instantiation: gss_ntlmssp.c:gssntlmssp_ret_err Unexecuted instantiation: gss_err.c:gssntlmssp_ret_err |
161 | 5.04k | #define GSSERR() gssntlmssp_ret_err(minor_status, retmin, retmaj) |
162 | | #define GSSERRS(min, maj) \ |
163 | 5.53k | DEBUG_GSS_ERRORS((retmaj = (maj)), (retmin = (min))) ? 0 : \ |
164 | 5.53k | gssntlmssp_ret_err(minor_status, retmin, retmaj) |
165 | | |
166 | | /* Static const name attribute for sids list */ |
167 | | extern const char gssntlmssp_sids_urn[]; |
168 | | |
169 | | bool gssntlm_required_security(int security_level, struct gssntlm_ctx *ctx); |
170 | | |
171 | | void gssntlm_set_role(struct gssntlm_ctx *ctx, |
172 | | int desired, char *nb_domain_name); |
173 | | bool gssntlm_role_is_client(struct gssntlm_ctx *ctx); |
174 | | bool gssntlm_role_is_server(struct gssntlm_ctx *ctx); |
175 | | bool gssntlm_role_is_domain_member(struct gssntlm_ctx *ctx); |
176 | | |
177 | | bool gssntlm_sec_lm_ok(struct gssntlm_ctx *ctx); |
178 | | bool gssntlm_sec_ntlm_ok(struct gssntlm_ctx *ctx); |
179 | | bool gssntlm_sec_v2_ok(struct gssntlm_ctx *ctx); |
180 | | bool gssntlm_ext_sec_ok(struct gssntlm_ctx *ctx); |
181 | | |
182 | | uint32_t gssntlm_context_is_valid(struct gssntlm_ctx *ctx, |
183 | | time_t *time_now); |
184 | | |
185 | | int gssntlm_get_lm_compatibility_level(void); |
186 | | |
187 | | uint32_t gssntlm_mech_invoke(uint32_t *minor_status, |
188 | | const gss_OID desired_mech, |
189 | | const gss_OID desired_object, |
190 | | gss_buffer_t value); |
191 | | |
192 | | void gssntlm_int_release_name(struct gssntlm_name *name); |
193 | | void gssntlm_int_release_cred(struct gssntlm_cred *cred); |
194 | | |
195 | | size_t gssntlm_get_attrs_count(const struct gssntlm_name_attribute *attrs); |
196 | | int gssntlm_copy_attrs(const struct gssntlm_name_attribute *src, |
197 | | struct gssntlm_name_attribute **dst); |
198 | | struct gssntlm_name_attribute *gssntlm_find_attr( |
199 | | struct gssntlm_name_attribute *attrs, |
200 | | const char *attr_name, |
201 | | size_t attr_name_len); |
202 | | void gssntlm_release_attrs(struct gssntlm_name_attribute **attrs); |
203 | | |
204 | | int gssntlm_copy_name(struct gssntlm_name *src, struct gssntlm_name *dst); |
205 | | int gssntlm_copy_creds(struct gssntlm_cred *in, struct gssntlm_cred *out); |
206 | | |
207 | | void *external_get_context(void); |
208 | | void external_free_context(void *ctx); |
209 | | uint32_t external_netbios_get_names(void *ctx, char **computer, char **domain); |
210 | | uint32_t external_get_creds(void *ctx, |
211 | | struct gssntlm_name *name, |
212 | | struct gssntlm_cred *cred); |
213 | | uint32_t external_cli_auth(struct gssntlm_ctx *ctx, |
214 | | struct gssntlm_cred *cred, |
215 | | uint32_t in_flags, |
216 | | gss_channel_bindings_t input_chan_bindings); |
217 | | uint32_t external_srv_auth(struct gssntlm_ctx *ctx, |
218 | | struct gssntlm_cred *cred, |
219 | | struct ntlm_buffer *nt_chal_resp, |
220 | | struct ntlm_buffer *lm_chal_resp, |
221 | | struct ntlm_key *session_base_key); |
222 | | |
223 | | uint32_t netbios_get_names(void *ctx, char *computer_name, |
224 | | char **netbios_host, char **netbios_domain); |
225 | | |
226 | | bool is_ntlm_v1(struct ntlm_buffer *nt_chal_resp); |
227 | | |
228 | | uint32_t gssntlm_cli_auth(uint32_t *minor, |
229 | | struct gssntlm_ctx *ctx, |
230 | | struct gssntlm_cred *cred, |
231 | | struct ntlm_buffer *target_info, |
232 | | uint32_t in_flags, |
233 | | gss_channel_bindings_t input_chan_bindings); |
234 | | uint32_t gssntlm_srv_auth(uint32_t *minor, |
235 | | struct gssntlm_ctx *ctx, |
236 | | struct gssntlm_cred *cred, |
237 | | struct ntlm_buffer *nt_chal_resp, |
238 | | struct ntlm_buffer *lm_chal_resp, |
239 | | struct ntlm_key *key_exchange_key); |
240 | | |
241 | | extern const gss_OID_desc gssntlm_oid; |
242 | | |
243 | | uint32_t gssntlm_acquire_cred(uint32_t *minor_status, |
244 | | gss_name_t desired_name, |
245 | | uint32_t time_req, |
246 | | gss_OID_set desired_mechs, |
247 | | gss_cred_usage_t cred_usage, |
248 | | gss_cred_id_t *output_cred_handle, |
249 | | gss_OID_set *actual_mechs, |
250 | | uint32_t *time_rec); |
251 | | |
252 | | uint32_t gssntlm_acquire_cred_from(uint32_t *minor_status, |
253 | | void *external_context, |
254 | | gss_name_t desired_name, |
255 | | uint32_t time_req, |
256 | | gss_OID_set desired_mechs, |
257 | | gss_cred_usage_t cred_usage, |
258 | | gss_const_key_value_set_t cred_store, |
259 | | gss_cred_id_t *output_cred_handle, |
260 | | gss_OID_set *actual_mechs, |
261 | | uint32_t *time_rec); |
262 | | |
263 | | uint32_t gssntlm_acquire_cred_with_password(uint32_t *minor_status, |
264 | | gss_name_t desired_name, |
265 | | gss_buffer_t password, |
266 | | uint32_t time_req, |
267 | | gss_OID_set desired_mechs, |
268 | | gss_cred_usage_t cred_usage, |
269 | | gss_cred_id_t *output_cred_handle, |
270 | | gss_OID_set *actual_mechs, |
271 | | uint32_t *time_rec); |
272 | | |
273 | | uint32_t gssntlm_release_cred(uint32_t *minor_status, |
274 | | gss_cred_id_t *cred_handle); |
275 | | |
276 | | uint32_t gssntlm_import_name(uint32_t *minor_status, |
277 | | gss_buffer_t input_name_buffer, |
278 | | gss_OID input_name_type, |
279 | | gss_name_t *output_name); |
280 | | |
281 | | uint32_t gssntlm_import_name_by_mech(uint32_t *minor_status, |
282 | | gss_const_OID mech_type, |
283 | | gss_buffer_t input_name_buffer, |
284 | | gss_OID input_name_type, |
285 | | gss_name_t *output_name); |
286 | | |
287 | | uint32_t gssntlm_duplicate_name(uint32_t *minor_status, |
288 | | const gss_name_t input_name, |
289 | | gss_name_t *dest_name); |
290 | | |
291 | | uint32_t gssntlm_release_name(uint32_t *minor_status, |
292 | | gss_name_t *input_name); |
293 | | |
294 | | uint32_t gssntlm_init_sec_context(uint32_t *minor_status, |
295 | | gss_cred_id_t claimant_cred_handle, |
296 | | gss_ctx_id_t *context_handle, |
297 | | gss_name_t target_name, |
298 | | gss_OID mech_type, |
299 | | uint32_t req_flags, |
300 | | uint32_t time_req, |
301 | | gss_channel_bindings_t input_chan_bindings, |
302 | | gss_buffer_t input_token, |
303 | | gss_OID *actual_mech_type, |
304 | | gss_buffer_t output_token, |
305 | | uint32_t *ret_flags, |
306 | | uint32_t *time_rec); |
307 | | |
308 | | uint32_t gssntlm_delete_sec_context(uint32_t *minor_status, |
309 | | gss_ctx_id_t *context_handle, |
310 | | gss_buffer_t output_token); |
311 | | |
312 | | |
313 | | uint32_t gssntlm_context_time(uint32_t *minor_status, |
314 | | gss_ctx_id_t context_handle, |
315 | | uint32_t *time_rec); |
316 | | |
317 | | uint32_t gssntlm_accept_sec_context(uint32_t *minor_status, |
318 | | gss_ctx_id_t *context_handle, |
319 | | gss_cred_id_t acceptor_cred_handle, |
320 | | gss_buffer_t input_token_buffer, |
321 | | gss_channel_bindings_t input_chan_bindings, |
322 | | gss_name_t *src_name, |
323 | | gss_OID *mech_type, |
324 | | gss_buffer_t output_token, |
325 | | uint32_t *ret_flags, |
326 | | uint32_t *time_rec, |
327 | | gss_cred_id_t *delegated_cred_handle); |
328 | | |
329 | | uint32_t gssntlm_set_sec_context_option(uint32_t *minor_status, |
330 | | gss_ctx_id_t *context_handle, |
331 | | const gss_OID desired_object, |
332 | | const gss_buffer_t value); |
333 | | |
334 | | uint32_t gssntlm_inquire_sec_context_by_oid(uint32_t *minor_status, |
335 | | const gss_ctx_id_t context_handle, |
336 | | const gss_OID desired_object, |
337 | | gss_buffer_set_t *data_set); |
338 | | |
339 | | uint32_t gssntlm_get_mic(uint32_t *minor_status, |
340 | | gss_ctx_id_t context_handle, |
341 | | gss_qop_t qop_req, |
342 | | gss_buffer_t message_buffer, |
343 | | gss_buffer_t message_token); |
344 | | |
345 | | uint32_t gssntlm_verify_mic(uint32_t *minor_status, |
346 | | gss_ctx_id_t context_handle, |
347 | | gss_buffer_t message_buffer, |
348 | | gss_buffer_t message_token, |
349 | | gss_qop_t *qop_state); |
350 | | |
351 | | uint32_t gssntlm_wrap(uint32_t *minor_status, |
352 | | gss_ctx_id_t context_handle, |
353 | | int conf_req_flag, |
354 | | gss_qop_t qop_req, |
355 | | gss_buffer_t input_message_buffer, |
356 | | int *conf_state, |
357 | | gss_buffer_t output_message_buffer); |
358 | | |
359 | | uint32_t gssntlm_unwrap(uint32_t *minor_status, |
360 | | gss_ctx_id_t context_handle, |
361 | | gss_buffer_t input_message_buffer, |
362 | | gss_buffer_t output_message_buffer, |
363 | | int *conf_state, |
364 | | gss_qop_t *qop_state); |
365 | | |
366 | | uint32_t gssntlm_wrap_size_limit(uint32_t *minor_status, |
367 | | gss_ctx_id_t context_handle, |
368 | | int conf_req_flag, |
369 | | gss_qop_t qop_req, |
370 | | uint32_t req_output_size, |
371 | | uint32_t *max_input_size); |
372 | | |
373 | | uint32_t gssntlm_inquire_context(uint32_t *minor_status, |
374 | | gss_ctx_id_t context_handle, |
375 | | gss_name_t *src_name, |
376 | | gss_name_t *targ_name, |
377 | | uint32_t *lifetime_rec, |
378 | | gss_OID *mech_type, |
379 | | uint32_t *ctx_flags, |
380 | | int *locally_initiated, |
381 | | int *open); |
382 | | |
383 | | uint32_t gssntlm_display_name(uint32_t *minor_status, |
384 | | gss_name_t input_name, |
385 | | gss_buffer_t output_name_buffer, |
386 | | gss_OID *output_name_type); |
387 | | |
388 | | uint32_t gssntlm_localname(uint32_t *minor_status, |
389 | | const gss_name_t name, |
390 | | gss_const_OID mech_type, |
391 | | gss_buffer_t localname); |
392 | | |
393 | | uint32_t gssntlm_inquire_cred(uint32_t *minor_status, |
394 | | gss_cred_id_t cred_handle, |
395 | | gss_name_t *name, |
396 | | uint32_t *lifetime, |
397 | | gss_cred_usage_t *cred_usage, |
398 | | gss_OID_set *mechanisms); |
399 | | |
400 | | uint32_t gssntlm_inquire_cred_by_mech(uint32_t *minor_status, |
401 | | gss_cred_id_t cred_handle, |
402 | | gss_OID mech_type, |
403 | | gss_name_t *name, |
404 | | uint32_t *initiator_lifetime, |
405 | | uint32_t *acceptor_lifetime, |
406 | | gss_cred_usage_t *cred_usage); |
407 | | |
408 | | uint32_t gssntlm_export_sec_context(uint32_t *minor_status, |
409 | | gss_ctx_id_t *context_handle, |
410 | | gss_buffer_t interprocess_token); |
411 | | |
412 | | uint32_t gssntlm_import_sec_context(uint32_t *minor_status, |
413 | | gss_buffer_t interprocess_token, |
414 | | gss_ctx_id_t *context_handle); |
415 | | |
416 | | uint32_t gssntlm_export_cred(uint32_t *minor_status, |
417 | | gss_cred_id_t cred_handle, |
418 | | gss_buffer_t token); |
419 | | |
420 | | uint32_t gssntlm_import_cred(uint32_t *minor_status, |
421 | | gss_buffer_t token, |
422 | | gss_cred_id_t *cred_handle); |
423 | | |
424 | | |
425 | | uint32_t gssntlm_display_status(uint32_t *minor_status, |
426 | | uint32_t status_value, |
427 | | int status_type, |
428 | | gss_OID mech_type, |
429 | | uint32_t *message_context, |
430 | | gss_buffer_t status_string); |
431 | | |
432 | | uint32_t gssntlm_get_name_attribute(uint32_t *minor_status, |
433 | | gss_name_t name, |
434 | | gss_buffer_t attr, |
435 | | int *authenticated, |
436 | | int *complete, |
437 | | gss_buffer_t value, |
438 | | gss_buffer_t display_value, |
439 | | int *more); |
440 | | |
441 | | uint32_t gssntlm_inquire_name(uint32_t *minor_status, |
442 | | gss_name_t name, |
443 | | int *name_is_MN, |
444 | | gss_OID *MN_mech, |
445 | | gss_buffer_set_t *attrs); |
446 | | |
447 | | uint32_t gssntlm_inquire_saslname_for_mech(OM_uint32 *minor_status, |
448 | | const gss_OID desired_mech, |
449 | | gss_buffer_t sasl_mech_name, |
450 | | gss_buffer_t mech_name, |
451 | | gss_buffer_t mech_description); |
452 | | |
453 | | uint32_t gssntlm_inquire_mech_for_saslname(OM_uint32 *minor_status, |
454 | | const gss_buffer_t sasl_mech_name, |
455 | | gss_OID *mech_type); |
456 | | |
457 | | uint32_t gssntlm_inquire_attrs_for_mech(uint32_t *minor_status, |
458 | | gss_const_OID mech_oid, |
459 | | gss_OID_set *mech_attrs, |
460 | | gss_OID_set *known_mech_attrs); |
461 | | |
462 | | uint32_t gssntlm_set_cred_option(uint32_t *minor_status, |
463 | | gss_cred_id_t *cred_handle, |
464 | | const gss_OID desired_object, |
465 | | const gss_buffer_t value); |
466 | | #endif /* _GSS_NTLMSSP_H_ */ |