diff options
Diffstat (limited to 'proxy/src/mechglue/gss_plugin.c')
-rw-r--r-- | proxy/src/mechglue/gss_plugin.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/proxy/src/mechglue/gss_plugin.c b/proxy/src/mechglue/gss_plugin.c index ac9f678..96df022 100644 --- a/proxy/src/mechglue/gss_plugin.c +++ b/proxy/src/mechglue/gss_plugin.c @@ -25,6 +25,7 @@ #include "gss_plugin.h" #include <signal.h> +#include <endian.h> #include <gssapi/gssapi_krb5.h> #define KRB5_OID_LEN 9 @@ -395,6 +396,34 @@ uint32_t gpp_unmap_error(uint32_t err) return err; } +uint32_t gpp_wrap_sec_ctx_token(uint32_t *minor, gss_OID mech_type, + gss_buffer_t token, gss_buffer_t wrap_token) +{ + gss_OID spmech; + uint32_t len; + + spmech = gpp_special_mech(mech_type); + if (spmech == GSS_C_NO_OID) { + return GSS_S_FAILURE; + } + + wrap_token->length = sizeof(uint32_t) + spmech->length + token->length; + wrap_token->value = malloc(wrap_token->length); + if (!wrap_token->value) { + wrap_token->length = 0; + return GSS_S_FAILURE; + } + + len = htobe32(spmech->length); + memcpy(wrap_token->value, &len, sizeof(uint32_t)); + memcpy(wrap_token->value + sizeof(uint32_t), + spmech->elements, spmech->length); + memcpy(wrap_token->value + sizeof(uint32_t) + spmech->length, + token->value, token->length); + + return GSS_S_COMPLETE; +} + uint32_t gpp_remote_to_local_ctx(uint32_t *minor, gssx_ctx **remote_ctx, gss_ctx_id_t *local_ctx) { |