RFC 2157

Mapping between X.400 and RFC-822/MIME Message Bodies

๐Ÿ“… published January 1998, from ietf

RFC 2157: Mapping between X.400 and RFC-822/MIME Message Bodies ๐Ÿ’–

okay bestie, this one is the body-part translator for X.400 and MIME mail. It's giving "making two mail worlds talk to each other without losing the good stuff" ๐Ÿฆ‹

Here's the title block, so you know the basics:

  • Author: H. Alvestrand, UNINETT ๐ŸŽ€
  • Network Working Group, and the category is Standards Track โœจ
  • Date: January 1998 ๐ŸŒธ
  • Obsoletes/Updates: the header doesn't list any RFCs it obsoletes or updates ๐Ÿงš

Status of This Memo ๐Ÿ“œ

This document specifies an Internet standards track protocol for the Internet community, and requests discussion and suggestions for improvements. Please refer to the current edition of the "Internet Official Protocol Standards" (STD 1) for the standardization state and status of this protocol. Distribution of this memo is unlimited. ๐Ÿ’…

Copyright (C) The Internet Society (1998). All Rights Reserved. ๐Ÿซถ

Table of Contents ๐Ÿ—‚๏ธ

1 Introduction ...........................................    2
1.1 Glossary .............................................    3
2 Basic rules for body part conversion ...................    4
2.1 Generating the IPM Body from MIME ....................    5
2.2 Generating the MIME Body from the IPMS.Body ..........    6
2.3 Mapping the EMA FTBP parameters ......................    7
2.3.1 Mapping GraphicStrings .............................    7
2.3.2 Mapping specific parameters ........................    7
2.3.3 Summary of FTBP elements generated .................   10
2.4 Information that is lost when mapping ................   11
3 Encapsulation of body parts ............................   11
3.1 Encapsulation of MIME in X.400 .......................   12
3.1.1 FTBP encapsulating body part .......................   12
3.1.2 BP15 encapsulating body part .......................   13
3.1.3 Encapsulation using IA5 (HARPOON) ..................   15
3.1.4 Content passing using BP14 .........................   16
3.2 Encapsulating X.400 Body Parts in MIME ...............   16
3.3 Encapsulating FTBP body parts in MIME ................   17
4 User control over the gateway choice ...................   18
4.1 Conversion from MIME to X.400 ........................   18
4.2 Conversion from X.400 to MIME ........................   20
5 The equivalence registry ...............................   21
5.1 What information one must give about a mapping
     .....................................................   21
5.2 Equivalence summary for known X.400  and  MIME
    Types ................................................   22
5.3 MIME to X.400 Table ..................................   23
5.4 X.400 to MIME Table ..................................   23
5.5 Use of OBJECT IDENTIFIERs and ASN.1 MACROS ...........   24
6 Defined Equivalences ...................................   26
6.1 IA5Text - text/plain .................................   26
6.2 GeneralText - text/plain (ISO-8859) ..................   27
6.3 BilaterallyDefined - application/octet-stream
    ......................................................   29
6.4 FTBP  EMA  Unknown  Attachment   -
    application/octet-stream .............................   29
6.5 MessageBodyPart - message/RFC822 .....................   30
6.6 MessageBodyPart - multipart/* ........................   31
6.7 Teletex - Text/Plain (Teletex) .......................   32
7 Body parts where encapsulation is recommended ..........   33
7.1 message/external-body ................................   34
7.2 message/partial ......................................   35
7.3 multipart/signed .....................................   35
7.4 multipart/encrypted ..................................   36
8 Conformance requirements ...............................   37
9 Security Considerations ................................   38
10 Author's Address ......................................   38
11 Acknowledgements ......................................   38
 References ..............................................   38
 APPENDIXES ..............................................   41
 Appendix A: Escape code normalization ...................   41
 Appendix B: OID Assignments .............................   44
 Appendix  C:  Registration information for the
     Teletex character set ...............................   46
 Appendix  D:  IANA Registration form for new
 mappings ................................................   48
 Full Copyright Statement .................................  49

1. Introduction โœจ

This document is a companion to [MIXER], which defines the principles and translation of headers for interworking between MIME-based RFC-822 mail and X.400 mail. ๐Ÿ’Œ

This document defines how to map body parts of X.400 messages into MIME entities and vice versa, including the handling of multipart messages and forwarded messages. ๐ŸŽ€

1.1. Glossary ๐Ÿ“–

The following terms are defined in this document: ๐Ÿซถ

Body part Part of a message that has a unique type. This term comes from X.400; the corresponding term in MIME (RFC 2046) is limited to use in parts of a multipart message; the term "body" may correspond better. ๐Ÿงš

Content-type Type information indicating what the content of a body part actually is. This term comes from MIME; the corresponding X.400 term is "body part type". ๐ŸŒˆ

Mapping (noun): A description of how to transform an X.400 body part into a MIME body part, or how to transform a MIME body part into an X.400 body part. ๐Ÿฆ‹

Equivalence A set of two mappings that taken together provide a lossless conversion between an X.400 body part and a MIME body part ๐Ÿ’œ

Encapsulation The process of wrapping something from one of the mail systems in such a way that it can be carried inside the other mail system. When encapsulating, it is not expected that the other mail system can make reasonable sense of the body part, but a gateway back into the first system will always be able to convert the body part without loss back to its original format. ๐ŸŽ

HARPOON encapsulation The encapsulating of a MIME body part by putting it inside an IA5 body with all headers and encoding intact. First described in RFC 1496 [HARPOON]. ๐ŸŸ

Tunneling What happens when one gateway encapsulates a message and sends it to another gateway that decapsulates it. The hope is that this will cause minimal damage to the message in transit. ๐Ÿš‡

DISCUSSION At many points in this document, the author has found it useful to include material that explains part of the reasoning behind the specification. These sections all start with DISCUSSION: and continue to the next numbered section heading; they do not dictate any additional requirements on a gateway. ๐Ÿง 

The words MUST, SHOULD and MAY, when capitalized, are used as defined in RFC 2119 [MUST]. ๐Ÿ”ฅ

2. Basic rules for body part conversion ๐Ÿ“

The basic approach for translating body parts is described in section 2.1 and 2.2. ๐Ÿ—บ๏ธ

Chapter 3 gives details on "encapsulation", which allows you to be certain that no information is lost even when unknown types are encountered. ๐Ÿซง

Chapter 6 gives the core mappings for various body parts. ๐Ÿ’Ž

The conformance requirements in chapter 8 describe what the minimum conformance for a MIXER gateway is with respect to body part conversion. โœ…

DISCUSSION:

At the moment both the MIME and the X.400 worlds seem to be in a stable state of flux with regards to carrying around stuff that is not text. In such a situation, there is little chance of defining a mapping between them that is the best for all people, all of the time. For this reason, this specification allows a gateway considerable latitude in deciding exactly what conversion to apply. ๐ŸŒช๏ธ

The decision taken by the gateway may be based on various information sources: ๐Ÿ•ต๏ธโ€โ™€๏ธ

  1. If the gateway knows what body parts or content types the recipient is able to handle, or has registered a particular set of preferences for a user, and knows how to convert the message reasonably to those body parts, the gateway may choose to convert body parts in the message to those types only. ๐Ÿ’…
  2. If the gateway gets indications (via special headers or heading-extensions defined for the purpose) that the sender wanted a particular representation on the "other side", and the gateway is able to satisfy the request, it may do so. Such a mechanism is defined in chapter 4 of this document. ๐ŸŽ€
  3. If the gateway gets a message that might be appropriate to send as one out of several types, but where the typing information does not tell you which one to use (like an X.400 BP14, FTAM "just a file", or MIME application/octet-stream), it may apply heuristics like looking at content or looking at filenames to figure out how to deal with the message. ๐Ÿ”
  4. If the gateway knows that the next hop for the message has limited capabilities (like X.400/84), it may choose to perform conversions appropriate for that medium. ๐Ÿ“ฎ
  5. Where no mapping is known by the gateway, it may choose to drop the body part, reject the message, or encapsulate the body part as described in chapter 3. The choice may be configurable, but a conformant MIXER gateway MUST be able to be configured for encapsulation. ๐Ÿซถ

In many cases, a message that goes SMTP->X.400->SMTP will arrive without loss of information. ๐Ÿ’–

In some cases, the reverse translation may not be possible, or two gateways may choose to apply different translations, based on the criteria above, leading to an apparently inconsistent service. ๐Ÿ˜ญ

In addition, service will vary because some gateways will have implemented conversions not implemented by other gateways. ๐Ÿ™ˆ

This is believed to be unavoidable. ๐Ÿ’€

2.1. Generating the IPM Body from MIME ๐ŸŒธ

When converting the body of a message from MIME to X.400, the following steps are taken: โœจ

If the header does not contain a 822.MIME-Version field, then generate an IPMS.Body with a single IPMS.BodyPart of type IPMS.IA5TextBodyPart containing the body of the RFC 822 message with IPMS.IA5TextBodyPart.parameters.repertoire set to the default (IA5). ๐Ÿงš

If 822.MIME-Version is present, the body is analyzed as a MIME message and the body is converted according to the mappings configured and implemented in the gateway. ๐Ÿฆ‹

2.2. Generating the MIME Body from the IPMS.Body โœจ

okay bestie, this is the X.400 to MIME direction, and the steps go in a specific order ๐Ÿ’…. When a message body gets converted from X.400 to MIME, these are the steps:

If there is more than one body part, and the first body part is IA5 and has the string RFC-822-Headers: as its first line, then the remainder of this body part shall be appended to the RFC 822 header. This relies on the theory that this body part was generated according to Appendix B of MIXER ๐Ÿงš. A gateway shall check the consistency and syntax of this body part, to make sure the resulting message is conformant with RFC 822 ๐Ÿ’–.

If the remaining IPMS.Body consists of a single IPMS.Bodypart, there are three possibilities ๐Ÿซถ.

(1) If it is of type IPMS.IA5Text, and the first line is MIME-Version: 1.0, it is assumed to be a HARPOON-encapsulated body part. The complete body content is then appended to the headers, and the separating blank line is inside the message. If an RFC 822 syntax error is discovered inside the message, it may be mapped directly as described below instead ๐Ÿฆ‹.

(2) If it is of type IPMS.IA5Text, then this is mapped directly and the default MIME encoding (7bit) is used, unless very long lines or non-ASCII or control characters are found in the body part. In that case, Quoted-Printable SHOULD be used ๐ŸŒธ.

(3) All other types are mapped according to the mappings configured and implemented in the gateway ๐Ÿ“.

If the IPMS.Body contains multiple IPMS.Bodypart fields, then a MIME message of content type multipart is generated. If all of the body parts are messages, then it's multipart/digest. Otherwise it's multipart/mixed. The components of the multipart are generated in the same order as in the IPMS.Body โญ.

Each component is mapped according to the mappings configured and implemented in the gateway. Any IA5 body parts are checked to see if they are HARPOON mappings, as described above ๐Ÿ‘‘.


2.3. Mapping the EMA FTBP parameters

DISCUSSION:

EMA has defined a profile for use of the File Transfer Body Part (FTBP). [MAWG] ๐ŸŽ€

New mappings are expected to use this as the mechanism for carrying body parts. Since it's important to have a consistent mapping for the special FTBP parameters, those are defined here ๐Ÿ’œ.

The mapping of the body will depend on the content-type in MIME and on the application-reference in FTBP, and it is not specified here. However, in many cases we expect the translation to involve simply copying the octets from one format to the other. That's "no conversion" โœจ.

2.3.1. Mapping GraphicStrings

Some parameters of the EMA Profile are encoded as ASN.1 GraphicStrings, which are troublesome because they can contain any ISO registered graphic character set ๐Ÿ˜ญ. To map these to ASCII for use in mail headers, the gateway may either:

(1) Use the RFC 2047 [MIME-HDR] encoding mechanism to create appropriate encoded-words for the headers involved. Note that in some cases, such as within Content-Disposition filenames, the encoded-words must be in quotes, which is not the normal usage of encoded-words ๐Ÿ™ˆ.

(2) Apply the normalization procedure given in Appendix A to identify the ASCII characters of the string, and replace all non-ASCII characters with the question mark (?) ๐Ÿงš.

Both procedures are valid for MIXER gateways. The simplified procedure of ignoring escape sequences and bit-stripping the result is NOT valid ๐Ÿ’€.

2.3.2. Mapping specific parameters

The following parameters are mapped in both directions ๐Ÿซถ:

Content-ID

The mapping of this element is complex ๐ŸŒˆ.

The Content-ID is encoded as an IPM.MessageIdentifier and entered into FTBP.FileTransferParameters.related-stored-file.file-identifier.cross-reference.message-reference.

FTBP.FileTransferParameters.related-stored-file.relationship.descriptive-relationship is set to the string "Internet MIME Body Part".

FTBP.FileTransferParameters.related-stored-file.file-identifier.cross-reference.application-crossreference is set to a null OCTET STRING.

The reverse mapping is only performed if FTBP.FileTransferParameters.related-stored-file.relationship.descriptive-relationship has the string value "Internet MIME Body Part" ๐Ÿ”ฅ.

Content-Description

The value of this field is mapped to and from the first string in FTBP.FileTransferParameters.environment.user-visible-string ๐ŸŒธ.

Content-Disposition

This field is defined in [CDISP]. It has multiple components, and the handling of each component is given below ๐ŸŽ€.

The "disposition" component is ignored on MIME -> X.400 mapping, and is always "attachment" on X.400 -> MIME mapping ๐Ÿ’….

C-D: filename

The filename component of the C-D header is mapped to and from FileTransferParameters.file-attributes.pathname ๐Ÿฆ‹.

The EBNF.disposition-type is ignored when creating the FTBP pathname, and it's always set to "attachment" when creating the Content-Disposition header. For example:

Content-Disposition: attachment; filename=dodo.doc

or

Content-Disposition: attachment; filename=/etc/passwd

The filename will be carried as a single incomplete-pathname string. No special significance is assumed for the characters "/" and "". Note that normal security precautions MUST be taken in using a filename on a local file system. This should be obvious from the second example ๐Ÿšจ.

This is done to be conformant with the EMA Profile. ๐ŸŽ€

C-D: Creation-date

Mapped to and from FileTransferParameters.file-attributes.date-and-time-of-creation ๐Ÿ“.

For this and all other date fields, the RFC-822 date format is used (822.date-time). Note that the parameter syntax of [CDISP] requires that all dates be quoted! ๐Ÿ™ˆ

C-D: Modification-date

Mapped to and from FileTransferParameters.file-attributes.date-and-time-of-last-modification โญ.

C-D: Read-date

Mapped to and from FileTransferParameters.file-attributes.date-and-time-of-last-read-access ๐ŸŒˆ.

C-D: Size

Mapped to and from FileTransferParameters.file-attributes.object-size. If the value is "no-value-available", the component is NOT generated ๐Ÿ’œ.

Other RFC-822 headers

Mapped to an extension in FTBP.FileTransferParameters.extensions using the rfc-822-field HEADING-EXTENSION from [MIXER] ๐Ÿงš.

NOTE:

The set of headers that are mapped will depend on the placement of the body part (single body part or multipart). When it is the only body of a message, headers starting with "content-" SHOULD be put into the FTAM extension, and all other headers should be put into the IPMS extension for the message. When it is a single bodypart of a multipart, ALL headers on the body part are included, since there is nowhere else to put them. Note that only headers that start with "content-" have defined semantics in this case ๐Ÿซถ.

EMA NOTE

The EMA profile, version 1.5, specifies that handling of extensions is Optional for reception. This means that some non-MIXER gateways may not implement handling of this field, and some UAs may not have the possibility of showing the content of this field to the user ๐Ÿ˜ญ.

An alternative approach using FTBP.FileTransferParameters.environment.user-visible-string was suggested to EMA. The EMA MAWG recommended in its April 1996 conference that the IETF MIXER group should rather choose this approach ๐Ÿ‘‘.

2.3.3. Summary of FTBP elements generated

This is a summary of the preceding section, and it does not add new information ๐Ÿ“.

The following elements of the FTBP parameters are mapped or used. The rightmost column gives their status in the EMA profile, where M=Mandatory, O=Optional, and R=Recommended for Origination/Receipt ๐ŸŒธ:

FileTransferParameters                                             M/M
  Related-Stored-File                                              O/O
    file-identifier
      cross-reference
        application-crossreference         NULL
        message-reference                  Content-ID
    descriptive-relationship               Used as marker
  contents-type                    Must be unstructured-binary     M/M
  environment                                                      M/M
    application-reference                  Selects mapping         M/M
    user-visible-string                    Content-description     R/M
  file-attributes
    pathname                               C-D: Filename           R/M
    date-and-time-of-creation              C-D: Creation-Date      O/O
    date-and-time-of-last-modification     C-D: Modification-Date  R/M
    date-and-time-of-last-read-access      C-D: Read-Date          O/O
    object-size                            C-D: Size               R/M
  extensions                     Other headers       O/O

All other elements of the FTBP parameters are discarded ๐Ÿ—‘๏ธ.

NOTE: There is ongoing work on defining a more complete mapping between FTBP headers and a set of RFC-822 headers. A gateway MAY choose to support the larger set once it is available, but it MUST support this limited set ๐Ÿ”ฅ.


2.4. Information that is lost when mapping

MIME defines fields which add information to MIME contents. Two of these are "Content-ID" and "Content-Description", which have special rules here. MIME allows new fields to be defined at any time ๐ŸŒˆ.

The possibilities are pretty limited for what you can do with this information ๐Ÿฅบ:

(1) When using encapsulation, the information can be preserved.

(2) When using mapping to FTBP, the information can be preserved in the FileTransferParameters.extensions defined for that purpose.

(3) When mapping to a single-body message, the information can be preserved as P22 header extensions.

(4) When mapping to other body part types, the information must be discarded ๐Ÿ’”.

3. Encapsulation of body parts ๐Ÿฆ‹

Where no mapping is possible, the gateway may choose any of the following alternatives:

  • Discard the body part, leaving a "marker" saying what happened ๐Ÿท๏ธ
  • Reject the message ๐Ÿšซ
  • "Encapsulate" the body part, by wrapping it in a body part defined for that purpose in the other mail system ๐ŸŽ

The choice to be made should be configurable in the gateway. It may depend on both policy and knowledge of the recipient's capabilities ๐Ÿ’œ.

3.1. Encapsulation of MIME in X.400 โœจ

okay bestie, so there are four body parts defined here to wrap MIME body parts up so they can travel through X.400 ๐ŸŽ€๐Ÿ’…

This externally-defined body part is backwards compatible with RFC 1494 ๐Ÿงš. The FTBP body part is compatible with the EMA MAWG document [MAWG], version 1.5, but it has some extensions, especially the one for extra headers โœจ.

Here are the imagined scenarios for each body part ๐Ÿฆ‹:

  • FTBP: for use when sending to recipients that can handle generic FTBP, and for tunnelling MIME to a MIME UA
  • BP15: for use when tunnelling MIME to a MIME UA through an X.400(88) network, or to UAs that have been written to RFC 1494
  • IA5: for use when tunneling MIME to a MIME UA through an X.400 network, where some of the links may involve X.400(84)
  • BP14: for use when the recipient may be an X.400(84) UA with BP14 handling capability, and the loss of information in headers is not regarded as important

but the gateway is free to use any method it finds appropriate in any situation ๐Ÿ’–.

FTBP is expected to be the most useful body part when sending to X.400(92) systems, while the BP14 content passing is primarily useful for sending to X.400(84) systems ๐ŸŒธ.

3.1.1. FTBP encapsulating body part ๐Ÿ’Œ

this body part leans on the big MIME assumption that all message content can be legally and completely represented by a single octet stream, the "canonical format" ๐Ÿซถ.

The FTBP encapsulating body part is defined by the application-reference id-mime-ftbp-data. All headers get mapped to the FTBP headers, including putting the "Content-type:" header inside the FTBP ExtensionsField ๐ŸŽ€.

Translation from the MIME body part is done by:

  • Undoing the content-transfer-encoding
  • Setting the FileTransferData.FTdata.value.octet-aligned to the resulting string of octets
  • Putting the appropriate parameters into the headers

Reversing the translation is done by:

  • Extracting the headers
  • Applying an appropriate content-transfer-encoding to the body. If this is for some reason different from the content-transfer-encoding: header retrieved from the headers, the old one must be deleted ๐Ÿงน

This mapping is lossless, and therefore counts as "no conversion" ๐Ÿ‘‘.

Note that this mapping does not work with multipart types. The multipart must first be mapped to a ForwardedIPMessage ๐Ÿ’€.

3.1.2. BP15 encapsulating body part ๐ŸŒˆ

this section defines an extended body part, based on body part 15, which may be used to hold any MIME content ๐Ÿฆ„.

    mime-body-part EXTENDED-BODY-PART-TYPE
          PARAMETERS MimeParameters
                   IDENTIFIED BY id-mime-bp-parameters
          DATA            OCTET STRING
          ::= id-mime-bp-data

    MimeParameters ::=
          SEQUENCE {
                     content-type       IA5String,
                     content-parameters SEQUENCE OF
                                        SEQUENCE {
                                            parameter          IA5String
                                            parameter-value    IA5String
                                        }
                     other-header-fields RFC822FieldList
                 }

The OBJECT IDENTIFIERS id-mime-bp-parameter and id-mime-bp-data are defined in Appendix B. A MIME content is mapped onto this body part. The MIME headers of the body part get mapped like so:

RFC822FieldList is defined in Appendix L of [MIXER].

  • Content-Type:
    • The "type/subtype" string is mapped to MimeParameters.content-type.
    • For each "parameter=value" string, create a MimeParameters.content-parameters element. The MimeParameters.content-Parameters.parameter field is set to the parameter, and the MimeParameters.content-parameters.parameter-value field is set to the value.
    • Quoting is preserved in the parameter-value.
  • Other
    • Take all other headers and create MimeParameters.other-header-fields. The MIME-version, content-type and content-transfer-encoding fields are not copied.
NOTE: The set of headers that get mapped will depend on where the body part sits (single body part or multipart) ๐Ÿ‘€. When it is the only body of a message, headers starting with "content-" SHOULD be put into the other-header-fields, and all other headers should be put into the IPMS extension for the message. When it is a single bodypart of a multipart, ALL headers on the body part are included, since there is nowhere else to put them. Note that only headers that start with "content-" have defined semantics in this case.

The body is mapped as follows:

Convert the MIME body part into its canonical form, as specified in Appendix H of MIME [MIME]. This canonical form is used to generate the mime-body-part.data octet string ๐Ÿงƒ.

The Parameter mapping may be used independently of the body part mapping (e.g., in order to use a different encoding for a mapped MIME body part) ๐Ÿ’œ.

This body part contains all of the MIME information, so it can be mapped back to MIME without loss of information ๐Ÿ™Œ.

The OID id-mime-bp-data is added to the Encoded Information Types of the envelope.

This body part is completely compatible with RFC 1494 โœจ.

When converting back to a MIME body part, the gateway is responsible for:

  1. Selecting an appropriate content-transfer-encoding, and deleting any content-transfer-encoding header from the other-header-fields
  2. Adding quotes to any parameters that need them (but not adding quotes to parameters that are already quoted)
  3. Removing any content-type field that is left in the RFC822FieldList of the message that is redundant or conflicting with the one from the mime-body-part
  4. Making sure that on multipart messages, the boundary string actually used is reflected in the boundary-parameter of the content-type header, and does not occur within the body of the message

3.1.3. Encapsulation using IA5 (HARPOON) ๐Ÿ“

this approach is the one taken in RFC 1496 - HARPOON - for tunneling any MIME body part through X.400/84 networks. It has proven rather unhelpful for bringing information to X.400 users, but it preserves all the information of a MIME body part ๐Ÿฅฒ.

The following IA5Text body part is made:

  • Content = IA5String
  • First bytes of content (the description is in US ASCII, with C escape sequences used to represent control characters):
MIME-version: <version>\r\n
Content-type: <the proper MIME content type>\r\n
Content-transfer-encoding: <7bit, quoted-printable or base64>\r\n
<Possibly other Content headings here, terminated by\r\n>
 \r\n
<Here follows the bytes of the content, encoded
 in the proper encoding>

All implementations MUST place the MIME-version: header first in the body part. Headers that are placed by [MIXER] into other parts of the message MUST NOT be placed in the MIME body part ๐Ÿšซ.

This encapsulation may also be applied to subtypes of multipart, creating a single IA5 body part that contains a single multipart/*, which in turn may contain multiple MIME body parts ๐Ÿช†.

3.1.4. Content passing using BP14 ๐Ÿ’…

this is described here because it sits at the same conceptual level as encapsulation. It is a lossy transformation, so it is impossible to reconstruct the MIME type information from it ๐Ÿ˜ญ.

Nevertheless, there is a demand for such functionality ๐Ÿซ .

This "encapsulation" simply strips off all headers, undoes the content-transfer-encoding, and creates a BilaterallyDefined body part (BP14) from the resulting octet stream.

No reverse translation is defined. When a BP14 arrives at a MIXER gateway, it will be turned into an application/octet-stream according to chap. 6.3 ๐Ÿ”.

3.2. Encapsulating X.400 Body Parts in MIME ๐ŸŒธ

this section specifies a generic mechanism to map X.400 body parts to a MIME content. This allows the body part to be tunneled through MIME. It may also be used directly by an appropriately configured MIME UA ๐Ÿงš.

This content-type is defined to carry any X.400 extended body part. The mapping of all standard X.400 body parts is defined in this document. The content-type field is "application/x400-bp". The parameter is defined by the EBNF:

    mime-parameter =  "bp-type=" ( object-identifier / 1*DIGIT=

If the body is a basic body part, the bp-type parameter is set to the number of the body part's context-specific tag, that is, the tag of the IPMS.Body.BodyPart component.

If the body is an Extended Body Part, the EBNF.object-dentifier is set to the OBJECT IDENTIFIER from IPMS.body.externally-defined.data.direct-reference.

For example, a basic VideotexBodyPart will have:

   Content-type=application/x400-bp; bp-type=6

whilst an Extended Videotex body part will have:

   Content-type=application/x400-bp; bp-type=2.6.1.4.5

The body contains the raw ASN.1 IPM body octet stream, that is, the BER encoding of the IPM.Body.BodyPart, including the initial tag octet ๐Ÿ”. The content may use a content-transfer-encoding of either base64 or quoted-printable when carried in 7-bit MIME. It is recommended to use the one which gives the more compact encoding of the data. If this cannot be determined, Base64 is recommended. No attempt is made to turn the parameters of Extended Body Parts into MIME parameters, as this cannot be done in a general manner ๐Ÿฅน.

For extended body parts, the

3.3. Encapsulating FTBP body parts in MIME ๐Ÿงš

The File Transfer Body Part is believed to be important in the future as "the" means of carrying well-identified data in X.400 networks ๐ŸŒŸ.

They also share the property (at least when limited to the EMA MAWG functional profile) of having a well-defined data part that is always representable as a sequence of bytes ๐Ÿ’–.

This conversion will have to fail, and the x400-bp encapsulation used instead, if:

  • FileTransferData has more than one element
  • Contents-type is not unstructured-binary
  • Parameters that are not mappable, but important, are present (like Compression, which EMA doesn't recommend)

Otherwise, it can be encapsulated in MIME by:

  • Creating the "content-type" value by forming the string "application/x-ftbp." and appending the numbers of the OID found in FileTransferParameters.environment.application-reference.registered-identifier
  • Mapping all other parameters according to the standard FTBP parameter mapping
  • Applying an appropriate content-transfer-encoding to the data contained in FileTransferData.value.encoding

DISCUSSION:

The choice of the somewhat strange, and by necessity unregistered, MIME type application/x-ftbp.n.n.n.n is because for any concrete example of this usage, it will be easy to configure any MIME reader to take advantage of the identification ๐Ÿค“. If the MIME type registration rules are ever changed to allow the registration of a namespace, rather than just of names, the "x-" can be deleted, and the types can be application/ftbp.n.n.n.n ๐ŸŽ‰.

4. User control over the gateway choice โœจ

Okay bestie, so sometimes the gateway makes an inappropriate call about what to do with a particular body part ๐Ÿ’€. To give everyone an escape hatch, this chapter defines a way for the user to tell the gateway which action they think is most appropriate ๐Ÿซถ.

The headers here override any "conversion prohibited" and "conversion with loss prohibited" on the message. The gateway is still responsible for making sure the generated messages conform to the destination domain's syntax rules ๐Ÿ’….

DISCUSSION: The point of this mechanism is to let the sender efficiently get a message through to a single recipient when the sender knows something about that recipient that the gateway doesn't ๐Ÿงš.

It isn't part of the minimum functionality listed in chapter 8. A gateway doesn't have to implement this spec to be MIXER conformant, but if it does, it should be done like this ๐ŸŒธ.

The extra complexity, both in the user interface and in the protocol, of making this field selectable per recipient was not thought worthwhile;

4.1. Conversion from MIME to X.400

The header field described below specifies explicit MIXER conversion. Comments are allowed within the field according to the usual RFC 822 convention ๐ŸŽ€.

If "x400-object-id" is omitted, "tunnel" is assumed.

mime-to-x400 = "Wanted-X400-Conversion" ":"
                [ mime-from ]  [ x400-object-id ]
                "in" x400-encoding

x400-object-id =  "to" ( object-identifier-2 / "tunnel" )
x400-encoding = "bp14" / "bp15" / "ftbp" / "ia5"
mime-from = "from" mime-type
mime-type = word

There is no way to ask for a different conversion based on MIME parameters or bodypart content ๐Ÿ™ˆ.

Examples:

Wanted-X400-Conversion: from application/msword
                to 1.2.840.113556.4.2 (Microsoft defined ms-word)
                in ftbp

This one uses the MAWG definitions and leads to an FTBP encoding ๐Ÿฆ‹.

Wanted-X400-Conversion: from application/msword
               to tunnel in bp14

This leads to a Body Part 14 encoding for all body parts of type application/msword ๐Ÿ’œ.

Wanted-X400-Conversion: in bp14

This requests that this specific body part be encoded in Body Part 14 โœจ.

This field may be used in two places:

  1. In the heading of an unstructured MIME body part. In this case the EBNF.mime-from is omitted, and the requested conversion applies to the body part.
  2. In a multipart. In this case, the body part type to which the conversion applies is defined by EBNF.mime-from, and the conversion applies to all body parts of this MIME type contained in the multipart, including those contained in nested messages and multiparts. If a contained body part has its own heading, this takes precedence. Note that the "from" parameter is mandatory when used in a multipart ๐Ÿ‘‘.

The EBNF.x400-object-id shall be present when "bp15" or "ftbp" encoding is selected.

The value "tunnel" implies encapsulation as defined in Chapter 3.

The "object identifier" used below is:

  • For BP 15, it is the value of the EXTENDED-BODY-PART-TYPE macro that defines the body part, which is found in ExternallyDefinedBodyPart.data.direct-reference.
  • For FTBP, it is the value of the Environment.application-reference.

4.2. Conversion from X.400 to MIME

The IPM heading defined here shall be present in the heading of a message. It defines the mapping for all body parts of the specified types, including those in nested messages ๐Ÿ”ฅ.

wanted-MIME-conversion HEADING-EXTENSION
        VALUE WantedMIMEConversions
        ::= id-wanted-MIME-conversions


WantedMIMEConversions ::= SEQUENCE OF X400toMIMEConversion

X400toMIMEConversion ::= SEQUENCE {
        x400-type X400Type,
        mime-type MIMEType }


X400Type ::= CHOICE {
        standard [0] INTEGER,           -- standard body part
        extended [1] OBJECT IDENTIFIER,  -- BP 15
        ftbp     [2] OBJECT IDENTIFIER}     -- FTBP
                                            -- application-reference

MIMEType ::= SEQUENCE {
        type IA5String,         -- type (e.g., application/ms-word)
        encoding [1] IA5String OPTIONAl -- e.g. quoted-printable
        parameters [2] IA5String OPTIONAL }     -- MIME Parameters

The heading extension includes all requested conversions, with explicit information as to how each body part type is encoded in MIME ๐Ÿ“.

FTBP is identified as a separate body part type, as there will be a need for different encodings, depending on what is being carried ๐ŸŒˆ.

Encapsulation is requested by asking for "application/x400-bp" or "application/ftbp" as the destination type.

For FTAM body parts, the parameters will survive the gatewaying process. For other body parts, there are three alternatives:

  1. The gateway knows a defined mapping for this particular body part and destination type. It will be used, and parameters mapped accordingly.
  2. The gateway knows how to extract an OCTET STRING from the body part, and the destination is a simple MIME body part. All information outside the OCTET STRING is lost. (This may be the case for a BP14 that should end up in an application/xyzzy, for instance.)
  3. The gateway knows of no relevant mapping, and does not know how to simplify the X.400 body part. The gateway will then proceed as if the mapping control field had not been present.

5. The equivalence registry ๐Ÿฆ‹

5.1. What information one must give about a mapping

The following information MUST be supplied when describing an equivalence or a mapping:

  • MIME type name (which must be preregistered)
  • X.400 body part (often BP15 or FTAM Body Part)

If BP15 is used, the following information must be given:

  1. Object Identifier for X.400 BP15 Data
  2. Object Identifier for X.400 BP15 Parameters
  3. X.400 ASN.1 Syntax (must be an EXTENDED-BODY-PART-TYPE macro)

If FTBP is used, the following information must be given:

  1. <1) Object Identifier for the FTAM Environment.application-reference
  2. <2) Object Identifier for the FTAM Contents-type, if unstructured-binary is not used
  3. Any other special considerations

In all cases, the following must be given:

Conversion algorithms. The expected effect of "Conversion prohibited" and "Conversion with loss prohibited" should be noted.

The conversion must be specified with enough detail to permit independent implementation; literature references are acceptable.

An equivalence can be registered with IANA using the form at the end of this document. The purpose of the registration is to achieve a greater uniformity among gateways implementing the same translation. There is no requirement that a gateway must support all of the translations that are registered with IANA, and there is no requirement that all conversions supported by a gateway are registered with IANA. Specific conformance requirements for MIXER are given at the end of this document ๐Ÿ’….

Anyone can register an equivalence with IANA, and may update the registered equivalence at any time, or reassign the right to update the registry entry at any time. However, the IESG has the power to "lock" a registration, so that changing it requires IESG approval, and to update such a "locked" registration. All registered equivalences defined in standards-track documents (including this one) are locked ๐Ÿ”’.

5.2. Equivalence summary for known X.400 and MIME Types

This section itemizes the equivalences for all currently known MIME content-types and X.400 body parts ๐ŸŒธ.

For each MIME content-type/X.400 body part pair, the equivalence table contains an entry with the following sections:

  • X.400 Body Part: This section identifies the X.400 Body Part governed by this Table entry. It includes any OBJECT IDENTIFIERs or other parameters necessary to uniquely identify the Body Part.
  • MIME Content-Type: This section identifies the MIME content-type governed by this Table entry. The MIME content-type named here must be registered with the IANA.
  • Section/document reference: Reference to section of this document, or to the other document that describes this mapping.

The initial Equivalence Table entries in this document are described using this convention.

Further registrations of equivalences should be submitted to the IANA after a public review, using the example form given at the end of this document.

5.3. MIME to X.400 Table

MIME content-type          X.400 Body Part             Section
-----------------          ------------------          -------
text/plain
  charset=us-ascii         ia5-text                     6.1
  charset=ISO-8859-x       EBP - GeneralText            6.2
text/richtext              no mapping defined           Encap
application/oda            EBP - ODA                    [ODA]
application/octet-stream   bilaterally-defined or       6.3
                           FTBP unknown attachment      6.4
application/postscript     EBP - mime-postscript-body   [POSTSCRIPT]
image/g3fax                g3-facsimile                 [IMAGES]
image/jpeg                 EBP - mime-jpeg-body         [IMAGES]
image/gif                  EBP - mime-gif-body          [IMAGES]
audio/basic                no mapping defined           Encap
video/mpeg                 no mapping defined           Encap
message/RFC822             ForwardedIPMessage           6.5
multipart/*                ForwardedIPMessage           6.6
multipart/signed           HARPOON encap                7.3
multipart/encrypted        HARPOON encap                7.4

Abbreviation: EBP - Extended Body Part

5.4. X.400 to MIME Table

                          Basic Body Parts

X.400 Basic Body Part      MIME content-type           Section
---------------------      --------------------        -------
ia5-text                   text/plain;charset=us-ascii 6.1
voice                      No Mapping Defined          Encap
g3-facsimile               image/g3fax                 [IMAGES]
g4-class1                  no mapping defined          Encap
teletex                    text/plain;charset=teletex  6.7
videotex                   no mapping defined          Encap
encrypted                  no mapping defined          Encap
bilaterally-defined        application/octet-stream    6.3
nationally-defined         no mapping defined          Encap
externally-defined         See Extended Body Parts below
ForwardedIPMessage         message/RFC822 or multipart 6.5,6.6

X.400 Extended Body Part   MIME content-type             Section
-------------------------  --------------------          -------
GeneralText               text/plain;charset=ISO-8859-x  6.2
ODA                        application/oda               [ODA]
mime-postscript-body       application/postscript        [POSTSCRIPT]
mime-jpeg-body             image/jpeg                    [IMAGES]
mime-gif-body              image/gif                     [IMAGES]
FTAM                       various                       2.3,6.4

FTAM application ID        MIME content type              Section
-------------------        -----------------              -------
ema-unknown-attachment     application/octet-stream       6.4

5.5. Use of OBJECT IDENTIFIERs and ASN.1 MACROS โœจ

okay bestie, if you want to define brand new BP15 body parts for equivalences, you need to know what X.420 says ๐Ÿค“ Extended Body Parts:

  1. use OBJECT IDENTIFIERs (OIDs) to uniquely identify the contents, and
  2. be defined using the ASN.1 Macro:
EXTENDED-BODY-PART-TYPE MACRO::=
BEGIN
   TYPE NOTATION  ::= Parameters Data
   VALUE NOTATION ::= value (VALUE OBJECT IDENTIFIER)

   Parameters     ::=  "PARAMETERS" type "IDENTIFIED"
                       "BY" value(OBJECT IDENTIFIER)
                     | empty;
   Data           ::= "DATA" type
END

To meet these requirements, this document uses the OID mixer, defined in [MIXER], as the root OID for X.400 Extended Body Parts defined for MIME interworking. ๐Ÿ’œ

Each Extended Body Part has Data and optional Parameters, and each one is named by an OID. So two OID subtrees are defined under mixer-bodies, one for Data and one for Parameters:

mixer-bp-data  OBJECT IDENTIFIER ::=
               { mixer 1 }

mixer-bp-parameter OBJECT IDENTIFIER ::=
               { mixer 2 }

Any definitions of extended X.400 body parts sent to the IANA for registration with a mapping must use the Extended Body Part Type macro for the definition. See [IMAGES] for an example. ๐ŸŒธ

Last but not least, the IANA will use the mixer-bp-data and mixer-bp-parameter OIDs as root OIDs for any new MIME content-type/subtypes that aren't otherwise registered in the Equivalence Table. ๐Ÿฆ‹

NOTE: The ASN.1 for an ExternallyDefinedBodyPart is:

ExternallyDefinedBodyPart ::= SEQUENCE {
  parameters [0] ExternallyDefinedParameters OPTIONAL,
  data           ExternallyDefinedData }

ExternallyDefinedParameters ::= EXTERNAL

ExternallyDefinedData ::= EXTERNAL

The ASN.1 for EXTERNAL is (from X.208):

EXTERNAL ::= [UNIVERSAL 8] IMPLICIT SEQUENCE
{direct-reference     OBJECT IDENTIFIER OPTIONAL,
indirect-reference    INTEGER OPTIONAL,
data-value-descriptor ObjectDescriptor OPTIONAL,
encoding CHOICE
  {single-ASN1-type  [0] ANY,
   octet-aligned     [1] IMPLICIT OCTET STRING,
   arbitrary         [2] IMPLICIT BIT STRING}}

ObjectDescriptor ::= [UNIVERSAL 7] IMPLICIT GraphicString

There are a bit too many choices here ๐Ÿ˜… The common X.400 usage for BP15 encoding is to:

  1. always use direct-reference
  2. omit indirect-reference and data-value-descriptor
  3. use the single-ASN1-type encoding only

Unfortunately, some implementations chose the octet-aligned choice when building values where the ASN.1 type is OCTET STRING, which of course caused interoperability problems. ๐Ÿ’€

An attempt to specify that X.420 only allowed the single-ASN1-type choice in the 1996 versions is still being debated in ISO (as of Sept 1995). The end result seems to be that everyone agrees in principle that single-ASN1-type should be used, but one still has to allow generating the octet-aligned choice and call it conformant. Iykyk ๐Ÿ™ƒ


6. Defined Equivalences ๐Ÿ‘‘

6.1. IA5Text - text/plain ๐Ÿฉท

X.400 Body Part: IA5Text MIME Content-type: text/plain; charset=US-ASCII Conversion Type: No conversion Comments:

When mapping from X.400 to MIME, the "repertoire" parameter is ignored. ๐Ÿ™ˆ

When mapping from MIME to X.400, the "repertoire" parameter is set to IA5 (5).

NOTE: The MIME Content-type headers are omitted, when mapping from X.400 to MIME, if and only if the IA5Text body part is the only body part in the IPMS.Body sequence. โœจ

NOTE: IA5Text specifies the "currency" symbol in position 2/4. This is converted without comment to the "dollar" symbol. The author of this document has seen plenty of documents where that position was meant to be "dollar", but has never seen one where the "currency" symbol was actually intended. Real talk, that's a mood ๐Ÿ’…

(For reference: The T.50 (1988) recommendation, which defines IA5, talks about ISO registered set number 2, while ASCII, which uses the "dollar" symbol, is ISO registered set number 6. There are no other differences.)

NOTE: It isn't uncommon, though it is a violation of the standard, to use 8-bit character sets inside an IA5 body part ๐Ÿ˜ฌ Gateways that can expect to run into this should consider implementing something like the guidance in RFC 1428 [MIMETRANS], "Transition of Internet Mail from just-send-8 to 8-bit SMTP/MIME", and generate appropriate charset parameters for the MIME messages they produce. This behavior is not required for MIXER conformance, since it's only needed when the base standards are violated. ๐Ÿซถ

6.2. GeneralText - text/plain (ISO-8859) ๐ŸŒˆ

X.400 Body Part: GeneralText; CharacterSets in 6, 14, 42, 87, 100,101,109,110,126,127,138,144,148 MIME Content-Type: text/plain; charset=ISO-8859-(1-9) or iso-2022-jp Conversion Type: Text conversion without character change

When mapping from X.400 to MIME, the character-set is picked from the table below according to the value of Parameters.CharacterSets. If no match is found and the gateway doesn't support a conversion, the character set shall be encoded as x-iso-nnn-nnn-nnn, where "nnn" is the numbers from Parameters.CharacterSets, sorted in numeric order.

When mapping from MIME to X.400, GeneralText is an Extended Body Part, so it needs an OID. The OID for the GeneralText body is defined in [MOTIS], part 8, annex D, as {2 6 1 4 11}. The OID for the parameters is {2 6 1 11 11}. ๐ŸŽ€

Parameters.CharacterSets is set from the table below according to the value of "charset".

The following table lists the MIME character sets and their matching ISO registry numbers. If no correspondence is found, this conversion fails, and the generic body part approach is used.

MIME charset    ISO IR numbers          Comment
-----------------------------------------------
ISO-8859-1      6, 100                  West European "8-bit ASCII"
ISO-8859-2      6, 101                  East European
ISO-8859-3      6, 109                  <regarded as obsolete>
ISO-8859-4      6, 110                  <regarded as obsolete>
ISO-8859-5      6, 144                  Cyrillic
ISO-8859-6      6, 127                  Arabic
ISO-8859-7      6, 126                  Greek
ISO-8859-8      6, 138                  Hebrew
ISO-8859-9      6, 148                  Other Latin-using languages
ISO-2022-JP     6, 14, 42, 87           Japanese

When converting from MIME to X.400, generate the correct OIDs for the message envelope's Encoded Information Types by looking up the ISO IR numbers in the table above, then appending each one to the id-cs-eit-authority {1 0 10021 7 1 0} OID. That gives you 2-4 OIDs. ๐Ÿ”ฅ

Similar procedures can be used with other MIME charsets that map to a set of ISO character sets. ๐Ÿฆ‹

The escape sequences that designate and invoke the relevant character sets in their proper positions must be added to the front of the GeneralText character string. ๐Ÿงš

For ISO 8859-1, the relevant escape sequence will be:

ESC 28 42
      ASCII in G0

ESC 2D 41
      ISO-IR-100 in G1

ESC 21 41
      High control character set in C1

ESC 7E
      Locking shift 1 Right

These escape sequences are removed when converting from GeneralText to text/plain. ๐Ÿงน

Note that new character sets may be defined on both the Internet side and the X.400 side. A gateway MAY choose to implement more conversions in the same fashion. โœจ

DISCUSSION:

Text conversion is a messy one, and gateways should probably get wide latitude to make decisions based on what they know about the user's preferences. The text below is thought to give the best approximation to a gateway that conforms to current and expected usage in both the MIME and X.400 worlds. It's also the recommended way when nothing is known about the recipient's capabilities. ๐Ÿ’œ

The lossless changes, like normalizing escape sequences, can be done even when "conversion-prohibited" is set. If "conversion-with-loss-prohibited" is set, translating to a character set that can't encode every character can't be done, and the message should be non-delivered with an appropriate non-delivery reason. ๐Ÿšซ

MIME commonly uses character sets a bit differently from the rules X.400 gives. In particular, MIME usually assumes the character sets follow strict rules. For the ISO-8859-x character sets, it's assumed they are designated and invoked at the beginning of the text, and that no designation or invocation sequences occur within the body of the text. ๐Ÿค“

The rules for ISO-2022-JP are given in RFC 1468 [2022-JP], and they're even more particular. They use a pure 7-bit encoding in which each line of text starts in ASCII. ๐ŸŽŒ

So the text must be "normalized" by going through the whole message, using a state machine or similar device to remove or rewrite all escape and shift sequences. ๐Ÿงผ

Appendix A gives pseudocode for such a conversion. ๐Ÿ“œ

NOTE: In 1988, the GeneralText body part was defined in ISO 10021-8 [MOTIS], and NOT in the corresponding CCITT recommendation. That was added later. Also, the parameters have been heavily modified. They should be a SET OF INTEGER in the currently valid text. Use the latest version of the standard that you can get hold of. ๐Ÿ˜ญ

6.3. BilaterallyDefined - application/octet-stream ๐Ÿ“

X.400 Body Part: BilaterallyDefined MIME Content-Type: Application/Octet-Stream (no parameters) Conversion Type: No conversion

When mapping from MIME to X.400, if there are parameters present in the Content-Type: header field, they are removed. ๐Ÿ—‘๏ธ

DISCUSSION:

The parameters "name", "type" and "conversions" are advisory. "name" and "conversions" are deprecated in RFC 2046. ๐Ÿ™„

The parameter "padding" changes how the last byte of the data is interpreted. The WG decided it's better to delete this information than to non-deliver the body part. The "padding" parameter is rarely used with MIME. ๐Ÿคทโ€โ™€๏ธ

Use of BilaterallyDefined Body Parts is specifically deprecated in both 1988 and 1992 X.400. It's kept only for backward compatibility with 1984 systems, and because it's in common use. ๐Ÿ•ฐ๏ธ

6.4. FTBP EMA Unknown Attachment - application/octet-stream ๐Ÿ’–

X.400 Body Part: FTBP EMA Unknown Attachment MIME Content-Type: Application/Octet-Stream Conversion Type: No conversion

The OID for the Unknown Attachment is:

{ joint-iso-ccitt(2) country(16) us(840) organization(1) ema(113694) objects(2) messaging(2) attachments(1) unknown(1) }

or 2.16.840.1.113694.2.2.1.1 for short. ๐Ÿงšโ€โ™€๏ธ

NOTE: Earlier EMA drafts gave it as:

{ iso(1) countries(2) usa(840) organization (1) ema (113694) objects(2) messaging(2) attachments(1) unknown (1)}

or 1.2.840.1.113694.2.2.1.1 for short. ๐Ÿ•ฐ๏ธ

The parameters for this type must be mapped according to chapter 2.3, with the following extensions for the parameters of application/octet-stream:

If there is no Content-Disposition parameter with a filename, and there is a name parameter, the FTBP.FileTransferParameters.File-attributes.pathname is generated from this parameter. Note that RFC 2046 recommends not using the "name" parameter. ๐Ÿ™ˆ

The "type", "conversions" and "padding" attributes are ignored. "type" is for human consumption, and "conversions" are discouraged in RFC 2046. ๐Ÿซ 

The body mapping is just copying the bytes in both directions. ๐Ÿ’…

6.5. MessageBodyPart - message/RFC822 ๐Ÿ’Œ

X.400 body part: MessageBodyPart
MIME Content-Type: message/RFC822
Conversion Type: Special

okay bestie, this is the "a whole message hiding inside a message" mapping ๐ŸŽ€ It's giving Russian dolls.

NOTE: If the headers of the X.400 MessageBodyPart contains the "multipart-message" heading extension with the isAMessage bit set (either explicitly or implicitly), the mapping should be to multipart/* according to section 6.6, below.

To map an IPMS.MessageBodyPart, you recursively apply the full X.400 -> RFC 822 mapping to get an RFC 822 Message ๐Ÿงš If IPMS.MessageBodyPart.parameters.delivery-envelope is there, it gets used for the MTS Abstract Service Mappings. If IPMS.MessageBodyPart.parameters.delivery-time is there, it gets mapped to the extended RFC 822 field Delivery-Date: โœจ

When a message/RFC822 shows up inside a MIME message, it gets mapped to an IPMS.MessageBodyPart according to MIXER. specification. Any mappings that would have been made to the MTS Abstract Service go into IPMS.MessageBodyPart.parameters.delivery-envelope ๐Ÿ’…

6.6. MessageBodyPart - multipart/* ๐Ÿงฉ

X.400 body part: MessageBodyPart
MIME Content-Type: multipart/*
Conversion Type: Special
NOTE: If the headers of the X.400 MessageBodyPart do not contain the "multipart-message" heading extension with the "isAMessage" flag FALSE=, the mapping should be to message/RFC822.

ngl this one is so specific ๐Ÿ˜ญ A MIME multipart is a set of content-types, not a message that has a set of content types. So when the multipart sits at the outermost MIME header, its elements get mapped directly onto IPMS.Bodypart ๐Ÿซถ

When the MIME multipart is not at the outermost level, it gets mapped to an IPMS.MessageBodyPart that contains an IPMS.Bodypart for each element of the multipart.

When a nested IPMS.Message is generated from a multipart, an IPMS.heading shall always be generated. The only mandatory field is the IPMS.Heading.this-IPM message id, which shall be generated by the gateway. An IPMS.Heading.subject field shall also be generated, so that non-MIME capable X.400(88) UAs and all X.400(84) UAs get some useful info ๐ŸŒธ The subject gets set based on the multipart subtype:

  • "Multipart Message" for mixed
  • "Alternative Body Parts containing the same information" for alternative
  • "Message Digest" for digest
  • "Body Parts interpreted in parallel" for parallel
  • "Multipart Message (<subtype>)" for other

For other types of multipart, the multipart subtype shall be included in the subject line.

For each multipart, the following IPMS.HeadingExtension shall be generated, with the value set according to the subtype.

If the multipart is the outermost multipart and the subtype is "mixed", it may be omitted.

        multipart-message HEADING-EXTENSION
                VALUE MultipartType
                 ::= id-hex-multipart-message-v2

        MultipartType ::= SEQUENCE {
                      subtype IA5String,
                      isAMessage BOOLEAN DEFAULT TRUE }

The MultipartType holds the subtype, like "digest". If this heading is there when you map from X.400 to MIME, the appropriate multipart may be generated ๐ŸŽ€

The isAMessage flag exists for a very specific situation: a message containing a ForwardedIPMessage, which itself was generated from a MIME message that was a Multipart. It gets set whenever the multipart is the outermost level of nesting inside a Message/RFC822. Iconic behaviour, honestly ๐Ÿ‘‘

NOTE: When downgrading to X.400/84, the content-type SHOULD be regenerated from this heading-extension and put into the RFC-822-HEADERS extra body part.

NOTE: This definition is different from the one in RFC 1494, because the RFC 1494 definition turned out to be insufficient when new subtypes of Multipart (like Signed or Related) were defined. That is the reason for the "-v2" part of the name of the OID.

If both the old and the new heading extensions occur on a message, a MIXER gateway should give preference to the new one.

6.7. Teletex - Text/Plain (Teletex) ๐Ÿ“œ

X.400 Body Part: Teletex
MIME Content-Type: text/plain; charset=Teletex
Conversion Type: Text conversion

From X.400 to RFC-822, the conversion shall take the bytes of all the pages in the "data" part of the TeletexBodyPart, add a FF character (0x0C, control-L) to each part that does not already end in one, and concatenate them together to form the body of the Text/Plain ๐ŸŒˆ

The character set shall be "Teletex", which is especially registered for this purpose. Its definition is shown in an appendix.

The parameters are discarded.

From RFC-822 to X.400, the conversion shall split the content at each occurrence of the FF character (0x0C), delete the character and construct the Teletex body part as a SEQUENCE OF TeletexString, as described in X.420(88), section 7.3.5 ๐Ÿ’–

The TeletexParameters may, but need not, contain the number-of-pages component.

NOTE: It is recommended, but not mandated, that the data be converted into a more widespread character set like ISO-8859-1 or ISO-2022-JP (if applicable) if possible. This will result in the reverse translation giving a GeneralText body part, which will have to be dealt with appropriately at the X.400/88 to X.400/84 downgrading boundary, if possible, but will give a much greater chance that the MIME recipient can actually read the message.

DISCUSSION:

The Teletex body part is frequently used in X.400(84) to send around text with slightly extended character sets beyond ASCII ๐Ÿ“

Its body consists of a series of "pages", separated by ASN.1 representation. It is important to many people to have this mapped into something readable to most end-users, so it is recommended to map it onto Text/Plain. However, since this is not plain text, the conversion must be specified ๐Ÿ™ˆ

Note that the definition of Text/Plain permits only CRLF as a line separator. The sequences CR FF and CR LF LF LF.. permitted in Teletex must be encoded as Quoted-Printable ๐Ÿฆ‹

Some body parts are MIME constructs, and their functionality will be severely damaged if they are coerced into an X.400 framework ๐Ÿ˜ญ

Special care needs to be taken with these, so they are described below.

7.1. message/external-body ๐Ÿ”—

The gateway MUST support the encapsulation of this body part using the HARPOON encapsulation (IA5).

It MAY support some kind of retrieval of the referred object.

DISCUSSION:

The message/external-body part points to an object that can be retrieved using Internet protocols ๐Ÿงš

There are three cases to consider for the recipient's capabilities:

  1. The user has no Internet access. In this case, the user might be grateful if the gateway fetches the body part and inserts it into the message. If the body part is large or dynamic, it might not be appropriate.
  2. The user has Internet access, but no UA support for fetching external-body objects.
  3. The user has Internet access and UA support for fetching external-body objects, based on an understanding of this document.

Some access-types, like anonymous FTP, are easy to resolve. Others, like the Mailserver access-type, are almost impossible to resolve at a gateway.

To support the second case above, the tunneling method chosen is the HARPOON encapsulation described in section 3.1.3, using an IA5 body part, inserting the string MIME-Version: 1.0 (generated by gateway) at the beginning of the body part. (The part in parentheses can be changed at will.)

This will:

  1. Maximize the chance that the user will see the message
  2. Give the user hints that will enable them to fetch the message using other Internet tools
  3. Identify the message as a MIME object in a reliable fashion, allowing UAs to support the fetching of the object if the UA implementor desires ๐Ÿซถ

7.2. message/partial ๐Ÿงฉ

This represents part of a larger message, where it is only possible to parse the complete message after getting all the pieces.

The gateway MUST support the encapsulation of this body part.

It MAY implement transparent reassembly of the message, but in this case, it MUST support a configurable timeout for the reassembly, defaulting back to encapsulation โณ

DISCUSSION:

The gateway's choices are:

  1. Wait until all the pieces arrive at the gateway, reassemble the message, and use normal processing
  2. Encapsulate the message, using any encapsulation method (BP15, FTAM or HARPOON)

In some cases, not all pieces will arrive at the gateway. Some may have been transferred through other gateways due to route changes or machine outages, and some may have been lost in transit ๐Ÿ’€

7.3. multipart/signed โœ๏ธ

A gateway MUST implement encapsulation of multipart/signed using HARPOON.

The gateway MAY be configured to do other processing, as outlined in the discussion below. This is outside the scope of the standard.

DISCUSSION:

Gatewaying security is a problem ๐Ÿ˜ค The gateway can basically take three approaches:

  • Strip the multipart/signed, leaving the bare body part unsecured, possibly with a comment that the signature was stripped
  • Attempt to check the signature and re-signing the message using X.400 security functions, then stripping as above
  • Encapsulate the message. This is the only approach that allows end to end security, but requires MIME functionality at the recipient.
  • Replace the message content with multiple body parts, containing first an unsecured body part and then the encapsulated multipart/signed.

All these are valid options for a MIXER gateway.

Note that the encapsulation must use HARPOON, as the signature is computed on the ENCODED body part, not on the canonical representation, and HARPOON is the only encapsulation that preserves the content transfer encoding of the message ๐Ÿ”ฅ

Note also that all methods except for encapsulation break end-to-end security. The recipient can place no more trust in the integrity of the message than they can place in the security of the gateway ๐Ÿฅบ

7.4. multipart/encrypted ๐Ÿ”

A gateway MUST implement encapsulation of multipart/encrypted using HARPOON. ๐Ÿ™…โ€โ™€๏ธ No skipping this one, bestie!

If the implementor chooses to allow other processing at the gateway, as outlined below, they are advised that there are grave security concerns with such a solution, since it violates the general rule of keeping decryption keys as close to the user as possible. ๐Ÿ’€

โš ๏ธ Gateway decryption breaks the golden rule of keeping decryption keys as close to the user as possible. The security concerns are seriously grave, so tread very carefully!

DISCUSSION:

There are two basic cases for a gateway. ๐Ÿง

  • The gateway is trusted with the user's keys. In this case, the gateway can decrypt the message, possibly add a note that it has done so, and send out the unencrypted form, possibly applying X.400 security functions, and possibly attaching a copy of the original, encrypted material for reference. This does nothing to protect the transfer from gateway to recipient, unless suitable X.400-native security is applied. It also means that the gateway must be part of the user's trusted environment. ๐Ÿฐ
  • The gateway is not trusted with the recipient's keys. In this case, encapsulation is the only approach that preserves any information at all. ๐ŸŽ€

The valid options for a MIXER gateway are therefore: ๐Ÿ“‹

  • Decrypt the body part
  • Encapsulate the body part
  • Drop the body part

The MIXER WG has shown strong preference for the encapsulation alternative, and urges anyone who thinks of buying or implementing gateway decryption to carefully evaluate this choice in light of the company's general security policy. ๐Ÿ‘‘ Choose wisely, babe!


8. Conformance requirements โœ…

In order to be called MIXER conformant, a gateway must implement: ๐Ÿ’…

  • Encapsulation of MIME content in the FTBP body part
  • Encapsulation of X.400 body parts in the x400-bp body part
  • Encapsulation of FTBP body parts in the application/x-ftbp.oid body part
  • Encapsulation of security multiparts using HARPOON
  • Text/plain <-> IA5Text
  • Text/plain; charset=iso-8859-* <-> GeneralText
  • Multipart/* <-> ForwardedIPMessage
  • message/RFC822 <-> ForwardedIPMessage
  • application/octet-stream <-> FTBP unknown
  • application/octet-stream <-> BilaterallyDefined
  • A configuration choice of which application/octet-stream translation to use

All other parts of this specification MAY be implemented by the gateway. If they are implemented at all, they MUST be implemented conformant to this specification. ๐ŸŒธ So the must-haves are the list above, and everything else is optional but has to be done right if you do it!

In this context, a feature is "implemented" in a product if it is possible to configure the product in such a way that this feature is used. This specification does not restrict the product to only be configured in such a fashion. ๐Ÿฆ‹


9. Security Considerations ๐Ÿšจ

The security issues identified in this memo are: ๐Ÿ‘€

(1) Security implications of using filenames that arrive in body part headers (section 2.3.2)

(2) Security implications of letting a gateway handle encrypted and/or signed content (section 7.3 and 7.4)

If a gateway fetches message/external-body on behalf of the recipient, as described in section 7.1, it may be tricked into performing inappropriate actions by malicious senders. ๐Ÿ˜ฑ Yikes, that's a whole plot twist nobody asked for!

In addition, all the normal caveats that apply to sending data that may contain executable code apply to UAs on both sides of the gateway. ๐Ÿ’€ Treat anything executable like a stranger with a suspicious link, fr fr.


10. Author's Address ๐Ÿ“ฎ

Harald Tveit Alvestrand UNINETT P.O.box 6883 Elgeseter N-7002 Trondheim NORWAY

EMail: Harald.T.Alvestrand@uninett.no


11. Acknowledgements ๐Ÿซถ

The author wishes to thank all the members of the MIXER WG for their valuable input, and in particular (in no particular order): ๐Ÿ’–

Steve Kille, Peter Sylvester, Ned Freed, Julian Onions, Ruth Moulton, Keith Moore, Alain Zahm, Urs Eppenberger, Kevin Jordan, Jeroen Houttuin, Claudio Allocchio, Colin Robbins, Steven Thomson, Jim Craigie, Efifiom Edem, David Wilson, and many others who have been active over the long lifetime of this document. ๐ŸŒˆ Honestly, what a squad!


References ๐Ÿ“š

  • [RFC-822] Crocker, D., "Standard for the Format of ARPA Internet Text Messages", STD 11, RFC 822, August, 1982.
  • [MIME] Freed, N. and N. Borenstein, "Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types", RFC 2046, November 1996.
  • [MIME-HDR] Moore, K., "MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text", RFC 2047, November 1996.
  • [HARPOON] Alvestrand, H., Romaguera, J., and K. Jordan, "Rules for downgrading messages from X.400/88 to X.400/84 when MIME content-types are present in the messages", RFC 1496, August 1993.
  • [MIMETRANS] Vaudreuil, G., "Transition of Internet Mail from Just-Send-8 to 8Bit-SMTP/MIME", RFC 1428, February 1993.
  • [MIXER] Kille, S., "Mapping between X.400(1988) / ISO 10021 and RFC-822", RFC 1327, May 1992.
  • [T.4] CCITT Recommendation T.4, Standardization of Group 3 Facsimile Apparatus for Document Transmission (1988)
  • [T.30] CCITT Recommendation T.30, Procedures For Document Facsimile Transmission in the General Switched Telephone Network (1988)
  • [T.411] CCITT Recommendation T.411 (1988), Open Document Architecture (ODA) and Interchange Format, Introduction and General Principles
  • [MOTIS] ISO/IEC International Standard 10021, Information technology - Text Communication - Message-Oriented Text Interchange Systems (MOTIS) (Parts 1 to 8)
  • [X.400] CCITT, Data Communication Networks - Message Handling Systems - Recommendations X.400 - X.420 (1988 version)
  • [X.420] CCITT Recommendation X.420 (1988), Interpersonal Messaging System
  • [RFC-X400USE] Alvestrand, H., "X.400 use of extended Character Sets", RFC 1502, August 1993.
  • [MAWG] Electronic Messaging Association Message Attachment Working Group (MAWG): File Transfer Body Part Feasibility Project Guide - version 1.5 - September 1995
  • [CDISP] Troost, R., and S. Dorner, "Communicating Presentation Information in Internet Messages: The Content-Disposition Header", RFC 1806, June 1995.
  • [POSTSCRIPT] Alvestrand, H., "Carrying PostScript in X.400 and MIME", RFC 2160, June 1997.
  • [IMAGES] Alvestrand, H., "X.400 Image Body Parts", RFC 2158, June 1997.
  • [ODA] Alvestrand, H., "A MIME Body Part for ODA", RFC 2161, June 1997.
  • [ISO 2022] ISO/IEC 2022:1994(E): Information technology - Character code structure and extension techniques
  • [ISO 8859] ISO 8859: Information processing -- 8-bit single-byte coded graphic character sets (various parts)
  • [2022-JP] Murai, J., Crispin, M., and E. van der Poel, "Japanese Character Encoding for Internet Messages", RFC 1468, June 1993.
  • [MUST] Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", RFC 2119, March 1997.

Appendixes ๐ŸŽ€

Appendix A: Escape code normalization ๐Ÿงฉ

The algorithm given here in pseudocode will reduce a GeneralString ISO-2022 unlimited use of shifts sequence to a pure 8-bit sequence that does not use shift sequences, if possible. Think of it as tidying up a messy group chat until it's just plain 8-bit vibes. โœจ

Some error conditions, like EOF, are not tested for. It crashes if asked to do something it cannot. Control character set switching is missing. ๐Ÿ™ˆ Not the most graceful, but that's the deal!

A similar routine, albeit more complex, can be written for normalizing to the ISO-2022-JP character set. ๐ŸŒ

BEGIN: (from X.209)
  g0 = 6 (should be 2, but ignore the difference)
  g1 = NULL
  g2 = NULL
  g3 = NULL
  c0 = 1 (ASCII control)
  c1 = NULL
  leftset = &g0 (current input set, low)
  rightset = &g1 (current input set, high)
  lowset = 6 (output set, low)
  highset = NULL (output set, high)
  charset = US-ASCII

  (Init for the set tables)
  chartoid[{2D,2E,2F}, 41] = 100
  .....
  idtoname[100] = "ISO-8859-1"
  .....

WHILE (more data)
  CASE head of input
    {These are the locking shift sequences}
    INCASE "00/14": (LS0, SO)
        leftset = &g0;
    INCASE "00/15": (LS1, SI)
        leftset = &g
    INCASE "ESC 07/14": (LS1R)
        rightset = &g1;
    INCASE "ESC 07/13": (LS2R)
        rightset = &g2;
    INCASE "ESC 07/12": (LS3R)
        rightset = &g3;
    {There is missing code for handling the single shift function}
    {These are the changes of graphic character sets}
    {Note that G0 can contain only 94-character charsets}
    INCASE "ESC 28"
        g0 = chartoid[lastchar, next character]
        sethiset(g0)
    INCASE "ESC 2D", "ESC 29"
        g1 = chartoid[lastchar, next character]
        sethiset(g1)
    INCASE "ESC 2E", "ESC 2A"
        g2 = chartoid[lastchar, next character]
        sethiset(g2)
    INCASE "ESC 2F", "ESC 2B"
        g3 = chartoid[lastchar, next character]
        sethiset(g3)
    {control characters. There is missing code for changing these}
    INCASE 00/00-01/15 {normal control}
        write(char)
    INCASE 08/00-09/15 {upper control}
        write(char)
    {Normal characters}
    INCASE 02/00-07/15 (Left)
        IF (*leftset == lowset)
            write(char)
        ELSIF (*leftset == highset)
            write(char+80)
        ELSE
            ERROR "Shift error"
        ENDIF
    INCASE 10/00-15/15
        IF (*rightset == highset)
            write(char)
        ELSIF (*rightset == lowset)
            write(char-80)
        ELSE
            ERROR "Shift error"
        ENDIF
  ENDCASE
ENDWHILE

SUBROUTINE sethighset(g1)

        IF (highset == NULL)
            charset = idtoname[g1]
            highset = g1
        ELSIF (highset == g1)
            (it's OK)
        ELSE
            ERROR "Too many charsets encountered"

        ENDIF

ENDROUTINE

Appendix B: OID Assignments ๐Ÿ†”

MIXER-MAPPINGS DEFINITIONS ::= BEGIN
EXPORTS -- everything --;

IMPORTS

   mixer -- { iso(1) org(3) dod(6) internet(1) mail(7) mixer(1) }
        FROM MIXER --Companion RFC--;

mixer-headings OBJECT IDENTIFIER ::=
        { mixer 1 } -- called mime-mhs-headings in RFC 1495 --

mixer-bodies OBJECT IDENTIFIER ::=
        { mixer 2 } -- called mime-mhs-bodies in RFC 1495 --

-- mixer-core is defined as { mixer core(3) } in [MIXER]

mixer-bp-data OBJECT IDENTIFIER ::=
        { mixer-bodies 1 }; -- called mime-mhs-bp-data in RFC 1494 --

mixer-bp-parameter OBJECT IDENTIFIER ::=
        { mixer-bodies 2 };

id-mime-bp-data OBJECT IDENTIFIER ::=
        { mixer-bp-data 1 };
-- for debugging: mixer-bp-data is 1.3.6.1.7.1.2.1.1

id-mime-bp-parameters OBJECT IDENTIFIER ::=
        { mixer-bp-parameter 1 };

-- the following assignments were done in RFC 1494, using
-- slightly different names, but the same numbers.
-- their defining text is now is now in other documents
   id-mime-postscript-body OBJECT IDENTIFIER ::=
                  { mixer-bp-data 2 }

   id-mime-jpeg-body OBJECT IDENTIFIER ::=
                  { mixer-bp-data 3 }

   id-mime-gif-body OBJECT IDENTIFIER ::=
                  { mixer-bp-data 4 }

-- This is a new definition, and defines an FTAM application
reference,
-- not a BP15 data OID.
id-mime-ftbp-data OBJECT IDENTIFIER ::=
                   { mixer-bp-data 5 }

-- The following heading extensions are defined
id-hex-partial-message OBJECT IDENTIFIER ::=
           { mixer-headings 1 }

id-hex-multipart-message OBJECT IDENTIFIER ::=
           { mixer-headings 2 } -- from RFC 1495; obsolete

id-hex-multipart-message-v2 OBJECT IDENTIFIER ::=
        { mixer-headings 3 }

END

Appendix C: Registration information for the Teletex character set โœจ

okay so the Teletex character set is basically a character set that lets you use the ISO 2022 switching mechanism to hop between a bunch of registered ISO character sets ๐Ÿฆ‹ the ones in the lineup are:

ISO-IR-87 - JIS_C6226-1983; a 16-bit Japanese character set
ISO-IR-102 - a fairly standard US-ASCII variant
ISO-IR-103 - Latin characters using non-spacing accents
ISO-IR-106 - Control characters for C0 use; CR, LF, FF and a few more.
ISO-IR-107 - Control characters for C1 use

its whole purpose is to represent data coming from ISO protocols that use the ASN.1 construct "TeletexString" or "T61string" without any conversion ๐Ÿ’…

the list of allowed character sets lives in CCITT recommendation X.208(1988), chapter 31.2 and Table 6/X.208 ๐ŸŒธ

the encoding rules are in CCITT recommendation X.209(1988), chapter 23. they say that at the start of the string, G0 is always ISO-IR-102, C0 is ISO-IR-106, and C1 is ISO-IR-107 ๐ŸŽ€

okay bestie, the spec seems to have somehow missed an implicit assumption ๐Ÿ™ˆ ISO-IR-103 is supposed to be designated and invoked as G1 and shifted into the upper half of the character set. X.400 and X.500 software that uses TeletexStrings seems to assume this anyway. so implementors should act as if ESC 2/9 7/6 LS1R is always present at the beginning of the data. BUT when generating Teletex strings, implementors should include the sequence ESC 2/9 7/6 within the string, before the first occurrence of a character from ISO-IR-103. the first one is a vibe, the second one is a rule ๐Ÿ’€

the rules for interpreting T.61 data are found (the author believes) in CCITT recommendations T.51, T.52 and T.53. the data came from the ITU WWW server, so here's the reading list ๐Ÿ“š

   T.51 (09/92) [Rev.1] [26 pp.] [Publ.: May.93]
     Latin based coded character sets for telematic services
   T.52 (1993) [New] [88 pp.] [Publ.: Apr.94]
     Non-Latin coded character sets for telematic services
   T.53 (04/94) [New] [68 pp.] [Publ.: Jan.95]
     Character coded control functions for telematic services

the Teletex character set is closely related to ISO 6937, but it is not identical to it. close, not twins ๐Ÿ‘ฏโ€โ™€๏ธ

no further restrictions are imposed by this registration. the big one to know is that character set switching can happen ANYWHERE, and there's no guarantee the sets get switched "back" at the end. so don't assume you're home free just because the string ended ๐Ÿซ 


Appendix D: IANA Registration form for new mappings ๐Ÿงš

this is the form you fill out if you want to register a new X.400/MIME content type mapping. it's giving paperwork, but make it cute ๐ŸŽ€

To: IANA@isi.edu
Subject: Registration of new X.400/MIME content type mapping

MIME type name:

(this must have been registered previously with IANA)

X.400 body part:

IF BP15:

- X.400 Object Identifier for Data:

(If left empty, an OID will be assigned by IANA  under mixer-bp-data)

- X.400 Object Identifier for Parameters:

(If left empty, an OID will be assigned by IANA under mixer-bp-
parameter.  If it is not used, fill in the words NOT USED.)

X.400 ASN.1 Syntax:

(must be an EXTENDED-BODY-PART-TYPE macro, or reference to a Basic
body part type)

IF FTBP:

- FTAM Object Identifier for application-reference:

- FTAM Object Identifier for contents-type:

(if left empty, unstructured-binary is assumed)

Conversion algorithm:

(must be defined completely enough for independent implementation. It
may be defined by reference to RFCs).
Person & email address to contact for further information:

INFORMATION TO THE SUBMITTER:

The accepted registrations will be listed in the "Assigned Numbers"
series of RFCs.  The information in the registration form is freely
distributable.

so the flow is: pick BP15 or FTBP, fill in the bits that apply, and if you leave an OID blank, IANA assigns one under mixer-bp-data or mixer-bp-parameter ๐ŸŒˆ accepted ones get listed in the "Assigned Numbers" series of RFCs, and the info you submit is freely distributable โœจ


Copyright (C) The Internet Society (1998). All Rights Reserved. ๐Ÿ’œ

okay the legal part, and it matters ๐Ÿซถ this document and translations of it can be copied and handed out to others. you can also write derivative works that comment on or explain it, or help with implementing it, and publish and distribute those, in whole or in part, with no restrictions of any kind. the one catch is that the copyright notice and this paragraph have to stay on every copy and every derivative work ๐Ÿ”ฅ

what you CANNOT do is modify this document itself in any way. that includes removing the copyright notice or the references to the Internet Society or other Internet organizations. the exceptions are: copying it as needed to develop Internet standards (and then the copyright procedures in the Internet Standards process have to be followed), or translating it into languages other than English ๐ŸŒธ

the limited permissions above are perpetual, and the Internet Society or its successors or assigns won't revoke them ๐Ÿ‘‘

this document and the info in it are provided on an "AS IS" basis, and THE INTERNET SOCIETY AND THE INTERNET ENGINEERING TASK FORCE DISCLAIMS 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. no cap, they're not promising it's perfect ๐Ÿ’€โœจ

๐Ÿ“ฆ where this page comes from