]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Add SPNEGO support for GSS cred export and import
authorGreg Hudson <ghudson@mit.edu>
Wed, 29 Aug 2012 15:57:26 +0000 (11:57 -0400)
committerGreg Hudson <ghudson@mit.edu>
Tue, 11 Sep 2012 05:15:43 +0000 (01:15 -0400)
ticket: 7354

src/lib/gssapi/spnego/gssapiP_spnego.h
src/lib/gssapi/spnego/spnego_mech.c

index 772ce50be2a56dbc89aad36a4a86daa82e3d8f21..9d8fe52c92d14db17fe4241a57255b71168ad3c2 100644 (file)
@@ -615,6 +615,20 @@ spnego_gss_acquire_cred_from
        OM_uint32 *time_rec
 );
 
+OM_uint32 KRB5_CALLCONV
+spnego_gss_export_cred(
+       OM_uint32 *minor_status,
+       gss_cred_id_t cred_handle,
+       gss_buffer_t token
+);
+
+OM_uint32 KRB5_CALLCONV
+spnego_gss_import_cred(
+       OM_uint32 *minor_status,
+       gss_buffer_t token,
+       gss_cred_id_t *cred_handle
+);
+
 #ifdef __cplusplus
 }
 #endif
index e207d276c9684b331c2966cf64796bc70335c52b..812c16df6ddabac67f3106e5c96f7ee0b2b10256 100644 (file)
@@ -276,7 +276,9 @@ static struct gss_config spnego_mechanism =
        spnego_gss_inquire_attrs_for_mech,
        spnego_gss_acquire_cred_from,
        NULL,                           /* gss_store_cred_into */
-       spnego_gss_acquire_cred_with_password
+       spnego_gss_acquire_cred_with_password,
+       spnego_gss_export_cred,
+       spnego_gss_import_cred,
 };
 
 #ifdef _GSS_STATIC_LINK
@@ -2806,6 +2808,40 @@ cleanup:
        return (major);
 }
 
+OM_uint32 KRB5_CALLCONV
+spnego_gss_export_cred(OM_uint32 *minor_status,
+                      gss_cred_id_t cred_handle,
+                      gss_buffer_t token)
+{
+       spnego_gss_cred_id_t spcred = (spnego_gss_cred_id_t)cred_handle;
+
+       return (gss_export_cred(minor_status, spcred->mcred, token));
+}
+
+OM_uint32 KRB5_CALLCONV
+spnego_gss_import_cred(OM_uint32 *minor_status,
+                      gss_buffer_t token,
+                      gss_cred_id_t *cred_handle)
+{
+       OM_uint32 ret;
+       spnego_gss_cred_id_t spcred;
+       gss_cred_id_t mcred;
+
+       ret = gss_import_cred(minor_status, token, &mcred);
+       if (GSS_ERROR(ret))
+               return (ret);
+       spcred = malloc(sizeof(*spcred));
+       if (spcred == NULL) {
+               gss_release_cred(minor_status, &mcred);
+               *minor_status = ENOMEM;
+               return (GSS_S_FAILURE);
+       }
+       spcred->mcred = mcred;
+       spcred->neg_mechs = GSS_C_NULL_OID_SET;
+       *cred_handle = (gss_cred_id_t)spcred;
+       return (ret);
+}
+
 /*
  * We will release everything but the ctx_handle so that it
  * can be passed back to init/accept context. This routine should