GSS_INIT_SEC_CONTEXT(3GSS) Generic Security Services API Library Functions

NAME


gss_init_sec_context - initiate a GSS-API security context with a
peer application

SYNOPSIS


cc [ flag... ] file... -lgss [ library... ]
#include <gssapi/gssapi.h>

OM_uint32 gss_init_sec_context(OM_uint32 *minor_status,
const gss_cred_id_t initiator_cred_handle,
gss_ctx_id_t *context_handle, const gss_name_t *target_name,
const gss_OID mech_type, OM_uint32 req_flags,
OM_uint32 time_req, const gss_channel_bindings_t input_chan_bindings,
const gss_buffer_t input_token, gss_OID *actual_mech_type,
gss_buffer_t output_token, OM_uint32 *ret_flags,
OM_uint32 *time_rec);


PARAMETERS


The parameter descriptions for gss_init_sec_context() follow:

minor_status
A mechanism specific status code.


initiator_cred_handle
The handle for the credentials claimed.
Supply GSS_C_NO_CREDENTIAL to act as a
default initiator principal. If no default
initiator is defined, the function returns
GSS_S_NO_CRED.


context_handle
The context handle for a new context. Supply
the value GSS_C_NO_CONTEXT for the first
call, and use the value returned in any
continuation calls. The resources associated
with context_handle must be released by the
application after use by a call to
gss_delete_sec_context(3GSS).


target_name
The name of the context acceptor.


mech_type
The object ID of the desired mechanism. To
obtain a specific default, supply the value
GSS_C_NO_ID.


req_flags
Contains independent flags, each of which
will request that the context support a
specific service option. A symbolic name is
provided for each flag. Logically-OR the
symbolic name to the corresponding required
flag to form the bit-mask value. req_flags
may contain one of the following values:

GSS_C_DELEG_FLAG
If true, delegate
credentials to a
remote peer. Do not
delegate the
credentials if the
value is false.


GSS_C_MUTUAL_FLAG
If true, request that
the peer authenticate
itself. If false,
authenticate to the
remote peer only.


GSS_C_REPLAY_FLAG
If true, enable
replay detection for
messages protected
with gss_wrap(3GSS)
or gss_get_mic(3GSS).
Do not attempt to
detect replayed
messages if false.


GSS_C_SEQUENCE_FLAG
If true, enable
detection of out-of-
sequence protected
messages. Do not
attempt to detect
out-of-sequence
messages if false.


GSS_C_CONF_FLAG
If true, request that
confidential service
be made available by
means of
gss_wrap(3GSS). If
false, no per-message
confidential service
is required.


GSS_C_INTEG_FLAG
If true, request that
integrity service be
made available by
means of
gss_wrap(3GSS) or
gss_get_mic(3GSS). If
false, no per-message
integrity service is
required.


GSS_C_ANON_FLAG
If true, do not
reveal the
initiator's identify
to the acceptor. If
false, authenticate
normally.


time_req
The number of seconds for which the context
will remain valid. Supply a zero value to
time_req to request a default validity
period.


input_chan_bindings
Optional application-specified bindings.
Allows application to securely bind channel
identification information to the security
context. Set to GSS_C_NO_CHANNEL_BINDINGS if
you do not want to use channel bindings.


input_token
Token received from the peer application. On
the initial call, supply GSS_C_NO_BUFFER or
a pointer to a buffer containing the value
GSS_C_EMPTY_BUFFER.


actual_mech_type
The actual mechanism used. The OID returned
by means of this parameter will be pointer
to static storage that should be treated as
read-only. The application should not
attempt to free it. To obtain a specific
default, supply the value GSS_C_NO_ID.
Specify NULL if the parameter is not
required.


output_token
The token to send to the peer application.
If the length field of the returned buffer
is zero, no token need be sent to the peer
application. After use storage associated
with this buffer must be freed by the
application by a call to
gss_release_buffer(3GSS).


ret_flags
Contains various independent flags, each of
which indicates that the context supports a
specific service option. If not needed,
specify NULL. Test the returned bit-mask
ret_flags value against its symbolic name to
determine if the given option is supported
by the context. ret_flags may contain one of
the following values:

GSS_C_DELEG_FLAG
If true,
credentials were
delegated to the
remote peer. If
false, no
credentials were
delegated.


GSS_C_MUTUAL_FLAG
If true, the remote
peer authenticated
itself. If false,
the remote peer did
not authenticate
itself.


GSS_C_REPLAY_FLAG
If true, replay of
protected messages
will be detected.
If false, replayed
messages will not
be detected.


GSS_C_SEQUENCE_FLAG
If true, out of
sequence protected
messages will be
detected. If false,
they will not be
detected.


GSS_C_CONF_FLAG
If true,
confidential
service may be
invoked by calling
the gss_wrap()
routine. If false,
no confidentiality
service is
available by means
of gss_wrap(3GSS).
gss_wrap() will
provide message
encapsulation,
data-origin
authentication and
integrity services
only.


GSS_C_INTEG_FLAG
If true, integrity
service may be
invoked by calling
either the
gss_wrap(3GSS) or
gss_get_mic(3GSS)
routine. If false,
per-message
integrity service
is not available.


GSS_C_ANON_FLAG
If true, the
initiator's
identity has not
been revealed; it
will not be
revealed if any
emitted token is
passed to the
acceptor. If false,
the initiator has
been or will be
authenticated
normally.


GSS_C_PROT_READY_FLAG
If true, the
protection services
specified by the
states of
GSS_C_CONF_FLAG and
GSS_C_INTEG_FLAG
are available if
the accompanying
major status return
value is either
GSS_S_COMPLETE or
GSS_S_CONTINUE_NEEDED.
If false, the
protection services
are available only
if the accompanying
major status return
value is
GSS_S_COMPLETE.


GSS_C_TRANS_FLAG
If true, the
resultant security
context may be
transferred to
other processes by
means of a call to
gss_export_sec_context(3GSS).
If false, the
security context
cannot be
transferred.


time_rec
The number of seconds for which the context
will remain valid. Specify NULL if the
parameter is not required.


DESCRIPTION


The gss_init_sec_context() function initiates the establishment of a
security context between the application and a remote peer.
Initially, the input_token parameter should be specified either as
GSS_C_NO_BUFFER, or as a pointer to a gss_buffer_desc object with a
length field that contains a zero value. The routine may return a
output_token, which should be transferred to the peer application,
which will present it to gss_accept_sec_context(3GSS). If no token
need be sent, gss_init_sec_context() will indicate this by setting
the length field of the output_token argument to zero. To complete
context establishment, one or more reply tokens may be required from
the peer application; if so, gss_init_sec_context() will return a
status code that contains the supplementary information bit
GSS_S_CONTINUE_NEEDED. In this case, make another call to
gss_init_sec_context() when the reply token is received from the peer
application and pass the reply token to gss_init_sec_context() by
means of the input_token parameter.


Construct portable applications to use the token length and return
status to determine whether to send or wait for a token.


Whenever the routine returns a major status that includes the value
GSS_S_CONTINUE_NEEDED, the context is not fully established, and the
following restrictions apply to the output parameters:

o The value returned by means of the time_rec parameter is
undefined. Unless the accompanying ret_flags parameter
contains the bit GSS_C_PROT_READY_FLAG, which indicates
that per-message services may be applied in advance of a
successful completion status, the value returned by means
of the actual_mech_type parameter is undefined until the
routine returns a major status value of GSS_S_COMPLETE.

o The values of the GSS_C_DELEG_FLAG, GSS_C_MUTUAL_FLAG,
GSS_C_REPLAY_FLAG, GSS_C_SEQUENCE_FLAG, GSS_C_CONF_FLAG,
GSS_C_INTEG_FLAG and GSS_C_ANON_FLAG bits returned by the
ret_flags parameter contain values that will be valid if
context establishment succeeds. For example, if the
application requests a service such as delegation or
anonymous authentication by means of the req_flags
argument, and the service is unavailable from the
underlying mechanism, gss_init_sec_context() generates a
token that will not provide the service, and it indicate
by means of the ret_flags argument that the service will
not be supported. The application may choose to abort
context establishment by calling
gss_delete_sec_context(3GSS) if it cannot continue without
the service, or if the service was merely desired but not
mandatory, it may transmit the token and continue context
establishment.

o The values of the GSS_C_PROT_READY_FLAG and
GSS_C_TRANS_FLAG bits within ret_flags indicate the actual
state at the time gss_init_sec_context() returns, whether
or not the context is fully established.

o The GSS-API sets the GSS_C_PROT_READY_FLAG in the final
ret_flags returned to a caller, for example, when
accompanied by a GSS_S_COMPLETE status code. However,
applications should not rely on this behavior, as the flag
was not defined in Version 1 of the GSS-API. Instead,
applications should determine what per-message services
are available after a successful context establishment
according to the GSS_C_INTEG_FLAG and GSS_C_CONF_FLAG
values.

o All other bits within the ret_flags argument are set to
zero.


If the initial call of gss_init_sec_context() fails, the GSS-API does
not create a context object; it leaves the value of the
context_handle parameter set to GSS_C_NO_CONTEXT to indicate this.
In the event of failure on a subsequent call, the GSS-API leaves the
security context untouched for the application to delete using
gss_delete_sec_context(3GSS).


During context establishment, the informational status bits
GSS_S_OLD_TOKEN and GSS_S_DUPLICATE_TOKEN indicate fatal errors, and
GSS-API mechanisms should always return them in association with a
status code of GSS_S_FAILURE. This pairing requirement was not part
of Version 1 of the GSS-API specification, so applications that wish
to run on Version 1 implementations must special-case these codes.

ERRORS


gss_init_sec_context() may return the following status codes:

GSS_S_COMPLETE
Successful completion.


GSS_S_CONTINUE_NEEDED
A token from the peer application is
required to complete the context, and
gss_init_sec_context() must be called
again with that token.


GSS_S_DEFECTIVE_TOKEN
Consistency checks performed on the
input_token failed.


GSS_S_DEFECTIVE_CREDENTIAL
Consistency checks performed on the
credential failed.


GSS_S_NO_CRED
The supplied credentials are not valid
for context acceptance, or the
credential handle does not reference
any credentials.


GSS_S_CREDENTIALS_EXPIRED
The referenced credentials have
expired.


GSS_S_BAD_BINDINGS
The input_token contains different
channel bindings than those specified
by means of the input_chan_bindings
parameter.


GSS_S_BAD_SIG
The input_token contains an invalid MIC
or a MIC that cannot be verified.


GSS_S_OLD_TOKEN
The input_token is too old. This is a
fatal error while establishing context.


GSS_S_DUPLICATE_TOKEN
The input_token is valid, but it is a
duplicate of a token already processed.
This is a fatal error while
establishing context.


GSS_S_NO_CONTEXT
The supplied context handle does not
refer to a valid context.


GSS_S_BAD_NAMETYPE
The provided target_name parameter
contains an invalid or unsupported name
type.


GSS_S_BAD_NAME
The supplied target_name parameter is
ill-formed.


GSS_S_BAD_MECH
The token received specifies a
mechanism that is not supported by the
implementation or the provided
credential.


GSS_S_FAILURE
The underlying mechanism detected an
error for which no specific GSS status
code is defined. The mechanism-specific
status code reported by means of the
minor_status parameter details the
error condition.


EXAMPLES


Example 1: Invoking gss_init_sec_context() Within a Loop




A typical portable caller should always invoke gss_init_sec_context()
within a loop:


int context_established = 0;
gss_ctx_id_t context_hdl = GSS_C_NO_CONTEXT;
...
input_token->length = 0;

while (!context_established) {
maj_stat = gss_init_sec_context(&min_stat,
cred_hdl,
&context_hdl,
target_name,
desired_mech,
desired_services,
desired_time,
input_bindings,
input_token,
&actual_mech,
output_token,
&actual_services,
&actual_time);
if (GSS_ERROR(maj_stat)) {
report_error(maj_stat, min_stat);
};

if (output_token->length != 0) {
send_token_to_peer(output_token);
gss_release_buffer(&min_stat, output_token)
};
if (GSS_ERROR(maj_stat)) {

if (context_hdl != GSS_C_NO_CONTEXT)
gss_delete_sec_context(&min_stat,
&context_hdl,
GSS_C_NO_BUFFER);
break;
};
if (maj_stat & GSS_S_CONTINUE_NEEDED) {
receive_token_from_peer(input_token);
} else {
context_established = 1;
};
};


ATTRIBUTES


See attributes(7) for descriptions of the following attributes:


+---------------+-----------------+
|ATTRIBUTE TYPE | ATTRIBUTE VALUE |
+---------------+-----------------+
|MT-Level | Safe |
+---------------+-----------------+

SEE ALSO


gss_delete_sec_context(3GSS), gss_export_sec_context(3GSS),
gss_get_mic(3GSS), gss_wrap(3GSS), attributes(7)


Solaris Security for Developers Guide

May 22, 2006 GSS_INIT_SEC_CONTEXT(3GSS)

tribblix@gmail.com :: GitHub :: Privacy