1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
|
/*
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _GSSAPIP_SPNEGO_H_
#define _GSSAPIP_SPNEGO_H_
/* #pragma ident "@(#)gssapiP_spnego.h 1.3 03/09/18 SMI" */
#ifdef __cplusplus
extern "C" {
#endif
#include <gssapi/gssapi.h>
#include <syslog.h>
#define SEC_CONTEXT_TOKEN 1
#define SPNEGO_SIZE_OF_INT 4
#define ACCEPT_COMPLETE 0
#define ACCEPT_INCOMPLETE 1
#define REJECT 2
#define REQUEST_MIC 3
#define ACCEPT_DEFECTIVE_TOKEN 0xffffffffUL
/*
* constants for der encoding/decoding routines.
*/
#define MECH_OID 0x06
#define OCTET_STRING 0x04
#define CONTEXT 0xa0
#define SEQUENCE 0x30
#define SEQUENCE_OF 0x30
#define BIT_STRING 0x03
#define BIT_STRING_LENGTH 0x02
#define BIT_STRING_PADDING 0x01
#define ENUMERATED 0x0a
#define ENUMERATION_LENGTH 1
#define HEADER_ID 0x60
/*
* SPNEGO specific error codes (minor status codes)
*/
#define ERR_SPNEGO_NO_MECHS_AVAILABLE 0x20000001
#define ERR_SPNEGO_NO_CREDS_ACQUIRED 0x20000002
#define ERR_SPNEGO_NO_MECH_FROM_ACCEPTOR 0x20000003
#define ERR_SPNEGO_NEGOTIATION_FAILED 0x20000004
#define ERR_SPNEGO_NO_TOKEN_FROM_ACCEPTOR 0x20000005
/*
* send_token_flag is used to indicate in later steps what type
* of token, if any should be sent or processed.
* NO_TOKEN_SEND = no token should be sent
* INIT_TOKEN_SEND = initial token will be sent
* CONT_TOKEN_SEND = continuing tokens to be sent
* CHECK_MIC = no token to be sent, but have a MIC to check.
* ERROR_TOKEN_SEND = error token from peer needs to be sent.
*/
typedef enum {NO_TOKEN_SEND, INIT_TOKEN_SEND, CONT_TOKEN_SEND,
CHECK_MIC, ERROR_TOKEN_SEND} send_token_flag;
/*
* The Mech OID:
* { iso(1) org(3) dod(6) internet(1) security(5)
* mechanism(5) spnego(2) }
*/
#define SPNEGO_OID_LENGTH 6
#define SPNEGO_OID "\053\006\001\005\005\002"
typedef void *spnego_token_t;
/* spnego name structure for internal representation. */
typedef struct {
gss_OID type;
gss_buffer_t buffer;
gss_OID mech_type;
gss_name_t mech_name;
} spnego_name_desc, *spnego_name_t;
/* Structure for context handle */
typedef struct {
OM_uint32 magic_num;
gss_buffer_desc DER_mechTypes;
gss_OID internal_mech;
gss_ctx_id_t ctx_handle;
char *optionStr;
gss_cred_id_t default_cred;
int mic_reqd;
int mic_sent;
int mic_rcvd;
int firstpass;
int mech_complete;
int nego_done;
OM_uint32 ctx_flags;
gss_name_t internal_name;
gss_OID actual_mech;
} spnego_gss_ctx_id_rec, *spnego_gss_ctx_id_t;
/*
* The magic number must be less than a standard pagesize
* to avoid a possible collision with a real address.
*/
#define SPNEGO_MAGIC_ID 0x00000fed
/* SPNEGO oid structure */
static const gss_OID_desc spnego_oids[] = {
{SPNEGO_OID_LENGTH, SPNEGO_OID},
};
const gss_OID_desc * const gss_mech_spnego = spnego_oids+0;
static const gss_OID_set_desc spnego_oidsets[] = {
{1, (gss_OID) spnego_oids+0},
};
const gss_OID_set_desc * const gss_mech_set_spnego = spnego_oidsets+0;
#ifdef DEBUG
#define dsyslog(a) syslog(LOG_DEBUG, a)
#else
#define dsyslog(a)
#define SPNEGO_STATIC
#endif /* DEBUG */
/*
* declarations of internal name mechanism functions
*/
OM_uint32 spnego_gss_acquire_cred
(
void *, /* spnego context */
OM_uint32 *, /* minor_status */
gss_name_t, /* desired_name */
OM_uint32, /* time_req */
gss_OID_set, /* desired_mechs */
gss_cred_usage_t, /* cred_usage */
gss_cred_id_t *, /* output_cred_handle */
gss_OID_set *, /* actual_mechs */
OM_uint32 * /* time_rec */
);
OM_uint32 spnego_gss_release_cred
(
void *, /* spnego context */
OM_uint32 *, /* minor_status */
/* CSTYLED */
gss_cred_id_t * /* cred_handle */
);
OM_uint32 spnego_gss_init_sec_context
(
void *, /* spnego context */
OM_uint32 *, /* minor_status */
gss_cred_id_t, /* claimant_cred_handle */
gss_ctx_id_t *, /* context_handle */
gss_name_t, /* target_name */
gss_OID, /* mech_type */
OM_uint32, /* req_flags */
OM_uint32, /* time_req */
gss_channel_bindings_t, /* input_chan_bindings */
gss_buffer_t, /* input_token */
gss_OID *, /* actual_mech_type */
gss_buffer_t, /* output_token */
OM_uint32 *, /* ret_flags */
OM_uint32 * /* time_rec */
);
OM_uint32 spnego_gss_accept_sec_context
(
void *, /* spnego context */
OM_uint32 *, /* minor_status */
gss_ctx_id_t *, /* context_handle */
gss_cred_id_t, /* verifier_cred_handle */
gss_buffer_t, /* input_token_buffer */
gss_channel_bindings_t, /* input_chan_bindings */
gss_name_t *, /* src_name */
gss_OID *, /* mech_type */
gss_buffer_t, /* output_token */
OM_uint32 *, /* ret_flags */
OM_uint32 *, /* time_rec */
/* CSTYLED */
gss_cred_id_t * /* delegated_cred_handle */
);
OM_uint32 spnego_gss_display_name
(
void *,
OM_uint32 *, /* minor_status */
gss_name_t, /* input_name */
gss_buffer_t, /* output_name_buffer */
gss_OID * /* output_name_type */
);
OM_uint32 spnego_gss_display_status
(
void *, /* spnego context */
OM_uint32 *, /* minor_status */
OM_uint32, /* status_value */
int, /* status_type */
gss_OID, /* mech_type */
OM_uint32 *, /* message_context */
gss_buffer_t /* status_string */
);
OM_uint32 spnego_gss_import_name
(
void *, /* spnego context */
OM_uint32 *, /* minor_status */
gss_buffer_t, /* input_name_buffer */
gss_OID, /* input_name_type */
/* CSTYLED */
gss_name_t * /* output_name */
);
OM_uint32 spnego_gss_release_name
(
void *, /* spnego context */
OM_uint32 *, /* minor_status */
/* CSTYLED */
gss_name_t * /* input_name */
);
OM_uint32 spnego_gss_inquire_names_for_mech
(
void *, /* spnego context */
OM_uint32 *, /* minor_status */
gss_OID, /* mechanism */
gss_OID_set * /* name_types */
);
OM_uint32 spnego_gss_unseal
(
void *context,
OM_uint32 *minor_status,
gss_ctx_id_t context_handle,
gss_buffer_t input_message_buffer,
gss_buffer_t output_message_buffer,
int *conf_state,
int *qop_state
);
OM_uint32 spnego_gss_seal
(
void *context,
OM_uint32 *minor_status,
gss_ctx_id_t context_handle,
int conf_req_flag,
int qop_req,
gss_buffer_t input_message_buffer,
int *conf_state,
gss_buffer_t output_message_buffer
);
OM_uint32 spnego_gss_process_context_token
(
void *context,
OM_uint32 *minor_status,
const gss_ctx_id_t context_handle,
const gss_buffer_t token_buffer
);
OM_uint32 spnego_gss_delete_sec_context
(
void *context,
OM_uint32 *minor_status,
gss_ctx_id_t *context_handle,
gss_buffer_t output_token
);
OM_uint32 spnego_gss_context_time
(
void *context,
OM_uint32 *minor_status,
const gss_ctx_id_t context_handle,
OM_uint32 *time_rec
);
OM_uint32 spnego_gss_export_sec_context
(
void *context,
OM_uint32 *minor_status,
gss_ctx_id_t *context_handle,
gss_buffer_t interprocess_token
);
OM_uint32 spnego_gss_import_sec_context
(
void *context,
OM_uint32 *minor_status,
const gss_buffer_t interprocess_token,
gss_ctx_id_t *context_handle
);
OM_uint32 spnego_gss_inquire_context
(
void *context,
OM_uint32 *minor_status,
const gss_ctx_id_t context_handle,
gss_name_t *src_name,
gss_name_t *targ_name,
OM_uint32 *lifetime_rec,
gss_OID *mech_type,
OM_uint32 *ctx_flags,
int *locally_initiated,
int *open
);
OM_uint32 spnego_gss_wrap_size_limit
(
void *context,
OM_uint32 *minor_status,
const gss_ctx_id_t context_handle,
int conf_req_flag,
gss_qop_t qop_req,
OM_uint32 req_output_size,
OM_uint32 *max_input_size
);
OM_uint32 spnego_gss_sign
(
void *context,
OM_uint32 *minor_status,
const gss_ctx_id_t context_handle,
int qop_req,
const gss_buffer_t message_buffer,
gss_buffer_t message_token
);
OM_uint32 spnego_gss_verify
(
void *context,
OM_uint32 *minor_status,
const gss_ctx_id_t context_handle,
const gss_buffer_t msg_buffer,
const gss_buffer_t token_buffer,
int *qop_state
);
#ifdef __cplusplus
}
#endif
#endif /* _GSSAPIP_SPNEGO_H_ */
|