1 /*
   2  * Copyright (c) 2005, 2019, 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 GSS_FUNCTION_TABLE_PTR ftab;
 281 
 282 #endif