summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--proxy/src/client/gpm_accept_sec_context.c4
-rw-r--r--proxy/src/client/gpm_acquire_cred.c40
-rw-r--r--proxy/src/client/gpm_import_and_canon_name.c84
-rw-r--r--proxy/src/client/gpm_indicate_mechs.c6
-rw-r--r--proxy/src/client/gpm_init_sec_context.c6
-rw-r--r--proxy/src/client/gpm_inquire_context.c14
-rw-r--r--proxy/src/client/gssapi_gpm.h28
-rw-r--r--proxy/src/mechglue/gss_plugin.c62
-rw-r--r--proxy/src/mechglue/gss_plugin.h9
-rw-r--r--proxy/tests/cli_srv_comm.c10
10 files changed, 147 insertions, 116 deletions
diff --git a/proxy/src/client/gpm_accept_sec_context.c b/proxy/src/client/gpm_accept_sec_context.c
index 1f6a3d3..d94c001 100644
--- a/proxy/src/client/gpm_accept_sec_context.c
+++ b/proxy/src/client/gpm_accept_sec_context.c
@@ -31,7 +31,7 @@ OM_uint32 gpm_accept_sec_context(OM_uint32 *minor_status,
gssx_cred *acceptor_cred_handle,
gss_buffer_t input_token_buffer,
gss_channel_bindings_t input_chan_bindings,
- gss_name_t *src_name,
+ gssx_name **src_name,
gss_OID *mech_type,
gss_buffer_t output_token,
OM_uint32 *ret_flags,
@@ -126,7 +126,7 @@ OM_uint32 gpm_accept_sec_context(OM_uint32 *minor_status,
*mech_type = mech;
}
if (src_name) {
- *src_name = (gss_name_t)name;
+ *src_name = name;
}
if (outbuf) {
*output_token = *outbuf;
diff --git a/proxy/src/client/gpm_acquire_cred.c b/proxy/src/client/gpm_acquire_cred.c
index 99d6438..2b2c6c3 100644
--- a/proxy/src/client/gpm_acquire_cred.c
+++ b/proxy/src/client/gpm_acquire_cred.c
@@ -68,7 +68,7 @@ static int gpmint_cred_to_actual_mechs(gssx_cred *c, gss_OID_set *a)
}
OM_uint32 gpm_acquire_cred(OM_uint32 *minor_status,
- const gss_name_t desired_name,
+ gssx_name *desired_name,
OM_uint32 time_req,
const gss_OID_set desired_mechs,
gss_cred_usage_t cred_usage,
@@ -95,19 +95,8 @@ OM_uint32 gpm_acquire_cred(OM_uint32 *minor_status,
/* ignore call_ctx for now */
- if (desired_name) {
- arg->desired_name = calloc(1, sizeof(gssx_name));
- if (!arg->desired_name) {
- ret_maj = GSS_S_FAILURE;
- ret_min = ENOMEM;
- goto done;
- }
- ret_maj = gp_conv_name_to_gssx(&ret_min,
- desired_name, arg->desired_name);
- if (ret_maj) {
- goto done;
- }
- }
+ arg->desired_name = desired_name;
+
if (desired_mechs) {
ret = gp_conv_oid_set_to_gssx(desired_mechs, &arg->desired_mechs);
if (ret) {
@@ -167,6 +156,8 @@ OM_uint32 gpm_acquire_cred(OM_uint32 *minor_status,
ret_min = 0;
done:
+ /* desired_name is passed in, don't let gpm_free_xdrs free it */
+ arg->desired_name = NULL;
gpm_free_xdrs(GSSX_ACQUIRE_CRED, &uarg, &ures);
*minor_status = ret_min;
return ret_maj;
@@ -174,7 +165,7 @@ done:
OM_uint32 gpm_add_cred(OM_uint32 *minor_status,
gssx_cred *input_cred_handle,
- const gss_name_t desired_name,
+ gssx_name *desired_name,
const gss_OID desired_mech,
gss_cred_usage_t cred_usage,
OM_uint32 initiator_time_req,
@@ -204,18 +195,9 @@ OM_uint32 gpm_add_cred(OM_uint32 *minor_status,
if (output_cred_handle != NULL) {
arg->add_cred_to_input_handle = true;
}
- if (desired_name != GSS_C_NO_NAME) {
- arg->desired_name = calloc(1, sizeof(gssx_name));
- if (!arg->desired_name) {
- ret = ENOMEM;
- goto done;
- }
- ret_maj = gp_conv_name_to_gssx(&ret_min,
- desired_name, arg->desired_name);
- if (ret_maj) {
- goto done;
- }
- }
+
+ arg->desired_name = desired_name;
+
if (desired_mech != GSS_C_NO_OID) {
mechs.count = 1;
mechs.elements = desired_mech;
@@ -404,7 +386,7 @@ done:
*mechanisms = mechs;
}
} else {
- (void)gpm_release_name(&ret_min, (gss_name_t *)&dname);
+ (void)gpm_release_name(&ret_min, &dname);
(void)gss_release_oid_set(&ret_min, &mechs);
}
return ret_maj;
@@ -490,7 +472,7 @@ OM_uint32 gpm_inquire_cred_by_mech(OM_uint32 *minor_status,
done:
*minor_status = ret_min;
if (ret_maj != GSS_S_COMPLETE) {
- (void)gpm_release_name(&ret_min, (gss_name_t *)&dname);
+ (void)gpm_release_name(&ret_min, &dname);
}
return ret_maj;
}
diff --git a/proxy/src/client/gpm_import_and_canon_name.c b/proxy/src/client/gpm_import_and_canon_name.c
index 9c60754..a4f9772 100644
--- a/proxy/src/client/gpm_import_and_canon_name.c
+++ b/proxy/src/client/gpm_import_and_canon_name.c
@@ -26,14 +26,12 @@
#include "gssapi_gpm.h"
OM_uint32 gpm_display_name(OM_uint32 *minor_status,
- gss_name_t input_name,
+ gssx_name *in_name,
gss_buffer_t output_name_buffer,
gss_OID *output_name_type)
{
gss_buffer_desc input_name_buffer = GSS_C_EMPTY_BUFFER;
gssx_name *output_name = NULL;
- gss_name_t tmp;
- gssx_name *name;
uint32_t ret_maj;
uint32_t ret_min;
uint32_t discard;
@@ -44,39 +42,36 @@ OM_uint32 gpm_display_name(OM_uint32 *minor_status,
}
*minor_status = 0;
- if (!input_name) {
+ if (!in_name) {
return GSS_S_CALL_INACCESSIBLE_READ;
}
if (!output_name_buffer) {
return GSS_S_CALL_INACCESSIBLE_WRITE;
}
- name = (gssx_name *)input_name;
-
- if (name->display_name.octet_string_len == 0) {
- if (name->exported_name.octet_string_len == 0) {
+ if (in_name->display_name.octet_string_len == 0) {
+ if (in_name->exported_name.octet_string_len == 0) {
return GSS_S_BAD_NAME;
}
- gp_conv_gssx_to_buffer(&name->exported_name, &input_name_buffer);
- tmp = (gss_name_t)output_name;
+ gp_conv_gssx_to_buffer(&in_name->exported_name, &input_name_buffer);
ret_maj = gpm_import_name(&ret_min, &input_name_buffer,
- GSS_C_NT_EXPORT_NAME, &tmp);
+ GSS_C_NT_EXPORT_NAME, &output_name);
if (ret_maj) {
goto done;
}
/* steal display_name and name_type */
- name->display_name = output_name->display_name;
+ in_name->display_name = output_name->display_name;
output_name->display_name.octet_string_len = 0;
output_name->display_name.octet_string_val = NULL;
- name->name_type = output_name->name_type;
+ in_name->name_type = output_name->name_type;
output_name->name_type.octet_string_len = 0;
output_name->name_type.octet_string_val = NULL;
}
- ret = gp_copy_gssx_to_buffer(&name->display_name, output_name_buffer);
+ ret = gp_copy_gssx_to_buffer(&in_name->display_name, output_name_buffer);
if (ret) {
ret_min = ret;
ret_maj = GSS_S_FAILURE;
@@ -84,7 +79,7 @@ OM_uint32 gpm_display_name(OM_uint32 *minor_status,
}
if (output_name_type) {
- ret = gp_conv_gssx_to_oid_alloc(&name->name_type, output_name_type);
+ ret = gp_conv_gssx_to_oid_alloc(&in_name->name_type, output_name_type);
if (ret) {
gss_release_buffer(&discard, output_name_buffer);
ret_min = ret;
@@ -108,7 +103,7 @@ done:
OM_uint32 gpm_import_name(OM_uint32 *minor_status,
gss_buffer_t input_name_buffer,
gss_OID input_name_type,
- gss_name_t *output_name)
+ gssx_name **output_name)
{
gssx_name *name;
int ret;
@@ -144,15 +139,14 @@ OM_uint32 gpm_import_name(OM_uint32 *minor_status,
return GSS_S_FAILURE;
}
- *output_name = (gss_name_t)name;
+ *output_name = name;
return GSS_S_COMPLETE;
}
OM_uint32 gpm_export_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
+ gssx_name *input_name,
gss_buffer_t exported_name)
{
- gssx_name *name;
int ret;
if (!minor_status) {
@@ -164,13 +158,11 @@ OM_uint32 gpm_export_name(OM_uint32 *minor_status,
return GSS_S_CALL_INACCESSIBLE_READ;
}
- name = (gssx_name *)input_name;
-
- if (name->exported_name.octet_string_len == 0) {
+ if (input_name->exported_name.octet_string_len == 0) {
return GSS_S_NAME_NOT_MN;
}
- ret = gp_copy_gssx_to_buffer(&name->exported_name, exported_name);
+ ret = gp_copy_gssx_to_buffer(&input_name->exported_name, exported_name);
if (ret) {
*minor_status = ret;
return GSS_S_FAILURE;
@@ -179,28 +171,23 @@ OM_uint32 gpm_export_name(OM_uint32 *minor_status,
}
OM_uint32 gpm_duplicate_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
- gss_name_t *dest_name)
+ gssx_name *input_name,
+ gssx_name **dest_name)
{
- gssx_name *name;
- gssx_name *namecopy;
int ret;
- name = (gssx_name *)input_name;
-
- ret = gp_copy_gssx_name_alloc(name, &namecopy);
+ ret = gp_copy_gssx_name_alloc(input_name, dest_name);
if (ret) {
*minor_status = ret;
return GSS_S_FAILURE;
}
- *dest_name = (gss_name_t)namecopy;
return GSS_S_COMPLETE;
}
OM_uint32 gpm_canonicalize_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
+ gssx_name *input_name,
const gss_OID mech_type,
- gss_name_t *output_name)
+ gssx_name **output_name)
{
union gp_rpc_arg uarg;
union gp_rpc_res ures;
@@ -208,7 +195,6 @@ OM_uint32 gpm_canonicalize_name(OM_uint32 *minor_status,
gssx_res_import_and_canon_name *res = &ures.import_and_canon_name;
uint32_t ret_maj;
uint32_t ret_min;
- gssx_name *name;
int ret;
if (!minor_status) {
@@ -223,14 +209,12 @@ OM_uint32 gpm_canonicalize_name(OM_uint32 *minor_status,
return GSS_S_CALL_INACCESSIBLE_WRITE;
}
- name = (gssx_name *)input_name;
-
memset(arg, 0, sizeof(gssx_arg_import_and_canon_name));
memset(res, 0, sizeof(gssx_res_import_and_canon_name));
/* ignore call_ctx for now */
- ret = gp_copy_gssx_name(name, &arg->input_name);
+ ret = gp_copy_gssx_name(input_name, &arg->input_name);
if (ret) {
goto done;
}
@@ -254,7 +238,7 @@ OM_uint32 gpm_canonicalize_name(OM_uint32 *minor_status,
}
/* steal output_name */
- *output_name = (gss_name_t)res->output_name;
+ *output_name = res->output_name;
res->output_name = NULL;
done:
@@ -268,40 +252,38 @@ done:
}
OM_uint32 gpm_inquire_name(OM_uint32 *minor_status,
- gss_name_t name,
+ gssx_name *name,
int *name_is_MN,
gss_OID *MN_mech,
gss_buffer_set_t *attrs)
{
gss_buffer_set_t xattrs = GSS_C_NO_BUFFER_SET;
- gssx_name *xname;
uint32_t i;
int ret;
*minor_status = 0;
- xname = (gssx_name *)name;
- if (xname->exported_name.octet_string_len != 0) {
+ if (name->exported_name.octet_string_len != 0) {
if (name_is_MN != NULL) {
*name_is_MN = 1;
}
}
if (MN_mech != NULL) {
- ret = gp_conv_gssx_to_oid_alloc(&xname->name_type, MN_mech);
+ ret = gp_conv_gssx_to_oid_alloc(&name->name_type, MN_mech);
if (ret) {
*minor_status = ret;
return GSS_S_FAILURE;
}
}
- if (xname->name_attributes.name_attributes_len != 0) {
+ if (name->name_attributes.name_attributes_len != 0) {
xattrs = calloc(1, sizeof(gss_buffer_set_desc));
if (!xattrs) {
*minor_status = ENOMEM;
return GSS_S_FAILURE;
}
- xattrs->count = xname->name_attributes.name_attributes_len;
+ xattrs->count = name->name_attributes.name_attributes_len;
xattrs->elements = calloc(xattrs->count, sizeof(gss_buffer_desc));
if (!xattrs->elements) {
free(xattrs);
@@ -310,7 +292,7 @@ OM_uint32 gpm_inquire_name(OM_uint32 *minor_status,
}
for (i = 0; i < xattrs->count; i++) {
ret = gp_copy_gssx_to_buffer(
- &xname->name_attributes.name_attributes_val[i].attr,
+ &name->name_attributes.name_attributes_val[i].attr,
&xattrs->elements[i]);
if (ret) {
for (--i; i >= 0; i--) {
@@ -329,14 +311,14 @@ OM_uint32 gpm_inquire_name(OM_uint32 *minor_status,
}
OM_uint32 gpm_release_name(OM_uint32 *minor_status,
- gss_name_t *input_name)
+ gssx_name **input_name)
{
*minor_status = 0;
- if (*input_name != GSS_C_NO_NAME) {
+ if (*input_name != NULL) {
xdr_free((xdrproc_t)xdr_gssx_name, (char *)(*input_name));
free(*input_name);
- *input_name = GSS_C_NO_NAME;
+ *input_name = NULL;
}
return GSS_S_COMPLETE;
}
@@ -356,12 +338,12 @@ OM_uint32 gpm_compare_name(OM_uint32 *minor_status,
*name_equal = 0;
- ret_maj = gpm_display_name(&ret_min, (gss_name_t)name1, &buf1, &type1);
+ ret_maj = gpm_display_name(&ret_min, name1, &buf1, &type1);
if (ret_maj != GSS_S_COMPLETE) {
goto done;
}
- ret_maj = gpm_display_name(&ret_min, (gss_name_t)name2, &buf2, &type2);
+ ret_maj = gpm_display_name(&ret_min, name2, &buf2, &type2);
if (ret_maj != GSS_S_COMPLETE) {
goto done;
}
diff --git a/proxy/src/client/gpm_indicate_mechs.c b/proxy/src/client/gpm_indicate_mechs.c
index 693e588..257541a 100644
--- a/proxy/src/client/gpm_indicate_mechs.c
+++ b/proxy/src/client/gpm_indicate_mechs.c
@@ -390,13 +390,12 @@ OM_uint32 gpm_inquire_names_for_mech(OM_uint32 *minor_status,
}
OM_uint32 gpm_inquire_mechs_for_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
+ gssx_name *input_name,
gss_OID_set *mech_types)
{
uint32_t ret_min;
uint32_t ret_maj;
uint32_t discard;
- gssx_name *name;
gss_OID name_type = GSS_C_NO_OID;
int present;
int i;
@@ -415,8 +414,7 @@ OM_uint32 gpm_inquire_mechs_for_name(OM_uint32 *minor_status,
return GSS_S_FAILURE;
}
- name = (gssx_name *)input_name;
- ret_min = gp_conv_gssx_to_oid_alloc(&name->name_type, &name_type);
+ ret_min = gp_conv_gssx_to_oid_alloc(&input_name->name_type, &name_type);
if (ret_min) {
ret_maj = GSS_S_FAILURE;
goto done;
diff --git a/proxy/src/client/gpm_init_sec_context.c b/proxy/src/client/gpm_init_sec_context.c
index ab6ed80..12df858 100644
--- a/proxy/src/client/gpm_init_sec_context.c
+++ b/proxy/src/client/gpm_init_sec_context.c
@@ -29,7 +29,7 @@
OM_uint32 gpm_init_sec_context(OM_uint32 *minor_status,
gssx_cred *cred_handle,
gssx_ctx **context_handle,
- gss_name_t target_name,
+ gssx_name *target_name,
gss_OID mech_type,
OM_uint32 req_flags,
OM_uint32 time_req,
@@ -63,9 +63,7 @@ OM_uint32 gpm_init_sec_context(OM_uint32 *minor_status,
arg->context_handle = *context_handle;
}
- if (target_name != GSS_C_NO_NAME) {
- arg->target_name = (gssx_name *)target_name;
- }
+ arg->target_name = target_name;
ret = gp_conv_oid_to_gssx(mech_type, &arg->mech_type);
if (ret) {
diff --git a/proxy/src/client/gpm_inquire_context.c b/proxy/src/client/gpm_inquire_context.c
index e417159..24ad5d1 100644
--- a/proxy/src/client/gpm_inquire_context.c
+++ b/proxy/src/client/gpm_inquire_context.c
@@ -50,8 +50,8 @@ OM_uint32 gpm_inquire_context(OM_uint32 *minor_status,
if (src_name) {
ret_maj = gpm_duplicate_name(minor_status,
- (gss_name_t)&context_handle->src_name,
- (gss_name_t *)src_name);
+ &context_handle->src_name,
+ src_name);
if (ret_maj != GSS_S_COMPLETE) {
return ret_maj;
}
@@ -59,11 +59,11 @@ OM_uint32 gpm_inquire_context(OM_uint32 *minor_status,
if (targ_name) {
ret_maj = gpm_duplicate_name(minor_status,
- (gss_name_t)&context_handle->targ_name,
- (gss_name_t *)targ_name);
+ &context_handle->targ_name,
+ targ_name);
if (ret_maj != GSS_S_COMPLETE) {
if (src_name) {
- (void)gpm_release_name(&tmp_min, (gss_name_t *)src_name);
+ (void)gpm_release_name(&tmp_min, src_name);
}
return ret_maj;
}
@@ -77,10 +77,10 @@ OM_uint32 gpm_inquire_context(OM_uint32 *minor_status,
ret = gp_conv_gssx_to_oid_alloc(&context_handle->mech, mech_type);
if (ret) {
if (src_name) {
- (void)gpm_release_name(&tmp_min, (gss_name_t *)src_name);
+ (void)gpm_release_name(&tmp_min, src_name);
}
if (targ_name) {
- (void)gpm_release_name(&tmp_min, (gss_name_t *)targ_name);
+ (void)gpm_release_name(&tmp_min, targ_name);
}
*minor_status = ret;
return GSS_S_FAILURE;
diff --git a/proxy/src/client/gssapi_gpm.h b/proxy/src/client/gssapi_gpm.h
index 2766354..706a6de 100644
--- a/proxy/src/client/gssapi_gpm.h
+++ b/proxy/src/client/gssapi_gpm.h
@@ -41,7 +41,7 @@ int gpm_make_call(int proc, union gp_rpc_arg *arg, union gp_rpc_res *res);
void gpm_free_xdrs(int proc, union gp_rpc_arg *arg, union gp_rpc_res *res);
OM_uint32 gpm_release_name(OM_uint32 *minor_status,
- gss_name_t *input_name);
+ gssx_name **input_name);
OM_uint32 gpm_release_buffer(OM_uint32 *minor_status,
gss_buffer_t buffer);
@@ -60,7 +60,7 @@ OM_uint32 gpm_accept_sec_context(OM_uint32 *minor_status,
gssx_cred *acceptor_cred_handle,
gss_buffer_t input_token_buffer,
gss_channel_bindings_t input_chan_bindings,
- gss_name_t *src_name,
+ gssx_name **src_name,
gss_OID *mech_type,
gss_buffer_t output_token,
OM_uint32 *ret_flags,
@@ -75,7 +75,7 @@ OM_uint32 gpm_delete_sec_context(OM_uint32 *minor_status,
gss_buffer_t output_token);
OM_uint32 gpm_acquire_cred(OM_uint32 *minor_status,
- const gss_name_t desired_name,
+ gssx_name *desired_name,
OM_uint32 time_req,
const gss_OID_set desired_mechs,
gss_cred_usage_t cred_usage,
@@ -85,7 +85,7 @@ OM_uint32 gpm_acquire_cred(OM_uint32 *minor_status,
OM_uint32 gpm_add_cred(OM_uint32 *minor_status,
gssx_cred *input_cred_handle,
- const gss_name_t desired_name,
+ gssx_name *desired_name,
const gss_OID desired_mech,
gss_cred_usage_t cred_usage,
OM_uint32 initiator_time_req,
@@ -113,7 +113,7 @@ OM_uint32 gpm_inquire_names_for_mech(OM_uint32 *minor_status,
gss_OID mech_type,
gss_OID_set *mech_names);
OM_uint32 gpm_inquire_mechs_for_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
+ gssx_name *input_name,
gss_OID_set *mech_types);
OM_uint32 gpm_inquire_attrs_for_mech(OM_uint32 *minor_status,
gss_OID mech,
@@ -136,25 +136,25 @@ OM_uint32 gpm_indicate_mechs_by_attrs(OM_uint32 *minor_status,
gss_OID_set *mechs);
OM_uint32 gpm_display_name(OM_uint32 *minor_status,
- gss_name_t input_name,
+ gssx_name *in_name,
gss_buffer_t output_name_buffer,
gss_OID *output_name_type);
OM_uint32 gpm_import_name(OM_uint32 *minor_status,
gss_buffer_t input_name_buffer,
gss_OID input_name_type,
- gss_name_t *output_name);
+ gssx_name **output_name);
OM_uint32 gpm_export_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
+ gssx_name *input_name,
gss_buffer_t exported_name);
OM_uint32 gpm_duplicate_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
- gss_name_t *dest_name);
+ gssx_name *input_name,
+ gssx_name **dest_name);
OM_uint32 gpm_canonicalize_name(OM_uint32 *minor_status,
- const gss_name_t input_name,
+ gssx_name *input_name,
const gss_OID mech_type,
- gss_name_t *output_name);
+ gssx_name **output_name);
OM_uint32 gpm_inquire_name(OM_uint32 *minor_status,
- gss_name_t name,
+ gssx_name *name,
int *name_is_NM,
gss_OID *NM_mech,
gss_buffer_set_t *attrs);
@@ -166,7 +166,7 @@ OM_uint32 gpm_compare_name(OM_uint32 *minor_status,
OM_uint32 gpm_init_sec_context(OM_uint32 *minor_status,
gssx_cred *cred_handle,
gssx_ctx **context_handle,
- gss_name_t target_name,
+ gssx_name *target_name,
gss_OID mech_type,
OM_uint32 req_flags,
OM_uint32 time_req,
diff --git a/proxy/src/mechglue/gss_plugin.c b/proxy/src/mechglue/gss_plugin.c
index 03e219b..f67eca4 100644
--- a/proxy/src/mechglue/gss_plugin.c
+++ b/proxy/src/mechglue/gss_plugin.c
@@ -378,7 +378,69 @@ uint32_t gpp_remote_to_local_ctx(uint32_t *minor, gssx_ctx **remote_ctx,
xdr_free((xdrproc_t)xdr_gssx_ctx, (char *)(*remote_ctx));
*remote_ctx = NULL;
+ return maj;
+}
+
+uint32_t gpp_name_to_local(uint32_t *minor, gssx_name *name,
+ gss_OID mech_type, gss_name_t *mech_name)
+{
+ uint32_t maj, min;
+ gss_buffer_desc display_name_buffer = GSS_C_EMPTY_BUFFER;
+ gss_OID display_name_type = GSS_C_NO_OID;
+ gss_name_t tmpname = NULL;
+
+ maj = gpm_display_name(minor, name,
+ &display_name_buffer,
+ &display_name_type);
+ if (maj) {
+ return maj;
+ }
+
+ maj = gss_import_name(minor,
+ &display_name_buffer,
+ display_name_type,
+ &tmpname);
+
+ (void)gss_release_buffer(&min, &display_name_buffer);
+ (void)gss_release_oid(&min, &display_name_type);
+
+ if (maj) {
+ return maj;
+ }
+
+ if (mech_type != GSS_C_NO_OID) {
+ /* name for specific mech requested */
+ maj = gss_canonicalize_name(minor,
+ tmpname,
+ gpp_special_mech(mech_type),
+ NULL);
+ }
+
+ *mech_name = tmpname;
+ return maj;
+}
+
+uint32_t gpp_local_to_name(uint32_t *minor,
+ gss_name_t local_name, gssx_name **name)
+{
+ uint32_t maj, min;
+ gss_buffer_desc display_name_buffer = GSS_C_EMPTY_BUFFER;
+ gss_OID display_name_type = GSS_C_NO_OID;
+
+ maj = gss_display_name(minor, local_name,
+ &display_name_buffer,
+ &display_name_type);
+ if (maj) {
+ return maj;
+ }
+
+ maj = gpm_import_name(minor,
+ &display_name_buffer,
+ display_name_type,
+ name);
+ (void)gss_release_buffer(&min, &display_name_buffer);
+ (void)gss_release_oid(&min, &display_name_type);
return maj;
}
diff --git a/proxy/src/mechglue/gss_plugin.h b/proxy/src/mechglue/gss_plugin.h
index 6184828..7fe5b5c 100644
--- a/proxy/src/mechglue/gss_plugin.h
+++ b/proxy/src/mechglue/gss_plugin.h
@@ -38,6 +38,11 @@ struct gpp_context_handle {
gss_ctx_id_t local;
};
+struct gpp_name_handle {
+ gssx_name *remote;
+ gss_name_t local;
+};
+
extern const gss_OID_desc gssproxy_mech_interposer;
enum gpp_behavior {
@@ -58,5 +63,9 @@ uint32_t gpp_unmap_error(uint32_t err);
uint32_t gpp_remote_to_local_ctx(uint32_t *minor, gssx_ctx **remote_ctx,
gss_ctx_id_t *local_ctx);
uint32_t gpp_copy_oid(uint32_t *minor, gss_OID in, gss_OID *out);
+uint32_t gpp_name_to_local(uint32_t *minor, gssx_name *name,
+ gss_OID mech_type, gss_name_t *mech_name);
+uint32_t gpp_local_to_name(uint32_t *minor,
+ gss_name_t local_name, gssx_name **name);
#endif /* _GSS_PLUGIN_H_ */
diff --git a/proxy/tests/cli_srv_comm.c b/proxy/tests/cli_srv_comm.c
index 57a5b1a..e203471 100644
--- a/proxy/tests/cli_srv_comm.c
+++ b/proxy/tests/cli_srv_comm.c
@@ -204,7 +204,7 @@ void *client_thread(void *pvt)
gss_buffer_desc target_buf;
gss_buffer_desc in_token = GSS_C_EMPTY_BUFFER;
gss_buffer_desc out_token = GSS_C_EMPTY_BUFFER;
- gss_name_t name = GSS_C_NO_NAME;
+ struct gssx_name *name = NULL;
struct gssx_ctx *ctx = NULL;
struct gssx_cred *cred_handle = NULL;
int ret = 0;
@@ -356,7 +356,7 @@ void *server_thread(void *pvt)
uint32_t ret_min;
struct gssx_ctx *context_handle = NULL;
struct gssx_cred *cred_handle = NULL;
- gss_name_t src_name;
+ struct gssx_name *src_name;
gss_buffer_desc out_token = GSS_C_EMPTY_BUFFER;
struct gssx_cred *deleg_cred = NULL;
gss_OID_set mech_set = GSS_C_NO_OID_SET;
@@ -372,8 +372,8 @@ void *server_thread(void *pvt)
gss_buffer_desc long_desc = GSS_C_EMPTY_BUFFER;
gss_OID_set mechs = GSS_C_NO_OID_SET;
gss_buffer_desc target_buf;
- gss_name_t target_name = GSS_C_NO_NAME;
- gss_name_t canon_name = GSS_C_NO_NAME;
+ struct gssx_name *target_name = NULL;
+ struct gssx_name *canon_name = NULL;
gss_buffer_desc out_name_buf = GSS_C_EMPTY_BUFFER;
gss_OID out_name_type = GSS_C_NO_OID;
gss_buffer_desc msg_token = GSS_C_EMPTY_BUFFER;
@@ -473,7 +473,7 @@ void *server_thread(void *pvt)
}
ret_maj = gpm_acquire_cred(&ret_min,
- GSS_C_NO_NAME,
+ NULL,
GSS_C_INDEFINITE,
mech_set,
GSS_C_ACCEPT,