/* * CDDL HEADER START * * The contents of this file are subject to the terms of the * Common Development and Distribution License (the "License"). * You may not use this file except in compliance with the License. * * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE * or http://www.opensolaris.org/os/licensing. * See the License for the specific language governing permissions * and limitations under the License. * * When distributing Covered Code, include this CDDL HEADER in each * file and include the License file at usr/src/OPENSOLARIS.LICENSE. * If applicable, add the following below this CDDL HEADER, with the * fields enclosed by brackets "[]" replaced with your own identifying * information: Portions Copyright [yyyy] [name of copyright owner] * * CDDL HEADER END */ /* * Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ /* * Copyright 1993 OpenVision Technologies, Inc., All Rights Reserved. */ /* * rpcsec_gss.h, RPCSEC_GSS security service interface. */ #ifndef _RPCSEC_GSS_H #define _RPCSEC_GSS_H #ifdef __cplusplus extern "C" { #endif #include #include #include /* * Interface definitions. */ #define MAX_NAME_LEN 64 #define MAX_GSS_MECH 128 #define MAX_GSS_NAME 128 typedef enum { rpc_gss_svc_default = 0, rpc_gss_svc_none = 1, rpc_gss_svc_integrity = 2, rpc_gss_svc_privacy = 3 } rpc_gss_service_t; /* * GSS-API based security mechanism type specified as * object identifiers (OIDs). * This type is derived from gss_OID_desc/gss_OID. */ #define rpc_gss_OID_s gss_OID_desc_struct typedef struct rpc_gss_OID_s rpc_gss_OID_desc, *rpc_gss_OID; /* * Interface data. * This is already suitable for both LP64 and ILP32. */ typedef struct rpc_gss_principal { int len; char name[1]; } *rpc_gss_principal_t; typedef struct { int req_flags; int time_req; gss_cred_id_t my_cred; gss_channel_bindings_t input_channel_bindings; } rpc_gss_options_req_t; typedef struct { int major_status; int minor_status; uint_t rpcsec_version; int ret_flags; int time_ret; gss_ctx_id_t gss_context; #ifdef _KERNEL rpc_gss_OID actual_mechanism; #else char actual_mechanism[MAX_GSS_MECH]; #endif } rpc_gss_options_ret_t; /* * raw credentials */ typedef struct { uint_t version; #ifdef _KERNEL rpc_gss_OID mechanism; uint_t qop; #else char *mechanism; char *qop; #endif rpc_gss_principal_t client_principal; char *svc_principal; /* service@server, e.g. nfs@caribe */ rpc_gss_service_t service; } rpc_gss_rawcred_t; /* * unix credentials */ typedef struct { uid_t uid; gid_t gid; short gidlen; gid_t *gidlist; } rpc_gss_ucred_t; /* * for callback routine */ typedef struct { uint_t program; uint_t version; bool_t (*callback)(); } rpc_gss_callback_t; /* * lock used for the callback routine */ typedef struct { bool_t locked; rpc_gss_rawcred_t *raw_cred; } rpc_gss_lock_t; /* * This is for user RPC applications. * Structure used to fetch the error code when one of * the rpc_gss_* routines fails. */ typedef struct { int rpc_gss_error; int system_error; } rpc_gss_error_t; #define RPC_GSS_ER_SUCCESS 0 /* no error */ #define RPC_GSS_ER_SYSTEMERROR 1 /* system error */ #ifdef _SYSCALL32 struct gss_clnt_data32 { gss_OID_desc32 mechanism; rpc_gss_service_t service; char uname[MAX_NAME_LEN]; /* server's service name */ char inst[MAX_NAME_LEN]; /* server's instance name */ char realm[MAX_NAME_LEN]; /* server's realm */ uint_t qop; }; #endif /* * This is for Kernel RPC applications. * RPCSEC_GSS flavor specific data in sec_data opaque field. */ typedef struct gss_clnt_data { rpc_gss_OID_desc mechanism; rpc_gss_service_t service; char uname[MAX_NAME_LEN]; /* server's service name */ char inst[MAX_NAME_LEN]; /* server's instance name */ char realm[MAX_NAME_LEN]; /* server's realm */ uint_t qop; } gss_clntdata_t; struct svc_req; /* * KERNEL rpc_gss_* interfaces. */ #ifdef _KERNEL int rpc_gss_secget(CLIENT *, char *, rpc_gss_OID, rpc_gss_service_t, uint_t, rpc_gss_options_req_t *, rpc_gss_options_ret_t *, void *, cred_t *, AUTH **); void rpc_gss_secfree(AUTH *); int rpc_gss_seccreate(CLIENT *, char *, rpc_gss_OID, rpc_gss_service_t, uint_t, rpc_gss_options_req_t *, rpc_gss_options_ret_t *, cred_t *, AUTH **); int rpc_gss_revauth(uid_t, rpc_gss_OID); void rpc_gss_secpurge(void *); enum auth_stat __svcrpcsec_gss(struct svc_req *, struct rpc_msg *, bool_t *); bool_t rpc_gss_set_defaults(AUTH *, rpc_gss_service_t, uint_t); rpc_gss_service_t rpc_gss_get_service_type(AUTH *); #else /* * USER rpc_gss_* public interfaces */ AUTH * rpc_gss_seccreate( CLIENT *clnt, /* associated client handle */ char *principal, /* server service principal */ char *mechanism, /* security mechanism */ rpc_gss_service_t service_type, /* security service */ char *qop, /* requested QOP */ rpc_gss_options_req_t *options_req, /* requested options */ rpc_gss_options_ret_t *options_ret /* returned options */ ); bool_t rpc_gss_get_principal_name( rpc_gss_principal_t *principal, char *mechanism, char *user_name, char *node, char *secdomain ); char **rpc_gss_get_mechanisms(); char **rpc_gss_get_mech_info( char *mechanism, rpc_gss_service_t *service ); bool_t rpc_gss_is_installed( char *mechanism ); bool_t rpc_gss_mech_to_oid( char *mech, rpc_gss_OID *oid ); bool_t rpc_gss_qop_to_num( char *qop, char *mech, uint_t *num ); bool_t rpc_gss_set_svc_name( char *principal, char *mechanism, uint_t req_time, uint_t program, uint_t version ); bool_t rpc_gss_set_defaults( AUTH *auth, rpc_gss_service_t service, char *qop ); void rpc_gss_get_error( rpc_gss_error_t *error ); /* * User level private interfaces */ enum auth_stat __svcrpcsec_gss(); bool_t __rpc_gss_wrap(); bool_t __rpc_gss_unwrap(); #endif /* * USER and KERNEL rpc_gss_* interfaces. */ bool_t rpc_gss_set_callback( rpc_gss_callback_t *cb ); bool_t rpc_gss_getcred( struct svc_req *req, rpc_gss_rawcred_t **rcred, rpc_gss_ucred_t **ucred, void **cookie ); int rpc_gss_max_data_length( AUTH *rpcgss_handle, int max_tp_unit_len ); int rpc_gss_svc_max_data_length( struct svc_req *req, int max_tp_unit_len ); bool_t rpc_gss_get_versions( uint_t *vers_hi, uint_t *vers_lo ); #define RPCSEC_GSS_REFRESH_ATTEMPTS 20 /* * Protocol data. * * The reason to put these definition in this header file * is for 2.6 snoop to handle the RPCSEC_GSS protocol * interpretation. */ #define RPCSEC_GSS_DATA 0 #define RPCSEC_GSS_INIT 1 #define RPCSEC_GSS_CONTINUE_INIT 2 #define RPCSEC_GSS_DESTROY 3 #define RPCSEC_GSS_VERSION 1 #ifdef __cplusplus } #endif #endif /* !_RPCSEC_GSS_H */