Sdiff g_imp_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_imp_sec_context.c        1.19    04/09/08 SMI" 
  7 
  8 /*
  9  *  glue routine gss_export_sec_context
 10  */
 11 
 12 #include <mechglueP.h>
 13 #include <stdio.h>
 14 #include <errno.h>
 15 #include <stdlib.h>
 16 #include <string.h>
 17 
 18 OM_uint32
 19 gss_import_sec_context(minor_status,
 20                         interprocess_token,
 21                         context_handle)
 22 
 23 OM_uint32 *             minor_status;
 24 const gss_buffer_t      interprocess_token;
 25 gss_ctx_id_t            *context_handle;
 26 
 27 {
 28         OM_uint32               length; 
 29         OM_uint32               status;
 30         char                    *p;
 31         gss_union_ctx_id_t      ctx;
 32         gss_buffer_desc         token;
 33         gss_mechanism           mech;
 34 
 35         gss_initialize(); 
 36  
 37         *minor_status = 0;
 38 
 39         if (interprocess_token->length == 0 || interprocess_token->value == 0) 
 40                 return (GSS_S_DEFECTIVE_TOKEN); 

 41 



 42         status = GSS_S_FAILURE;
 43 
 44         ctx = (gss_union_ctx_id_t)malloc(sizeof (gss_union_ctx_id_desc));
 45         if (!ctx) { 
 46                 *minor_status = ENOMEM; 
 47                 return (GSS_S_FAILURE);
 48         } 
 49         ctx->mech_type = (gss_OID) malloc(sizeof (gss_OID_desc));
 50         if (!ctx->mech_type) {
 51                 *minor_status = ENOMEM; 
 52                 goto error_out; 
 53         }


 54         p = interprocess_token->value;
 55         length = (OM_uint32)*p++;
 56         length = (OM_uint32)(length << 8) + *p++;
 57         length = (OM_uint32)(length << 8) + *p++;
 58         length = (OM_uint32)(length << 8) + *p++;

 59 






 60         ctx->mech_type->length = length;
 61         ctx->mech_type->elements = malloc(length);
 62         if (!ctx->mech_type->elements) {
 63                 *minor_status = ENOMEM; 
 64                 goto error_out;
 65         }
 66         (void) memcpy(ctx->mech_type->elements, p, length);
 67         p += length;
 68 
 69         token.length = interprocess_token->length - 4 - length; 
 70         token.value = p;
 71 
 72         /*
 73          * select the approprate underlying mechanism routine and
 74          * call it.
 75          */
 76 
 77         mech = __gss_get_mechanism(ctx->mech_type);
 78         if (!mech) {
 79                 status = GSS_S_BAD_MECH;
 80                 goto error_out;
 81         }
 82         if (!mech->gss_import_sec_context) {
 83                 status = GSS_S_BAD_BINDINGS; 
 84                 goto error_out;
 85         }
 86 
 87         status = mech->gss_import_sec_context(mech->context, minor_status,
 88                                         &token, &ctx->internal_ctx_id);
 89 
 90         if (status == GSS_S_COMPLETE) {
 91                 *context_handle = (gss_ctx_id_t)ctx;
 92                 return (GSS_S_COMPLETE);
 93         }
 94 
 95 error_out:
 96         if (ctx) {
 97                 if (ctx->mech_type) {
 98                         if (ctx->mech_type->elements)
 99                                 free(ctx->mech_type->elements);
100                         free(ctx->mech_type);
101                 }
102                 free(ctx);
103         }
  1 /*
  2  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  3  * Use is subject to license terms.
  4  */
  5 
  6 #pragma ident   "@(#)g_imp_sec_context.c        1.18    04/02/23 SMI" 
  7 
  8 /*
  9  *  glue routine gss_export_sec_context
 10  */
 11 
 12 #include <mechglueP.h>
 13 #include <stdio.h>
 14 #include <errno.h>
 15 #include <stdlib.h>
 16 #include <string.h>
 17 
 18 OM_uint32
 19 gss_import_sec_context(minor_status,
 20                         interprocess_token,
 21                         context_handle)
 22 
 23 OM_uint32 *             minor_status;
 24 const gss_buffer_t      interprocess_token;
 25 gss_ctx_id_t            *context_handle;
 26 
 27 {
 28         OM_uint32               length = 0; 
 29         OM_uint32               status;
 30         char                    *p;
 31         gss_union_ctx_id_t      ctx;
 32         gss_buffer_desc         token;
 33         gss_mechanism           mech;
 34 
 35         if (minor_status == NULL) 
 36                 return (GSS_S_CALL_INACCESSIBLE_WRITE); 
 37         *minor_status = 0;
 38 
 39         if (context_handle == NULL) 
 40                 return (GSS_S_CALL_INACCESSIBLE_WRITE | GSS_S_NO_CONTEXT); 
 41         *context_handle = GSS_C_NO_CONTEXT; 
 42 
 43         if (GSS_EMPTY_BUFFER(interprocess_token))
 44                 return (GSS_S_CALL_INACCESSIBLE_READ | GSS_S_DEFECTIVE_TOKEN);
 45 
 46         status = GSS_S_FAILURE;
 47 
 48         ctx = (gss_union_ctx_id_t)malloc(sizeof (gss_union_ctx_id_desc));
 49         if (!ctx) 

 50                 return (GSS_S_FAILURE);
 51  
 52         ctx->mech_type = (gss_OID) malloc(sizeof (gss_OID_desc));
 53         if (!ctx->mech_type) {
 54                 free(ctx); 
 55                 return (GSS_S_FAILURE); 
 56         }
 57 
 58         if (interprocess_token->length >= sizeof (OM_uint32)) {
 59                 p = interprocess_token->value;
 60                 length = (OM_uint32)*p++;
 61                 length = (OM_uint32)(length << 8) + *p++;
 62                 length = (OM_uint32)(length << 8) + *p++;
 63                 length = (OM_uint32)(length << 8) + *p++;
 64         }
 65 
 66         if (length == 0 ||
 67             length > (interprocess_token->length - sizeof (OM_uint32))) {
 68                 free(ctx);
 69                 return (GSS_S_CALL_BAD_STRUCTURE | GSS_S_DEFECTIVE_TOKEN);
 70         }
 71 
 72         ctx->mech_type->length = length;
 73         ctx->mech_type->elements = malloc(length);
 74         if (!ctx->mech_type->elements) {

 75                 goto error_out;
 76         }
 77         (void) memcpy(ctx->mech_type->elements, p, length);
 78         p += length;
 79 
 80         token.length = interprocess_token->length - sizeof (OM_uint32) - length; 
 81         token.value = p;
 82 
 83         /*
 84          * select the approprate underlying mechanism routine and
 85          * call it.
 86          */
 87 
 88         mech = __gss_get_mechanism(ctx->mech_type);
 89         if (!mech) {
 90                 status = GSS_S_BAD_MECH;
 91                 goto error_out;
 92         }
 93         if (!mech->gss_import_sec_context) {
 94                 status = GSS_S_UNAVAILABLE; 
 95                 goto error_out;
 96         }
 97 
 98         status = mech->gss_import_sec_context(mech->context, minor_status,
 99                                         &token, &ctx->internal_ctx_id);
100 
101         if (status == GSS_S_COMPLETE) {
102                 *context_handle = (gss_ctx_id_t)ctx;
103                 return (GSS_S_COMPLETE);
104         }
105 
106 error_out:
107         if (ctx) {
108                 if (ctx->mech_type) {
109                         if (ctx->mech_type->elements)
110                                 free(ctx->mech_type->elements);
111                         free(ctx->mech_type);
112                 }
113                 free(ctx);
114         }