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 }
|