1 /*
2  * Copyright 1993 by OpenVision Technologies, Inc.
3  *
4  * Permission to use, copy, modify, distribute, and sell this software
5  * and its documentation for any purpose is hereby granted without fee,
6  * provided that the above copyright notice appears in all copies and
7  * that both that copyright notice and this permission notice appear in
8  * supporting documentation, and that the name of OpenVision not be used
9  * in advertising or publicity pertaining to distribution of the software
10  * without specific, written prior permission. OpenVision makes no
11  * representations about the suitability of this software for any
12  * purpose.  It is provided "as is" without express or implied warranty.
13  *
14  * OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16  * EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
18  * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
19  * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20  * PERFORMANCE OF THIS SOFTWARE.
21  */
22 
23 /*
24  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
25  * Use is subject to license terms.
26  */
27 
28 #ifndef _GSSAPIP_GENERIC_H_
29 #define _GSSAPIP_GENERIC_H_
30 
31 #pragma ident	"%Z%%M%	%I%	%E% SMI"
32 
33 /*
34  * $Id: gssapiP_generic.h,v 1.24 1998/10/30 02:54:06 marc Exp $
35  */
36 
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40 
41 #if !defined(PROTOTYPE)
42 #define     PROTOTYPE(x) x
43 #endif
44 
45 #if (defined(_MSDOS) || defined(_WIN32) || defined(macintosh))
46 #include <k5-int.h>
47 #else
48 #ifdef HAVE_STDLIB_H
49 #ifndef _KERNEL
50 #include <stdlib.h>
51 #endif /* !_KERNEL */
52 #endif /* HAVE_STDLIB_H */
53 #endif
54 
55 #include <mechglueP.h>
56 #include <gssapi/gssapi_ext.h>
57 #include <gssapi/gssapi.h>
58 #include "gssapi_generic.h"
59 #include "gssapi_err_generic.h"
60 #ifdef  _KERNEL
61 #include <sys/errno.h>
62 #else
63 #include <errno.h>
64 #endif
65 
66 /** helper macros **/
67 
68 typedef uint64_t gssint_uint64;
69 
70 #if 0 	/* this is defined in usr/src/uts/common/gssapi/gssapi_ext.h */
71 #define g_OID_equal(o1,o2) \
72    (((o1)->length == (o2)->length) && \
73     (memcmp((o1)->elements,(o2)->elements,(int) (o1)->length) == 0))
74 #endif
75 
76 /* this code knows that an int on the wire is 32 bits.  The type of
77    num should be at least this big, or the extra shifts may do weird
78    things */
79 
80 #define TWRITE_INT(ptr, num, bigend) \
81    (ptr)[0] = (char) ((bigend)?((num)>>24):((num)&0xff)); \
82    (ptr)[1] = (char) ((bigend)?(((num)>>16)&0xff):(((num)>>8)&0xff)); \
83    (ptr)[2] = (char) ((bigend)?(((num)>>8)&0xff):(((num)>>16)&0xff)); \
84    (ptr)[3] = (char) ((bigend)?((num)&0xff):((num)>>24)); \
85    (ptr) += 4;
86 
87 #define TWRITE_INT16(ptr, num, bigend) \
88    (ptr)[0] = (char) ((bigend)?((num)>>24):((num)&0xff)); \
89    (ptr)[1] = (char) ((bigend)?(((num)>>16)&0xff):(((num)>>8)&0xff)); \
90    (ptr) += 2;
91 
92 #define TREAD_INT(ptr, num, bigend) \
93    (num) = (((ptr)[0]<<((bigend)?24: 0)) | \
94             ((ptr)[1]<<((bigend)?16: 8)) | \
95             ((ptr)[2]<<((bigend)? 8:16)) | \
96             ((ptr)[3]<<((bigend)? 0:24))); \
97    (ptr) += 4;
98 
99 #define TREAD_INT16(ptr, num, bigend) \
100    (num) = (((ptr)[0]<<((bigend)?24: 0)) | \
101             ((ptr)[1]<<((bigend)?16: 8))); \
102    (ptr) += 2;
103 
104 #define TWRITE_STR(ptr, str, len) \
105    (void) memcpy((ptr), (char *) (str), (len)); \
106    (ptr) += (len);
107 
108 #define TREAD_STR(ptr, str, len) \
109    (str) = (ptr); \
110    (ptr) += (len);
111 
112 #define TWRITE_BUF(ptr, buf, bigend) \
113    TWRITE_INT((ptr), (buf).length, (bigend)); \
114    TWRITE_STR((ptr), (buf).value, (buf).length);
115 
116 /** malloc wrappers; these may actually do something later */
117 
118 #ifdef _KERNEL
119 #define xmalloc(n) MALLOC(n)
120 #else
121 #define xmalloc(n) malloc(n)
122 #endif
123 
124 #define xrealloc(p,n) realloc(p,n)
125 #ifdef xfree
126 #undef xfree
127 #endif
128 
129 #ifdef _KERNEL
130 #define xfree_wrap(p,sze) kmem_free(p,sze)
131 #else
132 #define xfree_wrap(p,sze) free(p)
133 #define xfree(p) free(p)
134 #endif
135 
136 /** helper functions **/
137 
138 typedef struct _g_set *g_set;
139 
140 int g_set_init (g_set *s);
141 int g_set_destroy (g_set *s);
142 int g_set_entry_add (g_set *s, void *key, void *value);
143 int g_set_entry_delete (g_set *s, void *key);
144 int g_set_entry_get (g_set *s, void *key, void **value);
145 
146 int g_save_name (void **vdb, gss_name_t name);
147 int g_save_cred_id (void **vdb, gss_cred_id_t cred);
148 int g_save_ctx_id (void **vdb, gss_ctx_id_t ctx);
149 
150 int g_validate_name (void **vdb, gss_name_t name);
151 int g_validate_cred_id (void **vdb, gss_cred_id_t cred);
152 int g_validate_ctx_id (void **vdb, gss_ctx_id_t ctx);
153 
154 int g_delete_name (void **vdb, gss_name_t name);
155 int g_delete_cred_id (void **vdb, gss_cred_id_t cred);
156 int g_delete_ctx_id (void **vdb, gss_ctx_id_t ctx);
157 
158 int g_make_string_buffer (const char *str, gss_buffer_t buffer);
159 
160 int g_copy_OID_set (const gss_OID_set_desc * const in, gss_OID_set *out);
161 
162 int g_token_size (gss_OID mech, unsigned int body_size);
163 
164 void g_make_token_header (gss_OID mech, int body_size,
165 			  unsigned char **buf, int tok_type);
166 
167 gss_int32 g_verify_token_header (gss_OID mech, unsigned int *body_size,
168                                  unsigned char **buf, int tok_type,
169                                  unsigned int toksize_in,
170                                  int wrapper_required);
171 
172 OM_uint32 g_display_major_status (OM_uint32 *minor_status,
173 				 OM_uint32 status_value,
174 				 OM_uint32 *message_context,
175 				 gss_buffer_t status_string);
176 
177 OM_uint32 g_display_com_err_status (OM_uint32 *minor_status,
178 				   OM_uint32 status_value,
179 				   gss_buffer_t status_string);
180 
181 gss_int32 g_order_init (void **queue, gssint_uint64 seqnum,
182                                   int do_replay, int do_sequence, int wide);
183 
184 gss_int32 g_order_check (void **queue, gssint_uint64 seqnum);
185 
186 void g_order_free (void **queue);
187 
188 gss_uint32 g_queue_size(void *vqueue, size_t *sizep);
189 gss_uint32 g_queue_externalize(void *vqueue, unsigned char **buf,
190 			       size_t *lenremain);
191 gss_uint32 g_queue_internalize(void **vqueue, unsigned char **buf,
192 			       size_t *lenremain);
193 
194 char *g_local_host_name (void);
195 
196 char *g_strdup (char *str);
197 
198 #ifdef __cplusplus
199 }
200 #endif
201 
202 #endif /* _GSSAPIP_GENERIC_H_ */
203