3 NETWORK WORKING GROUP L. Zhu
4 Internet-Draft P. Leach
5 Obsoletes: 2478 (if approved) K. Jaganathan
6 Expires: June 15, 2005 Microsoft Corporation
12 The Simple and Protected GSS-API Negotiation Mechanism
13 draft-ietf-kitten-2478bis-04
17 This document is an Internet-Draft and is subject to all provisions
18 of section 3 of RFC 3667. By submitting this Internet-Draft, each
19 author represents that any applicable patent or other IPR claims of
20 which he or she is aware have been or will be disclosed, and any of
21 which he or she become aware will be disclosed, in accordance with
24 Internet-Drafts are working documents of the Internet Engineering
25 Task Force (IETF), its areas, and its working groups. Note that
26 other groups may also distribute working documents as
29 Internet-Drafts are draft documents valid for a maximum of six months
30 and may be updated, replaced, or obsoleted by other documents at any
31 time. It is inappropriate to use Internet-Drafts as reference
32 material or to cite them other than as "work in progress."
34 The list of current Internet-Drafts can be accessed at
35 http://www.ietf.org/ietf/1id-abstracts.txt.
37 The list of Internet-Draft Shadow Directories can be accessed at
38 http://www.ietf.org/shadow.html.
40 This Internet-Draft will expire on June 15, 2005.
44 Copyright (C) The Internet Society (2004).
48 This document specifies a negotiation mechanism for the Generic
49 Security Service Application Program Interface (GSS-API) which is
50 described in RFC 2743.
55 Zhu, et al. Expires June 15, 2005 [Page 1]
57 Internet-Draft GSS-API Negotiation Mechanism December 2004
60 GSS-API peers can use this negotiation mechanism to choose from a
61 common set of security mechanisms.
63 If per-message integrity services are available on the established
64 mechanism context, then the negotiation is protected against an
65 attacker forcing the selection of a mechanism not desired by the
68 This mechanism replaces RFC 2478 in order to fix defects in that
69 specification and to describe how to interoperate with
70 implementations of that specification commonly deployed on the
75 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3
76 2. Conventions Used in This Document . . . . . . . . . . . . . . 5
77 3. Negotiation Protocol . . . . . . . . . . . . . . . . . . . . . 6
78 3.1 Negotiation Description . . . . . . . . . . . . . . . . . 6
79 3.2 Negotiation Procedure . . . . . . . . . . . . . . . . . . 7
80 4. Token Definitions . . . . . . . . . . . . . . . . . . . . . . 10
81 4.1 Mechanism Types . . . . . . . . . . . . . . . . . . . . . 10
82 4.2 Negotiation Tokens . . . . . . . . . . . . . . . . . . . . 10
83 4.2.1 negTokenInit . . . . . . . . . . . . . . . . . . . . . 11
84 4.2.2 negTokenResp . . . . . . . . . . . . . . . . . . . . . 12
85 5. Processing of mechListMIC . . . . . . . . . . . . . . . . . . 14
86 6. Extensibility . . . . . . . . . . . . . . . . . . . . . . . . 17
87 7. Security Considerations . . . . . . . . . . . . . . . . . . . 18
88 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 19
89 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 20
90 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 21
91 10.1 Normative References . . . . . . . . . . . . . . . . . . . . 21
92 10.2 Informative References . . . . . . . . . . . . . . . . . . . 21
93 Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . 21
94 A. GSS-API Negotiation Support API . . . . . . . . . . . . . . . 23
95 A.1 GSS_Set_neg_mechs call . . . . . . . . . . . . . . . . . . 23
96 A.2 GSS_Get_neg_mechs call . . . . . . . . . . . . . . . . . . 23
97 B. Changes since RFC2478 . . . . . . . . . . . . . . . . . . . . 25
98 C. mechListMIC Computation Example . . . . . . . . . . . . . . . 27
99 Intellectual Property and Copyright Statements . . . . . . . . 28
111 Zhu, et al. Expires June 15, 2005 [Page 2]
113 Internet-Draft GSS-API Negotiation Mechanism December 2004
118 The GSS-API [RFC2743] provides a generic interface which can be
119 layered atop different security mechanisms such that if communicating
120 peers acquire GSS-API credentials for the same security mechanism,
121 then a security context may be established between them (subject to
122 policy). However, GSS-API does not prescribe the method by which
123 GSS-API peers can establish whether they have a common security
126 The Simple and Protected GSS-API Negotiation (SPNEGO) mechanism
127 defined here is a pseudo security mechanism, represented by the
128 Object Identifier iso.org.dod.internet.security.mechanism.snego
129 (1.3.6.1.5.5.2), which enables GSS-API peers to determine in-band
130 whether their credentials support a common set of one or more GSS-API
131 security mechanisms, and if so, to invoke the normal security context
132 establishment for a selected common security mechanism. This is most
133 useful for applications which depend on GSS-API implementations and
134 share multiple mechanisms between the peers.
136 The SPNEGO mechanism negotiation is based on the following model: the
137 initiator proposes a list of security mechanism(s), in decreasing
138 preference order (favorite choice first), the acceptor (also known as
139 the target) either accepts the initiator's preferred security
140 mechanism (the first in the list), or chooses one that is available
141 from the offered list, or rejects the proposed value(s). The target
142 then informs the initiator of its choice.
144 Once a common security mechanism is chosen, mechanism-specific
145 options MAY be negotiated as part of the selected mechanism's context
146 establishment. These negotiations (if any) are internal to the
147 mechanism and opaque to the SPNEGO protocol. As such they are
148 outside the scope of this document.
150 If per-message integrity services are available on the established
151 mechanism security context, then the negotiation is protected to
152 ensure that the mechanism list has not been modified. In cases where
153 an attacker could have materially influenced the negotiation, peers
154 exchange message integrity code (MIC) tokens to confirm the mechanism
155 list has not been modified. If no action of an attacker could have
156 materially modified the outcome of the negotiation, the exchange of
157 MIC tokens is optional (see Section 5). Allowing MIC tokens to be
158 optional in this case provides interoperability with existing
159 implementations while still protecting the negotiation. This
160 interoperability comes at the cost of increased complexity.
162 In order to avoid an extra round trip, the first context
163 establishment token of the initiator's preferred mechanism SHOULD be
167 Zhu, et al. Expires June 15, 2005 [Page 3]
169 Internet-Draft GSS-API Negotiation Mechanism December 2004
172 embedded in the initial negotiation message (as defined in Section
173 4.2). (This mechanism token is referred to as the optimistic
174 mechanism token in this document.) In addition, using the optimistic
175 mechanism token allows the initiator to recover from non-fatal errors
176 encountered trying to produce the first mechanism token before a
177 mechanism can be selected. Implementations MAY omit the optimistic
178 mechanism token in cases where the likelihood of the initiator's
179 preferred mechanism not being selected by the acceptor is significant
180 given the cost of generating it.
182 SPNEGO relies on the concepts developed in the GSS-API specification
183 [RFC2743]. The negotiation data is encapsulated in context-level
184 tokens. Therefore, callers of the GSS-API do not need to be aware of
185 the existence of the negotiation tokens but only of the new
186 pseudo-security mechanism. A failure in the negotiation phase causes
187 a major status code to be returned: GSS_S_BAD_MECH.
223 Zhu, et al. Expires June 15, 2005 [Page 4]
225 Internet-Draft GSS-API Negotiation Mechanism December 2004
228 2. Conventions Used in This Document
230 The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
231 "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
232 document are to be interpreted as described in [RFC2119].
279 Zhu, et al. Expires June 15, 2005 [Page 5]
281 Internet-Draft GSS-API Negotiation Mechanism December 2004
284 3. Negotiation Protocol
286 When the established mechanism context provides integrity protection,
287 the mechanism negotiation can be protected. When acquiring
288 negotiated security mechanism tokens, per-message integrity services
289 are always requested by the SPNEGO mechanism.
291 When the established mechanism context supports per-message integrity
292 services, SPNEGO guarantees that the selected mechanism is mutually
295 This section describes the negotiation process of this protocol.
297 3.1 Negotiation Description
299 The first negotiation token sent by the initiator contains an ordered
300 list of mechanisms in decreasing preference order (favorite mechanism
301 first), and optionally the initial mechanism token for the preferred
302 mechanism of the initiator (i.e., the first in the list). (Note that
303 the list MUST NOT contain mechanisms for which the client does not
304 have appropriate credentials.)
306 The target then processes the token from the initiator. This will
307 result in one of four possible states (as defined in Section 4.2.2)
308 being returned in the reply message: accept_completed,
309 accept_incomplete, reject, or request_mic. A reject state will
310 terminate the negotiation; an accept_completed state indicates that
311 not only was the initiator-selected mechanism acceptable to the
312 target, but also that the optimistic mechanism token was sufficient
313 to complete the authentication; an accept_incomplete state indicates
314 that further message exchange is needed but the MIC token exchange as
315 described in Section 5 is OPTIONAL; a request_mic state (this state
316 can only be present in the first reply message from the target)
317 indicates the MIC token exchange is REQUIRED if per-message integrity
318 services are available.
320 Unless the preference order is specified by the application, the
321 policy by which the target chooses a mechanism is an
322 implementation-specific local matter. In the absence of an
323 application specified preference order or other policy, the target
324 SHALL choose the first mechanism in the initiator proposed list for
325 which it has valid credentials.
327 In case of a successful negotiation, the security mechanism in the
328 first reply message represents the value suitable for the target,
329 chosen from the list offered by the initiator.
331 In case of an unsuccessful negotiation, the reject state is returned
335 Zhu, et al. Expires June 15, 2005 [Page 6]
337 Internet-Draft GSS-API Negotiation Mechanism December 2004
340 and it is OPTIONAL to emit a context level negotiation token.
342 Once a mechanism has been selected, context establishment tokens
343 specific to the selected mechanism are carried within the negotiation
346 Lastly, MIC tokens may be exchanged to ensure the authenticity of the
347 mechanism list received by the target.
349 To avoid conflicts with the use of MIC tokens by SPNEGO,
350 partially-established contexts MUST NOT be used for per-message
351 calls. To guarantee this, the prot_ready_state [RFC2743] MUST be set
352 to false on return from GSS_Init_sec_context() and
353 GSS_Accept_sec_context() even if the underlying mechanism returned
356 3.2 Negotiation Procedure
358 The basic form of the procedure assumes that per-message integrity
359 services are available on the established mechanism context, and it
360 is summarized as follows:
362 (a) The GSS-API initiator invokes GSS_Init_sec_context() as normal,
363 but requests that SPNEGO be used. SPNEGO can either be explicity
364 requested or accepted as the default mechanism.
366 (b) The initiator GSS-API implementation emits a negotiation token
367 containing a list of one or more security mechanisms that are
368 available based on the credentials used for this context
369 establishment, and optionally the initial mechanism token for the
370 first mechanism in the list.
372 (c) The GSS-API initiator application sends the token to the target
373 application. The GSS-API target application deposits the token by
374 invoking GSS_Accept_sec_context(). The acceptor will do one of
378 (I) If none of the proposed mechanisms are acceptable, the
379 negotiation SHALL be terminated. GSS_Accept_sec_context
380 indicates GSS_S_BAD_MECH. The acceptor MAY output a
381 negotiation token containing a reject state.
383 (II) If either the initiator's preferred mechanism is not
384 accepted by the target or this mechanism is accepted but it
385 is not the acceptor's most preferred mechanism (i.e., the
386 MIC token exchange as described in Section 5 is required),
387 GSS_Accept_sec_context() indicates GSS_S_CONTINUE_NEEDED.
391 Zhu, et al. Expires June 15, 2005 [Page 7]
393 Internet-Draft GSS-API Negotiation Mechanism December 2004
396 The acceptor MUST output a negotiation token containing a
399 (III) Otherwise if at least one additional negotiation token
400 from the initiator is needed to establish this context,
401 GSS_Accept_sec_context() indicates GSS_S_CONTINUE_NEEDED and
402 outputs a negotiation token containing an accept_incomplete
405 (IV) Otherwise no additional negotiation token from the
406 initiator is needed to establish this context,
407 GSS_Accept_sec_context() indicates GSS_S_COMPLETE and
408 outputs a negotiation token containing an accept_complete
411 If the initiator's preferred mechanism is accepted, and an
412 optimistic mechanism token was included, this mechanism token MUST
413 be deposited to the selected mechanism by invoking
414 GSS_Accept_sec_context() and if a response mechanism token is
415 emitted, it MUST be included in the response negotiation token.
416 Otherwise, the target will not emit a response mechanism token in
419 (d) The GSS-API target application returns the negotiation token to
420 the initiator application. The GSS-API initiator application
421 deposits the token by invoking GSS_Init_sec_context(). The
422 security context initialization is then continued according to the
423 standard GSS-API conventions for the selected mechanism, where the
424 tokens of the selected mechanism are encapsulated in negotiation
425 messages (see Section 4) until the GSS_S_COMPLETE is returned for
426 both the initiator and the target by the selected security
429 (e) MIC tokens are then either skipped or exchanged according to
432 Note that the *_req_flag input parameters for context establishment
433 are relative to the selected mechanism, as are the *_state output
434 parameters. i.e., these parameters are not applicable to the
435 negotiation process per se.
437 On receipt of a negotiation token on the target side, a GSS-API
438 implementation that does not support negotiation would indicate the
439 GSS_S_BAD_MECH status as if a particular basic security mechanism had
440 been requested and was not supported.
442 When a GSS-API credential is acquired for the SPNEGO mechanism the
443 implementation SHOULD produce a credential element for the SPNEGO
447 Zhu, et al. Expires June 15, 2005 [Page 8]
449 Internet-Draft GSS-API Negotiation Mechanism December 2004
452 mechanism which internally contains GSS-API credential elements for
453 all mechanisms for which the principal has credentials available,
454 except for any mechanisms which are not to be negotiated, either as
455 per implementation-, site- or application-specific policy. See
456 Appendix A for interfaces for expressing application policy.
503 Zhu, et al. Expires June 15, 2005 [Page 9]
505 Internet-Draft GSS-API Negotiation Mechanism December 2004
510 The type definitions in this section assume an ASN.1 module
511 definition of the following form:
515 iso(1) identified-organization(3) dod(6) internet(1)
516 security(5) mechanism(5) snego (2) modules(4) spec2(2)
517 } DEFINITIONS EXPLICIT TAGS ::= BEGIN
519 -- rest of definitions here
524 This specifies that the tagging context for the module will be
525 explicit and non-automatic.
527 The encoding of SPNEGO protocol messages shall obey the Distinguished
528 Encoding Rules (DER) of ASN.1 as described in [X690].
532 In this negotiation model, each OID represents one GSS-API mechanism
533 or one variant (see Section 6) of it according to [RFC2743].
536 MechType ::= OBJECT IDENTIFIER
537 -- OID represents each security mechanism as suggested by
540 MechTypeList ::= SEQUENCE OF MechType
543 4.2 Negotiation Tokens
545 The syntax of the initial negotiation tokens follows the
546 initialContextToken syntax defined in Section 3.1 of [RFC2743]. The
547 SPNEGO pseudo mechanism is identified by the Object Identifier
548 specified in Section 1. Subsequent tokens MUST NOT be encapsulated
549 in this GSS-API generic token framing.
551 This section specifies the syntax of the inner token for the initial
552 message and the syntax of subsequent context establishment tokens.
554 NegotiationToken ::= CHOICE {
555 negTokenInit [0] NegTokenInit,
559 Zhu, et al. Expires June 15, 2005 [Page 10]
561 Internet-Draft GSS-API Negotiation Mechanism December 2004
564 negTokenResp [1] negTokenResp
571 NegTokenInit ::= SEQUENCE {
572 mechTypes [0] MechTypeList,
573 reqFlags [1] ContextFlags OPTIONAL,
574 -- maintained from RFC 2478 for backward compatibility,
575 -- RECOMMENDED to be left out
576 mechToken [2] OCTET STRING OPTIONAL,
577 mechListMIC [3] OCTET STRING OPTIONAL,
580 ContextFlags ::= BIT STRING {
590 This is the syntax for the inner token of the initial negotiation
595 This field contains one or more security mechanisms available
596 for the initiator in decreasing preference order (favorite
601 This field, if present, contains the service options that are
602 requested to establish the context. The context flags SHOULD
603 be filled in from the req_flags parameter of
604 GSS_Init_sec_context(). This field SHALL NOT have impact on
609 This field, if present, contains the optimistic mechanism
615 Zhu, et al. Expires June 15, 2005 [Page 11]
617 Internet-Draft GSS-API Negotiation Mechanism December 2004
622 This field, if present, contains a MIC token for the mechanism
623 list in the initial negotiation message. This MIC token is
624 computed according to Section 5.
629 NegTokenResp ::= SEQUENCE {
630 negState [0] ENUMERATED {
631 accept_completed (0),
632 accept_incomplete (1),
636 -- REQUIRED in the first reply from the target
637 supportedMech [1] MechType OPTIONAL,
638 -- present only in the first reply from the target
639 responseToken [2] OCTET STRING OPTIONAL,
640 mechListMIC [3] OCTET STRING OPTIONAL,
644 This is the syntax for all subsequent negotiation messages.
648 This field, if present, contains the state of the negotiation.
653 No further negotiation message from the peer is expected,
654 and the security context is established for the sender.
658 At least one more negotiation message from the peer is
659 needed to establish the security context.
663 The sender terminates the negotiation.
671 Zhu, et al. Expires June 15, 2005 [Page 12]
673 Internet-Draft GSS-API Negotiation Mechanism December 2004
678 The sender indicates that the exchange of MIC tokens, as
679 described in Section 5, will be REQUIRED if per-message
680 integrity services are available on the mechanism context to
681 be established. This value SHALL only be present in the
682 first reply from the target.
684 This field is REQUIRED in the first reply from the target, and
685 it is OPTIONAL thereafter. When negState is absent the actual
686 state should be inferred from the state of the negotiated
691 This field SHALL only be present in the first reply from the
692 target. It MUST be one of the mechanism(s) offered by the
697 This field, if present, contains tokens specific to the
702 This field, if present, contains a MIC token for the mechanism
703 list in the initial negotiation message. This MIC token is
704 computed according to Section 5.
727 Zhu, et al. Expires June 15, 2005 [Page 13]
729 Internet-Draft GSS-API Negotiation Mechanism December 2004
732 5. Processing of mechListMIC
734 If the mechanism selected by the negotiation does not support
735 integrity protection, then no mechlistMIC token is used.
737 Otherwise, if the accepted mechanism is the most preferred mechanism
738 of both the initiator and the acceptor, then the MIC token exchange,
739 as described later in this section, is OPTIONAL. A mechanism is the
740 acceptor's most preferred mechanism if there is no other mechanism
741 which, had it been present in the mechanism list, the acceptor would
742 have preferred over the accepted mechanism.
744 In all other cases, MIC tokens MUST be exchanged after the mechanism
745 context is fully established.
747 a) The mechlistMIC token (or simply the MIC token) is computed over
748 the mechanism list in the initial negotiation message by invoking
749 GSS_GetMIC() as follows: the input context_handle is the
750 established mechanism context, the input qop_req is 0, and the
751 input message is the DER encoding of the value of type
752 MechTypeList which is contained in the "mechTypes" field of the
753 NegTokenInit. The input message is NOT the DER encoding of the
754 type "[0] MechTypeList".
756 b) If the selected mechanism exchanges an even number of mechanism
757 tokens (i.e., the acceptor sends the last mechanism token), the
758 acceptor does the following when emitting the negotiation message
759 containing the last mechanism token: if the MIC token exchange is
760 optional, GSS_Accept_sec_context() either indicates GSS_S_COMPLETE
761 and does not include a mechlistMIC token, or indicates
762 GSS_S_CONTINUE_NEEDED and includes a mechlistMIC token and an
763 accept_incomplete state; if the MIC token exchange is required,
764 GSS_Accept_sec_context() indicates GSS_S_CONTINUE_NEEDED, and
765 includes a mechlistMIC token. Acceptors that wish to be
766 compatible with legacy Windows SPNEGO implementations as described
767 in Appendix B should not generate a mechlistMIC token when the MIC
768 token exchange is not required. The initiator then processes the
769 last mechanism token, and does one of the following:
771 (I) If a mechlistMIC token was included, and is correctly
772 verified, GSS_Init_sec_context() indicates GSS_S_COMPLETE. The
773 output negotiation message contains a mechlistMIC token, and an
774 accept_complete state. The acceptor MUST then verify this
783 Zhu, et al. Expires June 15, 2005 [Page 14]
785 Internet-Draft GSS-API Negotiation Mechanism December 2004
788 (II) If a mechlistMIC token was included but is incorrect, the
789 negotiation SHALL be terminated. GSS_Init_sec_context()
790 indicates GSS_S_DEFECTIVE_TOKEN.
792 (III) If no mechlistMIC token was included, and the MIC token
793 exchange is not required, GSS_Init_sec_context() indicates
794 GSS_S_COMPLETE with no output token.
796 (IV) If no mechlistMIC token was included, but the MIC token
797 exchange is required, the negotiation SHALL be terminated.
798 GSS_Accept_sec_context() indicates GSS_S_DEFECTIVE_TOKEN.
800 c) In the case that the chosen mechanism exchanges an odd number of
801 mechanism tokens (i.e., the initiator sends the last mechanism
802 token), the initiator does the following when emitting the
803 negotiation message containing the last mechanism token: if the
804 negState was request_mic in the first reply from the target, a
805 mechlistMIC token MUST be included, otherwise the mechlistMIC
806 token is OPTIONAL. (Note that the MIC token exchange is required
807 if a mechanism other than the initiator's first choice is chosen.)
808 In the case that the optimistic mechanism token is the only
809 mechanism token for the initiator's preferred mechanism, the
810 mechlistMIC token is OPTIONAL. Whether or not the mechlistMIC
811 token is included, GSS_Init_sec_context() indicates
812 GSS_S_CONTINUE_NEEDED. Initiators that wish to be compatible with
813 legacy Windows SPNEGO implementations as described in Appendix B
814 should not generate a mechlistMIC token when the MIC token
815 exchange is not required. The acceptor then processes the last
816 mechanism token and does one of the following:
818 (I) If a mechlistMIC token was included and is correctly verified,
819 GSS_Accept_sec_context() indicates GSS_S_COMPLETE. The output
820 negotiation message contains a mechlistMIC token and an
821 accept_complete state. The initiator MUST then verify this
824 (II) If a mechlistMIC token was included but is incorrect, the
825 negotiation SHALL be terminated. GSS_Accept_sec_context()
826 indicates GSS_S_DEFECTIVE_TOKEN.
828 (III) If no mechlistMIC token was included but the mechlistMIC
829 token exchange is not required, GSS_Accept_sec_context()
830 indicates GSS_S_COMPLETE. The output negotiation message
831 contains an accept_complete state.
839 Zhu, et al. Expires June 15, 2005 [Page 15]
841 Internet-Draft GSS-API Negotiation Mechanism December 2004
844 (IV) In the case that the optimistic mechanism token is also the
845 last mechanism token (when the initiator's preferred mechanism
846 is accepted by the target) and the target sends a request_mic
847 state but the initiator did not send a mechlistMIC token, the
848 target then MUST include a mechlistMIC token in that first
849 reply. GSS_Accept_sec_context() indicates
850 GSS_S_CONTINUE_NEEDED. The initiator MUST verify the received
851 mechlistMIC token and generate a mechlistMIC token to send back
852 to the target. The target SHALL in turn verify the returned
853 mechlistMIC token and complete the negotiation.
855 (V) If no mechlistMIC token was included and the acceptor sent a
856 request_mic state in the first reply message (the exchange of
857 MIC tokens is required), the negotiation SHALL be terminated.
858 GSS_Accept_sec_context() indicates GSS_S_DEFECTIVE_TOKEN.
895 Zhu, et al. Expires June 15, 2005 [Page 16]
897 Internet-Draft GSS-API Negotiation Mechanism December 2004
902 Two mechanisms are provided for extensibility. First, the ASN.1
903 structures in this specification MAY be expanded by IETF standards
904 action. Implementations receiving unknown fields MUST ignore these
907 Secondly, OIDs corresponding to a desired mechanism attribute (i.e.,
908 mechanism variants) may be included in the set of preferred
909 mechanisms by an initiator. The acceptor can choose to honor this
910 request by preferring mechanisms that have the included attributes.
911 Future work within the Kitten working group is expected to
912 standardize common attributes that SPNEGO mechanisms may wish to
913 support. At this time it is sufficient to say that initiators MAY
914 include OIDs that do not correspond to mechanisms. Such OIDs MAY
915 influence the acceptor's choice of mechanism. As discussed in
916 Section 5, if there are mechanisms that if present in the initiator's
917 list of mechanisms might be preferred by the acceptor to the
918 initiator's preferred mechanism, the acceptor MUST demand the MIC
919 token exchange. As a consequence, acceptors MUST demand the MIC
920 token exchange if they support negotiation of attributes not
921 available in the initiator's preferred mechanism regardless of
922 whether the initiator actually requested these attributes.
951 Zhu, et al. Expires June 15, 2005 [Page 17]
953 Internet-Draft GSS-API Negotiation Mechanism December 2004
956 7. Security Considerations
958 In order to produce the MIC token for the mechanism list, the
959 mechanism must provide integrity protection. When the selected
960 mechanism does not support integrity protection, the negotiation is
961 vulnerable: an active attacker can force it to use a security
962 mechanism that is not mutually preferred but is acceptable to the
965 This protocol provides the following guarantees when per-message
966 integrity services are available on the established mechanism context
967 and the mechanism list was altered by an adversary such that a
968 mechanism which is not mutually preferred could be selected:
970 a) If the last mechanism token is sent by the initiator, both peers
972 b) If the last mechanism token is sent by the acceptor, the acceptor
973 shall not complete and the initiator at worst shall complete with
974 its preferred mechanism being selected.
976 The negotiation may not be terminated if an alteration was made but
977 it had no material impact.
979 The protection of the negotiation depends on the strength of the
980 integrity protection. In particular, the strength of SPNEGO is no
981 stronger than the integrity protection of the weakest mechanism
982 acceptable to GSS-API peers.
984 In all cases, the communicating peers are exposed to the denial of
1007 Zhu, et al. Expires June 15, 2005 [Page 18]
1009 Internet-Draft GSS-API Negotiation Mechanism December 2004
1012 8. IANA Considerations
1014 This document has no actions for IANA.
1063 Zhu, et al. Expires June 15, 2005 [Page 19]
1065 Internet-Draft GSS-API Negotiation Mechanism December 2004
1070 The authors wish to thank Sam Hartman, Nicolas Williams, Ken Raeburn,
1071 Jeff Altman, Tom Yu, Cristian Ilac and Martin Rex for their comments
1072 and suggestions during development of this document.
1074 Luke Howard provided a prototype of this protocol in Heimdal and
1075 resolved several issues in the initial draft.
1077 Eric Baize and Denis Pinkas wrote the original SPNEGO specification
1078 [RFC2478] of which some of the text has been retained in this
1119 Zhu, et al. Expires June 15, 2005 [Page 20]
1121 Internet-Draft GSS-API Negotiation Mechanism December 2004
1126 10.1 Normative References
1128 [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate
1129 Requirement Levels", BCP 14, RFC 2119, March 1997.
1131 [RFC2743] Linn, J., "Generic Security Service Application Program
1132 Interface Version 2, Update 1", RFC 2743, January 2000.
1134 [X690] ASN.1 encoding rules: Specification of Basic Encoding
1135 Rules (BER), Canonical Encoding Rules (CER) and
1136 Distinguished Encoding Rules (DER), ITU-T Recommendation
1137 X.690 (1997) | ISO/IEC International Standard 8825-1:1998.
1139 10.2 Informative References
1141 [RFC2478] Baize, E. and D. Pinkas, "The Simple and Protected GSS-API
1142 Negotiation Mechanism", RFC 2478, December 1998.
1148 Microsoft Corporation
1153 EMail: lzhu@microsoft.com
1157 Microsoft Corporation
1162 EMail: paulle@microsoft.com
1166 Microsoft Corporation
1171 EMail: karthikj@microsoft.com
1176 Zhu, et al. Expires June 15, 2005 [Page 21]
1178 Internet-Draft GSS-API Negotiation Mechanism December 2004
1183 1775 Wiehle Avenue, 2nd Floor
1187 EMail: wyllys.ingersoll@sun.com
1232 Zhu, et al. Expires June 15, 2005 [Page 22]
1234 Internet-Draft GSS-API Negotiation Mechanism December 2004
1237 Appendix A. GSS-API Negotiation Support API
1239 In order to provide to a GSS-API caller (either the initiator or the
1240 target or both) the ability to choose among the set of supported
1241 mechanisms a reduced set of mechanisms for negotiation, two
1242 additional APIs are defined:
1244 o GSS_Get_neg_mechs() indicates the set of security mechanisms
1245 available on the local system to the caller for negotiation, for
1246 which appropriate credentials are available.
1247 o GSS_Set_neg_mechs() specifies the set of security mechanisms to be
1248 used on the local system by the caller for negotiation, for the
1251 A.1 GSS_Set_neg_mechs call
1255 o cred_handle CREDENTIAL HANDLE, -- NULL specifies default
1257 o mech_set SET OF OBJECT IDENTIFIER
1261 o major_status INTEGER,
1262 o minor_status INTEGER
1264 Return major_status codes:
1266 o GSS_S_COMPLETE indicates that the set of security mechanisms
1267 available for negotiation has been set to mech_set.
1268 o GSS_S_FAILURE indicates that the requested operation could not be
1269 performed for reasons unspecified at the GSS-API level.
1271 Allows callers to specify the set of security mechanisms that may be
1272 negotiated with the credential identified by cred_handle. This call
1273 is intended for support of specialized callers who need to restrict
1274 the set of negotiable security mechanisms from the set of all
1275 security mechanisms available to the caller (based on available
1276 credentials). Note that if more than one mechanism is specified in
1277 mech_set, the order in which those mechanisms are specified implies a
1278 relative preference.
1280 A.2 GSS_Get_neg_mechs call
1288 Zhu, et al. Expires June 15, 2005 [Page 23]
1290 Internet-Draft GSS-API Negotiation Mechanism December 2004
1293 o cred_handle CREDENTIAL HANDLE -- NULL specifies default
1298 o major_status INTEGER,
1299 o minor_status INTEGER,
1300 o mech_set SET OF OBJECT IDENTIFIER
1302 Return major_status codes:
1304 o GSS_S_COMPLETE indicates that the set of security mechanisms
1305 available for negotiation has been returned in mech_set.
1306 o GSS_S_FAILURE indicates that the requested operation could not be
1307 performed for reasons unspecified at the GSS-API level.
1309 Allows callers to determine the set of security mechanisms available
1310 for negotiation with the credential identified by cred_handle. This
1311 call is intended for support of specialized callers who need to
1312 reduce the set of negotiable security mechanisms from the set of
1313 supported security mechanisms available to the caller (based on
1314 available credentials).
1316 Note: The GSS_Indicate_mechs() function indicates the full set of
1317 mechanism types available on the local system. Since this call has
1318 no input parameter, the returned set is not necessarily available for
1344 Zhu, et al. Expires June 15, 2005 [Page 24]
1346 Internet-Draft GSS-API Negotiation Mechanism December 2004
1349 Appendix B. Changes since RFC2478
1351 SPNEGO implementations in Windows 2000/Windows XP/Windows Server
1352 2003 have the following behavior: no mechlistMIC is produced and
1353 mechlistMIC is not processed if one is provided; if the initiator
1354 sends the last mechanism token, the acceptor will send back a
1355 negotiation token with an accept_complete state and no mechlistMIC
1356 token. In addition, an incorrect OID (1.2.840.48018.1.2.2) can be
1357 used to identify the GSS-API Kerberos Version 5 mechanism.
1359 The following changes have been made to be compatible with these
1360 legacy implementations.
1362 * NegTokenTarg is changed to negTokenResp and it is the message
1363 format for all subsequent negotiation tokens.
1364 * NegTokenInit is the message for the initial negotiation message
1365 and that message only.
1366 * mechTypes in negTokenInit is not optional.
1367 * If the selected mechanism is also the most preferred mechanism
1368 for both peers, it is safe to omit the MIC tokens.
1370 If at least one of the two peers implements the updated pseudo
1371 mechanism in this document, the negotiation is protected.
1373 The following changes are to address the problems in RFC 2478.
1375 * reqFlags is not protected therefore it should not impact the
1377 * DER encoding is required.
1378 * GSS_GetMIC() input is clarified.
1379 * Per-message integrity services are requested for the negotiated
1381 * Two MIC tokens are exchanged, one in each direction.
1383 An implementation that conforms to this specification will not
1384 interoperate with a strict 2748 implementation. Even if the new
1385 implementation always sends a mechlistMIC token, it will still fail
1386 to interoperate. If it is a server, it will fail because it requests
1387 a mechlistMIC token using an option that older implementations simply
1388 do not support. Clients will tend to fail as well.
1390 As an alternative to the approach chosen in this specification, we
1391 could have documented a correct behavior that is fully backward
1392 compatible with RFC 2478 and included an appendix on how to
1393 interoperate with existing incorrect implementations of RFC 2478.
1395 As a practical matter, the SPNEGO implementers within the IETF have
1396 valued interoperability with the Microsoft implementations. We were
1400 Zhu, et al. Expires June 15, 2005 [Page 25]
1402 Internet-Draft GSS-API Negotiation Mechanism December 2004
1405 unable to choose to maintain reasonable security guarantees, maintain
1406 interoperability with the Microsoft implementations and maintain
1407 interoperability with correct implementations of RFC 2478. The
1408 working group was not aware of any RFC 2478 implementations deployed
1409 on the Internet. Even if there are such implementations, it is
1410 unlikely that they will interoperate because of a critical flaw in
1411 the description of the encoding of the mechanism list in RFC 2478.
1413 With the approach taken in this specification, security is ensured
1414 between new implementations all the time while maintaining
1415 interoperability with the implementations deployed within the IETF
1416 community. The working group believes that this justifies breaking
1417 compatibility with a correct implementation of RFC 2478.
1456 Zhu, et al. Expires June 15, 2005 [Page 26]
1458 Internet-Draft GSS-API Negotiation Mechanism December 2004
1461 Appendix C. mechListMIC Computation Example
1463 The following is an example to illustrate how the mechListMIC field
1466 The initial part of the DER encoding of NegTokenInit is constructed
1467 as follows (the "nn" are length encodings, possibly longer than one
1470 30 -- identifier octet for constructed SEQUENCE (NegTokenInit)
1473 -- contents octets of the SEQUENCE begin with
1474 -- DER encoding of "[0] MechTypeList":
1475 A0 -- identifier octet for constructed [0]
1478 -- contents of the constructed [0] are DER encoding
1479 -- of MechTypeList (which is a SEQUENCE):
1480 30 -- identifier octet for constructed SEQUENCE
1483 -- contents octets of the SEQUENCE begin with
1484 -- DER encoding of OBJECT IDENTIFIER:
1485 06 -- identifier octet for primitive OBJECT IDENTIFIER
1487 2A 86 48 86 F7 12 01 02 02 -- Kerberos V5
1488 -- {1 2 840 113554 1 2 2}
1490 If a mechlistMIC needs to be generated (according to the rules in
1491 Section 5), it is computed by using the DER encoding of the type
1492 MechTypeList data from the initiator's NegTokenInit token as input to
1493 the GSS_GetMIC() function. In this case, the MIC would be computed
1494 over the following octets:
1496 DER encoding of MechTypeList:
1497 30 nn 06 09 2A 86 48 86 F7 12 01 02 02 ...
1499 Note that the identifier octet and lengh octet(s) for constructed [0]
1500 (A0 nn) are not included in the MIC computation.
1512 Zhu, et al. Expires June 15, 2005 [Page 27]
1514 Internet-Draft GSS-API Negotiation Mechanism December 2004
1517 Intellectual Property Statement
1519 The IETF takes no position regarding the validity or scope of any
1520 Intellectual Property Rights or other rights that might be claimed to
1521 pertain to the implementation or use of the technology described in
1522 this document or the extent to which any license under such rights
1523 might or might not be available; nor does it represent that it has
1524 made any independent effort to identify any such rights. Information
1525 on the procedures with respect to rights in RFC documents can be
1526 found in BCP 78 and BCP 79.
1528 Copies of IPR disclosures made to the IETF Secretariat and any
1529 assurances of licenses to be made available, or the result of an
1530 attempt made to obtain a general license or permission for the use of
1531 such proprietary rights by implementers or users of this
1532 specification can be obtained from the IETF on-line IPR repository at
1533 http://www.ietf.org/ipr.
1535 The IETF invites any interested party to bring to its attention any
1536 copyrights, patents or patent applications, or other proprietary
1537 rights that may cover technology that may be required to implement
1538 this standard. Please address the information to the IETF at
1542 Disclaimer of Validity
1544 This document and the information contained herein are provided on an
1545 "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
1546 OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
1547 ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
1548 INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
1549 INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
1550 WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
1555 Copyright (C) The Internet Society (2004). This document is subject
1556 to the rights, licenses and restrictions contained in BCP 78, and
1557 except as set forth therein, the authors retain all their rights.
1562 Funding for the RFC Editor function is currently provided by the
1568 Zhu, et al. Expires June 15, 2005 [Page 28]