RFC 1249

DIXIE Protocol Specification

πŸ“… published August 1991, from ietf

DIXIE Protocol Specification πŸŽ€

okay bestie, we're kicking off RFC 1249 πŸ’– The DIXIE Protocol Specification came out of the Network Working Group in August 1991, written by T. Howes, M. Smith, and B. Beecher, all from the University of Michigan πŸŽ“ The title block doesn't list anything it obsoletes or updates, so it's giving totally independent main character energy πŸ’…


Status of this Memo 🌈

so this RFC defines a mechanism that lets TCP/UDP based clients access the OSI Directory Service πŸ“‡ without the overhead of the ISO transport and presentation protocols that a full-blown DAP needs 😭 This memo is here to provide information for the Internet community πŸ“– It does not specify any standard πŸ™…β€β™€οΈ and distribution of this memo is unlimited 🌸

Table of Contents πŸ¦‹

   1. Introduction ..............................................  2
   1.1 History ..................................................  2
   2. Protocol ..................................................  2
   2.1 Header ...................................................  3
   2.2 Operations ...............................................  4
   2.2.1 Read ...................................................  4
   2.2.1.1 Read Request .........................................  4
   2.2.1.2 Read Reply ...........................................  4
   2.2.2 Search .................................................  5
   2.2.2.1 Search Request .......................................  5
   2.2.2.2 Search Reply .........................................  5
   2.2.3 List ...................................................  5
   2.2.3.1 List Request .........................................  5
   2.2.3.2 List Reply ...........................................  5
   2.2.4 Modify .................................................  5
   2.2.4.1 Modify Request .......................................  6
   2.2.4.2 Modify Reply .........................................  6
   2.2.5 Modify RDN .............................................  6
   2.2.5.1 Modify RDN Request ...................................  6
   2.2.5.2 Modify RDN Reply .....................................  6
   2.2.6 Add ....................................................  6
   2.2.6.1 Add Request ..........................................  7
   2.2.6.2 Add Reply ............................................  7
   2.2.7 Remove .................................................  7
   2.2.7.1 Remove Request .......................................  7
   2.2.7.2 Remove Reply .........................................  7
   2.2.8 Bind ...................................................  7
   2.2.8.1 Bind Request .........................................  7
   2.2.8.2 Bind Reply ...........................................  8
   2.3 Operation Code Summary ...................................  8
   2.4 Return Code Summary ......................................  8
   3. References ................................................  9
   4. Available Implementations .................................  9
   5. Security Considerations....................................  9
   6. Authors' Addresses ........................................ 10

1. Introduction πŸ’«

okay so OSI Directory Service is honestly so powerful πŸ’… It's how you store info about objects and arrange those objects in a hierarchical structure 🌳 Tons of stuff can live in The Directory, like white pages info, application info, service info, and more πŸ“š The protocol for getting at all of that is the Directory Access Protocol (DAP), but the DAP is an OSI application-layer program, so it's pretty heavy-weight πŸ‹οΈ and it takes a substantial amount of computing power and coding investment to implement 😩

DIXIE is built for smaller hosts (e.g., Macintoshes and PCs) that don't have the computing power or the software needed to run a full OSI protocol stack πŸ“ It's also super useful for any Internet app that wants a simple interface to X.500 without a ton of coding 🧚

The basic idea behind DIXIE is the same as the one described in RFC 1202 for the Directory Assistance Protocol 🌸 DIXIE offers both UDP and TCP access to The Directory ✨ The Directory Assistance Protocol exports something of a user interface, while DIXIE provides a more direct protocol translation πŸ’œ

1.1 History πŸ•°οΈ

DIXIE has evolved over time and slowly grew into the protocol this document describes 🌱 Without understanding the circumstances behind that evolution, the wisdom of some of the DIXIE design decisions may not be apparent πŸ™ˆ


2. Protocol πŸ’…

this section breaks down the DIXIE protocol in detail πŸ” DIXIE follows a client-server request and response paradigm: clients send request packets to a DIXIE server, and the server sends reply packets back in return πŸ’Œ Communication can be over UDP or TCP, depending on what the client needs πŸ¦‹ All modification operations (ADD, REMOVE, MODIFY, MODIFYRDN) must be performed over a TCP connection, which provides some level of authentication πŸ”

🚨 bestie, the modification operations have to go over TCP, so they're not a UDP thing!

No matter which method of communication you use, the general packet format is the same 🧩 Each packet is a sixteen octet header followed by some data, and the format of the header and data for each kind of request is described below ✨

The representation used for all X.500 data passed between the server and the client is the QUIPU EDB format πŸ’– So, for example, a Distinguished Name might look something like c=US@o=University of Michigan. For a complete description of this format, see volume 5 of the ISODE Manual πŸ“˜

The DIXIE server listens on port 96 for both UDP packets and TCP connections πŸŽ€

2.1 Header πŸ“¦

The DIXIE packet header is sixteen octets long πŸ“ For requests, the header is described by the following:

      Start Length    Description
      0       1       An opcode specifying one of the operations
                      described below.  (see section 2.3 for a summary)
      1       2       A request identifier to be included in the reply.
                      This number should be unique to a request.
      3       4       The total length of the request packet, excluding
                      the header.
      7       2       Unused.
      9       1       Options.  Currently, there are only three options.
                      If bit 0 is set, "large" attributes will be
                      included in the response.  The choice of what
                      constitutes large is up to the implementation.
                      If bit 1 is set, the dereference aliases service
                      control will be set for the X.500 operation.  If
                      bit 2 is set, aliases will NOT be dereferenced and
                      searched during a search operation.
      10      1       Protocol version. The current version is 1.
      11      1       For the search operation, this byte specifies the
                      scope of the search.  (see section 2.2.2.1)
      12      2       Timelimit in seconds for the operation.
      14      2       Sizelimit for the operation (search and list).

For replies, the header is described by the following:

      Start Length    Description
      0       1       A return code specifying either success or
                      describing any error that occurred.  (see
                      section 2.4 for a description of each code)
      1       2       The identifier included in the corresponding
                      request packet.
      3       4       The total length of the response packet, excluding
                      the header.
      7       3       Unused.
      10      1       Protocol version.  The current version is 1.
      11      5       Unused.

All unused fields should be set to null octets, and they're reserved for future expansion 🫢

2.2.5 Modify RDN

okay so the DIXIE modify RDN operation is basically the X.500 DAP MODIFYRDN operation πŸ’…βœ¨

2.2.5.1 Modify RDN Request

bestie, listen πŸŽ€ the header opcode should be set to 0x13. The data portion is the DN of the entry you want to change, then a null octet, then the new RDN the entry should have, then one final null octet 🫢 The old RDN value is never kept as an attribute of the entry, so it's gone for good πŸ’€ And this operation is only allowed over TCP, no exceptions πŸ¦‹

2.2.5.2 Modify RDN Reply

no reply data here πŸ™ˆ The only way to know if it worked is the return code in the header ✨

2.2.6 Add

The DIXIE add operation is the X.500 DAP ADD operation, just with more main character energy πŸ‘‘

2.2.6.1 Add Request

The header opcode should be set to 0x11 🌸 The data portion starts with the DN of the entry you're adding, then a null octet, then a null-separated list of the entry's attributes. Each attribute looks like this:

type=value

The value part can be one single value, or several values separated by the "&" character πŸ’œ The whole request ends with two null octets in a row 🧚 This operation is only allowed over TCP 🌈

2.2.6.2 Add Reply

no reply data for add 🫢 Success or failure is only shown by the return code in the header, so check that header bestie πŸ’…

2.2.7 Remove

The DIXIE remove operation corresponds to the X.500 DAP REMOVE operation. It's giving clean-up crew 🧹✨

2.2.7.1 Remove Request

The header opcode should be set to 0x12 πŸ“ The data portion is the DN of the entry to remove, followed by a null octet. This operation is only allowed over TCP πŸ”₯

2.2.7.2 Remove Reply

no reply data πŸ™ˆ Just the return code in the header tells you whether it worked πŸ’–

2.2.8 Bind

The DIXIE bind operation is the X.500 DAP BIND operation using simple authentication, as defined in Recommendation X.509. Very official, very iconic πŸ“œπŸ‘‘

2.2.8.1 Bind Request

The header opcode should be set to 0x04 πŸ¦‹ The data portion is the DN of the entry you want to bind as, then a null octet, then that entry's password, then a final null octet πŸ” A null DN causes a bind as NULLDN to occur πŸŒ™

2.2.8.2 Bind Reply

okay this one depends on the transport ✨ If the bind was invoked over TCP, there's no reply data, and the return code in the packet header tells you if it worked πŸŽ€

If the bind was invoked over UDP, the data portion of the reply is an Internet address in standard dot notation, then a 0x01 octet, then a decimal number written as text, then a null octet πŸ’œ The address and number should be taken to be the IP address and port number the client should connect to in order to get an authenticated TCP connection, bound as the entity named in the request packet 🧚 Literally a redirect with a bow on top πŸŽ€


2.3 Operation Code Summary

This section lists the possible values for the DIXIE header operation code. There are currently 8 possible values 🌈

0x01    Read
0x02    Modify
0x04    Bind
0x0f    Search
0x10    List
0x11    Add
0x12    Remove
0x13    Modify RDN

2.4 Return Code Summary

This section describes the possible values for the DIXIE header return code. There are currently 17 possible values, so let's get into it πŸ’…

0x01    The request was successful.
0x02    The search did not find any matches.
0x03    Some unknown, generic DIXIE error has occurred.
0x04    The DIXIE opcode was not recognized by the DIXIE server.
0x05    Insufficient access to perform a modification.
0x06    A malformed DN was supplied.
0x07    Some time limit or size limit was reached.
        Partial results will be returned.
0x08    A modify was attempted before a bind.
0x09    A fragment requested was not found.
0x0a    An attribute type specified is invalid.
0x0b    An attribute specified does not exist in the entry.
0x0c    An attribute value specification is invalid.
0x0d    An attribute value does not exist (as for removal of the
        value).
0x0e    A modification of an entry's RDN was attempted via a modify
        operation.  This is not allowed (use modrdn instead).
0x0f    A supplied DN references an invalid portion of the tree.
0x10    The DSA has passed back a referral to another DSA (as for a
        modification to a non-local entry), and the DIXIE server was
        unable to follow it.
0x11    The DSA is down or unreachable.

3. References ✨

[1] Information Processing - Open Systems Interconnection - The Directory, International Organization for Standardization, International Standard 9594, 1988. πŸ“š

[2] Kille, S., Robbins, C., Roe, M., and A. Turland, "The ISO Development Environment: User's Manual", Volume 5: QUIPU, Performance Systems International, January 1990. 🧠

[3] Rose, M., "Directory Assistance Service", RFC 1202, Performance Systems International, February 1991. 🌸

4. Available Implementations πŸŽ€

This section is not meant as an endorsement of any implementation. It's just information for the Internet community 🫢 A full Un*x-based implementation of the DIXIE protocol, in the form of a DIXIE server and DIXIE application library, is freely available for anonymous FTP from the host terminator.cc.umich.edu in the ~ftp/x500 directory πŸ’Ύ Un*x and Macintosh clients that use the DIXIE protocol have also been implemented and are available from the same location 🍎

There's also a discussion list for DIXIE-related topics, dixie@terminator.cc.umich.edu. To join, send mail to dixie-request@terminator.cc.umich.edu πŸ’Œ

5. Security Considerations πŸ”

Security issues are not discussed in this memo. πŸ’€ Please note this is a big gap, so take it seriously before deploying anything πŸ™ˆ

6. Authors' Addresses πŸ¦‹

Tim Howes
University of Michigan
Information Technology Division
535 West William St.
Ann Arbor, MI 48103-4943

Phone: +1 313 764-2278
EMail: tim@umich.edu
Mark Smith
University of Michigan
Information Technology Division
535 West William St.
Ann Arbor, MI 48103-4943

Phone: +1 313 764-2277
EMail: mcs@umich.edu
Bryan Beecher
University of Michigan
Information Technology Division
535 West William St.
Ann Arbor, MI 48103-4943

Phone: +1 313 764-4050
EMail: bryan@umich.edu

That's the whole thing, bestie! πŸŒˆπŸ’–βœ¨

πŸ“¦ where this page comes from