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 #include <stdlib.h>
28 #include <stdio.h>
29 #include <dlfcn.h>
30
31 #include "dh_gssapi.h"
32 #include "dh_common.h"
33
34 #define MECH_LIB_PREFIX1 "/usr/lib/"
35
36 /*
37 * This #ifdef mess figures out if we are to be compiled into an
38 * lp64 binary for the purposes of figuring the absolute location
39 * of gss-api mechanism modules.
40 */
41 #ifdef _LP64
42
43 #ifdef __sparc
44
45 #define MECH_LIB_PREFIX2 "sparcv9/"
46
47 #elif defined(__amd64)
48
49 #define MECH_LIB_PREFIX2 "amd64/"
50
51 #else /* __sparc */
52
53 you need to define where under /usr the LP64 libraries live for this platform
54
55 #endif /* __sparc */
56
57 #else /* _LP64 */
58
59 #define MECH_LIB_PREFIX2 ""
60
61 #endif /* _LP64 */
62
63 #define MECH_LIB_DIR "gss/"
64
65 #define MECH_LIB_PREFIX MECH_LIB_PREFIX1 MECH_LIB_PREFIX2 MECH_LIB_DIR
66
67 #define DH_MECH_BACKEND "mech_dh.so.1"
68
69 #define DH_MECH_BACKEND_PATH MECH_LIB_PREFIX DH_MECH_BACKEND
70
71 static char *DHLIB = DH_MECH_BACKEND_PATH;
72
73 #ifndef DH_MECH_SYM
74 #define DH_MECH_SYM "__dh_gss_initialize"
75 #endif
76
77 /*
78 * __dh_generic_initialize: This routine is called from the mechanism
79 * specific gss_mech_initialize routine, which in turn is called from
80 * libgss to initialize a mechanism. This routine takes a pointer to
81 * a struct gss_config, the OID for the calling mechanism and that mechanisms
82 * keyopts. It returns the same gss_mechanism back, but with all fields
83 * correctly initialized. This routine in turn opens the common wire
84 * protocol moduel mech_dh.so.1 to fill in the common parts of the
85 * gss_mechanism. It then associatates the OID and the keyopts with this
86 * gss_mechanism. If there is any failure NULL is return instead.
87 */
88 gss_mechanism
__dh_generic_initialize(gss_mechanism dhmech,gss_OID_desc mech_type,dh_keyopts_t keyopts)89 __dh_generic_initialize(gss_mechanism dhmech, /* The mechanism to initialize */
90 gss_OID_desc mech_type, /* OID of mechanism */
91 dh_keyopts_t keyopts /* Key mechanism entry points */)
92 {
93 gss_mechanism (*mech_init)(gss_mechanism mech);
94 gss_mechanism mech;
95 void *dlhandle;
96 dh_context_t context;
97
98 /* Open the common backend */
99 if ((dlhandle = dlopen(DHLIB, RTLD_NOW)) == NULL) {
100 return (NULL);
101 }
102
103 /* Fetch the common backend initialization routine */
104 mech_init = (gss_mechanism (*)(gss_mechanism))
105 dlsym(dlhandle, DH_MECH_SYM);
106
107 /* Oops this should not happen */
108 if (mech_init == NULL) {
109 return (NULL);
110
111 }
112
113 /* Initialize the common parts of the gss_mechanism */
114 if ((mech = mech_init(dhmech)) == NULL) {
115 return (NULL);
116 }
117
118 /* Set the mechanism OID */
119 mech->mech_type = mech_type;
120
121 /* Grab the mechanism context */
122 context = (dh_context_t)mech->context;
123
124 /* Set the keyopts */
125 context->keyopts = keyopts;
126
127 /* Set a handle to the mechanism OID in the per mechanism context */
128 context->mech = &mech->mech_type;
129
130 return (mech);
131 }
132