RFC 1778
The String Representation of Standard Attribute Syntaxes
RFC 1778: The String Representation of Standard Attribute Syntaxes ๐
Okay bestie, let's do the vibe check first ๐ This is RFC 1778 from the Network Working Group, a Standards Track doc dated March 1995 ๐ฆ The authors are T. Howes (University of Michigan), S. Kille (ISODE Consortium), W. Yeong (Performance Systems International), and C. Robbins (NeXor Ltd.). It obsoletes RFC 1488, and there's no Updates line, so it doesn't update anything ๐ธ
Status of this Memo โจ
This doc specifies an Internet standards track protocol for the whole Internet community, and it literally asks for discussion and suggestions for improvements ๐ซถ For the standardization state and status of this protocol, check the current edition of the "Internet Official Protocol Standards" (STD 1). Distribution of this memo is unlimited ๐
Abstract ๐
So the Lightweight Directory Access Protocol (LDAP) [9] requires that the contents of AttributeValue fields in protocol elements be octet strings ๐ This doc lays out the requirements that MUST be satisfied by the encoding rules used to render X.500 Directory attribute syntaxes into a form suitable for LDAP. Then it defines those encoding rules for the standard set of attribute syntaxes defined in [1,2] and [3] ๐ง
1. Attribute Syntax Encoding Requirements. ๐
This section sets out the general requirements for lightweight directory protocol attribute syntax encodings. Every document that defines attribute syntax encodings for the lightweight directory protocols is expected to conform to these requirements ๐
Okay so the encoding rules for any given attribute syntax MUST produce octet strings ๐ฅ As much as possible, encoded octet strings SHOULD be usable in their native encoded form for display purposes. Especially for attribute syntaxes that define non-binary values, the encoding rules SHOULD produce strings that clients implementing the lightweight directory protocols can display with little or no translation ๐ซถ
2. Standard Attribute Syntax Encodings ๐ฆ
To define the encoding rules for the standard attribute syntaxes, we're going to use these auxiliary BNF definitions ๐ง
<a> ::= 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' |
'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' |
's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' | 'A' |
'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' |
'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' |
'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z'
<d> ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9'
<hex-digit> ::= <d> | 'a' | 'b' | 'c' | 'd' | 'e' | 'f' |
'A' | 'B' | 'C' | 'D' | 'E' | 'F'
<k> ::= <a> | <d> | '-'
<p> ::= <a> | <d> | ''' | '(' | ')' | '+' | ',' | '-' | '.' |
'/' | ':' | '?' | ' '
<CRLF> ::= The ASCII newline character with hexadecimal value 0x0A
<letterstring> ::= <a> | <a> <letterstring>
<numericstring> ::= <d> | <d> <numericstring>
<keystring> ::= <a> | <a> <anhstring>
<anhstring> ::= <k> | <k> <anhstring>
<printablestring> ::= <p> | <p> <printablestring>
<space> ::= ' ' | ' ' <space>
2.1. Undefined ๐ธ
Values of type Undefined get encoded as if they were values of type Octet String. The string value is the BER-encoded version of the value ๐
2.2. Case Ignore String โจ
A string of type caseIgnoreStringSyntax is encoded as the string value itself ๐ซถ
2.3. Case Exact String ๐
The encoding of a string of type caseExactStringSyntax is the string value itself ๐ฆ
2.4. Printable String ๐
The encoding of a string of type printableStringSyntax is the string value itself ๐
2.5. Numeric String ๐ฅ
The encoding of a string of type numericStringSyntax is the string value itself ๐
2.6. Octet String ๐ง
The encoding of a string of type octetStringSyntax is the string value itself ๐
2.7. Case Ignore IA5 String โญ
The encoding of a string of type caseIgnoreIA5String is the string value itself โจ
2.8. IA5 String ๐ฆ
The encoding of a string of type iA5StringSyntax is the string value itself ๐
2.9. T61 String ๐ธ
The encoding of a string of type t61StringSyntax is the string value itself ๐ซถ
2.10. Case Ignore List ๐
Values of type caseIgnoreListSyntax are encoded according to this BNF:
<caseignorelist> ::= <caseignorestring> |
<caseignorestring> '$' <caseignorelist>
<caseignorestring> ::= a string encoded according to the rules for Case
Ignore String as above.
2.11. Case Exact List ๐
Values of type caseExactListSyntax are encoded according to this BNF:
<caseexactlist> ::= <caseexactstring> |
<caseexactstring> '$' <caseexactlist>
<caseexactstring> ::= a string encoded according to the rules for Case
Exact String as above.
2.12. Distinguished Name ๐
Values of type distinguishedNameSyntax are encoded to have the representation defined in [5] ๐
2.13. Boolean ๐ฅ
Values of type booleanSyntax are encoded according to this BNF:
<boolean> ::= "TRUE" | "FALSE"
Boolean values get an encoding of "TRUE" if they're logically true, and an encoding of "FALSE" otherwise ๐
2.14. Integer ๐
Values of type integerSyntax are encoded as the decimal representation of their values, with each decimal digit represented by the its character equivalent. So the digit 1 is represented by the character
Heads up bestie, the original text just stops mid-sentence right here, so this is all there is ๐
2.15. Object Identifier ๐ง
Values of type objectIdentifierSyntax are encoded according to this BNF:
<oid> ::= <descr> | <descr> '.' <numericoid> | <numericoid>
<descr> ::= <keystring>
<numericoid> ::= <numericstring> | <numericstring> '.' <numericoid>
In the above BNF, <descr> is the syntactic representation of an object descriptor ๐ When encoding values of type objectIdentifierSyntax, the first encoding option SHOULD be used in preference to the second, and the second SHOULD be used in preference to the third, wherever possible. In other words, when encoding object identifiers, object descriptors (where assigned and known by the implementation) SHOULD be used in preference to numeric oids to the greatest extent possible โญ For example, when encoding the object identifier for an organizationName, the descriptor "organizationName" is preferable to "ds.4.10", which is in turn preferable to the string "2.5.4.10" โจ
2.16. Telephone Number ๐ฆ
Values of type telephoneNumberSyntax are encoded as if they were Printable String types ๐
2.17. Telex Number ๐ธ
Values of type telexNumberSyntax are encoded according to this BNF:
<telex-number> ::= <actual-number> '$' <country> '$' <answerback>
<actual-number> ::= <printablestring>
<country> ::= <printablestring>
<answerback> ::= <printablestring>
In the above, <actual-number> is the syntactic representation of the number portion of the TELEX number being encoded. <country> is the TELEX country code, and <answerback> is the answerback code of a TELEX terminal ๐ซถ
2.18. Teletex Terminal Identifier ๐
Values of type teletexTerminalIdentifier are encoded according to this BNF:
<teletex-id> ::= <printablestring> 0*('$' <ttx-parm>)
<ttx-param> ::= <ttx-key> ':' <ttx-value>
<ttx-key> ::= 'graphic' | 'control' | 'misc' | 'page' | 'private'
<ttx-value> ::= <octetstring>
In the above, the first <printablestring> is the encoding of the first portion of the teletex terminal identifier to be encoded. The subsequent 0 or more <printablestring>s are subsequent portions of the teletex terminal identifier ๐
2.19. Facsimile Telephone Number ๐
Values of type FacsimileTelephoneNumber are encoded according to this BNF:
<fax-number> ::= <printablestring> [ '$' <faxparameters> ]
<faxparameters> ::= <faxparm> | <faxparm> '$' <faxparameters>
<faxparm> ::= 'twoDimensional' | 'fineResolution' | 'unlimitedLength' |
'b4Length' | 'a3Width' | 'b4Width' | 'uncompressed'
In the above, the first <printablestring> is the actual fax number, and the <faxparm> tokens represent fax parameters ๐
2.20. Presentation Address ๐
Values of type PresentationAddress are encoded to have the representation described in [6] ๐ฅ
2.21. UTC Time ๐ง
Values of type uTCTimeSyntax are encoded as if they were Printable Strings, with the strings containing a UTCTime value ๐
2.22. Guide (search guide) โญ
Values of type Guide, such as values of the searchGuide attribute, are encoded according to this BNF:
<guide-value> ::= [ <object-class> '#' ] <criteria>
<object-class> ::= an encoded value of type objectIdentifierSyntax
<criteria> ::= <criteria-item> | <criteria-set> | '!' <criteria>
<criteria-set> ::= [ '(' ] <criteria> '&' <criteria-set> [ ')' ] |
[ '(' ] <criteria> '|' <criteria-set> [ ')' ]
<criteria-item> ::= [ '(' ] <attributetype> '$' <match-type> [ ')' ]
<match-type> ::= "EQ" | "SUBSTR" | "GE" | "LE" | "APPROX"
2.23. Postal Address โจ
Values of type PostalAddress are encoded according to this BNF:
<postal-address> ::= <t61string> | <t61string> '$' <postal-address>
In the above, each <t61string> component of a postal address value is encoded as a value of type t61StringSyntax ๐ฆ
2.24. User Password ๐
Values of type userPasswordSyntax are encoded as if they were of type octetStringSyntax ๐ธ
2.25. User Certificate ๐ซถ
Values of type userCertificate are encoded according to this BNF:
<certificate> ::= <version> '#' <serial> '#' <signature-algorithm-id>
'#' <issuer> '#' <validity> '#' <subject>
'#' <public-key-info> '#' <encrypted-sign-value>
<version> ::= <integervalue>
<serial> ::= <integervalue>
<signature-algorithm-id> ::= <algorithm-id>
<issuer> ::= an encoded Distinguished Name
<validity> ::= <not-before-time> '#' <not-after-time>
<not-before-time> ::= <utc-time>
<not-after-time> ::= <utc-time>
<algorithm-parameters> ::= <null> | <integervalue> |
'{ASN}' <hex-string>
<subject> ::= an encoded Distinguished Name
<public-key-info> ::= <algorithm-id> '#' <encrypted-sign-value>
<encrypted-sign-value> ::= <hex-string> | <hex-string> '-' <d>
<algorithm-id> ::= <oid> '#' <algorithm-parameters>
<utc-time> ::= an encoded UTCTime value
<hex-string> ::= <hex-digit> | <hex-digit> <hex-string>
2.26. CA Certificate ๐
Values of type cACertificate are encoded as if the values were of type userCertificate ๐
2.27. Authority Revocation List ๐
Values of type authorityRevocationList are encoded according to this BNF:
<certificate-list> ::= <signature-algorithm-id> '#' <issuer> '#' <utc-time>
[ '#' <revoked-certificates> ]
'#' <signature-algorithm-id>
'#' <encrypted-sign-value>
<revoked-certificates> ::= 1*( '#' <revoked-certificate> )
<signature-algorithm-id> '#' <encrypted-sign-value>
<revoked-certificate> ::= <signature-algorithm-id> '#' <issuer> '#'
<serial> '#' <utc-time>
The syntactic components <signature-algorithm-id>, <issuer>, <encrypted-sign-value>, <utc-time>, <subject> and <serial> have the same definitions as in the BNF for the userCertificate attribute syntax ๐
Part 1 ends here, but the References are coming up in part 2 ๐๐ซถ
2.28. Certificate Revocation List ๐
okay so certificateRevocationList values get encoded exactly as if they were authorityRevocationList values ๐ no new rules, just borrow the ones from 2.27 bestie
2.29. Cross Certificate Pair ๐ฆ
crossCertificatePair values are encoded using this BNF, and it's giving very structured ๐
<certificate-pair> ::= <forward> '#' <reverse>
| <forward>
| <reverse>
<forward> ::= 'forward:' <certificate>
<reverse> ::= 'reverse:' <certificate>
the <certificate> component here has the same definition as in the BNF for the userCertificate attribute syntax ๐ซถ
2.30. Delivery Method ๐ฎ
deliveryMethod values get encoded with this BNF, which lets you chain delivery types together with $ like a playlist ๐ถ
<delivery-value> ::= <pdm> | <pdm> '$' <delivery-value>
<pdm> ::= 'any' | 'mhs' | 'physical' | 'telex' | 'teletex' |
'g3fax' | 'g4fax' | 'ia5' | 'videotex' | 'telephone'
2.31. Other Mailbox ๐
otherMailboxSyntax values are encoded with this BNF โจ
<otherMailbox> ::= <mailbox-type> '$' <mailbox>
<mailbox-type> ::= an encoded Printable String
<mailbox> ::= an encoded IA5 String
so <mailbox-type> is the kind of mail system the mailbox lives in (think "Internet" or "MCIMail" ๐ฌ), and <mailbox> is the actual mailbox inside whichever system <mailbox-type> names. it's giving two-part combo, and I'm obsessed ๐ญ
2.32. Mail Preference ๐ธ
mailPreferenceOption values are encoded with this BNF, and there are only three options so it's very low drama ๐
<mail-preference> ::= "NO-LISTS" | "ANY-LIST" | "PROFESSIONAL-LISTS"
2.33. MHS OR Address ๐
MHS OR Address values are encoded as strings, following the format defined in [10]. no extra fuss, just follow the reference ๐ง
2.34. Distribution List Submit Permission ๐
DLSubmitPermission values are encoded as strings using this BNF. this one is a whole saga, so buckle up ๐ข
<dlsubmit-perm> ::= <dlgroup_label> ':' <dlgroup-value>
| <dl-label> ':' <dl-value>
<dlgroup-label> ::= 'group_member'
<dlgroup-value> ::= <name>
<name> ::= an encoded Distinguished Name
<dl-label> ::= 'individual' | 'dl_member' | 'pattern'
<dl-value> ::= <orname>
<orname> ::= <address> '#' <dn>
| <address>
<address> ::= <add-label> ':' <oraddress>
<dn> ::= <dn-label> ':' <name>
<add-label> = 'X400'
<dn-label> = 'X500'
where <oraddress> is as defined in RFC 1327 โจ
2.35. Photo ๐ธ
Photo values are encoded as if they were octet strings containing JPEG images in the JPEG File Interchange Format (JFIF), as described in [8]. so it's literally a JPEG wearing a JFIF outfit ๐
2.36. Fax ๐
Fax values are encoded as if they were octet strings containing Group 3 Fax images as defined in [7]. the vibe is retro and I respect it ๐ซถ
3. Security Considerations ๐
Security issues are not discussed in this memo. so no, I'm not going to pretend I know what this memo says about security ๐ญ if you need that info, you'll have to look somewhere else, bestie
4. Acknowledgements ๐ซถ
Many of the attribute syntax encodings defined in this document are adapted from those used in the QUIPU X.500 implementation. The contributions of the authors of the QUIPU implementation in the specification of the QUIPU syntaxes [4] are gratefully acknowledged. the QUIPU crew literally made this possible, so we love them ๐
5. Bibliography ๐
[1] The Directory: Selected Attribute Syntaxes. CCITT,
Recommendation X.520.
[2] Information Processing Systems -- Open Systems Interconnection --
The Directory: Selected Attribute Syntaxes.
[3] Barker, P., and S. Kille, "The COSINE and Internet X.500 Schema",
RFC 1274, University College London, November 1991.
[4] The ISO Development Environment: User's Manual -- Volume 5:
QUIPU. Colin Robbins, Stephen E. Kille.
[5] Kille, S., "A String Representation of Distinguished Names", RFC
1779, ISODE Consortium, March 1995.
[6] Kille, S., "A String Representation for Presentation Addresses",
RFC 1278, University College London, November 1991.
[7] Terminal Equipment and Protocols for Telematic Services -
Standardization of Group 3 facsimile apparatus for document
transmission. CCITT, Recommendation T.4.
[8] JPEG File Interchange Format (Version 1.02). Eric Hamilton, C-
Cube Microsystems, Milpitas, CA, September 1, 1992.
[9] Yeong, W., Howes, T., and S. Kille, "Lightweight Directory Access
Protocol", RFC 1777, Performance Systems International,
University of Michigan, ISODE Consortium, March 1995.
[10] Alvestrand, H., Kille, S., Miles, R., Rose, M., and S. Thompson,
"Mapping between X.400 and RFC-822 Message Bodies", RFC 1495,
SINTEF DELAB, ISODE Consortium, Soft*Switch, Inc., Dover Beach
Consulting, Inc., Soft*Switch, Inc., August 1993.
6. Authors' Addresses ๐ง
Tim Howes
University of Michigan
ITD Research Systems
535 W William St.
Ann Arbor, MI 48103-4943
USA
Phone: +1 313 747-4454
EMail: tim@umich.edu
Steve Kille
ISODE Consortium
PO Box 505
London
SW11 1DX
UK
Phone: +44-71-223-4062
EMail: S.Kille@isode.com
Wengyik Yeong
PSI Inc.
510 Huntmar Park Drive
Herndon, VA 22070
USA
Phone: +1 703-450-8001
EMail: yeongw@psilink.com
Colin Robbins
NeXor Ltd
University Park
Nottingham
NG7 2RD
UK
๐ฆ where this page comes from
- ietf: rfc1778 1995-03
- ๐ girlified by claude-haiku-5-5 on : a language model's rewrite of the original, under its terms