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         __dh_gss_unseal,
  45         __dh_gss_process_context_token,
  46         __dh_gss_delete_sec_context,
  47         __dh_gss_context_time,
  48         __dh_gss_display_status,
  49         NULL, /* Back ends don't implement this */
  50         __dh_gss_compare_name,
  51         __dh_gss_display_name,
  52         __dh_gss_import_name,
  53         __dh_gss_release_name,
  54         __dh_gss_inquire_cred,
  55         NULL, /* Back ends don't implement this */
  56         __dh_gss_seal,
  57         __dh_gss_export_sec_context,
  58         __dh_gss_import_sec_context,
  59         __dh_gss_inquire_cred_by_mech,
  60         __dh_gss_inquire_names_for_mech,
  61         __dh_gss_inquire_context,
  62         __dh_gss_internal_release_oid,
  63         __dh_gss_wrap_size_limit,
  64         __dh_pname_to_uid,
  65         NULL,  /* __gss_userok */
  66         __dh_gss_export_name,
  67         __dh_gss_sign,
  68         __dh_gss_verify,
  69         NULL, /* gss_store_cred() -- DH lacks this for now */
  70 };
  71 
  72 /*
  73  * __dh_gss_initialize:
  74  * Each mechanism in the Diffie-Hellman family of mechanisms calls this
  75  * routine passing a pointer to a gss_config structure. This routine will
  76  * then check that the mech is not already initialized (If so just return
  77  * the mech). It will then assign the entry points that are common to the
  78  * mechanism family to the uninitialized mech. After which, it allocate space
  79  * for that mechanism's context. It will be up to the caller to fill in
  80  * its mechanism OID and fill in the corresponding fields in mechanism
  81  * specific context.
  82  */
  83 gss_mechanism
  84 __dh_gss_initialize(gss_mechanism mech)
  85 {
  86         if (mech->context != NULL)
  87                 return (mech);    /* already initialized */
  88 
  89         /* Copy the common entry points for this mechcanisms */
  90         *mech = dh_mechanism;
  91 
  92         /* Allocate space for this mechanism's context */
  93         mech->context = New(dh_context_desc, 1);
  94         if (mech->context == NULL)
  95                 return (NULL);
  96 
  97         /* return the mech */
  98         return (mech);
  99 }