1 /* -*- mode: c; indent-tabs-mode: nil -*- */
2 /*
3 * Copyright 1993 by OpenVision Technologies, Inc.
4 *
5 * Permission to use, copy, modify, distribute, and sell this software
6 * and its documentation for any purpose is hereby granted without fee,
7 * provided that the above copyright notice appears in all copies and
8 * that both that copyright notice and this permission notice appear in
9 * supporting documentation, and that the name of OpenVision not be used
10 * in advertising or publicity pertaining to distribution of the software
11 * without specific, written prior permission. OpenVision makes no
12 * representations about the suitability of this software for any
13 * purpose. It is provided "as is" without express or implied warranty.
14 *
15 * OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
16 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
17 * EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
18 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
19 * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
20 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
21 * PERFORMANCE OF THIS SOFTWARE.
22 */
23
24 #ifndef _GSSAPIP_GENERIC_H_
25 #define _GSSAPIP_GENERIC_H_
26
27 /*
28 * $Id$
29 */
30
31 #if defined(_WIN32)
32 #include "k5-int.h"
33 #else
34 #include "autoconf.h"
35 #ifdef HAVE_STDLIB_H
36 #include <stdlib.h>
37 #endif
38 #endif
39
40 #include "k5-thread.h"
41
42 #include "gssapi_generic.h"
43 #include "gssapi_ext.h"
44 #include <gssapi/gssapi_alloc.h>
45 #include "gssapi_err_generic.h"
46 #include <errno.h>
47
48 #include "k5-platform.h"
49 #include "k5-buf.h"
50 #include "k5-input.h"
51
52 /** helper macros **/
53
54 #define g_OID_equal(o1, o2) \
55 (((o1)->length == (o2)->length) && \
56 (memcmp((o1)->elements, (o2)->elements, (o1)->length) == 0))
57
58 /** malloc wrappers; these may actually do something later */
59
60 #define xmalloc(n) malloc(n)
61 #define xrealloc(p,n) realloc(p,n)
62 #ifdef xfree
63 #undef xfree
64 #endif
65 #define xfree(p) free(p)
66
67 /** helper functions **/
68
69 /* hide names from applications, especially glib applications */
70 #define g_make_string_buffer gssint_g_make_string_buffer
71 #define g_token_size gssint_g_token_size
72 #define g_make_token_header gssint_g_make_token_header
73 #define g_get_token_header gssint_g_get_token_header
74 #define g_verify_token_header gssint_g_verify_token_header
75 #define g_display_major_status gssint_g_display_major_status
76 #define g_display_com_err_status gssint_g_display_com_err_status
77 #define g_seqstate_init gssint_g_seqstate_init
78 #define g_seqstate_check gssint_g_seqstate_check
79 #define g_seqstate_free gssint_g_seqstate_free
80 #define g_seqstate_size gssint_g_seqstate_size
81 #define g_seqstate_externalize gssint_g_seqstate_externalize
82 #define g_seqstate_internalize gssint_g_seqstate_internalize
83 #define g_canonicalize_host gssint_g_canonicalize_host
84
85 typedef struct g_seqnum_state_st *g_seqnum_state;
86
87 int g_make_string_buffer (const char *str, gss_buffer_t buffer);
88
89 unsigned int g_token_size (const gss_OID_desc * mech, unsigned int body_size);
90
91 void g_make_token_header (struct k5buf *buf, const gss_OID_desc *mech,
92 size_t body_size, int tok_type);
93
94 int g_get_token_header (struct k5input *in, gss_OID oid_out,
95 size_t *token_len_out);
96
97 int g_verify_token_header(struct k5input *in, gss_const_OID expected_mech);
98
99 OM_uint32 g_display_major_status (OM_uint32 *minor_status,
100 OM_uint32 status_value,
101 OM_uint32 *message_context,
102 gss_buffer_t status_string);
103
104 OM_uint32 g_display_com_err_status (OM_uint32 *minor_status,
105 OM_uint32 status_value,
106 gss_buffer_t status_string);
107
108 long g_seqstate_init(g_seqnum_state *state_out, uint64_t seqnum,
109 int do_replay, int do_sequence, int wide);
110 OM_uint32 g_seqstate_check(g_seqnum_state state, uint64_t seqnum);
111 void g_seqstate_free(g_seqnum_state state);
112 void g_seqstate_size(g_seqnum_state state, size_t *sizep);
113 long g_seqstate_externalize(g_seqnum_state state, unsigned char **buf,
114 size_t *lenremain);
115 long g_seqstate_internalize(g_seqnum_state *state_out, unsigned char **buf,
116 size_t *lenremain);
117
118 /** declarations of internal name mechanism functions **/
119
120 OM_uint32
121 generic_gss_release_buffer(
122 OM_uint32 *, /* minor_status */
123 gss_buffer_t); /* buffer */
124
125 OM_uint32
126 generic_gss_release_oid_set(
127 OM_uint32 *, /* minor_status */
128 gss_OID_set *); /* set */
129
130 OM_uint32
131 generic_gss_release_oid(
132 OM_uint32 *, /* minor_status */
133 gss_OID *); /* set */
134
135 OM_uint32
136 generic_gss_copy_oid(
137 OM_uint32 *, /* minor_status */
138 const gss_OID_desc * const, /* oid */
139 gss_OID *); /* new_oid */
140
141 OM_uint32
142 generic_gss_create_empty_oid_set(
143 OM_uint32 *, /* minor_status */
144 gss_OID_set *); /* oid_set */
145
146 OM_uint32
147 generic_gss_add_oid_set_member(
148 OM_uint32 *, /* minor_status */
149 const gss_OID_desc * const, /* member_oid */
150 gss_OID_set *); /* oid_set */
151
152 OM_uint32
153 generic_gss_test_oid_set_member(
154 OM_uint32 *, /* minor_status */
155 const gss_OID_desc * const, /* member */
156 gss_OID_set, /* set */
157 int *); /* present */
158
159 OM_uint32
160 generic_gss_oid_to_str(
161 OM_uint32 *, /* minor_status */
162 const gss_OID_desc * const, /* oid */
163 gss_buffer_t); /* oid_str */
164
165 OM_uint32
166 generic_gss_str_to_oid(
167 OM_uint32 *, /* minor_status */
168 gss_buffer_t, /* oid_str */
169 gss_OID *); /* oid */
170
171 OM_uint32
172 generic_gss_oid_compose(
173 OM_uint32 *, /* minor_status */
174 const char *, /* prefix */
175 size_t, /* prefix_len */
176 int, /* suffix */
177 gss_OID_desc *); /* oid */
178
179 OM_uint32
180 generic_gss_oid_decompose(
181 OM_uint32 *, /* minor_status */
182 const char *, /*prefix */
183 size_t, /* prefix_len */
184 gss_OID_desc *, /* oid */
185 int *); /* suffix */
186
187 int gssint_mecherrmap_init(void);
188 void gssint_mecherrmap_destroy(void);
189 OM_uint32 gssint_mecherrmap_map(OM_uint32 minor, const gss_OID_desc *oid);
190 int gssint_mecherrmap_get(OM_uint32 minor, gss_OID mech_oid,
191 OM_uint32 *mech_minor);
192 OM_uint32 gssint_mecherrmap_map_errcode(OM_uint32 errcode);
193
194 /*
195 * Transfer contents of a k5buf to a gss_buffer and invalidate the source
196 * On unix, this is a simple pointer copy
197 * On windows, memory is reallocated and copied.
198 */
199 static inline OM_uint32
k5buf_to_gss(OM_uint32 * minor,struct k5buf * input_k5buf,gss_buffer_t output_buffer)200 k5buf_to_gss(OM_uint32 *minor,
201 struct k5buf *input_k5buf,
202 gss_buffer_t output_buffer)
203 {
204 OM_uint32 status = GSS_S_COMPLETE;
205
206 if (k5_buf_status(input_k5buf) != 0) {
207 *minor = ENOMEM;
208 return GSS_S_FAILURE;
209 }
210 output_buffer->length = input_k5buf->len;
211 #if defined(_WIN32) || defined(DEBUG_GSSALLOC)
212 if (output_buffer->length > 0) {
213 output_buffer->value = gssalloc_malloc(output_buffer->length);
214 if (output_buffer->value) {
215 memcpy(output_buffer->value, input_k5buf->data,
216 output_buffer->length);
217 } else {
218 status = GSS_S_FAILURE;
219 *minor = ENOMEM;
220 }
221 } else {
222 output_buffer->value = NULL;
223 }
224 k5_buf_free(input_k5buf);
225 #else
226 output_buffer->value = input_k5buf->data;
227 memset(input_k5buf, 0, sizeof(*input_k5buf));
228 #endif
229 return status;
230 }
231
232 OM_uint32 generic_gss_create_empty_buffer_set
233 (OM_uint32 * /*minor_status*/,
234 gss_buffer_set_t * /*buffer_set*/);
235
236 OM_uint32 generic_gss_add_buffer_set_member
237 (OM_uint32 * /*minor_status*/,
238 const gss_buffer_t /*member_buffer*/,
239 gss_buffer_set_t * /*buffer_set*/);
240
241 OM_uint32 generic_gss_release_buffer_set
242 (OM_uint32 * /*minor_status*/,
243 gss_buffer_set_t * /*buffer_set*/);
244
245 OM_uint32 generic_gss_copy_oid_set
246 (OM_uint32 *, /* minor_status */
247 const gss_OID_set_desc * const /*oidset*/,
248 gss_OID_set * /*new_oidset*/);
249
250 extern gss_OID_set gss_ma_known_attrs;
251
252 OM_uint32 generic_gss_display_mech_attr(
253 OM_uint32 *minor_status,
254 gss_const_OID mech_attr,
255 gss_buffer_t name,
256 gss_buffer_t short_desc,
257 gss_buffer_t long_desc);
258
259 #endif /* _GSSAPIP_GENERIC_H_ */
260