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