<?xml version="1.0" encoding="UTF-8"?>

<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
	submissionType="independent" category="exp"
	docName="draft-vesely-dmarc-mlm-transform-09"
	ipr="trust200902" obsoletes="" updates="" xml:lang="en"
	tocInclude="true" tocDepth="2" symRefs="true" sortRefs="false" version="3"> 

	<front>
		<title abbrev="MLM Transformations">
	Mailing List Manager (MLM) Transformations</title>

		<seriesInfo name="Internet-Draft" value="draft-vesely-dmarc-mlm-transform-09"/>

		<author fullname="Alessandro Vesely" initials="A." surname="Vesely">
			<organization/>
			<address>
				<postal>
					<street>v. L. Anelli 13</street>
					<code>20122</code>
					<city>Milano</city>
					<region>MI</region>
					<country>Italy</country>
				</postal>
				<email>vesely@tana.it</email>
			</address>
		</author>
		<date day="21" month="May" year="2024"/>
		<keyword>DMARC</keyword>
		<keyword>DKIM</keyword>
		<keyword>Mailing List</keyword>
		<keyword>MLM</keyword>
		<abstract>
			<t>
	The widespread adoption of Domain-based Message Authentication,
	Reporting, and Conformance (DMARC) led Mailing List Managers (MLM)
	to rewrite the From: header field as a workaround.
	This document proposes a method to revert MLM transformations, 
	in order to restore the original From: line after reception.</t>

			<t>
	There are two strategies to undo From: rewriting, 
	author-centric, whereby the signing agent takes measures for 
	undoing, and list-centric, whereby the MLM does so.  The 
	present method uses the former strategy.</t>
		</abstract>
	</front>

	<middle>
		<section numbered="true" toc="default">
			<name>Introduction</name>

			<t>
	Domain-based Message Authentication, Reporting, and Conformance
	(DMARC) (<xref target="RFC7489"/>) hinges on the alignment of the
	domain in the From: header field with an authenticated identifier.
	For that reason, mailing list managers (MLMs) that transform
	messages, however lightly, have to rewrite From:, an operation
	known as From: munging or From: rewriting.</t>

			<t>
	Depending on the kind of mailing list, From: munging can annoy 
	participants or not.  For lists paired by web fora, for 
	example, it is almost unnoticed.  For classic discussion lists, 
	where personal knowledge plays a role, it can become a nuisance 
	as it hinders off-list messaging.</t>

			<t>
	One way to restore the end-to-end nature of the From: header 
	field is to revert it to its original value after the message 
	is delivered to the final subscriber's mailbox.  This requires 
	that the author domain and/ or the MLM save the original value, 
	along with other necessary data.  For security reasons, the 
	replacement should only be done after verifying the original 
	DKIM signature (<xref target="RFC6376"/>), which can be done 
	after reverting MLM transformation.  Indeed, the other 
	identifier, SPF (<xref target="RFC7208"/>) cannot be verified on 
	forwarded messages, while replacing without verifying would be 
	an easy attack vector.</t>

			<t>
	The method described here works with MLMs configured to add 
	just a footer and/ or a subject tag to the messages that they 
	redistribute, which is what "classic" MLMs currently do.  The 
	method requires no conferral of trust, but needs author domains 
	to produce "robust" signatures (in the sense described in <xref 
	target="robustdkim"/>) which several domains do, but not 
	all.</t>

			<t>
	Other methods to verify signatures after transformations exist, 
	<xref target="I-D.kucherawy-dkim-transform"/> and <xref 
	target="I-D.chuang-mailing-list-modifications"/>, which require 
	MLMs to cooperate by annotating what transformations they carry 
	out.  Those requirements aim at getting a higher reliability. 
	However, their implementation requires two separate actors, a 
	MLM which records the changes and a receiver which undoes them. 
	Synchronizing them can be hard, especially during an initial 
	deploying period characterized by the discovery of failure 
	cases. Having the signer save the data necessary to the 
	verifier might seem to still involve two parties, but they are 
	typically both implemented by the same code, which typically 
	signs outgoing and verifies incoming messages.  That way, a 
	mail domain deploying such code can at least verify the 
	messages that itself emitted.</t>

			<t>
	The present method actually originated from an attempt at 
	implementing <xref target="I-D.kucherawy-dkim-transform"/> 
	when, after coding was completed, a guessing part was added in 
	order to perform tests.</t>

		</section>

		<section numbered="true" toc="default">
			<name>Terms Definitions</name>
			<t>
	<strong>Signers</strong> and <strong>verifiers</strong> are 
	defined by DKIM (<xref target="RFC6376"/>).  The use of the 
	term <strong>Mailing List Manager</strong>, almost always 
	abbreviated <strong>MLM</strong> follows <xref 
	target="RFC6377"/>. A MLM is a kind of 
	<strong>Mediator</strong> in <xref target="RFC5598"/> parlance. 
	It is usually composed of a Message Transfer Agent (MTA) with 
	the usual suite of tools plus the mailing list software proper 
	and any home brewed additions.</t>
			<t>
	<strong>Message</strong> is defined in <xref target="RFC5322"/>.  It
	consists of a <strong>header</strong> made up of one or more
	<strong>fields</strong>, and a <strong>body</strong> possibly
	composed of various MIME <strong>entities</strong>, the latter
	being defined in <xref target="RFC2045"/> and companions.</t>
			<t>
	The term <strong>original</strong> is used here to refer to the Author
	or parts of the Author's message as it was sent out by the author's
	domain, where <strong>Author</strong> is defined in
	<xref target="RFC5598"/> and <xref target="RFC9057"/>.</t>

			<t>
	We use <strong>colon</strong> (:) to indicate header field names,
	as in From:, Author: and the like.</t>

			<t>
	The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
	NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
	"MAY", and "OPTIONAL" in this document are to be interpreted as
	described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8175"/>
	when, and only when, they appear in all capitals, as shown here.</t>
		</section>

		<section anchor="trans" numbered="true" toc="default">
			<name>Revertible Transformations</name>
			<t>
	Message modifications can affect the header and/or the body of a
	message.  This document only considers a very limited set of
	transformations, described in the following subsections.
	They turn out to be revertible.</t>
			<section numbered="true" toc="default">
				<name>Header Transformations</name>
				<section numbered="true" toc="default">
					<name>Subject</name>
					<t>
	MLM MAY modify the Subject: field by inserting a tag at the
	beginning of its value.  A tag consists of a short text delimited
	by square brackets.  For example:</t>
					<sourcecode name=""><![CDATA[
  Subject: [added tag] Original value of subject
]]></sourcecode>
					<t>
	This transformation is easily reverted by removing the tag.
	For security reasons, subject tags MUST NOT exceed 20 characters.</t>

					<t>
	Note that some MLMs carry out further changes to this field.
	For example:</t>
					<sourcecode name=""><![CDATA[
  Subject: AW: [MLM-tag] German reply subject
]]></sourcecode>
					<t>can be transformed to:</t>
					<sourcecode name=""><![CDATA[
  Subject: Re: [MLM-tag] German reply subject
]]></sourcecode>
					<t>
	In a cosmopolitan environment, it may be worth to save a copy
	of it as Original-Subject:.</t>
				</section>
				<section numbered="true" toc="default">
					<name>From</name>
					<t>
	From: rewriting is necessary for DMARC.  That way, the MLM domain
	becomes the primary identifier of a message, in the DMARC sense.
	It is often achieved by transforming a field like this:</t>

					<sourcecode name=""><![CDATA[
  From: Original User <user@example.com>
]]></sourcecode>
					<t>into one like the following:</t>
					<sourcecode name=""><![CDATA[
  From: Original User via MLM <MLM.post@list.example>
]]></sourcecode>

					<t>
	Many MLMs save the original From: in a variety of places, 
	including Reply-To:, Cc:, X-Original-From:.  When the original 
	value is known, the transformation is revertible.</t>

				</section>
			</section>
			<section numbered="true" toc="default">
				<name>Body Transformations</name>
				<t>
	We only consider footer addition.  It MUST be performed in one of
	three ways, according to the format of the original message.</t>
				<dl newline="true">
					<dt>
	Single-part plain text</dt>
					<dd>
	When the original message is not structured, a footer can be appended
	at the end of the original text.
	See example in <xref target="example-single"/></dd>
					<dt>
	Multipart added</dt>
					<dd>
	The footer stands in its own MIME entity, which is appended as the
	last part of an original multipart/mixed structure.
	See example in <xref target="example-added"/></dd>
					<dt>
	Multipart wrapped</dt>
					<dd>
	The footer stands in the second entity of a new multipart/mixed
	MIME structure whose first entity consists of the original body.
	See example in <xref target="example-wrapped"/></dd>
				</dl>
				<t>
	The footer begins with a line consisting exclusively of underscore 
	("_", ASCII 95) characters, at least four of them.  Alternatively,
	a footer can consist of the three characters "-- " (dash, dash, space),
	the Usenet signature convention (see for example
	<xref target="RFC3676" sectionFormat="of" section="4.3"/>).
	For security 
	reasons, the footer MUST belong to an entity of Content-Type: 
	text/plain in all cases.  In addition, footers cannot exceed 10 
	lines of text, each shorter than 80 characters.
	If these restrictions are not met, the transformation cannot be
	reverted safely.</t>
			</section>
		</section>


		<section anchor="robustdkim" numbered="true" toc="default">
			<name>Robustness of DKIM Signatures</name>

			<t>
	DKIM protocol allows to configure signing very flexibly.  The 
	resulting signatures can be more or less "robust", where by 
	that term we mean the ability to preserve verifiability through 
	minor alterations that don't alter the semantic of the message. 
	These signing requirements can be considered as an alternative to 
	requiring MLMs to track the changes they perform.</t>

			<t>
	First and foremost, Author domains who DKIM-sign outgoing messages 
	MUST NOT sign "technical" header fields that MLMs will change, namely:</t>
			<ul>
				<li>MIME-Version:</li>
				<li>Content-Type:</li>
				<li>Content-Transfer-Encoding:</li>
				<li>Resent-Date:, Resent-From:, Resent-To:, Resent-Cc:</li>
				<li>List-Id:, List-Help:, List-Unsubscribe:, List-Subscribe:, List-Post:,
      List-Owner:, List-Archive:</li>
			</ul>
			<t>
	Not signing Content-Type: implies that author domains MUST NOT use
	the l= signature tag, according to
	<xref target="RFC6376" sectionFormat="of" section="5.4.1"/>.</t>

			<t>
	Second, since MLMs may reflow header fields, DKIM signatures 
	MUST use the "relaxed" canonicalization, at least for the 
	header.</t>

			<t>
	In order to increase reliability, the original value of the 
	signed fields SHOULD be mirrored by corresponding fields, From: 
	copied to Author:, the other fields to an Original-*: field, 
	that is Reply-To: copied to Original-Reply-To:, Subject: to 
	Original-Subject: and so forth. Copying Date: is actually not 
	necessary.  Copying Reply-To:, To: and Cc: is only useful if 
	there are multiple recipients and the MLM changes their order. 
	Original-Subject: is necessary if it starts with a tag that can 
	be removed when attempting to recover the original value; 
	Original-Subject: is defined by <xref target="RFC5703"/>, where 
	similar considerations hold.</t>

			<t>
	As said above, author domains who DKIM-sign outgoing messages 
	can copy the value of From: to Author:, at least when one or 
	more recipients are MLMs.  Additionally, signing the Author: 
	field certifies that it was added at the origin. We can assume 
	that such act denotes an interest in this experiment.  
	Therefore, DMARC aggregate results are to be reported to the 
	Author: domain as well, in case it differs from the received 
	From: domain.</t>

			<t>
	MLM transformations are not limited to subject tag and footer. 
	They often alter the encoding, especially for plain text 
	messages.  If the original message was encoded as 
	quoted-printable (<xref target="RFC2045"/>) and the MLM 
	converts it to base64, there is no way to recover the original 
	text, as it is impossible to guess original soft line breaks 
	after re-encoding.  Therefore, The quoted-printable encoding 
	MUST NOT be used for the body of single-part text/plain 
	messages.</t>

			<t>
	Base64 is much more robust.  However, single-part text/plain 
	messages encoded as base64 MUST follow a constant column width 
	of 76 characters (which is what most encoders do.) Since the 
	verifier will try and convert base64 content to the default 
	7bit or 8bit, if the original encoding differs, it MUST be 
	advertised by adding a new header field as follows:</t>

			<sourcecode name=""><![CDATA[
  Original-Content-Transfer-Encoding: base64
]]></sourcecode>

			<t>
	Original-*: fields with an empty value stand for non-existing 
	counterparts.  If the author domain needs to sign empty fields 
	that MLMs may add, it is worth declaring them that way.</t>

		</section>




		<section anchor="algo" numbered="true" toc="default">
			<name>Outline of a Reverting Verifier</name>
			<t>
	This informative section describes the algorithm implemented in 
	a mail filter <xref target="zdkimfilter"/>.  These kind of 
	filters usually read the input message twice —first pass to 
	verify; last pass to rewrite the message and insert 
	Authentication-Results: (<xref target="RFC8601"/>). When enabling MLM transformation 
	reversion, there can be a retry pass in between those two. The 
	result is yielded during the SMTP dialogue with no noticeable 
	delay. Implementing reversion changed the software from 22730 
	lines of C code to 26762.  The bulk of such ~18% increase is 
	due to the addition of encoding conversion functions. Changes 
	involve both verifying and signing functions (see <xref 
	target="robustdkim"/> for the latter).</t>
			<t>
	While reading the header in the first pass, the verifier looks for
	specific fields:</t>
			<ul>
				<li>From:</li>
				<li>Author:</li>
				<li>Original-From:</li>
				<li>X-Original-From:</li>
				<li>Reply-To:</li>
				<li>Cc:</li>
			</ul>
			<t>
	These are candidates to the original mailbox.  Note that Reply-To:
	and Cc: may contain multiple mailboxes; only the first one is 
	considered.</t>
			<t>
	The verifier also collects the Subject: and any field named 
	Original-* that the original signer might have set to ease the
	reversion.
	On reaching the end of the header, during the first pass, the verifier
	sorts the candidate original mailboxes according to the display name,
	which MLMs try and keep unaltered.
	The best candidate is then added to the collected
	set of Original-* fields.
	If the Subject: begins with a tag, its version without tag is added
	to that set as well, unless one was already found as Original-Subject:.</t>
			<t>
	Next, before reading the body, the verifier looks for prospect
	signatures; that is, signatures whose "d=" domain is not aligned with
	SPF credentials (<xref target="RFC7208"/>),
	List-Post: (<xref target="RFC4201"/>), Sender:, or the munged From:
	(if deemed to have been munged).  If any such signature exist,
	along with MLM or other signatures, then the verifier enables parsing
	the body to look for a footer.</t>
			<t>
	Reversing verifiers also have to watch out for idiosyncrasies used to
	mask DKIM signatures.  For example, a MLM introduced a header field
	named X-Mailman-Original-DKIM-Signature, because some receivers took
	the habit to downgrade messages with failed signatures, despite
	<xref target="RFC6376"/> recommendation to consider an unauthenticated
	message regardless of whether or not it looks like it was signed.</t>

			<t>
	Body parsing is done in parallel with body canonicalization during
	the first pass.
	For multipart, track top level entities.  Set transformation type
	to "wrapped" if there are exactly two entities, "added" otherwise.
	However, some lists, perhaps out of misconfiguration, insert an empty
	attachment before the one containing the footer.  As it is unlikely
	that a mail client sends an empty attachment, heuristically it may
	be preferable to just not count it.
	For single-part, body parsing must avail of encoding conversions as
	needed.  Assume identity encoding, 7bit or 8bit, unless
	otherwise directed by an Original-Content-Transfer-Encoding: field.</t>
			<t>
	At the end of the first pass, the verifier knows how prospect
	signatures did.  Let's recall that DKIM signature verification
	results from two independent operations, steps 3 and 4 in
	<xref target="RFC6376" sectionFormat="of" section="6.1.3"/>.
	The signature in the "b=" tag depends on the header, while the body
	hash in the "bh=" tag depends on the body:</t>
			<ul>
				<li>
	If the signature "b=" did not verify and the set of Original-* fields
	is not empty, then it is worth to try and re-canonicalize the header
	using the values in the set of Original-* fields.</li>
				<li>
	If the body hash "bh=" did not match and a footer was found, then it
	is worth to try and re-canonicalize the body excluding the footer.</li>
			</ul>
			<t>
	None, one, or both of the above operations are performed in the retry pass.</t>
			<t>
	On writing Authentication-Results, if a prospect signature 
	verifies after reversion, the verifier must signal this fact. 
	How to signal it is a question of local settings and 
	convenience. It can consist of an apposite reason or comment in 
	Authentication-Results:, or it can just write dmarc=pass. It 
	can also add an Original-From: field as a signal that From: can 
	be restored to that value, having previously removed or renamed 
	any existing field with the same name. For example:</t>
			<sourcecode name=""><![CDATA[
Original-From: Original Author <author@example.org>
Authentication-Results: example.com;
  spf=pass smtp.mailfrom=list.example;
  dkim=pass reason="transformed" header.d=example.org;
  dkim=pass (whitelisted) header.d=list.example;
  dmarc=pass header.from=example.org;
			]]></sourcecode>
			<t>
	That way, reversion elements can be easily recognized and 
	parsed by downstream agents.  It is up to the mail delivery 
	agent (MDA) to 
	restore the original value of From:.  The DKIM verifier MUST 
	NOT alter the message, except for adding 
	Authentication-Results: and possibly Original-From: or another 
	field where the filter saves the verified original value of 
	From:.  The MDA can use the presence of such field and/ or the 
	reason of dkim=pass as a signal that From: can be restored.
	The MDA replaces From: just before saving the message to the mailbox, 
	after any possible forwarding has been executed.</t>
		</section>

		<section numbered="true" toc="default">
			<name>Security Considerations</name>
			<t>
	Rewriting the From: header field is a treacherous modification to
	messages.  It fosters the belief that the display name of a
	mailbox is more true than the angle address.  A belief
	further consented by the tendency to not even display the latter.
	Bad actors take advantage of this belief by displaying the names of
	trusted institutions paired with trash email addresses hidden between
	angle brackets.  That trick defeats DMARC's purpose.</t>
			<t>
	It is out of this document's scope to suggest how mail user agents
	(MUAs) could counter phishing by highlighting security indicators
	(for the extent that indicators can actually help preventing phishing attacks).
	Let's just note that MUAs have to cope with MLMs and phishing alike,
	which makes it hard to devise a pattern to tell apart one from the
	other without getting involved with the reputation of the specific
	domains.</t>
			<t>
	By safely restoring munged From: to the original value in the 
	MDA, that contrast is eliminated.  Then, perhaps, deceptive 
	From: lines might become amenable to some kind of efficient 
	indication.</t>
			<t>
	Of course, MLM role can be played by miscreants as well.  However,
	replaying a signed message, even with revertible transformations, has
	more limits than forging scam messages anew.  Therefore, the risk
	introduced by easing transformation reversion is considerably
	lower than that of not signing, or of keeping DMARC policy at "none".</t>

			<t>
	An unlikely risk is that of a fake MLM sending messages with Author:
	signed by a broken signature in order to trick a reverting verifier
	into sending fake feedback reports.
			</t>
			<t>
	Compared with the use of "l=" tag (<xref target="RFC6376"
	sectionFormat="of" section="8.2"/>), the fact that footers are
	written in plain text removes the main security objection about
	footer additions.
	Namely, footers cannot completely replace the original content in
	the end recipient's eyes by exploiting lax HTML parsing in the MUA.</t>
			<t>
	Still, a footer can contain dangerous URLs and deceiving text.  That
	possibility has to be countered by usual mail filtering and savvy
	behavior.</t>
		</section>

		<section numbered="true" toc="default">
			<name>IANA Considerations</name>
			<t>
	IANA maintains the "Message Header" registry with several subregistries.
	IANA is asked to make the assignments set out in the following section.
			</t>
			<section numbered="true" toc="default">
				<name>Provisional Message Header Field Names</name>
				<t>
	IANA is asked to create new entries in the "Provisional Message
	Header Field Names" registry as follows.</t>
				<table align="center">
					<thead>
						<tr>
							<th align="left">Header Field Name</th>
							<th align="left">Applicable Protocol</th>
							<th align="left">Status</th>
							<th align="left">Author/Change controller</th>
							<th align="left">Reference</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td align="left">Original-Content-Transfer-Encoding</td>
							<td align="left">mail</td>
							<td align="left">provisional</td>
							<td align="left">IETF</td>
							<td align="left">this I-D</td>
						</tr>
						<tr>
							<td align="left">Original-Reply-To</td>
							<td align="left">mail</td>
							<td align="left">provisional</td>
							<td align="left">IETF</td>
							<td align="left">this I-D</td>
						</tr>
						<tr>
							<td align="left">Original-Cc</td>
							<td align="left">mail</td>
							<td align="left">provisional</td>
							<td align="left">IETF</td>
							<td align="left">this I-D</td>
						</tr>
					</tbody>
				</table>
			</section>
		</section>

	</middle>

	<back>
		<references>
			<name>References</name>
			<references>
				<name>Normative References</name>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2045.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5322.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6376.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7489.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8175.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.9057.xml"/>
			</references>
			<references>
				<name>Informative References</name>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.3676.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4201.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5703.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5598.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6377.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7208.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7960.xml"/>
				<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8601.xml"/>
				<xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.kucherawy-dkim-transform.xml"/>
				<xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.chuang-mailing-list-modifications.xml"/>
				<reference anchor="zdkimfilter" target="https://www.tana.it/sw/zdkimfilter/">
					<front>
						<title>zdkimfilter</title>
						<author/>
						<date/>
					</front>
				</reference>
			</references>
		</references>
		<section anchor="examples"  numbered="true" toc="default">
			<name>Examples</name>
			<t>
	In the examples that follow, the first character of each wrapped line
	of DKIM-Signature: fields should be a TAB.  For editorial reasons, it
	is rendered as four spaces.  While visually there is little difference,
	those signatures won't verify unless replacing them with a TAB.</t>
			<t>
	To verify the examples, public keys can be set as follows:</t>
			<sourcecode name=""><![CDATA[
s._domainkey.example.com IN TXT ( "v=DKIM1; g=*; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqlye7m5zLLXoIpBp2OO05LNMqK"
"u0zKowoHOpyRpviOVqOaNCk5uZ+wY00JwrKbt5u1G1ghuXsFkFkl0h00LBurz7ivyZH"
"3LohSWOZ8okgR+8kuGu9GHtQ+MqgRd16tlCF8PlWS2kGaBQKua1zk+ZCDwFy82Uo5G2"
"1nu/+Nn2sUwIDAQAB" )

s._domainkey.lists.example IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDgnLb2TZ6KECBMBo9ZLqDFt4ZBz"
"NHFrgBj/LVJVFU8IQP8uH4G8Pj0mEHRo1qpf0vuFI2HVpe/3NhzkT4Ay/1ZIIsxY754"
"f2thlhBvKh4AAgZFmzRvA3aZs6Tb/ERmD+a51liEMFaTOmY4mWeLi9wOM51usQ9Q65i"
"8IP/vjHM3rQIDAQAB" )
]]></sourcecode>

			<section anchor="example-single"  numbered="true" toc="default">
				<name>Single-part plain text</name>
				<t>
	Base64 encoding has to be decoded in order to locate the footer.
	The original encoding was text/plain, this can be inferred by the
	verifier from the absence of an Original-Content-Transfer-Encoding:
	field.  The original body hash will match after decoding and
	removing the footer.
	Note that an "l=" tag couldn't have done the trick in this case.</t>
				<sourcecode name=""><![CDATA[
Received: from lists.example by subscriber.example.org with ESMTP
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=lists.example; s=s;
    t=1603901305; bh=MjC5ikx26j8beyDJiz7Rk/4W+ppdGOmqh6koz0gLa8o=;
    h=Date:From:To:Subject;
    b=PNIYHGd7aytHEvew44WRpSfl4Py3c/9mKjovvQ1ps/xdpkl1/z+gWeu8e8ZmR7gdE
     iT2TsJ7ni3Lfp5oUpGCko5MvCoqcKX7Zmq3CmXTxRTwwvVZrAp/ir8UTvG+rJFnyEZ
     Yi3dSTX4rKe2LotyLkqcs+/uXaWEADbqcBp/9iHo=
Received: from mail.example.com by lists.example with ESMTP
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=s;
    t=1603889142; bh=hrDXocZNPy1+eUFYIk1PVRKa6mUMb8+ql9CFNABacww=;
    h=Date:From:To:Subject;
    b=YFLwvvW5bGbE5HpJwBM1JoL1F9b8AxdVFlwE/vOkL0p/pPpr7g9KnPXqwoEXZgFI0
     /kkTHK/Afy4gaWZQfwDZ77LuxYSMFjwpNorSc0YEGzHYzLCN7rL1e+xE7B7kOCThiq
     ebaMdcaHeZF6QUmWcUkEj8LVkxrvWi+bTzd3RnaA=
Original-From: Author <user@example.com>
Received: from mua.example.com by mail.example.com with ESMTPA
Message-ID: <123456@author.example>
Date: Mon, 28 Oct 2020 13:12:55 +0100
From: Author <user@example.com>
MIME-Version: 1.0
To: MLM@lists.example
Subject: [example] Check simple MLM message
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: base64

VGhpcyBpcyBhIHBsYWluIHRleHQgbWVzc2FnZSBzdWJtaXR0ZWQgdG8gYSBtYWlsaW5nIGxpc3Qu
ClRoZSBtYWlsaW5nIGxpc3QgaXMgZXhwZWN0ZWQgdG8gYWRkIGEgZm9vdGVyIGFuZCBhIHN1Ympl
Y3QgdGFnLgoKQmVzdApBdXRob3IKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f
X19fX18KdGhpcyBtZXNzYWdlIHdhcyBtb2RpZmllZCBieSBNTE0gZXhhbXBsZQphZGRpbmcgdGhp
cyBmb290ZXIgYW5kIHRoZSBzdWJqZWN0IHRhZwoobm90ZSB0aGF0IGw9IGlzIG5vdCBzZXQpCg==
]]></sourcecode>
			</section>
			<section anchor="example-added"  numbered="true" toc="default">
				<name>Multipart added</name>
				<t>
	When the original message has a MIME structure, MLMs can append an
	entity.</t>
				<sourcecode name=""><![CDATA[
Received: from lists.example by subscriber.example.org with ESMTP
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=lists.example; s=s;
    t=1603974193; bh=sEPYSlJlh90leqy5+63oPn1iU+9P684R92cZHXa9ENw=;
    h=Date:From:To:Subject;
    b=fTSAMcaEatofQCuAeUhlTXmVl5j9bPbwWgc84NWtoSt5zT+SSNp37DTzhYIGHozEk
     bpldArGQ+GygJE1b2witi6NctBd1O/xsUwDcJQxDXkF63QlCcalbKWypHZOhRqncUQ
     zgUzdcuYgqTYMJ0NoTP8fqu0HdgmjD2LJXjV3pVI=
Old-Authentication-Results: lists.example;
  dkim=pass header.d=example.com
Received: from mail.example.com by lists.example with ESMTP
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=s;
    t=1603973996; bh=eWqyE53pjRVCFGyHY1zGQTkCEvucN1vNN4cTcWk90WU=;
    h=Date:From:To:Subject;
    b=LGP1M3IX6XORfLs8HRLCFOcymzsPn+8+ljgQlmeNlCC/2Cl1+aBDCIEnzWI0pceCb
     zg32vFfEeryvRDHB1L1K4rrKCEznvO0J3p1xkUPEWpSpzxUGw+PK9KA9ePZ5qdz7cI
     /hXf7zjebznNdDQJnxajf7QHnx1tXmxijsJ1jiGQ=
Old-Authentication-Results: example.com; auth=pass (details omitted)
Original-From: Author <user@example.com>
Received: from mua.example.com by mail.example.com with ESMTPA
Message-ID: <123456@author.example>
Date: Mon, 28 Oct 2020 13:12:55 +0100
From: Author via MLM <MLM@lists.example>
MIME-Version: 1.0
To: MLM@lists.example
Subject: [example] Check simple MLM message
Content-Type: multipart/mixed; boundary=original-boundary

Original preamble must be preserved!

--original-boundary
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

This is a plain text message submitted to a mailing list.
The mailing list is expected to add a footer and a subject tag.

Best
Author

--original-boundary
Content-Type: image/png
Content-Transfer-Encoding: base64

iVBORw0KGgoAAAANSUhEUgAAAAYAAAAGCAYAAADgzO9IAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz
AAAHKgAAByoB49HU1wAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAB+SURB
VAiZNcGxDYUgAEXRhxTMYWLFVlDTOAUjOIEzWDqEC1igCQ0LSLi/+ueotUZKieu6uO+bdV2ptaLz
PDHGsG0b+74jieM40Pd91Fr5K6UAMC3LImutxhgaY8g5p3meNcUYFULQ+756nkchBMUYpd47OWe8
93jvyTnTe+cHXqRZbKSV4EoAAAAASUVORK5CYII=

--original-boundary
Content-Tyep: text/plain

________________________________________
this message was modified by MLM example
adding this footer and the subject tag
(note that l= cannot work in this case)

--original-boundary--
]]></sourcecode>
			</section>
			<section anchor="example-wrapped"  numbered="true" toc="default">
				<name>Multipart wrapped</name>
				<t>
	When the original body is multipart/alternative, MLMs have to wrap
	the whole body into the first entity of a multipart/mixed structure.
	Indeed, appending an entity to a multipart/alternative would result
	in it either hiding or being hidden by the existing ones.</t>
				<sourcecode name=""><![CDATA[
Received: from lists.example by subscriber.example.org with ESMTP
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=lists.example; s=s;
    t=1603962061; bh=n4/RahgnfVg7htgJtCr7TwEW4eKA1O5oiNaQFA5HU+A=;
    h=Date:From:To:Subject;
    b=RJlq/Fu40AC1hdJfljd+KPU69Vq2M7capbGQyEMhDWvaN7xDPJdXotwnTwiz91iZY
     5W3ITY7YXKHsWweLxu1Rph3ST3bbYQ1cifztpmtu4VPifBkm9MAe7OMDLHhk5ua9YL
     VzJOsXieiIw5a8JhOsr6F/05/K05kNiEXvuLgKd8=
Old-Authentication-Results: lists.example;
  dkim=pass header.d=example.com
Received: from mail.example.com by lists.example with ESMTP
DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=example.com; s=s;
    t=1603961679; bh=XiCPbOV1vcu2Q2TyEUOuT4SMun2AjYj/Va6KRPa1lv0=;
    h=Date:From:To:Subject;
    b=gvM5grV2dbtinFMLcExv+gMATILzY+c8RY7QPVBJSFohH5HMgOLwrgSH8uwOcZxq0
     FoXtBcHnukonqo97l8nY0faHi0Dp0LAmqn9e4ijwXw9IWwhFuUiCwICRaLEzrNUVBN
     TWtzkQKnHpEXnPGBD7Q9f924mBe+eZsDyRc41ZvQ=
Old-Authentication-Results: example.com; auth=pass (details omitted)
Original-From: Author <user@example.com>
Received: from mua.example.com by mail.example.com with ESMTPA
Message-ID: <123456@author.example>
Date: Mon, 28 Oct 2020 13:12:55 +0100
From: Author via MLM <MLM@lists.example>
MIME-Version: 1.0
To: MLM@lists.example
Subject: [example] Check simple MLM message
Content-Type: multipart/mixed; boundary=MLM-boundary

This is the MLM preamble, not signed by Author.

--MLM-boundary
Content-Type: multipart/alternative; boundary=original-boundary

Original preamble must be preserved!

--original-boundary
Content-Type: text/plain;

This is a plain text message submitted to a mailing list.
The mailing list is expected to add a footer and a subject tag.

Best
Author

--original-boundary
Content-Type: text/html;

<p>This is a plain text message submitted to a mailing list.
The mailing list is expected to add a footer and a subject tag.

<p>Best<br>
Author<br>

--original-boundary--

Original epilogue

--MLM-boundary
Content-Type: text/plain

________________________________________
this message was modified by MLM example
adding this footer and the subject tag
(note that l= is not set)

--MLM-boundary--

MLM epilogue
]]></sourcecode>
			</section>
		</section>
	</back>
</rfc>
