draft-ietf-sieve-regex-00.txt   draft-ietf-sieve-regex-01.txt 
Sieve Working Group K. Murchison Sieve Working Group K. Murchison
Internet-Draft Carnegie Mellon University Internet-Draft Carnegie Mellon University
Expires: August 26, 2006 February 22, 2006 Expires: September 24, 2010 N. Freed
Oracle Corporation
Sieve Email Filtering -- Regular Expression Extension March 23, 2010
draft-ietf-sieve-regex-00.txt
Status of this Memo
By submitting this Internet-Draft, each author represents that any
applicable patent or other IPR claims of which he or she is aware
have been or will be disclosed, and any of which he or she becomes
aware will be disclosed, in accordance with Section 6 of BCP 79.
Internet-Drafts are working documents of the Internet Engineering
Task Force (IETF), its areas, and its working groups. Note that
other groups may also distribute working documents as Internet-
Drafts.
Internet-Drafts are draft documents valid for a maximum of six months
and may be updated, replaced, or obsoleted by other documents at any
time. It is inappropriate to use Internet-Drafts as reference
material or to cite them other than as "work in progress."
The list of current Internet-Drafts can be accessed at
http://www.ietf.org/ietf/1id-abstracts.txt.
The list of Internet-Draft Shadow Directories can be accessed at
http://www.ietf.org/shadow.html.
This Internet-Draft will expire on August 26, 2006.
Copyright Notice
Copyright (C) The Internet Society (2006). Sieve Email Filtering: Regular Expression Extension
draft-ietf-sieve-regex-01.txt
Abstract Abstract
In some cases, it is desirable to have a string matching mechanism This document describes the "regex" extension to the Sieve email
which is more powerful than a simple exact match, a substring match filtering language. In some cases, it is desirable to have a string
or a glob-style wildcard match. The regular expression matching matching mechanism which is more powerful than a simple exact match,
mechanism defined in this draft should allow users to isolate just a substring match or a glob-style wildcard match. The regular
about any string or address in a message header or envelope. expression matching mechanism defined in this draft provides users
with much more powerful string matching capabilities.
Meta-information (to be removed prior to publication as an RFC)
This information is intended to facilitate discussion.
This document is intended to be an extension to the Sieve mail
filtering language, available from the RFC repository as
<ftp://ftp.isi.edu/internet-drafts/draft-ietf-sieve-3028bis-05.txt>.
This document and the Sieve language itself are being discussed on
the MTA Filters mailing list at <mailto:ietf-mta-filters@imc.org>.
Subscription requests can be sent to
<mailto:ietf-mta-filters-request@imc.org?body=subscribe> (send an
email message with the word "subscribe" in the body). More
information on the mailing list along with an archive of back
messages is available at <http://www.imc.org/ietf-mta-filters/>.
Change History (to be removed prior to publication as an RFC) Change History (to be removed prior to publication as an RFC)
Changes from draft-murchison-sieve-regex-08: Changes from draft-murchison-sieve-regex-08:
o Updated to XML source. o Updated to XML source.
o Documented interaction with variables. o Documented interaction with variables.
Changes from draft-ietf-sieve-regex-00:
o Various cleanup and updates.
o Added trial text specifying comparator interactions.
Open Issues (to be removed prior to publication as an RFC) Open Issues (to be removed prior to publication as an RFC)
o The major open issue with this draft is what to do, if anything, o The major open issue with this draft is what to do, if anything,
about localization/internationalization. Are [IEEE.1003-2.1992] about localization/internationalization. Are [IEEE.1003-2.1992]
collating sequences and character equivalents sufficient? Should collating sequences and character equivalents sufficient? Should
we reference the unicode technical specification? Should we punt we reference the Unicode technical specification? Should we punt
and publish the document as experimental? and publish the document as experimental?
o Is the current approach to comparator integration the right one to
use?
o Should we allow shorthands such as \\b (word boundary) and \\w o Should we allow shorthands such as \\b (word boundary) and \\w
(word character)? (word character)?
o Should we allow backreferences (useful for matching double words, o Should we allow backreferences (useful for matching double words,
etc.)? etc.)?
Table of Contents Status of this Memo
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 4 This Internet-Draft is submitted to IETF in full conformance with the
2. Capability Identifier . . . . . . . . . . . . . . . . . . . . 5 provisions of BCP 78 and BCP 79.
3. Regex Match Type . . . . . . . . . . . . . . . . . . . . . . . 6
4. Interaction with Sieve Variables . . . . . . . . . . . . . . . 9 Internet-Drafts are working documents of the Internet Engineering
4.1. Match variables . . . . . . . . . . . . . . . . . . . . . 9 Task Force (IETF), its areas, and its working groups. Note that
4.2. Set modifier :quoteregex . . . . . . . . . . . . . . . . . 9 other groups may also distribute working documents as Internet-
5. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 11 Drafts.
6. Security Considerations . . . . . . . . . . . . . . . . . . . 12
7. Normative References . . . . . . . . . . . . . . . . . . . . . 12 Internet-Drafts are draft documents valid for a maximum of six months
Appendix A. Acknowledgments . . . . . . . . . . . . . . . . . . . 13 and may be updated, replaced, or obsoleted by other documents at any
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 14 time. It is inappropriate to use Internet-Drafts as reference
Intellectual Property and Copyright Statements . . . . . . . . . . 15 material or to cite them other than as "work in progress."
The list of current Internet-Drafts can be accessed at
http://www.ietf.org/ietf/1id-abstracts.txt.
The list of Internet-Draft Shadow Directories can be accessed at
http://www.ietf.org/shadow.html.
This Internet-Draft will expire on September 24, 2010.
Copyright Notice
Copyright (c) 2010 IETF Trust and the persons identified as the
document authors. All rights reserved.
This document is subject to BCP 78 and the IETF Trust's Legal
Provisions Relating to IETF Documents
(http://trustee.ietf.org/license-info) in effect on the date of
publication of this document. Please review these documents
carefully, as they describe your rights and restrictions with respect
to this document. Code Components extracted from this document must
include Simplified BSD License text as described in Section 4.e of
the Trust Legal Provisions and are provided without warranty as
described in the BSD License.
1. Introduction 1. Introduction
This document describes an extension to the Sieve language defined by Sieve [RFC5228] is a language for filtering email messages at or
[I-D.ietf-sieve-3028bis] for comparing strings to regular around the time of final delivery. It is designed to be
expressions. implementable on either a mail client or mail server.
Conventions for notations are as in [I-D.ietf-sieve-3028bis] section The Sieve base specification defines so-called match types for tests:
1.1, including use of [RFC2119]. is, contains, and matches. An "is" test requires an exact match, a
"contains" test provides a substring match, and "matches" provides
glob-style wildcards. This document describes an extension to the
Sieve language that provides a new match type for regular expression
comparisons.
2. Capability Identifier 2. Conventions used in this document
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in [RFC2119].
The terms used to describe the various components of the Sieve
language are taken from Section 1.1 of [RFC5228].
3. Capability Identifier
The capability string associated with the extension defined in this The capability string associated with the extension defined in this
document is "regex". document is "regex".
3. Regex Match Type 4. Regex Match Type
Commands that support matching may take the optional tagged argument When the regex extension is available, commands that support matching
":regex" to specify that a regular expression match should be may take the optional tagged argument ":regex" to specify that a
performed. The ":regex" match type is subject to the same rules and regular expression match should be performed. The ":regex" match
restrictions as the standard match types defined in [I-D.ietf-sieve- type is subject to the same rules and restrictions as the standard
3028bis]. match types defined in [RFC5228].
For convenience, the "MATCH-TYPE" syntax element defined in The "MATCH-TYPE" syntax element defined in [RFC5228] is augmented
[I-D.ietf-sieve-3028bis] is augmented here as follows: here as follows:
MATCH-TYPE =/ ":regex" MATCH-TYPE =/ ":regex"
Example: 5. Interaction with Sieve comparators
require "regex"; In order to provide for matches between character sets and case
insensitivity, Sieve uses the comparators defined in the Internet
Application Protocol Collation Registry [RFC5228]. The comparator
used by a given test is specified by the :comparator argument.
# Try to catch unsolicited email. The interaction between collators and the match types defined in the
if anyof ( Sieve base specification is straightforward. Howeer, the nature of
# if a message is not to me (with optional +detail), regular expressions does not lend itself to this usage for the :regex
not address :regex ["to", "cc", "bcc"] match type.
"me(\\\\+.*)?@company\\\\.com",
# or the subject is all uppercase (no lowercase) A component of the definition of many collators is a normalization
header :regex :comparator "i;octet" "subject" operation. For example, the "i;octet" comparator employs an identity
"^[^[:lower:]]+$" ) { normalization; whereas the "i;ascii-casema" normalizes all lower case
ASCII characters to upper case.
discard; # junk it The :regex match type only uses the normalization component of the
} associated comparator. This normalization operation is applied to
the key-list argument to the test; the result of that normalization
becomes the target of the regular expression comparison. The
comparator has no effect on the regular expression pattern or the
underlying comparison operation.
The ":regex" match type is compatible with both the "i;octet" and It is an error to specify a comparator that has no associated
"i;ascii-casemap" comparators and may be used with them. normalization operation in conjunction with a :regex match type.
6. Regular expression comparisions
Implementations MUST support extended regular expressions (EREs) as Implementations MUST support extended regular expressions (EREs) as
defined by [IEEE.1003-2.1992]. Any regular expression not defined by defined by [IEEE.1003-2.1992]. Any regular expression not defined by
[IEEE.1003-2.1992], as well as [IEEE.1003-2.1992] basic regular [IEEE.1003-2.1992], as well as [IEEE.1003-2.1992] basic regular
expressions, word boundaries and backreferences are not supported by expressions, word boundaries and backreferences are not supported by
this extension. Implementations SHOULD reject regular expressions this extension. Implementations SHOULD reject regular expressions
that are unsupported by this specification as a syntax error. that are unsupported by this specification as a syntax error.
The following tables provide a brief summary of the regular The following tables provide a brief summary of the regular
expressions that MUST be supported. This table is presented here expressions that MUST be supported. This table is presented here
only as a guideline. [IEEE.1003-2.1992] should be used as the only as a guideline. [IEEE.1003-2.1992] should be used as the
definitive reference. definitive reference.
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
| Expression | Pattern | | Expression | Pattern |
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
| . | Match any single character except newline. | | . | Match any single character except newline. |
| | |
| [ ] | Bracket expression. Match any one of the enclosed | | [ ] | Bracket expression. Match any one of the enclosed |
| | characters. A hypen (-) indicates a range of | | | characters. A hypen (-) indicates a range of |
| | consecutive characters. | | | consecutive characters. |
| | |
| [^ ] | Negated bracket expression. Match any one character | | [^ ] | Negated bracket expression. Match any one character |
| | NOT in the enclosed list. A hypen (-) indicates a | | | NOT in the enclosed list. A hypen (-) indicates a |
| | range of consecutive characters. | | | range of consecutive characters. |
| | |
| \\ | Escape the following special character (match the | | \\ | Escape the following special character (match the |
| | literal character). Undefined for other characters. | | | literal character). Undefined for other characters. |
| | NOTE: Unlike [IEEE.1003-2.1992], a double-backslash | | | NOTE: Unlike [IEEE.1003-2.1992], a double-backslash |
| | is required as per section 2.4.2 of | | | is required as per section 2.4.2 of [RFC5228]. |
| | [I-D.ietf-sieve-3028bis]. |
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
Table 1: Items to match a single character Table 1: Items to match a single character
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
| Expression | Pattern | | Expression | Pattern |
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
| [: :] | Character class (alnum, alpha, blank, cntrl, digit, | | [: :] | Character class (alnum, alpha, blank, cntrl, digit, |
| | graph, lower, print, punct, space, upper, xdigit). | | | graph, lower, print, punct, space, upper, xdigit). |
| | |
| [= =] | Character equivalents. | | [= =] | Character equivalents. |
| | |
| [. .] | Collating sequence. | | [. .] | Collating sequence. |
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
Table 2: Items to be used within a bracket expression (localization) Table 2: Items to be used within a bracket expression (localization)
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
| Expression | Pattern | | Expression | Pattern |
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
| ? | Match zero or one instances. | | ? | Match zero or one instances. |
| | |
| * | Match zero or more instances. | | * | Match zero or more instances. |
| | |
| + | Match one or more instances. | | + | Match one or more instances. |
| | |
| {n,m} | Match any number of instances between n and m | | {n,m} | Match any number of instances between n and m |
| | (inclusive). {n} matches exactly n instances. {n,} | | | (inclusive). {n} matches exactly n instances. {n,} |
| | matches n or more instances. | | | matches n or more instances. |
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
Table 3: Quantifiers - Items to count the preceding regular Table 3: Quantifiers - Items to count the preceding regular
expression expression
+------------+--------------------------------------------+ +------------+--------------------------------------------+
| Expression | Pattern | | Expression | Pattern |
+------------+--------------------------------------------+ +------------+--------------------------------------------+
| ^ | Match the beginning of the line or string. | | ^ | Match the beginning of the line or string. |
| | |
| $ | Match the end of the line or string. | | $ | Match the end of the line or string. |
+------------+--------------------------------------------+ +------------+--------------------------------------------+
Table 4: Anchoring - Items to match positions Table 4: Anchoring - Items to match positions
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
| Expression | Pattern | | Expression | Pattern |
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
| | | Alternation. Match either of the separated regular | | | | Alternation. Match either of the separated regular |
| | expressions. | | | expressions. |
| | |
| ( ) | Group the enclosed regular expression(s). | | ( ) | Group the enclosed regular expression(s). |
+------------+------------------------------------------------------+ +------------+------------------------------------------------------+
Table 5: Other constructs Table 5: Other constructs
4. Interaction with Sieve Variables 7. Interaction with Sieve Variables
This extension is compatible with, and may be used in conjunction This extension is compatible with, and may be used in conjunction
with the Sieve Variables extension [I-D.ietf-sieve-variables]. with the Sieve Variables extension [RFC5229].
4.1. Match variables 7.1. Match variables
A sieve interpreter which supports both "regex" and "variables", MUST A sieve interpreter which supports both "regex" and "variables", MUST
set "match variables" (as defined by [I-D.ietf-sieve-variables] set "match variables" (as defined by [RFC5229] section 3.2) whenever
section 3.2) whenever the ":regex" match type is used. The list of the ":regex" match type is used. The list of match variables will
match variables will contain the strings corresponding to the group contain the strings corresponding to the group operators in the
operators in the regular expression. The groups are ordered by the regular expression. The groups are ordered by the position of the
position of the opening parenthesis, from left to right. Note that opening parenthesis, from left to right. Note that in regular
in regular expressions, expansions match as much as possible (greedy expressions, expansions match as much as possible (greedy matching).
matching).
Example: Example:
require ["fileinto", "regex", "variables"]; require ["fileinto", "regex", "variables"];
if header :regex "List-ID" "<(.*)@" { if header :regex "List-ID" "<(.*)@" {
fileinto "lists.${1}"; stop; fileinto "lists.${1}"; stop;
} }
# Imagine the header # Imagine the header
# Subject: [acme-users] [fwd] version 1.0 is out # Subject: [acme-users] [fwd] version 1.0 is out
if header :regex "Subject" "^[(.*)] (.*)$" { if header :regex "Subject" "^[(.*)] (.*)$" {
# ${1} will hold "acme-users] [fwd" # ${1} will hold "acme-users] [fwd"
stop; stop;
} }
4.2. Set modifier :quoteregex 7.2. Set modifier :quoteregex
A sieve interpreter which supports both "regex" and "variables", MUST A sieve interpreter which supports both "regex" and "variables", MUST
support the optional tagged argument ":quoteregex" for use with the support the optional tagged argument ":quoteregex" for use with the
"set" action. The ":quoteregex" modifier is subject to the same "set" action. The ":quoteregex" modifier is subject to the same
rules and restrictions as the standard modifiers defined in rules and restrictions as the standard modifiers defined in [RFC5229]
[I-D.ietf-sieve-variables] section 4. section 4.
For convenience, the "MODIFIER" syntax element defined in [I-D.ietf- For convenience, the "MODIFIER" syntax element defined in [RFC5229]
sieve-variables] is augmented here as follows: is augmented here as follows:
MODIFIER =/ ":quoteregex" MODIFIER =/ ":quoteregex"
This modifier adds the necessary quoting to ensure that the expanded This modifier adds the necessary quoting to ensure that the expanded
text will only match a literal occurrence if used as a parameter to text will only match a literal occurrence if used as a parameter to
:regex. Every character with special meaning (".", "*", "?", etc.) :regex. Every character with special meaning (".", "*", "?", etc.)
is prefixed with "\" in the expansion. This modifier has a is prefixed with "\" in the expansion. This modifier has a
precedence value of 20 when used with other modifiers. precedence value of 20 when used with other modifiers.
5. IANA Considerations 8. Examples
Example:
require "regex";
# Try to catch unsolicited email.
if anyof (
# if a message is not to me (with optional +detail),
not address :regex ["to", "cc", "bcc"]
"me(\\\\+.*)?@company\\\\.com",
# or the subject is all uppercase (no lowercase)
header :regex :comparator "i;octet" "subject"
"^[^[:lower:]]+$" ) {
discard; # junk it
}
9. IANA Considerations
The following template specifies the IANA registration of the "regex" The following template specifies the IANA registration of the "regex"
Sieve extension specified in this document: Sieve extension specified in this document:
To: iana@iana.org To: iana@iana.org
Subject: Registration of new Sieve extension Subject: Registration of new Sieve extension
Capability name: regex Capability name: regex
Capability keyword: regex Capability keyword: regex
Capability arguments: N/A Capability arguments: N/A
Standards Track/IESG-approved experimental RFC number: this RFC Standards Track/IESG-approved experimental RFC number: this RFC
Person and email address to contact for further information: Person and email address to contact for further information:
Kenneth Murchison Kenneth Murchison
E-Mail: murch@andrew.cmu.edu E-Mail: murch@andrew.cmu.edu
This information should be added to the list of Sieve extensions This information should be added to the list of Sieve extensions
given on http://www.iana.org/assignments/sieve-extensions. given on http://www.iana.org/assignments/sieve-extensions.
6. Security Considerations 10. Security Considerations
Security considerations are discussed in [I-D.ietf-sieve-3028bis].
It is believed that this extension does not introduce any additional
security concerns.
However, a poor implementation COULD introduce security problems General Sieve security considerations are discussed in [RFC5228].
ranging from degradation of performance to denial of service. If an All of the issues described there also apply to regular expression
implementation uses a third-party regular expression library, that matching.
library should be checked for potentially problematic regular
expressions, such as "(.*)*".
7. Normative References It is easy to construct problematic regular expressions that are
computationally infeasible to evaluate. Execution of a Sieve that
employs a potentially problematic regular expression, such as
"(.*)*", may cause problems ranging from degradation of performance
to and outright denial of service. Moreover, determining the
computationl complexity associated with evaluating a given regular
expression is in general an intractable problem.
[I-D.ietf-sieve-3028bis] For this reason, all implementations MUST take appropriate steps to
Showalter, T. and P. Guenther, "Sieve: An Email Filtering limit the impact of runaway regular expression evaluation.
Language", draft-ietf-sieve-3028bis-05 (work in progress), Implementations MAY restrict the regular expressions users are
November 2005. allowed to specify. Implementations that do not impose such
restrictions SHOULD provide a means to abort evaluation of tests
using the :regex match type if the operation is taking too long.
[I-D.ietf-sieve-variables] 11. Normative References
Homme, K., "Sieve Extension: Variables",
draft-ietf-sieve-variables-08 (work in progress),
December 2005.
[IEEE.1003-2.1992] [IEEE.1003-2.1992]
Institute of Electrical and Electronics Engineers, Institute of Electrical and Electronics Engineers,
"Information Technology - Portable Operating System "Information Technology - Portable Operating System
Interface (POSIX) - Part 2: Shell and Utilities (Vol. 1)", Interface (POSIX) - Part 2: Shell and Utilities (Vol. 1)",
IEEE Standard 1003.2, 1992. IEEE Standard 1003.2, 1992.
[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.
[RFC5228] Guenther, P. and T. Showalter, "Sieve: An Email Filtering
Language", RFC 5228, January 2008.
[RFC5229] Homme, K., "Sieve Email Filtering: Variables Extension",
RFC 5229, January 2008.
Appendix A. Acknowledgments Appendix A. Acknowledgments
Most of the text documenting the interaction with Sieve variables was Most of the text documenting the interaction with Sieve variables was
taken from an early draft of Kjetil Homme's Sieve variables taken from an early draft of Kjetil Homme's Sieve variables
specification. specification.
Thanks to Tim Showalter, Alexey Melnikov, Tony Hansen, Phil Pennock, Thanks to Tim Showalter, Alexey Melnikov, Tony Hansen, Phil Pennock,
Jutta Degener, and Ned Freed for their help with this document. and Jutta Degener for their help with this document.
Author's Address Authors' Addresses
Kenneth Murchison Kenneth Murchison
Carnegie Mellon University Carnegie Mellon University
5000 Forbes Avenue 5000 Forbes Avenue
Cyert Hall 285 Cyert Hall 285
Pittsburgh, PA 15213 Pittsburgh, PA 15213
US US
Phone: +1 412 268 2638 Phone: +1 412 268 2638
Email: murch@andrew.cmu.edu Email: murch@andrew.cmu.edu
Intellectual Property Statement Ned Freed
Oracle Corporation
The IETF takes no position regarding the validity or scope of any 800 Royal Oaks
Intellectual Property Rights or other rights that might be claimed to Monrovia, CA 91016-6347
pertain to the implementation or use of the technology described in USA
this document or the extent to which any license under such rights
might or might not be available; nor does it represent that it has
made any independent effort to identify any such rights. Information
on the procedures with respect to rights in RFC documents can be
found in BCP 78 and BCP 79.
Copies of IPR disclosures made to the IETF Secretariat and any
assurances of licenses to be made available, or the result of an
attempt made to obtain a general license or permission for the use of
such proprietary rights by implementers or users of this
specification can be obtained from the IETF on-line IPR repository at
http://www.ietf.org/ipr.
The IETF invites any interested party to bring to its attention any
copyrights, patents or patent applications, or other proprietary
rights that may cover technology that may be required to implement
this standard. Please address the information to the IETF at
ietf-ipr@ietf.org.
Disclaimer of Validity
This document and the information contained herein are provided on an
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Copyright Statement
Copyright (C) The Internet Society (2006). This document is subject
to the rights, licenses and restrictions contained in BCP 78, and
except as set forth therein, the authors retain all their rights.
Acknowledgment
Funding for the RFC Editor function is currently provided by the Phone: +1 909 457 4293
Internet Society. Email: ned.freed@mrochek.com
 End of changes. 51 change blocks. 
186 lines changed or deleted 174 lines changed or added

This html diff was produced by rfcdiff 1.38. The latest version is available from http://tools.ietf.org/tools/rfcdiff/