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