summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/gssapi/mechglue/g_imp_cred.c12
-rw-r--r--src/lib/gssapi/mechglue/g_initialize.c2
-rw-r--r--src/lib/gssapi/mechglue/mglueP.h8
3 files changed, 20 insertions, 2 deletions
diff --git a/src/lib/gssapi/mechglue/g_imp_cred.c b/src/lib/gssapi/mechglue/g_imp_cred.c
index a595e0b0ae..b4d9d62910 100644
--- a/src/lib/gssapi/mechglue/g_imp_cred.c
+++ b/src/lib/gssapi/mechglue/g_imp_cred.c
@@ -135,11 +135,19 @@ gss_import_cred(OM_uint32 *minor_status, gss_buffer_t token,
goto error;
}
mech = gssint_get_mechanism(selected_mech);
- if (mech == NULL || mech->gss_import_cred == NULL) {
+ if (mech == NULL || mech->gss_import_cred == NULL ||
+ mech->gssspi_import_cred_by_mech == NULL) {
status = GSS_S_DEFECTIVE_TOKEN;
goto error;
}
- status = mech->gss_import_cred(minor_status, &mech_token, &mech_cred);
+ if (mech->gssspi_import_cred_by_mech) {
+ status = mech->gssspi_import_cred_by_mech(minor_status,
+ gssint_get_public_oid(selected_mech),
+ &mech_token, &mech_cred);
+ } else {
+ status = mech->gss_import_cred(minor_status, &mech_token,
+ &mech_cred);
+ }
if (status != GSS_S_COMPLETE) {
map_error(minor_status, mech);
goto error;
diff --git a/src/lib/gssapi/mechglue/g_initialize.c b/src/lib/gssapi/mechglue/g_initialize.c
index 1fb4aeca7d..94d851e5d6 100644
--- a/src/lib/gssapi/mechglue/g_initialize.c
+++ b/src/lib/gssapi/mechglue/g_initialize.c
@@ -818,6 +818,7 @@ build_dynamicMech(void *dl, const gss_OID mech_type)
GSS_ADD_DYNAMIC_METHOD(dl, mech, gssspi_acquire_cred_with_password);
GSS_ADD_DYNAMIC_METHOD(dl, mech, gssspi_import_sec_context_for_mech);
GSS_ADD_DYNAMIC_METHOD(dl, mech, gssspi_import_name_by_mech);
+ GSS_ADD_DYNAMIC_METHOD(dl, mech, gssspi_import_cred_by_mech);
assert(mech_type != GSS_C_NO_OID);
@@ -913,6 +914,7 @@ static int build_interMech(void *dl, gss_mech_info aMech)
RESOLVE_GSSI_SYMBOL(dl, mech, gssspi, _acquire_cred_with_password);
RESOLVE_GSSI_SYMBOL(dl, mech, gssspi, _import_sec_context_for_mech);
RESOLVE_GSSI_SYMBOL(dl, mech, gssspi, _import_name_by_mech);
+ RESOLVE_GSSI_SYMBOL(dl, mech, gssspi, _import_cred_by_mech);
mech->mech_type = *aMech->mech_type;
aMech->mech = mech;
diff --git a/src/lib/gssapi/mechglue/mglueP.h b/src/lib/gssapi/mechglue/mglueP.h
index 86b0b76f35..b3bd67746e 100644
--- a/src/lib/gssapi/mechglue/mglueP.h
+++ b/src/lib/gssapi/mechglue/mglueP.h
@@ -666,6 +666,14 @@ typedef struct gss_config {
gss_name_t* /* output_name */
/* */);
+ OM_uint32 (KRB5_CALLCONV *gssspi_import_cred_by_mech)
+ (
+ OM_uint32 *, /* minor_status */
+ gss_OID, /* mech_type */
+ gss_buffer_t, /* token */
+ gss_cred_id_t * /* cred_handle */
+ /* */);
+
} *gss_mechanism;
/*