1 /*
2  * Copyright (c) 2005, 2020, 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 #ifndef NATIVE_FUNC_H
27 #define NATIVE_FUNC_H
28 
29 #include "gssapi.h"
30 
31 #ifdef WIN32
32 #include <windows.h>
33 #define GETLIB(libName) LoadLibrary(libName)
34 #define GETFUNC(lib,name) GetProcAddress(lib,name)
35 #define CLOSELIB(lib) CloseHandle(lib)
36 #else
37 #include <dlfcn.h>
38 #define GETLIB(libName) dlopen(libName, RTLD_NOW)
39 #define GETFUNC(lib,name) dlsym(lib,name)
40 #define CLOSELIB(lib) dlclose(lib)
41 #endif
42 
43 #ifndef TRUE
44 #define TRUE    1
45 #endif
46 
47 #ifndef FALSE
48 #define FALSE   0
49 #endif
50 
51 int loadNative(const char *libName);
52 
53 /* function pointer definitions */
54 typedef OM_uint32 (*RELEASE_NAME_FN_PTR)
55                                 (OM_uint32 *minor_status,
56                                 gss_name_t *name);
57 
58 typedef OM_uint32 (*IMPORT_NAME_FN_PTR)
59                                 (OM_uint32 *minor_status,
60                                 gss_const_buffer_t input_name_buffer,
61                                 gss_const_OID input_name_type,
62                                 gss_name_t *output_name);
63 
64 typedef OM_uint32 (*COMPARE_NAME_FN_PTR)
65                                 (OM_uint32 *minor_status,
66                                 gss_const_name_t name1,
67                                 gss_const_name_t name2,
68                                 int *name_equal);
69 
70 typedef OM_uint32 (*CANONICALIZE_NAME_FN_PTR)
71                                 (OM_uint32 *minor_status,
72                                 gss_const_name_t input_name,
73                                 gss_const_OID mech_type,
74                                 gss_name_t *output_name);
75 
76 typedef OM_uint32 (*EXPORT_NAME_FN_PTR)
77                                 (OM_uint32 *minor_status,
78                                 gss_const_name_t input_name,
79                                 gss_buffer_t exported_name);
80 
81 typedef OM_uint32 (*DISPLAY_NAME_FN_PTR)
82                                 (OM_uint32 *minor_status,
83                                 gss_const_name_t input_name,
84                                 gss_buffer_t output_name_buffer,
85                                 gss_OID *output_name_type);
86 
87 typedef OM_uint32 (*ACQUIRE_CRED_FN_PTR)
88                                 (OM_uint32 *minor_status,
89                                 gss_const_name_t desired_name,
90                                 OM_uint32 time_req,
91                                 gss_const_OID_set desired_mech,
92                                 gss_cred_usage_t cred_usage,
93                                 gss_cred_id_t *output_cred_handle,
94                                 gss_OID_set *actual_mechs,
95                                 OM_uint32 *time_rec);
96 
97 typedef OM_uint32 (*RELEASE_CRED_FN_PTR)
98                                 (OM_uint32 *minor_status,
99                                 gss_cred_id_t *cred_handle);
100 
101 typedef OM_uint32 (*INQUIRE_CRED_FN_PTR)
102                                 (OM_uint32 *minor_status,
103                                 gss_const_cred_id_t cred_handle,
104                                 gss_name_t *name,
105                                 OM_uint32 *lifetime,
106                                 gss_cred_usage_t *cred_usage,
107                                 gss_OID_set *mechanisms);
108 
109 typedef OM_uint32 (*IMPORT_SEC_CONTEXT_FN_PTR)
110                                 (OM_uint32 *minor_status,
111                                 gss_const_buffer_t interprocess_token,
112                                 gss_ctx_id_t *context_handle);
113 
114 typedef OM_uint32 (*INIT_SEC_CONTEXT_FN_PTR)
115                                 (OM_uint32 *minor_status,
116                                 gss_const_cred_id_t initiator_cred_handle,
117                                 gss_ctx_id_t *context_handle,
118                                 gss_const_name_t target_name,
119                                 gss_const_OID mech_type,
120                                 OM_uint32 req_flags,
121                                 OM_uint32 time_req,
122                                 gss_const_channel_bindings_t input_chan_bindings,
123                                 gss_const_buffer_t input_token,
124                                 gss_OID *actual_mech_type,
125                                 gss_buffer_t output_token,
126                                 OM_uint32 *ret_flags,
127                                 OM_uint32 *time_rec);
128 
129 typedef OM_uint32 (*ACCEPT_SEC_CONTEXT_FN_PTR)
130                                 (OM_uint32 *minor_status,
131                                 gss_ctx_id_t *context_handle,
132                                 gss_const_cred_id_t acceptor_cred_handle,
133                                 gss_const_buffer_t input_token,
134                                 gss_const_channel_bindings_t input_chan_bindings,
135                                 gss_name_t *src_name,
136                                 gss_OID *mech_type,
137                                 gss_buffer_t output_token,
138                                 OM_uint32 *ret_flags,
139                                 OM_uint32 *time_rec,
140                                 gss_cred_id_t *delegated_cred_handle);
141 
142 typedef OM_uint32 (*INQUIRE_CONTEXT_FN_PTR)
143                                 (OM_uint32 *minor_status,
144                                 gss_const_ctx_id_t context_handle,
145                                 gss_name_t *src_name,
146                                 gss_name_t *targ_name,
147                                 OM_uint32 *lifetime_rec,
148                                 gss_OID *mech_type,
149                                 OM_uint32 *ctx_flags,
150                                 int *locally_initiated,
151                                 int *open);
152 
153 typedef OM_uint32 (*DELETE_SEC_CONTEXT_FN_PTR)
154                                 (OM_uint32 *minor_status,
155                                 gss_ctx_id_t *context_handle,
156                                 gss_buffer_t output_token);
157 
158 typedef OM_uint32 (*CONTEXT_TIME_FN_PTR)
159                                 (OM_uint32 *minor_status,
160                                 gss_const_ctx_id_t context_handle,
161                                 OM_uint32 *time_rec);
162 
163 typedef OM_uint32 (*WRAP_SIZE_LIMIT_FN_PTR)
164                                 (OM_uint32 *minor_status,
165                                 gss_const_ctx_id_t context_handle,
166                                 int conf_req_flag,
167                                 gss_qop_t qop_req,
168                                 OM_uint32 req_output_size,
169                                 OM_uint32 *max_input_size);
170 
171 typedef OM_uint32 (*EXPORT_SEC_CONTEXT_FN_PTR)
172                                 (OM_uint32 *minor_status,
173                                 gss_ctx_id_t *context_handle,
174                                 gss_buffer_t interprocess_token);
175 
176 typedef OM_uint32 (*GET_MIC_FN_PTR)
177                                 (OM_uint32 *minor_status,
178                                 gss_const_ctx_id_t context_handle,
179                                 gss_qop_t qop_req,
180                                 gss_const_buffer_t message_buffer,
181                                 gss_buffer_t msg_token);
182 
183 typedef OM_uint32 (*VERIFY_MIC_FN_PTR)
184                                 (OM_uint32 *minor_status,
185                                 gss_const_ctx_id_t context_handle,
186                                 gss_const_buffer_t message_buffer,
187                                 gss_const_buffer_t token_buffer,
188                                 gss_qop_t *qop_state);
189 
190 typedef OM_uint32 (*WRAP_FN_PTR)
191                                 (OM_uint32 *minor_status,
192                                 gss_const_ctx_id_t context_handle,
193                                 int conf_req_flag,
194                                 gss_qop_t qop_req,
195                                 gss_const_buffer_t input_message_buffer,
196                                 int *conf_state,
197                                 gss_buffer_t output_message_buffer);
198 
199 typedef OM_uint32 (*UNWRAP_FN_PTR)
200                                 (OM_uint32 *minor_status,
201                                 gss_const_ctx_id_t context_handle,
202                                 gss_const_buffer_t input_message_buffer,
203                                 gss_buffer_t output_message_buffer,
204                                 int *conf_state,
205                                 gss_qop_t *qop_state);
206 
207 typedef OM_uint32 (*INDICATE_MECHS_FN_PTR)
208                                 (OM_uint32 *minor_status,
209                                 gss_OID_set *mech_set);
210 
211 typedef OM_uint32 (*INQUIRE_NAMES_FOR_MECH_FN_PTR)
212                                 (OM_uint32 *minor_status,
213                                 gss_const_OID mechanism,
214                                 gss_OID_set *name_types);
215 
216 typedef OM_uint32 (*ADD_OID_SET_MEMBER_FN_PTR)
217                                 (OM_uint32 *minor_status,
218                                 gss_const_OID member_oid,
219                                 gss_OID_set *oid_set);
220 
221 typedef OM_uint32 (*DISPLAY_STATUS_FN_PTR)
222                                 (OM_uint32 *minor_status,
223                                 OM_uint32 status_value,
224                                 int status_type,
225                                 gss_const_OID mech_type,
226                                 OM_uint32 *message_context,
227                                 gss_buffer_t status_string);
228 
229 typedef OM_uint32 (*CREATE_EMPTY_OID_SET_FN_PTR)
230                                 (OM_uint32 *minor_status,
231                                 gss_OID_set *oid_set);
232 
233 typedef OM_uint32 (*RELEASE_OID_SET_FN_PTR)
234                                 (OM_uint32 *minor_status,
235                                 gss_OID_set *set);
236 
237 typedef OM_uint32 (*RELEASE_BUFFER_FN_PTR)
238                                 (OM_uint32 *minor_status,
239                                 gss_buffer_t buffer);
240 
241 
242 /* dynamically resolved functions from gss library */
243 
244 typedef struct GSS_FUNCTION_TABLE {
245     gss_OID_set                         mechs;
246     RELEASE_NAME_FN_PTR                 releaseName;
247     IMPORT_NAME_FN_PTR                  importName;
248     COMPARE_NAME_FN_PTR                 compareName;
249     CANONICALIZE_NAME_FN_PTR            canonicalizeName;
250     EXPORT_NAME_FN_PTR                  exportName;
251     DISPLAY_NAME_FN_PTR                 displayName;
252     ACQUIRE_CRED_FN_PTR                 acquireCred;
253     RELEASE_CRED_FN_PTR                 releaseCred;
254     INQUIRE_CRED_FN_PTR                 inquireCred;
255     IMPORT_SEC_CONTEXT_FN_PTR           importSecContext;
256     INIT_SEC_CONTEXT_FN_PTR             initSecContext;
257     ACCEPT_SEC_CONTEXT_FN_PTR           acceptSecContext;
258     INQUIRE_CONTEXT_FN_PTR              inquireContext;
259     DELETE_SEC_CONTEXT_FN_PTR           deleteSecContext;
260     CONTEXT_TIME_FN_PTR                 contextTime;
261     WRAP_SIZE_LIMIT_FN_PTR              wrapSizeLimit;
262     EXPORT_SEC_CONTEXT_FN_PTR           exportSecContext;
263     GET_MIC_FN_PTR                      getMic;
264     VERIFY_MIC_FN_PTR                   verifyMic;
265     WRAP_FN_PTR                         wrap;
266     UNWRAP_FN_PTR                       unwrap;
267     INDICATE_MECHS_FN_PTR               indicateMechs;
268     INQUIRE_NAMES_FOR_MECH_FN_PTR       inquireNamesForMech;
269     ADD_OID_SET_MEMBER_FN_PTR           addOidSetMember;
270     DISPLAY_STATUS_FN_PTR               displayStatus;
271     CREATE_EMPTY_OID_SET_FN_PTR         createEmptyOidSet;
272     RELEASE_OID_SET_FN_PTR              releaseOidSet;
273     RELEASE_BUFFER_FN_PTR               releaseBuffer;
274 
275 } GSS_FUNCTION_TABLE;
276 
277 typedef GSS_FUNCTION_TABLE *GSS_FUNCTION_TABLE_PTR;
278 
279 /* global GSS function table */
280 extern GSS_FUNCTION_TABLE_PTR ftab;
281 
282 #endif
283