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, Version 1.0 only
6 * (the "License").  You may not use this file except in compliance
7 * with the License.
8 *
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
13 *
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
19 *
20 * CDDL HEADER END
21 */
22/*
23 * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27#pragma ident	"%Z%%M%	%I%	%E% SMI"
28
29#include "dh_gssapi.h"
30#include <stdlib.h>
31
32/*
33 * gss_config structure for Diffie-Hellman family of mechanisms.
34 * This structure is defined in mechglueP.h and defines the entry points
35 * that libgss uses to call a backend.
36 */
37static struct gss_config dh_mechanism = {
38	{0, 0},				/* OID for mech type. */
39	0,
40	__dh_gss_acquire_cred,
41	__dh_gss_release_cred,
42	__dh_gss_init_sec_context,
43	__dh_gss_accept_sec_context,
44/* EXPORT DELETE START */ /* CRYPT DELETE START */
45	__dh_gss_unseal,
46/* EXPORT DELETE END */ /* CRYPT DELETE END */
47	__dh_gss_process_context_token,
48	__dh_gss_delete_sec_context,
49	__dh_gss_context_time,
50	__dh_gss_display_status,
51	NULL, /* Back ends don't implement this */
52	__dh_gss_compare_name,
53	__dh_gss_display_name,
54	__dh_gss_import_name,
55	__dh_gss_release_name,
56	__dh_gss_inquire_cred,
57	NULL, /* Back ends don't implement this */
58/* EXPORT DELETE START */ /* CRYPT DELETE START */
59	__dh_gss_seal,
60/* EXPORT DELETE END */ /* CRYPT DELETE END */
61	__dh_gss_export_sec_context,
62	__dh_gss_import_sec_context,
63	__dh_gss_inquire_cred_by_mech,
64	__dh_gss_inquire_names_for_mech,
65	__dh_gss_inquire_context,
66	__dh_gss_internal_release_oid,
67	__dh_gss_wrap_size_limit,
68	__dh_pname_to_uid,
69	NULL,  /* __gss_userok */
70	__dh_gss_export_name,
71/* EXPORT DELETE START */
72/* CRYPT DELETE START */
73/*
74 * This block comment is Sun Proprietary: Need-To-Know.
75 * What we are doing is leaving the seal and unseal entry points
76 * in an obvious place before sign and unsign for the Domestic customer
77 * of the Solaris Source Product. The Domestic customer of the Solaris Source
78 * Product will have to deal with the problem of creating exportable libgss
79 * binaries.
80 * In the binary product that Sun builds, these entry points are elsewhere,
81 * and bracketed with special comments so that the CRYPT_SRC and EXPORT_SRC
82 * targets delete them.
83 */
84#if 0
85/* CRYPT DELETE END */
86	__dh_gss_seal,
87	__dh_gss_unseal,
88/* CRYPT DELETE START */
89#endif /* 0 */
90/* CRYPT DELETE END */
91/* EXPORT DELETE END */
92	__dh_gss_sign,
93	__dh_gss_verify,
94	NULL, /* gss_store_cred() -- DH lacks this for now */
95};
96
97/*
98 * __dh_gss_initialize:
99 * Each mechanism in the Diffie-Hellman family of mechanisms calls this
100 * routine passing a pointer to a gss_config structure. This routine will
101 * then check that the mech is not already initialized (If so just return
102 * the mech). It will then assign the entry points that are common to the
103 * mechanism family to the uninitialized mech. After which, it allocate space
104 * for that mechanism's context. It will be up to the caller to fill in
105 * its mechanism OID and fill in the corresponding fields in mechanism
106 * specific context.
107 */
108gss_mechanism
109__dh_gss_initialize(gss_mechanism mech)
110{
111	if (mech->context != NULL)
112		return (mech);    /* already initialized */
113
114	/* Copy the common entry points for this mechcanisms */
115	*mech = dh_mechanism;
116
117	/* Allocate space for this mechanism's context */
118	mech->context = New(dh_context_desc, 1);
119	if (mech->context == NULL)
120		return (NULL);
121
122	/* return the mech */
123	return (mech);
124}
125