Sdiff g_exp_sec_context.c
  1 /*
  2  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  3  * Use is subject to license terms.
  4  */
  5 
  6 #pragma ident   "@(#)g_exp_sec_context.c        1.15    04/09/08 SMI" 
  7 
  8 /*
  9  *  glue routine for gss_export_sec_context
 10  */
 11 
 12 #include <mechglueP.h>
 13 #include <stdio.h>
 14 #include <errno.h>
 15 #ifdef HAVE_STDLIB_H
 16 #include <stdlib.h>
 17 #endif
 18 #include <string.h>
 19 
 20 OM_uint32
 21 gss_export_sec_context(minor_status,
 22                         context_handle,
 23                         interprocess_token)
 24 
 25 OM_uint32 *minor_status;
 26 gss_ctx_id_t *context_handle;
 27 gss_buffer_t interprocess_token;
 28 
 29 {
 30         OM_uint32               status;
 31         size_t                  length; 
 32         gss_union_ctx_id_t      ctx;
 33         gss_mechanism           mech;
 34         gss_buffer_desc         token;
 35         char                    *buf;
 36 
 37         gss_initialize(); 


 38 
 39         if (context_handle == NULL || *context_handle == GSS_C_NO_CONTEXT)
 40                 return (GSS_S_NO_CONTEXT); 
 41 



 42         /*
 43          * select the approprate underlying mechanism routine and
 44          * call it.
 45          */
 46 
 47         ctx = (gss_union_ctx_id_t)*context_handle;
 48         mech = __gss_get_mechanism(ctx->mech_type);
 49         if (!mech)
 50                 return (GSS_S_BAD_MECH);
 51         if (!mech->gss_export_sec_context)
 52                 return (GSS_S_BAD_BINDINGS); 
 53 
 54         status = mech->gss_export_sec_context(mech->context, minor_status,
 55                                         &ctx->internal_ctx_id, &token);
 56         if (status != GSS_S_COMPLETE)
 57                 return (status);
 58 
 59         length = token.length + 4 + ctx->mech_type->length;
 60         interprocess_token->length = length;
 61         interprocess_token->value = malloc(length);
 62         if (interprocess_token->value == 0) {
 63                 (void) gss_release_buffer(minor_status, &token);
 64                 *minor_status = ENOMEM; 
 65                 return (GSS_S_FAILURE);
 66         }
 67         buf = interprocess_token->value;
 68         length = ctx->mech_type->length;
 69         buf[3] = (unsigned char) (length & 0xFF);
 70         length >>= 8;
 71         buf[2] = (unsigned char) (length & 0xFF);
 72         length >>= 8;
 73         buf[1] = (unsigned char) (length & 0xFF);
 74         length >>= 8;
 75         buf[0] = (unsigned char) (length & 0xFF);
 76         (void) memcpy(buf+4, ctx->mech_type->elements,
 77                         (size_t)ctx->mech_type->length);
 78         (void) memcpy(buf+4+ctx->mech_type->length, token.value, token.length);
 79 
 80         (void) gss_release_buffer(minor_status, &token);
 81 
 82         free(ctx->mech_type->elements);
 83         free(ctx->mech_type);
 84         free(ctx);
  1 /*
  2  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  3  * Use is subject to license terms.
  4  */
  5 
  6 #pragma ident   "@(#)g_exp_sec_context.c        1.14    04/02/23 SMI" 
  7 
  8 /*
  9  *  glue routine for gss_export_sec_context
 10  */
 11 
 12 #include <mechglueP.h>
 13 #include <stdio.h>
 14 #include <errno.h>
 15 #ifdef HAVE_STDLIB_H
 16 #include <stdlib.h>
 17 #endif
 18 #include <string.h>
 19 
 20 OM_uint32
 21 gss_export_sec_context(minor_status,
 22                         context_handle,
 23                         interprocess_token)
 24 
 25 OM_uint32 *minor_status;
 26 gss_ctx_id_t *context_handle;
 27 gss_buffer_t interprocess_token;
 28 
 29 {
 30         OM_uint32               status;
 31         OM_uint32               length; 
 32         gss_union_ctx_id_t      ctx;
 33         gss_mechanism           mech;
 34         gss_buffer_desc         token;
 35         char                    *buf;
 36 
 37         if (minor_status == NULL) 
 38                 return (GSS_S_CALL_INACCESSIBLE_WRITE); 
 39         *minor_status = 0; 
 40 
 41         if (context_handle == NULL || *context_handle == GSS_C_NO_CONTEXT)
 42                 return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_NO_CONTEXT); 
 43 
 44         if (interprocess_token == NULL)
 45                 return (GSS_S_CALL_INACCESSIBLE_READ);
 46 
 47         /*
 48          * select the approprate underlying mechanism routine and
 49          * call it.
 50          */
 51 
 52         ctx = (gss_union_ctx_id_t)*context_handle;
 53         mech = __gss_get_mechanism(ctx->mech_type);
 54         if (!mech)
 55                 return (GSS_S_BAD_MECH);
 56         if (!mech->gss_export_sec_context)
 57                 return (GSS_S_UNAVAILABLE); 
 58 
 59         status = mech->gss_export_sec_context(mech->context, minor_status,
 60                                         &ctx->internal_ctx_id, &token);
 61         if (status != GSS_S_COMPLETE)
 62                 return (status);
 63 
 64         length = token.length + 4 + ctx->mech_type->length;
 65         interprocess_token->length = length;
 66         interprocess_token->value = malloc(length);
 67         if (interprocess_token->value == 0) {
 68                 (void) gss_release_buffer(minor_status, &token);

 69                 return (GSS_S_FAILURE);
 70         }
 71         buf = interprocess_token->value;
 72         length = ctx->mech_type->length;
 73         buf[3] = (unsigned char) (length & 0xFF);
 74         length >>= 8;
 75         buf[2] = (unsigned char) (length & 0xFF);
 76         length >>= 8;
 77         buf[1] = (unsigned char) (length & 0xFF);
 78         length >>= 8;
 79         buf[0] = (unsigned char) (length & 0xFF);
 80         (void) memcpy(buf+4, ctx->mech_type->elements,
 81                         (size_t)ctx->mech_type->length);
 82         (void) memcpy(buf+4+ctx->mech_type->length, token.value, token.length);
 83 
 84         (void) gss_release_buffer(minor_status, &token);
 85 
 86         free(ctx->mech_type->elements);
 87         free(ctx->mech_type);
 88         free(ctx);