summaryrefslogtreecommitdiffstats
path: root/proxy/src/mechglue/gss_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'proxy/src/mechglue/gss_plugin.c')
-rw-r--r--proxy/src/mechglue/gss_plugin.c29
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)
{