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 2004 Sun Microsystems, Inc.  All rights reserved.
  24  * Use is subject to license terms.
  25  */
  26 
  27 #pragma ident   "%Z%%M% %I%     %E% SMI"
  28 
  29 #include "dh_gssapi.h"
  30 #include <stdlib.h>
  31 
  32 /*
  33  * gss_config structure for Diffie-Hellman family of mechanisms.
  34  * This structure is defined in mechglueP.h and defines the entry points
  35  * that libgss uses to call a backend.
  36  */
  37 static struct gss_config dh_mechanism = {
  38         {0, 0},                         /* OID for mech type. */
  39         0,
  40         __dh_gss_acquire_cred,
  41         __dh_gss_release_cred,
  42         __dh_gss_init_sec_context,
  43         __dh_gss_accept_sec_context,
  44 /* EXPORT DELETE START */ /* CRYPT DELETE START */
  45         __dh_gss_unseal,
  46 /* EXPORT DELETE END */ /* CRYPT DELETE END */
  47         __dh_gss_process_context_token,
  48         __dh_gss_delete_sec_context,
  49         __dh_gss_context_time,
  50         __dh_gss_display_status,
  51         NULL, /* Back ends don't implement this */
  52         __dh_gss_compare_name,
  53         __dh_gss_display_name,
  54         __dh_gss_import_name,
  55         __dh_gss_release_name,
  56         __dh_gss_inquire_cred,
  57         NULL, /* Back ends don't implement this */
  58 /* EXPORT DELETE START */ /* CRYPT DELETE START */
  59         __dh_gss_seal,
  60 /* EXPORT DELETE END */ /* CRYPT DELETE END */
  61         __dh_gss_export_sec_context,
  62         __dh_gss_import_sec_context,
  63         __dh_gss_inquire_cred_by_mech,
  64         __dh_gss_inquire_names_for_mech,
  65         __dh_gss_inquire_context,
  66         __dh_gss_internal_release_oid,
  67         __dh_gss_wrap_size_limit,
  68         __dh_pname_to_uid,
  69         NULL,  /* __gss_userok */
  70         __dh_gss_export_name,
  71 /* EXPORT DELETE START */
  72 /* CRYPT DELETE START */
  73 /*
  74  * This block comment is Sun Proprietary: Need-To-Know.
  75  * What we are doing is leaving the seal and unseal entry points
  76  * in an obvious place before sign and unsign for the Domestic customer
  77  * of the Solaris Source Product. The Domestic customer of the Solaris Source
  78  * Product will have to deal with the problem of creating exportable libgss
  79  * binaries.
  80  * In the binary product that Sun builds, these entry points are elsewhere,
  81  * and bracketed with special comments so that the CRYPT_SRC and EXPORT_SRC
  82  * targets delete them.
  83  */
  84 #if 0
  85 /* CRYPT DELETE END */
  86         __dh_gss_seal,
  87         __dh_gss_unseal,
  88 /* CRYPT DELETE START */
  89 #endif /* 0 */
  90 /* CRYPT DELETE END */
  91 /* EXPORT DELETE END */
  92         __dh_gss_sign,
  93         __dh_gss_verify,
  94         NULL, /* gss_store_cred() -- DH lacks this for now */
  95 };
  96 
  97 /*
  98  * __dh_gss_initialize:
  99  * Each mechanism in the Diffie-Hellman family of mechanisms calls this
 100  * routine passing a pointer to a gss_config structure. This routine will
 101  * then check that the mech is not already initialized (If so just return
 102  * the mech). It will then assign the entry points that are common to the
 103  * mechanism family to the uninitialized mech. After which, it allocate space
 104  * for that mechanism's context. It will be up to the caller to fill in
 105  * its mechanism OID and fill in the corresponding fields in mechanism
 106  * specific context.
 107  */
 108 gss_mechanism
 109 __dh_gss_initialize(gss_mechanism mech)
 110 {
 111         if (mech->context != NULL)
 112                 return (mech);    /* already initialized */
 113 
 114         /* Copy the common entry points for this mechcanisms */
 115         *mech = dh_mechanism;
 116 
 117         /* Allocate space for this mechanism's context */
 118         mech->context = New(dh_context_desc, 1);
 119         if (mech->context == NULL)
 120                 return (NULL);
 121 
 122         /* return the mech */
 123         return (mech);
 124 }