1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2005 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* 28 * This header contains the private mechglue definitions. 29 */ 30 31 #ifndef _MECHGLUEP_H 32 #define _MECHGLUEP_H 33 34 #pragma ident "%Z%%M% %I% %E% SMI" 35 36 #include <sys/types.h> 37 #include <gssapi/gssapi.h> 38 #include <gssapi/gssapi_ext.h> 39 40 #ifdef __cplusplus 41 extern "C" { 42 #endif 43 44 /* 45 * derived types for passing context and credential handles 46 * between gssd and kernel 47 */ 48 typedef unsigned int gssd_ctx_id_t; 49 typedef unsigned int gssd_cred_id_t; 50 /* 51 * Array of context IDs typed by mechanism OID 52 */ 53 typedef struct gss_union_ctx_id_t { 54 gss_OID mech_type; 55 gss_ctx_id_t internal_ctx_id; 56 } gss_union_ctx_id_desc, *gss_union_ctx_id_t; 57 58 /* 59 * Generic GSSAPI names. A name can either be a generic name, or a 60 * mechanism specific name.... 61 */ 62 typedef struct gss_union_name_t { 63 gss_OID name_type; 64 gss_buffer_t external_name; 65 /* 66 * These last two fields are only filled in for mechanism 67 * names. 68 */ 69 gss_OID mech_type; 70 gss_name_t mech_name; 71 } gss_union_name_desc, *gss_union_name_t; 72 73 /* 74 * Structure for holding list of mechanism-specific name types 75 */ 76 typedef struct gss_mech_spec_name_t { 77 gss_OID name_type; 78 gss_OID mech; 79 struct gss_mech_spec_name_t *next, *prev; 80 } gss_mech_spec_name_desc, *gss_mech_spec_name; 81 82 /* 83 * Credential auxiliary info, used in the credential structure 84 */ 85 typedef struct gss_union_cred_auxinfo { 86 gss_buffer_desc name; 87 gss_OID name_type; 88 OM_uint32 creation_time; 89 OM_uint32 time_rec; 90 int cred_usage; 91 } gss_union_cred_auxinfo; 92 93 /* 94 * Set of Credentials typed on mechanism OID 95 */ 96 typedef struct gss_union_cred_t { 97 int count; 98 gss_OID mechs_array; 99 gss_cred_id_t *cred_array; 100 gss_union_cred_auxinfo auxinfo; 101 } gss_union_cred_desc, *gss_union_cred_t; 102 103 104 typedef OM_uint32 (*gss_acquire_cred_with_password_sfct)( 105 void *, /* context */ 106 OM_uint32 *, /* minor_status */ 107 const gss_name_t, /* desired_name */ 108 const gss_buffer_t, /* password */ 109 OM_uint32, /* time_req */ 110 const gss_OID_set, /* desired_mechs */ 111 int, /* cred_usage */ 112 gss_cred_id_t *, /* output_cred_handle */ 113 gss_OID_set *, /* actual_mechs */ 114 OM_uint32 * /* time_rec */ 115 /* */); 116 117 /* 118 * This is the definition of the mechs_array struct, which is used to 119 * define the mechs array table. This table is used to indirectly 120 * access mechanism specific versions of the gssapi routines through 121 * the routines in the glue module (gssd_mech_glue.c) 122 * 123 * This contains all of the functions defined in gssapi.h except for 124 * gss_release_buffer() and gss_release_oid_set(), which I am 125 * assuming, for now, to be equal across mechanisms. 126 */ 127 128 typedef struct gss_config { 129 gss_OID_desc mech_type; 130 void * context; 131 #ifdef _KERNEL 132 struct gss_config *next; 133 bool_t uses_kmod; 134 #endif 135 136 #ifndef _KERNEL 137 OM_uint32 (*gss_acquire_cred) 138 ( 139 void *, /* context */ 140 OM_uint32 *, /* minor_status */ 141 const gss_name_t, /* desired_name */ 142 OM_uint32, /* time_req */ 143 const gss_OID_set, /* desired_mechs */ 144 int, /* cred_usage */ 145 gss_cred_id_t *, /* output_cred_handle */ 146 gss_OID_set *, /* actual_mechs */ 147 OM_uint32 * /* time_rec */ 148 /* */); 149 OM_uint32 (*gss_release_cred) 150 ( 151 void *, /* context */ 152 OM_uint32 *, /* minor_status */ 153 gss_cred_id_t * /* cred_handle */ 154 /* */); 155 OM_uint32 (*gss_init_sec_context) 156 ( 157 void *, /* context */ 158 OM_uint32 *, /* minor_status */ 159 const gss_cred_id_t, /* claimant_cred_handle */ 160 gss_ctx_id_t *, /* context_handle */ 161 const gss_name_t, /* target_name */ 162 const gss_OID, /* mech_type */ 163 OM_uint32, /* req_flags */ 164 OM_uint32, /* time_req */ 165 const gss_channel_bindings_t, /* input_chan_bindings */ 166 const gss_buffer_t, /* input_token */ 167 gss_OID*, /* actual_mech_type */ 168 gss_buffer_t, /* output_token */ 169 OM_uint32 *, /* ret_flags */ 170 OM_uint32 * /* time_rec */ 171 /* */); 172 OM_uint32 (*gss_accept_sec_context) 173 ( 174 void *, /* context */ 175 OM_uint32 *, /* minor_status */ 176 gss_ctx_id_t *, /* context_handle */ 177 const gss_cred_id_t, /* verifier_cred_handle */ 178 const gss_buffer_t, /* input_token_buffer */ 179 const gss_channel_bindings_t, /* input_chan_bindings */ 180 gss_name_t *, /* src_name */ 181 gss_OID*, /* mech_type */ 182 gss_buffer_t, /* output_token */ 183 OM_uint32 *, /* ret_flags */ 184 OM_uint32 *, /* time_rec */ 185 gss_cred_id_t * /* delegated_cred_handle */ 186 /* */); 187 /* EXPORT DELETE START */ /* CRYPT DELETE START */ 188 #endif /* ! _KERNEL */ 189 190 /* 191 * Note: there are two gss_unseal's in here. Make any changes to both. 192 */ 193 OM_uint32 (*gss_unseal) 194 ( 195 void *, /* context */ 196 OM_uint32 *, /* minor_status */ 197 const gss_ctx_id_t, /* context_handle */ 198 const gss_buffer_t, /* input_message_buffer */ 199 gss_buffer_t, /* output_message_buffer */ 200 int *, /* conf_state */ 201 int * /* qop_state */ 202 #ifdef _KERNEL 203 /* */, OM_uint32 204 #endif 205 /* */); 206 #ifndef _KERNEL 207 /* EXPORT DELETE END */ /* CRYPT DELETE END */ 208 OM_uint32 (*gss_process_context_token) 209 ( 210 void *, /* context */ 211 OM_uint32 *, /* minor_status */ 212 const gss_ctx_id_t, /* context_handle */ 213 const gss_buffer_t /* token_buffer */ 214 /* */); 215 #endif /* ! _KERNEL */ 216 OM_uint32 (*gss_delete_sec_context) 217 ( 218 void *, /* context */ 219 OM_uint32 *, /* minor_status */ 220 gss_ctx_id_t *, /* context_handle */ 221 gss_buffer_t /* output_token */ 222 #ifdef _KERNEL 223 /* */, OM_uint32 224 #endif 225 /* */); 226 #ifndef _KERNEL 227 OM_uint32 (*gss_context_time) 228 ( 229 void *, /* context */ 230 OM_uint32 *, /* minor_status */ 231 const gss_ctx_id_t, /* context_handle */ 232 OM_uint32 * /* time_rec */ 233 /* */); 234 OM_uint32 (*gss_display_status) 235 ( 236 void *, /* context */ 237 OM_uint32 *, /* minor_status */ 238 OM_uint32, /* status_value */ 239 int, /* status_type */ 240 const gss_OID, /* mech_type */ 241 OM_uint32 *, /* message_context */ 242 gss_buffer_t /* status_string */ 243 /* */); 244 OM_uint32 (*gss_indicate_mechs) 245 ( 246 void *, /* context */ 247 OM_uint32 *, /* minor_status */ 248 gss_OID_set * /* mech_set */ 249 /* */); 250 OM_uint32 (*gss_compare_name) 251 ( 252 void *, /* context */ 253 OM_uint32 *, /* minor_status */ 254 const gss_name_t, /* name1 */ 255 const gss_name_t, /* name2 */ 256 int * /* name_equal */ 257 /* */); 258 OM_uint32 (*gss_display_name) 259 ( 260 void *, /* context */ 261 OM_uint32 *, /* minor_status */ 262 const gss_name_t, /* input_name */ 263 gss_buffer_t, /* output_name_buffer */ 264 gss_OID* /* output_name_type */ 265 /* */); 266 OM_uint32 (*gss_import_name) 267 ( 268 void *, /* context */ 269 OM_uint32 *, /* minor_status */ 270 const gss_buffer_t, /* input_name_buffer */ 271 const gss_OID, /* input_name_type */ 272 gss_name_t * /* output_name */ 273 /* */); 274 OM_uint32 (*gss_release_name) 275 ( 276 void *, /* context */ 277 OM_uint32 *, /* minor_status */ 278 gss_name_t * /* input_name */ 279 /* */); 280 OM_uint32 (*gss_inquire_cred) 281 ( 282 void *, /* context */ 283 OM_uint32 *, /* minor_status */ 284 const gss_cred_id_t, /* cred_handle */ 285 gss_name_t *, /* name */ 286 OM_uint32 *, /* lifetime */ 287 int *, /* cred_usage */ 288 gss_OID_set * /* mechanisms */ 289 /* */); 290 OM_uint32 (*gss_add_cred) 291 ( 292 void *, /* context */ 293 OM_uint32 *, /* minor_status */ 294 const gss_cred_id_t, /* input_cred_handle */ 295 const gss_name_t, /* desired_name */ 296 const gss_OID, /* desired_mech */ 297 gss_cred_usage_t, /* cred_usage */ 298 OM_uint32, /* initiator_time_req */ 299 OM_uint32, /* acceptor_time_req */ 300 gss_cred_id_t *, /* output_cred_handle */ 301 gss_OID_set *, /* actual_mechs */ 302 OM_uint32 *, /* initiator_time_rec */ 303 OM_uint32 * /* acceptor_time_rec */ 304 /* */); 305 /* EXPORT DELETE START */ /* CRYPT DELETE START */ 306 #endif /* ! _KERNEL */ 307 /* 308 * Note: there are two gss_seal's in here. Make any changes to both. 309 */ 310 OM_uint32 (*gss_seal) 311 ( 312 void *, /* context */ 313 OM_uint32 *, /* minor_status */ 314 const gss_ctx_id_t, /* context_handle */ 315 int, /* conf_req_flag */ 316 int, /* qop_req */ 317 const gss_buffer_t, /* input_message_buffer */ 318 int *, /* conf_state */ 319 gss_buffer_t /* output_message_buffer */ 320 #ifdef _KERNEL 321 /* */, OM_uint32 322 #endif 323 /* */); 324 #ifndef _KERNEL 325 /* EXPORT DELETE END */ /* CRYPT DELETE END */ 326 OM_uint32 (*gss_export_sec_context) 327 ( 328 void *, /* context */ 329 OM_uint32 *, /* minor_status */ 330 gss_ctx_id_t *, /* context_handle */ 331 gss_buffer_t /* interprocess_token */ 332 /* */); 333 #endif /* ! _KERNEL */ 334 OM_uint32 (*gss_import_sec_context) 335 ( 336 void *, /* context */ 337 OM_uint32 *, /* minor_status */ 338 const gss_buffer_t, /* interprocess_token */ 339 gss_ctx_id_t * /* context_handle */ 340 /* */); 341 #ifndef _KERNEL 342 OM_uint32 (*gss_inquire_cred_by_mech) 343 ( 344 void *, /* context */ 345 OM_uint32 *, /* minor_status */ 346 const gss_cred_id_t, /* cred_handle */ 347 const gss_OID, /* mech_type */ 348 gss_name_t *, /* name */ 349 OM_uint32 *, /* initiator_lifetime */ 350 OM_uint32 *, /* acceptor_lifetime */ 351 gss_cred_usage_t * /* cred_usage */ 352 /* */); 353 OM_uint32 (*gss_inquire_names_for_mech) 354 ( 355 void *, /* context */ 356 OM_uint32 *, /* minor_status */ 357 const gss_OID, /* mechanism */ 358 gss_OID_set * /* name_types */ 359 /* */); 360 OM_uint32 (*gss_inquire_context) 361 ( 362 void *, /* context */ 363 OM_uint32 *, /* minor_status */ 364 const gss_ctx_id_t, /* context_handle */ 365 gss_name_t *, /* src_name */ 366 gss_name_t *, /* targ_name */ 367 OM_uint32 *, /* lifetime_rec */ 368 gss_OID *, /* mech_type */ 369 OM_uint32 *, /* ctx_flags */ 370 int *, /* locally_initiated */ 371 int * /* open */ 372 /* */); 373 OM_uint32 (*gss_internal_release_oid) 374 ( 375 void *, /* context */ 376 OM_uint32 *, /* minor_status */ 377 gss_OID * /* OID */ 378 /* */); 379 OM_uint32 (*gss_wrap_size_limit) 380 ( 381 void *, /* context */ 382 OM_uint32 *, /* minor_status */ 383 const gss_ctx_id_t, /* context_handle */ 384 int, /* conf_req_flag */ 385 gss_qop_t, /* qop_req */ 386 OM_uint32, /* req_output_size */ 387 OM_uint32 * /* max_input_size */ 388 /* */); 389 OM_uint32 (*pname_to_uid) 390 ( 391 void *, /* context */ 392 OM_uint32 *, /* minor_status */ 393 const gss_name_t, /* pname */ 394 uid_t * /* uid */ 395 /* */); 396 OM_uint32 (*__gss_userok) 397 ( 398 void *, /* context */ 399 OM_uint32 *, /* minor_status */ 400 const gss_name_t, /* pname */ 401 const char *, /* local user */ 402 int * /* user ok? */ 403 /* */); 404 OM_uint32 (*gss_export_name) 405 ( 406 void *, /* context */ 407 OM_uint32 *, /* minor_status */ 408 const gss_name_t, /* input_name */ 409 gss_buffer_t /* exported_name */ 410 /* */); 411 #endif /* ! _KERNEL */ 412 /* EXPORT DELETE START */ 413 /* CRYPT DELETE START */ 414 /* 415 * This block comment is Sun Proprietary: Need-To-Know. 416 * What we are doing is leaving the seal and unseal entry points 417 * in an obvious place before sign and unsign for the Domestic customer 418 * of the Solaris Source Product. The Domestic customer of the Solaris Source 419 * Product will have to deal with the problem of creating exportable libgss 420 * binaries. 421 * In the binary product that Sun builds, these entry points are elsewhere, 422 * and bracketed with special comments so that the CRYPT_SRC and EXPORT_SRC 423 * targets delete them. 424 */ 425 #if 0 426 /* CRYPT DELETE END */ 427 OM_uint32 (*gss_seal) 428 ( 429 void *, /* context */ 430 OM_uint32 *, /* minor_status */ 431 const gss_ctx_id_t, /* context_handle */ 432 int, /* conf_req_flag */ 433 int, /* qop_req */ 434 const gss_buffer_t, /* input_message_buffer */ 435 int *, /* conf_state */ 436 gss_buffer_t /* output_message_buffer */ 437 #ifdef _KERNEL 438 /* */, OM_uint32 439 #endif 440 /* */); 441 OM_uint32 (*gss_unseal) 442 ( 443 void *, /* context */ 444 OM_uint32 *, /* minor_status */ 445 const gss_ctx_id_t, /* context_handle */ 446 const gss_buffer_t, /* input_message_buffer */ 447 gss_buffer_t, /* output_message_buffer */ 448 int *, /* conf_state */ 449 int * /* qop_state */ 450 #ifdef _KERNEL 451 /* */, OM_uint32 452 #endif 453 /* */); 454 /* CRYPT DELETE START */ 455 #endif /* 0 */ 456 /* CRYPT DELETE END */ 457 /* EXPORT DELETE END */ 458 OM_uint32 (*gss_sign) 459 ( 460 void *, /* context */ 461 OM_uint32 *, /* minor_status */ 462 const gss_ctx_id_t, /* context_handle */ 463 int, /* qop_req */ 464 const gss_buffer_t, /* message_buffer */ 465 gss_buffer_t /* message_token */ 466 #ifdef _KERNEL 467 /* */, OM_uint32 468 #endif 469 /* */); 470 OM_uint32 (*gss_verify) 471 ( 472 void *, /* context */ 473 OM_uint32 *, /* minor_status */ 474 const gss_ctx_id_t, /* context_handle */ 475 const gss_buffer_t, /* message_buffer */ 476 const gss_buffer_t, /* token_buffer */ 477 int * /* qop_state */ 478 #ifdef _KERNEL 479 /* */, OM_uint32 480 #endif 481 /* */); 482 #ifndef _KERNEL 483 OM_uint32 (*gss_store_cred) 484 ( 485 void *, /* context */ 486 OM_uint32 *, /* minor_status */ 487 const gss_cred_id_t, /* input_cred */ 488 gss_cred_usage_t, /* cred_usage */ 489 const gss_OID, /* desired_mech */ 490 OM_uint32, /* overwrite_cred */ 491 OM_uint32, /* default_cred */ 492 gss_OID_set *, /* elements_stored */ 493 gss_cred_usage_t * /* cred_usage_stored */ 494 /* */); 495 #endif 496 } *gss_mechanism; 497 498 #ifndef _KERNEL 499 /* This structure MUST NOT be used by any code outside libgss */ 500 typedef struct gss_config_ext { 501 gss_acquire_cred_with_password_sfct gss_acquire_cred_with_password; 502 } *gss_mechanism_ext; 503 #endif /* _KERNEL */ 504 505 /* 506 * In the user space we use a wrapper structure to encompass the 507 * mechanism entry points. The wrapper contain the mechanism 508 * entry points and other data which is only relevant to the gss-api 509 * layer. In the kernel we use only the gss_config strucutre because 510 * the kernal does not cantain any of the extra gss-api specific data. 511 */ 512 #ifndef _KERNEL 513 typedef struct gss_mech_config { 514 char *kmodName; /* kernel module name */ 515 char *uLibName; /* user library name */ 516 char *mechNameStr; /* mechanism string name */ 517 char *optionStr; /* optional mech parameters */ 518 void *dl_handle; /* RTLD object handle for the mech */ 519 gss_OID mech_type; /* mechanism oid */ 520 gss_mechanism mech; /* mechanism initialization struct */ 521 gss_mechanism_ext mech_ext; /* extensions */ 522 struct gss_mech_config *next; /* next element in the list */ 523 } *gss_mech_info; 524 #endif 525 526 #ifndef _KERNEL 527 /* 528 * Internal mechglue routines 529 */ 530 531 gss_mechanism __gss_get_mechanism(const gss_OID); 532 gss_mechanism_ext __gss_get_mechanism_ext(const gss_OID); 533 char *__gss_get_kmodName(const gss_OID); 534 char *__gss_get_modOptions(const gss_OID); 535 OM_uint32 __gss_import_internal_name(OM_uint32 *, const gss_OID, 536 gss_union_name_t, gss_name_t *); 537 OM_uint32 __gss_export_internal_name(OM_uint32 *, const gss_OID, 538 const gss_name_t, gss_buffer_t); 539 OM_uint32 __gss_display_internal_name(OM_uint32 *, const gss_OID, 540 const gss_name_t, gss_buffer_t, gss_OID *); 541 OM_uint32 __gss_release_internal_name(OM_uint32 *, const gss_OID, 542 gss_name_t *); 543 544 OM_uint32 __gss_convert_name_to_union_name( 545 OM_uint32 *, /* minor_status */ 546 gss_mechanism, /* mech */ 547 gss_name_t, /* internal_name */ 548 gss_name_t * /* external_name */ 549 ); 550 551 gss_cred_id_t __gss_get_mechanism_cred( 552 const gss_union_cred_t, /* union_cred */ 553 const gss_OID /* mech_type */ 554 ); 555 556 OM_uint32 __gss_create_copy_buffer( 557 const gss_buffer_t, /* src buffer */ 558 gss_buffer_t *, /* destination buffer */ 559 int /* NULL terminate buffer ? */ 560 ); 561 562 OM_uint32 generic_gss_release_oid( 563 OM_uint32 *, /* minor_status */ 564 gss_OID * /* oid */ 565 ); 566 567 OM_uint32 generic_gss_copy_oid( 568 OM_uint32 *, /* minor_status */ 569 const gss_OID, /* oid */ 570 gss_OID * /* new_oid */ 571 ); 572 573 OM_uint32 generic_gss_create_empty_oid_set( 574 OM_uint32 *, /* minor_status */ 575 gss_OID_set * /* oid_set */ 576 ); 577 578 OM_uint32 generic_gss_add_oid_set_member( 579 OM_uint32 *, /* minor_status */ 580 const gss_OID, /* member_oid */ 581 gss_OID_set * /* oid_set */ 582 ); 583 584 OM_uint32 generic_gss_test_oid_set_member( 585 OM_uint32 *, /* minor_status */ 586 const gss_OID, /* member */ 587 const gss_OID_set, /* set */ 588 int * /* present */ 589 ); 590 591 OM_uint32 generic_gss_oid_to_str( 592 OM_uint32 *, /* minor_status */ 593 const gss_OID, /* oid */ 594 gss_buffer_t /* oid_str */ 595 ); 596 597 OM_uint32 generic_gss_str_to_oid( 598 OM_uint32 *, /* minor_status */ 599 const gss_buffer_t, /* oid_str */ 600 gss_OID * /* oid */ 601 ); 602 603 OM_uint32 gss_copy_oid_set( 604 OM_uint32 *, /* minor_status */ 605 const gss_OID_set_desc *, /* oid set */ 606 gss_OID_set * /* new oid set */ 607 ); 608 609 #endif 610 611 #ifdef _KERNEL 612 #include <rpc/rpc.h> 613 614 #ifndef _KRB5_H 615 /* These macros are defined for Kerberos in krb5.h, and have priority */ 616 #define MALLOC(n) kmem_alloc((n), KM_SLEEP) 617 #define FREE(x, n) kmem_free((x), (n)) 618 #endif /* _KRB5_H */ 619 620 gss_mechanism __kgss_get_mechanism(gss_OID); 621 void __kgss_add_mechanism(gss_mechanism); 622 #endif /* _KERNEL */ 623 624 struct kgss_cred { 625 gssd_cred_id_t gssd_cred; 626 OM_uint32 gssd_cred_verifier; 627 }; 628 629 #define KCRED_TO_KGSS_CRED(cred) ((struct kgss_cred *)(cred)) 630 #define KCRED_TO_CRED(cred) (KCRED_TO_KGSS_CRED(cred)->gssd_cred) 631 #define KCRED_TO_CREDV(cred) (KCRED_TO_KGSS_CRED(cred)->gssd_cred_verifier) 632 633 struct kgss_ctx { 634 gssd_ctx_id_t gssd_ctx; 635 #ifdef _KERNEL 636 gss_ctx_id_t gssd_i_ctx; 637 bool_t ctx_imported; 638 gss_mechanism mech; 639 #endif /* _KERNEL */ 640 OM_uint32 gssd_ctx_verifier; 641 }; 642 643 #define KCTX_TO_KGSS_CTX(ctx) ((struct kgss_ctx *)(ctx)) 644 #define KCTX_TO_CTX_IMPORTED(ctx) (KCTX_TO_KGSS_CTX(ctx)->ctx_imported) 645 #define KCTX_TO_GSSD_CTX(ctx) (KCTX_TO_KGSS_CTX(ctx)->gssd_ctx) 646 #define KCTX_TO_CTXV(ctx) (KCTX_TO_KGSS_CTX(ctx)->gssd_ctx_verifier) 647 #define KCTX_TO_MECH(ctx) (KCTX_TO_KGSS_CTX(ctx)->mech) 648 #define KCTX_TO_PRIVATE(ctx) (KCTX_TO_MECH(ctx)->context) 649 #define KGSS_CTX_TO_GSSD_CTX(ctx) \ 650 (((ctx) == GSS_C_NO_CONTEXT) ? (gssd_ctx_id_t)(uintptr_t)(ctx) : \ 651 KCTX_TO_GSSD_CTX(ctx)) 652 #define KGSS_CTX_TO_GSSD_CTXV(ctx) \ 653 (((ctx) == GSS_C_NO_CONTEXT) ? (NULL) : KCTX_TO_CTXV(ctx)) 654 655 #ifdef _KERNEL 656 #define KCTX_TO_I_CTX(ctx) (KCTX_TO_KGSS_CTX(ctx)->gssd_i_ctx) 657 #define KCTX_TO_CTX(ctx) \ 658 ((KCTX_TO_CTX_IMPORTED(ctx) == FALSE) ? (ctx) : \ 659 KCTX_TO_I_CTX(ctx)) 660 #define KGSS_CRED_ALLOC() kmem_zalloc(sizeof (struct kgss_cred), \ 661 KM_SLEEP) 662 #define KGSS_CRED_FREE(cred) kmem_free(cred, sizeof (struct kgss_cred)) 663 664 #define KGSS_ALLOC() kmem_zalloc(sizeof (struct kgss_ctx), KM_SLEEP) 665 #define KGSS_FREE(ctx) kmem_free(ctx, sizeof (struct kgss_ctx)) 666 667 #define KGSS_SIGN(minor_st, ctx, qop, msg, tkn) \ 668 (*(KCTX_TO_MECH(ctx)->gss_sign))(KCTX_TO_PRIVATE(ctx), minor_st, \ 669 KCTX_TO_CTX(ctx), qop, msg, tkn, KCTX_TO_CTXV(ctx)) 670 671 #define KGSS_VERIFY(minor_st, ctx, msg, tkn, qop) \ 672 (*(KCTX_TO_MECH(ctx)->gss_verify))(KCTX_TO_PRIVATE(ctx), minor_st,\ 673 KCTX_TO_CTX(ctx), msg, tkn, qop, KCTX_TO_CTXV(ctx)) 674 675 #define KGSS_DELETE_SEC_CONTEXT(minor_st, ctx, int_ctx_id, tkn) \ 676 (*(KCTX_TO_MECH(ctx)->gss_delete_sec_context))(KCTX_TO_PRIVATE(ctx),\ 677 minor_st, int_ctx_id, tkn, KCTX_TO_CTXV(ctx)) 678 679 #define KGSS_IMPORT_SEC_CONTEXT(minor_st, tkn, ctx, int_ctx_id) \ 680 (*(KCTX_TO_MECH(ctx)->gss_import_sec_context))(KCTX_TO_PRIVATE(ctx),\ 681 minor_st, tkn, int_ctx_id) 682 683 /* EXPORT DELETE START */ 684 #define KGSS_SEAL(minor_st, ctx, conf_req, qop, msg, conf_state, tkn) \ 685 (*(KCTX_TO_MECH(ctx)->gss_seal))(KCTX_TO_PRIVATE(ctx), minor_st, \ 686 KCTX_TO_CTX(ctx), conf_req, qop, msg, conf_state, tkn,\ 687 KCTX_TO_CTXV(ctx)) 688 689 #define KGSS_UNSEAL(minor_st, ctx, msg, tkn, conf, qop) \ 690 (*(KCTX_TO_MECH(ctx)->gss_unseal))(KCTX_TO_PRIVATE(ctx), minor_st,\ 691 KCTX_TO_CTX(ctx), msg, tkn, conf, qop, \ 692 KCTX_TO_CTXV(ctx)) 693 694 /* EXPORT DELETE END */ 695 696 #else /* !_KERNEL */ 697 #define KCTX_TO_CTX(ctx) (KCTX_TO_KGSS_CTX(ctx)->gssd_ctx) 698 #define MALLOC(n) malloc(n) 699 #define FREE(x, n) free(x) 700 #define KGSS_CRED_ALLOC() (struct kgss_cred *) \ 701 MALLOC(sizeof (struct kgss_cred)) 702 #define KGSS_CRED_FREE(cred) free(cred) 703 #define KGSS_ALLOC() (struct kgss_ctx *)MALLOC(sizeof (struct kgss_ctx)) 704 #define KGSS_FREE(ctx) free(ctx) 705 706 #define KGSS_SIGN(minor_st, ctx, qop, msg, tkn) \ 707 kgss_sign_wrapped(minor_st, \ 708 KCTX_TO_CTX(ctx), qop, msg, tkn, KCTX_TO_CTXV(ctx)) 709 710 #define KGSS_VERIFY(minor_st, ctx, msg, tkn, qop) \ 711 kgss_verify_wrapped(minor_st,\ 712 KCTX_TO_CTX(ctx), msg, tkn, qop, KCTX_TO_CTXV(ctx)) 713 714 #define KGSS_SEAL(minor_st, ctx, conf_req, qop, msg, conf_state, tkn) \ 715 kgss_seal_wrapped(minor_st, \ 716 KCTX_TO_CTX(ctx), conf_req, qop, msg, conf_state, tkn, \ 717 KCTX_TO_CTXV(ctx)) 718 719 #define KGSS_UNSEAL(minor_st, ctx, msg, tkn, conf, qop) \ 720 kgss_unseal_wrapped(minor_st,\ 721 KCTX_TO_CTX(ctx), msg, tkn, conf, qop, \ 722 KCTX_TO_CTXV(ctx)) 723 #endif /* _KERNEL */ 724 725 #ifdef __cplusplus 726 } 727 #endif 728 729 #endif /* _MECHGLUEP_H */ 730