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

<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">

<rfc xmlns:xi="http://www.w3.org/2001/XInclude"
	submissionType="independent" category="exp"
	docName="draft-vesely-dmarc-mlm-transform-04"
	ipr="trust200902" obsoletes="" updates="" xml:lang="en"
	tocInclude="true" tocDepth="4" 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-04"/>

		<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 month="January" year="2022"/>
		<keyword>DMARC</keyword>
		<keyword>DKIM</keyword>
		<keyword>Mailing List</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.</t>
			<t>
	This document describes reverting MLM transformations in IETF
	mailing lists.  That way, it is possible to verify DomainKeys
	Identified Mail (DKIM) signatures that were applied
	at submission time and thereby restore original identifiers.</t>
			<t>
	For reliable results, some compliance is required of all agents
	involved, author domain signers, MLMs, forwarders, and final
	recipients' verifiers.</t>
		</abstract>
	</front>

	<middle>
		<section numbered="true" toc="default">
			<name>Introduction</name>
			<t>
	As mailing lists do not adhere to an explicitly standardized
	protocol, their behavior and even their definition vary widely.
	Their social usage is often paired with web fora, for example.
	In the IETF standardization process and in some software development
	communities, instead, mailing lists are rather terse, and constitute
	a key tool to carry out the core work of a group.
	Like in any working environment, reciprocal
	trust is an essential team quality.  Therefore, participants
	authentication is not an irrelevant feature.</t>

			<t>
	However, Domain-based Message Authentication, Reporting, and Conformance
	(DMARC) (<xref target="RFC7489"/>) hinges on the alignment of the
	domain in the From: header field with a verified DKIM signature.
	For that reason, MLMs that transform messages have to rewrite From:.
	MLM transformation reversion reduces the DMARC's effects on indirect
	mail flows.</t>

			<t>
	In this experiment, we try and restore the end-to-end nature of the
	From: email field after DMARC rewriting, focusing on the behavior of
	mailing lists as used in the IETF.  Several Mailing List Managers (MLMs)
	are configured to add a footer and a subject tag to the messages that
	they redistribute.  Although  that behavior slightly exceeds the
	very limited set of modifications and actions described by
	<xref target="RFC5321" sectionFormat="of" section="3.9.2"/>, it is a
	welcome, time-honored tradition.  According to their configuration,
	the modifications they carry out on messages result in a set
	of stylized transformations that are programmatically revertible.
	Reversion allows to verify DomainKeys Identified Mail (DKIM)
	signatures (<xref target="RFC6376"/>) that were applied before the 
	transformation.</t>
			<t>
	Mailbox providers can configure their mail submission agents (MSAs)
	in order to ease MLM transformation reversion.  Or they can make it
	impossible.  Their will is expressed by their DKIM signing policy.</t>
			<t>
	At the receiver, the DKIM verifier needs a substantial enhancement
	to undo the transformations and verify the original signatures.
	That undoing is carried out in the same way as
	canonicalization; that is, it does not actually change the message
	except for adding Authentication-Results: header fields.  Details
	are outlined in <xref target="algo"/>.</t>
			<t>
	Besides IETF mailing lists, that setting also works for
	any MLM operators which abide by the same rules.  The outcome is
	twofold:</t>
			<ol>
				<li>
	Author domains receive feedback about DKIM verification
	of mailing list traffic.  That might eventually lead them to harden
	their DMARC policy.</li>
				<li>
	Final recipient's mail delivery agents (MDAs), which know by the
	Authentication-Results: field whether a rewritten From: header was
	verified, can safely undo From: rewriting (after any external
	forwarding).  That way, the annoyance causes by munging to
	end recipients is avoided.</li>
			</ol>
		</section>

		<section numbered="true" toc="default">
			<name>Terms Definitions</name>
			<t>
	<strong>Signers</strong> and <strong>verifiers</strong> are defined
	in <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.</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>
		</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 often 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>
	Therefore, if the field is signed, it is clever 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>
	MLMs can save the original value of From: in a variety of places,
	including Reply-To:, Cc:, X-Original-From:.  When the original
	value is known, the transformation is revertible.</t>

					<t>
	Author's domain submission agents can also provide a copy of From:
	in one of the fields Author: <xref target="RFC9057"/> and
	Original-From: <xref target="RFC5703"/>.  Besides providing
	revertibility, signing that field signals participation and
	implicitly asks for feedback reports.</t>

				</section>
			</section>
			<section numbered="true" toc="default">
				<name>Body Transformations</name>
				<t>
	We only consider footer addition.  It is often 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="algo" numbered="true" toc="default">
			<name>Outline of a Reverting Verifier</name>
			<t>
	The algorithm described here is implemented in a mail filter
	<xref target="zdkimfilter"/>.  The filter
	usually reads the input message twice —first pass, verify; last 
	pass, write Authentication-Results and the rest of the message to 
	follow.  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="sigrole"/> 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.</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 is there already.</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 rewritten From:
	(if deemed to have been rewritten).  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.  For
	authentication purposes, the first 19 characters of that field can
	be discarded.</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 replacing the From: field,
	the verifier writes a prominent, well documented "reason" in the
	relevant resinfo stanza
	(<xref target="RFC7601" sectionFormat="of" section="2.2"/>).
	For example:</t>
			<sourcecode name=""><![CDATA[
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.</t>
		</section>

		<section numbered="true" toc="default">
			<name>Actors Roles and Compliance</name>
			<section anchor="sigrole" numbered="true" toc="default">
				<name>Original Signer</name>
				<t>
	Signers who wish their users to be able to participate to mailing
	lists can adopt rules apt to ease MLM transformations reversion.
	A sender might abide by the following rules for all outgoing
	mail, or, if it had some idea which recipients are MLMs, could apply
	the rules only to mail to those recipients.</t>
				<t>
	A first rule is the addition of an Author: or Original-From: header
	field with a value identical to the one signed in From:.
	Author: is defined for exactly this purpose by <xref target="RFC9057"/>.
	Original-From: is defined by
	<xref target="RFC5703"/> in the context of Sieve Email Filtering.
	As Sieve operates at time of final delivery, DKIM verifiers which
	act at the time of message transit can reliably use it.</t>
				<t>
	If Author: is also signed by the author's domain,
	a reverting verifier can send DMARC feedback reports also to the
	original signer, even though From: was rewritten.</t>
				<t>
	Note that <xref target="RFC7960"/> suggests that ReSenders can add
	an Original-From: too.  Likewise, <xref target="RFC9057"/> suggests
	that Author: can be added by Mediators.</t>
				<t>
	Other generic rules to ease reversion are as follows:</t>
				<ul>
					<li>
	DKIM signatures must deploy the "relaxed" canonicalization, at least
	for the header, since MLMs may reflow header fields.</li>
					<li>
	The quoted-printable encoding must not be used for the body of
	single-part text/plain messages, as it is impossible to guess
	original soft line breaks after re-encoding.  Base64 is much more
	robust.</li>
					<li>
	Single-part text/plain messages encoded as base64 must follow a
	constant column width of 76 characters.  The encoding must be
	advertised by adding a new header field as follows:</li>
				</ul>
				<sourcecode name=""><![CDATA[
  Original-Content-Transfer-Encoding: base64
]]></sourcecode>
				<ul>
					<li>
	If the original Subject: begins with a tag (not Re: followed by a
	tag), its value must be copied to an Original-Subject: header field.
	The latter field is also defined by <xref target="RFC5703"/>, and
	the same usage considerations hold.</li>
					<li>
	Content-Type: and Content-Transfer-Encoding: are fields related to
	the data form. <xref target="RFC6376" sectionFormat="of" section="5.4.1"/>
	does not recommend to sign them.
	Mailers often rewrite them, so they must not be
	signed if signature robustness is a concern.
	If signed, their Original- counterpart should be set too.</li>
					<li>
	When signing Cc: or Reply-To:, add their Original- counterparts to
	the header, as MLMs are likely to change them, especially if they
	have multiple mailboxes.</li>
					<li>
	Original-*: fields
	with an empty value stand for non-existing counterparts.</li>
					<li>
	Except as noted above for Author:, Original-* fields need not be
	signed.  If original signatures can be recovered, that suffices;
	otherwise, the unverified signature is irrelevant.</li>
				</ul>

			</section>
			<section numbered="true" toc="default">
				<name>MLM</name>
				<t>
	Participating MLMs must not operate transformations other than those
	listed in <xref target="trans"/>.  Since DKIM is MIME-agnostic,
	attention must be paid to preserve the exact preamble and epilogue
	of the original MIME structure.</t>
				<t>
	MLMs must apply their own DKIM signature.  The presence of signatures
	by multiple domains can be used by verifiers to infer that a message
	underwent MLM transformations.</t>
				<t>
	It is recommended that MLMs add a mailbox entry to Reply-To: or Cc:
	in order to ease off-list replies as well as to allow transformation
	reversion.</t>
				<t>
	MLMs which collect posts from other MLMs must avoid to add their
	own footer and subject tag.  Transformation reversion cannot be stacked.
	A second-level MLM can modify or replace the content of previous
	transformations.  Attention must be paid to not exceed tag and footer
	length limits.</t>
			</section>
			<section numbered="true" toc="default">
				<name>Verifier</name>
				<t>
	Attempts to verify original signatures can be done as outlined
	in <xref target="algo"/>.  The reversion must not alter the
	messages signed and distributed by MLMs, except for adding an
	Authentication-Results: header field, and possibly an Author: or an
	Original-From: field.</t>
				<t>
	If an original signature with rewritten From: is recovered, the
	verifier must make sure that the original value of From: is written
	out in a field agreed upon by downstream agents, typically
	Original-From:.  An MDA downstream may combine
	the Authentication-Results: with that field
	to restore the original value of From:.  This is the only recommended
	modification to the distributed message.  It must be done after any
	dot-forward processing, so that external verifiers receive the
	message as distributed by the MLM, and can revert transformations
	by themselves.</t>
				<t>
	If the Author: field is found and if it was included in
	the h= tag of the original signature, the corresponding DMARC
	record may be looked up and its "rua=" and "ruf=" tags considered
	for feedback reports, whatever the result.
	However, if applying DMARC policies is considered, it is the
	From: field which rules, not the Author:, Original-From:, Sender:,
	nor any other mailbox domain.</t>
			</section>
		</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 MLM 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, that contrast
	is eliminated.  Then, perhaps, deceptive mailboxes 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 false 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">Template</th>
							<th align="left">Protocol</th>
							<th align="left">Status</th>
							<th align="left">Reference</th>
						</tr>
					</thead>
					<tbody>
						<tr>
							<td align="left">Original-Content-Transfer-Encoding</td>
							<td align="left"></td>
							<td align="left">mail</td>
							<td align="left">standard</td>
							<td align="left">this I-D</td>
						</tr>
						<tr>
							<td align="left">Original-Reply-To</td>
							<td align="left"></td>
							<td align="left">mail</td>
							<td align="left">standard</td>
							<td align="left">this I-D</td>
						</tr>
						<tr>
							<td align="left">Original-Cc</td>
							<td align="left"></td>
							<td align="left">mail</td>
							<td align="left">standard</td>
							<td align="left">this I-D</td>
						</tr>
					</tbody>
				</table>
			</section>
		</section>

		<section numbered="true" toc="default">
			<name>Experimental Goals</name>

			<t>
	Mailing lists are a tool of the trade in a number of communities,
	including IETF. In order to preserve the confidence in it as is
	provided by the end-to-end nature of mail identifiers also in the
	face of DMARC disruption, the feedback this experiment seeks can be
	sketched in the following goals:</t>
			<ul>
				<li>
	Are signers or MUA willing to add the Author: field?</li>
				<li>
	How much change is needed to adapt more DKIM verifiers to revert
	the restricted set of transformations described here so as to
	verify original signatures and restore the original value of From:?</li>
				<li>
	Alternatively, a receiver could trust an Authenticated Received Chain
	(ARC) <xref target="RFC8617"/> and use the value of Author: to
	restore the original value of From:.  There are some outstanding
	loose points in doing so, but how do these two possibilities compare?
	What is the security vs. ease of setup tradeoff?</li>
				<li>
	What are the incentives to make the changes?</li>
			</ul>
		</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.5321.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.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.7601.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.8617.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>
