11a75fc89d
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@1560 ec53bebd-3082-4978-b11e-865c3cabbd6b
2747 lines
109 KiB
Plaintext
2747 lines
109 KiB
Plaintext
|
|
|
|
|
|
|
|
|
|
|
|
Network Working Group J. Linn
|
|
Request for Comments: 1508 Geer Zolot Associates
|
|
September 1993
|
|
|
|
|
|
Generic Security Service Application Program Interface
|
|
|
|
Status of this Memo
|
|
|
|
This RFC specifies an Internet standards track protocol for the
|
|
Internet community, and requests discussion and suggestions for
|
|
improvements. Please refer to the current edition of the "Internet
|
|
Official Protocol Standards" for the standardization state and status
|
|
of this protocol. Distribution of this memo is unlimited.
|
|
|
|
Abstract
|
|
|
|
This Generic Security Service Application Program Interface (GSS-API)
|
|
definition provides security services to callers in a generic
|
|
fashion, supportable with a range of underlying mechanisms and
|
|
technologies and hence allowing source-level portability of
|
|
applications to different environments. This specification defines
|
|
GSS-API services and primitives at a level independent of underlying
|
|
mechanism and programming language environment, and is to be
|
|
complemented by other, related specifications:
|
|
|
|
documents defining specific parameter bindings for particular
|
|
language environments
|
|
|
|
documents defining token formats, protocols, and procedures to
|
|
be implemented in order to realize GSS-API services atop
|
|
particular security mechanisms
|
|
|
|
Table of Contents
|
|
|
|
1. GSS-API Characteristics and Concepts ....................... 2
|
|
1.1. GSS-API Constructs ....................................... 5
|
|
1.1.1. Credentials ........................................... 5
|
|
1.1.2. Tokens ................................................ 6
|
|
1.1.3. Security Contexts ..................................... 7
|
|
1.1.4. Mechanism Types ....................................... 8
|
|
1.1.5. Naming ................................................ 9
|
|
1.1.6. Channel Bindings ...................................... 10
|
|
1.2. GSS-API Features and Issues ............................. 11
|
|
1.2.1. Status Reporting ...................................... 11
|
|
1.2.2. Per-Message Security Service Availability ............. 12
|
|
1.2.3. Per-Message Replay Detection and Sequencing ........... 13
|
|
1.2.4. Quality of Protection ................................. 15
|
|
|
|
|
|
|
|
Linn [Page 1]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
2. Interface Descriptions ..................................... 15
|
|
2.1. Credential management calls ............................. 17
|
|
2.1.1. GSS_Acquire_cred call ................................. 17
|
|
2.1.2. GSS_Release_cred call ................................. 19
|
|
2.1.3. GSS_Inquire_cred call ................................. 20
|
|
2.2. Context-level calls ..................................... 21
|
|
2.2.1. GSS_Init_sec_context call ............................. 21
|
|
2.2.2. GSS_Accept_sec_context call ........................... 26
|
|
2.2.3. GSS_Delete_sec_context call ........................... 29
|
|
2.2.4. GSS_Process_context_token call ........................ 30
|
|
2.2.5. GSS_Context_time call ................................. 31
|
|
2.3. Per-message calls ....................................... 32
|
|
2.3.1. GSS_Sign call ......................................... 32
|
|
2.3.2. GSS_Verify call ....................................... 33
|
|
2.3.3. GSS_Seal call ......................................... 35
|
|
2.3.4. GSS_Unseal call ....................................... 36
|
|
2.4. Support calls ........................................... 37
|
|
2.4.1. GSS_Display_status call ............................... 37
|
|
2.4.2. GSS_Indicate_mechs call ............................... 38
|
|
2.4.3. GSS_Compare_name call ................................. 38
|
|
2.4.4. GSS_Display_name call ................................. 39
|
|
2.4.5. GSS_Import_name call .................................. 40
|
|
2.4.6. GSS_Release_name call ................................. 41
|
|
2.4.7. GSS_Release_buffer call ............................... 41
|
|
2.4.8. GSS_Release_oid_set call .............................. 42
|
|
3. Mechanism-Specific Example Scenarios ....................... 42
|
|
3.1. Kerberos V5, single-TGT ................................. 43
|
|
3.2. Kerberos V5, double-TGT ................................. 43
|
|
3.3. X.509 Authentication Framework .......................... 44
|
|
4. Related Activities ......................................... 45
|
|
5. Acknowledgments ............................................ 46
|
|
6. Security Considerations .................................... 46
|
|
7. Author's Address ........................................... 46
|
|
Appendix A .................................................... 47
|
|
Appendix B .................................................... 48
|
|
Appendix C .................................................... 49
|
|
|
|
1. GSS-API Characteristics and Concepts
|
|
|
|
The operational paradigm in which GSS-API operates is as follows. A
|
|
typical GSS-API caller is itself a communications protocol, calling
|
|
on GSS-API in order to protect its communications with
|
|
authentication, integrity, and/or confidentiality security services.
|
|
A GSS-API caller accepts tokens provided to it by its local GSS-API
|
|
implementation and transfers the tokens to a peer on a remote system;
|
|
that peer passes the received tokens to its local GSS-API
|
|
implementation for processing. The security services available
|
|
through GSS-API in this fashion are implementable (and have been
|
|
|
|
|
|
|
|
Linn [Page 2]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
implemented) over a range of underlying mechanisms based on secret-
|
|
key and public-key cryptographic technologies.
|
|
|
|
The GSS-API separates the operations of initializing a security
|
|
context between peers, achieving peer entity authentication (This
|
|
security service definition, and other definitions used in this
|
|
document, corresponds to that provided in International Standard ISO
|
|
7498-2-1988(E), Security Architecture.) (GSS_Init_sec_context() and
|
|
GSS_Accept_sec_context() calls), from the operations of providing
|
|
per-message data origin authentication and data integrity protection
|
|
(GSS_Sign() and GSS_Verify() calls) for messages subsequently
|
|
transferred in conjunction with that context. Per-message GSS_Seal()
|
|
and GSS_Unseal() calls provide the data origin authentication and
|
|
data integrity services which GSS_Sign() and GSS_Verify() offer, and
|
|
also support selection of confidentiality services as a caller
|
|
option. Additional calls provide supportive functions to the GSS-
|
|
API's users.
|
|
|
|
The following paragraphs provide an example illustrating the
|
|
dataflows involved in use of the GSS-API by a client and server in a
|
|
mechanism-independent fashion, establishing a security context and
|
|
transferring a protected message. The example assumes that credential
|
|
acquisition has already been completed. The example assumes that the
|
|
underlying authentication technology is capable of authenticating a
|
|
client to a server using elements carried within a single token, and
|
|
of authenticating the server to the client (mutual authentication)
|
|
with a single returned token; this assumption holds for presently-
|
|
documented CAT mechanisms but is not necessarily true for other
|
|
cryptographic technologies and associated protocols.
|
|
|
|
The client calls GSS_Init_sec_context() to establish a security
|
|
context to the server identified by targ_name, and elects to set the
|
|
mutual_req_flag so that mutual authentication is performed in the
|
|
course of context establishment. GSS_Init_sec_context() returns an
|
|
output_token to be passed to the server, and indicates
|
|
GSS_CONTINUE_NEEDED status pending completion of the mutual
|
|
authentication sequence. Had mutual_req_flag not been set, the
|
|
initial call to GSS_Init_sec_context() would have returned
|
|
GSS_COMPLETE status. The client sends the output_token to the server.
|
|
|
|
The server passes the received token as the input_token parameter to
|
|
GSS_Accept_sec_context(). GSS_Accept_sec_context indicates
|
|
GSS_COMPLETE status, provides the client's authenticated identity in
|
|
the src_name result, and provides an output_token to be passed to the
|
|
client. The server sends the output_token to the client.
|
|
|
|
The client passes the received token as the input_token parameter to
|
|
a successor call to GSS_Init_sec_context(), which processes data
|
|
|
|
|
|
|
|
Linn [Page 3]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
included in the token in order to achieve mutual authentication from
|
|
the client's viewpoint. This call to GSS_Init_sec_context() returns
|
|
GSS_COMPLETE status, indicating successful mutual authentication and
|
|
the completion of context establishment for this example.
|
|
|
|
The client generates a data message and passes it to GSS_Seal().
|
|
GSS_Seal() performs data origin authentication, data integrity, and
|
|
(optionally) confidentiality processing on the message and
|
|
encapsulates the result into output_message, indicating GSS_COMPLETE
|
|
status. The client sends the output_message to the server.
|
|
|
|
The server passes the received message to GSS_Unseal(). GSS_Unseal
|
|
inverts the encapsulation performed by GSS_Seal(), deciphers the
|
|
message if the optional confidentiality feature was applied, and
|
|
validates the data origin authentication and data integrity checking
|
|
quantities. GSS_Unseal() indicates successful validation by
|
|
returning GSS_COMPLETE status along with the resultant
|
|
output_message.
|
|
|
|
For purposes of this example, we assume that the server knows by
|
|
out-of-band means that this context will have no further use after
|
|
one protected message is transferred from client to server. Given
|
|
this premise, the server now calls GSS_Delete_sec_context() to flush
|
|
context-level information. GSS_Delete_sec_context() returns a
|
|
context_token for the server to pass to the client.
|
|
|
|
The client passes the returned context_token to
|
|
GSS_Process_context_token(), which returns GSS_COMPLETE status after
|
|
deleting context-level information at the client system.
|
|
|
|
The GSS-API design assumes and addresses several basic goals,
|
|
including:
|
|
|
|
Mechanism independence: The GSS-API defines an interface to
|
|
cryptographically implemented strong authentication and other
|
|
security services at a generic level which is independent of
|
|
particular underlying mechanisms. For example, GSS-API-provided
|
|
services can be implemented by secret-key technologies (e.g.,
|
|
Kerberos) or public-key approaches (e.g., X.509).
|
|
|
|
Protocol environment independence: The GSS-API is independent of
|
|
the communications protocol suites with which it is employed,
|
|
permitting use in a broad range of protocol environments. In
|
|
appropriate environments, an intermediate implementation "veneer"
|
|
which is oriented to a particular communication protocol (e.g.,
|
|
Remote Procedure Call (RPC)) may be interposed between
|
|
applications which call that protocol and the GSS-API, thereby
|
|
invoking GSS-API facilities in conjunction with that protocol's
|
|
|
|
|
|
|
|
Linn [Page 4]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
communications invocations.
|
|
|
|
Protocol association independence: The GSS-API's security context
|
|
construct is independent of communications protocol association
|
|
constructs. This characteristic allows a single GSS-API
|
|
implementation to be utilized by a variety of invoking protocol
|
|
modules on behalf of those modules' calling applications. GSS-API
|
|
services can also be invoked directly by applications, wholly
|
|
independent of protocol associations.
|
|
|
|
Suitability to a range of implementation placements: GSS-API
|
|
clients are not constrained to reside within any Trusted Computing
|
|
Base (TCB) perimeter defined on a system where the GSS-API is
|
|
implemented; security services are specified in a manner suitable
|
|
to both intra-TCB and extra-TCB callers.
|
|
|
|
1.1. GSS-API Constructs
|
|
|
|
This section describes the basic elements comprising the GSS-API.
|
|
|
|
1.1.1. Credentials
|
|
|
|
Credentials structures provide the prerequisites enabling peers to
|
|
establish security contexts with each other. A caller may designate
|
|
that its default credential be used for context establishment calls
|
|
without presenting an explicit handle to that credential.
|
|
Alternately, those GSS-API callers which need to make explicit
|
|
selection of particular credentials structures may make references to
|
|
those credentials through GSS-API-provided credential handles
|
|
("cred_handles").
|
|
|
|
A single credential structure may be used for initiation of outbound
|
|
contexts and acceptance of inbound contexts. Callers needing to
|
|
operate in only one of these modes may designate this fact when
|
|
credentials are acquired for use, allowing underlying mechanisms to
|
|
optimize their processing and storage requirements. The credential
|
|
elements defined by a particular mechanism may contain multiple
|
|
cryptographic keys, e.g., to enable authentication and message
|
|
encryption to be performed with different algorithms.
|
|
|
|
A single credential structure may accommodate credential information
|
|
associated with multiple underlying mechanisms (mech_types); a
|
|
credential structure's contents will vary depending on the set of
|
|
mech_types supported by a particular GSS-API implementation.
|
|
Commonly, a single mech_type will be used for all security contexts
|
|
established by a particular initiator to a particular target; the
|
|
primary motivation for supporting credential sets representing
|
|
multiple mech_types is to allow initiators on systems which are
|
|
|
|
|
|
|
|
Linn [Page 5]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
equipped to handle multiple types to initiate contexts to targets on
|
|
other systems which can accommodate only a subset of the set
|
|
supported at the initiator's system.
|
|
|
|
It is the responsibility of underlying system-specific mechanisms and
|
|
OS functions below the GSS-API to ensure that the ability to acquire
|
|
and use credentials associated with a given identity is constrained
|
|
to appropriate processes within a system. This responsibility should
|
|
be taken seriously by implementors, as the ability for an entity to
|
|
utilize a principal's credentials is equivalent to the entity's
|
|
ability to successfully assert that principal's identity.
|
|
|
|
Once a set of GSS-API credentials is established, the transferability
|
|
of that credentials set to other processes or analogous constructs
|
|
within a system is a local matter, not defined by the GSS-API. An
|
|
example local policy would be one in which any credentials received
|
|
as a result of login to a given user account, or of delegation of
|
|
rights to that account, are accessible by, or transferable to,
|
|
processes running under that account.
|
|
|
|
The credential establishment process (particularly when performed on
|
|
behalf of users rather than server processes) is likely to require
|
|
access to passwords or other quantities which should be protected
|
|
locally and exposed for the shortest time possible. As a result, it
|
|
will often be appropriate for preliminary credential establishment to
|
|
be performed through local means at user login time, with the
|
|
result(s) cached for subsequent reference. These preliminary
|
|
credentials would be set aside (in a system-specific fashion) for
|
|
subsequent use, either:
|
|
|
|
to be accessed by an invocation of the GSS-API GSS_Acquire_cred()
|
|
call, returning an explicit handle to reference that credential
|
|
|
|
as the default credentials installed on behalf of a process
|
|
|
|
1.1.2. Tokens
|
|
|
|
Tokens are data elements transferred between GSS-API callers, and are
|
|
divided into two classes. Context-level tokens are exchanged in order
|
|
to establish and manage a security context between peers. Per-message
|
|
tokens are exchanged in conjunction with an established context to
|
|
provide protective security services for corresponding data messages.
|
|
The internal contents of both classes of tokens are specific to the
|
|
particular underlying mechanism used to support the GSS-API; Appendix
|
|
B of this document provides a uniform recommendation for designers of
|
|
GSS-API support mechanisms, encapsulating mechanism-specific
|
|
information along with a globally-interpretable mechanism identifier.
|
|
|
|
|
|
|
|
|
|
Linn [Page 6]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
Tokens are opaque from the viewpoint of GSS-API callers. They are
|
|
generated within the GSS-API implementation at an end system,
|
|
provided to a GSS-API caller to be transferred to the peer GSS-API
|
|
caller at a remote end system, and processed by the GSS-API
|
|
implementation at that remote end system. Tokens may be output by
|
|
GSS-API primitives (and are to be transferred to GSS-API peers)
|
|
independent of the status indications which those primitives
|
|
indicate. Token transfer may take place in an in-band manner,
|
|
integrated into the same protocol stream used by the GSS-API callers
|
|
for other data transfers, or in an out-of-band manner across a
|
|
logically separate channel.
|
|
|
|
Development of GSS-API support primitives based on a particular
|
|
underlying cryptographic technique and protocol does not necessarily
|
|
imply that GSS-API callers invoking that GSS-API mechanism type will
|
|
be able to interoperate with peers invoking the same technique and
|
|
protocol outside the GSS-API paradigm. For example, the format of
|
|
GSS-API tokens defined in conjunction with a particular mechanism,
|
|
and the techniques used to integrate those tokens into callers'
|
|
protocols, may not be the same as those used by non-GSS-API callers
|
|
of the same underlying technique.
|
|
|
|
1.1.3. Security Contexts
|
|
|
|
Security contexts are established between peers, using credentials
|
|
established locally in conjunction with each peer or received by
|
|
peers via delegation. Multiple contexts may exist simultaneously
|
|
between a pair of peers, using the same or different sets of
|
|
credentials. Coexistence of multiple contexts using different
|
|
credentials allows graceful rollover when credentials expire.
|
|
Distinction among multiple contexts based on the same credentials
|
|
serves applications by distinguishing different message streams in a
|
|
security sense.
|
|
|
|
The GSS-API is independent of underlying protocols and addressing
|
|
structure, and depends on its callers to transport GSS-API-provided
|
|
data elements. As a result of these factors, it is a caller
|
|
responsibility to parse communicated messages, separating GSS-API-
|
|
related data elements from caller-provided data. The GSS-API is
|
|
independent of connection vs. connectionless orientation of the
|
|
underlying communications service.
|
|
|
|
No correlation between security context and communications protocol
|
|
association is dictated. (The optional channel binding facility,
|
|
discussed in Section 1.1.6 of this document, represents an
|
|
intentional exception to this rule, supporting additional protection
|
|
features within GSS-API supporting mechanisms.) This separation
|
|
allows the GSS-API to be used in a wide range of communications
|
|
|
|
|
|
|
|
Linn [Page 7]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
environments, and also simplifies the calling sequences of the
|
|
individual calls. In many cases (depending on underlying security
|
|
protocol, associated mechanism, and availability of cached
|
|
information), the state information required for context setup can be
|
|
sent concurrently with initial signed user data, without interposing
|
|
additional message exchanges.
|
|
|
|
1.1.4. Mechanism Types
|
|
|
|
In order to successfully establish a security context with a target
|
|
peer, it is necessary to identify an appropriate underlying mechanism
|
|
type (mech_type) which both initiator and target peers support. The
|
|
definition of a mechanism embodies not only the use of a particular
|
|
cryptographic technology (or a hybrid or choice among alternative
|
|
cryptographic technologies), but also definition of the syntax and
|
|
semantics of data element exchanges which that mechanism will employ
|
|
in order to support security services.
|
|
|
|
It is recommended that callers initiating contexts specify the
|
|
"default" mech_type value, allowing system-specific functions within
|
|
or invoked by the GSS-API implementation to select the appropriate
|
|
mech_type, but callers may direct that a particular mech_type be
|
|
employed when necessary.
|
|
|
|
The means for identifying a shared mech_type to establish a security
|
|
context with a peer will vary in different environments and
|
|
circumstances; examples include (but are not limited to):
|
|
|
|
use of a fixed mech_type, defined by configuration, within an
|
|
environment
|
|
|
|
syntactic convention on a target-specific basis, through
|
|
examination of a target's name
|
|
|
|
lookup of a target's name in a naming service or other database in
|
|
order to identify mech_types supported by that target
|
|
|
|
explicit negotiation between GSS-API callers in advance of
|
|
security context setup
|
|
|
|
When transferred between GSS-API peers, mech_type specifiers (per
|
|
Appendix B, represented as Object Identifiers (OIDs)) serve to
|
|
qualify the interpretation of associated tokens. (The structure and
|
|
encoding of Object Identifiers is defined in ISO/IEC 8824,
|
|
"Specification of Abstract Syntax Notation One (ASN.1)" and in
|
|
ISO/IEC 8825, "Specification of Basic Encoding Rules for Abstract
|
|
Syntax Notation One (ASN.1)".) Use of hierarchically structured OIDs
|
|
serves to preclude ambiguous interpretation of mech_type specifiers.
|
|
|
|
|
|
|
|
Linn [Page 8]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
The OID representing the DASS MechType, for example, is
|
|
1.3.12.2.1011.7.5.
|
|
|
|
1.1.5. Naming
|
|
|
|
The GSS-API avoids prescription of naming structures, treating the
|
|
names transferred across the interface in order to initiate and
|
|
accept security contexts as opaque octet string quantities. This
|
|
approach supports the GSS-API's goal of implementability atop a range
|
|
of underlying security mechanisms, recognizing the fact that
|
|
different mechanisms process and authenticate names which are
|
|
presented in different forms. Generalized services offering
|
|
translation functions among arbitrary sets of naming environments are
|
|
outside the scope of the GSS-API; availability and use of local
|
|
conversion functions to translate among the naming formats supported
|
|
within a given end system is anticipated.
|
|
|
|
Two distinct classes of name representations are used in conjunction
|
|
with different GSS-API parameters:
|
|
|
|
a printable form (denoted by OCTET STRING), for acceptance from
|
|
and presentation to users; printable name forms are accompanied by
|
|
OID tags identifying the namespace to which they correspond
|
|
|
|
an internal form (denoted by INTERNAL NAME), opaque to callers and
|
|
defined by individual GSS-API implementations; GSS-API
|
|
implementations supporting multiple namespace types are
|
|
responsible for maintaining internal tags to disambiguate the
|
|
interpretation of particular names
|
|
|
|
Tagging of printable names allows GSS-API callers and underlying
|
|
GSS-API mechanisms to disambiguate name types and to determine
|
|
whether an associated name's type is one which they are capable of
|
|
processing, avoiding aliasing problems which could result from
|
|
misinterpreting a name of one type as a name of another type.
|
|
|
|
In addition to providing means for names to be tagged with types,
|
|
this specification defines primitives to support a level of naming
|
|
environment independence for certain calling applications. To provide
|
|
basic services oriented towards the requirements of callers which
|
|
need not themselves interpret the internal syntax and semantics of
|
|
names, GSS-API calls for name comparison (GSS_Compare_name()),
|
|
human-readable display (GSS_Display_name()), input conversion
|
|
(GSS_Import_name()), and internal name deallocation
|
|
(GSS_Release_name()) functions are defined. (It is anticipated that
|
|
these proposed GSS-API calls will be implemented in many end systems
|
|
based on system-specific name manipulation primitives already extant
|
|
within those end systems; inclusion within the GSS-API is intended to
|
|
|
|
|
|
|
|
Linn [Page 9]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
offer GSS-API callers a portable means to perform specific
|
|
operations, supportive of authorization and audit requirements, on
|
|
authenticated names.)
|
|
|
|
GSS_Import_name() implementations can, where appropriate, support
|
|
more than one printable syntax corresponding to a given namespace
|
|
(e.g., alternative printable representations for X.500 Distinguished
|
|
Names), allowing flexibility for their callers to select among
|
|
alternative representations. GSS_Display_name() implementations
|
|
output a printable syntax selected as appropriate to their
|
|
operational environments; this selection is a local matter. Callers
|
|
desiring portability across alternative printable syntaxes should
|
|
refrain from implementing comparisons based on printable name forms
|
|
and should instead use the GSS_Compare_name() call to determine
|
|
whether or not one internal-format name matches another.
|
|
|
|
1.1.6. Channel Bindings
|
|
|
|
The GSS-API accommodates the concept of caller-provided channel
|
|
binding ("chan_binding") information, used by GSS-API callers to bind
|
|
the establishment of a security context to relevant characteristics
|
|
(e.g., addresses, transformed representations of encryption keys) of
|
|
the underlying communications channel and of protection mechanisms
|
|
applied to that communications channel. Verification by one peer of
|
|
chan_binding information provided by the other peer to a context
|
|
serves to protect against various active attacks. The caller
|
|
initiating a security context must determine the chan_binding values
|
|
before making the GSS_Init_sec_context() call, and consistent values
|
|
must be provided by both peers to a context. Callers should not
|
|
assume that underlying mechanisms provide confidentiality protection
|
|
for channel binding information.
|
|
|
|
Use or non-use of the GSS-API channel binding facility is a caller
|
|
option, and GSS-API supporting mechanisms can support operation in an
|
|
environment where NULL channel bindings are presented. When non-NULL
|
|
channel bindings are used, certain mechanisms will offer enhanced
|
|
security value by interpreting the bindings' content (rather than
|
|
simply representing those bindings, or signatures computed on them,
|
|
within tokens) and will therefore depend on presentation of specific
|
|
data in a defined format. To this end, agreements among mechanism
|
|
implementors are defining conventional interpretations for the
|
|
contents of channel binding arguments, including address specifiers
|
|
(with content dependent on communications protocol environment) for
|
|
context initiators and acceptors. (These conventions are being
|
|
incorporated into related documents.) In order for GSS-API callers to
|
|
be portable across multiple mechanisms and achieve the full security
|
|
functionality available from each mechanism, it is strongly
|
|
recommended that GSS-API callers provide channel bindings consistent
|
|
|
|
|
|
|
|
Linn [Page 10]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
with these conventions and those of the networking environment in
|
|
which they operate.
|
|
|
|
1.2. GSS-API Features and Issues
|
|
|
|
This section describes aspects of GSS-API operations, of the security
|
|
services which the GSS-API provides, and provides commentary on
|
|
design issues.
|
|
|
|
1.2.1. Status Reporting
|
|
|
|
Each GSS-API call provides two status return values. Major_status
|
|
values provide a mechanism-independent indication of call status
|
|
(e.g., GSS_COMPLETE, GSS_FAILURE, GSS_CONTINUE_NEEDED), sufficient to
|
|
drive normal control flow within the caller in a generic fashion.
|
|
Table 1 summarizes the defined major_status return codes in tabular
|
|
fashion.
|
|
|
|
Table 1: GSS-API Major Status Codes
|
|
|
|
FATAL ERROR CODES
|
|
|
|
GSS_BAD_BINDINGS channel binding mismatch
|
|
GSS_BAD_MECH unsupported mechanism requested
|
|
GSS_BAD_NAME invalid name provided
|
|
GSS_BAD_NAMETYPE name of unsupported type provided
|
|
GSS_BAD_STATUS invalid input status selector
|
|
GSS_BAD_SIG token had invalid signature
|
|
GSS_CONTEXT_EXPIRED specified security context expired
|
|
GSS_CREDENTIALS_EXPIRED expired credentials detected
|
|
GSS_DEFECTIVE_CREDENTIAL defective credential detected
|
|
GSS_DEFECTIVE_TOKEN defective token detected
|
|
GSS_FAILURE failure, unspecified at GSS-API
|
|
level
|
|
GSS_NO_CONTEXT no valid security context specified
|
|
GSS_NO_CRED no valid credentials provided
|
|
|
|
INFORMATORY STATUS CODES
|
|
|
|
GSS_COMPLETE normal completion
|
|
GSS_CONTINUE_NEEDED continuation call to routine
|
|
required
|
|
GSS_DUPLICATE_TOKEN duplicate per-message token
|
|
detected
|
|
GSS_OLD_TOKEN timed-out per-message token
|
|
detected
|
|
GSS_UNSEQ_TOKEN out-of-order per-message token
|
|
detected
|
|
|
|
|
|
|
|
Linn [Page 11]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
Minor_status provides more detailed status information which may
|
|
include status codes specific to the underlying security mechanism.
|
|
Minor_status values are not specified in this document.
|
|
|
|
GSS_CONTINUE_NEEDED major_status returns, and optional message
|
|
outputs, are provided in GSS_Init_sec_context() and
|
|
GSS_Accept_sec_context() calls so that different mechanisms'
|
|
employment of different numbers of messages within their
|
|
authentication sequences need not be reflected in separate code paths
|
|
within calling applications. Instead, such cases are accomodated with
|
|
sequences of continuation calls to GSS_Init_sec_context() and
|
|
GSS_Accept_sec_context(). The same mechanism is used to encapsulate
|
|
mutual authentication within the GSS-API's context initiation calls.
|
|
|
|
For mech_types which require interactions with third-party servers in
|
|
order to establish a security context, GSS-API context establishment
|
|
calls may block pending completion of such third-party interactions.
|
|
On the other hand, no GSS-API calls pend on serialized interactions
|
|
with GSS-API peer entities. As a result, local GSS-API status
|
|
returns cannot reflect unpredictable or asynchronous exceptions
|
|
occurring at remote peers, and reflection of such status information
|
|
is a caller responsibility outside the GSS-API.
|
|
|
|
1.2.2. Per-Message Security Service Availability
|
|
|
|
When a context is established, two flags are returned to indicate the
|
|
set of per-message protection security services which will be
|
|
available on the context:
|
|
|
|
the integ_avail flag indicates whether per-message integrity and
|
|
data origin authentication services are available
|
|
|
|
the conf_avail flag indicates whether per-message confidentiality
|
|
services are available, and will never be returned TRUE unless the
|
|
integ_avail flag is also returned TRUE
|
|
|
|
GSS-API callers desiring per-message security services should
|
|
check the values of these flags at context establishment time, and
|
|
must be aware that a returned FALSE value for integ_avail means
|
|
that invocation of GSS_Sign() or GSS_Seal() primitives on the
|
|
associated context will apply no cryptographic protection to user
|
|
data messages.
|
|
|
|
The GSS-API per-message protection service primitives, as the
|
|
category name implies, are oriented to operation at the granularity
|
|
of protocol data units. They perform cryptographic operations on the
|
|
data units, transfer cryptographic control information in tokens,
|
|
and, in the case of GSS_Seal(), encapsulate the protected data unit.
|
|
|
|
|
|
|
|
Linn [Page 12]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
As such, these primitives are not oriented to efficient data
|
|
protection for stream-paradigm protocols (e.g., Telnet) if
|
|
cryptography must be applied on an octet-by-octet basis.
|
|
|
|
1.2.3. Per-Message Replay Detection and Sequencing
|
|
|
|
Certain underlying mech_types are expected to offer support for
|
|
replay detection and/or sequencing of messages transferred on the
|
|
contexts they support. These optionally-selectable protection
|
|
features are distinct from replay detection and sequencing features
|
|
applied to the context establishment operation itself; the presence
|
|
or absence of context-level replay or sequencing features is wholly a
|
|
function of the underlying mech_type's capabilities, and is not
|
|
selected or omitted as a caller option.
|
|
|
|
The caller initiating a context provides flags (replay_det_req_flag
|
|
and sequence_req_flag) to specify whether the use of per-message
|
|
replay detection and sequencing features is desired on the context
|
|
being established. The GSS-API implementation at the initiator system
|
|
can determine whether these features are supported (and whether they
|
|
are optionally selectable) as a function of mech_type, without need
|
|
for bilateral negotiation with the target. When enabled, these
|
|
features provide recipients with indicators as a result of GSS-API
|
|
processing of incoming messages, identifying whether those messages
|
|
were detected as duplicates or out-of-sequence. Detection of such
|
|
events does not prevent a suspect message from being provided to a
|
|
recipient; the appropriate course of action on a suspect message is a
|
|
matter of caller policy.
|
|
|
|
The semantics of the replay detection and sequencing services applied
|
|
to received messages, as visible across the interface which the GSS-
|
|
API provides to its clients, are as follows:
|
|
|
|
When replay_det_state is TRUE, the possible major_status returns for
|
|
well-formed and correctly signed messages are as follows:
|
|
|
|
1. GSS_COMPLETE indicates that the message was within the window
|
|
(of time or sequence space) allowing replay events to be detected,
|
|
and that the message was not a replay of a previously-processed
|
|
message within that window.
|
|
|
|
2. GSS_DUPLICATE_TOKEN indicates that the signature on the
|
|
received message was correct, but that the message was recognized
|
|
as a duplicate of a previously-processed message.
|
|
|
|
3. GSS_OLD_TOKEN indicates that the signature on the received
|
|
message was correct, but that the message is too old to be checked
|
|
for duplication.
|
|
|
|
|
|
|
|
Linn [Page 13]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
When sequence_state is TRUE, the possible major_status returns for
|
|
well-formed and correctly signed messages are as follows:
|
|
|
|
1. GSS_COMPLETE indicates that the message was within the window
|
|
(of time or sequence space) allowing replay events to be detected,
|
|
and that the message was not a replay of a previously-processed
|
|
message within that window.
|
|
|
|
2. GSS_DUPLICATE_TOKEN indicates that the signature on the
|
|
received message was correct, but that the message was recognized
|
|
as a duplicate of a previously-processed message.
|
|
|
|
3. GSS_OLD_TOKEN indicates that the signature on the received
|
|
message was correct, but that the token is too old to be checked
|
|
for duplication.
|
|
|
|
4. GSS_UNSEQ_TOKEN indicates that the signature on the received
|
|
message was correct, but that it is earlier in a sequenced stream
|
|
than a message already processed on the context. [Note:
|
|
Mechanisms can be architected to provide a stricter form of
|
|
sequencing service, delivering particular messages to recipients
|
|
only after all predecessor messages in an ordered stream have been
|
|
delivered. This type of support is incompatible with the GSS-API
|
|
paradigm in which recipients receive all messages, whether in
|
|
order or not, and provide them (one at a time, without intra-GSS-
|
|
API message buffering) to GSS-API routines for validation. GSS-
|
|
API facilities provide supportive functions, aiding clients to
|
|
achieve strict message stream integrity in an efficient manner in
|
|
conjunction with sequencing provisions in communications
|
|
protocols, but the GSS-API does not offer this level of message
|
|
stream integrity service by itself.]
|
|
|
|
As the message stream integrity features (especially sequencing) may
|
|
interfere with certain applications' intended communications
|
|
paradigms, and since support for such features is likely to be
|
|
resource intensive, it is highly recommended that mech_types
|
|
supporting these features allow them to be activated selectively on
|
|
initiator request when a context is established. A context initiator
|
|
and target are provided with corresponding indicators
|
|
(replay_det_state and sequence_state), signifying whether these
|
|
features are active on a given context.
|
|
|
|
An example mech_type supporting per-message replay detection could
|
|
(when replay_det_state is TRUE) implement the feature as follows: The
|
|
underlying mechanism would insert timestamps in data elements output
|
|
by GSS_Sign() and GSS_Seal(), and would maintain (within a time-
|
|
limited window) a cache (qualified by originator-recipient pair)
|
|
identifying received data elements processed by GSS_Verify() and
|
|
|
|
|
|
|
|
Linn [Page 14]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
GSS_Unseal(). When this feature is active, exception status returns
|
|
(GSS_DUPLICATE_TOKEN, GSS_ OLD_TOKEN) will be provided when
|
|
GSS_Verify() or GSS_Unseal() is presented with a message which is
|
|
either a detected duplicate of a prior message or which is too old to
|
|
validate against a cache of recently received messages.
|
|
|
|
1.2.4. Quality of Protection
|
|
|
|
Some mech_types will provide their users with fine granularity
|
|
control over the means used to provide per-message protection,
|
|
allowing callers to trade off security processing overhead
|
|
dynamically against the protection requirements of particular
|
|
messages. A per-message quality-of-protection parameter (analogous to
|
|
quality-of-service, or QOS) selects among different QOP options
|
|
supported by that mechanism. On context establishment for a multi-QOP
|
|
mech_type, context-level data provides the prerequisite data for a
|
|
range of protection qualities.
|
|
|
|
It is expected that the majority of callers will not wish to exert
|
|
explicit mechanism-specific QOP control and will therefore request
|
|
selection of a default QOP. Definitions of, and choices among, non-
|
|
default QOP values are mechanism-specific, and no ordered sequences
|
|
of QOP values can be assumed equivalent across different mechanisms.
|
|
Meaningful use of non-default QOP values demands that callers be
|
|
familiar with the QOP definitions of an underlying mechanism or
|
|
mechanisms, and is therefore a non-portable construct.
|
|
|
|
2. Interface Descriptions
|
|
|
|
This section describes the GSS-API's service interface, dividing the
|
|
set of calls offered into four groups. Credential management calls
|
|
are related to the acquisition and release of credentials by
|
|
principals. Context-level calls are related to the management of
|
|
security contexts between principals. Per-message calls are related
|
|
to the protection of individual messages on established security
|
|
contexts. Support calls provide ancillary functions useful to GSS-API
|
|
callers. Table 2 groups and summarizes the calls in tabular fashion.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Linn [Page 15]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
Table 2: GSS-API Calls
|
|
|
|
CREDENTIAL MANAGEMENT
|
|
|
|
GSS_Acquire_cred acquire credentials for use
|
|
GSS_Release_cred release credentials after use
|
|
GSS_Inquire_cred display information about
|
|
credentials
|
|
|
|
CONTEXT-LEVEL CALLS
|
|
|
|
GSS_Init_sec_context initiate outbound security context
|
|
GSS_Accept_sec_context accept inbound security context
|
|
GSS_Delete_sec_context flush context when no longer needed
|
|
GSS_Process_context_token process received control token on
|
|
context
|
|
GSS_Context_time indicate validity time remaining on
|
|
context
|
|
|
|
PER-MESSAGE CALLS
|
|
|
|
GSS_Sign apply signature, receive as token
|
|
separate from message
|
|
GSS_Verify validate signature token along with
|
|
message
|
|
GSS_Seal sign, optionally encrypt,
|
|
encapsulate
|
|
GSS_Unseal decapsulate, decrypt if needed,
|
|
validate signature
|
|
|
|
SUPPORT CALLS
|
|
|
|
GSS_Display_status translate status codes to printable
|
|
form
|
|
GSS_Indicate_mechs indicate mech_types supported on
|
|
local system
|
|
GSS_Compare_name compare two names for equality
|
|
GSS_Display_name translate name to printable form
|
|
GSS_Import_name convert printable name to
|
|
normalized form
|
|
GSS_Release_name free storage of normalized-form
|
|
name
|
|
GSS_Release_buffer free storage of printable name
|
|
GSS_Release_oid_set free storage of OID set object
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Linn [Page 16]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
2.1. Credential management calls
|
|
|
|
These GSS-API calls provide functions related to the management of
|
|
credentials. Their characterization with regard to whether or not
|
|
they may block pending exchanges with other network entities (e.g.,
|
|
directories or authentication servers) depends in part on OS-specific
|
|
(extra-GSS-API) issues, so is not specified in this document.
|
|
|
|
The GSS_Acquire_cred() call is defined within the GSS-API in support
|
|
of application portability, with a particular orientation towards
|
|
support of portable server applications. It is recognized that (for
|
|
certain systems and mechanisms) credentials for interactive users may
|
|
be managed differently from credentials for server processes; in such
|
|
environments, it is the GSS-API implementation's responsibility to
|
|
distinguish these cases and the procedures for making this
|
|
distinction are a local matter. The GSS_Release_cred() call provides
|
|
a means for callers to indicate to the GSS-API that use of a
|
|
credentials structure is no longer required. The GSS_Inquire_cred()
|
|
call allows callers to determine information about a credentials
|
|
structure.
|
|
|
|
2.1.1. GSS_Acquire_cred call
|
|
|
|
Inputs:
|
|
|
|
o desired_name INTERNAL NAME, -NULL requests locally-determined
|
|
default
|
|
|
|
o lifetime_req INTEGER,-in seconds; 0 requests default
|
|
|
|
o desired_mechs SET OF OBJECT IDENTIFIER,-empty set requests
|
|
system-selected default
|
|
|
|
o cred_usage INTEGER-0=INITIATE-AND-ACCEPT, 1=INITIATE-ONLY,
|
|
2=ACCEPT-ONLY
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o output_cred_handle OCTET STRING,
|
|
|
|
o actual_mechs SET OF OBJECT IDENTIFIER,
|
|
|
|
o lifetime_rec INTEGER -in seconds, or reserved value for
|
|
INDEFINITE
|
|
|
|
|
|
|
|
Linn [Page 17]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that requested credentials were
|
|
successfully established, for the duration indicated in
|
|
lifetime_rec, suitable for the usage requested in cred_usage, for
|
|
the set of mech_types indicated in actual_mechs, and that those
|
|
credentials can be referenced for subsequent use with the handle
|
|
returned in output_cred_handle.
|
|
|
|
o GSS_BAD_MECH indicates that a mech_type unsupported by the GSS-API
|
|
implementation type was requested, causing the credential
|
|
establishment operation to fail.
|
|
|
|
o GSS_BAD_NAMETYPE indicates that the provided desired_name is
|
|
uninterpretable or of a type unsupported by the supporting GSS-API
|
|
implementation, so no credentials could be established for the
|
|
accompanying desired_name.
|
|
|
|
o GSS_BAD_NAME indicates that the provided desired_name is
|
|
inconsistent in terms of internally-incorporated type specifier
|
|
information, so no credentials could be established for the
|
|
accompanying desired_name.
|
|
|
|
o GSS_FAILURE indicates that credential establishment failed for
|
|
reasons unspecified at the GSS-API level, including lack of
|
|
authorization to establish and use credentials associated with the
|
|
identity named in the input desired_name argument.
|
|
|
|
GSS_Acquire_cred() is used to acquire credentials so that a
|
|
principal can (as a function of the input cred_usage parameter)
|
|
initiate and/or accept security contexts under the identity
|
|
represented by the desired_name input argument. On successful
|
|
completion, the returned output_cred_handle result provides a handle
|
|
for subsequent references to the acquired credentials. Typically,
|
|
single-user client processes using only default credentials for
|
|
context establishment purposes will have no need to invoke this call.
|
|
|
|
A caller may provide the value NULL for desired_name, signifying a
|
|
request for credentials corresponding to a default principal
|
|
identity. The procedures used by GSS-API implementations to select
|
|
the appropriate principal identity in response to this form of
|
|
request are local matters. It is possible that multiple pre-
|
|
established credentials may exist for the same principal identity
|
|
(for example, as a result of multiple user login sessions) when
|
|
GSS_Acquire_cred() is called; the means used in such cases to select
|
|
a specific credential are local matters. The input lifetime_req
|
|
argument to GSS_Acquire_cred() may provide useful information for
|
|
local GSS-API implementations to employ in making this disambiguation
|
|
|
|
|
|
|
|
Linn [Page 18]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
in a manner which will best satisfy a caller's intent.
|
|
|
|
The lifetime_rec result indicates the length of time for which the
|
|
acquired credentials will be valid, as an offset from the present. A
|
|
mechanism may return a reserved value indicating INDEFINITE if no
|
|
constraints on credential lifetime are imposed. A caller of
|
|
GSS_Acquire_cred() can request a length of time for which acquired
|
|
credentials are to be valid (lifetime_req argument), beginning at the
|
|
present, or can request credentials with a default validity interval.
|
|
(Requests for postdated credentials are not supported within the
|
|
GSS-API.) Certain mechanisms and implementations may bind in
|
|
credential validity period specifiers at a point preliminary to
|
|
invocation of the GSS_Acquire_cred() call (e.g., in conjunction with
|
|
user login procedures). As a result, callers requesting non-default
|
|
values for lifetime_req must recognize that such requests cannot
|
|
always be honored and must be prepared to accommodate the use of
|
|
returned credentials with different lifetimes as indicated in
|
|
lifetime_rec.
|
|
|
|
The caller of GSS_Acquire_cred() can explicitly specify a set of
|
|
mech_types which are to be accommodated in the returned credentials
|
|
(desired_mechs argument), or can request credentials for a system-
|
|
defined default set of mech_types. Selection of the system-specified
|
|
default set is recommended in the interests of application
|
|
portability. The actual_mechs return value may be interrogated by the
|
|
caller to determine the set of mechanisms with which the returned
|
|
credentials may be used.
|
|
|
|
2.1.2. GSS_Release_cred call
|
|
|
|
Input:
|
|
|
|
o cred_handle OCTET STRING-NULL specifies default credentials
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that the credentials referenced by the
|
|
input cred_handle were released for purposes of subsequent access
|
|
by the caller. The effect on other processes which may be
|
|
authorized shared access to such credentials is a local matter.
|
|
|
|
|
|
|
|
|
|
|
|
Linn [Page 19]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o GSS_NO_CRED indicates that no release operation was performed,
|
|
either because the input cred_handle was invalid or because the
|
|
caller lacks authorization to access the referenced credentials.
|
|
|
|
o GSS_FAILURE indicates that the release operation failed for
|
|
reasons unspecified at the GSS-API level.
|
|
|
|
Provides a means for a caller to explicitly request that credentials
|
|
be released when their use is no longer required. Note that system-
|
|
specific credential management functions are also likely to exist,
|
|
for example to assure that credentials shared among processes are
|
|
properly deleted when all affected processes terminate, even if no
|
|
explicit release requests are issued by those processes. Given the
|
|
fact that multiple callers are not precluded from gaining authorized
|
|
access to the same credentials, invocation of GSS_Release_cred()
|
|
cannot be assumed to delete a particular set of credentials on a
|
|
system-wide basis.
|
|
|
|
2.1.3. GSS_Inquire_cred call
|
|
|
|
Input:
|
|
|
|
o cred_handle OCTET STRING -NULL specifies default credentials
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o cred_name INTERNAL NAME,
|
|
|
|
o lifetime_rec INTEGER -in seconds, or reserved value for
|
|
INDEFINITE
|
|
|
|
o cred_usage INTEGER, -0=INITIATE-AND-ACCEPT, 1=INITIATE-ONLY,
|
|
2=ACCEPT-ONLY
|
|
|
|
o mech_set SET OF OBJECT IDENTIFIER
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that the credentials referenced by the
|
|
input cred_handle argument were valid, and that the output
|
|
cred_name, lifetime_rec, and cred_usage values represent,
|
|
respectively, the credentials' associated principal name,
|
|
remaining lifetime, suitable usage modes, and supported
|
|
mechanism types.
|
|
|
|
|
|
|
|
Linn [Page 20]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o GSS_NO_CRED indicates that no information could be returned
|
|
about the referenced credentials, either because the input
|
|
cred_handle was invalid or because the caller lacks
|
|
authorization to access the referenced credentials.
|
|
|
|
o GSS_FAILURE indicates that the release operation failed for
|
|
reasons unspecified at the GSS-API level.
|
|
|
|
The GSS_Inquire_cred() call is defined primarily for the use of
|
|
those callers which make use of default credentials rather than
|
|
acquiring credentials explicitly with GSS_Acquire_cred(). It enables
|
|
callers to determine a credential structure's associated principal
|
|
name, remaining validity period, usability for security context
|
|
initiation and/or acceptance, and supported mechanisms.
|
|
|
|
2.2. Context-level calls
|
|
|
|
This group of calls is devoted to the establishment and management of
|
|
security contexts between peers. A context's initiator calls
|
|
GSS_Init_sec_context(), resulting in generation of a token which the
|
|
caller passes to the target. At the target, that token is passed to
|
|
GSS_Accept_sec_context(). Depending on the underlying mech_type and
|
|
specified options, additional token exchanges may be performed in the
|
|
course of context establishment; such exchanges are accommodated by
|
|
GSS_CONTINUE_NEEDED status returns from GSS_Init_sec_context() and
|
|
GSS_Accept_sec_context(). Either party to an established context may
|
|
invoke GSS_Delete_sec_context() to flush context information when a
|
|
context is no longer required. GSS_Process_context_token() is used
|
|
to process received tokens carrying context-level control
|
|
information. GSS_Context_time() allows a caller to determine the
|
|
length of time for which an established context will remain valid.
|
|
|
|
2.2.1. GSS_Init_sec_context call
|
|
|
|
Inputs:
|
|
|
|
o claimant_cred_handle OCTET STRING, -NULL specifies "use
|
|
default"
|
|
|
|
o input_context_handle INTEGER, -0 specifies "none assigned
|
|
yet"
|
|
|
|
o targ_name INTERNAL NAME,
|
|
|
|
o mech_type OBJECT IDENTIFIER, -NULL parameter specifies "use
|
|
default"
|
|
|
|
o deleg_req_flag BOOLEAN,
|
|
|
|
|
|
|
|
Linn [Page 21]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o mutual_req_flag BOOLEAN,
|
|
|
|
o replay_det_req_flag BOOLEAN,
|
|
|
|
o sequence_req_flag BOOLEAN,
|
|
|
|
o lifetime_req INTEGER,-0 specifies default lifetime
|
|
|
|
o chan_bindings OCTET STRING,
|
|
|
|
o input_token OCTET STRING-NULL or token received from target
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o output_context_handle INTEGER,
|
|
|
|
o mech_type OBJECT IDENTIFIER, -actual mechanism always
|
|
indicated, never NULL
|
|
|
|
o output_token OCTET STRING, -NULL or token to pass to context
|
|
target
|
|
|
|
o deleg_state BOOLEAN,
|
|
|
|
o mutual_state BOOLEAN,
|
|
|
|
o replay_det_state BOOLEAN,
|
|
|
|
o sequence_state BOOLEAN,
|
|
|
|
o conf_avail BOOLEAN,
|
|
|
|
o integ_avail BOOLEAN,
|
|
|
|
o lifetime_rec INTEGER - in seconds, or reserved value for
|
|
INDEFINITE
|
|
|
|
This call may block pending network interactions for those mech_types
|
|
in which an authentication server or other network entity must be
|
|
consulted on behalf of a context initiator in order to generate an
|
|
output_token suitable for presentation to a specified target.
|
|
|
|
Return major_status codes:
|
|
|
|
|
|
|
|
|
|
Linn [Page 22]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o GSS_COMPLETE indicates that context-level information was
|
|
successfully initialized, and that the returned output_token will
|
|
provide sufficient information for the target to perform per-
|
|
message processing on the newly-established context.
|
|
|
|
o GSS_CONTINUE_NEEDED indicates that control information in the
|
|
returned output_token must be sent to the target, and that a reply
|
|
must be received and passed as the input_token argument to a
|
|
continuation call to GSS_Init_sec_context(), before per-message
|
|
processing can be performed in conjunction with this context.
|
|
|
|
o GSS_DEFECTIVE_TOKEN indicates that consistency checks performed on
|
|
the input_token failed, preventing further processing from being
|
|
performed based on that token.
|
|
|
|
o GSS_DEFECTIVE_CREDENTIAL indicates that consistency checks
|
|
performed on the credential structure referenced by
|
|
claimant_cred_handle failed, preventing further processing from
|
|
being performed using that credential structure.
|
|
|
|
o GSS_BAD_SIG indicates that the received input_token contains an
|
|
incorrect signature, so context setup cannot be accomplished.
|
|
|
|
o GSS_NO_CRED indicates that no context was established, either
|
|
because the input cred_handle was invalid, because the referenced
|
|
credentials are valid for context acceptor use only, or because
|
|
the caller lacks authorization to access the referenced
|
|
credentials.
|
|
|
|
o GSS_CREDENTIALS_EXPIRED indicates that the credentials provided
|
|
through the input claimant_cred_handle argument are no longer
|
|
valid, so context establishment cannot be completed.
|
|
|
|
o GSS_BAD_BINDINGS indicates that a mismatch between the caller-
|
|
provided chan_bindings and those extracted from the input_token
|
|
was detected, signifying a security-relevant event and preventing
|
|
context establishment. (This result will be returned by
|
|
GSS_Init_sec_context only for contexts where mutual_state is
|
|
TRUE.)
|
|
|
|
o GSS_NO_CONTEXT indicates that no valid context was recognized for
|
|
the input context_handle provided; this major status will be
|
|
returned only for successor calls following GSS_CONTINUE_NEEDED
|
|
status returns.
|
|
|
|
o GSS_BAD_NAMETYPE indicates that the provided targ_name is of a
|
|
type uninterpretable or unsupported by the supporting GSS-API
|
|
implementation, so context establishment cannot be completed.
|
|
|
|
|
|
|
|
Linn [Page 23]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o GSS_BAD_NAME indicates that the provided targ_name is inconsistent
|
|
in terms of internally-incorporated type specifier information, so
|
|
context establishment cannot be accomplished.
|
|
|
|
o GSS_FAILURE indicates that context setup could not be accomplished
|
|
for reasons unspecified at the GSS-API level, and that no
|
|
interface-defined recovery action is available.
|
|
|
|
This routine is used by a context initiator, and ordinarily emits one
|
|
(or, for the case of a multi-step exchange, more than one)
|
|
output_token suitable for use by the target within the selected
|
|
mech_type's protocol. Using information in the credentials structure
|
|
referenced by claimant_cred_handle, GSS_Init_sec_context()
|
|
initializes the data structures required to establish a security
|
|
context with target targ_name. The claimant_cred_handle must
|
|
correspond to the same valid credentials structure on the initial
|
|
call to GSS_Init_sec_context() and on any successor calls resulting
|
|
from GSS_CONTINUE_NEEDED status returns; different protocol sequences
|
|
modeled by the GSS_CONTINUE_NEEDED mechanism will require access to
|
|
credentials at different points in the context establishment
|
|
sequence.
|
|
|
|
The input_context_handle argument is 0, specifying "not yet
|
|
assigned", on the first GSS_Init_sec_context() call relating to a
|
|
given context. That call returns an output_context_handle for future
|
|
references to this context. When continuation attempts to
|
|
GSS_Init_sec_context() are needed to perform context establishment,
|
|
the previously-returned non-zero handle value is entered into the
|
|
input_context_handle argument and will be echoed in the returned
|
|
output_context_handle argument. On such continuation attempts (and
|
|
only on continuation attempts) the input_token value is used, to
|
|
provide the token returned from the context's target.
|
|
|
|
The chan_bindings argument is used by the caller to provide
|
|
information binding the security context to security-related
|
|
characteristics (e.g., addresses, cryptographic keys) of the
|
|
underlying communications channel. See Section 1.1.6 of this document
|
|
for more discussion of this argument's usage.
|
|
|
|
The input_token argument contains a message received from the target,
|
|
and is significant only on a call to GSS_Init_sec_context() which
|
|
follows a previous return indicating GSS_CONTINUE_NEEDED
|
|
major_status.
|
|
|
|
It is the caller's responsibility to establish a communications path
|
|
to the target, and to transmit any returned output_token (independent
|
|
of the accompanying returned major_status value) to the target over
|
|
that path. The output_token can, however, be transmitted along with
|
|
|
|
|
|
|
|
Linn [Page 24]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
the first application-provided input message to be processed by
|
|
GSS_Sign() or GSS_Seal() in conjunction with a successfully-
|
|
established context.
|
|
|
|
The initiator may request various context-level functions through
|
|
input flags: the deleg_req_flag requests delegation of access rights,
|
|
the mutual_req_flag requests mutual authentication, the
|
|
replay_det_req_flag requests that replay detection features be
|
|
applied to messages transferred on the established context, and the
|
|
sequence_req_flag requests that sequencing be enforced. (See Section
|
|
1.2.3 for more information on replay detection and sequencing
|
|
features.)
|
|
|
|
Not all of the optionally-requestable features will be available in
|
|
all underlying mech_types; the corresponding return state values
|
|
(deleg_state, mutual_state, replay_det_state, sequence_state)
|
|
indicate, as a function of mech_type processing capabilities and
|
|
initiator-provided input flags, the set of features which will be
|
|
active on the context. These state indicators' values are undefined
|
|
unless the routine's major_status indicates COMPLETE. Failure to
|
|
provide the precise set of features requested by the caller does not
|
|
cause context establishment to fail; it is the caller's prerogative
|
|
to delete the context if the feature set provided is unsuitable for
|
|
the caller's use. The returned mech_type value indicates the
|
|
specific mechanism employed on the context, and will never indicate
|
|
the value for "default".
|
|
|
|
The conf_avail return value indicates whether the context supports
|
|
per-message confidentiality services, and so informs the caller
|
|
whether or not a request for encryption through the conf_req_flag
|
|
input to GSS_Seal() can be honored. In similar fashion, the
|
|
integ_avail return value indicates whether per-message integrity
|
|
services are available (through either GSS_Sign() or GSS_Seal()) on
|
|
the established context.
|
|
|
|
The lifetime_req input specifies a desired upper bound for the
|
|
lifetime of the context to be established, with a value of 0 used to
|
|
request a default lifetime. The lifetime_rec return value indicates
|
|
the length of time for which the context will be valid, expressed as
|
|
an offset from the present; depending on mechanism capabilities,
|
|
credential lifetimes, and local policy, it may not correspond to the
|
|
value requested in lifetime_req. If no constraints on context
|
|
lifetime are imposed, this may be indicated by returning a reserved
|
|
value representing INDEFINITE lifetime_req. The values of conf_avail,
|
|
integ_avail, and lifetime_rec are undefined unless the routine's
|
|
major_status indicates COMPLETE.
|
|
|
|
If the mutual_state is TRUE, this fact will be reflected within the
|
|
|
|
|
|
|
|
Linn [Page 25]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
output_token. A call to GSS_Accept_sec_context() at the target in
|
|
conjunction with such a context will return a token, to be processed
|
|
by a continuation call to GSS_Init_sec_context(), in order to achieve
|
|
mutual authentication.
|
|
|
|
2.2.2. GSS_Accept_sec_context call
|
|
|
|
Inputs:
|
|
|
|
o acceptor_cred_handle OCTET STRING,-NULL specifies "use
|
|
default"
|
|
|
|
o input_context_handle INTEGER, -0 specifies "not yet assigned"
|
|
|
|
o chan_bindings OCTET STRING,
|
|
|
|
o input_token OCTET STRING
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o src_name INTERNAL NAME,
|
|
|
|
o mech_type OBJECT IDENTIFIER,
|
|
|
|
o output_context_handle INTEGER,
|
|
|
|
o deleg_state BOOLEAN,
|
|
|
|
o mutual_state BOOLEAN,
|
|
|
|
o replay_det_state BOOLEAN,
|
|
|
|
o sequence_state BOOLEAN,
|
|
|
|
o conf_avail BOOLEAN,
|
|
|
|
o integ_avail BOOLEAN,
|
|
|
|
o lifetime_rec INTEGER, - in seconds, or reserved value for
|
|
INDEFINITE
|
|
|
|
o delegated_cred_handle OCTET STRING,
|
|
|
|
o output_token OCTET STRING -NULL or token to pass to context
|
|
|
|
|
|
|
|
Linn [Page 26]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
initiator
|
|
|
|
This call may block pending network interactions for those mech_types
|
|
in which a directory service or other network entity must be
|
|
consulted on behalf of a context acceptor in order to validate a
|
|
received input_token.
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that context-level data structures were
|
|
successfully initialized, and that per-message processing can now
|
|
be performed in conjunction with this context.
|
|
|
|
o GSS_CONTINUE_NEEDED indicates that control information in the
|
|
returned output_token must be sent to the initiator, and that a
|
|
response must be received and passed as the input_token argument
|
|
to a continuation call to GSS_Accept_sec_context(), before per-
|
|
message processing can be performed in conjunction with this
|
|
context.
|
|
|
|
o GSS_DEFECTIVE_TOKEN indicates that consistency checks performed on
|
|
the input_token failed, preventing further processing from being
|
|
performed based on that token.
|
|
|
|
o GSS_DEFECTIVE_CREDENTIAL indicates that consistency checks
|
|
performed on the credential structure referenced by
|
|
acceptor_cred_handle failed, preventing further processing from
|
|
being performed using that credential structure.
|
|
|
|
o GSS_BAD_SIG indicates that the received input_token contains an
|
|
incorrect signature, so context setup cannot be accomplished.
|
|
|
|
o GSS_DUPLICATE_TOKEN indicates that the signature on the received
|
|
input_token was correct, but that the input_token was recognized
|
|
as a duplicate of an input_token already processed. No new context
|
|
is established.
|
|
|
|
o GSS_OLD_TOKEN indicates that the signature on the received
|
|
input_token was correct, but that the input_token is too old to be
|
|
checked for duplication against previously-processed input_tokens.
|
|
No new context is established.
|
|
|
|
o GSS_NO_CRED indicates that no context was established, either
|
|
because the input cred_handle was invalid, because the referenced
|
|
credentials are valid for context initiator use only, or because
|
|
the caller lacks authorization to access the referenced
|
|
credentials.
|
|
|
|
|
|
|
|
|
|
Linn [Page 27]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o GSS_CREDENTIALS_EXPIRED indicates that the credentials provided
|
|
through the input acceptor_cred_handle argument are no longer
|
|
valid, so context establishment cannot be completed.
|
|
|
|
o GSS_BAD_BINDINGS indicates that a mismatch between the caller-
|
|
provided chan_bindings and those extracted from the input_token
|
|
was detected, signifying a security-relevant event and preventing
|
|
context establishment.
|
|
|
|
o GSS_NO_CONTEXT indicates that no valid context was recognized for
|
|
the input context_handle provided; this major status will be
|
|
returned only for successor calls following GSS_CONTINUE_NEEDED
|
|
status returns.
|
|
|
|
o GSS_FAILURE indicates that context setup could not be accomplished
|
|
for reasons unspecified at the GSS-API level, and that no
|
|
interface-defined recovery action is available.
|
|
|
|
The GSS_Accept_sec_context() routine is used by a context target.
|
|
Using information in the credentials structure referenced by the
|
|
input acceptor_cred_handle, it verifies the incoming input_token and
|
|
(following the successful completion of a context establishment
|
|
sequence) returns the authenticated src_name and the mech_type used.
|
|
The acceptor_cred_handle must correspond to the same valid
|
|
credentials structure on the initial call to GSS_Accept_sec_context()
|
|
and on any successor calls resulting from GSS_CONTINUE_NEEDED status
|
|
returns; different protocol sequences modeled by the
|
|
GSS_CONTINUE_NEEDED mechanism will require access to credentials at
|
|
different points in the context establishment sequence.
|
|
|
|
The input_context_handle argument is 0, specifying "not yet
|
|
assigned", on the first GSS_Accept_sec_context() call relating to a
|
|
given context. That call returns an output_context_handle for future
|
|
references to this context; when continuation attempts to
|
|
GSS_Accept_sec_context() are needed to perform context
|
|
establishment, that handle value will be entered into the
|
|
input_context_handle argument.
|
|
|
|
The chan_bindings argument is used by the caller to provide
|
|
information binding the security context to security-related
|
|
characteristics (e.g., addresses, cryptographic keys) of the
|
|
underlying communications channel. See Section 1.1.6 of this document
|
|
for more discussion of this argument's usage.
|
|
|
|
The returned state results (deleg_state, mutual_state,
|
|
replay_det_state, and sequence_state) reflect the same context state
|
|
values as returned to GSS_Init_sec_context()'s caller at the
|
|
initiator system.
|
|
|
|
|
|
|
|
Linn [Page 28]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
The conf_avail return value indicates whether the context supports
|
|
per-message confidentiality services, and so informs the caller
|
|
whether or not a request for encryption through the conf_req_flag
|
|
input to GSS_Seal() can be honored. In similar fashion, the
|
|
integ_avail return value indicates whether per-message integrity
|
|
services are available (through either GSS_Sign() or GSS_Seal()) on
|
|
the established context.
|
|
|
|
The lifetime_rec return value indicates the length of time for which
|
|
the context will be valid, expressed as an offset from the present.
|
|
The values of deleg_state, mutual_state, replay_det_state,
|
|
sequence_state, conf_avail, integ_avail, and lifetime_rec are
|
|
undefined unless the accompanying major_status indicates COMPLETE.
|
|
|
|
The delegated_cred_handle result is significant only when deleg_state
|
|
is TRUE, and provides a means for the target to reference the
|
|
delegated credentials. The output_token result, when non-NULL,
|
|
provides a context-level token to be returned to the context
|
|
initiator to continue a multi-step context establishment sequence. As
|
|
noted with GSS_Init_sec_context(), any returned token should be
|
|
transferred to the context's peer (in this case, the context
|
|
initiator), independent of the value of the accompanying returned
|
|
major_status.
|
|
|
|
Note: A target must be able to distinguish a context-level
|
|
input_token, which is passed to GSS_Accept_sec_context(), from the
|
|
per-message data elements passed to GSS_Verify() or GSS_Unseal().
|
|
These data elements may arrive in a single application message, and
|
|
GSS_Accept_sec_context() must be performed before per-message
|
|
processing can be performed successfully.
|
|
|
|
2.2.3. GSS_Delete_sec_context call
|
|
|
|
Input:
|
|
|
|
o context_handle INTEGER
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o output_context_token OCTET STRING
|
|
|
|
Return major_status codes:
|
|
|
|
|
|
|
|
|
|
|
|
Linn [Page 29]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o GSS_COMPLETE indicates that the context was recognized, that
|
|
relevant context-specific information was flushed, and that the
|
|
returned output_context_token is ready for transfer to the
|
|
context's peer.
|
|
|
|
o GSS_NO_CONTEXT indicates that no valid context was recognized for
|
|
the input context_handle provide, so no deletion was performed.
|
|
|
|
o GSS_FAILURE indicates that the context is recognized, but that the
|
|
GSS_Delete_sec_context() operation could not be performed for
|
|
reasons unspecified at the GSS-API level.
|
|
|
|
This call may block pending network interactions for mech_types in
|
|
which active notification must be made to a central server when a
|
|
security context is to be deleted.
|
|
|
|
This call can be made by either peer in a security context, to flush
|
|
context-specific information and to return an output_context_token
|
|
which can be passed to the context's peer informing it that the
|
|
peer's corresponding context information can also be flushed. (Once a
|
|
context is established, the peers involved are expected to retain
|
|
cached credential and context-related information until the
|
|
information's expiration time is reached or until a
|
|
GSS_Delete_sec_context() call is made.) Attempts to perform per-
|
|
message processing on a deleted context will result in error returns.
|
|
|
|
2.2.4. GSS_Process_context_token call
|
|
|
|
Inputs:
|
|
|
|
o context_handle INTEGER,
|
|
|
|
o input_context_token OCTET STRING
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that the input_context_token was
|
|
successfully processed in conjunction with the context referenced
|
|
by context_handle.
|
|
|
|
o GSS_DEFECTIVE_TOKEN indicates that consistency checks performed on
|
|
the received context_token failed, preventing further processing
|
|
|
|
|
|
|
|
Linn [Page 30]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
from being performed with that token.
|
|
|
|
o GSS_NO_CONTEXT indicates that no valid context was recognized for
|
|
the input context_handle provided.
|
|
|
|
o GSS_FAILURE indicates that the context is recognized, but that the
|
|
GSS_Process_context_token() operation could not be performed for
|
|
reasons unspecified at the GSS-API level.
|
|
|
|
This call is used to process context_tokens received from a peer once
|
|
a context has been established, with corresponding impact on
|
|
context-level state information. One use for this facility is
|
|
processing of the context_tokens generated by
|
|
GSS_Delete_sec_context(); GSS_Process_context_token() will not block
|
|
pending network interactions for that purpose. Another use is to
|
|
process tokens indicating remote-peer context establishment failures
|
|
after the point where the local GSS-API implementation has already
|
|
indicated GSS_COMPLETE status.
|
|
|
|
2.2.5. GSS_Context_time call
|
|
|
|
Input:
|
|
|
|
o context_handle INTEGER,
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o lifetime_rec INTEGER - in seconds, or reserved value for
|
|
INDEFINITE
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that the referenced context is valid, and
|
|
will remain valid for the amount of time indicated in
|
|
lifetime_rec.
|
|
|
|
o GSS_CONTEXT_EXPIRED indicates that data items related to the
|
|
referenced context have expired.
|
|
|
|
o GSS_CREDENTIALS_EXPIRED indicates that the context is recognized,
|
|
but that its associated credentials have expired.
|
|
|
|
o GSS_NO_CONTEXT indicates that no valid context was recognized for
|
|
the input context_handle provided.
|
|
|
|
|
|
|
|
Linn [Page 31]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o GSS_FAILURE indicates that the requested operation failed for
|
|
reasons unspecified at the GSS-API level.
|
|
|
|
This call is used to determine the amount of time for which a
|
|
currently established context will remain valid.
|
|
|
|
2.3. Per-message calls
|
|
|
|
This group of calls is used to perform per-message protection
|
|
processing on an established security context. None of these calls
|
|
block pending network interactions. These calls may be invoked by a
|
|
context's initiator or by the context's target. The four members of
|
|
this group should be considered as two pairs; the output from
|
|
GSS_Sign() is properly input to GSS_Verify(), and the output from
|
|
GSS_Seal() is properly input to GSS_Unseal().
|
|
|
|
GSS_Sign() and GSS_Verify() support data origin authentication and
|
|
data integrity services. When GSS_Sign() is invoked on an input
|
|
message, it yields a per-message token containing data items which
|
|
allow underlying mechanisms to provide the specified security
|
|
services. The original message, along with the generated per-message
|
|
token, is passed to the remote peer; these two data elements are
|
|
processed by GSS_Verify(), which validates the message in
|
|
conjunction with the separate token.
|
|
|
|
GSS_Seal() and GSS_Unseal() support caller-requested confidentiality
|
|
in addition to the data origin authentication and data integrity
|
|
services offered by GSS_Sign() and GSS_Verify(). GSS_Seal() outputs
|
|
a single data element, encapsulating optionally enciphered user data
|
|
as well as associated token data items. The data element output from
|
|
GSS_Seal() is passed to the remote peer and processed by
|
|
GSS_Unseal() at that system. GSS_Unseal() combines decipherment (as
|
|
required) with validation of data items related to authentication and
|
|
integrity.
|
|
|
|
2.3.1. GSS_Sign call
|
|
|
|
Inputs:
|
|
|
|
o context_handle INTEGER,
|
|
|
|
o qop_req INTEGER,-0 specifies default QOP
|
|
|
|
o message OCTET STRING
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
|
|
|
|
Linn [Page 32]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o per_msg_token OCTET STRING
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that a signature, suitable for an
|
|
established security context, was successfully applied and that
|
|
the message and corresponding per_msg_token are ready for
|
|
transmission.
|
|
|
|
o GSS_CONTEXT_EXPIRED indicates that context-related data items have
|
|
expired, so that the requested operation cannot be performed.
|
|
|
|
o GSS_CREDENTIALS_EXPIRED indicates that the context is recognized,
|
|
but that its associated credentials have expired, so that the
|
|
requested operation cannot be performed.
|
|
|
|
o GSS_NO_CONTEXT indicates that no valid context was recognized for
|
|
the input context_handle provided.
|
|
|
|
o GSS_FAILURE indicates that the context is recognized, but that the
|
|
requested operation could not be performed for reasons unspecified
|
|
at the GSS-API level.
|
|
|
|
Using the security context referenced by context_handle, apply a
|
|
signature to the input message (along with timestamps and/or other
|
|
data included in support of mech_type-specific mechanisms) and return
|
|
the result in per_msg_token. The qop_req parameter allows quality-
|
|
of-protection control. The caller passes the message and the
|
|
per_msg_token to the target.
|
|
|
|
The GSS_Sign() function completes before the message and
|
|
per_msg_token is sent to the peer; successful application of
|
|
GSS_Sign() does not guarantee that a corresponding GSS_Verify() has
|
|
been (or can necessarily be) performed successfully when the message
|
|
arrives at the destination.
|
|
|
|
2.3.2. GSS_Verify call
|
|
|
|
Inputs:
|
|
|
|
o context_handle INTEGER,
|
|
|
|
o message OCTET STRING,
|
|
|
|
o per_msg_token OCTET STRING
|
|
|
|
|
|
|
|
|
|
Linn [Page 33]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
Outputs:
|
|
|
|
o qop_state INTEGER,
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that the message was successfully verified.
|
|
|
|
o GSS_DEFECTIVE_TOKEN indicates that consistency checks performed on
|
|
the received per_msg_token failed, preventing further processing
|
|
from being performed with that token.
|
|
|
|
o GSS_BAD_SIG indicates that the received per_msg_token contains an
|
|
incorrect signature for the message.
|
|
|
|
o GSS_DUPLICATE_TOKEN, GSS_OLD_TOKEN, and GSS_UNSEQ_TOKEN values
|
|
appear in conjunction with the optional per-message replay
|
|
detection features described in Section 1.2.3; their semantics are
|
|
described in that section.
|
|
|
|
o GSS_CONTEXT_EXPIRED indicates that context-related data items have
|
|
expired, so that the requested operation cannot be performed.
|
|
|
|
o GSS_CREDENTIALS_EXPIRED indicates that the context is recognized,
|
|
but that its associated credentials have expired, so that the
|
|
requested operation cannot be performed.
|
|
|
|
o GSS_NO_CONTEXT indicates that no valid context was recognized for
|
|
the input context_handle provided.
|
|
|
|
o GSS_FAILURE indicates that the context is recognized, but that the
|
|
GSS_Verify() operation could not be performed for reasons
|
|
unspecified at the GSS-API level.
|
|
|
|
Using the security context referenced by context_handle, verify that
|
|
the input per_msg_token contains an appropriate signature for the
|
|
input message, and apply any active replay detection or sequencing
|
|
features. Return an indication of the quality-of-protection applied
|
|
to the processed message in the qop_state result.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Linn [Page 34]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
2.3.3. GSS_Seal call
|
|
|
|
Inputs:
|
|
|
|
o context_handle INTEGER,
|
|
|
|
o conf_req_flag BOOLEAN,
|
|
|
|
o qop_req INTEGER,-0 specifies default QOP
|
|
|
|
o input_message OCTET STRING
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o conf_state BOOLEAN,
|
|
|
|
o output_message OCTET STRING
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that the input_message was successfully
|
|
processed and that the output_message is ready for transmission.
|
|
|
|
o GSS_CONTEXT_EXPIRED indicates that context-related data items have
|
|
expired, so that the requested operation cannot be performed.
|
|
|
|
o GSS_CREDENTIALS_EXPIRED indicates that the context is recognized,
|
|
but that its associated credentials have expired, so that the
|
|
requested operation cannot be performed.
|
|
|
|
o GSS_NO_CONTEXT indicates that no valid context was recognized for
|
|
the input context_handle provided.
|
|
|
|
o GSS_FAILURE indicates that the context is recognized, but that the
|
|
GSS_Seal() operation could not be performed for reasons
|
|
unspecified at the GSS-API level.
|
|
|
|
Performs the data origin authentication and data integrity functions
|
|
of GSS_Sign(). If the input conf_req_flag is TRUE, requests that
|
|
confidentiality be applied to the input_message. Confidentiality may
|
|
not be supported in all mech_types or by all implementations; the
|
|
returned conf_state flag indicates whether confidentiality was
|
|
provided for the input_message. The qop_req parameter allows
|
|
quality-of-protection control.
|
|
|
|
|
|
|
|
Linn [Page 35]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
In all cases, the GSS_Seal() call yields a single output_message
|
|
data element containing (optionally enciphered) user data as well as
|
|
control information.
|
|
|
|
2.3.4. GSS_Unseal call
|
|
|
|
Inputs:
|
|
|
|
o context_handle INTEGER,
|
|
|
|
o input_message OCTET STRING
|
|
|
|
Outputs:
|
|
|
|
o conf_state BOOLEAN,
|
|
|
|
o qop_state INTEGER,
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o output_message OCTET STRING
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that the input_message was successfully
|
|
processed and that the resulting output_message is available.
|
|
|
|
o GSS_DEFECTIVE_TOKEN indicates that consistency checks performed on
|
|
the per_msg_token extracted from the input_message failed,
|
|
preventing further processing from being performed.
|
|
|
|
o GSS_BAD_SIG indicates that an incorrect signature was detected for
|
|
the message.
|
|
|
|
o GSS_DUPLICATE_TOKEN, GSS_OLD_TOKEN, and GSS_UNSEQ_TOKEN values
|
|
appear in conjunction with the optional per-message replay
|
|
detection features described in Section 1.2.3; their semantics are
|
|
described in that section.
|
|
|
|
o GSS_CONTEXT_EXPIRED indicates that context-related data items have
|
|
expired, so that the requested operation cannot be performed.
|
|
|
|
o GSS_CREDENTIALS_EXPIRED indicates that the context is recognized,
|
|
but that its associated credentials have expired, so that the
|
|
requested operation cannot be performed.
|
|
|
|
|
|
|
|
|
|
Linn [Page 36]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o GSS_NO_CONTEXT indicates that no valid context was recognized for
|
|
the input context_handle provided.
|
|
|
|
o GSS_FAILURE indicates that the context is recognized, but that the
|
|
GSS_Unseal() operation could not be performed for reasons
|
|
unspecified at the GSS-API level.
|
|
|
|
Processes a data element generated (and optionally enciphered) by
|
|
GSS_Seal(), provided as input_message. The returned conf_state value
|
|
indicates whether confidentiality was applied to the input_message.
|
|
If conf_state is TRUE, GSS_Unseal() deciphers the input_message.
|
|
Returns an indication of the quality-of-protection applied to the
|
|
processed message in the qop_state result. GSS_Seal() performs the
|
|
data integrity and data origin authentication checking functions of
|
|
GSS_Verify() on the plaintext data. Plaintext data is returned in
|
|
output_message.
|
|
|
|
2.4. Support calls
|
|
|
|
This group of calls provides support functions useful to GSS-API
|
|
callers, independent of the state of established contexts. Their
|
|
characterization with regard to blocking or non-blocking status in
|
|
terms of network interactions is unspecified.
|
|
|
|
2.4.1. GSS_Display_status call
|
|
|
|
Inputs:
|
|
|
|
o status_value INTEGER,-GSS-API major_status or minor_status
|
|
return value
|
|
|
|
o status_type INTEGER,-1 if major_status, 2 if minor_status
|
|
|
|
o mech_type OBJECT IDENTIFIER-mech_type to be used for minor_
|
|
status translation
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o status_string_set SET OF OCTET STRING
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that a valid printable status
|
|
representation (possibly representing more than one status event
|
|
|
|
|
|
|
|
Linn [Page 37]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
encoded within the status_value) is available in the returned
|
|
status_string_set.
|
|
|
|
o GSS_BAD_MECH indicates that translation in accordance with an
|
|
unsupported mech_type was requested, so translation could not be
|
|
performed.
|
|
|
|
o GSS_BAD_STATUS indicates that the input status_value was invalid,
|
|
or that the input status_type carried a value other than 1 or 2,
|
|
so translation could not be performed.
|
|
|
|
o GSS_FAILURE indicates that the requested operation could not be
|
|
performed for reasons unspecified at the GSS-API level.
|
|
|
|
Provides a means for callers to translate GSS-API-returned major and
|
|
minor status codes into printable string representations.
|
|
|
|
2.4.2. GSS_Indicate_mechs call
|
|
|
|
Input:
|
|
|
|
o (none)
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o mech_set SET OF OBJECT IDENTIFIER
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that a set of available mechanisms has
|
|
been returned in mech_set.
|
|
|
|
o GSS_FAILURE indicates that the requested operation could not
|
|
be performed for reasons unspecified at the GSS-API level.
|
|
|
|
Allows callers to determine the set of mechanism types available on
|
|
the local system. This call is intended for support of specialized
|
|
callers who need to request non-default mech_type sets from
|
|
GSS_Acquire_cred(), and should not be needed by other callers.
|
|
|
|
2.4.3. GSS_Compare_name call
|
|
|
|
Inputs:
|
|
|
|
|
|
|
|
|
|
Linn [Page 38]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o name1 INTERNAL NAME,
|
|
|
|
o name2 INTERNAL NAME
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o name_equal BOOLEAN
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that name1 and name2 were comparable, and
|
|
that the name_equal result indicates whether name1 and name2 were
|
|
equal or unequal.
|
|
|
|
o GSS_BAD_NAMETYPE indicates that one or both of name1 and name2
|
|
contained internal type specifiers uninterpretable by the
|
|
supporting GSS-API implementation, or that the two names' types
|
|
are different and incomparable, so the equality comparison could
|
|
not be completed.
|
|
|
|
o GSS_BAD_NAME indicates that one or both of the input names was
|
|
ill-formed in terms of its internal type specifier, so the
|
|
equality comparison could not be completed.
|
|
|
|
o GSS_FAILURE indicates that the requested operation could not be
|
|
performed for reasons unspecified at the GSS-API level.
|
|
|
|
Allows callers to compare two internal name representations for
|
|
equality.
|
|
|
|
2.4.4. GSS_Display_name call
|
|
|
|
Inputs:
|
|
|
|
o name INTERNAL NAME
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o name_string OCTET STRING,
|
|
|
|
|
|
|
|
|
|
Linn [Page 39]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o name_type OBJECT IDENTIFIER
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that a valid printable name representation
|
|
is available in the returned name_string.
|
|
|
|
o GSS_BAD_NAMETYPE indicates that the provided name was of a type
|
|
uninterpretable by the supporting GSS-API implementation, so no
|
|
printable representation could be generated.
|
|
|
|
o GSS_BAD_NAME indicates that the contents of the provided name were
|
|
inconsistent with the internally-indicated name type, so no
|
|
printable representation could be generated.
|
|
|
|
o GSS_FAILURE indicates that the requested operation could not be
|
|
performed for reasons unspecified at the GSS-API level.
|
|
|
|
Allows callers to translate an internal name representation into a
|
|
printable form with associated namespace type descriptor. The syntax
|
|
of the printable form is a local matter.
|
|
|
|
2.4.5. GSS_Import_name call
|
|
|
|
Inputs:
|
|
|
|
o input_name_string OCTET STRING,
|
|
|
|
o input_name_type OBJECT IDENTIFIER
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER,
|
|
|
|
o output_name INTERNAL NAME
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that a valid name representation is output
|
|
in output_name and described by the type value in
|
|
output_name_type.
|
|
|
|
o GSS_BAD_NAMETYPE indicates that the input_name_type is unsupported
|
|
by the GSS-API implementation, so the import operation could not
|
|
be completed.
|
|
|
|
|
|
|
|
|
|
Linn [Page 40]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o GSS_BAD_NAME indicates that the provided input_name_string is
|
|
ill-formed in terms of the input_name_type, so the import
|
|
operation could not be completed.
|
|
|
|
o GSS_FAILURE indicates that the requested operation could not be
|
|
performed for reasons unspecified at the GSS-API level.
|
|
|
|
Allows callers to provide a printable name representation, designate
|
|
the type of namespace in conjunction with which it should be parsed,
|
|
and convert that printable representation to an internal form
|
|
suitable for input to other GSS-API routines. The syntax of the
|
|
input_name is a local matter.
|
|
|
|
2.4.6. GSS_Release_name call
|
|
|
|
Inputs:
|
|
|
|
o name INTERNAL NAME
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that the storage associated with the input
|
|
name was successfully released.
|
|
|
|
o GSS_BAD_NAME indicates that the input name argument did not
|
|
contain a valid name.
|
|
|
|
o GSS_FAILURE indicates that the requested operation could not be
|
|
performed for reasons unspecified at the GSS-API level.
|
|
|
|
Allows callers to release the storage associated with an internal
|
|
name representation.
|
|
|
|
2.4.7. GSS_Release_buffer call
|
|
|
|
Inputs:
|
|
|
|
o buffer OCTET STRING
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
|
|
|
|
Linn [Page 41]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
o minor_status INTEGER
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that the storage associated with the input
|
|
buffer was successfully released.
|
|
|
|
o GSS_FAILURE indicates that the requested operation could not be
|
|
performed for reasons unspecified at the GSS-API level.
|
|
|
|
Allows callers to release the storage associated with an OCTET STRING
|
|
buffer allocated by another GSS-API call.
|
|
|
|
2.4.8. GSS_Release_oid_set call
|
|
|
|
Inputs:
|
|
|
|
o buffer SET OF OBJECT IDENTIFIER
|
|
|
|
Outputs:
|
|
|
|
o major_status INTEGER,
|
|
|
|
o minor_status INTEGER
|
|
|
|
Return major_status codes:
|
|
|
|
o GSS_COMPLETE indicates that the storage associated with the input
|
|
object identifier set was successfully released.
|
|
|
|
o GSS_FAILURE indicates that the requested operation could not be
|
|
performed for reasons unspecified at the GSS-API level.
|
|
|
|
Allows callers to release the storage associated with an object
|
|
identifier set object allocated by another GSS-API call.
|
|
|
|
3. Mechanism-Specific Example Scenarios
|
|
|
|
This section provides illustrative overviews of the use of various
|
|
candidate mechanism types to support the GSS-API. These discussions
|
|
are intended primarily for readers familiar with specific security
|
|
technologies, demonstrating how GSS-API functions can be used and
|
|
implemented by candidate underlying mechanisms. They should not be
|
|
regarded as constrictive to implementations or as defining the only
|
|
means through which GSS-API functions can be realized with a
|
|
particular underlying technology, and do not demonstrate all GSS-API
|
|
features with each technology.
|
|
|
|
|
|
|
|
|
|
Linn [Page 42]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
3.1. Kerberos V5, single-TGT
|
|
|
|
OS-specific login functions yield a TGT to the local realm Kerberos
|
|
server; TGT is placed in a credentials structure for the client.
|
|
Client calls GSS_Acquire_cred() to acquire a cred_handle in order to
|
|
reference the credentials for use in establishing security contexts.
|
|
|
|
Client calls GSS_Init_sec_context(). If the requested service is
|
|
located in a different realm, GSS_Init_sec_context() gets the
|
|
necessary TGT/key pairs needed to traverse the path from local to
|
|
target realm; these data are placed in the owner's TGT cache. After
|
|
any needed remote realm resolution, GSS_Init_sec_context() yields a
|
|
service ticket to the requested service with a corresponding session
|
|
key; these data are stored in conjunction with the context. GSS-API
|
|
code sends KRB_TGS_REQ request(s) and receives KRB_TGS_REP
|
|
response(s) (in the successful case) or KRB_ERROR.
|
|
|
|
Assuming success, GSS_Init_sec_context() builds a Kerberos-formatted
|
|
KRB_AP_REQ message, and returns it in output_token. The client sends
|
|
the output_token to the service.
|
|
|
|
The service passes the received token as the input_token argument to
|
|
GSS_Accept_sec_context(), which verifies the authenticator, provides
|
|
the service with the client's authenticated name, and returns an
|
|
output_context_handle.
|
|
|
|
Both parties now hold the session key associated with the service
|
|
ticket, and can use this key in subsequent GSS_Sign(), GSS_Verify(),
|
|
GSS_Seal(), and GSS_Unseal() operations.
|
|
|
|
3.2. Kerberos V5, double-TGT
|
|
|
|
TGT acquisition as above.
|
|
|
|
Note: To avoid unnecessary frequent invocations of error paths when
|
|
implementing the GSS-API atop Kerberos V5, it seems appropriate to
|
|
represent "single-TGT K-V5" and "double-TGT K-V5" with separate
|
|
mech_types, and this discussion makes that assumption.
|
|
|
|
Based on the (specified or defaulted) mech_type,
|
|
GSS_Init_sec_context() determines that the double-TGT protocol
|
|
should be employed for the specified target. GSS_Init_sec_context()
|
|
returns GSS_CONTINUE_NEEDED major_status, and its returned
|
|
output_token contains a request to the service for the service's TGT.
|
|
(If a service TGT with suitably long remaining lifetime already
|
|
exists in a cache, it may be usable, obviating the need for this
|
|
step.) The client passes the output_token to the service. Note: this
|
|
scenario illustrates a different use for the GSS_CONTINUE_NEEDED
|
|
|
|
|
|
|
|
Linn [Page 43]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
status return facility than for support of mutual authentication;
|
|
note that both uses can coexist as successive operations within a
|
|
single context establishment operation.
|
|
|
|
The service passes the received token as the input_token argument to
|
|
GSS_Accept_sec_context(), which recognizes it as a request for TGT.
|
|
(Note that current Kerberos V5 defines no intra-protocol mechanism to
|
|
represent such a request.) GSS_Accept_sec_context() returns
|
|
GSS_CONTINUE_NEEDED major_status and provides the service's TGT in
|
|
its output_token. The service sends the output_token to the client.
|
|
|
|
The client passes the received token as the input_token argument to a
|
|
continuation of GSS_Init_sec_context(). GSS_Init_sec_context() caches
|
|
the received service TGT and uses it as part of a service ticket
|
|
request to the Kerberos authentication server, storing the returned
|
|
service ticket and session key in conjunction with the context.
|
|
GSS_Init_sec_context() builds a Kerberos-formatted authenticator,
|
|
and returns it in output_token along with GSS_COMPLETE return
|
|
major_status. The client sends the output_token to the service.
|
|
|
|
Service passes the received token as the input_token argument to a
|
|
continuation call to GSS_Accept_sec_context().
|
|
GSS_Accept_sec_context() verifies the authenticator, provides the
|
|
service with the client's authenticated name, and returns
|
|
major_status GSS_COMPLETE.
|
|
|
|
GSS_Sign(), GSS_Verify(), GSS_Seal(), and GSS_Unseal() as above.
|
|
|
|
3.3. X.509 Authentication Framework
|
|
|
|
This example illustrates use of the GSS-API in conjunction with
|
|
public-key mechanisms, consistent with the X.509 Directory
|
|
Authentication Framework.
|
|
|
|
The GSS_Acquire_cred() call establishes a credentials structure,
|
|
making the client's private key accessible for use on behalf of the
|
|
client.
|
|
|
|
The client calls GSS_Init_sec_context(), which interrogates the
|
|
Directory to acquire (and validate) a chain of public-key
|
|
certificates, thereby collecting the public key of the service. The
|
|
certificate validation operation determines that suitable signatures
|
|
were applied by trusted authorities and that those certificates have
|
|
not expired. GSS_Init_sec_context() generates a secret key for use
|
|
in per-message protection operations on the context, and enciphers
|
|
that secret key under the service's public key.
|
|
|
|
The enciphered secret key, along with an authenticator quantity
|
|
|
|
|
|
|
|
Linn [Page 44]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
signed with the client's private key, is included in the output_token
|
|
from GSS_Init_sec_context(). The output_token also carries a
|
|
certification path, consisting of a certificate chain leading from
|
|
the service to the client; a variant approach would defer this path
|
|
resolution to be performed by the service instead of being asserted
|
|
by the client. The client application sends the output_token to the
|
|
service.
|
|
|
|
The service passes the received token as the input_token argument to
|
|
GSS_Accept_sec_context(). GSS_Accept_sec_context() validates the
|
|
certification path, and as a result determines a certified binding
|
|
between the client's distinguished name and the client's public key.
|
|
Given that public key, GSS_Accept_sec_context() can process the
|
|
input_token's authenticator quantity and verify that the client's
|
|
private key was used to sign the input_token. At this point, the
|
|
client is authenticated to the service. The service uses its private
|
|
key to decipher the enciphered secret key provided to it for per-
|
|
message protection operations on the context.
|
|
|
|
The client calls GSS_Sign() or GSS_Seal() on a data message, which
|
|
causes per-message authentication, integrity, and (optional)
|
|
confidentiality facilities to be applied to that message. The service
|
|
uses the context's shared secret key to perform corresponding
|
|
GSS_Verify() and GSS_Unseal() calls.
|
|
|
|
4. Related Activities
|
|
|
|
In order to implement the GSS-API atop existing, emerging, and future
|
|
security mechanisms:
|
|
|
|
object identifiers must be assigned to candidate GSS-API
|
|
mechanisms and the name types which they support
|
|
|
|
concrete data element formats must be defined for candidate
|
|
mechanisms
|
|
|
|
Calling applications must implement formatting conventions which will
|
|
enable them to distinguish GSS-API tokens from other data carried in
|
|
their application protocols.
|
|
|
|
Concrete language bindings are required for the programming
|
|
environments in which the GSS-API is to be employed; such bindings
|
|
for the C language are available in an associated RFC.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Linn [Page 45]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
5. Acknowledgments
|
|
|
|
This proposal is the result of a collaborative effort.
|
|
Acknowledgments are due to the many members of the IETF Security Area
|
|
Advisory Group (SAAG) and the Common Authentication Technology (CAT)
|
|
Working Group for their contributions at meetings and by electronic
|
|
mail. Acknowledgments are also due to Kannan Alagappan, Doug Barlow,
|
|
Bill Brown, Cliff Kahn, Charlie Kaufman, Butler Lampson, Richard
|
|
Pitkin, Joe Tardo, and John Wray of Digital Equipment Corporation,
|
|
and John Carr, John Kohl, Jon Rochlis, Jeff Schiller, and Ted T'so of
|
|
MIT and Project Athena. Joe Pato and Bill Sommerfeld of HP/Apollo,
|
|
Walt Tuvell of OSF, and Bill Griffith and Mike Merritt of AT&T,
|
|
provided inputs which helped to focus and clarify directions.
|
|
Precursor work by Richard Pitkin, presented to meetings of the
|
|
Trusted Systems Interoperability Group (TSIG), helped to demonstrate
|
|
the value of a generic, mechanism-independent security service API.
|
|
|
|
6. Security Considerations
|
|
|
|
Security issues are discussed throughout this memo.
|
|
|
|
7. Author's Address
|
|
|
|
John Linn
|
|
Geer Zolot Associates
|
|
One Main St.
|
|
Cambridge, MA 02142 USA
|
|
|
|
Phone: +1 617.374.3700
|
|
Email: Linn@gza.com
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Linn [Page 46]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
APPENDIX A
|
|
|
|
PACS AND AUTHORIZATION SERVICES
|
|
|
|
Consideration has been given to modifying the GSS-API service
|
|
interface to recognize and manipulate Privilege Attribute
|
|
Certificates (PACs) as in ECMA 138, carrying authorization data as a
|
|
side effect of establishing a security context, but no such
|
|
modifications have been incorporated at this time. This appendix
|
|
provides rationale for this decision and discusses compatibility
|
|
alternatives between PACs and the GSS-API which do not require that
|
|
PACs be made visible to GSS-API callers.
|
|
|
|
Existing candidate mechanism types such as Kerberos and X.509 do not
|
|
incorporate PAC manipulation features, and exclusion of such
|
|
mechanisms from the set of candidates equipped to fully support the
|
|
GSS-API seems inappropriate. Inclusion (and GSS-API visibility) of a
|
|
feature supported by only a limited number of mechanisms could
|
|
encourage the development of ostensibly portable applications which
|
|
would in fact have only limited portability.
|
|
|
|
The status quo, in which PACs are not visible across the GSS-API
|
|
interface, does not preclude implementations in which PACs are
|
|
carried transparently, within the tokens defined and used for certain
|
|
mech_types, and stored within peers' credentials and context-level
|
|
data structures. While invisible to API callers, such PACs could be
|
|
used by operating system or other local functions as inputs in the
|
|
course of mediating access requests made by callers. This course of
|
|
action allows dynamic selection of PAC contents, if such selection is
|
|
administratively-directed rather than caller-directed.
|
|
|
|
In a distributed computing environment, authentication must span
|
|
different systems; the need for such authentication provides
|
|
motivation for GSS-API definition and usage. Heterogeneous systems in
|
|
a network can intercommunicate, with globally authenticated names
|
|
comprising the common bond between locally defined access control
|
|
policies. Access control policies to which authentication provides
|
|
inputs are often local, or specific to particular operating systems
|
|
or environments. If the GSS-API made particular authorization models
|
|
visible across its service interface, its scope of application would
|
|
become less general. The current GSS-API paradigm is consistent with
|
|
the precedent set by Kerberos, neither defining the interpretation of
|
|
authorization-related data nor enforcing access controls based on
|
|
such data.
|
|
|
|
The GSS-API is a general interface, whose callers may reside inside
|
|
or outside any defined TCB or NTCB boundaries. Given this
|
|
characteristic, it appears more realistic to provide facilities which
|
|
|
|
|
|
|
|
Linn [Page 47]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
provide "value-added" security services to its callers than to offer
|
|
facilities which enforce restrictions on those callers. Authorization
|
|
decisions must often be mediated below the GSS-API level in a local
|
|
manner against (or in spite of) applications, and cannot be
|
|
selectively invoked or omitted at those applications' discretion.
|
|
Given that the GSS-API's placement prevents it from providing a
|
|
comprehensive solution to the authorization issue, the value of a
|
|
partial contribution specific to particular authorization models is
|
|
debatable.
|
|
|
|
APPENDIX B
|
|
|
|
MECHANISM-INDEPENDENT TOKEN FORMAT
|
|
|
|
This appendix specifies a mechanism-independent level of
|
|
encapsulating representation for the initial token of a GSS-API
|
|
context establishment sequence, incorporating an identifier of the
|
|
mechanism type to be used on that context. Use of this format (with
|
|
ASN.1-encoded data elements represented in BER, constrained in the
|
|
interests of parsing simplicity to the Distinguished Encoding Rule
|
|
(DER) BER subset defined in X.509, clause 8.7) is recommended to the
|
|
designers of GSS-API implementations based on various mechanisms, so
|
|
that tokens can be interpreted unambiguously at GSS-API peers. There
|
|
is no requirement that the mechanism-specific innerContextToken,
|
|
innerMsgToken, and sealedUserData data elements be encoded in ASN.1
|
|
BER.
|
|
|
|
-- optional top-level token definitions to
|
|
-- frame different mechanisms
|
|
|
|
GSS-API DEFINITIONS ::=
|
|
|
|
BEGIN
|
|
|
|
MechType ::= OBJECT IDENTIFIER
|
|
-- data structure definitions
|
|
|
|
-- callers must be able to distinguish among
|
|
-- InitialContextToken, SubsequentContextToken,
|
|
-- PerMsgToken, and SealedMessage data elements
|
|
-- based on the usage in which they occur
|
|
|
|
InitialContextToken ::=
|
|
-- option indication (delegation, etc.) indicated within
|
|
-- mechanism-specific token
|
|
[APPLICATION 0] IMPLICIT SEQUENCE {
|
|
thisMech MechType,
|
|
innerContextToken ANY DEFINED BY thisMech
|
|
|
|
|
|
|
|
Linn [Page 48]
|
|
|
|
RFC 1508 Generic Security Interface September 1993
|
|
|
|
|
|
-- contents mechanism-specific
|
|
}
|
|
|
|
SubsequentContextToken ::= innerContextToken ANY
|
|
-- interpretation based on predecessor InitialContextToken
|
|
|
|
PerMsgToken ::=
|
|
-- as emitted by GSS_Sign and processed by GSS_Verify
|
|
innerMsgToken ANY
|
|
|
|
SealedMessage ::=
|
|
-- as emitted by GSS_Seal and processed by GSS_Unseal
|
|
-- includes internal, mechanism-defined indicator
|
|
-- of whether or not encrypted
|
|
sealedUserData ANY
|
|
|
|
END
|
|
|
|
APPENDIX C
|
|
|
|
MECHANISM DESIGN CONSTRAINTS
|
|
|
|
The following constraints on GSS-API mechanism designs are adopted in
|
|
response to observed caller protocol requirements, and adherence
|
|
thereto is anticipated in subsequent descriptions of GSS-API
|
|
mechanisms to be documented in standards-track Internet
|
|
specifications.
|
|
|
|
Use of the approach defined in Appendix B of this specification,
|
|
applying a mechanism type tag to the InitialContextToken, is
|
|
required.
|
|
|
|
It is strongly recommended that mechanisms offering per-message
|
|
protection services also offer at least one of the replay detection
|
|
and sequencing services, as mechanisms offering neither of the latter
|
|
will fail to satisfy recognized requirements of certain candidate
|
|
caller protocols.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Linn [Page 49]
|
|
|