| < draft-ietf-kitten-sasl-oauth-19.txt | draft-ietf-kitten-sasl-oauth-20.txt > | |||
|---|---|---|---|---|
| KITTEN W. Mills | KITTEN W. Mills | |||
| Internet-Draft Microsoft | Internet-Draft Microsoft | |||
| Intended status: Standards Track T. Showalter | Intended status: Standards Track T. Showalter | |||
| Expires: July 24, 2015 | Expires: October 18, 2015 | |||
| H. Tschofenig | H. Tschofenig | |||
| ARM Ltd. | ARM Ltd. | |||
| January 20, 2015 | April 16, 2015 | |||
| A set of SASL Mechanisms for OAuth | A set of SASL Mechanisms for OAuth | |||
| draft-ietf-kitten-sasl-oauth-19.txt | draft-ietf-kitten-sasl-oauth-20.txt | |||
| Abstract | Abstract | |||
| OAuth enables a third-party application to obtain limited access to a | OAuth enables a third-party application to obtain limited access to a | |||
| protected resource, either on behalf of a resource owner by | protected resource, either on behalf of a resource owner by | |||
| orchestrating an approval interaction, or by allowing the third-party | orchestrating an approval interaction, or by allowing the third-party | |||
| application to obtain access on its own behalf. | application to obtain access on its own behalf. | |||
| This document defines how an application client uses credentials | This document defines how an application client uses credentials | |||
| obtained via OAuth over the Simple Authentication and Security Layer | obtained via OAuth over the Simple Authentication and Security Layer | |||
| skipping to change at page 2, line 4 ¶ | skipping to change at page 2, line 4 ¶ | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on July 24, 2015. | This Internet-Draft will expire on October 18, 2015. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2015 IETF Trust and the persons identified as the | Copyright (c) 2015 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| skipping to change at page 2, line 37 ¶ | skipping to change at page 2, line 37 ¶ | |||
| 3.1.1. Reserved Key/Values . . . . . . . . . . . . . . . . . 8 | 3.1.1. Reserved Key/Values . . . . . . . . . . . . . . . . . 8 | |||
| 3.2. Server's Response . . . . . . . . . . . . . . . . . . . . 8 | 3.2. Server's Response . . . . . . . . . . . . . . . . . . . . 8 | |||
| 3.2.1. OAuth Identifiers in the SASL Context . . . . . . . . 9 | 3.2.1. OAuth Identifiers in the SASL Context . . . . . . . . 9 | |||
| 3.2.2. Server Response to Failed Authentication . . . . . . 9 | 3.2.2. Server Response to Failed Authentication . . . . . . 9 | |||
| 3.2.3. Completing an Error Message Sequence . . . . . . . . 10 | 3.2.3. Completing an Error Message Sequence . . . . . . . . 10 | |||
| 3.3. OAuth Access Token Types using Keyed Message Digests . . 10 | 3.3. OAuth Access Token Types using Keyed Message Digests . . 10 | |||
| 4. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 11 | 4. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . 11 | |||
| 4.1. Successful Bearer Token Exchange . . . . . . . . . . . . 12 | 4.1. Successful Bearer Token Exchange . . . . . . . . . . . . 12 | |||
| 4.2. Successful OAuth 1.0a Token Exchange . . . . . . . . . . 13 | 4.2. Successful OAuth 1.0a Token Exchange . . . . . . . . . . 13 | |||
| 4.3. Failed Exchange . . . . . . . . . . . . . . . . . . . . . 13 | 4.3. Failed Exchange . . . . . . . . . . . . . . . . . . . . . 13 | |||
| 4.4. SMTP Example of a Failed Negotiation . . . . . . . . . . 15 | 4.4. SMTP Example of a Failed Negotiation . . . . . . . . . . 14 | |||
| 5. Security Considerations . . . . . . . . . . . . . . . . . . . 15 | 5. Security Considerations . . . . . . . . . . . . . . . . . . . 15 | |||
| 6. Internationalization Considerations . . . . . . . . . . . . . 17 | 6. Internationalization Considerations . . . . . . . . . . . . . 16 | |||
| 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 17 | 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 7.1. SASL Registration . . . . . . . . . . . . . . . . . . . . 17 | 7.1. SASL Registration . . . . . . . . . . . . . . . . . . . . 17 | |||
| 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 18 | 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 17 | |||
| 8.1. Normative References . . . . . . . . . . . . . . . . . . 18 | 8.1. Normative References . . . . . . . . . . . . . . . . . . 17 | |||
| 8.2. Informative References . . . . . . . . . . . . . . . . . 19 | 8.2. Informative References . . . . . . . . . . . . . . . . . 18 | |||
| Appendix A. Acknowlegements . . . . . . . . . . . . . . . . . . 19 | Appendix A. Acknowlegements . . . . . . . . . . . . . . . . . . 19 | |||
| Appendix B. Document History . . . . . . . . . . . . . . . . . . 20 | Appendix B. Document History . . . . . . . . . . . . . . . . . . 19 | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 23 | Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 23 | |||
| 1. Introduction | 1. Introduction | |||
| OAuth 1.0a [RFC5849] and OAuth 2.0 [RFC6749] are protocol frameworks | OAuth 1.0a [RFC5849] and OAuth 2.0 [RFC6749] are protocol frameworks | |||
| that enable a third-party application to obtain limited access to a | that enable a third-party application to obtain limited access to a | |||
| protected resource, either on behalf of a resource owner by | protected resource, either on behalf of a resource owner by | |||
| orchestrating an approval interaction, or by allowing the third-party | orchestrating an approval interaction, or by allowing the third-party | |||
| application to obtain access on its own behalf. | application to obtain access on its own behalf. | |||
| skipping to change at page 3, line 24 ¶ | skipping to change at page 3, line 24 ¶ | |||
| between the OAuth client and the authorization server; it does not | between the OAuth client and the authorization server; it does not | |||
| define the interaction between the OAuth client and the resource | define the interaction between the OAuth client and the resource | |||
| server for the access to a protected resource using an Access Token. | server for the access to a protected resource using an Access Token. | |||
| Instead, the OAuth client to resource server interaction is described | Instead, the OAuth client to resource server interaction is described | |||
| in separate specifications, such as the bearer token specification | in separate specifications, such as the bearer token specification | |||
| [RFC6750]. OAuth 1.0a included the protocol specification for the | [RFC6750]. OAuth 1.0a included the protocol specification for the | |||
| communication between the OAuth client and the resource server in | communication between the OAuth client and the resource server in | |||
| [RFC5849]. | [RFC5849]. | |||
| The main use cases for OAuth 2.0 and OAuth 1.0a have so far focused | The main use cases for OAuth 2.0 and OAuth 1.0a have so far focused | |||
| on an HTTP-based [RFC2616] environment only. This document | on an HTTP-based [RFC7230] environment only. This document | |||
| integrates OAuth 1.0a and OAuth 2.0 into non-HTTP-based applications | integrates OAuth 1.0a and OAuth 2.0 into non-HTTP-based applications | |||
| using the integration into SASL. Hence, this document takes | using the integration into SASL. Hence, this document takes | |||
| advantage of the OAuth protocol and its deployment base to provide a | advantage of the OAuth protocol and its deployment base to provide a | |||
| way to use the Simple Authentication and Security Layer (SASL) | way to use the Simple Authentication and Security Layer (SASL) | |||
| [RFC4422] to gain access to resources when using non-HTTP-based | [RFC4422] to gain access to resources when using non-HTTP-based | |||
| protocols, such as the Internet Message Access Protocol (IMAP) | protocols, such as the Internet Message Access Protocol (IMAP) | |||
| [RFC3501] and the Simple Mail Transfer Protocol (SMTP) [RFC5321], | [RFC3501] and the Simple Mail Transfer Protocol (SMTP) [RFC5321], | |||
| which is what this memo uses in the examples. | which is what this memo uses in the examples. | |||
| To illustrate the impact of integrating this specification into an | To illustrate the impact of integrating this specification into an | |||
| skipping to change at page 4, line 35 ¶ | skipping to change at page 4, line 35 ¶ | |||
| +--------+ +---------------+ | | +--------+ +---------------+ | | |||
| ----+ | ----+ | |||
| Figure 1: OAuth 2.0 Protocol Flow | Figure 1: OAuth 2.0 Protocol Flow | |||
| The Simple Authentication and Security Layer (SASL) is a framework | The Simple Authentication and Security Layer (SASL) is a framework | |||
| for providing authentication and data security services in | for providing authentication and data security services in | |||
| connection-oriented protocols via replaceable authentication | connection-oriented protocols via replaceable authentication | |||
| mechanisms. It provides a structured interface between protocols and | mechanisms. It provides a structured interface between protocols and | |||
| mechanisms. The resulting framework allows new protocols to reuse | mechanisms. The resulting framework allows new protocols to reuse | |||
| existing authentication protocols and allows old protocols to make | existing authentication mechanisms and allows old protocols to make | |||
| use of new authentication mechanisms. The framework also provides a | use of new authentication mechanisms. The framework also provides a | |||
| protocol for securing subsequent exchanges within a data security | protocol for securing subsequent exchanges within a data security | |||
| layer. | layer. | |||
| When OAuth is integrated into SASL the high-level steps are as | When OAuth is integrated into SASL the high-level steps are as | |||
| follows: | follows: | |||
| (A) The client requests authorization from the resource owner. | (A) The client requests authorization from the resource owner. | |||
| The authorization request can be made directly to the resource | The authorization request can be made directly to the resource | |||
| owner (as shown), or preferably indirectly via the authorization | owner (as shown), or preferably indirectly via the authorization | |||
| skipping to change at page 5, line 45 ¶ | skipping to change at page 5, line 45 ¶ | |||
| support the Dynamic Client Registration protocol | support the Dynamic Client Registration protocol | |||
| [I-D.ietf-oauth-dyn-reg]. | [I-D.ietf-oauth-dyn-reg]. | |||
| OAuth 1.0 follows a similar model but uses a different terminology | OAuth 1.0 follows a similar model but uses a different terminology | |||
| and does not separate the resource server from the authorization | and does not separate the resource server from the authorization | |||
| server. | server. | |||
| 2. Terminology | 2. Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| document are to be interpreted as described in [RFC2119]. | "OPTIONAL" in this document are to be interpreted as described in | |||
| [RFC2119]. | ||||
| The reader is assumed to be familiar with the terms used in the OAuth | The reader is assumed to be familiar with the terms used in the OAuth | |||
| 2.0 specification [RFC6749] and SASL [RFC4422]. | 2.0 specification [RFC6749] and SASL [RFC4422]. | |||
| In examples, "C:" and "S:" indicate lines sent by the client and | In examples, "C:" and "S:" indicate lines sent by the client and | |||
| server respectively. Line breaks have been inserted for readability. | server respectively. Line breaks have been inserted for readability. | |||
| Note that the IMAP SASL specification requires base64 encoding, see | Note that the IMAP SASL specification requires base64 encoding, see | |||
| Section 4 of [RFC4648], not this memo. | Section 4 of [RFC4648], not this memo. | |||
| 3. OAuth SASL Mechanism Specifications | 3. OAuth SASL Mechanism Specifications | |||
| SASL is used as an authentication framework in a variety of | SASL is used as an authentication framework in a variety of | |||
| application layer protocols. This document defines the following | application layer protocols. This document defines the following | |||
| SASL mechanisms for usage with OAuth: | SASL mechanisms for usage with OAuth: | |||
| OAUTHBEARER: OAuth 2.0 bearer tokens, as described in [RFC6750]. | OAUTHBEARER: OAuth 2.0 bearer tokens, as described in [RFC6750]. | |||
| RFC 6750 uses Transport Layer Security (TLS) to secure the | RFC 6750 uses Transport Layer Security (TLS) [RFC5246] to | |||
| protocol interaction between the client and the resource | secure the protocol interaction between the client and the | |||
| server. | resource server. | |||
| OAUTH10A: OAuth 1.0a MAC tokens (using the HMAC-SHA1 keyed | OAUTH10A: OAuth 1.0a MAC tokens (using the HMAC-SHA1 keyed | |||
| message digest), as described in Section 3.4.2 of [RFC5849]. | message digest), as described in Section 3.4.2 of [RFC5849]. | |||
| New extensions may be defined to add additional OAuth Access Token | New extensions may be defined to add additional OAuth Access Token | |||
| Types. Such a new SASL OAuth mechanism can be added by simply | Types. Such a new SASL OAuth mechanism can be added by simply | |||
| registering the new name(s) and citing this specification for the | registering the new name(s) and citing this specification for the | |||
| further definition. | further definition. | |||
| These mechanisms are client initiated and lock-step, the server | These mechanisms are client initiated and lock-step, the server | |||
| skipping to change at page 7, line 12 ¶ | skipping to change at page 7, line 12 ¶ | |||
| 3. Client sends a dummy client response. | 3. Client sends a dummy client response. | |||
| 4. Server fails the authentication. | 4. Server fails the authentication. | |||
| 3.1. Initial Client Response | 3.1. Initial Client Response | |||
| Client responses are a GS2 [RFC5801] header followed by zero or more | Client responses are a GS2 [RFC5801] header followed by zero or more | |||
| key/value pairs, or may be empty. The gs2-header is defined here for | key/value pairs, or may be empty. The gs2-header is defined here for | |||
| compatibility with GS2 if a GS2 mechanism is formally defined, but | compatibility with GS2 if a GS2 mechanism is formally defined, but | |||
| this document does not define one. These key/value pairs take the | this document does not define one. The key/value pairs take the | |||
| place of the corresponding HTTP headers and values to convey the | place of the corresponding HTTP headers and values to convey the | |||
| information necessary to complete an OAuth style HTTP authorization. | information necessary to complete an OAuth style HTTP authorization. | |||
| Unknown key/value pairs MUST be ignored by the server. The ABNF | Unknown key/value pairs MUST be ignored by the server. The ABNF | |||
| [RFC5234] syntax is: | [RFC5234] syntax is: | |||
| kvsep = %x01 | kvsep = %x01 | |||
| key = 1*(ALPHA) | key = 1*(ALPHA) | |||
| value = *(VCHAR / SP / HTAB / CR / LF ) | value = *(VCHAR / SP / HTAB / CR / LF ) | |||
| kvpair = key "=" value kvsep | kvpair = key "=" value kvsep | |||
| ;;gs2-header = See RFC 5801 | ;;gs2-header = See RFC 5801 | |||
| client_resp = (gs2-header kvsep 0*kvpair kvsep) / kvsep | client_resp = (gs2-header kvsep *kvpair kvsep) / kvsep | |||
| The GS2 header MAY include the user name associated with the resource | The GS2 header MAY include the user name associated with the resource | |||
| being accessed, the "authzid". It is worth noting that application | being accessed, the "authzid". It is worth noting that application | |||
| protocols are allowed to require an authzid, as are specific server | protocols are allowed to require an authzid, as are specific server | |||
| implementations. | implementations. | |||
| The client response consisting of only a single kvsep is used only | The client response consisting of only a single kvsep is used only | |||
| when authentication fails, and is only valid in that context. If | when authentication fails, and is only valid in that context. If | |||
| sent as the first message from the client the server MAY simply fail | sent as the first message from the client the server MAY simply fail | |||
| the authentication without returning discovery information since | the authentication without returning discovery information since | |||
| skipping to change at page 8, line 44 ¶ | skipping to change at page 8, line 44 ¶ | |||
| utilizes a keyed message digest of the request parameters then the | utilizes a keyed message digest of the request parameters then the | |||
| client must provide a client response that satisfies the data | client must provide a client response that satisfies the data | |||
| requirements for the scheme in use. | requirements for the scheme in use. | |||
| The server responds to a successfully verified client message by | The server responds to a successfully verified client message by | |||
| completing the SASL negotiation. The authenticated identity reported | completing the SASL negotiation. The authenticated identity reported | |||
| by the SASL mechanism is the identity securely established for the | by the SASL mechanism is the identity securely established for the | |||
| client with the OAuth credential. The application, not the SASL | client with the OAuth credential. The application, not the SASL | |||
| mechanism, based on local access policy determines whether the | mechanism, based on local access policy determines whether the | |||
| identity reported by the mechanism is allowed access to the requested | identity reported by the mechanism is allowed access to the requested | |||
| resource. Note that the semantics of the authorization identity is | resource. Note that the semantics of the authzid is specified by the | |||
| specified by the SASL framework [RFC4422]. | SASL framework [RFC4422]. | |||
| 3.2.1. OAuth Identifiers in the SASL Context | 3.2.1. OAuth Identifiers in the SASL Context | |||
| In the OAuth framework the client may be authenticated by the | In the OAuth framework the client may be authenticated by the | |||
| authorization server and the resource owner is authenticated to the | authorization server and the resource owner is authenticated to the | |||
| authorization server. OAuth access tokens may contain information | authorization server. OAuth access tokens may contain information | |||
| about the authentication of the resource owner and about the client | about the authentication of the resource owner and about the client | |||
| and may therefore make this information accessible to the resource | and may therefore make this information accessible to the resource | |||
| server. | server. | |||
| skipping to change at page 9, line 29 ¶ | skipping to change at page 9, line 29 ¶ | |||
| For a failed authentication the server returns a JSON [RFC7159] | For a failed authentication the server returns a JSON [RFC7159] | |||
| formatted error result, and fails the authentication. The error | formatted error result, and fails the authentication. The error | |||
| result consists of the following values: | result consists of the following values: | |||
| status (REQUIRED): The authorization error code. Valid error | status (REQUIRED): The authorization error code. Valid error | |||
| codes are defined in the IANA "OAuth Extensions Error Registry" | codes are defined in the IANA "OAuth Extensions Error Registry" | |||
| specified in the OAuth 2 core specification. | specified in the OAuth 2 core specification. | |||
| scope (OPTIONAL): An OAuth scope which is valid to access the | scope (OPTIONAL): An OAuth scope which is valid to access the | |||
| service. This may be empty which implies that unscoped tokens | service. This may be omitted which implies that unscoped | |||
| are required, or a scope value. If a scope is specified then a | tokens are required. If a scope is specified then a single | |||
| single scope is preferred, use of a space separated list of | scope is preferred, use of a space separated list of scopes is | |||
| scopes is NOT RECOMMENDED. | NOT RECOMMENDED. | |||
| openid-configuration (OPTIONAL): The URL for a document following | openid-configuration (OPTIONAL): The URL for a document following | |||
| the OpenID Provider Configuration Information schema as | the OpenID Provider Configuration Information schema as | |||
| described in OpenID Connect Discovery (OIDCD) | described in OpenID Connect Discovery (OIDCD) | |||
| [OpenID.Discovery] section 3 that is appropriate for the user. | [OpenID.Discovery] section 3 that is appropriate for the user. | |||
| As specified in OIDCD this will have the "https" URL scheme. | As specified in OIDCD this will have the "https" URL scheme. | |||
| This document MUST have all OAuth related data elements | This document MUST have all OAuth related data elements | |||
| populated. The server MAY return different URLs for users in | populated. The server MAY return different URLs for users in | |||
| different domains and the client SHOULD NOT cache a single | different domains and the client SHOULD NOT cache a single | |||
| returned value and assume it applies for all users/domains that | returned value and assume it applies for all users/domains that | |||
| the server suports. The returned discovery document SHOULD | the server suports. The returned discovery document SHOULD | |||
| have all data elements required by the OpenID Connect Discovery | have all data elements required by the OpenID Connect Discovery | |||
| specification populated. In addition, the discovery document | specification populated. In addition, the discovery document | |||
| SHOULD contain the 'registration_endpoint' element to learn | SHOULD contain the 'registration_endpoint' element to identify | |||
| about the endpoint to be used with the Dynamic Client | the endpoint to be used with the Dynamic Client Registration | |||
| Registration protocol [I-D.ietf-oauth-dyn-reg] to obtain the | protocol [I-D.ietf-oauth-dyn-reg] to obtain the minimum number | |||
| minimum number of parameters necessary for the OAuth protocol | of parameters necessary for the OAuth protocol exchange to | |||
| exchange to function. Another comparable discovery or client | function. Another comparable discovery or client registration | |||
| registration mechanism MAY be used if available. | mechanism MAY be used if available. | |||
| The use of the 'offline_access' scope, as defined in | The use of the 'offline_access' scope, as defined in | |||
| [OpenID.Core] is RECOMMENDED to give clients the capability to | [OpenID.Core] is RECOMMENDED to give clients the capability to | |||
| explicitly request a refresh token. | explicitly request a refresh token. | |||
| If the resource server provides a scope then the client MUST always | If the resource server provides a scope then the client MUST always | |||
| request scoped tokens from the token endpoint. If the resource | request scoped tokens from the token endpoint. If the resource | |||
| server provides no scope to the client then the client SHOULD presume | server does not return a scope the client SHOULD presume an empty | |||
| an empty scope (unscoped token) is required to access the resource. | scope (unscoped token) is required to access the resource. | |||
| Since clients may interact with a number of application servers, such | Since clients may interact with a number of application servers, such | |||
| as email servers and XMPP servers, they need to have a way to | as email servers and XMPP [RFC6120] servers, they need to have a way | |||
| determine whether dynamic client registration has been performed | to determine whether dynamic client registration has been performed | |||
| already and whether an already available refresh token can be re-used | already and whether an already available refresh token can be re-used | |||
| to obtain an access token for the desired resource server. This | to obtain an access token for the desired resource server. This | |||
| specification RECOMMENDs that a client uses the information in the | specification RECOMMENDs that a client uses the information in the | |||
| 'iss' element defined in OpenID Connect Core [OpenID.Core] to make | 'iss' element defined in OpenID Connect Core [OpenID.Core] to make | |||
| this determination. | this determination. | |||
| 3.2.3. Completing an Error Message Sequence | 3.2.3. Completing an Error Message Sequence | |||
| Section 3.6 of SASL [RFC4422] explicitly prohibits additional | Section 3.6 of SASL [RFC4422] explicitly prohibits additional | |||
| information in an unsuccessful authentication outcome. Therefore, | information in an unsuccessful authentication outcome. Therefore, | |||
| skipping to change at page 11, line 45 ¶ | skipping to change at page 11, line 45 ¶ | |||
| POST&http%3A%2F%2Fexample.com:143%2F&oauth_consumer_key%3D9djdj82h4 | POST&http%3A%2F%2Fexample.com:143%2F&oauth_consumer_key%3D9djdj82h4 | |||
| 8djs9d2%26oauth_nonce%3D7d8f3e4a%26oauth_signature_method%3DHMAC-SH | 8djs9d2%26oauth_nonce%3D7d8f3e4a%26oauth_signature_method%3DHMAC-SH | |||
| A1%26oauth_timestamp%3D137131201%26oauth_token%3Dkkk9d7dh3k39sjv7 | A1%26oauth_timestamp%3D137131201%26oauth_token%3Dkkk9d7dh3k39sjv7 | |||
| 4. Examples | 4. Examples | |||
| These examples illustrate exchanges between IMAP and SMTP clients and | These examples illustrate exchanges between IMAP and SMTP clients and | |||
| servers. All IMAP examples use SASL-IR [RFC4959] and send payload in | servers. All IMAP examples use SASL-IR [RFC4959] and send payload in | |||
| the initial client response. The Bearer Token examples assume | the initial client response. The Bearer Token examples assume | |||
| encrypted transport, if the underlying connection is not already TLS | encrypted transport; if the underlying connection is not already TLS | |||
| then STARTTLS MUST be used as TLS is required in the Bearer Token | then STARTTLS MUST be used as TLS is required in the Bearer Token | |||
| specification. | specification. | |||
| Note to implementers: The SASL OAuth method names are case | Note to implementers: The SASL OAuth method names are case | |||
| insensitive. One example uses "Bearer" but that could as easily be | insensitive. One example uses "Bearer" but that could as easily be | |||
| "bearer", "BEARER", or "BeArEr". | "bearer", "BEARER", or "BeArEr". | |||
| 4.1. Successful Bearer Token Exchange | 4.1. Successful Bearer Token Exchange | |||
| This example shows a successful OAuth 2.0 bearer token exchange in | This example shows a successful OAuth 2.0 bearer token exchange in | |||
| IMAP. Note that line breaks are inserted for readability. The | IMAP. Note that line breaks are inserted for readability. The | |||
| underlying TLS establishment is not shown but is required for using | underlying TLS establishment is not shown but is required for using | |||
| Bearer Tokens per that specification. | Bearer Tokens per that specification. | |||
| S: * OK IMAP4rev1 Server Ready | S: * OK IMAP4rev1 Server Ready | |||
| C: t0 CAPABILITY | C: t0 CAPABILITY | |||
| S: * CAPABILITY IMAP4rev1 AUTH=OAUTHBEARER SASL-IR | S: * CAPABILITY IMAP4rev1 AUTH=OAUTHBEARER SASL-IR | |||
| S: t0 OK Completed | S: t0 OK Completed | |||
| C: t1 AUTH OAUTHBEARER bixhPXVzZXJAZXhhbXBsZS5jb20sAWhvc3Q9c2 | C: t1 AUTH OAUTHBEARER bixhPXVzZXJAZXhhbXBsZS5jb20sAWhvc3Q9c2Vy | |||
| VydmVyLmV4YW1wbGUuY29tAXBvcnQ9MTQzAWF1dGg9QmVhcmVyIHZGOWRmdDRxb | dmVyLmV4YW1wbGUuY29tAXBvcnQ9MTQzAWF1dGg9QmVhcmVyIHZGOWRmd | |||
| VRjMk52YjNSbGNrQmhiSFJoZG1semRHRXVZMjl0Q2c9PQEB | DRxbVRjMk52YjNSbGNrQmhiSFJoZG1semRHRXVZMjl0Q2c9PQEB | |||
| S: t1 OK SASL authentication succeeded | S: t1 OK SASL authentication succeeded | |||
| As required by IMAP [RFC3501], the payloads are base64-encoded. The | As required by IMAP [RFC3501], the payloads are base64-encoded. The | |||
| decoded initial client response (with %x01 represented as ^A and long | decoded initial client response (with %x01 represented as ^A and long | |||
| lines wrapped for readability) is: | lines wrapped for readability) is: | |||
| n,a=user@example.com,^Ahost=server.example.com^Aport=143^A | n,a=user@example.com,^Ahost=server.example.com^Aport=143^A | |||
| auth=Bearer vF9dft4qmTc2Nvb3RlckBhbHRhdmlzdGEuY29tCg==^A^A | auth=Bearer vF9dft4qmTc2Nvb3RlckBhbHRhdmlzdGEuY29tCg==^A^A | |||
| The same credential used in an SMTP exchange is shown below. Note | The same credential used in an SMTP exchange is shown below. Note | |||
| skipping to change at page 12, line 46 ¶ | skipping to change at page 12, line 46 ¶ | |||
| S: 220 mx.example.com ESMTP 12sm2095603fks.9 | S: 220 mx.example.com ESMTP 12sm2095603fks.9 | |||
| C: EHLO sender.example.com | C: EHLO sender.example.com | |||
| S: 250-mx.example.com at your service,[172.31.135.47] | S: 250-mx.example.com at your service,[172.31.135.47] | |||
| S: 250-SIZE 35651584 | S: 250-SIZE 35651584 | |||
| S: 250-8BITMIME | S: 250-8BITMIME | |||
| S: 250-AUTH LOGIN PLAIN OAUTHBEARER | S: 250-AUTH LOGIN PLAIN OAUTHBEARER | |||
| S: 250-ENHANCEDSTATUSCODES | S: 250-ENHANCEDSTATUSCODES | |||
| S: 250-STARTTLS | S: 250-STARTTLS | |||
| S: 250 PIPELINING | S: 250 PIPELINING | |||
| [Negotiate TLS...] | [Negotiate TLS...] | |||
| C: t1 AUTH OAUTHBEARER bixhPXVzZXJAZXhhbXBsZS5jb20sAWhvc3Q9c | C: t1 AUTH OAUTHBEARER bixhPXVzZXJAZXhhbXBsZS5jb20sAWhvc3Q9c2Vy | |||
| 2VydmVyLmV4YW1wbGUuY29tAXBvcnQ9MTQzAWF1dGg9QmVhcmVyIHZGOWRmdDR | dmVyLmV4YW1wbGUuY29tAXBvcnQ9MTQzAWF1dGg9QmVhcmVyIHZGOWRmd | |||
| xbVRjMk52YjNSbGNrQmhiSFJoZG1semRHRXVZMjl0Q2c9PQEB | DRxbVRjMk52YjNSbGNrQmhiSFJoZG1semRHRXVZMjl0Q2c9PQEB | |||
| S: 235 Authentication successful. | S: 235 Authentication successful. | |||
| [connection continues...] | [connection continues...] | |||
| 4.2. Successful OAuth 1.0a Token Exchange | 4.2. Successful OAuth 1.0a Token Exchange | |||
| This IMAP example shows a successful OAuth 1.0a token exchange. Note | This IMAP example shows a successful OAuth 1.0a token exchange. Note | |||
| that line breaks are inserted for readability. This example assumes | that line breaks are inserted for readability. This example assumes | |||
| that TLS is already established. Signature computation is discussed | that TLS is already established. Signature computation is discussed | |||
| in Section 3.3. | in Section 3.3. | |||
| skipping to change at page 14, line 13 ¶ | skipping to change at page 14, line 13 ¶ | |||
| scope. Note that line breaks are inserted for readability. | scope. Note that line breaks are inserted for readability. | |||
| S: * OK IMAP4rev1 Server Ready | S: * OK IMAP4rev1 Server Ready | |||
| C: t0 CAPABILITY | C: t0 CAPABILITY | |||
| S: * CAPABILITY IMAP4rev1 AUTH=OAUTHBEARER SASL-IR | S: * CAPABILITY IMAP4rev1 AUTH=OAUTHBEARER SASL-IR | |||
| S: t0 OK Completed | S: t0 OK Completed | |||
| C: t1 AUTH OAUTHBEARER bixhPXVzZXJAZXhhbXBsZS5jb20sAW | C: t1 AUTH OAUTHBEARER bixhPXVzZXJAZXhhbXBsZS5jb20sAW | |||
| hvc3Q9c2VydmVyLmV4YW1wbGUuY29tAXBvcnQ9MTQzAWF1dGg9AQE= | hvc3Q9c2VydmVyLmV4YW1wbGUuY29tAXBvcnQ9MTQzAWF1dGg9AQE= | |||
| S: + eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxl | S: + eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NvcGUiOiJleGFtcGxl | |||
| X3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4 | X3Njb3BlIiwib3BlbmlkLWNvbmZpZ3VyYXRpb24iOiJodHRwczovL2V4 | |||
| YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWd1cmF0aW9u | YW1wbGUuY29tLy53ZWxsLWtub3duL29wZW5pZC1jb25maWcifQ== | |||
| In0= | ||||
| C: AQ== | C: AQ== | |||
| S: t1 NO SASL authentication failed | S: t1 NO SASL authentication failed | |||
| The decoded initial client response is: | The decoded initial client response is: | |||
| n,a=user@example.com,^Ahost=server.example.com^A | n,a=user@example.com,^Ahost=server.example.com^A | |||
| port=143^Aauth=^A^A | port=143^Aauth=^A^A | |||
| The decoded server error response is: | The decoded server error response is: | |||
| { | { | |||
| "status":"invalid_token", | "status":"invalid_token", | |||
| "scope":"example_scope", | "scope":"example_scope", | |||
| "openid-configuration":"https://example.com/.well-known/openid-configuration" | "openid-configuration":"https://example.com/.well-known/openid-config" | |||
| } | } | |||
| The client responds with the required dummy response, "AQ==" is the | The client responds with the required dummy response, "AQ==" is the | |||
| base64 encoding of the ASCII value 0x01. The same exchange using the | base64 encoding of the ASCII value 0x01. The same exchange using the | |||
| IMAP specific method of cancelling an AUTHENTICATE command sends "*" | IMAP specific method of cancelling an AUTHENTICATE command sends "*" | |||
| and is shown below. | and is shown below. | |||
| S: * OK IMAP4rev1 Server Ready | S: * OK IMAP4rev1 Server Ready | |||
| C: t0 CAPABILITY | C: t0 CAPABILITY | |||
| S: * CAPABILITY IMAP4rev1 AUTH=OAUTHBEARER SASL-IR IMAP4rev1 | S: * CAPABILITY IMAP4rev1 AUTH=OAUTHBEARER SASL-IR IMAP4rev1 | |||
| S: t0 OK Completed | S: t0 OK Completed | |||
| skipping to change at page 15, line 25 ¶ | skipping to change at page 15, line 19 ¶ | |||
| S: 220 mx.example.com ESMTP 12sm2095603fks.9 | S: 220 mx.example.com ESMTP 12sm2095603fks.9 | |||
| C: EHLO sender.example.com | C: EHLO sender.example.com | |||
| S: 250-mx.example.com at your service,[172.31.135.47] | S: 250-mx.example.com at your service,[172.31.135.47] | |||
| S: 250-SIZE 35651584 | S: 250-SIZE 35651584 | |||
| S: 250-8BITMIME | S: 250-8BITMIME | |||
| S: 250-AUTH LOGIN PLAIN OAUTHBEARER | S: 250-AUTH LOGIN PLAIN OAUTHBEARER | |||
| S: 250-ENHANCEDSTATUSCODES | S: 250-ENHANCEDSTATUSCODES | |||
| S: 250 PIPELINING | S: 250 PIPELINING | |||
| C: AUTH OAUTHBEARER bix1c2VyPXNvbWV1c2VyQGV4YW1wbGUuY29tLAFhdXRoPUJlYXJl | C: AUTH OAUTHBEARER bix1c2VyPXNvbWV1c2VyQGV4YW1wbGUuY29tLAFhdXRoPUJlYXJl | |||
| ciB2RjlkZnQ0cW1UYzJOdmIzUmxja0JoZEhSaGRtbHpkR0V1WTI5dENnPT0BAQ== | ciB2RjlkZnQ0cW1UYzJOdmIzUmxja0JoZEhSaGRtbHpkR0V1WTI5dENnPT0BAQ== | |||
| S: 334 eyJzdGF0dXMiOiI0MDEiLCJzY2hlbWVzIjoiYmVhcmVyIG1hYyIsInNjb3BlIjoia | S: 334 eyJzdGF0dXMiOiJpbnZhbGlkX3Rva2VuIiwic2NoZW1lcyI6ImJlYXJlciBtYWMiL | |||
| HR0cHM6Ly9tYWlsLmdvb2dsZS5jb20vIn0K | CJzY29wZSI6Imh0dHBzOi8vbWFpbC5nb29nbGUuY29tLyJ9 | |||
| C: AQ== | C: AQ== | |||
| S: 535-5.7.1 Username and Password not accepted. Learn more at | S: 535-5.7.1 Username and Password not accepted. Learn more at | |||
| S: 535 5.7.1 http://support.example.com/mail/oauth | S: 535 5.7.1 http://support.example.com/mail/oauth | |||
| [connection continues...] | [connection continues...] | |||
| The server returned an error message in the 334 SASL message, the | The server returned an error message in the 334 SASL message, the | |||
| client responds with the required dummy response, and the server | client responds with the required dummy response, and the server | |||
| finalizes the negotiation. | finalizes the negotiation. | |||
| 5. Security Considerations | 5. Security Considerations | |||
| OAuth 1.0a and OAuth 2 allows for a variety of deployment scenarios, | OAuth 1.0a and OAuth 2 allow for a variety of deployment scenarios, | |||
| and the security properties of these profiles vary. As shown in | and the security properties of these profiles vary. As shown in | |||
| Figure 1 this specification is aimed to be integrated into a larger | Figure 1 this specification is aimed to be integrated into a larger | |||
| OAuth deployment. Application developers therefore need to | OAuth deployment. Application developers therefore need to | |||
| understand the needs of their security requirements based on a threat | understand their security requirements based on a threat assessment | |||
| assessment before selecting a specific SASL OAuth mechanism. For | before selecting a specific SASL OAuth mechanism. For OAuth 2.0 a | |||
| OAuth 2.0 a detailed security document [RFC6819] provides guidance to | detailed security document [RFC6819] provides guidance to select | |||
| select those OAuth 2.0 components that help to mitigate threats for a | those OAuth 2.0 components that help to mitigate threats for a given | |||
| given deployment. For OAuth 1.0a Section 4 of RFC 5849 [RFC5849] | deployment. For OAuth 1.0a Section 4 of RFC 5849 [RFC5849] provides | |||
| provides guidance specific to OAuth 1.0. | guidance specific to OAuth 1.0. | |||
| This document specifies two SASL Mechanisms for OAuth and each comes | This document specifies two SASL Mechanisms for OAuth and each comes | |||
| with different security properties. | with different security properties. | |||
| OAUTHBEARER: This mechanism borrows from OAuth 2.0 bearer tokens | OAUTHBEARER: This mechanism borrows from OAuth 2.0 bearer tokens | |||
| [RFC6750]. It relies on the application using TLS to protect the | [RFC6750]. It relies on the application using TLS to protect the | |||
| OAuth 2.0 Bearer Token exchange; without TLS usage at the | OAuth 2.0 Bearer Token exchange; without TLS usage at the | |||
| application layer this method is completely insecure. | application layer this method is completely insecure. | |||
| Consequently, TLS MUST be provided by the application when | Consequently, TLS MUST be provided by the application when | |||
| choosing this authentication mechanism. | choosing this authentication mechanism. | |||
| OAUTH10A: This mechanism re-uses OAuth 1.0a MAC tokens (using the | OAUTH10A: This mechanism re-uses OAuth 1.0a MAC tokens (using the | |||
| HMAC-SHA1 keyed message digest), as described in Section 3.4.2 of | HMAC-SHA1 keyed message digest), as described in Section 3.4.2 of | |||
| [RFC5849]. To compute the keyed message digest in the same way | [RFC5849]. To compute the keyed message digest in the same way as | |||
| was in RFC 5839 this specification conveys additional parameters | in RFC 5839 this specification conveys additional parameters | |||
| between the client and the server. This SASL mechanism only | between the client and the server. This SASL mechanism only | |||
| supports client authentication. If server-side authentication is | supports client authentication. If server-side authentication is | |||
| desireable then it must be provided by the application underneath | desireable then it must be provided by the application underneath | |||
| the SASL layer. The use of TLS is strongly RECOMMENDED. | the SASL layer. The use of TLS is strongly RECOMMENDED. | |||
| Additionally, the following aspects are worth pointing out: | Additionally, the following aspects are worth pointing out: | |||
| An access token is not equivalent to the user's long term password. | An access token is not equivalent to the user's long term password. | |||
| Care has to be taken when these OAuth credentials are used for | Care has to be taken when these OAuth credentials are used for | |||
| skipping to change at page 18, line 4 ¶ | skipping to change at page 17, line 42 ¶ | |||
| SASL mechanism profile: OAUTH10A | SASL mechanism profile: OAUTH10A | |||
| Security Considerations: See this document | Security Considerations: See this document | |||
| Published Specification: See this document | Published Specification: See this document | |||
| For further information: Contact the authors of this document. | For further information: Contact the authors of this document. | |||
| Owner/Change controller: the IETF | Owner/Change controller: the IETF | |||
| Note: None | Note: None | |||
| 8. References | 8. References | |||
| 8.1. Normative References | 8.1. Normative References | |||
| [OpenID.Core] | [OpenID.Core] | |||
| Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and | Sakimura, N., Bradley, J., Jones, M., de Medeiros, B., and | |||
| C. Mortimore, "OpenID Connect Core 1.0", February 2014. | C. Mortimore, "OpenID Connect Core 1.0", February 2014. | |||
| [OpenID.Discovery] | [OpenID.Discovery] | |||
| Sakimura, N., Bradley, J., Jones, M., and E. Jay, "OpenID | Sakimura, N., Bradley, J., Jones, M., and E. Jay, "OpenID | |||
| Connect Discovery 1.0", July 2011. | Connect Discovery 1.0", July 2011. | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
| [RFC2244] Newman, C. and J. Myers, "ACAP -- Application | ||||
| Configuration Access Protocol", RFC 2244, November 1997. | ||||
| [RFC3174] Eastlake, D. and P. Jones, "US Secure Hash Algorithm 1 | ||||
| (SHA1)", RFC 3174, September 2001. | ||||
| [RFC4422] Melnikov, A. and K. Zeilenga, "Simple Authentication and | [RFC4422] Melnikov, A. and K. Zeilenga, "Simple Authentication and | |||
| Security Layer (SASL)", RFC 4422, June 2006. | Security Layer (SASL)", RFC 4422, June 2006. | |||
| [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
| Encodings", RFC 4648, October 2006. | Encodings", RFC 4648, October 2006. | |||
| [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | [RFC5234] Crocker, D. and P. Overell, "Augmented BNF for Syntax | |||
| Specifications: ABNF", STD 68, RFC 5234, January 2008. | Specifications: ABNF", STD 68, RFC 5234, January 2008. | |||
| [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | [RFC5246] Dierks, T. and E. Rescorla, "The Transport Layer Security | |||
| skipping to change at page 19, line 13 ¶ | skipping to change at page 18, line 46 ¶ | |||
| Framework: Bearer Token Usage", RFC 6750, October 2012. | Framework: Bearer Token Usage", RFC 6750, October 2012. | |||
| [RFC7159] Bray, T., "The JavaScript Object Notation (JSON) Data | [RFC7159] Bray, T., "The JavaScript Object Notation (JSON) Data | |||
| Interchange Format", RFC 7159, March 2014. | Interchange Format", RFC 7159, March 2014. | |||
| 8.2. Informative References | 8.2. Informative References | |||
| [I-D.ietf-oauth-dyn-reg] | [I-D.ietf-oauth-dyn-reg] | |||
| Richer, J., Jones, M., Bradley, J., Machulak, M., and P. | Richer, J., Jones, M., Bradley, J., Machulak, M., and P. | |||
| Hunt, "OAuth 2.0 Dynamic Client Registration Protocol", | Hunt, "OAuth 2.0 Dynamic Client Registration Protocol", | |||
| draft-ietf-oauth-dyn-reg-22 (work in progress), January | draft-ietf-oauth-dyn-reg-27 (work in progress), March | |||
| 2015. | 2015. | |||
| [I-D.ietf-oauth-json-web-token] | [I-D.ietf-oauth-json-web-token] | |||
| Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token | Jones, M., Bradley, J., and N. Sakimura, "JSON Web Token | |||
| (JWT)", draft-ietf-oauth-json-web-token-32 (work in | (JWT)", draft-ietf-oauth-json-web-token-32 (work in | |||
| progress), December 2014. | progress), December 2014. | |||
| [RFC2616] Fielding, R., Gettys, J., Mogul, J., Frystyk, H., | ||||
| Masinter, L., Leach, P., and T. Berners-Lee, "Hypertext | ||||
| Transfer Protocol -- HTTP/1.1", RFC 2616, June 1999. | ||||
| [RFC3501] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION | [RFC3501] Crispin, M., "INTERNET MESSAGE ACCESS PROTOCOL - VERSION | |||
| 4rev1", RFC 3501, March 2003. | 4rev1", RFC 3501, March 2003. | |||
| [RFC4959] Siemborski, R. and A. Gulbrandsen, "IMAP Extension for | [RFC4959] Siemborski, R. and A. Gulbrandsen, "IMAP Extension for | |||
| Simple Authentication and Security Layer (SASL) Initial | Simple Authentication and Security Layer (SASL) Initial | |||
| Client Response", RFC 4959, September 2007. | Client Response", RFC 4959, September 2007. | |||
| [RFC5321] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, | [RFC5321] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, | |||
| October 2008. | October 2008. | |||
| [RFC6120] Saint-Andre, P., "Extensible Messaging and Presence | [RFC6120] Saint-Andre, P., "Extensible Messaging and Presence | |||
| Protocol (XMPP): Core", RFC 6120, March 2011. | Protocol (XMPP): Core", RFC 6120, March 2011. | |||
| [RFC6819] Lodderstedt, T., McGloin, M., and P. Hunt, "OAuth 2.0 | [RFC6819] Lodderstedt, T., McGloin, M., and P. Hunt, "OAuth 2.0 | |||
| Threat Model and Security Considerations", RFC 6819, | Threat Model and Security Considerations", RFC 6819, | |||
| January 2013. | January 2013. | |||
| [RFC7033] Jones, P., Salgueiro, G., Jones, M., and J. Smarr, | [RFC7033] Jones, P., Salgueiro, G., Jones, M., and J. Smarr, | |||
| "WebFinger", RFC 7033, September 2013. | "WebFinger", RFC 7033, September 2013. | |||
| [RFC7230] Fielding, R. and J. Reschke, "Hypertext Transfer Protocol | ||||
| (HTTP/1.1): Message Syntax and Routing", RFC 7230, June | ||||
| 2014. | ||||
| Appendix A. Acknowlegements | Appendix A. Acknowlegements | |||
| The authors would like to thank the members of the Kitten working | The authors would like to thank the members of the Kitten working | |||
| group, and in addition and specifically: Simon Josefson, Torsten | group, and in addition and specifically: Simon Josefson, Torsten | |||
| Lodderstadt, Ryan Troll, Alexey Melnikov, Jeffrey Hutzelman, Nico | Lodderstadt, Ryan Troll, Alexey Melnikov, Jeffrey Hutzelman, Nico | |||
| Williams, Matt Miller, and Benjamin Kaduk. | Williams, Matt Miller, and Benjamin Kaduk. | |||
| This document was produced under the chairmanship of Alexey Melnikov, | This document was produced under the chairmanship of Alexey Melnikov, | |||
| Tom Yu, Shawn Emery, Josh Howlett, Sam Hartman. The supervising area | Tom Yu, Shawn Emery, Josh Howlett, Sam Hartman. The supervising area | |||
| director was Stephen Farrell. | director was Stephen Farrell. | |||
| End of changes. 33 change blocks. | ||||
| 71 lines changed or deleted | 66 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||