<?xml version="1.0" encoding="utf-8"?>
<?xml-model href="rfc7991bis.rnc"?>  <!-- Required for schema validation and schema-aware editing -->
<!-- <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> -->
<!-- This third-party XSLT can be enabled for direct transformations in XML processors, including most browsers -->
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<!-- If further character entities are required then they should be added to the DOCTYPE above.
     Use of an external entity file is not recommended. -->
<rfc
  xmlns:xi="http://www.w3.org/2001/XInclude"
  category="info"
  docName="draft-nurpmeso-dkim-access-control-diff-changes-10"
  ipr="trust200902"
  obsoletes=""

  updates="6376"

  submissionType="IETF"
  xml:lang="en"
  version="3">
<!--
     [CHECK]
       * category should be one of std, bcp, info, exp, historic
       * ipr should be one of trust200902, noModificationTrust200902,
         noDerivativesTrust200902, pre5378Trust200902
       * updates can be an RFC number as NNNN
       * obsoletes can be an RFC number as NNNN
-->
  <front>

   <title>DKIM Access Control and Differential Changes</title>

   <seriesInfo name="Internet-Draft" value="draft-nurpmeso-dkim-access-control-diff-changes-10"/>

    <author fullname="Steffen Nurpmeso" initials="S" role="editor" surname="Nurpmeso">
      <address><email>steffen@sdaoden.eu</email></address>
    </author>

    <date year="2025" month="12" day="31"/>

    <area>General</area>
    <workgroup>Internet Engineering Task Force</workgroup>

    <keyword>DKIM</keyword>

    <abstract><t>
      This document specifies a
      DKIM (RFC 6376)
      extension that allows cryptographic verification of
      SMTP (RFC 5321)
      envelope data,
      of any DKIM signature along the message path, even beyond
      IMF (RFC 5322)
      message content changes.
      It therefore addresses security glitches,
      and introduces a new world of email solutions that move complexity
      away from lower network layers,
      where problems cannot be solved,
      complying with David Wheeler's fundamental theorem of software
      engineering, that "We can solve any problem by introducing an
      extra level of indirection".
      It updates DKIM to obsolete certain aspects that reality has
      proven to be superfluous, incomplete, or obsoleted.
    </t></abstract>

  </front>
  <middle>

    <section>
      <name>Introduction</name>
      <t>
        DKIM<xref target="RFC6376"/>
        was not designed to cover
        SMTP<xref target="RFC5321"/>
        envelope data, allowing replay of valid, verifiable messages
        to an infinite set of recipients by malicious third parties,
        undetectable by sender and recipients.

        (To aid SMTP delivery to recipients in various conditions the
        optional "x=" expiration tag timestamp must be chosen so far
        in the future that malicious players have plenty of time to
        misuse messages.)
      </t><t>
        Whereas
        DKIM<xref target="RFC6376"/>
        standardized rudimentary, incomplete approaches to undo
        modifications of
        IMF<xref target="RFC5322"/>
        message content that happen along the message path,
        the overall design was agreed in not to survive them
        (compare, for example,
        <xref target="RFC6377"/>).

        The resulting paradigm of DKIM is
        "as long as one signature can be verified cryptographically,
        DKIM verification will succeed".

        This is problematic as message content changes may be falsely
        attributed to (the) address(es) in the IMF originator field(s).

        (Later policy-enforcing standards effectively complicated the
        situation, in that false attribution may now technically be
        avoidable, but mitigations of practice like "user A via B" will
        still be attributed to "A" by a human for one, and, in short,
        anything is valid if one DKIM signature is.)
      </t><t>
        Potentially many DKIM signatures may exist in a message.
        DKIM<xref target="RFC6376"/>
        gives hints on how verification can be performed,
        but, in practice, mitigations are applied in order to reduce
        excessive and useless verifications on hops down the message
        path: elder signatures are removed, or renamed, as changes
        are performed on message content, for example, by mailing-lists.

        An approach to avoid excessive network traffic and CPU work
        during message verification mitigates careless configurations.
      </t><t>
        The presented ACDC extension addresses these and more issues,
        backward and forward compatible, easy adoptable, and easy
        integratable into the current, existing infrastucture.
      </t>

      <section>
        <name>Conventions and Terminology</name>
        <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="RFC8174"/> when, and only when, they appear in
          all capitals, as shown here.</t>
        <t>
          The term "FOSS" refers to Free and Open Source Software.
        </t>
      </section>
    </section>

    <section>
      <name>DKIM Vivid Adjustments</name>
      <t>
        The adult, mature, and rock solid foundation of
        DKIM<xref target="RFC6376"/>
        is built upon.
        But this document obsoletes certain unused / incomplete aspects,
        and adjusts certain vivid parts of the DKIM core, as follows.
        The full context of the changes will become clear as the remains
        of this document unfold.
      </t><ul><li><t>
        The signature expiration tag "x=" is no longer optional.
        It <bcp14>MUST</bcp14> be used within DKIM-Signature: header
        fields to place a lifetime constraint when creating signatures.
      </t><t>
        The maximum "t=" to "x=" delta <bcp14>MUST NOT</bcp14> be
        greater than 864000 seconds
        (ten days: to reach into the next working week).
        Example delta values for tag auto-generation may be the bounce
        defaults 432000 seconds (five days: used for example by the
        Mailman2 and mlmmj mailing-list managers and the postfix MTA),
        345600 seconds (four days: OpenSMTPD MTA),
        172800 seconds (two days: Exim MTA).
      </t><blockquote>
        <em>Informative remark:</em>
        The DKIM section 5.2 defined "reasonable validation interval
        before [keys are] being removed from the key server" is being
        pointed to in that respect.
      </blockquote><blockquote>
        <em>Informative remark:</em>
        For internal "ingress" DKIM-Signature: header fields
        (with the "I" flag, as below, set)
        this limit does not apply: it <bcp14>MAY</bcp14> be as high as
        local policies desire,
        in order to support delayed verification of validation results.
      </blockquote></li><li><t>
        The advices of DKIM section 5.4 and 5.4.1,
        Determine the Header Fields to Sign
        and
        Recommended signature content,
        respectively, still apply.
      </t><t>
        To address
        MIME<xref target="RFC2045"/>
        attacks the term "highly advised" regarding MIME header fields
        is, however, emphasized further:
        MIME header fields <bcp14>MUST</bcp14> be protected.
      </t><t>
        Also because the ACDC differential changes, as below, cover them,
        all header fields that were cryptographically protected by elder
        (ACDC enabled) DKIM-Signature: header fields <bcp14>MUST</bcp14>
        be protected.
      </t><t>
        IANA is asked to introduce a revision counted registry of header
        fields to be included in cryptographic signature protection;
        ACDC, as below, includes the supported revision of the DB in the
        cryptographic signature.
      </t></li><li><t>
        ACDC, as below, aware software is urged to "oversign" aka "seal"
        aka sign fields that are not present at the time of signing, how
        DKIM (section 3.5, "h=" tag description) calls it.
        Modifications and/or additions of "regular" intermediates will
        then be covered by their "regular" signature, and the differences
        will be discoverable via ACDC.
      </t></li><li><t>
        ACDC, as below, aware software <bcp14>SHOULD</bcp14> use the
        AUID (DKIM, section 3.5, "i=" tag description).
        The value <bcp14>SHOULD</bcp14> enable the Signer to identify
        the originator for whom it creates the signature.
      </t></li><li><t>
        ACDC aware software is suggested to offer configuration
        directives that ensure that the
        SMTP<xref target="RFC5321"/>
        envelope <tt>MAIL FROM</tt> matches the first address of the
        IMF<xref target="RFC5322"/>
        From: header field.
<cref>TODO: Or the formerly usual From:/Sender: paradigm, shall that be
revived from its DKIM- and DMARC-destructed state</cref>
      </t></li><li><t>
        DKIM section 3.7 defines how "Computing the Message Hashes" has
        to be performed.
        Different to the RSA algorithm (RFC 8017) solely defined for DKIM
        at the time section 3.7 was written,
        modern algorithms include checksumming themselves.
        Section 3.7 is hereby modified in that the input to "sig-alg",
        the "data-hash",
        can adapt to standardized algorithms as appropriate.

        If an algorithm chooses adaption,
        "hash-alg" is only used to produce the "body-hash",
        whereas the input formerly used to create the "data-hash"
        is fed in full into "sig-alg", instead of to "hash-alg".

        More formally,
        the new pseudo-code for the signature algorithm is:
      </t><sourcecode><![CDATA[
body-hash = hash-alg (canon-body, l-param)
data-hash = hash-alg (h-headers, D-SIG, body-hash)
signature = sig-alg (d-domain, selector,
                     data-hash / (h-headers, D-SIG, body-hash))
      ]]></sourcecode></li></ul>
    </section>

    <section>
      <name>DKIM ACDC</name>
      <t>
        The
        DKIM<xref target="RFC6376"/>
        extension Access Control and Differential Changes:
      </t><ul>
        <li>
          Places DKIM signatures in an ordered, numbered,
          random-accessible sequence which' state correlate.

          Identical DKIM signatures generated at the same hop,
          but which differ in only the used algorithm,
          share, however, a sequence number.

          With ACDC it can be, and usually is, sufficient to verify
          only the cheaply detectable highest numbered signature.
        </li><li>
          Adds reversible data difference tracking,
          and as such supports cryptographical content verification
          of any (ACDC aware) intermediate message state,
          up to the initial variant as sent by the originator.
        </li><li>
          Cryptographically protects the
          SMTP<xref target="RFC5321"/>
          envelope, that is,
          <tt>RCPT TO</tt> addresses
          as well as the
          <tt>MAIL FROM</tt>
          address.

          Replay of valid messages to initially not addressed recipients,
          as well as backscatter bounces to random addresses instead of
          the originator, becomes detectable.
        </li><li>
          Allows cryptographically verifiable collection of statistics of
          organizational trust (<xref target="RFC5863"/>, section 2.5)
          along the entire message path.
        </li><li>
          Allows recognition of certain flagged conditions (along the
          message path) only by looking at the highest numbered signature.
        </li>
      </ul><t>
        The
        DKIM<xref target="RFC6376"/>
        extension Access Control and Differential Changes
        is announced by adding an "acdc=" tag to the DKIM-Signature:
        header field.
        (For efficiency reasons it <bcp14>SHOULD</bcp14> be placed
        early, before tags like "h=", "bh=" and "b=", for example.)
      </t><t>
        The tag starts with "sequence",
        a decimal number starting at 1,
        or incremented by 1 from the highest ACDC "sequence"
        encountered in the message;
        the maximum value is 999:
        if incrementing would result in overflow,
        the message <bcp14>MUST</bcp14> be rejected;
        detected sequence holes <bcp14>MUST</bcp14> also cause
        rejection (but see below);

        in both cases
        SMTP<xref target="RFC5321"/>
        reply code 550 is to be used; with
        enhanced SMTP status codes<xref target="RFC3463"/>
        5.5.4 <bcp14>MUST</bcp14> be used.
      </t><t>
        Multiple DKIM-Signature: header fields with the same "sequence"
        <bcp14>MAY</bcp14> be generated by a domain, in which
        case each field <bcp14>MUST</bcp14> use a different "s="
        selector and algorithm,
        and maximally one selector per algorithm <bcp14>MUST</bcp14>
        be used.
      </t><t>
        The second tag entry after "sequence" is "ianarev",
        which announces the supported revision of the IANA registry of
        header fields, as below.
        All header fields included in the registry at that revision
        <bcp14>MUST</bcp14> be included in the cryptographic signature.
      </t><blockquote>
        <em>Informative remark:</em>
        Explicitly including the supported revision of the IANA registry
        of additional header fields enables user interfaces
        (also see below) to provide many supportive measures to users
        that make decisions on the trustworthiness of intermediates;
        it could also allow for a more thorough automatic collection of
        trustworthy statistics of organizational trust
        (<xref target="RFC5863"/>, section 2.5).
      </blockquote><t>
        Flag description is normative.
        (Note the missing <tt>FWS</tt> separators around <tt>=</tt>.)
        ABNF<xref target="RFC5234"/>:
      </t><sourcecode><![CDATA[
acdc = %x61 %x63 %x64 %x63 =
       sequence ":" ianarev ":" 1*flag [ ":" id ]
sequence = 1*3DIGIT; DIGIT from RFC 5234
ianarev = 1*3DIGIT
flag = "A" / "D" / "E" / "I" / "O" / "P" / "R" / "S" / "s" /
       "V" / "v" / "X" / "x" / "Y" / "y" / "Z" / "z"
id = *42(ALPHA / DIGIT / "+" / "-"); optional (bounce) identifier
      ]]></sourcecode><dl>
        <dt>A</dt><dd><t>
          Alongside the "V" flag (see there) only:
          all existing signatures were verified.
        </t></dd><dt>D</dt><dd><t>
          The message was modified at this hop,
          differential changes were generated,
          and are stored in a DKIM-DC: header field.
        </t><t>
          The "Y" flag has to be set.
        </t></dd><dt>E</dt><dd><t>
          The
          SMTP<xref target="RFC5321"/>
          envelope (<tt>MAIL FROM</tt> and/or <tt>RCPT TO</tt>)
          was modified.
          A new "Access Control" (see there) evaluation has been performed.
        </t><t>
          The "O" flag has to be set if the <tt>MAIL FROM</tt> changed.
          The "y" flag has to be set.
        </t></dd><dt>I</dt><dd><t>
          This DKIM-Signature: header field was generated at ingress.
          Special rules apply to these signatures,
          for example unlimited "x=" tag expiration.
        </t><blockquote>
          <em>Informative remark:</em>
          Such fields offer a cryptographically verifiable message state
          authentication contract: for as long as the ("local") "s="
          selector announced key is available,
          the message state at the time it entered the "local" email
          processing system is assurable by for example user interfaces.
        </blockquote><t>
          All signature instances with this flag set <bcp14>MUST</bcp14>
          be removed when messages enter and leave the email system.
        </t></dd><dt>O</dt><dd><t>
          This hop claims the message origin.
        </t><t>
          This either means that the message originated at this hop,
          in which case the signature (usually, DKIM-typical) refers to
          the first address of the From: header field,
          and the "sequence" is 1.
        </t><t>
          It can also mean that the current hop was the, quoting
          <xref target="RFC3461"/>,
          <em>"final delivery for the [original] message"</em>,
          that the message got a <em>"new envelope return address"</em>,
          that is, the <tt>MAIL FROM</tt> of the SMTP envelope was changed.

          In this case the "E" flag has to be set.
        </t><t>
          An "Access Control" (see there) evaluation has been performed.
        </t></dd><dt>P</dt><dd><t>
          Postmaster mode.
          With this flag set the behavior of ACDC borders test
          mode in that rejections must not occur (due to ACDC).
          This is to allow for a communication possibility window in
          a situation where messages would always be rejected, due to
          misconfigurations et cetera, and as such reflects
          SMTP<xref target="RFC5321"/>
          section 4.5.1 Minimum Implementation.
        </t><t>
          If the "sequence" is 1,
          message recipients have to be inspected.
          If the
          IMF<xref target="RFC5322"/>
          header fields To: and Cc: only contain a single addressee with
          the local part
          postmaster<xref target="RFC1123"/>,
          and if the same "postmaster" is addressed as a
          SMTP<xref target="RFC5321"/>
          <tt>RCPT TO</tt> recipient,
          and if no more than two <tt>RCPT TO</tt> recipients exist in
          total,
          then the "P" flag has to be set.
        </t><t>
          Once set, all future ACDC signatures must copy it.
          It <bcp14>MUST</bcp14>, however, be removed when in conjunction
          with the "D" and/or "E" flags the according SMTP envelope
          conditions are no longer satisfied.
        </t></dd><dt>R</dt><dd><t>
          Reputation check to collect
          organizational trust (<xref target="RFC5863"/>, section 2.5)
          along the signature chain was performed.
        </t><t>
          On top of the "V" (and possibly "A") flag(s) this means that
          all differential changes have been applied,
          and all signatures (at least one per "sequence") along the
          chain have been verified,
          and the entire chain validated correctly.
        </t><t>
          Only in signatures with a "sequence" greater than 1,
          and without the "Z" or "z" flag.
        </t><blockquote>
          <em>Informative remark:</em>
          The presence of "R" reveals local state publically;
          however, in a chain of trust this seems desirable even.

          The use of organizational trust may for example mean to
          perform full reputation checks more and more sparingly,
          the higher the trust, falling back to only random checks.
        </blockquote></dd><dt>S</dt><dd><t>
          Only in conjunction with the "I" flag: upon ingress the
          SPF<xref target="RFC7208"/>
          state was successfully verified.
        </t></dd><dt>s</dt><dd><t>
          Only in conjunction with the "I" flag: upon ingress the
          SPF<xref target="RFC7208"/>
          verification failed.
        </t></dd><dt>V</dt><dd><t>
          ACDC signature verified successfully.
        </t><t>
          The signature with the highest "sequence" has been verified
          correctly,
          the sequence of ACDC signatures is complete,
          and their flags make sense (in the sequence).
          In conjunction with the flag "R" even deeper inspection was
          performed.
        </t><t>
          If multiple signatures with the same highest "sequence" exist,
          the verifier behavior is unspecified in that "V" signals
          success: at least one signature was checked, and all tested
          signatures verified successfully.
          If however all signatures were verified,
          the "A" flag <bcp14>MUST</bcp14> be set;
          in single-signature cases the "A" flag <bcp14>MAY</bcp14> be
          omitted.
        </t><t>
          Only in signatures with a "sequence" greater than 1.
        </t></dd><dt>v</dt><dd><t>
          DKIM signature verified successfully.
        </t><t>
          In signatures with "sequence" 1,
          then missing the "O" flag,
          it means the message originated at a non ACDC aware hop,
          and normal DKIM processing was performed and succeeded.
          Unless DKIM processing succeeded for the DKIM signature which
          covered the messages' From: header field address,
          the "Z" flag must be set, otherwise the "z" flag.
        </t><t>
          In messages with a higher "sequence" it comes alongside
          the "X" flag: necessarily the ACDC chain was broken, and the
          message changed, by an intermediate non ACDC aware hop.
          The "z" flag must be set.
        </t></dd><dt>X</dt><dd><t>
          ACDC verification failed ("V" flag conditions not met);
          however, the normal DKIM signature verification was performed,
          and succeeded.
        </t><t>
          The "z" flag must be set.
        </t></dd><dt>x</dt><dd><t>
          DKIM verification failed.
        </t><t>
          In signatures with "sequence" 1,
          then missing the "O" flag,
          it means the message originated at a non ACDC aware hop,
          and normal DKIM processing was performed and failed.
          The "z" flag must be set.
        </t><t>
          In messages with a higher "sequence" it comes alongside
          the "X" flag: necessarily the ACDC chain was broken, and the
          message changed, by an intermediate non ACDC aware hop.
          The "z" flag must be set.
        </t></dd><dt>Y</dt><dd><t>
          The message has seen
          IMF<xref target="RFC5322"/>
          modifications:
          somewhere along the chain the message data was modified.
          Once set, all future ACDC signatures must copy it.
        </t></dd><dt>y</dt><dd><t>
          The message has seen
          SMTP<xref target="RFC5321"/>
          envelope modifications:
          somewhere along the chain the envelope was modified.
          Once set, all future ACDC signatures must copy it.
        </t></dd><dt>Z</dt><dd><t>
          Announces the ACDC chain is incomplete.
          The message was processed by ACDC unaware hops.
          However, the message verifies correctly and seems to have
          never been modified non-reversibly.
          Once set, all future ACDC signatures must copy it,
          unless later downgraded to the "z" flag.
        </t></dd><dt>z</dt><dd><t>
          The message has seen non-reversible modifications,
          and cannot be cryptographically verified back to its origin.
          Once set, all future ACDC signatures must copy it.
        </t><t>
          If this flag is set ACDC looses its decisive meaning
          and "degrades" to normal DKIM (except for access control):
          no more differential data is generated,
          and messages are distributed further / accepted if just any
          signature verifies.
          (Software configuration <bcp14>MAY</bcp14> allow otherwise.)
        </t></dd><dt>"id"</dt><dd><t>
          The optional "bounce identifier" offers enough room to store
          Universally Unique IDentifiers<xref target="RFC9562"/>.
        </t><t>
          It may be generated to help sending domains to uniquely
          identify messages within the DKIM "t=" and "x=" time delta,
          as well as to ensure that successively sent identical messages
          are not detected as being the same.
        </t><t>
          Receiving domains <bcp14>SHOULD NOT</bcp14> use this identifier
          due to the denial of service attack surface,
          regardless of collected organizational trust (see "R" flag).
        </t></dd>
      </dl><t>
        Unknown flags <bcp14>MUST</bcp14> be ignored.
        Invalid flag combinations and flag misuse,
        and "ianarev" misconfigurations, as far as detectable,
        <bcp14>MUST</bcp14> result in rejection with SMTP reply code 550;
        if enhanced status codes<xref target="RFC3463"/>
        are used, 5.5.4 <bcp14>MUST</bcp14> be used.
        (This includes the "P" flag upon incorrect use.)
      </t>
    </section>

    <section>
      <name>The DKIM-Store header field</name>
      <t>
        The DKIM-Store header field has no meaning in the email system.
        The sole purpose of mentioning it is to announce that it
        <bcp14>MUST</bcp14> be removed when messages enter
        and leave the email system.
      </t><t>
        It could for example be temporarily created and used by
        non-integrated mail filter (milter) software to pass
        informational data in between the "ingress" and the "egress"
        processing side.
        To aid in software bugs and possible configuration errors
        this specification enforces removal of all occurrences.
      </t><blockquote>
        <em>Informative remark:</em>
        In order to achieve locality it is suggested to encrypt data
        passed around in this temporary header field with a key internal
        to the "local" email processing system.
      </blockquote>
    </section>

    <section>
      <name>Access Control</name>
      <t>
        SMTP<xref target="RFC5321"/>
        delivers messages to individual domains.
        With ACDC, when a SMTP envelope was created or changed,
        all distinct domain-names found within the list of intended
        SMTP <tt>RCPT TO</tt> addressees are collected,
        as the message needs to be forged on this individual domain base:
        ACDC will create DKIM-AC: header fields covering SMTP envelopes,
        and include them as messages are sent to individual domains.
      </t><t>
        The domains _dkimacdc DNS entries, as below, are queried.
        Any domain that announces ACDC support can be served by a single
        message for all recipients (possible limits, as below, aside).
      </t><t>
        For other domains, to guarantee anonymity, it is necessary to
        differentiate in between public recipients in the To: and Cc:
        header fields, and recipients not covered by these header fields.
        However, another anonymous approach is presented below.
      </t><t>
        <em>Remarks:</em> quality-of-service: for simplicity messages
        may always be forged on a single recipient base, individually.
      </t><t>
        In any case the completely prepared message,
        including the readily prepared DKIM-Signature:(s), is forged,
        (a) DKIM-AC: header field(s) is/are generated which cover(s)
        the logical recipient subset,
        and the resulting message is then sent.
      </t><t>
        ACDC aware recipient domains are expected to manage a message
        DKIM-AC: identity cache to mitigate replay attacks.
        (Hint: a verified DKIM-AC: signature seems like a natural cache
        key source, see below.)
      </t><blockquote>
        <em>Informative remark:</em>
        The now mandatory and constrained "x=" tag allows for finite
        identity cache sizes.
      </blockquote><t>
        To keep the identity cache a write-once data structure, ACDC
        senders <bcp14>MUST NOT</bcp14> generate DKIM-AC: header fields
        with more than half of the 100 recipients that
        SMTP<xref target="RFC5321"/>
        section 4.5.3.1.8 guarantees as a minimum,
        unless a
        DNSSEC<xref target="RFC4033"/><xref target="RFC4034"/><xref target="RFC4035"/>
        protected, or otherwise known trustworthy,
        _dkimacdc DNS entry announced a different limit.
      </t><t>
        If more recipients need to be addressed on a single domain,
        multiple message forges with recipient subsets must be generated:
        like this each message forge is "atomic",
        and the DKIM-AC: header field covers all the SMTP envelope.
      </t><blockquote>
        <em>Informative remark:</em>
        Implementations <bcp14>MAY</bcp14> offer configuration options
        to specify other (higher, lower) recipient limits.
        Like this the much higher limits in actual use
        (for example, the Exim MTA default is 50000)
        can be utilized.
      </blockquote><t>
        ACDC senders <bcp14>MUST</bcp14> be capable to deal with
        SMTP<xref target="RFC5321"/>
        section 4.5.3.1.10 Too Many Recipients Code
        errors signalled via SMTP reply code(s) 452 and 552
        regardless of above limits.
        Whether implementations switch to single recipient delivery,
        use some kind of "nearing target approach" strategy, etc,
        is quality-of-service and not furtherly specified.
      </t><blockquote>
        <em>Informative remark:</em>
        Notifying a local
        postmaster<xref target="RFC1123"/>.
        for a 452 reply code in conjunction with a _dkimacdc DNS entry
        for possible local configuration adjustments (or recipient
        domain postmaster pings) may make sense.
        It could also be used for collecting
        organizational trust (<xref target="RFC5863"/>, section 2.5),
        however.
      </blockquote><t>
        An ACDC aware recipient domain that receives an "acdc=" tagged
        message without a DKIM-AC: header field <bcp14>MUST</bcp14>
        reject the message with SMTP reply code 550; if
        enhanced status codes<xref target="RFC3463"/>
        are used, 5.5.4 <bcp14>MUST</bcp14> be used.
      </t><t>
        It <bcp14>MUST</bcp14> likewise fail if the DKIM-AC: header field
        does not cover the SMTP envelope data.
        It <bcp14>MUST</bcp14> test for a superset of recipients,
        and only fail if an envelope recipient is not included in the
        DKIM-AC: header field.
      </t><t>
        It <bcp14>MUST</bcp14> reject messages which fail the signature
        check of a DKIM-AC: or DKIM-Signature: header field, or the
        condition and flag check verification, with SMTP reply code 550;
        the enhanced status code <bcp14>MUST</bcp14> be 5.7.7.
      </t><t>
        (Senders <bcp14>MAY</bcp14> use
        Delivery Status Notifications<xref target="RFC3461"/>
        to fine-tune the resulting behavior.)
      </t>

      <section>
        <name>The DKIM-AC header field</name>
        <t>
          The syntax of this header field is the usual semicolon
          separated list of DKIM-style tags of unspecified order;
          unknown tags <bcp14>MUST</bcp14> be ignored.
          It is used to cryptographically link the SMTP envelope
          to the sent
          IMF<xref target="RFC5322"/>
          mail message.
        </t><t>
          The "sn=" tag is the linked DKIM-Signature: "sequence",
          best placed early.
          Multiple signatures with the same "sequence",
          but different algorithms may exist,
          and so may DKIM-AC: header fields.
        </t><t>
          The selector of the linked signature is given by the "s=" tag,
          the used algorithm can be deduced from there.
        </t><t>
          The "f=" tag is the
          SMTP<xref target="RFC5321"/>
          <tt>MAIL FROM</tt>
          of the covered message, the complete <tt>addr-spec</tt>.
        </t><t>
          The "d=" tag value is the recipient domain,
          with one to multiple "t=" tag(s) for the <tt>local-part</tt>s
          of <tt>RCPT TO</tt>s.
        </t><blockquote>
          <em>Warning:</em>
          SMTP<xref target="RFC5321"/>
          address local-parts permit <tt>quoted-string</tt>s!
        </blockquote><t>
          In case the recipient domain for a particular message forge
          has not announced support for ACDC,
          and to strengthen SMTP envelope anonymity in permanent
          IMF<xref target="RFC5322"/>
          message data,
          and very especially if the connection to the recipient domain
          does not involve intermediate hops, if detectable,
          the tag "d=" <bcp14>MAY</bcp14> (without intermediates),
          and the tags "f=", and any "t=" <bcp14>SHOULD</bcp14> be
          omitted, and instead an "ec=" tag be placed.
          The content of this tag is
          BASE64<xref target="RFC4648"/>
          encoded, and furtherly unspecified.
          It is suggested to place the content of for example "f=" in an
          encrypted form, decryptable only with a key internal to the
          "local" email processing system.
        </t><t>
          Mirroring DKIM-Signature: the tag list is concluded with the
          "b=" tag that is the cryptographic signature data of the
          DKIM-AC: header field.
          However, the reassembled (see
          DKIM<xref target="RFC6376"/>,
          section 3.5) "b=" value of the linked DKIM-Signature: is
          "virtually assigned", and included when creating the
          cryptographic signature;
          thereafter the "b=" tag is assigned its own value.
        </t><t>
          All instances of DKIM-AC: header fields <bcp14>MUST</bcp14>
          be removed by ACDC aware software as soon as possible:
          they <bcp14>MUST NOT</bcp14> be delivered by local delivery
          agents as part of the message.
          They <bcp14>MUST</bcp14>, however, exist in rejected messages.
        </t><t>
          However, if a domain is only an intermediate, which was
          neither directly addressed nor which originated the mail,
          and which does not modify the SMTP envelope either, then it
          <bcp14>MUST NOT</bcp14> remove the "current" DKIM-AC: header
          field, and it <bcp14>MUST NOT</bcp14> generate a new one.
        </t>
      </section>

      <section>
        <name>The _dkimacdc.DOMAIN DNS TXT RR</name>
        <t>
          The syntax of this DNS resource record is the usual semicolon
          separated list of DKIM-style tags of unspecified order;
          unknown tags <bcp14>MUST</bcp14> be ignored.
          However, <tt>FWS</tt> separation of tag, equal sign, and value
          is not allowed.
        </t><t>
          DNS CNAME chains <bcp14>MUST</bcp14> be followed when looking
          up this DNS RR.
        </t><t>
          The optional tag "rl=" contains an unsigned integer that asserts
          the guaranteed minimum number of recipients that may be used as
          <tt>RCPT TO</tt>s in a single transaction;
          it may be as small as 1.
          0 or invalid values are treated as 1.
        </t><t>
          The tags "v=" and "a=" mirror their
          DKIM<xref target="RFC6376"/>
          (sections 7.5 and 7.6) tags,
          however, "v=" is optional,
          and none to multiple "a=" tags <bcp14>MAY</bcp14> exist:
          they indicate, in descending order, the most desirable
          algorithms for this domain.
          Senders <bcp14>SHOULD</bcp14> try to honour the first fit,
          and exclusively so if the algorithm is a well established one.
          (The exact definition is beyond this specification:
          for example, at the time of this writing, only RSA-SHA256 meets
          this requirement, ED25519-SHA256 does not.)
        </t>
      </section>
    </section>

    <section>
      <name>Differential Changes</name>
      <t>
        Whenever an ACDC enabled domain detects during DKIM-Signature:
        creation that the relaxed representation of a message was
        modified along its flight from ingress to egress, for example,
        when it was processed by a mailing-list which tagged the
        subject and added a message footer,
        a DKIM-DC: header field has to be created.
        It <bcp14>MUST</bcp14> be protected by the signature.
      </t><blockquote>
        <em>Informative remark:</em>
        In an unbroken chain of ACDC signatures the DKIM-DC: covered
        changes can be applied in reverse order of creation in order
        to cryptographically verify all intermediate message states and
        signatures, back to the original version as sent by the sender.
      </blockquote>

      <section>
        <name>The DKIM-DC header field</name>
        <t>
          The syntax of this header field is the usual semicolon
          separated list of DKIM-style tags of unspecified order;
          unknown tags <bcp14>MUST</bcp14> be ignored.
        </t><t>
          The "sn=" tag is the linked DKIM-Signature: ACDC "sequence",
          best placed early.
        </t><t>
          The "c=" tag identifies the compression method used for the
          data in "h=" and/or "b="; the value "z" means
          ZLIB<xref target="RFC1950"/>,
          whereas "bz2" means
          <xref target="bzip2"/>.
          ZLIB <bcp14>MUST</bcp14> be supported by signers and verifiers,
          bzip2 <bcp14>MUST</bcp14> only be supported by verifiers.
          (FOSS implementations of all compression types are available.)
        </t><t>
          The "h=" tag is used to store differential data for header
          fields, "b=" that for body content.
          Both tags are optional,
          but at least one <bcp14>MUST</bcp14> exist in a valid DKIM-DC:
          header field, and a given one <bcp14>MUST NOT</bcp14> have an
          empty value.
        </t><t>
          The differential data is stored in the patch format as below,
          compressed with the method given in "c=", then
          BASE64<xref target="RFC4648"/>
          encoded.
        </t><blockquote>
          <em>Informative remark:</em>
          Testing shows a larger memory footprint and a slightly
          longer decompression time for
          <xref target="bzip2"/>,
          and a much longer compression time and larger result data for
          ZLIB<xref target="RFC1950"/>.
          Using
          <xref target="bzip2"/>
          as the standard compression scheme seems beneficial.
        </blockquote>
      </section>

      <section>
        <name>Patch creation algorithm</name>
        <t>
          The differential changes are created with the DKIM "relaxed"
          normalized header field and body data, respectively, as seen
          on egress, alongside the equally normalized data present
          before modifications took place, that is, on ingress.
        </t><t>
          The header fields <bcp14>MUST</bcp14> be sorted byte-wise
          (by numeric US-ASCII byte value) by-name, the formed subgroups
          <bcp14>MUST</bcp14> remain in the header stack order defined by
          DKIM<xref target="RFC6376"/>
          section 5.4.2, Signatures Involving Multiple Instances of a Field.
        </t><t>
          All ACDC enabled DKIM-Signature: and DKIM-DC:
          (and their DKIX- mitigations, as below)
          header fields <bcp14>MUST</bcp14> be included.
          All header fields covered by the DKIM-Signature:
          <bcp14>MUST</bcp14> be included.
        </t><t>
          In order to allow for direct usage of the sorted header fields in
          DKIM-Signature: creation,
          the sorted subgroup of DKIM-Signature: header fields
          <bcp14>MUST</bcp14> be stored first,
          before the (remains of the) sorted headers.
          DKIM-Signature: header fields <bcp14>MUST</bcp14> be included,
          but <bcp14>SHOULD</bcp14> be renamed to DKIX-, as below.
        </t><t>
          Differential changes are then expressed with the patch content
          as below.
        </t>

        <section>
          <name>Patch content</name>
          <t>
            The patch format is an adopted variant of the
            BSDiff algorithm patch format, as below.
            Overall it consists of a header, followed by control data.
            Thereafter the two byte (8-bit octet) streams of
            differential data (in reverse order)
            and extra data conclude the patch.
            Erroneous patch data <bcp14>MUST</bcp14> cause rejection.
          </t><t>
            The header and the control data consist of 32-bit signed
            integers, stored in netword byte order
            (MSF; most significant byte first).
          </t><t>
            The header consists of four values denoting
            the length of the control data block in bytes,
            the length of the difference data block,
            the length of the extra data block,
            concluded by the length of the original data source;
            The sum of the first three values must be one less than the
            maximum positive 32-bit signed integer.
            The number of control data blocks
            <bcp14>MUST NOT</bcp14> excess the length of the original data
            source plus one.
          </t><t>
            The control data is a stream of tuples of three values each.
            The first denotes the length of differential data to copy in
            bytes, or 0, the second that of extra data to copy, or 0;
            copying has to happen in (that) order.
            The read positions within the differential and extra data move
            forward accordingly.
          </t><t>
            The last control data tuple value denotes the number of bytes
            to seek relatively in the data source after the copying
            (if any) has taken place:
            of all the values, only this one may be negative.
            The overall offset within the data source <bcp14>MUST</bcp14>
            remain positive after the seek.
          </t><blockquote>
            <em>Informative remark:</em>
            Of all control data tuples only the first <bcp14>MAY</bcp14>
            perform seek adjustments without also performing data copies.
            Even if it is otherwise ignored the seek value of the last
            control data tuple <bcp14>MUST</bcp14> be valid.
          </blockquote>
        </section>

        <section>
          <name>BSDiff patch content adaption</name>
          <ul>
            <li>
              32-bit integers are used for length and offset values.
              This almost halves memory usage,
              and produces smaller patch control data.
              It is deemed sufficient for email purposes.
            </li><li>
              Data is stored in big endian
              (network; MSF; most significant byte first)
              instead of little endian
              (LSF; least significant byte first)
              byte order.
            </li><li>
              In order to allow for memory usage reduction during patch
              generation the adaption uses a shared memory region for
              differential and extra data:
              the former is therefore stored in reversed order, top down.
              (Reduces memory usage by the size of the target data set.)
            </li><li>
              The entire, readily prepared patch is passed through a
              compressor.
              (The original uses three separate bzip2 streams to
              sequentially serialize control, differential and extra data
              separately.)
            </li><li>
              The original header did not contain the size of the extra
              data, which was stored last, with its size implicitly
              extending to the end of the patch.
              The adaption includes the extra data size in the header,
              allowing more verification tests to be applied with only the
              header being readily parsed.
              This also enables the I/O layer to allocate perfectly sized
              memory with only the header data being available.
            </li>
          </ul><blockquote>
            There is a FOSS
            <xref target="BSDIPA"/>
            plug-and-play ISO C99 and perl implementation available that
            generates the above patch format.
            It iterated the FreeBSD operating system implementation of
            the BSDiff algorithm of Colin Percival, which has excellent
            characteristics (and sees broadest use for decades).
            It also includes further references on the BSDiff algorithm.
          </blockquote>
        </section>
      </section>

      <section>
        <name>Rationale</name>
        <t>
          Differences are included to allow DKIM verifiers to restore
          previous message content for the purpose of cryptographically
          verifying elder DKIM-Signature: header fields.
        </t><t>
          This for example allows for collecting trustworthy statistics of
          organizational trust (<xref target="RFC5863"/>, section 2.5).
          Or user interfaces may visually restore an initial From: header
          field when messages come from a known mailing-list.
        </t><blockquote>
          For example, user interfaces could use traffic light semantics
          that unfold on click to traffic light semantics of all message
          versions, which would (with precautions) visualize differences:
          this can empower users to make decisions on the
          trustworthiness of intermediates, and to, for example,
          enable the above mentioned From: header field restoration.
        </blockquote><t>
          However, the data exists in the DKIM "relaxed" normalized variant,
          former states are not meant to be usable messages by themselves.
          For example some embedded OpenPGP signature and text couple
          would likely fail to verify, dependent upon the original MIME
          transfer encoding.
        </t><blockquote>
          <em>Informative remark:</em>
          This was deemed acceptable because of the purpose of including
          differential changes,
          and because a visualization of the DKIM covered message should
          still be sufficient to allow users making responsible decisions.
        </blockquote><t>
          Finally, the given example will likely verify as part of the
          complete received message, unless altered along the SMTP path:
          ACDC can ideally say where
          (and exactly what, in an unbroken ACDC chain).
        </t>
      </section>
    </section>

    <section>
      <name>Mitigations for Future</name>
      <t>
        As of the time of this writing the email infrastructure is
        deeply divided due to standards like DMARC and SPF, which
        require mitigations to be applied in order to keep existing
        infrastructures in a usable state.
      </t><t>
        For example, SPF will not survive a single hop, which means
        that alias expansion, a widely used core feature of the email
        infrastructure, does no longer work.
        The IETF has no solution for this problem,
        but the FOSS scene has created a "Sender Rewriting Scheme"
        so that aliases can be used regardless.
      </t><t>
        As another example, DMARC causes a lot of mailing-lists to
        apply mitigations of various form and style: old DKIM signatures
        are removed, or renamed, often the From: header field is
        rewritten in a "User A via List B" style.
      </t>

      <section>
        <name>ACDC mitigations</name>
        <t>
          This memo suggests to apply mitigations actively as part of
          DKIM processing, at minimum temporarily, until, at some future
          time, the email infrastructure has adapted to a new reality.
          Future engineers can then decide how to proceed further.
        </t><t>
          In any case it seems wise to move decisions on actual content
          changes away from the SMTP layer,
          to reduce failures to cryptographic signature failures,
          and let users and/or algorithms on a higher layer decide
          whether a certain content change or applied mitigation is
          "acceptable", or not.
        </t><ul><li><t>
          Rename DKIM-Signature: header fields to DKIX-Signature:.
          This mitigation <bcp14>MUST</bcp14> be applied.
          (With a possible exception of the first, "sequence" 1, as below.)
        </t><t>
          Because DKIM-Signature: header fields are removed or renamed,
          also by unanchored regular expressions, which would match for
          example "EDKIM-Signature", ACDC aware software should rename
          all elder ACDC enabled DKIM-Signature: header fields to
          DKIX-Signature: upon egress.
        </t><t>
          Since only one DKIM-Signature: will have to be verified
          successfully by non ACDC aware DKIM software, and ACDC aware
          software can toggle the single byte back before verifying
          elder signatures, this should be easy in practice:
          just treat DKIM-Signature: and DKIX-Signature: alike,
          but toggle before cryptographic verification.
        </t><t>
          For backward compatibility the most portable algorithm
          should remain in the single-instance DKIM-Signature:.
          If multiple DKIM-Signature:s are created,
          mitigation <bcp14>SHOULD</bcp14> therefore be applied even
          when newly generating signatures.
        </t></li><li><t>
          Mitigate non-local <tt>MAIL FROM</tt> envelopes.
        </t><t>
          Because a possible SPF check will fail on the next hop
          (in situations with strict and, thus, seriously,
          the only conceivably useful SPF policies)
          if a message that does not originate locally leaves the email
          system on egress,
          with a SMTP envelope <tt>MAIL FROM</tt> of a foreign domain,
          mitigate such addresses.
          so that the current hop becomes the, quoting
          <xref target="RFC3461"/>,
          <em>"final delivery for the [original] message"</em>.
          DKIM software <bcp14>SHOULD</bcp14> offer options to exclude
          certain domains from these mitigations.
        </t><t>
          To mitigate, synthesize for example an address of the local
          domain with a <tt>local-part</tt> starting with
          <tt>DKIM=</tt>,
          followed by at least 16 bytes of the
          BASE64<xref target="RFC4648"/>
          encoded
          HMAC<xref target="RFC2104"/>
          of a dedicated cryptographic private key
          and the original <tt>MAIL FROM</tt>.
        </t><blockquote>
          <em>Informative remark:</em>
          The SMTP size limit of <tt>local-part</tt> is 64 octets,
          however the overall "reverse-path" limit of RFC 821 and
          RFC 2821 was 256 octets.
        </blockquote><t>
          As another example, using a dedicated subdomain is an approach
          that avoids any possible <tt>local-part</tt> ambiguities.
          Then for example the IETF mailing-list From: header field
          DMARC mitigation approach could be used, as in decomposing the
          original <tt>MAIL FROM</tt> into "local-part=40domain",
          followed by the "subdomain.domain" of the mitigating host.
          Again, SMTP size limits have to be respected.
        </t><t>
          The synthesized address <bcp14>MUST</bcp14> be linkable to the
          original <tt>MAIL FROM</tt> for at least 864000 seconds
          (ten days: to reach into the next working week).
          It <bcp14>SHOULD</bcp14> be linkable only by message bounces
          which have a verifiable DKIM signature of the local domain,
          and it <bcp14>MAY</bcp14> only link for the signature of
          the exact message for which the address was synthesized.
          The optional bounce identifier "id" may be usable for this
          purpose.
        </t></li><li><t>
          Mitigate From: header fields, if necessary.
        </t><t>
          When a message was changed in between ingress and egress,
          so that the DKIM signature related to the From: header
          field will no longer verify.
          Then, if the From: header field was not already locally
          mitigated (by for example mailing-list software),
          actively mitigate the From: header field,
          so that the current hop becomes the, quoting
          <xref target="RFC3461"/>,
          <em>"final delivery for the [original] message"</em>
          in respect to the
          IMF<xref target="RFC5322"/>
          message that is visible to recipients.
          DKIM software <bcp14>SHOULD</bcp14> offer options to exclude
          certain domains from these mitigations.
        </t><t>
          To mitigate, place the original <tt>name-addr</tt> in the
          Reply-To: header field, unless that already exists,
          and replace From: with synthesized content.
          The examples of non-local <tt>MAIL FROM</tt> envelope
          mitigation apply also here in respect to <tt>addr-spec</tt>;
          yet, the dedicated subdomain approach results in visually
          more appealing header field content.
          For the <tt>display-name</tt> a
          "From: X via Y" notation <bcp14>MAY</bcp14> be used,
          where "X" denotes the original <tt>display-name</tt>.
        </t><t>
          For example, if the original content was
          "Forename Surname &lt;for.sur@example1.net&gt;"
          then the mitigation could be
          <tt>"Forename Surname via @dkim.example2.net"
          &lt;for.sur=40example1.net@dkim.example2.net&gt;</tt>,
          or even the very direct
          <tt>"Forename Surname"
          &lt;for.sur=40example1.net@dkim.example2.net&gt;</tt>
          that the IETF mailing-lists use to mitigate DMARC.
        </t></li></ul>
      </section>
    </section>

    <section>
      <name>Example</name>
      <t>
        An example that shows the flow of a single message with multiple
        different recipients, including mailing-lists and aliases.
        It assumes all recipients support ACDC,
        but does not assume direct, TLS secured connection to recipient
        domains, therefore it keeps DMARC compatibility and plain DKIMv1
        and SPF compatibility, as noted,
        which results in quite some DKIM-/DKIX- duplication.
        In an all-ACDC world only DKIX- would remain, or only ever one
        DKIM-Signature:, the last, as no DMARC rules apply no more.
        SPF would only need to announce <tt>-all</tt>, therefore going
        for the strictest possible mode.
      </t><sourcecode><![CDATA[
Originator (yet forged for recipient domain f.g):

  MAIL FROM: <a@b.c>
  RCPT TO: <d@f.g>
  RCPT TO: <e@f.g>
  ...
  DKIM-AC: sn=1; s=K1; f=a@b.c; d=f.g; t=d; t=e; b=...
  DKIM-Signature: acdc=1:1:O; s=K1; ...
  DKIX-Signature: acdc=1:1:O; s=K1; ...
  From: a@b.c
  To: d@f.g, e@f.g, x@y.z, u@v.w, r@s.t, o@p.q
  ...

f.g, local delivery (to d@ and e@):

  ...
  DKIM-Signature: acdc=2:1:AIV; ...
  DKIX-Signature: acdc=1:1:O; s=K1; ...
  From: a@b.c
  ...

x@y.z -- a mailing-list!
It redistributes after RFC 2369 and RFC 2919 additions,
in-message unsubscribe footer, and From: mitigated
(in best RFC 3461 manner):

  MAIL FROM: <x@y.z>
  RCPT TO: <l@m.n>
  ...
  DKIM-AC: sn=2; s=K2; f=x@y.z; d=m.n; t=l; b=...
  DKIM-DC: sn=2; c=bz2; h=BASE64; b=BASE64
  DKIM-Signature: acdc=2:1:ADEOVYy; s=K2 ...
  DKIX-Signature: acdc=2:1:ADEOVYy; s=K2 ...
  DKIX-Signature: acdc=1:1:O; s=K1; ...
  From: a(AT)b(DOT)c via x@y.z <x@y.z>
  Reply-To: a@b.c
  ...
  List-Unsubscribe: bla

u@v.w -- an expanded alias!
The hop honours RFC 3461, and changes MAIL FROM;
it keeps DKIM-Signature: acdc=1 for DMARC compatibility:

  MAIL FROM: <u@v.w>
  RCPT TO: <realu@realv.realw>
  ...
  DKIM-AC: sn=2; s=K2; f=u@v.w; d=realv.realw; t=realu; b=...
  DKIM-Signature: acdc=2:1:EOVy; s=K2 ...
  DKIX-Signature: acdc=2:1:EOVy; s=K2 ...
  DKIX-Signature: acdc=1:1:O; s=K1; ...
  DKIM-Signature: acdc=1:1:O; s=K1; ...
  From: a@b.c
  ...

r@s.t -- an expanded alias!
Note: not mitigated, will later fail SPF;
it keeps DKIM-Signature: acdc=1 for DMARC compatibility:

  MAIL FROM: <a@b.c>
  RCPT TO: <realr@reals.realt>
  ...
  DKIM-AC: sn=2; s=K2; f=a@b.c; d=reals.realt; t=realr; b=...
  DKIM-Signature: acdc=2:1:EVy; s=K2 ...
  DKIX-Signature: acdc=2:1:EVy; s=K2 ...
  DKIX-Signature: acdc=1:1:O; s=K1; ...
  DKIM-Signature: acdc=1:1:O; s=K1; ...
  From: a@b.c
  ...

..therefore with mitigation,
also to comply with RFC 3461;
it keeps DKIM-Signature: acdc=1 for DMARC compatibility:

  MAIL FROM: <DKIM=a=40b.c@s.t>
  RCPT TO: <realr@reals.realt>
  ...
  DKIM-AC: sn=2; s=K2; f=DKIM=a=40b.c@s.t; ...
  DKIM-Signature: acdc=2:1:EOVy; s=K2 ...
  DKIX-Signature: acdc=2:1:EOVy; s=K2 ...
  DKIX-Signature: acdc=1:1:O; s=K1; ...
  DKIM-Signature: acdc=1:1:O; s=K1; ...
  From: a@b.c
  ...

o@p.q -- a mailing-list!
It redistributes after RFC 2369 and RFC 2919 additions,
in-message unsubscribe footer, without From: mitigation.
Note: not mitigated, will later fail DMARC!

  MAIL FROM: <o@p.q>
  RCPT TO: <X@X.X>
  ...
  DKIM-AC: sn=2; s=K2; f=o@p.q; d=X.X; t=X; b=...
  DKIM-DC: sn=2; c=bz2; h=BASE64; b=BASE64
  DKIM-Signature: acdc=2:1:DEOVYy; s=K2 ...
  DKIX-Signature: acdc=2:1:DEOVYy; s=K2 ...
  DKIX-Signature: acdc=1:1:O; s=K1; ...
  From: a@b.c
  ...
  List-Unsubscribe: bla

..therefore with mitigation:

  MAIL FROM: <o@p.q>
  RCPT TO: <X@X.X>
  ...
  DKIM-AC: sn=2; s=K2; f=o@p.q; d=X.X; t=X; b=...
  DKIM-DC: sn=2; c=bz2; h=BASE64; b=BASE64
  DKIM-Signature: acdc=2:1:DEOVYy; s=K2; d=dkim.p.q ...
  DKIX-Signature: acdc=2:1:DEOVYy; s=K2; d=dkim.p.q ...
  DKIX-Signature: acdc=1:1:O; s=K1; ...
  From: "a@b.c" <a=40b.c@dkim.p.q>
  Reply-To: a@b.c
  ...
  List-Unsubscribe: bla

l@m.n (recipient of x.y.z mailing-list), local delivery:

  ...
  DKIM-Signature: acdc=3:1:IVYy;
  DKIM-DC: sn=2; c=bz2; h=BASE64; b=BASE64
  DKIX-Signature: acdc=2:1:ADEOVYy; s=K2 ...
  DKIX-Signature: acdc=1:1:O; s=K1; ...
  From: a(AT)b(DOT)c via x@y.z <x@y.z>
  ...

realr@reals.realt -- expanded alias target, local delivery:

  ...
  DKIM-Signature: acdc=3:1:IVy;
  DKIX-Signature: acdc=2:1:EOVy; s=K2 ...
  DKIX-Signature: acdc=1:1:O; s=K1; ...
  From: a@b.c
  ...
      ]]></sourcecode>
    </section>

    <section anchor="IANA">
      <name>IANA Considerations</name>
      <t>
        IANA is asked to create a revision counted registry of
        header fields that shall be cryptographically protected
        by DKIM/ACDC in addition to the list mentioned by sections
        5.4 and 5.4.1 of
        DKIM<xref target="RFC6376"/>.
        This memo includes the
        Author Header Field<xref target="RFC9057"/>
        in both lists.
      </t><t>
        To ensure long time compatibility with ACDC
        (maximally three digits in the "ianarev" tag entry),
        IANA is asked to increment revisions conservatively,
        for example maximally once a month,
        and to use a format that groups header fields through
        registry revisions
        (like the "Age" property of Unicode characters).
      </t>
    </section>

    <section anchor="Security">
      <name>Security Considerations</name>
      <t>
        Public-key cryptography is the safest approach to identification
        of counterparts and verification of data.
        This specification enables DKIM to cryptographically verify
        SMTP envelopes, and to cryptographically verify all message
        transitions back to the original message sender.
      </t>
    </section>

  </middle>
  <back>

    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4648.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6376.xml"/>
      </references>

      <references>
        <name>Informative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1123.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1950.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2045.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2104.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3461.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3463.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4033.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4034.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4035.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5234.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5321.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5322.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5863.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6377.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7208.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9057.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9562.xml"/>
        <reference anchor="BSDIPA" target="https://github.com/sdaoden/s-bsdipa">
          <front><title>BSDIPA, a mutation of BSDiff</title><author/></front>
        </reference>
        <reference anchor="bzip2" target="https://sourceware.org/bzip2/">
          <front><title>A program and library for data compression</title><author/></front>
        </reference>
      </references>
    </references>

    <section anchor="FurtherDKIMUpdates">
      <name>Further DKIM Updates</name>
      <ul><li><t>
        This specification obsoletes the simple canonicalization type;
        It <bcp14>MUST NOT</bcp14> be used by software announcing ACDC.
      </t><t>
        <em>Rationale:</em> in order to minimize processing cost in time and
        space for and of differential processing,
        being able to work on and with only one data representation is
        beneficial.
        The "extremely crude ASCII Art attacks" mentioned in
        DKIM<xref target="RFC6376"/>
        section 8.1 are considered to be a rather artificial attack vector.
      </t></li><li><t>
        This specification obsoletes the DKIM "l=" tag that restricts the
        number of DKIM covered bytes of the normalized message body.
        This tag <bcp14>MUST NOT</bcp14> be used by software announcing
        ACDC support,
        and all the message body <bcp14>MUST</bcp14> always be used to
        create the body hash.
      </t><t>
        <em>Rationale:</em> "l=" has always been insufficient to deal with
        message changes caused by mailing-lists etc,
        but effectively includes the security risk that message parts which
        are not covered by the signature appear as "valid content" to users
        looking at a DKIM verified message.
        The ACDC differential changes offer a better approach to deal
        with message changes, while completely covered message bodies
        ensure content validity.
      </t></li><li><t>
        For the "i=" tag this specification obsoletes the possible use of
        DKIM-Quoted-Printable for the optional <tt>Local-part</tt>.
      </t><t>
        <em>Rationale:</em> because the syntax is "a standard email
        address where the local-part MAY be omitted", quoted-printable
        encoding is not necessary for representation.
      </t></li><li><t>
        This specification obsoletes the DKIM "z=" tag that was defined
        "for diagnostic use" to copy a freely defined set of header fields
        and their values present during signature creation.
        This tag <bcp14>MUST NOT</bcp14> be used by software announcing
        ACDC.
      </t><t>
        <em>Rationale:</em> the ACDC differential changes provide access
        to the same information.
      </t></li><li><t>
        For the "q=" tag this specification obsoletes the possible use of
        DKIM-Quoted-Printable for the optional <tt>x-sig-q-tag-args</tt>
        of possibly introduced future query types.
      </t><t>
        <em>Rationale:</em> shall ever a new type become standardized
        beside the dns/txt that is with DKIM from the very start,
        that standard can very well give meaning to a
        <tt>hyphenated-word</tt> proxy identifier without making use of
        byte values which would require encoding.
      </t></li><li><t>
        This specification obsoletes the DKIM key representation tag "n="
        that was meant to include "notes that might be of interest to
        a human", "intended for use by administrators, not end users",
        and which "should be used sparingly".
      </t><t>
        <em>Rationale:</em> no use case has been encountered in the DNS,
        let alone serious such; if future space unconstrained key
        providers other than DNS should ever exist and be used to
        distribute DKIM keys, it is likely that they support inclusion
        of strings via some method that need not be included in the DKIM
        key representation itself.
      </t></li><li><t>
        Because above changes remove all use cases for the
        <tt>dkim-quoted-printable</tt> encoding defined in RFC 6376 2.11,
        this specification obsoletes the DKIM-Quoted-Printable encoding.
      </t></li><li><t>
        This specification obsoletes the use of <tt>FWS</tt> in
        <tt>ag-spec</tt>.
        Second its use was never encountered by the author.
        But first of all
        MIME<xref target="RFC2045"/>
        introduced parameters in ABNF as
        <tt>parameter := attribute "=" value</tt>
        without <tt>FWS</tt>,
        and its presence complicates parsers and hinders parser code reuse.
        The "acdc=" tag is defined without <tt>FWS</tt> support.
      </t></li></ul>
    </section>

    <section>
      <name>What if this becomes DKIMv3?</name>
      <t>
        Due to an IETF tooling bug iteration -7 of this draft could not
        become submitted on July 21st of 2025, before the IETF meeting
        in Madrid.
        A week later <tt>[rt5.ietf.org #44510]</tt> is still open,
        so this gives me time to add this preface with the presumed
        outcome of the session, introduction of the completely new DKIM2
        that tracks in public SMTP envelope data beyond RFC 3461
        <em>"final delivery for the [original] message"</em> that is,
        in mind.
        This proposal here would thus become "DKIM3" in the event that
        it is revived if the internet community (in large) objects using
        DKIM2.
      </t><t>
        So, shall this draft be revived at some later time,
        and if compatibility to the original DKIMv1 is not an issue,
        i would vote to simply go for DKIX- prefix all the time,
        and use the shorter DKIX-Sig:;
        i would furtherly vote for using header abbreviations for certain
        standard headers, as in, for example, <tt>D:F:T:L=IU[:.:xy]</tt>
        instead of <tt>Date:From:To:List-ID:List-Unsubscribe</tt>, where
        custom names come after standardized abbreviations after a
        separating field, "." in the above (but care for syntax),
        otherwise simply an empty field.
      </t><t>
        If compatibility to DKIMv1 is an issue, then maybe the above is
        of some value "as-is".
        <em>However</em>, it could be DKIMv1 <em>completely</em>,
        Dave Crocker asked for that (on the list),
        and had his own "DKOR" draft.
        This is easy:
        just move the "acdc=" tag out of DKIM-Signature:, and into a
        dedicated header, like, say, DKIX-Ctl:, that MUST be covered
        by the signature, like the -DC: ones.
        We could, in fact, not use any "sequence", at all:
        that was my original idea, but on the ML voices said "it is
        believed reordering occurs", and i, unfortunately, heard these
        voices; having heard what else there was said on the ML, i
        would no longer do that, and instead rely on the header stack
        as such, it will be DKIX-AC: .. and later (groups of)
        DKIM-Signature:, DKIX-Ctl:, and optionally DKIX-Diff:.
        In order.
      </t><t>
        Btw, if compatibility with DKIMv1 is not an issue,
        knowledge about MIME boundaries could be thought about,
        and each part be taken and checksummed by itself.
        This would allow for hops which simply remove certain parts
        due to spam or other policies, like stripping HTML parts
        from multipart/alternative containers.
        However, this would tend to become patchy and overly complicated,
        and is possibly a hopeless task all in all.
      </t><t>
        Greetings, and Ciao! from Germany.
      </t>
    </section>

    <section anchor="Apologies">
      <name>Apologies</name>
      <t>
        By adopting this draft the IETF recognizes that certain
        developments of the past two decades mutilated the existing
        email infrastructure to the point where it stopped functioning.
        Without malicious intent this was the effective outcome of
        trials to create a stronger security policy.
        It left operators of for example mailing-lists and alias farms
        without options to continue operating their infrastructure,
        except through non-standardized, sometimes partial and imperfect
        solutions created by third parties.
        By applying mitigations through a standardized approach
        it is hereby tried to create a solid foundation for a better
        future.
      </t>
    </section>

    <section anchor="Acknowledgements">
      <name>Acknowledgements</name>
      <t>
        Thanks to, in the order of appearance,
        Jesse Thompson,
        Richard Clayton for arguments against reliance on header field
        stacks, and pro the numbering scheme,
        and especially for noticing the partial transaction replay attack
        problem,
        Douglas Foster,
        Michael Thomas for explicit man-in-the-middle replay addressing;
        Alessandro Vesely inspired the explicitness of the E flag,
        Bron Gondwana for the inspiration to split up binary
        differences of headers and body,
        as well as the IANA registry revision,
        Lasse Collin for LZMA2 (and clarification vs XZ),
        and Julian Seward for bzip2.
        A big fat acknowledgment is due to Murray S. Kucherawy.
        Special thanks to Klaus Schulze, Manuel Goettsching,
        both also as Ash Ra Tempel,
        Laeuten der Seele,
        Laurent Garnier,
        as well as the Sleeping Environmental Bot broadcast.
      </t>
    </section>

 </back>
</rfc>
<!-- vim:set tw=1000:s-ts-mode -->
