Coverage Report

Created: 2026-06-30 06:21

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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_ */