1/*
2 * Copyright (c) 2005, 2018, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25
26#include <stdio.h>
27#include <stdlib.h>
28#include "NativeFunc.h"
29
30/* standard GSS method names (ordering is from mapfile) */
31static const char RELEASE_NAME[] = "gss_release_name";
32static const char IMPORT_NAME[] = "gss_import_name";
33static const char COMPARE_NAME[] = "gss_compare_name";
34static const char CANONICALIZE_NAME[] = "gss_canonicalize_name";
35static const char EXPORT_NAME[] = "gss_export_name";
36static const char DISPLAY_NAME[] = "gss_display_name";
37static const char ACQUIRE_CRED[] = "gss_acquire_cred";
38static const char RELEASE_CRED[] = "gss_release_cred";
39static const char INQUIRE_CRED[] = "gss_inquire_cred";
40static const char IMPORT_SEC_CONTEXT[] = "gss_import_sec_context";
41static const char INIT_SEC_CONTEXT[] = "gss_init_sec_context";
42static const char ACCEPT_SEC_CONTEXT[] = "gss_accept_sec_context";
43static const char INQUIRE_CONTEXT[] = "gss_inquire_context";
44static const char DELETE_SEC_CONTEXT[] = "gss_delete_sec_context";
45static const char CONTEXT_TIME[] = "gss_context_time";
46static const char WRAP_SIZE_LIMIT[] = "gss_wrap_size_limit";
47static const char EXPORT_SEC_CONTEXT[] = "gss_export_sec_context";
48static const char GET_MIC[] = "gss_get_mic";
49static const char VERIFY_MIC[] = "gss_verify_mic";
50static const char WRAP[] = "gss_wrap";
51static const char UNWRAP[] = "gss_unwrap";
52static const char INDICATE_MECHS[] = "gss_indicate_mechs";
53static const char INQUIRE_NAMES_FOR_MECH[] = "gss_inquire_names_for_mech";
54
55/* additional GSS methods not public thru mapfile */
56
57static const char ADD_OID_SET_MEMBER[] = "gss_add_oid_set_member";
58static const char DISPLAY_STATUS[] = "gss_display_status";
59static const char CREATE_EMPTY_OID_SET[] = "gss_create_empty_oid_set";
60static const char RELEASE_OID_SET[] = "gss_release_oid_set";
61static const char RELEASE_BUFFER[] = "gss_release_buffer";
62
63/**
64 * Initialize native GSS function pointers
65 */
66int loadNative(const char *libName) {
67
68 void *gssLib;
69 int failed;
70 OM_uint32 minor, major;
71
72 ftab = NULL;
73 failed = FALSE;
74
75 gssLib = GETLIB(libName);
76 if (gssLib == NULL) {
77 failed = TRUE;
78 goto out;
79 }
80
81 /* global function table instance */
82 ftab = (GSS_FUNCTION_TABLE_PTR)malloc(sizeof(GSS_FUNCTION_TABLE));
83 if (ftab == NULL) {
84 failed = TRUE;
85 goto out;
86 }
87
88 ftab->releaseName = (RELEASE_NAME_FN_PTR)GETFUNC(gssLib, RELEASE_NAME);
89 if (ftab->releaseName == NULL) {
90 failed = TRUE;
91 goto out;
92 }
93
94 ftab->importName = (IMPORT_NAME_FN_PTR)GETFUNC(gssLib, IMPORT_NAME);
95 if (ftab->importName == NULL) {
96 failed = TRUE;
97 goto out;
98 }
99
100 ftab->compareName = (COMPARE_NAME_FN_PTR)GETFUNC(gssLib, COMPARE_NAME);
101 if (ftab->compareName == NULL) {
102 failed = TRUE;
103 goto out;
104 }
105
106 ftab->canonicalizeName = (CANONICALIZE_NAME_FN_PTR)
107 GETFUNC(gssLib, CANONICALIZE_NAME);
108 if (ftab->canonicalizeName == NULL) {
109 failed = TRUE;
110 goto out;
111 }
112
113 ftab->exportName = (EXPORT_NAME_FN_PTR)GETFUNC(gssLib, EXPORT_NAME);
114 if (ftab->exportName == NULL) {
115 failed = TRUE;
116 goto out;
117 }
118
119 ftab->displayName = (DISPLAY_NAME_FN_PTR)GETFUNC(gssLib, DISPLAY_NAME);
120 if (ftab->displayName == NULL) {
121 failed = TRUE;
122 goto out;
123 }
124
125 ftab->acquireCred = (ACQUIRE_CRED_FN_PTR)GETFUNC(gssLib, ACQUIRE_CRED);
126 if (ftab->acquireCred == NULL) {
127 failed = TRUE;
128 goto out;
129 }
130
131 ftab->releaseCred = (RELEASE_CRED_FN_PTR)GETFUNC(gssLib, RELEASE_CRED);
132 if (ftab->releaseCred == NULL) {
133 failed = TRUE;
134 goto out;
135 }
136
137 ftab->inquireCred = (INQUIRE_CRED_FN_PTR)GETFUNC(gssLib, INQUIRE_CRED);
138 if (ftab->inquireCred == NULL) {
139 failed = TRUE;
140 goto out;
141 }
142
143 ftab->importSecContext = (IMPORT_SEC_CONTEXT_FN_PTR)
144 GETFUNC(gssLib, IMPORT_SEC_CONTEXT);
145 if (ftab->importSecContext == NULL) {
146 failed = TRUE;
147 goto out;
148 }
149
150 ftab->initSecContext = (INIT_SEC_CONTEXT_FN_PTR)
151 GETFUNC(gssLib, INIT_SEC_CONTEXT);
152 if (ftab->initSecContext == NULL) {
153 failed = TRUE;
154 goto out;
155 }
156
157 ftab->acceptSecContext = (ACCEPT_SEC_CONTEXT_FN_PTR)
158 GETFUNC(gssLib, ACCEPT_SEC_CONTEXT);
159 if (ftab->acceptSecContext == NULL) {
160 failed = TRUE;
161 goto out;
162 }
163
164 ftab->inquireContext = (INQUIRE_CONTEXT_FN_PTR)
165 GETFUNC(gssLib, INQUIRE_CONTEXT);
166 if (ftab->inquireContext == NULL) {
167 failed = TRUE;
168 goto out;
169 }
170
171 ftab->deleteSecContext = (DELETE_SEC_CONTEXT_FN_PTR)
172 GETFUNC(gssLib, DELETE_SEC_CONTEXT);
173 if (ftab->deleteSecContext == NULL) {
174 failed = TRUE;
175 goto out;
176 }
177
178 ftab->contextTime = (CONTEXT_TIME_FN_PTR)GETFUNC(gssLib, CONTEXT_TIME);
179 if (ftab->contextTime == NULL) {
180 failed = TRUE;
181 goto out;
182 }
183
184 ftab->wrapSizeLimit = (WRAP_SIZE_LIMIT_FN_PTR)
185 GETFUNC(gssLib, WRAP_SIZE_LIMIT);
186 if (ftab->wrapSizeLimit == NULL) {
187 failed = TRUE;
188 goto out;
189 }
190
191 ftab->exportSecContext = (EXPORT_SEC_CONTEXT_FN_PTR)
192 GETFUNC(gssLib, EXPORT_SEC_CONTEXT);
193 if (ftab->exportSecContext == NULL) {
194 failed = TRUE;
195 goto out;
196 }
197
198 ftab->getMic = (GET_MIC_FN_PTR)GETFUNC(gssLib, GET_MIC);
199 if (ftab->getMic == NULL) {
200 failed = TRUE;
201 goto out;
202 }
203
204 ftab->verifyMic = (VERIFY_MIC_FN_PTR)GETFUNC(gssLib, VERIFY_MIC);
205 if (ftab->verifyMic == NULL) {
206 failed = TRUE;
207 goto out;
208 }
209
210 ftab->wrap = (WRAP_FN_PTR)GETFUNC(gssLib, WRAP);
211 if (ftab->wrap == NULL) {
212 failed = TRUE;
213 goto out;
214 }
215
216 ftab->unwrap = (UNWRAP_FN_PTR)GETFUNC(gssLib, UNWRAP);
217 if (ftab->unwrap == NULL) {
218 failed = TRUE;
219 goto out;
220 }
221
222 ftab->indicateMechs = (INDICATE_MECHS_FN_PTR)GETFUNC(gssLib, INDICATE_MECHS);
223 if (ftab->indicateMechs == NULL) {
224 failed = TRUE;
225 goto out;
226 }
227
228 ftab->inquireNamesForMech = (INQUIRE_NAMES_FOR_MECH_FN_PTR)
229 GETFUNC(gssLib, INQUIRE_NAMES_FOR_MECH);
230 if (ftab->inquireNamesForMech == NULL) {
231 failed = TRUE;
232 goto out;
233 }
234
235 ftab->addOidSetMember = (ADD_OID_SET_MEMBER_FN_PTR)
236 GETFUNC(gssLib, ADD_OID_SET_MEMBER);
237 if (ftab->addOidSetMember == NULL) {
238 failed = TRUE;
239 goto out;
240 }
241
242 ftab->displayStatus = (DISPLAY_STATUS_FN_PTR)
243 GETFUNC(gssLib, DISPLAY_STATUS);
244 if (ftab->displayStatus == NULL) {
245 failed = TRUE;
246 goto out;
247 }
248
249 ftab->createEmptyOidSet = (CREATE_EMPTY_OID_SET_FN_PTR)
250 GETFUNC(gssLib, CREATE_EMPTY_OID_SET);
251 if (ftab->createEmptyOidSet == NULL) {
252 failed = TRUE;
253 goto out;
254 }
255
256 ftab->releaseOidSet = (RELEASE_OID_SET_FN_PTR)
257 GETFUNC(gssLib, RELEASE_OID_SET);
258 if (ftab->releaseOidSet == NULL) {
259 failed = TRUE;
260 goto out;
261 }
262
263 ftab->releaseBuffer = (RELEASE_BUFFER_FN_PTR)
264 GETFUNC(gssLib, RELEASE_BUFFER);
265 if (ftab->releaseBuffer == NULL) {
266 failed = TRUE;
267 goto out;
268 }
269
270 ftab->mechs = GSS_C_NO_OID_SET;
271 major = (*ftab->indicateMechs)(&minor, &(ftab->mechs));
272 if (ftab->mechs == NULL || ftab->mechs == GSS_C_NO_OID_SET) {
273 failed = TRUE;
274 goto out;
275 }
276
277
278out:
279 if (failed == TRUE) {
280 if (gssLib != NULL) CLOSELIB(gssLib);
281 if (ftab != NULL) free(ftab);
282 }
283 return failed;
284}
285