2 * Copyright (c) 2005 Doug Rabson
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * $FreeBSD: src/lib/libgssapi/gss_import_sec_context.c,v 1.1 2005/12/29 14:40:20 dfr Exp $
29 #include "mech_locl.h"
31 GSSAPI_LIB_FUNCTION OM_uint32 GSSAPI_LIB_CALL
32 gss_import_sec_context(OM_uint32
*minor_status
,
33 const gss_buffer_t interprocess_token
,
34 gss_ctx_id_t
*context_handle
)
36 OM_uint32 ret
= GSS_S_FAILURE
, tmp_minor
;
38 gssapi_mech_interface m
;
39 struct _gss_context
*ctx
= NULL
;
40 gss_buffer_desc buf
= GSS_C_EMPTY_BUFFER
;
41 unsigned char verflags
;
43 _gss_mg_log(10, "gss-isc called");
45 if (!context_handle
) {
46 *minor_status
= EFAULT
;
47 return GSS_S_CALL_INACCESSIBLE_WRITE
;
51 *context_handle
= GSS_C_NO_CONTEXT
;
53 sp
= krb5_storage_from_mem(interprocess_token
->value
,
54 interprocess_token
->length
);
56 *minor_status
= ENOMEM
;
59 krb5_storage_set_byteorder(sp
, KRB5_STORAGE_BYTEORDER_PACKED
);
61 ctx
= calloc(1, sizeof(struct _gss_context
));
63 *minor_status
= ENOMEM
;
67 if (krb5_ret_uint8(sp
, &verflags
))
70 if ((verflags
& EXPORT_CONTEXT_VERSION_MASK
) != 0) {
71 _gss_mg_log(10, "gss-isc failed, token version %d not recognised",
72 (int)(verflags
& EXPORT_CONTEXT_VERSION_MASK
));
73 /* We don't recognise the version */
77 if (verflags
& EXPORT_CONTEXT_FLAG_ACCUMULATING
) {
80 if (krb5_ret_uint8(sp
, &ctx
->gc_initial
))
83 if (krb5_ret_uint32(sp
, &target_len
))
86 ret
= _gss_mg_ret_buffer(minor_status
, sp
, &buf
);
87 if (ret
!= GSS_S_COMPLETE
)
90 ctx
->gc_free_this
= ctx
->gc_input
.value
= calloc(target_len
, 1);
91 if (ctx
->gc_input
.value
== NULL
)
94 ctx
->gc_target_len
= target_len
;
95 ctx
->gc_input
.length
= buf
.length
;
97 memcpy(ctx
->gc_input
.value
, buf
.value
, buf
.length
);
99 gss_release_buffer(&tmp_minor
, &buf
);
102 if (verflags
& EXPORT_CONTEXT_FLAG_MECH_CTX
) {
105 ret
= _gss_mg_ret_oid(minor_status
, sp
, &mech_oid
);
106 if (ret
!= GSS_S_COMPLETE
)
109 if (mech_oid
== GSS_C_NO_OID
) {
110 ret
= GSS_S_BAD_MECH
;
114 m
= __gss_get_mechanism(mech_oid
);
116 ret
= GSS_S_DEFECTIVE_TOKEN
;
121 ret
= _gss_mg_ret_buffer(minor_status
, sp
, &buf
);
122 if (ret
!= GSS_S_COMPLETE
)
125 if (buf
.value
== NULL
) {
126 ret
= GSS_S_DEFECTIVE_TOKEN
;
130 ret
= m
->gm_import_sec_context(minor_status
, &buf
, &ctx
->gc_ctx
);
131 if (ret
!= GSS_S_COMPLETE
) {
132 _gss_mg_error(m
, *minor_status
);
137 *context_handle
= (gss_ctx_id_t
) ctx
;
140 ret
= GSS_S_COMPLETE
;
144 krb5_storage_free(sp
);
145 _gss_secure_release_buffer(&tmp_minor
, &buf
);