Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
      3  * Use is subject to license terms.
      4  */
      5 
      6 
      7 /*
      8  * Copyright 1993 by OpenVision Technologies, Inc.
      9  *
     10  * Permission to use, copy, modify, distribute, and sell this software
     11  * and its documentation for any purpose is hereby granted without fee,
     12  * provided that the above copyright notice appears in all copies and
     13  * that both that copyright notice and this permission notice appear in
     14  * supporting documentation, and that the name of OpenVision not be used
     15  * in advertising or publicity pertaining to distribution of the software
     16  * without specific, written prior permission. OpenVision makes no
     17  * representations about the suitability of this software for any
     18  * purpose.  It is provided "as is" without express or implied warranty.
     19  *
     20  * OPENVISION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
     21  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
     22  * EVENT SHALL OPENVISION BE LIABLE FOR ANY SPECIAL, INDIRECT OR
     23  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF
     24  * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
     25  * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
     26  * PERFORMANCE OF THIS SOFTWARE.
     27  */
     28 
     29 #ifndef _GSSAPIP_GENERIC_H_
     30 #define _GSSAPIP_GENERIC_H_
     31 
     32 /*
     33  * $Id: gssapiP_generic.h 18396 2006-07-25 20:29:43Z lxs $
     34  */
     35 
     36 #if defined(_WIN32)
     37 #include "k5-int.h"
     38 #else
     39 #include "autoconf.h"
     40 #ifndef _KERNEL
     41 #ifdef HAVE_STDLIB_H
     42 #include <stdlib.h>
     43 #endif /* !_KERNEL */
     44 #endif
     45 #endif
     46 
     47 #include "k5-thread.h"
     48 
     49 #include "gssapi_generic.h"
     50 
     51 #include "gssapi_err_generic.h"
     52 #ifndef _KERNEL
     53 #include <errno.h>
     54 #else
     55 #include <sys/errno.h>
     56 #endif /* !_KERNEL */
     57 
     58 #include "k5-platform.h"
     59 typedef UINT64_TYPE gssint_uint64;
     60 
     61 #include "gssapi/gssapi_ext.h"
     62 
     63 /** helper macros **/
     64 
     65 #if 0 /* SUNW15resync - on Solaris g_OID_equal is in gssapi_ext.h */
     66 #define g_OID_equal(o1, o2) \
     67    (((o1)->length == (o2)->length) && \
     68     (memcmp((o1)->elements,(o2)->elements,(unsigned int) (o1)->length) == 0))
     69 #endif
     70 
     71 /* this code knows that an int on the wire is 32 bits.  The type of
     72    num should be at least this big, or the extra shifts may do weird
     73    things */
     74 
     75 #define TWRITE_INT(ptr, num, bigend) \
     76    (ptr)[0] = (char) ((bigend)?((num)>>24):((num)&0xff)); \
     77    (ptr)[1] = (char) ((bigend)?(((num)>>16)&0xff):(((num)>>8)&0xff)); \
     78    (ptr)[2] = (char) ((bigend)?(((num)>>8)&0xff):(((num)>>16)&0xff)); \
     79    (ptr)[3] = (char) ((bigend)?((num)&0xff):((num)>>24)); \
     80    (ptr) += 4;
     81 
     82 #define TWRITE_INT16(ptr, num, bigend) \
     83    (ptr)[0] = (char) ((bigend)?((num)>>24):((num)&0xff)); \
     84    (ptr)[1] = (char) ((bigend)?(((num)>>16)&0xff):(((num)>>8)&0xff)); \
     85    (ptr) += 2;
     86 
     87 #define TREAD_INT(ptr, num, bigend) \
     88    (num) = (((ptr)[0]<<((bigend)?24: 0)) | \
     89             ((ptr)[1]<<((bigend)?16: 8)) | \
     90             ((ptr)[2]<<((bigend)? 8:16)) | \
     91             ((ptr)[3]<<((bigend)? 0:24))); \
     92    (ptr) += 4;
     93 
     94 #define TREAD_INT16(ptr, num, bigend) \
     95    (num) = (((ptr)[0]<<((bigend)?24: 0)) | \
     96             ((ptr)[1]<<((bigend)?16: 8))); \
     97    (ptr) += 2;
     98 
     99 #define TWRITE_STR(ptr, str, len) \
    100   (void) memcpy((ptr), (char *) (str), (len)); \
    101    (ptr) += (len);
    102 
    103 #define TREAD_STR(ptr, str, len) \
    104    (str) = (ptr); \
    105    (ptr) += (len);
    106 
    107 #define TWRITE_BUF(ptr, buf, bigend) \
    108    TWRITE_INT((ptr), (buf).length, (bigend)); \
    109    TWRITE_STR((ptr), (buf).value, (buf).length);
    110 
    111 /** malloc wrappers; these may actually do something later */
    112 
    113 #ifdef _KERNEL
    114 #define xmalloc(n) MALLOC(n)
    115 #else
    116 #define xmalloc(n) malloc(n)
    117 #endif
    118 
    119 #define xrealloc(p,n) realloc(p,n)
    120 #ifdef xfree
    121 #undef xfree
    122 #endif
    123 
    124 #ifdef _KERNEL
    125 #define xfree_wrap(p,sze) kmem_free(p,sze)
    126 #else
    127 #define xfree_wrap(p,sze) free(p)
    128 #define xfree(p) free(p)
    129 #endif
    130 
    131 /** helper functions **/
    132 
    133 /* hide names from applications, especially glib applications */
    134 #define	g_set_init		gssint_g_set_init
    135 #define	g_set_destroy		gssint_g_set_destroy
    136 #define	g_set_entry_add		gssint_g_set_entry_add
    137 #define	g_set_entry_delete	gssint_g_set_entry_delete
    138 #define	g_set_entry_get		gssint_g_set_entry_get
    139 #define	g_save_name		gssint_g_save_name
    140 #define	g_save_cred_id		gssint_g_save_cred_id
    141 #define	g_save_ctx_id		gssint_g_save_ctx_id
    142 #define	g_save_lucidctx_id	gssint_g_save_lucidctx_id
    143 #define	g_validate_name		gssint_g_validate_name
    144 #define	g_validate_cred_id	gssint_g_validate_cred_id
    145 #define	g_validate_ctx_id	gssint_g_validate_ctx_id
    146 #define	g_validate_lucidctx_id	gssint_g_validate_lucidctx_id
    147 #define	g_delete_name		gssint_g_delete_name
    148 #define	g_delete_cred_id	gssint_g_delete_cred_id
    149 #define	g_delete_ctx_id		gssint_g_delete_ctx_id
    150 #define	g_delete_lucidctx_id	gssint_g_delete_lucidctx_id
    151 #define	g_make_string_buffer	gssint_g_make_string_buffer
    152 #define	g_token_size		gssint_g_token_size
    153 #define	g_make_token_header	gssint_g_make_token_header
    154 #define	g_verify_token_header	gssint_g_verify_token_header
    155 #define	g_display_major_status	gssint_g_display_major_status
    156 #define	g_display_com_err_status gssint_g_display_com_err_status
    157 #define	g_order_init		gssint_g_order_init
    158 #define	g_order_check		gssint_g_order_check
    159 #define	g_order_free		gssint_g_order_free
    160 #define	g_queue_size		gssint_g_queue_size
    161 #define	g_queue_externalize	gssint_g_queue_externalize
    162 #define	g_queue_internalize	gssint_g_queue_internalize
    163 #define	g_canonicalize_host	gssint_g_canonicalize_host
    164 #define	g_local_host_name	gssint_g_local_host_name
    165 #define	g_strdup		gssint_g_strdup
    166 
    167 typedef struct _g_set_elt *g_set_elt;
    168 typedef struct {
    169     k5_mutex_t mutex;
    170     void *data;
    171 } g_set;
    172 #define G_SET_INIT { K5_MUTEX_PARTIAL_INITIALIZER, 0 }
    173 
    174 int g_set_init (g_set_elt *s);
    175 int g_set_destroy (g_set_elt *s);
    176 int g_set_entry_add (g_set_elt *s, void *key, void *value);
    177 int g_set_entry_delete (g_set_elt *s, void *key);
    178 int g_set_entry_get (g_set_elt *s, void *key, void **value);
    179 
    180 int g_save_name (g_set *vdb, gss_name_t name);
    181 int g_save_cred_id (g_set *vdb, gss_cred_id_t cred);
    182 int g_save_ctx_id (g_set *vdb, gss_ctx_id_t ctx);
    183 int g_save_lucidctx_id (g_set *vdb, void *lctx);
    184 
    185 int g_validate_name (g_set *vdb, gss_name_t name);
    186 int g_validate_cred_id (g_set *vdb, gss_cred_id_t cred);
    187 int g_validate_ctx_id (g_set *vdb, gss_ctx_id_t ctx);
    188 int g_validate_lucidctx_id (g_set *vdb, void *lctx);
    189 
    190 int g_delete_name (g_set *vdb, gss_name_t name);
    191 int g_delete_cred_id (g_set *vdb, gss_cred_id_t cred);
    192 int g_delete_ctx_id (g_set *vdb, gss_ctx_id_t ctx);
    193 int g_delete_lucidctx_id (g_set *vdb, void *lctx);
    194 
    195 int g_make_string_buffer (const char *str, gss_buffer_t buffer);
    196 
    197 unsigned int g_token_size (const gss_OID_desc * mech, unsigned int body_size);
    198 
    199 void g_make_token_header (const gss_OID_desc * mech, unsigned int body_size,
    200 			  unsigned char **buf, int tok_type);
    201 
    202 gss_int32 g_verify_token_header (const gss_OID_desc * mech,
    203 				 unsigned int *body_size,
    204 				 unsigned char **buf, int tok_type,
    205 				 unsigned int toksize_in,
    206 				 int wrapper_required);
    207 
    208 OM_uint32 g_display_major_status (OM_uint32 *minor_status,
    209 				 OM_uint32 status_value,
    210 				 OM_uint32 *message_context,
    211 				 gss_buffer_t status_string);
    212 
    213 OM_uint32 g_display_com_err_status (OM_uint32 *minor_status,
    214 				   OM_uint32 status_value,
    215 				   gss_buffer_t status_string);
    216 
    217 gss_int32 g_order_init (void **queue, gssint_uint64 seqnum,
    218 				  int do_replay, int do_sequence, int wide);
    219 
    220 gss_int32 g_order_check (void **queue, gssint_uint64 seqnum);
    221 
    222 void g_order_free (void **queue);
    223 
    224 gss_uint32 g_queue_size(void *vqueue, size_t *sizep);
    225 gss_uint32 g_queue_externalize(void *vqueue, unsigned char **buf,
    226 			       size_t *lenremain);
    227 gss_uint32 g_queue_internalize(void **vqueue, unsigned char **buf,
    228 			       size_t *lenremain);
    229 
    230 char *g_strdup (char *str);
    231 
    232 /** declarations of internal name mechanism functions **/
    233 
    234 #if 0 /* SUNW15resync - mved to mglueP.h for sake of non-krb5 mechs */
    235 OM_uint32 generic_gss_release_buffer
    236 (OM_uint32*,       /* minor_status */
    237             gss_buffer_t      /* buffer */
    238            );
    239 
    240 OM_uint32 generic_gss_release_oid_set
    241 (OM_uint32*,       /* minor_status */
    242             gss_OID_set*      /* set */
    243            );
    244 
    245 OM_uint32 generic_gss_release_oid
    246 (OM_uint32*,       /* minor_status */
    247             gss_OID*         /* set */
    248            );
    249 
    250 OM_uint32 generic_gss_copy_oid
    251 (OM_uint32 *,	/* minor_status */
    252             gss_OID_desc * const,   /* oid */ /* SUNW15resync */
    253 	    gss_OID *		/* new_oid */
    254 	    );
    255 
    256 OM_uint32 generic_gss_create_empty_oid_set
    257 (OM_uint32 *,	/* minor_status */
    258 	    gss_OID_set *	/* oid_set */
    259 	   );
    260 
    261 OM_uint32 generic_gss_add_oid_set_member
    262 (OM_uint32 *,	/* minor_status */
    263 	    const gss_OID_desc * const,		/* member_oid */
    264 	    gss_OID_set *	/* oid_set */
    265 	   );
    266 
    267 OM_uint32 generic_gss_test_oid_set_member
    268 (OM_uint32 *,	/* minor_status */
    269 	    const gss_OID_desc * const,		/* member */
    270 	    gss_OID_set,	/* set */
    271 	    int *		/* present */
    272 	   );
    273 
    274 OM_uint32 generic_gss_oid_to_str
    275 (OM_uint32 *,	/* minor_status */
    276 	    const gss_OID_desc * const,		/* oid */
    277 	    gss_buffer_t	/* oid_str */
    278 	   );
    279 
    280 OM_uint32 generic_gss_str_to_oid
    281 (OM_uint32 *,	/* minor_status */
    282 	    gss_buffer_t,	/* oid_str */
    283 	    gss_OID *		/* oid */
    284 	   );
    285 
    286 OM_uint32
    287 generic_gss_oid_compose(
    288     OM_uint32 *,        /* minor_status */
    289     const char *,       /* prefix */
    290     size_t,             /* prefix_len */
    291     int,                /* suffix */
    292     gss_OID_desc *);    /* oid */
    293 
    294 OM_uint32
    295 generic_gss_oid_decompose(
    296     OM_uint32 *,        /* minor_status */
    297     const char *,       /*prefix */
    298     size_t,             /* prefix_len */
    299     gss_OID_desc *,     /* oid */
    300     int *);             /* suffix */
    301 
    302 #endif /* 0 */
    303 
    304 #endif /* _GSSAPIP_GENERIC_H_ */
    305