00001 
00002 
00003 
00004 
00005 
00006 
00007 
00019 #ifndef LCMAPS_GSI_UTILS_C
00020 #define LCMAPS_GSI_UTILS_C
00021 
00022 
00023 
00024 
00025 #include <stdio.h>
00026 #include <stdlib.h>
00027 #include <string.h>
00028 
00029 
00030 #include <openssl/x509.h>
00031 
00032 
00033 #include <gssapi.h>
00034 
00035 
00036 
00037 
00038 #include "gssapi_openssl.h"
00039 
00040 
00041 
00042 
00043 
00044 
00045 #include "globus_gsi_credential.h"
00046 
00047 
00048 
00049 
00050 
00051 
00052 
00053 
00054 #include "_lcmaps_gsi_utils.h"
00055 
00056 
00057 
00058 
00059 
00060 
00061 
00062 
00063 char * lcmaps_gss_cred_to_dn(
00064         gss_cred_id_t globus_cred
00065 )
00066 {
00067     char*                         globusid = NULL;
00068     char*                         globusid_tmp = NULL;
00069     gss_name_t                    globus_name = GSS_C_NO_NAME;
00070     gss_buffer_desc               globus_buffer_desc = GSS_C_EMPTY_BUFFER;
00071     gss_buffer_t                  globus_buffer = &globus_buffer_desc;
00072     OM_uint32                     major_status = 0;
00073     OM_uint32                     minor_status = 0;
00074     OM_uint32                     minor_status2 = 0;
00075 
00076     if ((major_status = gss_inquire_cred(&minor_status,
00077                                          globus_cred,
00078                                          &globus_name,
00079                                          NULL, NULL, NULL)) == GSS_S_COMPLETE)
00080     {
00081         major_status = gss_display_name(&minor_status,
00082                                         globus_name, globus_buffer, NULL);
00083         gss_release_name(&minor_status2, &globus_name);
00084     }
00085     
00086 
00087 
00088 
00089     if (major_status == GSS_S_COMPLETE)
00090     {
00091         globusid = globus_buffer_desc.value;
00092     }
00093     else
00094     {
00095         globusid = getenv("GLOBUSID");
00096         globusid = (globusid ? globusid : "GLOBUSID");
00097     }
00098     globusid_tmp = strdup(globusid);
00099 
00100     if (globus_buffer_desc.value)
00101     {
00102         gss_release_buffer(&minor_status2, globus_buffer);
00103     }
00104     return globusid_tmp;
00105 }
00106 
00107 
00108 
00109 
00110 
00111 
00112 
00113 
00127 X509 * lcmaps_cred_to_x509(
00128         gss_cred_id_t cred
00129 )
00130 {
00131     
00132     gss_cred_id_desc *       cred_desc = NULL;
00133     globus_gsi_cred_handle_t gsi_cred_handle;
00134     X509 * px509=NULL;
00135 
00136     
00137     if (cred != GSS_C_NO_CREDENTIAL)
00138     {
00139         cred_desc = (gss_cred_id_desc *) cred;
00140         if (globus_module_activate(GLOBUS_GSI_CREDENTIAL_MODULE) ==GLOBUS_SUCCESS)
00141         {
00142             gsi_cred_handle = cred_desc->cred_handle;
00143             if (globus_gsi_cred_get_cert(gsi_cred_handle, &px509) == GLOBUS_SUCCESS)
00144             {
00145                 globus_module_deactivate(GLOBUS_GSI_CREDENTIAL_MODULE);
00146                 return px509;
00147             }
00148             else
00149             {
00150                 globus_module_deactivate(GLOBUS_GSI_CREDENTIAL_MODULE);
00151                 return NULL;
00152             }
00153         }
00154         else
00155         {
00156             globus_module_deactivate(GLOBUS_GSI_CREDENTIAL_MODULE);
00157             return NULL;
00158         }
00159     }
00160     else
00161     {
00162         return NULL;
00163     }
00164 }
00165 
00166 
00167 
00168 
00169 
00170 
00171 
00172 
00173 
00187 STACK_OF(X509) * lcmaps_cred_to_x509_chain(
00188         gss_cred_id_t cred
00189 )
00190 {
00191     
00192     gss_cred_id_desc *       cred_desc = NULL;
00193     globus_gsi_cred_handle_t gsi_cred_handle;
00194     STACK_OF(X509) * px509_chain=NULL;
00195 
00196     
00197     if (cred != GSS_C_NO_CREDENTIAL)
00198     {
00199         cred_desc = (gss_cred_id_desc *) cred;
00200         if (globus_module_activate(GLOBUS_GSI_CREDENTIAL_MODULE) ==GLOBUS_SUCCESS)
00201         {
00202             gsi_cred_handle = cred_desc->cred_handle;
00203             if (globus_gsi_cred_get_cert_chain(gsi_cred_handle, &px509_chain) == GLOBUS_SUCCESS)
00204             {
00205                 globus_module_deactivate(GLOBUS_GSI_CREDENTIAL_MODULE);
00206                 return px509_chain;
00207             }
00208             else
00209             {
00210                 globus_module_deactivate(GLOBUS_GSI_CREDENTIAL_MODULE);
00211                 return NULL;
00212             }
00213         }
00214         else
00215         {
00216             globus_module_deactivate(GLOBUS_GSI_CREDENTIAL_MODULE);
00217             return NULL;
00218         }
00219     }
00220     else
00221     {
00222         return NULL;
00223     }
00224 }
00225 
00226 #endif 
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234