1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
23  * Use is subject to license terms.
24  */
25 
26 /*
27  * This header contains the private mechglue definitions.
28  *
29  */
30 
31 #ifndef _GSS_MECHGLUEP_H
32 #define _GSS_MECHGLUEP_H
33 
34 #if 0 /* SUNW15resync - disable for sake of non-krb5 mechs */
35 #include "autoconf.h"
36 #endif
37 
38 /* SUNW15resync */
39 #ifndef GSS_DLLIMP
40 #define GSS_DLLIMP
41 #endif
42 
43 #include <gssapi/gssapi_ext.h>   /* SUNW15resync - mechglue.h in mit 1.5 */
44 /* #include "gssapiP_generic.h" */
45 
46 #ifdef _KERNEL
47 #include <rpc/rpc.h>
48 #endif
49 
50 #ifndef g_OID_copy /* SUNW15resync */
51 #define	g_OID_copy(o1, o2)					\
52 do {								\
53 	memcpy((o1)->elements, (o2)->elements, (o2)->length);	\
54 	(o1)->length = (o2)->length;				\
55 } while (0)
56 #endif
57 
58 #define	GSS_EMPTY_BUFFER(buf)	((buf) == NULL ||\
59 	(buf)->value == NULL || (buf)->length == 0)
60 
61 /*
62  * Array of context IDs typed by mechanism OID
63  */
64 typedef struct gss_union_ctx_id_t {
65 	gss_OID			mech_type;
66 	gss_ctx_id_t		internal_ctx_id;
67 } gss_union_ctx_id_desc, *gss_union_ctx_id_t;
68 
69 /*
70  * Generic GSSAPI names.  A name can either be a generic name, or a
71  * mechanism specific name....
72  */
73 typedef struct gss_name_struct {
74 	struct gss_name_struct *loopback;
75 	gss_OID			name_type;
76 	gss_buffer_t		external_name;
77 	/*
78 	 * These last two fields are only filled in for mechanism
79 	 * names.
80 	 */
81 	gss_OID			mech_type;
82 	gss_name_t		mech_name;
83 } gss_union_name_desc, *gss_union_name_t;
84 
85 /*
86  * Structure for holding list of mechanism-specific name types
87  */
88 typedef struct gss_mech_spec_name_t {
89     gss_OID	name_type;
90     gss_OID	mech;
91     struct gss_mech_spec_name_t	*next, *prev;
92 } gss_mech_spec_name_desc, *gss_mech_spec_name;
93 
94 /*
95  * Credential auxiliary info, used in the credential structure
96  */
97 typedef struct gss_union_cred_auxinfo {
98 	gss_buffer_desc		name;
99 	gss_OID			name_type;
100 	OM_uint32		creation_time;
101 	OM_uint32		time_rec;
102 	int			cred_usage;
103 } gss_union_cred_auxinfo;
104 
105 /*
106  * Set of Credentials typed on mechanism OID
107  */
108 typedef struct gss_union_cred_t {
109 	int			count;
110 	gss_OID			mechs_array;
111 	gss_cred_id_t		*cred_array;
112 	gss_union_cred_auxinfo	auxinfo;
113 } gss_union_cred_desc, *gss_union_cred_t;
114 
115 /* Solaris Kerberos */
116 typedef	OM_uint32	    (*gss_acquire_cred_with_password_sfct)(
117 		    void *,		/* context */
118 		    OM_uint32 *,	/* minor_status */
119 		    const gss_name_t,	/* desired_name */
120 		    const gss_buffer_t, /* password */
121 		    OM_uint32,		/* time_req */
122 		    const gss_OID_set,	/* desired_mechs */
123 		    int,		/* cred_usage */
124 		    gss_cred_id_t *,	/* output_cred_handle */
125 		    gss_OID_set *,	/* actual_mechs */
126 		    OM_uint32 *		/* time_rec */
127 	/* */);
128 
129 
130 
131 /********************************************************/
132 /* The Mechanism Dispatch Table -- a mechanism needs to */
133 /* define one of these and provide a function to return */
134 /* it to initialize the GSSAPI library                  */
135 
136 /*
137  * This is the definition of the mechs_array struct, which is used to
138  * define the mechs array table. This table is used to indirectly
139  * access mechanism specific versions of the gssapi routines through
140  * the routines in the glue module (gssd_mech_glue.c)
141  *
142  * This contants all of the functions defined in gssapi.h except for
143  * gss_release_buffer() and gss_release_oid_set(), which I am
144  * assuming, for now, to be equal across mechanisms.
145  */
146 
147 typedef struct gss_config {
148 #if 0 /* Solaris Kerberos */
149     OM_uint32	    priority;
150     char *	    mechNameStr;
151 #endif
152     gss_OID_desc    mech_type;
153     void *	    context;
154 #ifdef	_KERNEL
155     struct gss_config *next;
156     bool_t	    uses_kmod;
157 #endif
158 
159 #ifndef	_KERNEL
160 	OM_uint32	    (*gss_acquire_cred)
161 	(
162 		    void *,		/* context */
163 
164 		    OM_uint32 *,	/* minor_status */
165 		    const gss_name_t,	/* desired_name */
166 		    OM_uint32,		/* time_req */
167 		    const gss_OID_set,	/* desired_mechs */
168 		    int,		/* cred_usage */
169 		    gss_cred_id_t *,	/* output_cred_handle */
170 		    gss_OID_set *,	/* actual_mechs */
171 		    OM_uint32 *		/* time_rec */
172 	/* */);
173 	OM_uint32	    (*gss_release_cred)
174 	(
175 
176 		    void *,		/* context */
177 		    OM_uint32 *,	/* minor_status */
178 		    gss_cred_id_t *	/* cred_handle */
179 	/* */);
180 	OM_uint32	    (*gss_init_sec_context)
181 	(
182 		    void *,			/* context */
183 		    OM_uint32 *,		/* minor_status */
184 		    const gss_cred_id_t,	/* claimant_cred_handle */
185 		    gss_ctx_id_t *,		/* context_handle */
186 		    const gss_name_t,		/* target_name */
187 		    const gss_OID,		/* mech_type */
188 		    OM_uint32,			/* req_flags */
189 		    OM_uint32,			/* time_req */
190 		    const gss_channel_bindings_t, /* input_chan_bindings */
191 		    const gss_buffer_t,		/* input_token */
192 		    gss_OID*,			/* actual_mech_type */
193 		    gss_buffer_t,		/* output_token */
194 		    OM_uint32 *,		/* ret_flags */
195 		    OM_uint32 *			/* time_rec */
196 	/* */);
197 	OM_uint32	    (*gss_accept_sec_context)
198 	(
199 		    void *,			/* context */
200 		    OM_uint32 *,		/* minor_status */
201 		    gss_ctx_id_t *,		/* context_handle */
202 		    const gss_cred_id_t,	/* verifier_cred_handle */
203 		    const gss_buffer_t,		/* input_token_buffer */
204 		    const gss_channel_bindings_t, /* input_chan_bindings */
205 		    gss_name_t *,		/* src_name */
206 		    gss_OID*,			/* mech_type */
207 		    gss_buffer_t,		/* output_token */
208 		    OM_uint32 *,			/* ret_flags */
209 		    OM_uint32 *,			/* time_rec */
210 		    gss_cred_id_t *		/* delegated_cred_handle */
211 	/* */);
212 /* EXPORT DELETE START */ /* CRYPT DELETE START */
213 #endif	/* ! _KERNEL */
214 
215 /*
216  * Note: there are two gss_unseal's in here. Make any changes to both.
217  */
218 	OM_uint32	    (*gss_unseal)
219 	(
220 		    void *,		/* context */
221 		    OM_uint32 *,	/* minor_status */
222 		    const gss_ctx_id_t,	/* context_handle */
223 		    const gss_buffer_t,	/* input_message_buffer */
224 		    gss_buffer_t,	/* output_message_buffer */
225 		    int *,		/* conf_state */
226 		    int *		/* qop_state */
227 #ifdef	 _KERNEL
228 	/* */, OM_uint32
229 #endif
230 	/* */);
231 #ifndef	_KERNEL
232 /* EXPORT DELETE END */ /* CRYPT DELETE END */
233 	OM_uint32	    (*gss_process_context_token)
234 	(
235 		    void *,		/* context */
236 		    OM_uint32 *,	/* minor_status */
237 		    const gss_ctx_id_t,	/* context_handle */
238 		    const gss_buffer_t	/* token_buffer */
239 	/* */);
240 #endif	/* ! _KERNEL */
241 	OM_uint32	    (*gss_delete_sec_context)
242 	(
243 		    void *,		/* context */
244 		    OM_uint32 *,	/* minor_status */
245 		    gss_ctx_id_t *,	/* context_handle */
246 		    gss_buffer_t	/* output_token */
247 #ifdef	 _KERNEL
248 	/* */, OM_uint32
249 #endif
250 	/* */);
251 #ifndef	_KERNEL
252 	OM_uint32	    (*gss_context_time)
253 	(
254 		    void *,		/* context */
255 		    OM_uint32 *,	/* minor_status */
256 		    const gss_ctx_id_t,	/* context_handle */
257 		    OM_uint32 *		/* time_rec */
258 	/* */);
259 	OM_uint32	    (*gss_display_status)
260 	(
261 		    void *,		/* context */
262 		    OM_uint32 *,	/* minor_status */
263 		    OM_uint32,		/* status_value */
264 		    int,		/* status_type */
265 		    const gss_OID,	/* mech_type */
266 		    OM_uint32 *,	/* message_context */
267 		    gss_buffer_t	/* status_string */
268 	/* */);
269 	OM_uint32	    (*gss_indicate_mechs)
270 	(
271 		    void *,		/* context */
272 		    OM_uint32 *,	/* minor_status */
273 		    gss_OID_set *	/* mech_set */
274 	/* */);
275 	OM_uint32	    (*gss_compare_name)
276 	(
277 		    void *,		/* context */
278 		    OM_uint32 *,	/* minor_status */
279 		    const gss_name_t,	/* name1 */
280 		    const gss_name_t,	/* name2 */
281 		    int *		/* name_equal */
282 	/* */);
283 	OM_uint32	    (*gss_display_name)
284 	(
285 		    void *,		/* context */
286 		    OM_uint32 *,	/* minor_status */
287 		    const gss_name_t,	/* input_name */
288 		    gss_buffer_t,	/* output_name_buffer */
289 		    gss_OID*		/* output_name_type */
290 	/* */);
291 	OM_uint32	    (*gss_import_name)
292 	(
293 		    void *,		/* context */
294 		    OM_uint32 *,	/* minor_status */
295 		    const gss_buffer_t,	/* input_name_buffer */
296 		    const gss_OID,	/* input_name_type */
297 		    gss_name_t *	/* output_name */
298 	/* */);
299 	OM_uint32	    (*gss_release_name)
300 	(
301 		    void *,		/* context */
302 		    OM_uint32 *,	/* minor_status */
303 		    gss_name_t *	/* input_name */
304 	/* */);
305 	OM_uint32	    (*gss_inquire_cred)
306 	(
307 		    void *,			/* context */
308 		    OM_uint32 *,		/* minor_status */
309 		    const gss_cred_id_t,	/* cred_handle */
310 		    gss_name_t *,		/* name */
311 		    OM_uint32 *,		/* lifetime */
312 		    int *,			/* cred_usage */
313 		    gss_OID_set *		/* mechanisms */
314 	/* */);
315 	OM_uint32	    (*gss_add_cred)
316 	(
317 		    void *,		/* context */
318 		    OM_uint32 *,	/* minor_status */
319 		    const gss_cred_id_t,	/* input_cred_handle */
320 		    const gss_name_t,	/* desired_name */
321 		    const gss_OID,	/* desired_mech */
322 		    gss_cred_usage_t,	/* cred_usage */
323 		    OM_uint32,		/* initiator_time_req */
324 		    OM_uint32,		/* acceptor_time_req */
325 		    gss_cred_id_t *,	/* output_cred_handle */
326 		    gss_OID_set *,	/* actual_mechs */
327 		    OM_uint32 *,	/* initiator_time_rec */
328 		    OM_uint32 *		/* acceptor_time_rec */
329 	/* */);
330 /* EXPORT DELETE START */ /* CRYPT DELETE START */
331 #endif	/* ! _KERNEL */
332 /*
333  * Note: there are two gss_seal's in here. Make any changes to both.
334  */
335 	OM_uint32	    (*gss_seal)
336 	(
337 		    void *,		/* context */
338 		    OM_uint32 *,	/* minor_status */
339 		    const gss_ctx_id_t,	/* context_handle */
340 		    int,		/* conf_req_flag */
341 		    int,		/* qop_req */
342 		    const gss_buffer_t,	/* input_message_buffer */
343 		    int *,		/* conf_state */
344 		    gss_buffer_t	/* output_message_buffer */
345 #ifdef	 _KERNEL
346 	/* */, OM_uint32
347 #endif
348 	/* */);
349 #ifndef	_KERNEL
350 /* EXPORT DELETE END */ /* CRYPT DELETE END */
351 	OM_uint32	    (*gss_export_sec_context)
352 	(
353 		    void *,		/* context */
354 		    OM_uint32 *,	/* minor_status */
355 		    gss_ctx_id_t *,	/* context_handle */
356 		    gss_buffer_t	/* interprocess_token */
357 	/* */);
358 #endif	/* ! _KERNEL */
359 	OM_uint32	    (*gss_import_sec_context)
360 	(
361 		    void *,		/* context */
362 		    OM_uint32 *,	/* minor_status */
363 		    const gss_buffer_t,	/* interprocess_token */
364 		    gss_ctx_id_t *	/* context_handle */
365 	/* */);
366 #ifndef	_KERNEL
367 	OM_uint32	    (*gss_inquire_cred_by_mech)
368 	(
369 		    void *,		/* context */
370 		    OM_uint32 *,	/* minor_status */
371 		    const gss_cred_id_t,	/* cred_handle */
372 		    const gss_OID,	/* mech_type */
373 		    gss_name_t *,	/* name */
374 		    OM_uint32 *,	/* initiator_lifetime */
375 		    OM_uint32 *,	/* acceptor_lifetime */
376 		    gss_cred_usage_t *	/* cred_usage */
377 	/* */);
378 	OM_uint32	    (*gss_inquire_names_for_mech)
379 	(
380 		    void *,		/* context */
381 		    OM_uint32 *,	/* minor_status */
382 		    const gss_OID,	/* mechanism */
383 		    gss_OID_set *	/* name_types */
384 	/* */);
385 	OM_uint32	(*gss_inquire_context)
386 	(
387 		    void *,		/* context */
388 		    OM_uint32 *,	/* minor_status */
389 		    const gss_ctx_id_t,	/* context_handle */
390 		    gss_name_t *,	/* src_name */
391 		    gss_name_t *,	/* targ_name */
392 		    OM_uint32 *,	/* lifetime_rec */
393 		    gss_OID *,		/* mech_type */
394 		    OM_uint32 *,	/* ctx_flags */
395 		    int *,		/* locally_initiated */
396 		    int *		/* open */
397 	/* */);
398 	OM_uint32	    (*gss_internal_release_oid)
399 	(
400 		    void *,		/* context */
401 		    OM_uint32 *,	/* minor_status */
402 		    gss_OID *		/* OID */
403 	/* */);
404 	OM_uint32		(*gss_wrap_size_limit)
405 	(
406 		    void *,		/* context */
407 		    OM_uint32 *,	/* minor_status */
408 		    const gss_ctx_id_t,	/* context_handle */
409 		    int,		/* conf_req_flag */
410 		    gss_qop_t,		/* qop_req */
411 		    OM_uint32,		/* req_output_size */
412 		    OM_uint32 *		/* max_input_size */
413 	/* */);
414 	OM_uint32		(*pname_to_uid)
415 	(
416 		    void *,		/* context */
417 		    OM_uint32 *,	/* minor_status */
418 		    const gss_name_t,	/* pname */
419 		    uid_t *		/* uid */
420 	/* */);
421 	OM_uint32		(*__gss_userok)
422 	(
423 		    void *,		/* context */
424 		    OM_uint32 *,	/* minor_status */
425 		    const gss_name_t,	/* pname */
426 		    const char *,	/* local user */
427 		    int *		/* user ok? */
428 	/* */);
429 	OM_uint32		(*gss_export_name)
430 	(
431 		void *,			/* context */
432 		OM_uint32 *,		/* minor_status */
433 		const gss_name_t,	/* input_name */
434 		gss_buffer_t		/* exported_name */
435 	/* */);
436 #endif	/* ! _KERNEL */
437 /* EXPORT DELETE START */
438 /* CRYPT DELETE START */
439 /*
440  * This block comment is Sun Proprietary: Need-To-Know.
441  * What we are doing is leaving the seal and unseal entry points
442  * in an obvious place before sign and unsign for the Domestic customer
443  * of the Solaris Source Product. The Domestic customer of the Solaris Source
444  * Product will have to deal with the problem of creating exportable libgss
445  * binaries.
446  * In the binary product that Sun builds, these entry points are elsewhere,
447  * and bracketed with special comments so that the CRYPT_SRC and EXPORT_SRC
448  * targets delete them.
449  */
450 #if 0
451 /* CRYPT DELETE END */
452 	OM_uint32	    (*gss_seal)
453 	(
454 		    void *,		/* context */
455 		    OM_uint32 *,	/* minor_status */
456 		    const gss_ctx_id_t,	/* context_handle */
457 		    int,		/* conf_req_flag */
458 		    int,		/* qop_req */
459 		    const gss_buffer_t,	/* input_message_buffer */
460 		    int *,		/* conf_state */
461 		    gss_buffer_t	/* output_message_buffer */
462 #ifdef	 _KERNEL
463 	/* */, OM_uint32
464 #endif
465 	/* */);
466 	OM_uint32	    (*gss_unseal)
467 	(
468 		    void *,		/* context */
469 		    OM_uint32 *,	/* minor_status */
470 		    const gss_ctx_id_t,	/* context_handle */
471 		    const gss_buffer_t,	/* input_message_buffer */
472 		    gss_buffer_t,	/* output_message_buffer */
473 		    int *,		/* conf_state */
474 		    int *		/* qop_state */
475 #ifdef	 _KERNEL
476 	/* */, OM_uint32
477 #endif
478 	/* */);
479 /* CRYPT DELETE START */
480 #endif /* 0 */
481 /* CRYPT DELETE END */
482 /* EXPORT DELETE END */
483 	OM_uint32	(*gss_sign)
484 	(
485 		    void *,		/* context */
486 		    OM_uint32 *,	/* minor_status */
487 		    const gss_ctx_id_t,	/* context_handle */
488 		    int,		/* qop_req */
489 		    const gss_buffer_t,	/* message_buffer */
490 		    gss_buffer_t	/* message_token */
491 #ifdef	 _KERNEL
492 	/* */, OM_uint32
493 #endif
494 	/* */);
495 	OM_uint32	(*gss_verify)
496 	(
497 		void *,			/* context */
498 		OM_uint32 *,		/* minor_status */
499 		const gss_ctx_id_t,	/* context_handle */
500 		const gss_buffer_t,	/* message_buffer */
501 		const gss_buffer_t,	/* token_buffer */
502 		int *			/* qop_state */
503 #ifdef	 _KERNEL
504 	/* */, OM_uint32
505 #endif
506 	/* */);
507 #ifndef	 _KERNEL
508 	OM_uint32	(*gss_store_cred)
509 	(
510 		void *,			/* context */
511 		OM_uint32 *,		/* minor_status */
512 		const gss_cred_id_t,	/* input_cred */
513 		gss_cred_usage_t,	/* cred_usage */
514 		const gss_OID,		/* desired_mech */
515 		OM_uint32,		/* overwrite_cred */
516 		OM_uint32,		/* default_cred */
517 		gss_OID_set *,		/* elements_stored */
518 		gss_cred_usage_t *	/* cred_usage_stored */
519 	/* */);
520 
521 	/* GGF extensions */
522 
523         OM_uint32       (*gss_inquire_sec_context_by_oid)
524         (
525 		OM_uint32 *,        /* minor_status */
526 		const gss_ctx_id_t, /* context_handle */
527 		const gss_OID,      /* OID */
528 		gss_buffer_set_t *  /* data_set */
529 	/* */);
530 
531 #endif
532 } *gss_mechanism;
533 
534 
535 
536 #ifndef _KERNEL
537 /* This structure MUST NOT be used by any code outside libgss */
538 typedef struct gss_config_ext {
539 	gss_acquire_cred_with_password_sfct	gss_acquire_cred_with_password;
540 } *gss_mechanism_ext;
541 #endif /* _KERNEL */
542 
543 
544 /*
545  * In the user space we use a wrapper structure to encompass the
546  * mechanism entry points.  The wrapper contain the mechanism
547  * entry points and other data which is only relevant to the gss-api
548  * layer.  In the kernel we use only the gss_config strucutre because
549  * the kernal does not cantain any of the extra gss-api specific data.
550  */
551 typedef struct gss_mech_config {
552 	char *kmodName;			/* kernel module name */
553 	char *uLibName;			/* user library name */
554 	char *mechNameStr;		/* mechanism string name */
555 	char *optionStr;		/* optional mech parameters */
556 	void *dl_handle;		/* RTLD object handle for the mech */
557 	gss_OID mech_type;		/* mechanism oid */
558 	gss_mechanism mech;		/* mechanism initialization struct */
559 #ifndef _KERNEL
560 	gss_mechanism_ext mech_ext;	/* Solaris extensions */
561 #endif /* _KERNEL */
562 	struct gss_mech_config *next;	/* next element in the list */
563 } *gss_mech_info;
564 
565 /********************************************************/
566 /* Internal mechglue routines */
567 
568 /* SUNW15resync - Solaris versions - replace w/mit ones? */
569 gss_mechanism __gss_get_mechanism(const gss_OID);
570 #ifndef _KERNEL
571 gss_mechanism_ext __gss_get_mechanism_ext(const gss_OID);
572 #endif /* _KERNEL */
573 char *__gss_get_kmodName(const gss_OID);
574 char *__gss_get_modOptions(const gss_OID);
575 OM_uint32 __gss_import_internal_name(OM_uint32 *, const gss_OID,
576  	gss_union_name_t, gss_name_t *);
577 OM_uint32 __gss_export_internal_name(OM_uint32 *, const gss_OID,
578 	const gss_name_t, gss_buffer_t);
579 OM_uint32 __gss_display_internal_name(OM_uint32 *, const gss_OID,
580 	const gss_name_t, gss_buffer_t, gss_OID *);
581 OM_uint32 __gss_release_internal_name(OM_uint32 *, const gss_OID,
582 	gss_name_t *);
583 OM_uint32 __gss_convert_name_to_union_name(
584 	OM_uint32 *,		/* minor_status */
585 	gss_mechanism,	/* mech */
586 	gss_name_t,		/* internal_name */
587 	gss_name_t *		/* external_name */
588 );
589 
590  gss_cred_id_t __gss_get_mechanism_cred(
591 	const gss_union_cred_t,	/* union_cred */
592 	const gss_OID		/* mech_type */
593 );
594 
595 
596 
597 
598 
599 int gssint_mechglue_init(void);
600 void gssint_mechglue_fini(void);
601 
602 gss_mechanism gssint_get_mechanism (gss_OID);
603 OM_uint32 gssint_get_mech_type (gss_OID, gss_buffer_t);
604 char *gssint_get_kmodName(const gss_OID);
605 char *gssint_get_modOptions(const gss_OID);
606 OM_uint32 gssint_import_internal_name (OM_uint32 *, gss_OID, gss_union_name_t,
607 				      gss_name_t *);
608 OM_uint32 gssint_export_internal_name(OM_uint32 *, const gss_OID,
609 	const gss_name_t, gss_buffer_t);
610 OM_uint32 gssint_display_internal_name (OM_uint32 *, gss_OID, gss_name_t,
611 				       gss_buffer_t, gss_OID *);
612 OM_uint32 gssint_release_internal_name (OM_uint32 *, gss_OID, gss_name_t *);
613 
614 OM_uint32 gssint_convert_name_to_union_name
615 	  (OM_uint32 *,		/* minor_status */
616 	   gss_mechanism,	/* mech */
617 	   gss_name_t,		/* internal_name */
618 	   gss_name_t *		/* external_name */
619 	   );
620 gss_cred_id_t gssint_get_mechanism_cred
621 	  (gss_union_cred_t,	/* union_cred */
622 	   gss_OID		/* mech_type */
623 	   );
624 
625 OM_uint32 gssint_create_copy_buffer(
626 	const gss_buffer_t,	/* src buffer */
627 	gss_buffer_t *,		/* destination buffer */
628 	int			/* NULL terminate buffer ? */
629 );
630 
631 
632 OM_uint32 gssint_copy_oid_set(
633 	OM_uint32 *,			/* minor_status */
634 	const gss_OID_set_desc *,	/* oid set */
635 	gss_OID_set *			/* new oid set */
636 );
637 
638 /* SUNW15resync - for old Solaris version in libgss */
639 OM_uint32 gss_copy_oid_set(
640 	OM_uint32 *,			/* minor_status */
641 	const gss_OID_set_desc *,	/* oid set */
642 	gss_OID_set *			/* new oid set */
643 );
644 
645 
646 gss_OID gss_find_mechanism_from_name_type (gss_OID); /* name_type */
647 
648 OM_uint32 gss_add_mech_name_type
649 	   (OM_uint32 *,	/* minor_status */
650 	    gss_OID,		/* name_type */
651 	    gss_OID		/* mech */
652 	       );
653 
654 /*
655  * Sun extensions to GSS-API v2
656  */
657 
658 OM_uint32
659 gssint_mech_to_oid(
660 	const char *mech,		/* mechanism string name */
661 	gss_OID *oid			/* mechanism oid */
662 );
663 
664 const char *
665 gssint_oid_to_mech(
666 	const gss_OID oid		/* mechanism oid */
667 );
668 
669 OM_uint32
670 gssint_get_mechanisms(
671 	char *mechArray[],		/* array to populate with mechs */
672 	int arrayLen			/* length of passed in array */
673 );
674 
675 OM_uint32
676 gss_store_cred(
677 	OM_uint32 *,		/* minor_status */
678 	const gss_cred_id_t,	/* input_cred_handle */
679 	gss_cred_usage_t,	/* cred_usage */
680 	const gss_OID,		/* desired_mech */
681 	OM_uint32,		/* overwrite_cred */
682 	OM_uint32,		/* default_cred */
683 	gss_OID_set *,		/* elements_stored */
684 	gss_cred_usage_t *	/* cred_usage_stored */
685 );
686 
687 int
688 gssint_get_der_length(
689 	unsigned char **,	/* buf */
690 	unsigned int,		/* buf_len */
691 	unsigned int *		/* bytes */
692 );
693 
694 unsigned int
695 gssint_der_length_size(unsigned int /* len */);
696 
697 int
698 gssint_put_der_length(
699 	unsigned int,		/* length */
700 	unsigned char **,	/* buf */
701 	unsigned int		/* max_len */
702 );
703 
704 
705 
706 /* Solaris kernel and gssd support */
707 
708 /*
709  * derived types for passing context and credential handles
710  * between gssd and kernel
711  */
712 typedef unsigned int gssd_ctx_id_t;
713 typedef unsigned int gssd_cred_id_t;
714 
715 #ifdef	_KERNEL
716 
717 #ifndef	_KRB5_H
718 /* These macros are defined for Kerberos in krb5.h, and have priority */
719 #define	MALLOC(n) kmem_alloc((n), KM_SLEEP)
720 #define	FREE(x, n) kmem_free((x), (n))
721 #endif	/* _KRB5_H */
722 
723 gss_mechanism __kgss_get_mechanism(gss_OID);
724 void __kgss_add_mechanism(gss_mechanism);
725 #endif /* _KERNEL */
726 
727 struct	kgss_cred {
728 	gssd_cred_id_t	gssd_cred;
729 	OM_uint32	gssd_cred_verifier;
730 };
731 
732 #define	KCRED_TO_KGSS_CRED(cred)	((struct kgss_cred *)(cred))
733 #define	KCRED_TO_CRED(cred)	(KCRED_TO_KGSS_CRED(cred)->gssd_cred)
734 #define	KCRED_TO_CREDV(cred)    (KCRED_TO_KGSS_CRED(cred)->gssd_cred_verifier)
735 
736 struct	kgss_ctx {
737 	gssd_ctx_id_t	gssd_ctx;
738 #ifdef _KERNEL
739 	gss_ctx_id_t	gssd_i_ctx;
740 	bool_t		ctx_imported;
741 	gss_mechanism	mech;
742 #endif /* _KERNEL */
743 	OM_uint32	gssd_ctx_verifier;
744 };
745 
746 #define	KCTX_TO_KGSS_CTX(ctx)	((struct kgss_ctx *)(ctx))
747 #define	KCTX_TO_CTX_IMPORTED(ctx)	(KCTX_TO_KGSS_CTX(ctx)->ctx_imported)
748 #define	KCTX_TO_GSSD_CTX(ctx)	(KCTX_TO_KGSS_CTX(ctx)->gssd_ctx)
749 #define	KCTX_TO_CTXV(ctx)	(KCTX_TO_KGSS_CTX(ctx)->gssd_ctx_verifier)
750 #define	KCTX_TO_MECH(ctx)	(KCTX_TO_KGSS_CTX(ctx)->mech)
751 #define	KCTX_TO_PRIVATE(ctx)	(KCTX_TO_MECH(ctx)->context)
752 #define	KGSS_CTX_TO_GSSD_CTX(ctx)	\
753 	(((ctx) == GSS_C_NO_CONTEXT) ? (gssd_ctx_id_t)(uintptr_t)(ctx) : \
754 	KCTX_TO_GSSD_CTX(ctx))
755 #define	KGSS_CTX_TO_GSSD_CTXV(ctx)	\
756 	(((ctx) == GSS_C_NO_CONTEXT) ? (NULL) : KCTX_TO_CTXV(ctx))
757 
758 #ifdef _KERNEL
759 #define	KCTX_TO_I_CTX(ctx)	(KCTX_TO_KGSS_CTX(ctx)->gssd_i_ctx)
760 #define	KCTX_TO_CTX(ctx) \
761 ((KCTX_TO_CTX_IMPORTED(ctx) == FALSE) ? (ctx) : \
762 	KCTX_TO_I_CTX(ctx))
763 #define	KGSS_CRED_ALLOC()	kmem_zalloc(sizeof (struct kgss_cred), \
764 	KM_SLEEP)
765 #define	KGSS_CRED_FREE(cred)	kmem_free(cred, sizeof (struct kgss_cred))
766 
767 #define	KGSS_ALLOC()	kmem_zalloc(sizeof (struct kgss_ctx), KM_SLEEP)
768 #define	KGSS_FREE(ctx)	kmem_free(ctx, sizeof (struct kgss_ctx))
769 
770 #define	KGSS_SIGN(minor_st, ctx, qop, msg, tkn)	\
771 	(*(KCTX_TO_MECH(ctx)->gss_sign))(KCTX_TO_PRIVATE(ctx), minor_st, \
772 		KCTX_TO_CTX(ctx), qop, msg, tkn, KCTX_TO_CTXV(ctx))
773 
774 #define	KGSS_VERIFY(minor_st, ctx, msg, tkn, qop)	\
775 	(*(KCTX_TO_MECH(ctx)->gss_verify))(KCTX_TO_PRIVATE(ctx), minor_st,\
776 		KCTX_TO_CTX(ctx), msg, tkn, qop,  KCTX_TO_CTXV(ctx))
777 
778 #define	KGSS_DELETE_SEC_CONTEXT(minor_st, ctx, int_ctx_id,  tkn)	\
779 	(*(KCTX_TO_MECH(ctx)->gss_delete_sec_context))(KCTX_TO_PRIVATE(ctx),\
780 		minor_st, int_ctx_id, tkn, KCTX_TO_CTXV(ctx))
781 
782 #define	KGSS_IMPORT_SEC_CONTEXT(minor_st, tkn, ctx, int_ctx_id)	\
783 	(*(KCTX_TO_MECH(ctx)->gss_import_sec_context))(KCTX_TO_PRIVATE(ctx),\
784 		minor_st, tkn, int_ctx_id)
785 
786 /* EXPORT DELETE START */
787 #define	KGSS_SEAL(minor_st, ctx, conf_req, qop, msg, conf_state, tkn) \
788 	(*(KCTX_TO_MECH(ctx)->gss_seal))(KCTX_TO_PRIVATE(ctx), minor_st, \
789 		KCTX_TO_CTX(ctx), conf_req, qop, msg, conf_state, tkn,\
790 		KCTX_TO_CTXV(ctx))
791 
792 #define	KGSS_UNSEAL(minor_st, ctx, msg, tkn, conf, qop)	\
793 	(*(KCTX_TO_MECH(ctx)->gss_unseal))(KCTX_TO_PRIVATE(ctx), minor_st,\
794 		KCTX_TO_CTX(ctx), msg, tkn, conf, qop, \
795 		KCTX_TO_CTXV(ctx))
796 
797 /* EXPORT DELETE END */
798 
799 #define KGSS_INIT_CONTEXT(ctx) krb5_init_context(ctx)
800 #define KGSS_RELEASE_OID(minor_st, oid) krb5_gss_release_oid(minor_st, oid)
801 extern OM_uint32 kgss_release_oid(OM_uint32 *, gss_OID *);
802 
803 #else /* !_KERNEL */
804 
805 #define KGSS_INIT_CONTEXT(ctx) krb5_gss_init_context(ctx)
806 #define KGSS_RELEASE_OID(minor_st, oid) gss_release_oid(minor_st, oid)
807 
808 #define	KCTX_TO_CTX(ctx)  (KCTX_TO_KGSS_CTX(ctx)->gssd_ctx)
809 #define	MALLOC(n) malloc(n)
810 #define	FREE(x, n) free(x)
811 #define	KGSS_CRED_ALLOC()	(struct kgss_cred *) \
812 		MALLOC(sizeof (struct kgss_cred))
813 #define	KGSS_CRED_FREE(cred)	free(cred)
814 #define	KGSS_ALLOC()	(struct kgss_ctx *)MALLOC(sizeof (struct kgss_ctx))
815 #define	KGSS_FREE(ctx)	free(ctx)
816 
817 #define	KGSS_SIGN(minor_st, ctx, qop, msg, tkn)	\
818 	kgss_sign_wrapped(minor_st, \
819 		KCTX_TO_CTX(ctx), qop, msg, tkn, KCTX_TO_CTXV(ctx))
820 
821 #define	KGSS_VERIFY(minor_st, ctx, msg, tkn, qop)	\
822 	kgss_verify_wrapped(minor_st,\
823 		KCTX_TO_CTX(ctx), msg, tkn, qop, KCTX_TO_CTXV(ctx))
824 
825 #define	KGSS_SEAL(minor_st, ctx, conf_req, qop, msg, conf_state, tkn) \
826 	kgss_seal_wrapped(minor_st, \
827 		KCTX_TO_CTX(ctx), conf_req, qop, msg, conf_state, tkn, \
828 		KCTX_TO_CTXV(ctx))
829 
830 #define	KGSS_UNSEAL(minor_st, ctx, msg, tkn, conf, qop)	\
831 	kgss_unseal_wrapped(minor_st,\
832 		KCTX_TO_CTX(ctx), msg, tkn, conf, qop,  \
833 		KCTX_TO_CTXV(ctx))
834 #endif /* _KERNEL */
835 
836 /* SUNW15resync - moved from gssapiP_generic.h for sake of non-krb5 mechs */
837 OM_uint32 generic_gss_release_buffer
838 (OM_uint32*,       /* minor_status */
839             gss_buffer_t      /* buffer */
840            );
841 
842 OM_uint32 generic_gss_release_oid_set
843 (OM_uint32*,       /* minor_status */
844             gss_OID_set*      /* set */
845            );
846 
847 OM_uint32 generic_gss_release_oid
848 (OM_uint32*,       /* minor_status */
849             gss_OID*         /* set */
850            );
851 
852 OM_uint32 generic_gss_copy_oid
853 (OM_uint32 *,	/* minor_status */
854             gss_OID_desc * const,   /* oid */ /* SUNW15resync */
855 	    gss_OID *		/* new_oid */
856 	    );
857 
858 OM_uint32 generic_gss_create_empty_oid_set
859 (OM_uint32 *,	/* minor_status */
860 	    gss_OID_set *	/* oid_set */
861 	   );
862 
863 OM_uint32 generic_gss_add_oid_set_member
864 (OM_uint32 *,	/* minor_status */
865 	    gss_OID_desc * const,		/* member_oid */
866 	    gss_OID_set *	/* oid_set */
867 	   );
868 
869 OM_uint32 generic_gss_test_oid_set_member
870 (OM_uint32 *,	/* minor_status */
871 	    gss_OID_desc * const,		/* member */
872 	    gss_OID_set,	/* set */
873 	    int *		/* present */
874 	   );
875 
876 OM_uint32 generic_gss_oid_to_str
877 (OM_uint32 *,	/* minor_status */
878 	    gss_OID_desc * const,		/* oid */
879 	    gss_buffer_t	/* oid_str */
880 	   );
881 
882 OM_uint32 generic_gss_str_to_oid
883 (OM_uint32 *,	/* minor_status */
884 	    gss_buffer_t,	/* oid_str */
885 	    gss_OID *		/* oid */
886 	   );
887 
888 OM_uint32
889 generic_gss_oid_compose(
890     OM_uint32 *,        /* minor_status */
891     const char *,       /* prefix */
892     size_t,             /* prefix_len */
893     int,                /* suffix */
894     gss_OID_desc *);    /* oid */
895 
896 OM_uint32
897 generic_gss_oid_decompose(
898     OM_uint32 *,        /* minor_status */
899     const char *,       /*prefix */
900     size_t,             /* prefix_len */
901     gss_OID_desc *,     /* oid */
902     int *);             /* suffix */
903 
904 OM_uint32 generic_gss_create_empty_buffer_set
905 (OM_uint32 * /*minor_status*/,
906             gss_buffer_set_t * /*buffer_set*/);
907 
908 OM_uint32 generic_gss_add_buffer_set_member
909 (OM_uint32 * /*minor_status*/,
910             const gss_buffer_t /*member_buffer*/,
911             gss_buffer_set_t * /*buffer_set*/);
912 
913 OM_uint32 generic_gss_release_buffer_set
914 (OM_uint32 * /*minor_status*/,
915             gss_buffer_set_t * /*buffer_set*/);
916 
917 /*
918  * SUNW17PACresync
919  * New map error API in MIT 1.7, at build time generates code for errors.
920  * Solaris does not gen the errors at build time so we just stub these
921  * for now, need to revisit.
922  * See mglueP.h and util_errmap.c in MIT 1.7.
923 */
924 #ifdef _KERNEL
925 
926 #define map_error(MINORP, MECH)
927 #define map_errcode(MINORP)
928 
929 #else  /* _KERNEL */
930 
931 #include <syslog.h>
932 
933 #define map_error(MINORP, MECH)				\
934 	(void) syslog(LOG_AUTH|LOG_DEBUG,		\
935 		    "map_error: minor status=%x",	\
936 		    (MINORP) ? *(MINORP) : 0xffffffff)
937 #define map_errcode(MINORP) \
938 	(void) syslog(LOG_AUTH|LOG_DEBUG,		\
939 		    "map_errcode: minor status=%x",	\
940 		    (MINORP) ? *(MINORP) : 0xffffffff)
941 #endif /* _KERNEL */
942 
943 #endif /* _GSS_MECHGLUEP_H */
944