src/java.security.jgss/unix/native/libj2gss/NativeFunc.c
changeset 49697 59c4713c5d21
parent 49696 508e9f6632fd
parent 49683 fcff2daa6b1e
child 49698 4c0c018a953f
equal deleted inserted replaced
49696:508e9f6632fd 49697:59c4713c5d21
     1 /*
       
     2  * Copyright (c) 2005, 2012, 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 <dlfcn.h>
       
    29 #include "NativeFunc.h"
       
    30 
       
    31 /* standard GSS method names (ordering is from mapfile) */
       
    32 static const char RELEASE_NAME[]                = "gss_release_name";
       
    33 static const char IMPORT_NAME[]                 = "gss_import_name";
       
    34 static const char COMPARE_NAME[]                = "gss_compare_name";
       
    35 static const char CANONICALIZE_NAME[]           = "gss_canonicalize_name";
       
    36 static const char EXPORT_NAME[]                 = "gss_export_name";
       
    37 static const char DISPLAY_NAME[]                = "gss_display_name";
       
    38 static const char ACQUIRE_CRED[]                = "gss_acquire_cred";
       
    39 static const char RELEASE_CRED[]                = "gss_release_cred";
       
    40 static const char INQUIRE_CRED[]                = "gss_inquire_cred";
       
    41 static const char IMPORT_SEC_CONTEXT[]          = "gss_import_sec_context";
       
    42 static const char INIT_SEC_CONTEXT[]            = "gss_init_sec_context";
       
    43 static const char ACCEPT_SEC_CONTEXT[]          = "gss_accept_sec_context";
       
    44 static const char INQUIRE_CONTEXT[]             = "gss_inquire_context";
       
    45 static const char DELETE_SEC_CONTEXT[]          = "gss_delete_sec_context";
       
    46 static const char CONTEXT_TIME[]                = "gss_context_time";
       
    47 static const char WRAP_SIZE_LIMIT[]             = "gss_wrap_size_limit";
       
    48 static const char EXPORT_SEC_CONTEXT[]          = "gss_export_sec_context";
       
    49 static const char GET_MIC[]                     = "gss_get_mic";
       
    50 static const char VERIFY_MIC[]                  = "gss_verify_mic";
       
    51 static const char WRAP[]                        = "gss_wrap";
       
    52 static const char UNWRAP[]                      = "gss_unwrap";
       
    53 static const char INDICATE_MECHS[]              = "gss_indicate_mechs";
       
    54 static const char INQUIRE_NAMES_FOR_MECH[]      = "gss_inquire_names_for_mech";
       
    55 
       
    56 /* additional GSS methods not public thru mapfile */
       
    57 
       
    58 static const char ADD_OID_SET_MEMBER[]          = "gss_add_oid_set_member";
       
    59 static const char DISPLAY_STATUS[]              = "gss_display_status";
       
    60 static const char CREATE_EMPTY_OID_SET[]        = "gss_create_empty_oid_set";
       
    61 static const char RELEASE_OID_SET[]             = "gss_release_oid_set";
       
    62 static const char RELEASE_BUFFER[]              = "gss_release_buffer";
       
    63 
       
    64 /**
       
    65  * Initialize native GSS function pointers
       
    66  */
       
    67 char* loadNative(const char *libName) {
       
    68 
       
    69     char *error;
       
    70     void *gssLib;
       
    71     int failed;
       
    72     OM_uint32 minor, major;
       
    73 
       
    74     ftab = NULL;
       
    75     failed = FALSE;
       
    76     error = NULL;
       
    77 
       
    78     gssLib = dlopen(libName, RTLD_NOW);
       
    79     if (gssLib == NULL) {
       
    80         failed = TRUE;
       
    81         goto out;
       
    82     }
       
    83 
       
    84     /* global function table instance */
       
    85     ftab = (GSS_FUNCTION_TABLE_PTR)malloc(sizeof(GSS_FUNCTION_TABLE));
       
    86     if (ftab == NULL) {
       
    87         failed = TRUE;
       
    88         goto out;
       
    89     }
       
    90 
       
    91     ftab->releaseName = (RELEASE_NAME_FN_PTR)dlsym(gssLib, RELEASE_NAME);
       
    92     if (ftab->releaseName == NULL) {
       
    93         failed = TRUE;
       
    94         goto out;
       
    95     }
       
    96 
       
    97     ftab->importName = (IMPORT_NAME_FN_PTR)dlsym(gssLib, IMPORT_NAME);
       
    98     if (ftab->importName == NULL) {
       
    99         failed = TRUE;
       
   100         goto out;
       
   101     }
       
   102 
       
   103     ftab->compareName = (COMPARE_NAME_FN_PTR)dlsym(gssLib, COMPARE_NAME);
       
   104     if (ftab->compareName == NULL) {
       
   105         failed = TRUE;
       
   106         goto out;
       
   107     }
       
   108 
       
   109     ftab->canonicalizeName = (CANONICALIZE_NAME_FN_PTR)
       
   110                                 dlsym(gssLib, CANONICALIZE_NAME);
       
   111     if (ftab->canonicalizeName == NULL) {
       
   112         failed = TRUE;
       
   113         goto out;
       
   114     }
       
   115 
       
   116     ftab->exportName = (EXPORT_NAME_FN_PTR)dlsym(gssLib, EXPORT_NAME);
       
   117     if (ftab->exportName == NULL) {
       
   118         failed = TRUE;
       
   119         goto out;
       
   120     }
       
   121 
       
   122     ftab->displayName = (DISPLAY_NAME_FN_PTR)dlsym(gssLib, DISPLAY_NAME);
       
   123     if (ftab->displayName == NULL) {
       
   124         failed = TRUE;
       
   125         goto out;
       
   126     }
       
   127 
       
   128     ftab->acquireCred = (ACQUIRE_CRED_FN_PTR)dlsym(gssLib, ACQUIRE_CRED);
       
   129     if (ftab->acquireCred == NULL) {
       
   130         failed = TRUE;
       
   131         goto out;
       
   132     }
       
   133 
       
   134     ftab->releaseCred = (RELEASE_CRED_FN_PTR)dlsym(gssLib, RELEASE_CRED);
       
   135     if (ftab->releaseCred == NULL) {
       
   136         failed = TRUE;
       
   137         goto out;
       
   138     }
       
   139 
       
   140     ftab->inquireCred = (INQUIRE_CRED_FN_PTR)dlsym(gssLib, INQUIRE_CRED);
       
   141     if (ftab->inquireCred == NULL) {
       
   142         failed = TRUE;
       
   143         goto out;
       
   144     }
       
   145 
       
   146     ftab->importSecContext = (IMPORT_SEC_CONTEXT_FN_PTR)
       
   147                         dlsym(gssLib, IMPORT_SEC_CONTEXT);
       
   148     if (ftab->importSecContext == NULL) {
       
   149         failed = TRUE;
       
   150         goto out;
       
   151     }
       
   152 
       
   153     ftab->initSecContext = (INIT_SEC_CONTEXT_FN_PTR)
       
   154                         dlsym(gssLib, INIT_SEC_CONTEXT);
       
   155     if (ftab->initSecContext == NULL) {
       
   156         failed = TRUE;
       
   157         goto out;
       
   158     }
       
   159 
       
   160     ftab->acceptSecContext = (ACCEPT_SEC_CONTEXT_FN_PTR)
       
   161                         dlsym(gssLib, ACCEPT_SEC_CONTEXT);
       
   162     if (ftab->acceptSecContext == NULL) {
       
   163         failed = TRUE;
       
   164         goto out;
       
   165     }
       
   166 
       
   167     ftab->inquireContext = (INQUIRE_CONTEXT_FN_PTR)
       
   168                         dlsym(gssLib, INQUIRE_CONTEXT);
       
   169     if (ftab->inquireContext == NULL) {
       
   170         failed = TRUE;
       
   171         goto out;
       
   172     }
       
   173 
       
   174     ftab->deleteSecContext = (DELETE_SEC_CONTEXT_FN_PTR)
       
   175                         dlsym(gssLib, DELETE_SEC_CONTEXT);
       
   176     if (ftab->deleteSecContext == NULL) {
       
   177         failed = TRUE;
       
   178         goto out;
       
   179     }
       
   180 
       
   181     ftab->contextTime = (CONTEXT_TIME_FN_PTR)dlsym(gssLib, CONTEXT_TIME);
       
   182     if (ftab->contextTime == NULL) {
       
   183         failed = TRUE;
       
   184         goto out;
       
   185     }
       
   186 
       
   187     ftab->wrapSizeLimit = (WRAP_SIZE_LIMIT_FN_PTR)
       
   188                         dlsym(gssLib, WRAP_SIZE_LIMIT);
       
   189     if (ftab->wrapSizeLimit == NULL) {
       
   190         failed = TRUE;
       
   191         goto out;
       
   192     }
       
   193 
       
   194     ftab->exportSecContext = (EXPORT_SEC_CONTEXT_FN_PTR)
       
   195                         dlsym(gssLib, EXPORT_SEC_CONTEXT);
       
   196     if (ftab->exportSecContext == NULL) {
       
   197         failed = TRUE;
       
   198         goto out;
       
   199     }
       
   200 
       
   201     ftab->getMic = (GET_MIC_FN_PTR)dlsym(gssLib, GET_MIC);
       
   202     if (ftab->getMic == NULL) {
       
   203         failed = TRUE;
       
   204         goto out;
       
   205     }
       
   206 
       
   207     ftab->verifyMic = (VERIFY_MIC_FN_PTR)dlsym(gssLib, VERIFY_MIC);
       
   208     if (ftab->verifyMic == NULL) {
       
   209         failed = TRUE;
       
   210         goto out;
       
   211     }
       
   212 
       
   213     ftab->wrap = (WRAP_FN_PTR)dlsym(gssLib, WRAP);
       
   214     if (ftab->wrap == NULL) {
       
   215         failed = TRUE;
       
   216         goto out;
       
   217     }
       
   218 
       
   219     ftab->unwrap = (UNWRAP_FN_PTR)dlsym(gssLib, UNWRAP);
       
   220     if (ftab->unwrap == NULL) {
       
   221         failed = TRUE;
       
   222         goto out;
       
   223     }
       
   224 
       
   225     ftab->indicateMechs = (INDICATE_MECHS_FN_PTR)dlsym(gssLib, INDICATE_MECHS);
       
   226     if (ftab->indicateMechs == NULL) {
       
   227         failed = TRUE;
       
   228         goto out;
       
   229     }
       
   230 
       
   231     ftab->inquireNamesForMech = (INQUIRE_NAMES_FOR_MECH_FN_PTR)
       
   232                         dlsym(gssLib, INQUIRE_NAMES_FOR_MECH);
       
   233     if (ftab->inquireNamesForMech == NULL) {
       
   234         failed = TRUE;
       
   235         goto out;
       
   236     }
       
   237 
       
   238     ftab->addOidSetMember = (ADD_OID_SET_MEMBER_FN_PTR)
       
   239                         dlsym(gssLib, ADD_OID_SET_MEMBER);
       
   240     if (ftab->addOidSetMember == NULL) {
       
   241         failed = TRUE;
       
   242         goto out;
       
   243     }
       
   244 
       
   245     ftab->displayStatus = (DISPLAY_STATUS_FN_PTR)
       
   246                         dlsym(gssLib, DISPLAY_STATUS);
       
   247     if (ftab->displayStatus == NULL) {
       
   248         failed = TRUE;
       
   249         goto out;
       
   250     }
       
   251 
       
   252     ftab->createEmptyOidSet = (CREATE_EMPTY_OID_SET_FN_PTR)
       
   253                         dlsym(gssLib, CREATE_EMPTY_OID_SET);
       
   254     if (ftab->createEmptyOidSet == NULL) {
       
   255         failed = TRUE;
       
   256         goto out;
       
   257     }
       
   258 
       
   259     ftab->releaseOidSet = (RELEASE_OID_SET_FN_PTR)
       
   260                         dlsym(gssLib, RELEASE_OID_SET);
       
   261     if (ftab->releaseOidSet == NULL) {
       
   262         failed = TRUE;
       
   263         goto out;
       
   264     }
       
   265 
       
   266     ftab->releaseBuffer = (RELEASE_BUFFER_FN_PTR)
       
   267                         dlsym(gssLib, RELEASE_BUFFER);
       
   268     if (ftab->releaseBuffer == NULL) {
       
   269         failed = TRUE;
       
   270         goto out;
       
   271     }
       
   272 
       
   273     ftab->mechs = GSS_C_NO_OID_SET;
       
   274     major = (*ftab->indicateMechs)(&minor, &(ftab->mechs));
       
   275     if (ftab->mechs == NULL || ftab->mechs == GSS_C_NO_OID_SET) {
       
   276         failed = TRUE;
       
   277         goto out;
       
   278     }
       
   279 
       
   280 
       
   281 out:
       
   282     if (failed == TRUE) {
       
   283         error = dlerror();
       
   284         if (gssLib != NULL) dlclose(gssLib);
       
   285         if (ftab != NULL) free(ftab);
       
   286     }
       
   287     return error;
       
   288 }