Home | History | Annotate | Line # | Download | only in rfc
      1 
      2 
      3 
      4 
      5 
      6 
      7 Network Working Group                                        K. Zeilenga
      8 Request for Comments: 4518                           OpenLDAP Foundation
      9 Category: Standards Track                                      June 2006
     10 
     11 
     12              Lightweight Directory Access Protocol (LDAP):
     13                   Internationalized String Preparation
     14 
     15 Status of This Memo
     16 
     17    This document specifies an Internet standards track protocol for the
     18    Internet community, and requests discussion and suggestions for
     19    improvements.  Please refer to the current edition of the "Internet
     20    Official Protocol Standards" (STD 1) for the standardization state
     21    and status of this protocol.  Distribution of this memo is unlimited.
     22 
     23 Copyright Notice
     24 
     25    Copyright (C) The Internet Society (2006).
     26 
     27 Abstract
     28 
     29    The previous Lightweight Directory Access Protocol (LDAP) technical
     30    specifications did not precisely define how character string matching
     31    is to be performed.  This led to a number of usability and
     32    interoperability problems.  This document defines string preparation
     33    algorithms for character-based matching rules defined for use in
     34    LDAP.
     35 
     36 1.  Introduction
     37 
     38 1.1.  Background
     39 
     40    A Lightweight Directory Access Protocol (LDAP) [RFC4510] matching
     41    rule [RFC4517] defines an algorithm for determining whether a
     42    presented value matches an attribute value in accordance with the
     43    criteria defined for the rule.  The proposition may be evaluated to
     44    True, False, or Undefined.
     45 
     46       True      - the attribute contains a matching value,
     47 
     48       False     - the attribute contains no matching value,
     49 
     50       Undefined - it cannot be determined whether the attribute contains
     51                   a matching value.
     52 
     53 
     54 
     55 
     56 
     57 
     58 Zeilenga                    Standards Track                     [Page 1]
     59 
     61 RFC 4518       LDAP: Internationalized String Preparation      June 2006
     62 
     63 
     64    For instance, the caseIgnoreMatch matching rule may be used to
     65    compare whether the commonName attribute contains a particular value
     66    without regard for case and insignificant spaces.
     67 
     68 1.2.  X.500 String Matching Rules
     69 
     70    "X.520: Selected attribute types" [X.520] provides (among other
     71    things) value syntaxes and matching rules for comparing values
     72    commonly used in the directory [X.500].  These specifications are
     73    inadequate for strings composed of Unicode [Unicode] characters.
     74 
     75    The caseIgnoreMatch matching rule [X.520], for example, is simply
     76    defined as being a case-insensitive comparison where insignificant
     77    spaces are ignored.  For printableString, there is only one space
     78    character and case mapping is bijective, hence this definition is
     79    sufficient.  However, for Unicode string types such as
     80    universalString, this is not sufficient.  For example, a case-
     81    insensitive matching implementation that folded lowercase characters
     82    to uppercase would yield different results than an implementation
     83    that used uppercase to lowercase folding.  Or one implementation may
     84    view space as referring to only SPACE (U+0020), a second
     85    implementation may view any character with the space separator (Zs)
     86    property as a space, and another implementation may view any
     87    character with the whitespace (WS) category as a space.
     88 
     89    The lack of precise specification for character string matching has
     90    led to significant interoperability problems.  When used in
     91    certificate chain validation, security vulnerabilities can arise.  To
     92    address these problems, this document defines precise algorithms for
     93    preparing character strings for matching.
     94 
     95 1.3.  Relationship to "stringprep"
     96 
     97    The character string preparation algorithms described in this
     98    document are based upon the "stringprep" approach [RFC3454].  In
     99    "stringprep", presented and stored values are first prepared for
    100    comparison so that a character-by-character comparison yields the
    101    "correct" result.
    102 
    103    The approach used here is a refinement of the "stringprep" [RFC3454]
    104    approach.  Each algorithm involves two additional preparation steps.
    105 
    106    a) Prior to applying the Unicode string preparation steps outlined in
    107       "stringprep", the string is transcoded to Unicode.
    108 
    109    b) After applying the Unicode string preparation steps outlined in
    110       "stringprep", the string is modified to appropriately handle
    111       characters insignificant to the matching rule.
    112 
    113 
    114 
    115 Zeilenga                    Standards Track                     [Page 2]
    116 
    118 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    119 
    120 
    121    Hence, preparation of character strings for X.500 [X.500] matching
    122    [X.501] involves the following steps:
    123 
    124       1) Transcode
    125       2) Map
    126       3) Normalize
    127       4) Prohibit
    128       5) Check Bidi (Bidirectional)
    129       6) Insignificant Character Handling
    130 
    131    These steps are described in Section 2.
    132 
    133    It is noted that while various tables of Unicode characters included
    134    or referenced by this specification are derived from Unicode
    135    [Unicode] data, these tables are to be considered definitive for the
    136    purpose of implementing this specification.
    137 
    138 1.4.  Relationship to the LDAP Technical Specification
    139 
    140    This document is an integral part of the LDAP technical specification
    141    [RFC4510], which obsoletes the previously defined LDAP technical
    142    specification [RFC3377] in its entirety.
    143 
    144    This document details new LDAP internationalized character string
    145    preparation algorithms used by [RFC4517] and possible other technical
    146    specifications defining LDAP syntaxes and/or matching rules.
    147 
    148 1.5.  Relationship to X.500
    149 
    150    LDAP is defined [RFC4510] in X.500 terms as an X.500 access
    151    mechanism.  As such, there is a strong desire for alignment between
    152    LDAP and X.500 syntax and semantics.  The character string
    153    preparation algorithms described in this document are based upon
    154    "Internationalized String Matching Rules for X.500" [XMATCH] proposal
    155    to ITU/ISO Joint Study Group 2.
    156 
    157 1.6.  Conventions and Terms
    158 
    159    The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
    160    "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
    161    document are to be interpreted as described in BCP 14 [RFC2119].
    162 
    163    Character names in this document use the notation for code points and
    164    names from the Unicode Standard [Unicode].  For example, the letter
    165    "a" may be represented as either <U+0061> or <LATIN SMALL LETTER A>.
    166    In the lists of mappings and the prohibited characters, the "U+" is
    167 
    168 
    169 
    170 
    171 
    172 Zeilenga                    Standards Track                     [Page 3]
    173 
    175 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    176 
    177 
    178    left off to make the lists easier to read.  The comments for
    179    character ranges are shown in square brackets (such as "[CONTROL
    180    CHARACTERS]") and do not come from the standard.
    181 
    182    Note: a glossary of terms used in Unicode can be found in [Glossary].
    183    Information on the Unicode character encoding model can be found in
    184    [CharModel].
    185 
    186    The term "combining mark", as used in this specification, refers to
    187    any Unicode [Unicode] code point that has a mark property (Mn, Mc,
    188    Me).  Appendix A provides a definitive list of combining marks.
    189 
    190 2.  String Preparation
    191 
    192    The following six-step process SHALL be applied to each presented and
    193    attribute value in preparation for character string matching rule
    194    evaluation.
    195 
    196       1) Transcode
    197       2) Map
    198       3) Normalize
    199       4) Prohibit
    200       5) Check bidi
    201       6) Insignificant Character Handling
    202 
    203    Failure in any step causes the assertion to evaluate to Undefined.
    204 
    205    The character repertoire of this process is Unicode 3.2 [Unicode].
    206 
    207    Note that this six-step process specification is intended to describe
    208    expected matching behavior.  Implementations are free to use
    209    alternative processes so long as the matching rule evaluation
    210    behavior provided is consistent with the behavior described by this
    211    specification.
    212 
    213 2.1.  Transcode
    214 
    215    Each non-Unicode string value is transcoded to Unicode.
    216 
    217    PrintableString [X.680] values are transcoded directly to Unicode.
    218 
    219    UniversalString, UTF8String, and bmpString [X.680] values need not be
    220    transcoded as they are Unicode-based strings (in the case of
    221    bmpString, a subset of Unicode).
    222 
    223    TeletexString [X.680] values are transcoded to Unicode.  As there is
    224    no standard for mapping TeletexString values to Unicode, the mapping
    225    is left a local matter.
    226 
    227 
    228 
    229 Zeilenga                    Standards Track                     [Page 4]
    230 
    232 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    233 
    234 
    235    For these and other reasons, use of TeletexString is NOT RECOMMENDED.
    236 
    237    The output is the transcoded string.
    238 
    239 2.2.  Map
    240 
    241    SOFT HYPHEN (U+00AD) and MONGOLIAN TODO SOFT HYPHEN (U+1806) code
    242    points are mapped to nothing.  COMBINING GRAPHEME JOINER (U+034F) and
    243    VARIATION SELECTORs (U+180B-180D, FF00-FE0F) code points are also
    244    mapped to nothing.  The OBJECT REPLACEMENT CHARACTER (U+FFFC) is
    245    mapped to nothing.
    246 
    247    CHARACTER TABULATION (U+0009), LINE FEED (LF) (U+000A), LINE
    248    TABULATION (U+000B), FORM FEED (FF) (U+000C), CARRIAGE RETURN (CR)
    249    (U+000D), and NEXT LINE (NEL) (U+0085) are mapped to SPACE (U+0020).
    250 
    251    All other control code (e.g., Cc) points or code points with a
    252    control function (e.g., Cf) are mapped to nothing.  The following is
    253    a complete list of these code points: U+0000-0008, 000E-001F, 007F-
    254    0084, 0086-009F, 06DD, 070F, 180E, 200C-200F, 202A-202E, 2060-2063,
    255    206A-206F, FEFF, FFF9-FFFB, 1D173-1D17A, E0001, E0020-E007F.
    256 
    257    ZERO WIDTH SPACE (U+200B) is mapped to nothing.  All other code
    258    points with Separator (space, line, or paragraph) property (e.g., Zs,
    259    Zl, or Zp) are mapped to SPACE (U+0020).  The following is a complete
    260    list of these code points: U+0020, 00A0, 1680, 2000-200A, 2028-2029,
    261    202F, 205F, 3000.
    262 
    263    For case ignore, numeric, and stored prefix string matching rules,
    264    characters are case folded per B.2 of [RFC3454].
    265 
    266    The output is the mapped string.
    267 
    268 2.3.  Normalize
    269 
    270    The input string is to be normalized to Unicode Form KC
    271    (compatibility composed) as described in [UAX15].  The output is the
    272    normalized string.
    273 
    274 2.4.  Prohibit
    275 
    276    All Unassigned code points are prohibited.  Unassigned code points
    277    are listed in Table A.1 of [RFC3454].
    278 
    279    Characters that, per Section 5.8 of [RFC3454], change display
    280    properties or are deprecated are prohibited.  These characters are
    281    listed in Table C.8 of [RFC3454].
    282 
    283 
    284 
    285 
    286 Zeilenga                    Standards Track                     [Page 5]
    287 
    289 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    290 
    291 
    292    Private Use code points are prohibited.  These characters are listed
    293    in Table C.3 of [RFC3454].
    294 
    295    All non-character code points are prohibited.  These code points are
    296    listed in Table C.4 of [RFC3454].
    297 
    298    Surrogate codes are prohibited.  These characters are listed in Table
    299    C.5 of [RFC3454].
    300 
    301    The REPLACEMENT CHARACTER (U+FFFD) code point is prohibited.
    302 
    303    The step fails if the input string contains any prohibited code
    304    point.  Otherwise, the output is the input string.
    305 
    306 2.5.  Check bidi
    307 
    308    Bidirectional characters are ignored.
    309 
    310 2.6.  Insignificant Character Handling
    311 
    312    In this step, the string is modified to ensure proper handling of
    313    characters insignificant to the matching rule.  This modification
    314    differs from matching rule to matching rule.
    315 
    316    Section 2.6.1 applies to case ignore and exact string matching.
    317    Section 2.6.2 applies to numericString matching.
    318    Section 2.6.3 applies to telephoneNumber matching.
    319 
    320 2.6.1.  Insignificant Space Handling
    321 
    322    For the purposes of this section, a space is defined to be the SPACE
    323    (U+0020) code point followed by no combining marks.
    324 
    325        NOTE - The previous steps ensure that the string cannot contain
    326               any code points in the separator class, other than SPACE
    327               (U+0020).
    328 
    329    For input strings that are attribute values or non-substring
    330    assertion values:  If the input string contains no non-space
    331    character, then the output is exactly two SPACEs.  Otherwise (the
    332    input string contains at least one non-space character), the string
    333    is modified such that the string starts with exactly one space
    334    character, ends with exactly one SPACE character, and any inner
    335    (non-empty) sequence of space characters is replaced with exactly two
    336    SPACE characters.  For instance, the input strings
    337    "foo<SPACE>bar<SPACE><SPACE>", result in the output
    338    "<SPACE>foo<SPACE><SPACE>bar<SPACE>".
    339 
    340 
    341 
    342 
    343 Zeilenga                    Standards Track                     [Page 6]
    344 
    346 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    347 
    348 
    349    For input strings that are substring assertion values: If the string
    350    being prepared contains no non-space characters, then the output
    351    string is exactly one SPACE.  Otherwise, the following steps are
    352    taken:
    353 
    354    -  If the input string is an initial substring, it is modified to
    355       start with exactly one SPACE character;
    356 
    357    -  If the input string is an initial or an any substring that ends in
    358       one or more space characters, it is modified to end with exactly
    359       one SPACE character;
    360 
    361    -  If the input string is an any or a final substring that starts in
    362       one or more space characters, it is modified to start with exactly
    363       one SPACE character; and
    364 
    365    -  If the input string is a final substring, it is modified to end
    366       with exactly one SPACE character.
    367 
    368    For instance, for the input string "foo<SPACE>bar<SPACE><SPACE>" as
    369    an initial substring, the output would be
    370    "<SPACE>foo<SPACE><SPACE>bar<SPACE>".  As an any or final substring,
    371    the same input would result in "foo<SPACE>bar<SPACE>".
    372 
    373    Appendix B discusses the rationale for the behavior.
    374 
    375 2.6.2.  numericString Insignificant Character Handling
    376 
    377    For the purposes of this section, a space is defined to be the SPACE
    378    (U+0020) code point followed by no combining marks.
    379 
    380    All spaces are regarded as insignificant and are to be removed.
    381 
    382    For example, removal of spaces from the Form KC string:
    383        "<SPACE><SPACE>123<SPACE><SPACE>456<SPACE><SPACE>"
    384    would result in the output string:
    385        "123456"
    386    and the Form KC string:
    387        "<SPACE><SPACE><SPACE>"
    388    would result in the output string:
    389        "" (an empty string).
    390 
    391 2.6.3.  telephoneNumber Insignificant Character Handling
    392 
    393    For the purposes of this section, a hyphen is defined to be a
    394    HYPHEN-MINUS (U+002D), ARMENIAN HYPHEN (U+058A), HYPHEN (U+2010),
    395    NON-BREAKING HYPHEN (U+2011), MINUS SIGN (U+2212), SMALL HYPHEN-MINUS
    396    (U+FE63), or FULLWIDTH HYPHEN-MINUS (U+FF0D) code point followed by
    397 
    398 
    399 
    400 Zeilenga                    Standards Track                     [Page 7]
    401 
    403 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    404 
    405 
    406    no combining marks and a space is defined to be the SPACE (U+0020)
    407    code point followed by no combining marks.
    408 
    409    All hyphens and spaces are considered insignificant and are to be
    410    removed.
    411 
    412    For example, removal of hyphens and spaces from the Form KC string:
    413        "<SPACE><HYPHEN>123<SPACE><SPACE>456<SPACE><HYPHEN>"
    414    would result in the output string:
    415        "123456"
    416    and the Form KC string:
    417        "<HYPHEN><HYPHEN><HYPHEN>"
    418    would result in the (empty) output string:
    419        "".
    420 
    421 3.  Security Considerations
    422 
    423    "Preparation of Internationalized Strings ("stringprep")" [RFC3454]
    424    security considerations generally apply to the algorithms described
    425    here.
    426 
    427 4.  Acknowledgements
    428 
    429    The approach used in this document is based upon design principles
    430    and algorithms described in "Preparation of Internationalized Strings
    431    ('stringprep')" [RFC3454] by Paul Hoffman and Marc Blanchet.  Some
    432    additional guidance was drawn from Unicode Technical Standards,
    433    Technical Reports, and Notes.
    434 
    435    This document is a product of the IETF LDAP Revision (LDAPBIS)
    436    Working Group.
    437 
    438 5.  References
    439 
    440 5.1.  Normative References
    441 
    442    [RFC2119]     Bradner, S., "Key words for use in RFCs to Indicate
    443                  Requirement Levels", BCP 14, RFC 2119, March 1997.
    444 
    445    [RFC3454]     Hoffman, P. and M. Blanchet, "Preparation of
    446                  Internationalized Strings ("stringprep")", RFC 3454,
    447                  December 2002.
    448 
    449    [RFC4510]     Zeilenga, K., "Lightweight Directory Access Protocol
    450                  (LDAP): Technical Specification Road Map", RFC 4510,
    451                  June 2006.
    452 
    453 
    454 
    455 
    456 
    457 Zeilenga                    Standards Track                     [Page 8]
    458 
    460 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    461 
    462 
    463    [RFC4517]     Legg, S., Ed., "Lightweight Directory Access Protocol
    464                  (LDAP): Syntaxes and Matching Rules", RFC 4517, June
    465                  2006.
    466 
    467    [Unicode]     The Unicode Consortium, "The Unicode Standard, Version
    468                  3.2.0" is defined by "The Unicode Standard, Version
    469                  3.0" (Reading, MA, Addison-Wesley, 2000.  ISBN 0-201-
    470                  61633-5), as amended by the "Unicode Standard Annex
    471                  #27: Unicode 3.1"
    472                  (http://www.unicode.org/reports/tr27/) and by the
    473                  "Unicode Standard Annex #28: Unicode 3.2"
    474                  (http://www.unicode.org/reports/tr28/).
    475 
    476    [UAX15]       Davis, M. and M. Duerst, "Unicode Standard Annex #15:
    477                  Unicode Normalization Forms, Version 3.2.0".
    478                  <http://www.unicode.org/unicode/reports/tr15/tr15-
    479                  22.html>, March 2002.
    480 
    481    [X.680]       International Telecommunication Union -
    482                  Telecommunication Standardization Sector, "Abstract
    483                  Syntax Notation One (ASN.1) - Specification of Basic
    484                  Notation", X.680(2002) (also ISO/IEC 8824-1:2002).
    485 
    486 5.2.  Informative References
    487 
    488    [X.500]       International Telecommunication Union -
    489                  Telecommunication Standardization Sector, "The
    490                  Directory -- Overview of concepts, models and
    491                  services," X.500(1993) (also ISO/IEC 9594-1:1994).
    492 
    493    [X.501]       International Telecommunication Union -
    494                  Telecommunication Standardization Sector, "The
    495                  Directory -- Models," X.501(1993) (also ISO/IEC 9594-
    496                  2:1994).
    497 
    498    [X.520]       International Telecommunication Union -
    499                  Telecommunication Standardization Sector, "The
    500                  Directory: Selected Attribute Types", X.520(1993) (also
    501                  ISO/IEC 9594-6:1994).
    502 
    503    [Glossary]    The Unicode Consortium, "Unicode Glossary",
    504                  <http://www.unicode.org/glossary/>.
    505 
    506    [CharModel]   Whistler, K. and M. Davis, "Unicode Technical Report
    507                  #17, Character Encoding Model", UTR17,
    508                  <http://www.unicode.org/unicode/reports/tr17/>, August
    509                  2000.
    510 
    511 
    512 
    513 
    514 Zeilenga                    Standards Track                     [Page 9]
    515 
    517 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    518 
    519 
    520    [RFC3377]     Hodges, J. and R. Morgan, "Lightweight Directory Access
    521                  Protocol (v3): Technical Specification", RFC 3377,
    522                  September 2002.
    523 
    524    [RFC4515]     Smith, M., Ed. and T. Howes, "Lightweight Directory
    525                  Access Protocol (LDAP): String Representation of Search
    526                  Filters", RFC 4515, June 2006.
    527 
    528    [XMATCH]      Zeilenga, K., "Internationalized String Matching Rules
    529                  for X.500", Work in Progress.
    530 
    531 
    532 
    533 
    534 
    535 
    536 
    537 
    538 
    539 
    540 
    541 
    542 
    543 
    544 
    545 
    546 
    547 
    548 
    549 
    550 
    551 
    552 
    553 
    554 
    555 
    556 
    557 
    558 
    559 
    560 
    561 
    562 
    563 
    564 
    565 
    566 
    567 
    568 
    569 
    570 
    571 Zeilenga                    Standards Track                    [Page 10]
    572 
    574 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    575 
    576 
    577 Appendix A.  Combining Marks
    578 
    579    This appendix is normative.
    580 
    581    This table was derived from Unicode [Unicode] data files; it lists
    582    all code points with the Mn, Mc, or Me properties.  This table is to
    583    be considered definitive for the purposes of implementation of this
    584    specification.
    585 
    586          0300-034F 0360-036F 0483-0486 0488-0489 0591-05A1
    587          05A3-05B9 05BB-05BC 05BF 05C1-05C2 05C4 064B-0655 0670
    588          06D6-06DC 06DE-06E4 06E7-06E8 06EA-06ED 0711 0730-074A
    589          07A6-07B0 0901-0903 093C 093E-094F 0951-0954 0962-0963
    590          0981-0983 09BC 09BE-09C4 09C7-09C8 09CB-09CD 09D7
    591          09E2-09E3 0A02 0A3C 0A3E-0A42 0A47-0A48 0A4B-0A4D
    592          0A70-0A71 0A81-0A83 0ABC 0ABE-0AC5 0AC7-0AC9 0ACB-0ACD
    593          0B01-0B03 0B3C 0B3E-0B43 0B47-0B48 0B4B-0B4D 0B56-0B57
    594          0B82 0BBE-0BC2 0BC6-0BC8 0BCA-0BCD 0BD7 0C01-0C03
    595          0C3E-0C44 0C46-0C48 0C4A-0C4D 0C55-0C56 0C82-0C83
    596          0CBE-0CC4 0CC6-0CC8 0CCA-0CCD 0CD5-0CD6 0D02-0D03
    597          0D3E-0D43 0D46-0D48 0D4A-0D4D 0D57 0D82-0D83 0DCA
    598          0DCF-0DD4 0DD6 0DD8-0DDF 0DF2-0DF3 0E31 0E34-0E3A
    599          0E47-0E4E 0EB1 0EB4-0EB9 0EBB-0EBC 0EC8-0ECD 0F18-0F19
    600          0F35 0F37 0F39 0F3E-0F3F 0F71-0F84 0F86-0F87 0F90-0F97
    601          0F99-0FBC 0FC6 102C-1032 1036-1039 1056-1059 1712-1714
    602          1732-1734 1752-1753 1772-1773 17B4-17D3 180B-180D 18A9
    603          20D0-20EA 302A-302F 3099-309A FB1E FE00-FE0F FE20-FE23
    604          1D165-1D169 1D16D-1D172 1D17B-1D182 1D185-1D18B
    605          1D1AA-1D1AD
    606 
    607 Appendix B.  Substrings Matching
    608 
    609    This appendix is non-normative.
    610 
    611    In the absence of substrings matching, the insignificant space
    612    handling for case ignore/exact matching could be simplified.
    613    Specifically, the handling could be to require that all sequences of
    614    one or more spaces be replaced with one space and, if the string
    615    contains non-space characters, removal of all leading spaces and
    616    trailing spaces.
    617 
    618    In the presence of substrings matching, this simplified space
    619    handling would lead to unexpected and undesirable matching behavior.
    620    For instance:
    621 
    622    1) (CN=foo\20*\20bar) would match the CN value "foobar";
    623 
    624 
    625 
    626 
    627 
    628 Zeilenga                    Standards Track                    [Page 11]
    629 
    631 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    632 
    633 
    634    2) (CN=*\20foobar\20*) would match "foobar", but
    635       (CN=*\20*foobar*\20*) would not.
    636 
    637    Note to readers not familiar with LDAP substrings matching: the LDAP
    638    filter [RFC4515] assertion (CN=A*B*C) says to "match any value (of
    639    the attribute CN) that begins with A, contains B after A, ends with C
    640    where C is also after B."
    641 
    642    The first case illustrates that this simplified space handling would
    643    cause leading and trailing spaces in substrings of the string to be
    644    regarded as insignificant.  However, only leading and trailing (as
    645    well as multiple consecutive spaces) of the string (as a whole) are
    646    insignificant.
    647 
    648    The second case illustrates that this simplified space handling would
    649    cause sub-partitioning failures.  That is, if a prepared any
    650    substring matches a partition of the attribute value, then an
    651    assertion constructed by subdividing that substring into multiple
    652    substrings should also match.
    653 
    654    In designing an appropriate approach for space handling for
    655    substrings matching, one must study key aspects of X.500 case
    656    exact/ignore matching.  X.520 [X.520] says:
    657 
    658       The [substrings] rule returns TRUE if there is a partitioning of
    659       the attribute value (into portions) such that:
    660 
    661          -  the specified substrings (initial, any, final) match
    662             different portions of the value in the order of the strings
    663             sequence;
    664 
    665          -  initial, if present, matches the first portion of the value;
    666 
    667          -  final, if present, matches the last portion of the value;
    668 
    669          -  any, if present, matches some arbitrary portion of the
    670             value.
    671 
    672    That is, the substrings assertion (CN=foo\20*\20bar) matches the
    673    attribute value "foo<SPACE><SPACE>bar" as the value can be
    674    partitioned into the portions "foo<SPACE>" and "<SPACE>bar" meeting
    675    the above requirements.
    676 
    677 
    678 
    679 
    680 
    681 
    682 
    683 
    684 
    685 Zeilenga                    Standards Track                    [Page 12]
    686 
    688 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    689 
    690 
    691    X.520 also says:
    692 
    693       [T]he following spaces are regarded as not significant:
    694 
    695          -  leading spaces (i.e., those preceding the first character
    696             that is not a space);
    697 
    698          -  trailing spaces (i.e., those following the last character
    699             that is not a space);
    700 
    701          -  multiple consecutive spaces (these are taken as equivalent
    702             to a single space character).
    703 
    704    This statement applies to the assertion values and attribute values
    705    as whole strings, and not individually to substrings of an assertion
    706    value.  In particular, the statements should be taken to mean that if
    707    an assertion value and attribute value match without any
    708    consideration to insignificant characters, then that assertion value
    709    should also match any attribute value that differs only by inclusion
    710    nor removal of insignificant characters.
    711 
    712    Hence the assertion (CN=foo\20*\20bar) matches
    713    "foo<SPACE><SPACE><SPACE>bar" and "foo<SPACE>bar" as these values
    714    only differ from "foo<SPACE><SPACE>bar" by the inclusion or removal
    715    of insignificant spaces.
    716 
    717    Astute readers of this text will also note that there are special
    718    cases where the specified space handling does not ignore spaces that
    719    could be considered insignificant.  For instance, the assertion
    720    (CN=\20*\20*\20) does not match "<SPACE><SPACE><SPACE>"
    721    (insignificant spaces present in value) or " " (insignificant spaces
    722    not present in value).  However, as these cases have no practical
    723    application that cannot be met by simple assertions, e.g., (cn=\20),
    724    and this minor anomaly can only be fully addressed by a preparation
    725    algorithm to be used in conjunction with character-by-character
    726    partitioning and matching, the anomaly is considered acceptable.
    727 
    728 Author's Address
    729 
    730    Kurt D. Zeilenga
    731    OpenLDAP Foundation
    732 
    733    EMail: Kurt (a] OpenLDAP.org
    734 
    735 
    736 
    737 
    738 
    739 
    740 
    741 
    742 Zeilenga                    Standards Track                    [Page 13]
    743 
    745 RFC 4518       LDAP: Internationalized String Preparation      June 2006
    746 
    747 
    748 Full Copyright Statement
    749 
    750    Copyright (C) The Internet Society (2006).
    751 
    752    This document is subject to the rights, licenses and restrictions
    753    contained in BCP 78, and except as set forth therein, the authors
    754    retain all their rights.
    755 
    756    This document and the information contained herein are provided on an
    757    "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
    758    OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
    759    ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
    760    INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
    761    INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
    762    WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
    763 
    764 Intellectual Property
    765 
    766    The IETF takes no position regarding the validity or scope of any
    767    Intellectual Property Rights or other rights that might be claimed to
    768    pertain to the implementation or use of the technology described in
    769    this document or the extent to which any license under such rights
    770    might or might not be available; nor does it represent that it has
    771    made any independent effort to identify any such rights.  Information
    772    on the procedures with respect to rights in RFC documents can be
    773    found in BCP 78 and BCP 79.
    774 
    775    Copies of IPR disclosures made to the IETF Secretariat and any
    776    assurances of licenses to be made available, or the result of an
    777    attempt made to obtain a general license or permission for the use of
    778    such proprietary rights by implementers or users of this
    779    specification can be obtained from the IETF on-line IPR repository at
    780    http://www.ietf.org/ipr.
    781 
    782    The IETF invites any interested party to bring to its attention any
    783    copyrights, patents or patent applications, or other proprietary
    784    rights that may cover technology that may be required to implement
    785    this standard.  Please address the information to the IETF at
    786    ietf-ipr (a] ietf.org.
    787 
    788 Acknowledgement
    789 
    790    Funding for the RFC Editor function is provided by the IETF
    791    Administrative Support Activity (IASA).
    792 
    793 
    794 
    795 
    796 
    797 
    798 
    799 Zeilenga                    Standards Track                    [Page 14]
    800 
    802