/* * Copyright 1999-2006 University of Chicago * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef GLOBUS_XIO_GSI_DRIVER_H #define GLOBUS_XIO_GSI_DRIVER_H /** * @file globus_xio_gsi.h * @brief XIO GSI Driver * @author Sam Meder */ #include "gssapi.h" #include "globus_common.h" #ifdef __cplusplus extern "C" { #endif #ifndef GLOBUS_GLOBAL_DOCUMENT_SET /** * @mainpage Globus XIO GSI Driver * @copydoc globus_xio_gsi_driver */ #endif /** * @defgroup globus_xio_gsi_driver Globus XIO GSI Driver * @brief Globus XIO GSI Driver */ /** * @addtogroup globus_xio_gsi_driver * @section globus_xio_driver_instance_sect Opening/Closing * * An XIO handle with the gsi driver can be created with either * globus_xio_handle_create () or globus_xio_server_register_accept (). * * If the handle is created with * globus_xio_server_register_accept (), the * globus_xio_register_open () call will proceed to accept a GSSAPI * security context. Upon successful completion of the open (after * the open callback has been called) the application may * proceed to read or write data associated with the GSI session. * * If the handle is created with globus_xio_handle_create (), then * the XIO handle will implement the client-side (init) of the GSSAPI call * sequence and establish a security context with the accepting side indicated * by the contact_string passed to globus_xio_register_open (). */ /** * @addtogroup globus_xio_gsi_driver * @section globus_xio_driver_readwrite_sect Reading/Writing * * The GSI driver behaves similar to the underlying transport driver with * respect to reads and writes, except for the try-read and try-write * operations (ie. waitforbytes ==0) which always return immediately. This is * due to the fact that the security layer needs to read and write tokens of a * certain minimal size and thus needs to rely on the underlying transport to * handle greater than 0 reads/write which is not possible in "try" mode. */ /** * @addtogroup globus_xio_gsi_driver * @section globus_xio_gsi_driver_server_sect Server * * globus_xio_server_create() causes a new transport-specific * listener socket to be created to handle new GSI connections. * globus_xio_server_register_accept() will accept a new * connection for processing. globus_xio_server_register_close() * cleans up the internal resources associated with the http server * and calls close on the listener. * * All accepted handles inherit all GSI-specific attributes set in the attr to * globus_xio_server_create(), but can be overridden with the attr to * globus_xio_register_open(). Furthermore, accepted handles will use the * GSSAPI accept security context call unless explicitly overridden during the * globus_xio_register_open() call ( * GLOBUS_XIO_GSI_FORCE_SERVER_MODE). */ /** * @addtogroup globus_xio_gsi_driver * @section globus_xio_gsi_driver_envs_sect Environment Variables * * The gsi driver uses the following environment variables * - X509_USER_PROXY * - X509_USER_CERT * - X509_USER_KEY * - X509_CERT_DIR * * For details see * Globus: GSI Environment Variables */ /** * @addtogroup globus_xio_gsi_driver * @section globus_xio_gsi_driver_cntls_sect Attributes and Cntls * * GSI driver specific attrs and cntls * * @see globus_xio_attr_cntl () * @see globus_xio_handle_cntl () */ /** * @addtogroup globus_xio_gsi_driver * @section globus_xio_gsi_driver_errors_sect Error Types * * The GSI driver uses mostly GSSAPI calls, so it generally just wraps the * underlying GSSAPI errors or uses generic XIO errors. * * @see globus_xio_driver_error_match () * @see globus_error_gssapi_match () * @see globus_error_match_openssl_error () */ /** * GSI driver specific error types * @ingroup globus_xio_gsi_driver */ typedef enum { /** Indicates that the established context does not meet the required * protection level */ GLOBUS_XIO_GSI_ERROR_INVALID_PROTECTION_LEVEL, /** Wraps a GSSAPI error */ GLOBUS_XIO_GSI_ERROR_WRAP_GSSAPI, /** Indicates that GLOBUS_XIO_GSI_IDENTITY_AUTHORIZATION is set but that * the target name is empty */ GLOBUS_XIO_GSI_ERROR_EMPTY_TARGET_NAME, /** Indicates that GLOBUS_XIO_GSI_HOST_AUTHORIZATION is set but that * no host name is available */ GLOBUS_XIO_GSI_ERROR_EMPTY_HOST_NAME, /** Indicates that the peer is not authorized */ GLOBUS_XIO_GSI_AUTHORIZATION_FAILED, /** Indicates the token being read is too big. Usually happens * when someone tries to establish a non secure session with a * endpoint that expects security*/ GLOBUS_XIO_GSI_ERROR_TOKEN_TOO_BIG } globus_xio_gsi_error_t; /** doxygen varargs filter stuff * GlobusVarArgDefine( * attr, globus_result_t, globus_xio_gsi_attr_cntl, attr, driver) * GlobusVarArgDefine( * handle, globus_result_t, globus_xio_gsi_handle_cntl, handle, driver) */ #define globus_xio_gsi_attr_cntl globus_xio_attr_cntl #define globus_xio_gsi_handle_cntl globus_xio_handle_cntl /** * GSI driver specific cntls * @ingroup globus_xio_gsi_driver */ typedef enum { /** GlobusVarArgEnum(attr, handle) * Set the credential to be used * @ingroup globus_xio_gsi_driver * * @param credential * The credential to set. The credential structure * needs to remain valid for the lifetime of any XIO data structure it * is used by. * @note If this is called with the handle_cntl, there must be no * outstanding operations on the handle. */ /* gss_cred_id_t credential */ GLOBUS_XIO_GSI_SET_CREDENTIAL, /** GlobusVarArgEnum(attr, handle) * Get the credential to be used * @ingroup globus_xio_gsi_driver * * @param credential * The credential that is currently set. This will only * return a credential if a credential was explicitly set prior to * this call. It will not return any credential automatically acquired * during context initialization. */ /* gss_cred_id_t * credential */ GLOBUS_XIO_GSI_GET_CREDENTIAL, /** GlobusVarArgEnum(attr) * Set the GSSAPI req_flags to be used * @ingroup globus_xio_gsi_driver * * @param req_flags * The req_flags to set */ /* OM_uint32 req_flags */ GLOBUS_XIO_GSI_SET_GSSAPI_REQ_FLAGS, /** GlobusVarArgEnum(attr) * Get the GSSAPI req_flags to be used * @ingroup globus_xio_gsi_driver * * @param req_flags * The req flags currently in effect */ /* OM_uint32 * req_flags */ GLOBUS_XIO_GSI_GET_GSSAPI_REQ_FLAGS, /** GlobusVarArgEnum(attr) * Set the proxy mode * @ingroup globus_xio_gsi_driver * * @param proxy_mode * The proxy mode to set * @note Changing the proxy mode changes the req_flags * * string opt: proxy="many"|"full"|"limited" */ /* globus_xio_gsi_proxy_mode_t proxy_mode*/ GLOBUS_XIO_GSI_SET_PROXY_MODE, /** GlobusVarArgEnum(attr) * Get the proxy mode * @ingroup globus_xio_gsi_driver * * @param proxy_mode * The proxy mode that is currently in effect * @note Changing the proxy mode changes the req_flags */ /* globus_xio_gsi_proxy_mode_t * proxy_mode*/ GLOBUS_XIO_GSI_GET_PROXY_MODE, /** GlobusVarArgEnum(attr) * Set the authorization mode * @ingroup globus_xio_gsi_driver * * @param authz_mode * The authorization mode to set * * string opt: auth="none"|"self"|"host"|"id" */ /* globus_xio_gsi_authorization_mode_t authz_mode*/ GLOBUS_XIO_GSI_SET_AUTHORIZATION_MODE, /** GlobusVarArgEnum(attr) * Get the authorization mode * @ingroup globus_xio_gsi_driver * * @param authz_mode * The authorization mode that is currently in effect */ /* globus_xio_gsi_authorization_mode_t * authz_mode*/ GLOBUS_XIO_GSI_GET_AUTHORIZATION_MODE, /** GlobusVarArgEnum(attr) * Set the delegation mode * @ingroup globus_xio_gsi_driver * * @param delegation_mode * The delegation mode to use * @note Changing the delegation mode changes the req_flags */ /* globus_xio_gsi_delegation_mode_t delegation_mode*/ GLOBUS_XIO_GSI_SET_DELEGATION_MODE, /** GlobusVarArgEnum(attr) * Get the delegation mode * @ingroup globus_xio_gsi_driver * * @param delegation_mode * The delegation mode currently in effect */ /* globus_xio_gsi_delegation_mode_t * delegation_mode*/ GLOBUS_XIO_GSI_GET_DELEGATION_MODE, /** GlobusVarArgEnum(attr) * Make the on the wire protocol SSL compatible. * @ingroup globus_xio_gsi_driver * * This implies no wrapping of security tokens and no delegation * * @param ssl_mode * The ssl compatibility mode to use * @note Changing the ssl compatibility mode changes the req_flags * * string opt: ssl_compatible="true"|"false" */ /* globus_bool_t ssl_mode*/ GLOBUS_XIO_GSI_SET_SSL_COMPATIBLE, /** GlobusVarArgEnum(attr) * Do anonymous authentication * @ingroup globus_xio_gsi_driver * * @param anon_mode * The ssl compatibility mode to use * @note Changing the ssl compatibility mode changes the req_flags and the * wrapping mode */ /* globus_bool_t anon_mode*/ GLOBUS_XIO_GSI_SET_ANON, /** GlobusVarArgEnum(attr) * Set the wrapping mode * @ingroup globus_xio_gsi_driver * * This mode determines whether tokens will be * wrapped with a Globus IO style header or not. * * @param wrap_mode * The wrapping mode to use */ /* globus_bool_t wrap_mode*/ GLOBUS_XIO_GSI_SET_WRAP_MODE, /** GlobusVarArgEnum(attr) * Get the wrapping mode * @ingroup globus_xio_gsi_driver * * This mode determines whether tokens will * be wrapped with a Globus IO style header or not. * * @param wrap_mode * The wrapping mode currently in use. */ /* globus_bool_t * wrap_mode*/ GLOBUS_XIO_GSI_GET_WRAP_MODE, /** GlobusVarArgEnum(attr) * Set the read buffer size * @ingroup globus_xio_gsi_driver * * The read buffer is used for buffering * wrapped data, is initialized with a default size of 128K and scaled * dynamically to always be able to fit whole tokens. * * @param buffer_size * The size of the read buffer */ /* globus_size_t buffer_size*/ GLOBUS_XIO_GSI_SET_BUFFER_SIZE, /** GlobusVarArgEnum(attr) * Get the read buffer size * @ingroup globus_xio_gsi_driver * * The read buffer is used for buffering * wrapped data, is initialized with a default size of 128K and scaled * dynamically to always be able to fit whole tokens. * * @param buffer_size * The size of the read buffer */ /* globus_size_t * buffer_size*/ GLOBUS_XIO_GSI_GET_BUFFER_SIZE, /** GlobusVarArgEnum(attr) * Set the protection level * @ingroup globus_xio_gsi_driver * * @param protection_level * The protection level to set * @note Changing the proxy mode changes the req_flags * * string opt: protection="none"|"private"|"integrity" */ /* globus_xio_gsi_protection_level_t protection_level*/ GLOBUS_XIO_GSI_SET_PROTECTION_LEVEL, /** GlobusVarArgEnum(attr) * Get the protection level * @ingroup globus_xio_gsi_driver * * @param protection_level * The current protection level */ /* globus_xio_gsi_protection_level_t * protection_level*/ GLOBUS_XIO_GSI_GET_PROTECTION_LEVEL, /** GlobusVarArgEnum(attr) * Set the expected peer name * @ingroup globus_xio_gsi_driver * * @param target_name * The expected peer name */ /* gss_name_t * target_name */ GLOBUS_XIO_GSI_GET_TARGET_NAME, /** GlobusVarArgEnum(attr) * Get the expected peer name * @ingroup globus_xio_gsi_driver * * @param target_name * The expected peer name * * string opt: subject=string */ /* gss_name_t target_name */ GLOBUS_XIO_GSI_SET_TARGET_NAME, /** GlobusVarArgEnum(handle) * Get the GSS context * @ingroup globus_xio_gsi_driver * * @param context * The GSS context */ /* gss_ctx_id_t * context */ GLOBUS_XIO_GSI_GET_CONTEXT, /** GlobusVarArgEnum(handle) * Get the delegated credential * @ingroup globus_xio_gsi_driver * * @param credential * The delegated credential */ /* gss_cred_id_t * credential */ GLOBUS_XIO_GSI_GET_DELEGATED_CRED, /** GlobusVarArgEnum(handle) * Get the name of the peer * @ingroup globus_xio_gsi_driver * * @param peer_name * The GSS name of the peer. */ /* gss_name_t * peer_name */ GLOBUS_XIO_GSI_GET_PEER_NAME, /** GlobusVarArgEnum(handle) * Get the GSS name associated with the local credentials * @ingroup globus_xio_gsi_driver * * @param local_name * The GSS name of the local credentials */ /* gss_name_t * local_name */ GLOBUS_XIO_GSI_GET_LOCAL_NAME, /** GlobusVarArgEnum(handle) * Initialize delegation-at-any-time process * @ingroup globus_xio_gsi_driver * * @param credential * The GSS credential to delegate * @param restriction_oids * The OIDs for X.509 extensions to embed in the delegated * credential * @param restriction_buffers * The corresponding bodies for the X.509 extensions * @param time_req * The lifetime of the delegated credential */ /* gss_cred_id_t credential, gss_OID_set restriction_oids, gss_buffer_set_t restriction_buffers, OM_uint32 time_req */ GLOBUS_XIO_GSI_INIT_DELEGATION, /** GlobusVarArgEnum(handle) * Initialize non-blocking delegation-at-any-time process * @ingroup globus_xio_gsi_driver * * @param credential * The GSS credential to delegate * @param restriction_oids * The OIDS for X.509 extensions to embed in the delegated * credential * @param restriction_buffers * The corresponding bodies for the X.509 extensions * @param time_req * The lifetime of the delegated credential * @param callback * The callback to call when the operation completes * @param callback_arg * The arguments to pass to the callback */ /* gss_cred_id_t credential, gss_OID_set restriction_oids, gss_buffer_set_t restriction_buffers, OM_uint32 time_req, globus_xio_gsi_delegation_init_callback_t callback, void * callback_arg */ GLOBUS_XIO_GSI_REGISTER_INIT_DELEGATION, /** GlobusVarArgEnum(handle) * Accept delegation-at-any-time process * @ingroup globus_xio_gsi_driver * * @param credential * The delegated GSS credential * @param restriction_oids * The OIDS for X.509 extensions to embed in the delegated * credential * @param restriction_buffers * The corresponding bodies for the X.509 extensions * @param time_req * The requested lifetime of the delegated credential */ /* gss_cred_id_t * credential, gss_OID_set restriction_oids, gss_buffer_set_t restriction_buffers, OM_uint32 time_req */ GLOBUS_XIO_GSI_ACCEPT_DELEGATION, /** GlobusVarArgEnum(handle) * Accept non-blocking delegation-at-any-time process * @ingroup globus_xio_gsi_driver * * @param restriction_oids * The OIDS for X.509 extensions to embed in the delegated * credential * @param restriction_buffers * The corresponding bodies for the X.509 extensions * @param time_req * The lifetime of the delegated credential * @param callback * The callback to call when the operation completes * @param callback_arg * The arguments to pass to the callback */ /* gss_OID_set restriction_oids, gss_buffer_set_t restriction_buffers, OM_uint32 time_req, globus_xio_gsi_delegation_accept_callback_t callback, void * callback_arg */ GLOBUS_XIO_GSI_REGISTER_ACCEPT_DELEGATION, /** GlobusVarArgEnum(attr) * Force the server mode setting. * @ingroup globus_xio_gsi_driver * * This explicitly sets the directionality of context establishment and * delegation. * * @param server_mode * The server mode. */ /* globus_bool_t server_mode */ GLOBUS_XIO_GSI_FORCE_SERVER_MODE, /** GlobusVarArgEnum(attr) * Set the allow missing signing policy flag * @ingroup globus_xio_gsi_driver * * @param allow * The flag setting to use * @note Changing this flag changes the req_flags */ /* globus_bool_t allow*/ GLOBUS_XIO_GSI_SET_ALLOW_MISSING_SIGNING_POLICY, /** GlobusVarArgEnum(attr) * Get the allow missing signing policy flag * @ingroup globus_xio_gsi_driver * * @param allow * The flag currently set */ /* globus_bool_t * allow*/ GLOBUS_XIO_GSI_GET_ALLOW_MISSING_SIGNING_POLICY, /** GlobusVarArgEnum(attr, handle) * Set the directory for credentials to use when accepting a security * context. This is used when a service requires different credentials * based on the SNI TLS extension. * @ingroup globus_xio_gsi_driver * * @param directory * The path to the directory containing credentials. * string opt: credentials_dir=string */ /* const char * directory */ GLOBUS_XIO_GSI_SET_CREDENTIALS_DIR, /** GlobusVarArgEnum(attr, handle) * Set the list of application protocols to negotiate during TLS handshake. * This uses tht TLS ALPN extension. * @ingroup globus_xio_gsi_driver * * @param protocols * An array of protocol names. The array must be terminated by a * NULL pointer. */ /* char ** protocols */ GLOBUS_XIO_GSI_SET_APPLICATION_PROTOCOLS, } globus_xio_gsi_cmd_t; /** * Globus XIO GSI protection levels * @ingroup globus_xio_gsi_driver */ typedef enum { /** No security */ GLOBUS_XIO_GSI_PROTECTION_LEVEL_NONE, /** Messages are signed */ GLOBUS_XIO_GSI_PROTECTION_LEVEL_INTEGRITY, /** Messages are signed and encrypted */ GLOBUS_XIO_GSI_PROTECTION_LEVEL_PRIVACY } globus_xio_gsi_protection_level_t; /** * Globus XIO GSI delegation modes * @ingroup globus_xio_gsi_driver */ typedef enum { /** No delegation */ GLOBUS_XIO_GSI_DELEGATION_MODE_NONE, /** Delegate a limited proxy */ GLOBUS_XIO_GSI_DELEGATION_MODE_LIMITED, /** Delegate a full proxy */ GLOBUS_XIO_GSI_DELEGATION_MODE_FULL } globus_xio_gsi_delegation_mode_t; /** * Globus XIO GSI proxy modes * @ingroup globus_xio_gsi_driver */ typedef enum { /** Accept only full proxies */ GLOBUS_XIO_GSI_PROXY_MODE_FULL, /** Accept full proxies and limited proxies if they are * the only limited proxy in the cert chain. */ GLOBUS_XIO_GSI_PROXY_MODE_LIMITED, /** Accept both full and limited proxies unconditionally */ GLOBUS_XIO_GSI_PROXY_MODE_MANY } globus_xio_gsi_proxy_mode_t; /** * Globus XIO GSI authorization modes * @ingroup globus_xio_gsi_driver */ typedef enum { /** Do not perform any authorization. This will cause a error when used in * conjunction with delegation on the init/client side. */ GLOBUS_XIO_GSI_NO_AUTHORIZATION, /** Authorize the peer if the peer has the same identity as ourselves */ GLOBUS_XIO_GSI_SELF_AUTHORIZATION, /** Authorize the peer if the peer identity matches the identity set in the * target name. */ GLOBUS_XIO_GSI_IDENTITY_AUTHORIZATION, /** Authorize the peer if the identity of the peer matches the identity of * the peer hostname. */ GLOBUS_XIO_GSI_HOST_AUTHORIZATION } globus_xio_gsi_authorization_mode_t; /** * Globus XIO GSI init delegation callback * @ingroup globus_xio_gsi_driver */ typedef void (* globus_xio_gsi_delegation_init_callback_t)( globus_result_t result, void * user_arg); /** * Globus XIO GSI init delegation callback * @ingroup globus_xio_gsi_driver */ typedef void (* globus_xio_gsi_delegation_accept_callback_t)( globus_result_t result, gss_cred_id_t delegated_cred, OM_uint32 time_rec, void * user_arg); #ifdef __cplusplus } #endif #endif /* GLOBUS_XIO_GSI_DRIVER_H */