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) */ 31 static const char RELEASE_NAME[] = "gss_release_name"; 32 static const char IMPORT_NAME[] = "gss_import_name"; 33 static const char COMPARE_NAME[] = "gss_compare_name"; 34 static const char CANONICALIZE_NAME[] = "gss_canonicalize_name"; 35 static const char EXPORT_NAME[] = "gss_export_name"; 36 static const char DISPLAY_NAME[] = "gss_display_name"; 37 static const char ACQUIRE_CRED[] = "gss_acquire_cred"; 38 static const char RELEASE_CRED[] = "gss_release_cred"; 39 static const char INQUIRE_CRED[] = "gss_inquire_cred"; 40 static const char IMPORT_SEC_CONTEXT[] = "gss_import_sec_context"; 41 static const char INIT_SEC_CONTEXT[] = "gss_init_sec_context"; 42 static const char ACCEPT_SEC_CONTEXT[] = "gss_accept_sec_context"; 43 static const char INQUIRE_CONTEXT[] = "gss_inquire_context"; 44 static const char DELETE_SEC_CONTEXT[] = "gss_delete_sec_context"; 45 static const char CONTEXT_TIME[] = "gss_context_time"; 46 static const char WRAP_SIZE_LIMIT[] = "gss_wrap_size_limit"; 47 static const char EXPORT_SEC_CONTEXT[] = "gss_export_sec_context"; 48 static const char GET_MIC[] = "gss_get_mic"; 49 static const char VERIFY_MIC[] = "gss_verify_mic"; 50 static const char WRAP[] = "gss_wrap"; 51 static const char UNWRAP[] = "gss_unwrap"; 52 static const char INDICATE_MECHS[] = "gss_indicate_mechs"; 53 static const char INQUIRE_NAMES_FOR_MECH[] = "gss_inquire_names_for_mech"; 54 55 /* additional GSS methods not public thru mapfile */ 56 57 static const char ADD_OID_SET_MEMBER[] = "gss_add_oid_set_member"; 58 static const char DISPLAY_STATUS[] = "gss_display_status"; 59 static const char CREATE_EMPTY_OID_SET[] = "gss_create_empty_oid_set"; 60 static const char RELEASE_OID_SET[] = "gss_release_oid_set"; 61 static const char RELEASE_BUFFER[] = "gss_release_buffer"; 62 63 /** 64 * Initialize native GSS function pointers 65 */ 66 int 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 278 out: 279 if (failed == TRUE) { 280 if (gssLib != NULL) CLOSELIB(gssLib); 281 if (ftab != NULL) free(ftab); 282 } 283 return failed; 284 }