<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 4.0.7) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-ietf-dkim-dkim2-spec-08" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="DKIM2 Signatures">DomainKeys Identified Mail Signatures v2 (DKIM2)</title>

    <author initials="R." surname="Clayton" fullname="Richard Clayton">
      <organization>Yahoo</organization>
      <address>
        <email>rclayton@yahooinc.com</email>
      </address>
    </author>
    <author initials="W." surname="Chuang" fullname="Wei Chuang">
      <organization>Google</organization>
      <address>
        <email>weihaw@google.com</email>
      </address>
    </author>
    <author initials="B." surname="Gondwana" fullname="Bron Gondwana">
      <organization>Fastmail Pty Ltd</organization>
      <address>
        <postal>
          <street>Level 2, 114 William Street</street>
          <code>3000</code>
          <country>Australia</country>
        </postal>
        <phone>+61 457 416 436</phone>
        <email>brong@fastmailteam.com</email>
      </address>
    </author>

    <date year="2026" month="October" day="27"/>

    
    
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 85?>

<t>DomainKeys Identified Mail v2 (DKIM2) permits a person, role, or
organization that owns a signing domain to document that it has
handled an email message by associating their domain with the
message.  This is achieved by providing a hash value that has
been calculated on the current contents of the message and then applying a cryptographic
signature that covers the hash values and other details about the
transmission of the message. Verification is performed by querying an entry
within the signing domain's DNS space to retrieve an appropriate public
key. As a message is transferred from author to recipient, systems that
alter the body or header fields will provide details of their changes
and calculate new hash values. Further signatures will be added to
provide a "chain" that receivers can validate. This permits verifiers
to identify the nature of changes made by intermediaries and apply a
reputation to the systems that made changes. DKIM2 also allows
recipients to detect when messages have been unexpectedly "replayed"
and will ensure that Delivery Status Notifications are only sent
to entities that were involved in the transmission of a message.</t>



    </abstract>



  </front>

  <middle>


<?line 105?>

<section anchor="introduction"><name>Introduction</name>

<t>DomainKeys Identified Mail v2 (DKIM2) permits a person, role, or
organization to document that they have handled an email message by
associating a domain name <xref target="RFC1034"></xref> with the message <xref target="RFC5322"></xref>. A
public key signature is used to record that they have been able
to read the contents of the message and write to it.</t>

<t>Verification of claims is achieved by fetching a public key stored
in the DNS under the relevant domain and then checking the signature.</t>

<t>Message transit from author to recipient is through
Forwarders that typically make no substantive change to the message
content and thus preserve the DKIM2 signature. Where they do make
a change the changes they have made are documented so that
these can be "undone" and the original signature validated.</t>

<t>When a message is forwarded from one system to another an
additional DKIM2 signature is added on each occasion. This Chain
of Custody assists Verifiers in distinguishing between messages that
were intended to be sent to a particular email address and those
that are being "replayed" to that address.</t>

<t>The Chain of Custody can also be used to ensure that delivery status
notifications are only sent to entities that were involved in the
transmission of a message.</t>

<t>Organizations that process a message can add to their signature
a request for feedback as to any opinion (for example, that the
message was considered to be spam) that the eventual recipient of
the message wishes to share.</t>

<section anchor="other-dkim2-documents"><name>Other DKIM2 documents</name>

<t>Readers are advised to be familiar with the material in <xref target="DKIM2BCP"></xref>
which provides deployment and operations guidance and advice along
with <xref target="DKIMKEYS"></xref> which provides details on how DKIM keys are stored
within the Domain Name System.</t>

</section>
</section>
<section anchor="terminology-and-definitions"><name>Terminology and definitions</name>

<t>This section defines terms used in the rest of the document.</t>

<t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>

<?line -18?>

<t>DKIM2 is designed to operate within the Internet Mail service, as
defined in <xref target="RFC5598"></xref>.  Basic email terminology is taken from that
specification.</t>

<t>DKIM2 inherits many ideas from DKIM (<xref target="RFC6376"></xref>) which, for clarity
we refer to in this specification as DKIM1. In addition, some features
were influenced by the experimental ARC protocol (<xref target="RFC8617"></xref>) and
the lessons learned from that experiment (<xref target="CONCLUDEARC"></xref>).</t>

<t>Syntax descriptions use Augmented BNF (ABNF) <xref target="RFC5234"></xref>, together with
the %s"..." notation for case-sensitive strings defined in <xref target="RFC7405"></xref>.</t>

<t>This document uses JSON <xref target="RFC8259"></xref> to encode the Recipes which
record changes made to the message header fields or the message body.
The JSON objects are then base64 encoded. This means that a
standard JSON parser can be used to create what may be quite
complex data structures. Keys in the top-level JSON object other
than "h" and "b" are reserved for future specifications, which may
define new kinds of Recipe with their own syntax. If present,
unrecognized top-level keys will be ignored. Within "h" and "b" only
the structures defined in this document are permitted; in particular
each Recipe step <bcp14>MUST</bcp14> contain exactly one of the keys "c", "d" or "u".</t>

<section anchor="signer"><name>Signer</name>

<t>Elements in the mail system that sign messages on behalf of a domain
are referred to as Signers.  These may be MUAs (Mail User Agents),
MSAs (Mail Submission Agents), MTAs (Mail Transfer Agents), or other
agents such as mailing list "exploders".  In general, any Signer will
be involved in the injection of a message into the message system in
some way.  The key point is that a message is signed before it
leaves the administrative domain of the Signer.</t>

</section>
<section anchor="forwarder"><name>Forwarder</name>

<t><xref target="RFC5598"></xref> defines a Relay as transmitting or retransmitting a message
but states that it will not modify the envelope information or the
message content semantics. It also defines a Gateway as a hybrid of
User and Relay that connects heterogeneous mail services. In this
document we use the concept of a Forwarder which is an MTA that receives
a message and then, as an alternative to delivering it into a
destination mailbox, can forward it on to another system in an
automated, pre-determined, manner.</t>

</section>
<section anchor="reviser"><name>Reviser</name>

<t>As will be seen, a Forwarder may alter the message content or header
fields, in such a way that existing signatures on the message will
no longer validate. If so, then a record will be made of these
changes. We call a Forwarder that makes such changes a Reviser.</t>

</section>
<section anchor="verifier"><name>Verifier</name>

<t>Elements in the mail system that verify signatures are referred to as
Verifiers.  These may be Forwarders, Revisers, MTAs, Mail Delivery
Agents (MDAs), or MUAs.
It is an expectation of DKIM2 that a recipient of a message will
wish to verify some or all signatures before determining whether or
not to accept the message or pass it on to another entity.</t>

</section>
<section anchor="signing-domain"><name>Signing Domain</name>

<t>A domain name associated with a signature. This domain may be
associated with the author of an email message, their organization, a
company hired to deliver it, a mailing list operator, or some other
entity that handles email messages. What they have in common is
that at some point they had access to the entire contents of the
message and were in a position to add their signature to the message.</t>

</section>
<section anchor="originator"><name>Originator</name>

<t>The entity that creates and sends the initial form of a message.
The Originator adds the first Message-Instance header field (m=1) and
the first DKIM2-Signature header field (i=1) to the message.</t>

</section>
<section anchor="header-field"><name>Header field</name>

<t>As defined in <xref target="RFC5322"></xref>, a header field is a single logical line in
the message header consisting of a field name, a colon, and a field
body (value).  In this document "header field" always refers to a
single field; "header fields" (plural) refers to multiple fields.
The unqualified term "header" is avoided to prevent ambiguity.</t>

</section>
<section anchor="tag"><name>Tag</name>

<t>A named element within a header field (see <xref target="hfMessageInstance"/>
and <xref target="hfDKIM2signature"/>).  A tag
consists of a tag-name and a tag-value separated by an equals sign.
Tags are separated by semicolons within the header field.</t>

</section>
<section anchor="message-body"><name>Message body</name>

<t>The content of an email message that follows the blank line after
the header fields, treated as a sequence of octets.  In this document,
the terms "body" and "message body" are used interchangeably.</t>

</section>
<section anchor="hash"><name>Hash</name>

<t>A fixed-length value produced by applying a cryptographic hash
function (such as SHA-256) to an input.  DKIM2 uses hashes to
create a compact, verifiable representation of message header fields
and the message body.</t>

</section>
<section anchor="glossary"><name>Glossary</name>

<t>The following terms are used throughout this document:</t>

<dl>
  <dt>DKIM1</dt>
  <dd>
    <t>The original DomainKeys Identified Mail protocol as specified in
<xref target="RFC6376"></xref>.</t>
  </dd>
  <dt>DKIM Replay</dt>
  <dd>
    <t>An attack in which messages with valid signatures but with malicious
content are sent from third party systems at scale, with the intent
that the validity of the signature will ensure they are delivered.</t>
  </dd>
  <dt>DKIM2-Signature</dt>
  <dd>
    <t>A header field containing a cryptographic signature over the
Message-Instance and DKIM2-Signature header fields of a message,
along with metadata about the Signing Domain, SMTP envelope, and
timestamp.</t>
  </dd>
  <dt>Message-Instance</dt>
  <dd>
    <t>A header field containing cryptographic hashes of the message
header fields and body, along with optional Recipes that permit
the reversal of changes made at that hop.</t>
  </dd>
  <dt>Recipe</dt>
  <dd>
    <t>A set of instructions encoded as a JSON object within the r= tag
of a Message-Instance header field.  Recipes allow a Verifier to
reconstruct the previous state of a message from its current state,
by specifying which parts of the header fields or body to copy and
which literal values to substitute.</t>
  </dd>
  <dt>Chain of Custody</dt>
  <dd>
    <t>The sequence of DKIM2-Signature header fields on a message, each
recording the SMTP envelope addresses (MAIL FROM and RCPT TO) used
at each hop.  A valid Chain of Custody demonstrates that the message
followed a plausible path from Originator to the current recipient.</t>
  </dd>
  <dt>Selector</dt>
  <dd>
    <t>A subdivision of the key namespace for a Signing Domain, used
to look up the public key in DNS.  The Selector value is combined
with the Signing Domain to form the DNS query name; for example,
Selector "foo.bar" and Signing Domain "example.com" give
"foo.bar._domainkey.example.com".</t>
  </dd>
  <dt>Authentic</dt>
  <dd>
    <t>A From header field is Authentic if, when it is placed into a message
(either at message creation or later modification), the next
DKIM2-Signature header field created for the message uses a Signing
Domain that can be matched to the domain within the email
address in the From.</t>
  </dd>
  <dt>Fully Verified DKIM2 Message</dt>
  <dd>
    <t>A Fully Verified DKIM2 Message is one which meets all the
requirements set out in this specification on Signers, particularly
those for generating DKIM2-Signature and Message-Instance header
fields. Further, when transmitted, the SMTP MAIL FROM and RCPT TO
will match the values recorded in the most recent DKIM2-Signature
header field.</t>
  </dd>
  <dt>Provisionally Verified</dt>
  <dd>
    <t>A message is said to be Provisionally Verified if a cryptographic
check shows that the hash and signature values in the highest numbered
Message-Instance and DKIM2-Signature header fields correspond
with the message to hand, along with some consistency checks on
these header fields. This is a precondition for the message being a Fully
Verified DKIM2 Message but not a guarantee that it is.</t>
  </dd>
</dl>

</section>
<section anchor="whitespace"><name>Whitespace</name>

<t>There are two forms of whitespace used in this specification:</t>

<t><list style="symbols">
  <t>WSP represents simple whitespace, i.e., a space or a tab character
(formal definition in <xref target="RFC5234"></xref>).</t>
  <t>FWS is folding whitespace.  It allows multiple lines separated by
CRLF followed by at least one whitespace, to be joined.</t>
</list></t>

<t>The formal ABNF for these are (WSP given for information only):</t>

<figure><artwork><![CDATA[
WSP =   SP / HTAB
FWS =   [*WSP CRLF] 1*WSP
]]></artwork></figure>

<t>The definition of FWS is identical to that in <xref target="RFC5322"></xref> except for
the exclusion of obs-FWS.</t>

</section>
<section anchor="imported-abnf-tokens"><name>Imported ABNF tokens</name>

<t>The "Domain" token is imported from <xref target="RFC5321"></xref>.</t>

<t>Other tokens not defined herein are imported from <xref target="RFC5234"></xref>.  These
are intuitive primitives such as SP, HTAB, WSP, ALPHA, DIGIT, CRLF,
etc.</t>

</section>
<section anchor="common-ABNF"><name>Common ABNF tokens</name>

<t>The following ABNF tokens are used elsewhere in this document:</t>

<figure><artwork><![CDATA[
ALPHADIGITD  = (ALPHA / DIGIT / "-" / "_")

textstring   =  [FWS] ALPHADIGITD *(ALPHADIGITD) [FWS]

ALPHADIGITPS =  (FWS / ALPHA / DIGIT / "+" / "/")

base64string =  ALPHADIGITPS *(ALPHADIGITPS) [[FWS] "=" [[FWS] "="]]
]]></artwork></figure>

<t>Note that base64strings are defined in <xref target="RFC4648"></xref>, but that document
does not contain any ABNF. A base64string <bcp14>MUST</bcp14> be padded with zero
bits and trailing = characters provided if needed. This allows
implementations to compare base64string values without decoding
them.</t>

<t>Note that the definition of base64string allows
for the presence of FWS, which simplifies folding header fields
to an allowable line length. FWS within base64strings will be
ignored when their value is being used.</t>

<t>Values that match textstring, such as the names of hash algorithms,
signature algorithms and flags that may be defined in the future, are
case-sensitive.</t>

</section>
</section>
<section anchor="algorithms"><name>Signing and verification cryptographic algorithms</name>

<t>DKIM2 supports multiple hashing and digital signature algorithms.
Two hashing algorithms (SHA256 and SHA512) and three signing algorithms
(RSA-SHA256, Ed25519-SHA256 and ML-DSA-44) are defined in
this specification. Signers <bcp14>MAY</bcp14> implement either or both of the two
hashing algorithms and any or all of the signing algorithms. Verifiers
<bcp14>MUST</bcp14> implement all five algorithms.</t>

<section anchor="the-sha256-and-sha512-hashing-algorithms"><name>The SHA256 and SHA512 hashing algorithms</name>

<t>The SHA256 hashing algorithm may be used to compute body and header
hashes as defined in <xref target="computing-body-hash"/> and
<xref target="computing-header-hash"/>. As an alternative SHA512 may be used.
Both hash functions are specified in <xref target="FIPS-180-4"/>.</t>

<t>The resultant values are identified by the text string "sha256" or
"sha512" as appropriate and are placed into Message-Instance header
fields.</t>

</section>
<section anchor="the-rsa-sha256-signing-algorithm"><name>The RSA-SHA256 signing algorithm</name>

<t>The RSA-SHA256 signing algorithm computes a hash over all the Message-Instance
and DKIM2-Signature header fields as described in <xref target="calculate-signature"/> using
SHA-256 <xref target="FIPS-180-4"/>. That hash is then signed by the Signer using the RSA
algorithm (defined in PKCS#1 version 1.5 <xref target="RFC8017"></xref>) supplied with the Signer's
private key. The hash <bcp14>MUST NOT</bcp14> be truncated or converted into any
form other than the native binary form before being signed.  The
signing algorithm <bcp14>MUST</bcp14> use a public exponent of 65537.</t>

<t>Signers <bcp14>MUST</bcp14> use RSA keys of at least 1024 bits and <bcp14>SHOULD</bcp14> use keys of
at least 2048 bits (as has been the case for DKIM1 since <xref target="RFC8301"></xref>).
Verifiers <bcp14>MUST</bcp14> be able to validate signatures with keys ranging from 1024 bits
to 4096 bits, and they <bcp14>MAY</bcp14> be able to validate signatures with larger keys. They
<bcp14>MUST NOT</bcp14> validate signatures with keys of less then 1024 bits.</t>

<t>The signature value (expressed in base64) is placed (with the identifying
text string "rsa-sha256") into DKIM2-Signature header fields.</t>

</section>
<section anchor="the-ed25519-sha256-signing-algorithm"><name>The Ed25519-SHA256 signing algorithm</name>

<t>The Ed25519-SHA256 signing algorithm computes a hash over all the Message-Instance
and DKIM2-Signature fields as described in <xref target="calculate-signature"/> using
SHA-256 <xref target="FIPS-180-4"/> as the hash-alg. It signs the hash with the PureEdDSA
variant Ed25519, as defined in Section 5.1 of <xref target="RFC8032"></xref>.</t>

<t>The signature value (expressed in base64) is placed (with the identifying
text string "ed25519-sha256") into DKIM2-Signature header fields.</t>

</section>
<section anchor="the-ml-dsa-44-signing-algorithm"><name>The ML-DSA-44 signing algorithm</name>

<t>The ML-DSA-44 algorithm computes a signature over all the
Message-Instance and DKIM2-Signature fields as described in
<xref target="calculate-signature"/>. DKIM2 uses "pure" ML-DSA, ML-DSA.Sign and
ML-DSA.Verify (Algorithms 2 and 3 from <xref target="FIPS-204"/>). DKIM2 does
not use HashML-DSA, the field values are input directly into
the signature algorithm without being hashed first.</t>

<t>The five ASCII octets "DKIM2" (0x44 0x4B 0x49 0x4D 0x32, with no terminator)
are used as the context string (ctx), for both signing and verifying.</t>

<t>The signature value (expressed in base64) is placed (with the
identifying text string "mldsa44") into DKIM2-Signature header fields.
Such a signature is 3228 characters long when encoded, so FWS
will need to be inserted into the base64string to allow header fields
to be folded.</t>

<t>Signers <bcp14>SHOULD</bcp14> use the default hedged (randomized) variant of ML-DSA.Sign.
The deterministic variant <bcp14>SHOULD NOT</bcp14> be used on platforms where
side-channel attacks are a concern and they cannot be otherwise
mitigated. Both variants are verified in the same way.</t>

</section>
<section anchor="other-algorithms"><name>Other algorithms</name>

<t>Other algorithms may be defined in the future.</t>

</section>
<section anchor="selectors"><name>Selectors</name>

<t>To support multiple concurrent public keys per Signing Domain, the
key namespace is subdivided using Selectors.</t>

<t>The number of public keys and corresponding Selectors for each domain
is determined by the domain owner. Many domain owners will use just one
Selector, whereas administratively distributed organizations can choose
to manage disparate Selectors
and key pairs in different regions or on different MTAs.
Selectors can also be used to delegate a signing authority, which
can be withdrawn at any time. Selectors also make it possible to
seamlessly replace keys on a routine basis by signing with a new
Selector, while keeping the key associated with the old Selector
available.</t>

<t>Periods are allowed in Selectors and are component separators. Periods in
Selectors define DNS label boundaries in a manner similar to the
conventional use in domain names.  This will allow portions of
the Selector namespace to be delegated.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
selector = Domain
]]></artwork></figure>

</section>
<section anchor="key_management"><name>Key management</name>

<t>Some level of assurance is required that
a public key is associated with the claimed Signer. DKIM2
does this by fetching the key from the DNS for the Signing Domain
specified in the d= field of the DKIM2-Signature header field.</t>

<t>DKIM2 keys are stored in a subdomain named "_domainkey".  Given a
DKIM2-Signature field with a "d=" tag of "example.com" and a Selector
of "foo.bar", the DNS query will be for "foo.bar._domainkey.example.com".</t>

<t>NOTE: these keys are no different, and are stored in the same locations
as those for DKIM1 (<xref target="RFC6376"></xref>).</t>

<t>Further details can be found in <xref target="DKIMKEYS"></xref>.</t>

</section>
</section>
<section anchor="ignoreheaders"><name>Unsigned header fields</name>

<t>As explained in detail below, DKIM2 will provide a cryptographic
signature for all header fields that are present within a message,
whether they have a standardized meaning or are just placed there
at the whim of a particular sender.</t>

<t>In order to simplify message handling some header fields are not signed
and processing of the message by Signers and Verifiers will be performed
as if they were not present.</t>

<t>The exceptions fall into three classes:</t>

<t><list style="numbers" type="1">
  <t>Trace header fields  <vspace blankLines='1'/>
"Received" or "Return-Path" header fields are ignored. These are
trace header fields as described in <xref target="RFC5321"></xref> and serve only to document
details of the SMTP transmission process.  <vspace blankLines='1'/>
The experimental "Delivered-To:" header field (<xref target="RFC9228"></xref>) is also
ignored.  <vspace blankLines='1'/>
Other specifications designate further header fields as trace
fields. A survey of such specifications, using the methodology of
<xref target="HDRMAINT"></xref>, identifies "DL-Expansion-History",
"Original-Recipient", "SIO-Label-History" and
"X400-Trace", which are also ignored.  <vspace blankLines='1'/>
The same survey records header fields which are added by handling
agents in transit even though no specification designates them as
trace fields: "Apparently-To" and "X400-Received". For DKIM2 it is
that behavior, rather than any formal designation, which matters,
so these are also ignored.  <vspace blankLines='1'/>
Any header field whose field name starts with "Received-", such as
"Received-SPF" (<xref target="RFC7208"></xref>), is ignored. This allows future
specifications to create new trace header fields of this form
without affecting DKIM2 processing.</t>
  <t>Other email authentication mechanisms  <vspace blankLines='1'/>
"DKIM-Signature" header fields and the "ARC-Authentication-Results",
"ARC-Message-Signature" and "ARC-Seal" header fields (<xref target="RFC8617"></xref>)
are ignored.  <vspace blankLines='1'/>
Not including DKIM1 and ARC header fields means that systems that
wish to add other types of signature as well as a DKIM2 signature
are free to do this in any convenient order.</t>
  <t>Header fields with purely local meaning  <vspace blankLines='1'/>
"Authentication-Results" header fields are ignored. These header
fields are defined in <xref target="RFC8601"></xref> where it is made clear that their
contents are only intended for use within the "trust boundary"
of an "Administrative Management Domain". As they can only be used
reliably within that trust boundary there has been no need to
secure them cryptographically and given how they may be added or
removed as messages cross trust boundaries it is inconvenient and
unnecessary for DKIM2 to sign them.  <vspace blankLines='1'/>
Header fields with a header field name starting with "X-" are
ignored. Currently deployed email systems use these fields as
proprietary trace header fields or for other proprietary reasons. They
have no defined meaning for other systems and it considerably
simplifies reporting on changes to header fields to ignore them. Note
that the recommendations in <xref target="RFC6648"></xref> mean that it is most
unlikely that any header field name starting "X-" will be developed
within the IETF.</t>
</list></t>

<section anchor="summary"><name>Summary</name>

<t>These header fields are not signed:</t>

<figure><artwork><![CDATA[
Apparently-To:
ARC-Authentication-Results:
ARC-Message-Signature:
ARC-Seal:
Authentication-Results:
Delivered-To:
DKIM-Signature:
DL-Expansion-History:
Original-Recipient:
Received:
Received-*:
Return-Path:
SIO-Label-History:
X-*:
X400-Received:
X400-Trace:
]]></artwork></figure>

</section>
</section>
<section anchor="JSONrecipe"><name>Recipes</name>

<t>A set of Recipes is used to recreate the previous version of the body
and/or header fields of a message. The Recipes are provided
within a JSON object with the schema:</t>

<figure><artwork><![CDATA[
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://dkim2.org/schemas/recipe-v1",
  "title": "DKIM2 Recipes",
  "description": "See draft-ietf-dkim-dkim2-spec",
  "type": "object",
  "properties": {
    "h": {
      "description": "Recipes to recreate specific header fields",
      "type": "object",
      "minProperties": 1,
      "additionalProperties": { "$ref": "#/$defs/recipe-steps" }
    },
    "b": {
      "description": "Recipes to recreate the body",
      "oneOf": [
        {
          "description": "Body Recipes",
          "$ref": "#/$defs/recipe-steps"
        },
        {
          "description": "Previous body state cannot be recreated",
          "type": "null"
        }
      ]
    }
  },
  "anyOf": [
    { "required": ["h"] },
    { "required": ["b"] }
  ],
  "$defs": {
    "recipe-steps": {
      "type": "array",
      "items": {
        "oneOf": [
          {
            "description": "Copy lines/fields, start to end",
            "type": "object",
            "properties": {
              "c": { "type": "array",
                "items": { "type": "integer", "minimum": 1 },
                "minItems": 2, "maxItems": 2
              }
            },
            "required": ["c"], "additionalProperties": false
          },
          {
            "description": "Data lines/values to emit",
            "type": "object",
            "properties": {
              "d": { "type": "array",
                "items": { "$ref": "#/$defs/utf8-line" },
                "minItems": 1
              }
            },
            "required": ["d"], "additionalProperties": false
          },
          {
            "description": "Non UTF8 lines/values to emit",
            "type": "object",
            "properties": {
              "u": { "type": "array",
                "items": { "$ref": "#/$defs/base64-line" },
                "minItems": 1
              }
            },
            "required": ["u"], "additionalProperties": false
          }
        ]
      }
    },
    "utf8-line": {
      "description": "One line of text, without CR or LF",
      "type": "string",
      "allOf": [
        { "pattern": "^[^\r\n]*$" }
      ]
    },
    "base64-line": {
      "description": "Canonical base64 of one line",
      "type": "string", "contentEncoding": "base64",
      "allOf": [
        { "pattern": "^[A-Za-z0-9+/]*={0,2}$" },
        { "pattern": "^(.{4})*$" },
        { "pattern": "^([^=]*|.*[AQgw]==|.*[AEIMQUYcgkosw048]=)$" }
      ]
    }
  }
}
]]></artwork></figure>

<t>Note that the specification of JSON schemas is maintained by the JSON Schema
organization, and the relevant specification document is linked to by the
$schema field in each JSON schema.</t>

<t>The JSON keys (property names) <bcp14>MUST</bcp14> be in lower case and they <bcp14>MUST</bcp14>
be unique within any JSON object. These rules cannot be expressed
within the JSON schema, so implementations will need to take other
steps to ensure conformance. Particular care needs to be taken to
ensure uniqueness.</t>

<t>Strings in JSON are always composed of UTF-8 characters. Breaking out
the "utf8-line" into a definition allows the schema to apply a pattern
to it. This pattern ensures that the strings do not contain CR or LF characters.</t>

<t>Since it may be necessary for a Recipe to deal with text that is not valid
UTF-8, the "u" step is provided as an alternative to a "d" step. The pattern
provided in the schema ensures that each string is a valid
"base64string" as set out in <xref target="common-ABNF"/> including the restrictions
on padding.</t>

<t>However, there is one difference from "base64string" in that the schema does
not allow FWS to appear within the string. This does not create any practical
issues because the JSON object will be base64 encoded before being
placed into a header field, and that encoded value can have FWS and
hence can be folded in order to conform to header field length limits.</t>

<t>Note that the restrictions on CR and LF characters apply to "u" step
strings (once they are decoded) just as for "d", but this restriction
cannot be expressed within the schema.</t>

<t>It will be noted that the strings in a "u" step will be encoded twice.
To avoid unnecessary extra processing a "u" step <bcp14>SHOULD NOT</bcp14> be used
when a "d" step would suffice.</t>

<section anchor="header-recipes"><name>Header Recipes</name>

<t>A Header Recipe is an array of instructions applied to the specified
header fields with the given header field name. These Recipes
are applied in order to the message which has been received
so as to recreate the message as it was before modifications were made.
Recipes <bcp14>MUST</bcp14> be provided for any relevant header field (see <xref target="ignoreheaders"/>
for header fields that are not relevant) that is changed; i.e. it is
not possible to indicate that the previous state of the header fields
cannot be recreated.</t>

<t>If there is no "h" field in the JSON object then there was no
modification to the header fields.</t>

<t>Header field names in the JSON keys are matched with the message
without regard to case. Recipes <bcp14>MUST NOT</bcp14> be specified for header
fields that will not be signed (see <xref target="ignoreheaders"/>). A header
field name <bcp14>MUST NOT</bcp14> be present more than once.</t>

<t>If a header field name is not present in the JSON object then all
header fields with that header field name are to be retained.</t>

<t>If the Recipe array for a header field name that is present in the
JSON object is empty then all instances of that header field are to
be removed to reinstate the previous state of the message.</t>

<t>Header fields are numbered "bottom up" (the opposite direction to
the body lines). That is to say, when walking the header fields
from the top of the message to the end of the header fields then
the last header field instance
encountered with any particular header field name is numbered 1,
the header field (with the same header field name) above that is
numbered 2, and so on.</t>

<t>The header fields <bcp14>MUST</bcp14> be counted as if they were unfolded
(in the normal <xref target="RFC5322"></xref> manner). That is, all
of the physical lines that form a single header field are
processed under the same logical number.</t>

<t>The Recipes are processed in order and the resulting header
fields are emitted so that later header fields will appear above
earlier header fields in the recreated message.</t>

<t>Each Recipe step is a JSON object with exactly one key:</t>

<t>A "c" step has the form {"c": [start, end]}. The relevant header field
instances numbered from start to end inclusive, are to be emitted.
The start value of each "c" step <bcp14>MUST</bcp14> be in ascending order and
<bcp14>MUST</bcp14> be greater than the end value of all preceding "c" steps
for this header field name. The end value <bcp14>MUST NOT</bcp14> be less than
the start value. If they are equal, just one header field instance
is to be emitted.</t>

<t>A "d" step has the form {"d": ["value1", "value2", ...]}. Each
string in the array is treated as a value to which the
relevant header field name and a colon is prepended and a CRLF
is appended and the resultant string is then emitted. Note that
the way in which hashes are calculated (see <xref target="computing-header-hash"/>)
means that no heed needs to be taken of wrapping
or the case of the header field name. The text strings <bcp14>MUST NOT</bcp14>
contain CR or LF characters. If a string is empty then the
CRLF will immediately follow the header field name and colon.</t>

<t>A "u" step is semantically identical to a "d" step except that
each string value is in base64 and will be decoded before use.
Since the values in a "d" step <bcp14>MUST</bcp14> be valid UTF-8, a "u" step
<bcp14>MUST</bcp14> be used if that is not the case.</t>

<t>It should be noted that a Header Recipe can conform to the JSON
schema and still break the restrictions in this section.</t>

</section>
<section anchor="body-recipes"><name>Body Recipes</name>

<t>A Body Recipe is an array of instructions applied to the message
body which can recreate the message as it was before modifications
were made.</t>

<t>If there is no "b" field in the JSON object then there was no
modification to the message body. Note that the JSON schema
requires either "h" or "b" to be present.</t>

<t>If the "b" field is null (there are no Recipes) then the previous
state of the message body
cannot be recreated. Verifiers of the message may be able to
determine, by seeing which entity makes this declaration, that
this is acceptable to them because, for example, that entity
is providing a contractually arranged service.</t>

<t>Body lines are numbered "top down" (the opposite direction to
the header fields). The first line of the body (immediately after
the blank line that indicates that there are no more header fields)
is numbered 1.</t>

<t>The Recipes are processed in order and the resulting body lines
are emitted so that later lines will appear below earlier lines
in the recreated message.</t>

<t>Each Recipe step is a JSON object with exactly one key:</t>

<t>A "c" step has the form {"c": [start, end]}. The message body lines
from start to end, inclusive, are to be emitted. The start value of
each "c" step <bcp14>MUST</bcp14> be in ascending order and <bcp14>MUST</bcp14> be greater than the
end value of all preceding "c" steps. The end value <bcp14>MUST NOT</bcp14> be less than
the start value. If they are equal, just one message body line
is to be emitted.</t>

<t>A "d" step has the form {"d": ["line1", "line2", ...]}. Each
string in the array has a CRLF
appended and the resultant string is emitted. The text strings <bcp14>MUST NOT</bcp14>
contain CR or LF characters. If a string is empty then just
a CRLF is emitted.</t>

<t>A "u" step is semantically identical to a "d" step except that
each string value is in base64 and will be decoded before use.
Since the values in a "d" step <bcp14>MUST</bcp14> be valid UTF-8, a "u" step
<bcp14>MUST</bcp14> be used if that is not the case.</t>

<t>It should be noted that a Body Recipe can conform to the JSON
schema and still break the restrictions in this section.</t>

</section>
</section>
<section anchor="messagehashes"><name>Message hash values</name>

<t>A set of cryptographic "hashes" is used to record the current
message body and header fields. The hashes are placed into the
h= tag of a Message-Instance header field.</t>

<t>Since Message-Instance header fields are ignored when calculating the
header hash value, the body hash and header hash may be calculated in
any convenient order.</t>

<section anchor="computing-body-hash"><name>Computing the body hash</name>

<t>The body of messages is treated as merely a string of octets. DKIM2
messages can be either in plain-text or in MIME format; no special
treatment is afforded to MIME content. Message attachments in MIME
format <bcp14>MUST</bcp14> be included in the content that is signed.</t>

<t>The DKIM2 body hash is calculated in the same manner as DKIM1's "simple"
scheme:</t>

<t>All empty lines at the end of the message body are ignored. An empty line
is a line of zero length after removal of the line terminator.  If there
is no body or no trailing CRLF on the message body, a CRLF is added. That
is "*CRLF" at the end of the body is converted to "CRLF".</t>

<t>No other changes are made to the body, which is then processed by the
relevant hash algorithm(s). The name of the hash and the hash value
(converted to base64 form) is then inserted into (Signers) or compared
to (Verifiers) the value of the "h=" tag of the Message-Instance header
field that is being created/verified. If multiple hashes are calculated
then multiple entries within the "h=" value will be inserted/compared.</t>

</section>
<section anchor="computing-header-hash"><name>Computing the header fields hash</name>

<t>The header fields hash calculation done by a Signer <bcp14>MUST</bcp14> apply the
following steps in the order given. A Verifier will need to do the
equivalent steps in order to check that the hash they have received
is correct.</t>

<t><list style="symbols">
  <t>Convert all header field names (not the header field values) to
lowercase.  For example, convert "SUBJect: AbC" to "subject: AbC".</t>
  <t>Unfold all header field continuation lines as described in
<xref target="RFC5322"></xref>; in particular, lines with terminators embedded in
continued header field values (that is, CRLF sequences followed by
WSP) <bcp14>MUST</bcp14> be interpreted without the CRLF.  Implementations <bcp14>MUST
NOT</bcp14> remove the CRLF at the end of the header field value.</t>
  <t>Ignore the header fields listed in <xref target="ignoreheaders"/>.  <vspace blankLines='1'/>
When calculating the header field hash any "Message-Instance" or
"DKIM2-Signature" header fields <bcp14>MUST</bcp14> be ignored. These header
fields will be included in the hash value that will be signed
by a DKIM2-Signature header field and it simplifies implementations
if they are not included twice, especially when determining
whether all modifications to a message have been correctly declared.</t>
  <t>Convert all sequences of one or more WSP characters to a single SP
character.  WSP characters here include those before and after a
line folding boundary.</t>
  <t>Delete all WSP characters at the end of each unfolded header field
value.</t>
  <t>Delete any WSP characters remaining before and after the colon
separating the header field name from the header field value.  The
colon separator <bcp14>MUST</bcp14> be retained.</t>
  <t>Place the header fields in ascending order of the octet
values of their (lower-cased) header field names.</t>
  <t>If there is more than one header field with the same header field name
then the header fields are placed in the order in which they
would have been placed into the message header, that is from
the last within the header upward (the same ordering as is used
in the header Recipes (see <xref target="header-recipes"/>)).  <vspace blankLines='1'/>
It is sometimes suggested that some MTAs re-order
header fields after they receive a message. If an MTA does change the
order of header fields with the same header field name (and those
header fields will be included in the hash calculation) then it is their
responsibility to recover the original order
before verifying an existing signature or passing a previously signed
message to another MTA that may wish to do such verification.</t>
  <t>The hash(es) of the concatenated header fields are calculated.</t>
</list></t>

<t>The name of the hash and the hash value
(converted to base64 form) is then inserted into (Signers) or compared
to (Verifiers) the value of the "h=" tag of the Message-Instance header
field that is being created/verified. If multiple hashes are calculated
then multiple entries within the "h=" value will be inserted/compared.</t>

</section>
</section>
<section anchor="relaxed-domain-match"><name>The relaxed domain match algorithm</name>

<t>The relaxed domain match algorithm is used for several purposes
in the DKIM2 protocol. The match algorithm is asymmetric in that
attention needs to be paid to which value is "first" (Parameter1)
and which is "second" (Parameter2).</t>

<t>The aim is to allow a Signing Domain to be able to sign not only for
itself but also for subdomains. As well as simplifying key handling
for organizations that use subdomains, this also allows existing
"bounce-handling" mechanisms that utilize subdomains to continue
to work alongside DKIM2.</t>

<t>The algorithm operates in such a way that there is no need to consider
issues such as the different numbers of labels in so-called
"public suffixes". The organization operating the "suffix" can determine
whether they are part of the DKIM2 ecosystem or not. In practice, few if
any "Top Level Domains" will act as a Signing Domain.</t>

<t>Where the algorithm has to match rt= or mf= values from a DKIM2-Signature
header field the values are base64 encoded. The description of the
algorithm assumes that they have been decoded.</t>

<section anchor="rdm-uses"><name>Uses of the relaxed domain match algorithm</name>

<t>The relaxed domain match algorithm is used for four purposes:</t>

<t><list style="numbers" type="1">
  <t anchor="cc-rdm">To assist in addressing the DKIM Replay problem DKIM2 provides a
Chain of Custody for every message. There are several different cases
in checking the Chain of Custody where a relaxed domain match
is required.  <vspace blankLines='1'/>
The i=1 DKIM2-Signature header field is not checked, nor is any
DKIM2-Signature header field that follows one with an nd= tag. The
remaining DKIM2-Signature header fields can be considered in ascending
numeric order.  <list style="symbols">
      <t>If the mf= value recorded in a DKIM2-Signature header field is not
null then a match is sought between the mf= value and a recipient
address in the next lower numbered DKIM2-Signature header field.      <vspace blankLines='1'/>
The mf= value is Parameter1 for the algorithm,
the rt= value is Parameter2.</t>
      <t>If the mf= value is null (&lt;&gt;) then a match is sought between the
Signing Domain (d=) and a recipient address in the next lower
numbered DKIM2-Signature header field.      <vspace blankLines='1'/>
The rt= value is Parameter1 for the algorithm,
the d= value is Parameter2.</t>
      <t>A DKIM2-Signature header field with an nd= tag has no mf= or
rt= tag. A match is sought between the Signing Domain (d=) and
a recipient address in the next lower numbered DKIM2-Signature
header field.      <vspace blankLines='1'/>
The rt= value is Parameter1 for the algorithm,
the d= value is Parameter2.      <vspace blankLines='1'/>
The next numbered DKIM2-Signature header field will not be checked
with this algorithm. Instead its d= value is required to be exactly
the same as the nd= value (see <xref target="imaginary-hops"/>).</t>
    </list></t>
  <t anchor="mf-rdm">It is necessary to check DKIM2-Signature header fields
for a match between the Signing Domain (specified in the d= tag) and
the MAIL FROM domain (mf=). The highest numbered DKIM2-Signature
header field is checked to establish if the message is Provisionally
Verified. All the DKIM2-Signature header fields are checked to establish
if the message is capable of being a Fully Verified DKIM2 Message.  <vspace blankLines='1'/>
The (decoded) mf= value is Parameter1 for the algorithm, the d= value
is Parameter2.  <vspace blankLines='1'/>
When the mf= value is null (mf=&lt;&gt;) or missing (nd= tag present) the matching
algorithm is not used.</t>
  <t>To check that a From header field is Authentic, the domain from the
addr-spec in the From header field will be matched with the Signing
Domain of the relevant DKIM2-Signature header field (see <xref target="authentic-from"/>).  <vspace blankLines='1'/>
The value from the From header field is Parameter1 for the algorithm,
the d= value is Parameter2.</t>
  <t anchor="dsn-rdm">To ensure that a DSN (see <xref target="bounce"/>) is not forged, the Signing
Domain used to send the DSN needs to match a recipient address of the
message being reported on. That is, a domain from the rt= value of the
highest numbered DKIM2-Signature in the message being reported on will
have to match with the d= value in the i=1 DKIM2-Signature header field
of the DSN. Signers of DSNs use this match when choosing d=; receivers
of DSNs use it to check that the DSN has not been forged.  <vspace blankLines='1'/>
The (decoded) value from rt= is Parameter1 to the algorithm, the d=
value is Parameter2.</t>
</list></t>

</section>
<section anchor="details-of-the-relaxed-domain-match-algorithm"><name>Details of the relaxed domain match algorithm</name>

<t>The relaxed domain match algorithm proceeds as follows:</t>

<t><list style="numbers" type="1">
  <t>If one of the values being compared is an rt= value then the algorithm
is operated for each email address within the (decoded) rt= value in
turn until one matches or all fail to match.</t>
  <t>If one of the values being compared is an email address then only the
domain part of the value is used for the matches. The local
part, any comments, mail parameters (along with the @ and any angle
brackets) are ignored. A domain literal (e.g. <spanx style="verb">&lt;x@[192.0.2.1]&gt;</spanx>)
never matches. <xref target="RFC5321"></xref> and <xref target="RFC5322"></xref> should be consulted for the exact syntax of
email addresses and the complications that can arise through the
use of comments and source routes.</t>
  <t>If there is an exact (caseless) match between Parameter1 and
Parameter2 then the algorithm exits with a successful match result.</t>
  <t>Otherwise, if Parameter1 contains no dot there is no match.</t>
  <t>Otherwise, remove the leftmost label (the characters up to and
including the first dot) from Parameter1 and return to step 3.</t>
</list></t>

</section>
</section>
<section anchor="tagvaluelists"><name>Tag=Value Lists</name>

<t>DKIM2 uses a simple "tag=value" syntax in the Message-Instance and
DKIM2-Signature header fields, as well as in domain signature records
(see <xref target="DKIMKEYS"></xref>).</t>

<t>Values are a series of strings containing either text or a
base64string (see <xref target="common-ABNF"/>). The name of the tag will determine
the encoding and structure of each value.</t>

<t>Formally, the ABNF syntax rules are as follows:</t>

<figure><artwork><![CDATA[
tag-list  =  tag-spec *( ";" tag-spec ) [ ";" ]
tag-spec  =  [FWS] tag-name [FWS] "=" [FWS] tag-value [FWS]
tag-name  =  ALPHA *(ALPHA / DIGIT / "_")
tval      =  1*(%x21-3A / %x3C-7E)
                  ; not SEMICOLON
tag-value =  [ tval *( 1*(WSP / FWS) tval ) ]
                  ; Prohibits WSP and FWS at beginning and end
]]></artwork></figure>

<t>Note that WSP is allowed anywhere around tags.  In particular, any
WSP after the "=" and any WSP before the terminating ";" is not part
of the value; however, WSP inside the value is significant.
Semicolon (";") characters <bcp14>MUST NOT</bcp14> occur in the tag value, since
that separates tag-specs. The semicolon at the end of the tag-list
is optional.</t>

<t>Each tag-spec <bcp14>MUST</bcp14> match one of the ABNF rules provided when a
tag-spec is being used in a specification. However, to allow
specifications to be updated, a tag-spec that is not recognized
is ignored.</t>

<t>A specification that uses a Tag=Value list will make it clear whether
tag-names or tag-values are case-sensitive or not. Absent any statement
to the contrary both items are case-sensitive. The specification
may also prescribe that whitespace within a tag-value is to be ignored.</t>

<t>Tags may appear in any order. Tags with duplicate names <bcp14>MUST NOT</bcp14> occur
within a single tag-list; if a tag name does occur more than once, the
entire tag-list is invalid.</t>

<t>Tags that have an empty value are not the same as omitted tags. An
empty value explicitly designates the empty string as the value. An
omitted tag is treated as having the default value, should one be
defined for that particular tag-spec. Tag=value pairs that represent
the default value <bcp14>MAY</bcp14> be included to aid legibility.</t>

</section>
<section anchor="hfMessageInstance"><name>The Message-Instance header field</name>

<t>A Message-Instance header field documents the current contents of
the message and, in the case of a Reviser, records any relevant
changes that have been made to the incoming message.</t>

<t>The Message-Instance header field is a trace header field (see
Section 3.6.7 of <xref target="RFC5322"></xref>).</t>

<t>The Message-Instance header field is a Tag=Value list (see
<xref target="tagvaluelists"/>). No tags have default values and all tag-names
<bcp14>MUST</bcp14> be in lower case.</t>

<t>The m= and h= tags <bcp14>MUST</bcp14> be present. The r= tag is optional.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
mi-field    = "Message-Instance:" tag-list
]]></artwork></figure>

<section anchor="m-the-revision-number-of-the-message-instance-header-field"><name>m= the revision number of the Message-Instance header field</name>

<t>The Originator of a message uses the value 1. Further Message-Instance
header fields are added with a value one more than the current highest
numbered Message-Instance header field. A message with gaps or duplicates
in the numbering is not a Fully Verified DKIM2 Message.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
mi-m-tag    = %s"m" [FWS] "=" [FWS] 1*DIGIT
]]></artwork></figure>

</section>
<section anchor="r-recipes-to-recreate-the-previous-instance-of-the-message"><name>r= Recipes to recreate the previous instance of the message</name>

<t>The r= tag value is the base64 encoded version of the JSON object that
contains the Recipes that allow the previous instance of the message
to be recreated (see <xref target="JSONrecipe"/>).</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
mi-r-tag    = %s"r" [FWS] "=" base64string
]]></artwork></figure>

</section>
<section anchor="h-the-hash-values-for-the-message"><name>h= the hash values for the message</name>

<t>The h= tag value records one or more sets of hashes each made up of
the cryptographic algorithm name, a header hash value and a body
hash value. The hash values are base64strings. Calculating the hash
values is explained in <xref target="messagehashes"/> and the algorithms are described
in <xref target="algorithms"/>.</t>

<t>To provide for algorithmic agility more than one pair of hash values,
using a different algorithm <bcp14>MAY</bcp14> be supplied in the same Message-Instance
header field. An algorithm <bcp14>MUST NOT</bcp14> be present more than once
in a single Message-Instance header field; if the hash values were the
same this would be pointless and if they differ then the Signer is
presumably attempting to confuse a Verifier.</t>

<t>Hash-sets separated by "," form a group which passes if all the
hash-sets in the group pass. Groups are separated by "|" and the
overall result is a pass if any group is a pass. A "," binds more
tightly than "|" (so a,b|c is a pass if both a and b pass or c does).</t>

<t>If a Verifier has not implemented an algorithm then the hash result
is not a pass. Signers using a new hash algorithm can
use the "|" syntax to provide alternatives that the Verifier is
more likely to understand. Signers who prefer "hybrid"
cryptographic algorithms can use the "," to indicate that both
the algorithms they provide are required to pass.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
mi-h-tag    = %s"h" [FWS] "=" [FWS] hash-any
hash-any    = hash-all *( [FWS] "|" [FWS] hash-all )
                               ; pass if any hash-all passes
hash-all    = hash-set *( [FWS] "," [FWS] hash-set )
                               ; pass if all hash-sets pass
hash-set    = hash-name [FWS] ":" header-hash ":" body-hash
hash-name   = %s"sha256" / %s"sha512" / x-hash-name
header-hash = base64string
body-hash   = base64string
x-hash-name = textstring ; for later expansion
]]></artwork></figure>

</section>
</section>
<section anchor="hfDKIM2signature"><name>The DKIM2-Signature header field</name>

<t>The signature information for the message along with information
linking the signed message to its delivery over SMTP is stored in
a DKIM2-Signature header field.</t>

<t>The DKIM2-Signature header field is a trace header field (see
Section 3.6.7 of <xref target="RFC5322"></xref>).</t>

<t>This header field is a Tag=Value list (see
<xref target="tagvaluelists"/>). No tags have default values and all tag-names
<bcp14>MUST</bcp14> be in lower case.</t>

<t>The i=, m=, t=, d= and s= tags <bcp14>MUST</bcp14> be present. There <bcp14>MUST</bcp14> be
either an nd= tag or both mf= and rt= tags. The other tags are optional.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-field    = "DKIM2-Signature:" tag-list
]]></artwork></figure>

<t>It will be noted that we have not included a version number.  Experience
from IMF onward shows that it is essentially impossible to change
version numbers. If it becomes necessary to change DKIM2 in the sort
of incompatible way that a v=2 / v=3 version number would support,
it is expected that header fields will be labeled as DKIM3 instead.</t>

<section anchor="i-the-sequence-number-of-the-dkim2-signature-header-field"><name>i= the sequence number of the DKIM2-Signature header field</name>

<t>The Originator of a message uses the value 1. Further DKIM2-Signature
header fields are added with a value one more than the current highest
numbered DKIM2-Signature header field. A message with gaps
or duplicates in the numbering is not a Fully Verified DKIM2 Message.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-i-tag = %s"i" [FWS] "=" [FWS] 1*DIGIT
]]></artwork></figure>

</section>
<section anchor="m-the-highest-numbered-message-instance-header-field"><name>m= the highest numbered Message-Instance header field</name>

<t>This value allows Verifiers to determine which entity made a particular
revision to the message header fields or body. The value specifies the
highest numbered Message-Instance header field in the message at the
point at which this DKIM2-Signature header field was added.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-m-tag = %s"m" [FWS] "=" [FWS] 1*DIGIT
]]></artwork></figure>

</section>
<section anchor="n-nonce-value"><name>n= nonce value</name>

<t>This text value, if present, is for the creator of the DKIM2-Signature
header field to use for any purpose they wish. For example, it can be
used as an index into a database to assist in handling Delivery Status
Notifications received after delivery failures.</t>

<t>To discourage use of this tag field as an alternative to the use of more
appropriate header fields, the length of the string is restricted
to 64 characters.</t>

<t>Note the value <bcp14>MUST</bcp14> be simple ASCII and <bcp14>MUST NOT</bcp14> contain semicolon.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-n-tag   = %s"n" [FWS] "=" [FWS] nonce-value
nonce-value = *64(%x21-3A / %x3C-7E)
                  ; printable ASCII except semicolon, max 64 chars
]]></artwork></figure>

</section>
<section anchor="t-signature-timestamp"><name>t= signature timestamp</name>

<t>The time that this header field was created. The format is the number of
seconds since 00:00:00 on January 1, 1970 in the UTC time zone.  The value
is expressed as an unsigned integer in decimal ASCII.  This value
is not constrained to fit into a 31- or 32-bit integer.</t>

<t>It is expected that values up to at least 10^12 will occur (this fits
into 40 bits and will cover messages sent until approximately 33,700 AD).</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-t-tag    = %s"t" [FWS] "=" [FWS] 1*DIGIT
]]></artwork></figure>

</section>
<section anchor="mf-the-mail-from-used-when-the-message-was-sent"><name>mf= the MAIL FROM used when the message was sent</name>

<t>DKIM2 records the <xref target="RFC5321"></xref> MAIL FROM value that was used when the message
was transmitted over an SMTP link from the signing MTA. Note that MAIL FROM
may be just "&lt;&gt;", for example for a Delivery Status Notification.</t>

<t>The value is recorded as the base64 encoding of the <xref target="RFC5321"></xref> reverse-path
because of the complex syntax of reverse-path values (which can include
characters which would confuse naive parsers of DKIM2-Signature header
fields). The angle brackets <bcp14>MUST</bcp14> be included, but any "Mail-parameters"
that were present after the reverse-path <bcp14>MUST NOT</bcp14> be included.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-mf-tag  = %s"mf" [FWS] "=" base64string
]]></artwork></figure>

</section>
<section anchor="rt-the-rcpt-to-values-used-when-the-message-was-sent"><name>rt= the RCPT TO value(s) used when the message was sent</name>

<t>DKIM2 records the <xref target="RFC5321"></xref> RCPT TO value(s) that were used when the message
was transmitted over an SMTP link from the signing MTA.</t>

<t>The value is recorded as the base64 encoding of the <xref target="RFC5321"></xref> Forward-path
because of the complex syntax of Forward-path values (which can include
characters which would confuse naive parsers of DKIM2-Signature header
fields). The angle brackets <bcp14>MUST</bcp14> be included, but any "Rcpt-parameters"
that were present after the Forward-path <bcp14>MUST NOT</bcp14> be included.</t>

<t>When a message is intended for more than one recipient then the rt= tag
<bcp14>MAY</bcp14> include all of the recipients so that a single copy of the message
can be sent to all of the recipients in one SMTP transaction.
Alternatively, multiple copies of the message <bcp14>MAY</bcp14> be generated, each
recording only the RCPT TO values used for that copy.</t>

<t>However, a blind carbon copy (bcc) email address <bcp14>MUST NOT</bcp14> appear in
the rt= tag of any copy of the message delivered to a recipient
that is not a bcc recipient (see <xref target="RFC5322"></xref> Section 3.6.3).</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-rt-tag = %s"rt" [FWS] "=" base64string *("," base64string)
]]></artwork></figure>

</section>
<section anchor="nd-the-domain-that-will-appear-in-the-next-dkim2-signature-header-field"><name>nd= the domain that will appear in the next DKIM2-Signature header field</name>

<t>This tag is used in order to provide a valid Chain of Custody when a
message is being forwarded from a different domain than the one to
which it arrived. The domain <bcp14>MUST</bcp14> be a valid DNS name under which a
DKIM2 key record is published.</t>

<t>The domain name in the nd= tag <bcp14>MUST</bcp14> exactly match the domain name of the
d= tag of the next DKIM2-Signature in sequence (i=) order.</t>

<t>Note that when an nd= tag is present both mf= and rt= <bcp14>MUST</bcp14> be omitted.
It is permissible to have a sequence of more than one
DKIM2-Signature header fields with an nd= tag, but this sequence
(in unbroken ascending numeric order of i= tags) <bcp14>MUST</bcp14> end with a
DKIM2-Signature that contains mf= and rt= tags.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-nd-tag   = %s"nd" [FWS] "=" [FWS] Domain
]]></artwork></figure>

</section>
<section anchor="d-the-signing-domain-associated-with-this-signature"><name>d= the Signing Domain associated with this signature</name>

<t>This domain is used to form the query for the public key. The domain
<bcp14>MUST</bcp14> be a valid DNS name under which the DKIM2 key record is published.</t>

<t>The domain name in the d= tag <bcp14>MUST</bcp14> exactly match the rightmost labels of
the domain name of the mf= tag. That is to say, the domain name of the
mf= tag <bcp14>MUST</bcp14> either match the d= domain exactly or be a subdomain
of the d= domain name.</t>

<t>When the mf= domain is empty (it decodes to "&lt;&gt;"), as will be the case
for Delivery Status Notifications (DSNs), then no match is required.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-d-tag   = %s"d" [FWS] "=" [FWS] Domain
]]></artwork></figure>

</section>
<section anchor="s-the-signature-values-for-the-message"><name>s= the signature value(s) for the message</name>

<t>The s= tag value records one or more signatures each made up of a
Selector, the cryptographic algorithm name and the signature value
in base64. Calculating the signature value is explained in
<xref target="calculate-signature"/> and the algorithms are described
in <xref target="algorithms"/>.</t>

<t>The Selector values subdivide the namespace for the domain being
used for signing. Note that the DNS lookup for the public key
will check that the k= algorithm value is a match for the
algorithm supplied in the tag.</t>

<t>A Selector <bcp14>MUST NOT</bcp14> be present more than once in a single DKIM2-Signature
header field; if the signature values differed then the Signer is
presumably attempting to confuse a Verifier.</t>

<t>To provide for algorithmic agility more than one signature,
using different algorithms, <bcp14>MAY</bcp14> be supplied. More than one signature
using the same algorithm (perhaps with a different key length) <bcp14>MAY</bcp14> be
present provided that a different Selector is used for each.</t>

<t>Signatures separated by "," form a group and a group of signatures
passes if all of the signatures in that group pass. Groups of
signatures are separated by "|" and the overall result is a pass
if any group is a pass. A "," binds more tightly than "|" (so a,b|c
is a pass if both a and b pass or c does).</t>

<t>If a Verifier has not implemented an algorithm then the signature
result is not a pass. Signers using a new signature algorithm can
use the "|" syntax to provide alternatives that the Verifier is
more likely to understand. Signers who prefer "hybrid"
cryptographic algorithms can use the "," to indicate that both
the algorithms they provide are required to pass.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-s-tag   = %s"s" [FWS] "=" [FWS] sig-any
sig-any     = sig-all *( [FWS] "|" [FWS] sig-all )
                             ; pass if any sig-all passes
sig-all     = sig-set *( [FWS] "," [FWS] sig-set )
                             ; pass if all sig-sets pass
sig-set     = selector [FWS] ":" [FWS] sig-name [FWS] ":" message-sig
sig-name    = %s"rsa-sha256" / %s"ed25519-sha256" / %s"mldsa44" /
              x-sig-name
x-sig-name  = textstring     ; for later extension
message-sig = base64string
]]></artwork></figure>

</section>
<section anchor="f-flags"><name>f= flags</name>

<t>Flags serve two purposes; they either report what has been done to
the message by the system creating the DKIM2-Signature or they make
a request to systems that handle the mail thereafter. Flags are
separated by commas, and optional white-space allows systems to
add several flags without creating long lines.</t>

<t>If a flag value is not recognized it has no effect.</t>

<t>The flag values that report things are:</t>

<t>"exploded": this message is being sent to more than one email address.
This flag is of importance when detecting DKIM Replay attacks
(see <xref target="DKIM-Replay"/>).</t>

<t>The flag values that make requests are:</t>

<t>"feedback": this Signer requests feedback about how this message is handled
during delivery and thereafter. This document does not describe what such
feedback might be or where it might be delivered. If this flag is absent
then feedback is explicitly not required.</t>

<t>"feedhere": this Signer requests that any feedback about how this message is
handled during delivery and thereafter is relayed via this hop. This flag
will be set by privacy-conscious Forwarders when a message has a "feedback"
flag set and the Forwarder does not wish the identity of systems to which
the message is forwarded to be revealed to the requestor of feedback.</t>

<t>ABNF:</t>

<figure><artwork><![CDATA[
sig-f-tag        = %s"f" [FWS] "=" [FWS] sig-f-tag-data
                   *( [FWS] "," [FWS] sig-f-tag-data)
sig-f-tag-data   = %s"feedback" / %s"feedhere" / %s"exploded" /
                   x-sig-f-tag-data
x-sig-f-tag-data = textstring ; for later extension
]]></artwork></figure>

</section>
</section>
<section anchor="authentic-from"><name>From header fields are required to be Authentic</name>

<t>Email addresses that appear in From header fields (<xref target="RFC5322"></xref>) will be
displayed by MUAs to users. It needs to be clear that the use of that
email address was authorized -- this specification expresses this as
a requirement that the From header field is "Authentic".</t>

<t>A From header field is Authentic when there is a relaxed domain match
(see <xref target="relaxed-domain-match"/>) between the email address in the
From header field and the Signing Domain found in the d= tag
of the relevant DKIM2-Signature header field. The Authentic
property is demonstrated by the ability to use the domain to sign.</t>

<t>When the From header field has not been altered since the message
was signed for the very first time, i.e. when the i=1
DKIM2-Signature field was created, then that From and that
DKIM2-Signature are the relevant header fields for the comparison.</t>

<t>If another system replaces the From header field, which will be
apparent by inspecting the header Recipes (see <xref target="header-recipes"/>),
then the lowest numbered (i=) DKIM2-Signature header field whose
m= value is greater than or equal to the m= value of the
Message-Instance header field with the Recipe will,
along with the new From header field, be the relevant header
fields for comparison.</t>

<t>A From header field with more than one email address, or one that
uses domain-literals (IP addresses instead of domains), can
never be Authentic. If a message has such a From header field
it will not be possible for a Verifier to conclude that it is
a Fully Verified DKIM2 Message.</t>

</section>
<section anchor="signer-actions"><name>Signer actions</name>

<t>This section gives the actions that need to be undertaken by the Signer
of a message. They may be done in any appropriate order.</t>

<t>If a message is not the initial form of a message (that is, it
already contains DKIM2-Signature or Message-Instance header
fields) then a Signer <bcp14>MUST NOT</bcp14> sign the message unless it is
a Fully Verified DKIM2 Message (see <xref target="verification"/>), or
there is an out-of-band arrangement covering the situation
(see <xref target="imaginary-hops"/>).</t>

<section anchor="add-any-necessary-message-instance-header-fields"><name>Add any necessary Message-Instance header fields</name>

<t>If a system is generating the initial form of a message or if
it is a Reviser that has made changes to the message body and/or
header fields then it <bcp14>MUST</bcp14> compute the body hash as described in
<xref target="computing-body-hash"/> and the hash of the header fields
as described in <xref target="computing-header-hash"/>.</t>

<t>If the message does not contain a Message-Instance header field then one
<bcp14>MUST</bcp14> be added. If hashing the message body or relevant header fields does not
give the same hash values as those recorded in the highest version
(m=) Message-Instance header field then a new Message-Instance
header field <bcp14>MUST</bcp14> be added.</t>

<t>Such a Message-Instance header field <bcp14>MUST</bcp14> contain Recipes to allow
recreation of the message corresponding to the hash values in the
previously highest numbered Message-Instance header field.
Alternatively, it could contain a
null Recipe to indicate that recreating the previous version
of the message body will not be possible. Null Recipes cannot
be used in respect of header field changes.</t>

<t>Using a null Recipe will impact the extent to which a message
can be verified (see <xref target="verification"/>).</t>

<t>A system may add more than one Message-Instance header field if it
wishes to do so, but the DKIM2 design allows all modifications made by
any single system to be documented
in a single Message-Instance header field.</t>

<t>Note that the first (m=1) Message-Instance header field <bcp14>MAY</bcp14>
contain Recipes if it is wished to record any changes made to a
message as it enters the DKIM2 ecosystem.</t>

<t>Adding a Message-Instance field with no Recipes (and thus
the same hash values as the previously highest numbered
Message-Instance field) is not forbidden; however, it is most
likely to be pointless and a waste of time and energy for all concerned.</t>

</section>
<section anchor="chain-of-custody"><name>Provide a Chain of Custody for the message</name>

<t>The DKIM2-Signature header field contains the MAIL FROM
and RCPT TO values that will be used when the message is transmitted,
so these <xref target="RFC5321"></xref> "envelope" values <bcp14>MUST</bcp14> be available to (or
deducible by) a Signer.</t>

<t>The receiver of a message will check for an exact match (including
the local parts of the email addresses) between the MAIL FROM / RCPT TO
<xref target="RFC5321"></xref> protocol values and the mf= and rt= values in the highest numbered
(most recent) DKIM2-Signature header field. The matching will be case
sensitive for the local part (before the @) and case insensitive for
the domain (after the @). A Signer <bcp14>MUST</bcp14> ensure that this Chain of Custody
check will succeed.</t>

<t>It is acceptable for there to
be more RCPT TO email addresses recorded in rt= than are actually used in
the SMTP conversation, but any RCPT TO value which is used <bcp14>MUST</bcp14> be present
in the rt= tag.</t>

<t>Verifiers will check for a relaxed domain match (see <xref target="relaxed-domain-match"/>)
between the Signing Domain (d=) and the domain in the MAIL FROM value.</t>

<t>When the message being signed already has a DKIM2-Signature header field
(i.e. it has already been transmitted at least once) then the Signer <bcp14>MUST</bcp14>
ensure that the message has a valid Chain of Custody, as set out in
<xref target="rdm-uses"/> Item <xref format="counter" target="cc-rdm"></xref>. This Chain of Custody
contributes to the way in which DKIM2 tackles DKIM Replay attacks.</t>

<t>It may be that an MTA does not change anything in the message which would require
a new Message-Instance header field and, additionally, it could forward it in
such a manner that a Verifier would be able to verify the existing message
(that is to say the MAIL FROM and RCPT TO will have appropriate values). In
such a case, the MTA could choose not to add a DKIM2-Signature header field.
To put this another way, an essentially transparent SMTP forwarding system
need not be made "DKIM2 aware".</t>

</section>
<section anchor="imaginary-hops"><name>Chain of Custody for imaginary hops</name>

<t>If a message is being forwarded then the MAIL FROM on the outgoing
message (and the mf= tag which records this value) <bcp14>MUST</bcp14> be set in
such a way that the Chain of Custody is not broken. However, it may
be that the domains used for the delivery of the incoming message
and the domains used for sending the message onward are not the same.</t>

<t>For example, the incoming message might have been addressed to
example.com, but the outgoing message will be sent from example.net.</t>

<t>One way of ensuring that the Chain of Custody remains valid
would be to generate an extra DKIM2-Signature
header field that causes values to match, i.e. a record is fabricated
that documents the mail being passed from one domain to another with
appropriate "mf=" and "rt=" tag values which document the imaginary
transfer of the message from one domain to the next.</t>

<t>Alternatively the "nd=" tag may be used. When present the next higher
sequence numbered DKIM2-Signature header field <bcp14>MUST</bcp14> be signed by the
specified domain. However, since there are no mf= or rt= tag values
there is no need to provide imaginary values for the imaginary "hop"
between the domain used for receiving the message and the domain used to
forward it.</t>

<t>It will be noted that the creation of an extra DKIM2-Signature header field
(whether the nd= scheme is used or not) will require the Signer to have
access to a private key for the domain in the RCPT TO entry of the
message as it arrived, or for a parent of that domain.</t>

<t>Access to this private key is
often achieved by the Signer creating the private key and never sharing it.
One of two approaches is then taken to publishing the public key.
The first is to provide the public key (and Selector value) to the domain owner
who creates an appropriate DNS entry. The alternative is for the Signer
to create a public
key DNS entry within a part of the DNS that they control and the domain owner
publishes a CNAME pointing at this.</t>

<t>The general expectation is that signatures with an nd= tag have been
applied by the same system as the next DKIM2-Signature field
without an nd= tag. However, as a special case (where arrangements
have been put in place to cover the situation) a message with an
nd= tag in the highest numbered DKIM2-Signature header field may
be sent over an SMTP connection. The receiving system will not be able
to validate the MAIL FROM and RCPT TO values, so the message will not
be a Fully Verified DKIM2 Message; whether it is acceptable will depend
on out-of-band arrangements. The system <bcp14>MUST</bcp14> then provide a DKIM2-Signature
header field with a d= tag that exactly matches the nd= tag. Adding
such a header field will signal that the break in the Chain of Custody
is intentional.</t>

</section>
<section anchor="ensure-that-from-header-fields-are-authentic"><name>Ensure that From header fields are Authentic</name>

<t>The Signing Domain to be used has to be consistent with the
requirements already outlined for creating a valid Chain of Custody.</t>

<t>Furthermore, if the original message is being signed, or the From
header field has been modified, the Signing Domain <bcp14>MUST</bcp14> be chosen so
that the From header field in the message will be Authentic
(see <xref target="authentic-from"/>).</t>

<t>If no Signing Domain can make the From header field Authentic, the
message cannot ever be a Fully Verified DKIM2 Message.</t>

<t>In simple terms, the Signing Domain will be equal to, or a parent
of, both the MAIL FROM domain and the From header field domain
for the original message and whenever the From header field is
modified by an intermediary. A Signer without access to a private
key for the From header field domain (or a parent of it) cannot
make the From header field Authentic, and nor can any Signer when
the From header field has more than one address or a domain-literal.</t>

</section>
<section anchor="determine-if-an-exploded-flag-is-required"><name>Determine if an "exploded" flag is required</name>

<t>An intermediary that receives a message and then sends copies of the
message to more than one email address is said to have "exploded" it.
In such a case the exploded flag <bcp14>MUST</bcp14> be set in the DKIM2-Signature header
field that is being created to sign the outgoing messages. The flag
<bcp14>MUST</bcp14> be set even if the outgoing messages differ.</t>

<t>The flag <bcp14>MUST NOT</bcp14> be set on the very first DKIM2-Signature header
field (i=1).</t>

<t>The purpose of the flag is to give receivers information that
could assist in the detection of DKIM Replay attacks (see <xref target="DKIM-Replay"/>).</t>

</section>
<section anchor="record-an-accurate-timestamp"><name>Record an accurate timestamp</name>

<t>Verifiers check the timestamps in DKIM2-Signature header fields and
if the message is "too old" or "from the future" will classify the
message as not being a Fully Verified DKIM2 Message. These checks
are made to allow systems to safely discard cached information
that they may be using to handle DSNs or to detect DKIM Replay.</t>

<t>Hence, a Signer <bcp14>MUST</bcp14> provide an accurate timestamp (t=) value, albeit
Verifiers only check it against the limits set out in <xref target="check-timestamps"/>.</t>

</section>
<section anchor="signer_privatekey"><name>Determine which Selector value(s) to use</name>

<t>The Signer has to record Selector value(s) in the DKIM2-Signature
header field. Those Selector values allow a Verifier to fetch
public key values. The Signer will need to have access to the
corresponding private key to calculate the signature(s). How
this is achieved is not a matter for this specification.</t>

</section>
<section anchor="calculate-signature"><name>Calculate a signature value</name>

<t>A Signer calculates a signature solely over the Message-Instance and
DKIM2-Signature header fields of the message. The hashes of
the body and other header fields are covered by the hashes in
the highest version (m=) Message-Instance header field and hence
the signature will in practice be signing the message as a whole.</t>

<t>Most cryptographic schemes proceed by first calculating a hash value
and then signing the hash value, but the DKIM2-Signature header field
only provides the final signature value. This means that there
is no difficulty if the hash value is inordinately long, or is
not emitted by the cryptographic routine being used.</t>

<t>The Signer <bcp14>MUST</bcp14> apply the following steps
in the order given (which are not quite the same as the steps
undertaken in calculating header hashes).</t>

<t><list style="symbols">
  <t>Convert all relevant header field names (not the header field values) to
lowercase.  For example, convert "DKIM2-signature" to "dkim2-signature".</t>
  <t>Unfold all header field continuation lines as described in
<xref target="RFC5322"></xref>; in particular, lines with terminators embedded in
continued header field values (that is, CRLF sequences followed by
WSP) <bcp14>MUST</bcp14> be interpreted without the CRLF.  Implementations <bcp14>MUST
NOT</bcp14> remove the CRLF at the end of the header field value.</t>
  <t>Delete all WSP characters. This means all WSP characters before and
after the colon separating the header field name from the header
field value, all WSP characters within the unfolded header field
value and all trailing WSP characters before the CRLF. The colon
separator and the CRLF <bcp14>MUST</bcp14> be retained.</t>
  <t>Place the header fields in order. First come the Message-Instance
header fields in ascending instance (m=) order. Second are the
DKIM2-Signature header fields in ascending sequence (i=) order.
Last of all is an incomplete DKIM2-Signature header field (the
one that this system is creating) with all tags present except
that the signature value(s) within the (s=) value are set to
the null string (""). The selector values, the algorithm name
and the : , | punctuation remain. The incomplete header field
<bcp14>MUST</bcp14> be unfolded, <bcp14>MUST</bcp14> have a trailing CRLF and <bcp14>MUST</bcp14> have WSP
removed in just the same way as the complete header fields
being processed.</t>
  <t>The concatenated header fields are then fed to the signature
algorithm(s). Once all the values are available the null
signature value strings
are replaced by the base64 values of the signatures.</t>
</list></t>

</section>
</section>
<section anchor="verification"><name>Verification</name>

<t>A Verifier determines whether or not a message is a Fully
Verified DKIM2 Message. That is whether or not the message meets all the
requirements set out in this specification on Signers, particularly
those for generating DKIM2-Signature and Message-Instance header
fields.</t>

<t>Further, when a Fully Verified DKIM2 Message is transmitted
over SMTP, the MAIL FROM and RCPT TO values need to be consistent
with values in the highest numbered DKIM2-Signature header field.</t>

<t>However, it is not only the highest numbered header fields that
need to give a PASS. The hashes in each Message-Instance header
field are compared with the message recreated by applying, in
descending order, the Recipes in every Message-Instance header
field numbered higher than it. The signatures in each
DKIM2-Signature header field are checked over the
Message-Instance header fields numbered up to and including its
m= value and the DKIM2-Signature header fields numbered below its
i= value. The message is a Fully Verified DKIM2 Message only when
all of these give a PASS.</t>

<t>The body hashes in Message-Instance header fields numbered below
one with a null Recipe cannot be checked, so such a message is
not a Fully Verified DKIM2 Message. Whether it is nevertheless
acceptable (for example, because there is a contractual
relationship in place) is a matter for local policy.</t>

<t>The specific checks that a Verifier makes and a sensible order in
which to make them are discussed in <xref target="verifier_actions"/>.
This section considers how a Verifier fits into the DKIM2 ecosystem.</t>

<section anchor="messages-that-are-not-fully-verified-dkim2-messages"><name>Messages that are not Fully Verified DKIM2 Messages</name>

<t>It is entirely a matter for local policy whether a message being
a Fully Verified DKIM2 Message makes any difference to whether
or not a message is accepted for delivery.</t>

<t>However, if the message contains DKIM2-Signature or
Message-Instance header fields but it is not a Fully Verified
DKIM2 Message then it <bcp14>MUST NOT</bcp14> be sent to another system (without
some local arrangement being in place). The reason for this is that
the receiving system will be able to determine that
the message is not a Fully Verified DKIM2 Message and that this
would have been entirely apparent at the previous hop.</t>

<t>To put it another way, it is not possible for an intermediary
to "patch up" a message that is not a Fully Verified DKIM2 Message
to make it into one, so an attempt
to forward the message, without prior arrangement, could well
fail and adverse conclusions could be drawn from that failure.</t>

<t>Of course, discarding all the DKIM2 header fields and starting
again (at i=1 m=1) will mean that whatever the previous
history of the message might be, there will be a new
Chain of Custody starting at this point. Naturally, attention
will need to be paid to the provision that From header fields
are required to be Authentic (see <xref target="authentic-from"/>).</t>

</section>
<section anchor="provisionally-verified-messages"><name>Provisionally Verified messages</name>

<t>In order to allow receivers of messages to operate efficiently,
they <bcp14>MAY</bcp14> make an initial assessment of the likelihood that the
message is a Fully Verified DKIM2 Message and accept delivery.</t>

<t>This assessment is made by examining only the highest numbered
DKIM2-Signature header field and the highest numbered
Message-Instance header field and is straightforward to
achieve. If the checks, set out below, all pass then the
message is said to be Provisionally Verified.</t>

<t>If the receiver then determines, upon closer inspection, that the
message is not a Fully Verified DKIM2 Message after all, or they
have some other reason for not wishing to accept the message --
perhaps based on analysis of its contents -- then they <bcp14>MAY</bcp14>
generate a Delivery Status Notification (DSN) and send that
back to the MAIL FROM address used for the delivery.
The details of this procedure appear in <xref target="bounce"/>.</t>

<t>The checks are intended to be made while the SMTP connection is
still open and the message can be rejected and not delivered.</t>

<t>A DSN for a message that has been Provisionally Verified will go
to a system that took part in the delivery, so it cannot become
"backscatter". For a message that has not been Provisionally
Verified there is no such assurance: a DSN generated after the
message has been accepted may go to a third party whose address
was forged, and that can be problematic.</t>

<t>Hence, the best strategy for a message that is not wanted or is
clearly invalidly signed is to reject it (with a 5xx error
code) while the relevant SMTP conversation is still ongoing.
It will then be for the sending system to determine what happens
thereafter.</t>

<t>A Verifier needs to perform the following checks to determine
that a message is Provisionally Verified:</t>

<t><list style="numbers" type="1">
  <t>The m= value in the highest numbered DKIM2-Signature
header field is identical to the m= value of the highest
numbered Message-Instance header field.</t>
  <t>The signatures (s=) in the highest numbered (i=) DKIM2-Signature
header field give a PASS (see <xref target="sigcheck"/>).</t>
  <t>The hashes (h=) in the highest numbered (m=) Message-Instance
header field give a PASS (see <xref target="hashcheck"/>).</t>
  <t>The MAIL FROM and RCPT TO values are consistent
with the mf= and rt= values in the highest numbered
DKIM2-Signature header field.</t>
  <t>Unless the (decoded) mf= value in the highest numbered
DKIM2-Signature header field is null (&lt;&gt;), there is a relaxed
domain match between the d= value and the mf= value
(see <xref target="rdm-uses"/> Item <xref format="counter" target="mf-rdm"></xref>).</t>
</list></t>

<t>If a Verifier gives a TEMPERROR result (it is not possible with
the information to hand to determine whether or not the message
is a Fully Verified DKIM2 Message, see <xref target="output-states"/>) a 4xx
error code <bcp14>SHOULD</bcp14> be used in the SMTP conversation to allow
the sending MTA to understand the situation. If the message passed
Provisional Verification then further attempts to obtain the
missing information could be made before deciding to send
the DSN. If multiple attempts to obtain the information have
all failed the TEMPERROR might usefully be upgraded to a
PERMERROR before being recorded in any DSN that is sent.</t>

<t>The mechanism set out in <xref target="imaginary-hops"/> envisages out-of-band
arrangements to allow the sending of messages with the highest
numbered DKIM2-Signature header field containing an nd= tag. If no
such arrangements are in place then the message is not Provisionally
Verified. If the arrangements are in
place and later analysis shows that the message cannot be
converted into a Fully Verified DKIM2 Message then further
out-of-band arrangements will be needed to deal with reporting
this (using a Delivery Status Notification message or otherwise)
because the provisions in this specification will not be adequate.</t>

</section>
<section anchor="smtp-return-codes"><name>SMTP return codes</name>

<t>Any 4xx or 5xx return code is sufficient to signal
that a message cannot currently be delivered and whether or
not a retry could succeed.</t>

<t>However, if an MTA wishes to specifically signal that it
is rejecting a message where signatures are missing
or do not verify, a 550/5.7.x reply code <bcp14>SHOULD</bcp14> be used.</t>

<t>If an MTA wishes to explicitly signal that it has not been
possible to fetch a public key because of an apparently
temporary DNS issue then a 451/4.7.5 reply code <bcp14>SHOULD</bcp14> be used.</t>

<t>Enhanced status codes are defined in <xref target="RFC3463"></xref>, including
X.7.5 (cryptographic failure). <xref target="RFC7372"></xref> adds codes for email
authentication failures, such as 5.7.20 (no passing DKIM
signature found).</t>

</section>
<section anchor="further-observations-on-verification"><name>Further observations on verification</name>

<t>If the message has been modified since its original creation then
the Message-Instance header fields will usually enable a Verifier to
"undo" those modifications and reconstruct each preceding version
of the message.</t>

<t>In particular, a receiving system may wish to assess the original form
of the message. All Recipes recorded in Message-Instance header
fields could be undone in order (provided
no null Recipe is present) and an assessment then made of whether the
original message was a Fully Verified DKIM2 Message and in particular
whether the From header field is Authentic.</t>

<t>This assessment of the initial form of the message can be done
without considering any other signatures and hash values
except those on the i=1 and m=1 header fields and the simplicity
of this check may be useful to some receivers.</t>

<t>However, determining that the original message was a Fully Verified
DKIM2 Message is only
one part of determining whether the message being delivered is a
Fully Verified DKIM2 Message; other checks will need to be made (see
<xref target="verification"/> and <xref target="verifier_actions"/>).</t>

</section>
</section>
<section anchor="verifier_actions"><name>Verifier actions</name>

<t>This section discusses the detail of the actions taken by a
Verifier to determine whether or not a message is a Fully Verified
DKIM2 Message.</t>

<section anchor="output-states"><name>Output states</name>

<t>For compatibility with the Authentication-Results header field defined
in <xref target="RFC8601"></xref> a verification will result in one of four states.</t>

<t>The states report whether or not the message has traveled to the
destination without undeclared modifications and along a delivery
path consistent with this specification. They do not attest
in any way as to whether the message will be of value to the
recipient or whether any modifications that have been declared are or
are not benign.</t>

<t>The four states are:</t>

<t>PASS:  The message was successfully verified.</t>

<t>FAIL:  Verification of the message was completed but concluded that
       it was not a Fully Verified DKIM2 Message.</t>

<t>PERMERROR:  The message could not be verified due to some error that
      is unrecoverable, such as a required header field being absent
      or malformed.</t>

<t>TEMPERROR:  The message could not be verified due to a temporary
      inability to retrieve a public key. A later attempt may
      produce a different result.</t>

<t>A Verifier <bcp14>MAY</bcp14> cease verifying once the outcome of the verification
is known.</t>

<t>Verifiers wishing to communicate the results of verification to other
parts of the mail system may do so in whatever manner they see fit. If
they wish to provide a human-readable string to describe a failure
to verify (any state except PASS) then in order to provide the
maximum possible assistance to senders they <bcp14>SHOULD</bcp14> use the text
strings specified in this document. These human-readable messages
are described with m=<spanx style="verb">&lt;x&gt;</spanx> or tag=<spanx style="verb">&lt;y&gt;</spanx> placeholders;
the <spanx style="verb">&lt;x&gt;</spanx> and <spanx style="verb">&lt;y&gt;</spanx> <bcp14>MUST</bcp14> be replaced with the relevant ordinal
or tag name (without the <spanx style="verb">&lt;</spanx> and <spanx style="verb">&gt;</spanx> characters). Similarly
<spanx style="verb">&lt;value&gt;</spanx> <bcp14>MUST</bcp14> be replaced by a relevant string for the particular
message; and <spanx style="verb">&lt;s1&gt;</spanx> and <spanx style="verb">&lt;s2&gt;</spanx> <bcp14>MUST</bcp14> be replaced by appropriate Selector
names.</t>

<t>If the verification is being performed during an SMTP protocol
conversation the human-readable string <bcp14>SHOULD</bcp14> be part of the
5xx or 4xx response string.</t>

<t>If the results of the verification are being communicated in a
Delivery Status Notification message (<xref target="RFC6522"></xref>) the
human-readable string <bcp14>SHOULD</bcp14> be included.</t>

<t>If a system wishes to record the results returned by a Verifier
into a message then the Authentication-Results header field (<xref target="RFC8601"></xref>)
is available for this purpose. DKIM2 specific values
are defined in <xref target="AUTHRESULTS"></xref>. It should be noted that this header
field is ignored when calculating header hash values.</t>

<t>If verification results are recorded then that record <bcp14>SHOULD</bcp14>
include the human-readable string.</t>

</section>
<section anchor="ensure-that-the-dkim2-header-fields-are-valid"><name>Ensure that the DKIM2 header fields are valid</name>

<t>Verifiers will need to meticulously validate the format and values of all
relevant Message-Instance and DKIM2-Signature header fields. They
will also need to ensure that all required instances of these header
fields are present and that all required tags are present and tags that
cannot appear together do not do so. Unknown tags are to be ignored
as set out in <xref target="tagvaluelists"/>.</t>

<t>No Fully Verified DKIM2 Message will contain a Message-Instance field
with a higher m= value than occurs in any DKIM2-Signature field.</t>

<t>There are also requirements on not repeating hash algorithms or
Selectors.</t>

<t>To assist debugging, errors in a JSON object specifying Recipes
<bcp14>SHOULD</bcp14> be called out specifically and the text of invalid Recipe
steps placed into error messages as appropriate.</t>

<t>If the JSON is valid but the Verifier is not prepared to handle the
complexity of the Recipes then a failure <bcp14>MAY</bcp14> be returned but the
error message <bcp14>SHOULD NOT</bcp14> confuse this situation with other JSON
errors. What "unacceptably complex" might mean is a local
policy decision.</t>

<t>Clearly, a message with no DKIM2 header fields at all will be
reported as a PERMERROR.</t>

<t>Possible errors:</t>

<figure><artwork><![CDATA[
PERMERROR: Message-Instance m=<x> missing
PERMERROR: Message-Instance m=<x> syntax error
PERMERROR: Message-Instance m=<x> tag=<y> missing
PERMERROR: Message-Instance m=<x> is not signed
PERMERROR: Message-Instance m=<x> has a duplicate hash algorithm
PERMERROR: Message-Instance m=<x> contains invalid JSON
PERMERROR: Message-Instance m=<x> Recipe <value> is invalid
PERMERROR: Message-Instance m=<x> JSON is unacceptably complex
PERMERROR: DKIM2-Signature i=<x> missing
PERMERROR: DKIM2-Signature i=<x> syntax error
PERMERROR: DKIM2-Signature i=<x> tag=<y> missing
PERMERROR: DKIM2-Signature i=<x> tag=<y> was unexpected
PERMERROR: DKIM2-Signature i=<x> has a duplicate selector
PERMERROR: No DKIM2 header fields found
]]></artwork></figure>

</section>
<section anchor="check-timestamps"><name>Check the timestamps</name>

<t>A message is not a Fully Verified DKIM2 Message if any of its
DKIM2-Signature header fields was created more than 14 days
before the message was accepted over SMTP.</t>

<t>This limit is intended to assist in the design of schemes
that attempt to detect DKIM Replay without impacting transmission
of messages on today's highly reliable and highly connected Internet.</t>

<t>It might be expected that the timestamps on the DKIM2-Signature
fields were in an ascending order. However, many systems do not
always keep their clocks tightly synchronized with reality, and
interworking will be impacted if sub-second accuracy is required
of MTAs. That said, a timestamp that comes from the far future
may be an attempt to confuse DKIM Replay systems. Hence a message
is not a Fully Verified DKIM2 Message if any timestamp is from
more than one day ahead of when the message was accepted over SMTP.</t>

<t>It should be noted that checking timestamps requires accurate
information about when a message was accepted over SMTP and a
Verifier cannot assess the message otherwise.</t>

<t>Possible errors:</t>

<figure><artwork><![CDATA[
FAIL: DKIM2-Signature i=<x> signature expired
FAIL: DKIM2-Signature i=<x> signature is from the future
]]></artwork></figure>

</section>
<section anchor="check-the-chain-of-custody"><name>Check the Chain of Custody</name>

<t>As explained in <xref target="chain-of-custody"/> to check for a valid Chain
of Custody a Verifier will need to check for an exact
match between the MAIL FROM and RCPT TO parameters used when delivering
a message and the values found in the mf= and rt= tags of the highest
numbered DKIM2-Signature header field. There may be extra values
in the rt= value, but all RCPT TO values actually used for
delivery will need to be present.</t>

<t>When comparing with SMTP protocol values the local part of the email
address is checked as well as the domain. The domains are compared
without regard to case and need to match exactly. As is usual in email
protocols the case of the local part of an email address is assumed
to matter (and see also <xref target="EAI"/>), so the local parts need to match
exactly. Note that the decoded mf= and rt= values used for these
matches include the angle brackets around the email addresses.</t>

<t>A Verifier will also need to check, for every DKIM2-Signature field,
that there is a relaxed domain match (see <xref target="relaxed-domain-match"/>)
between the d= Signing Domain and the mf= value. However, if the
(decoded) mf= value is null (mf=&lt;&gt;) or mf= is absent (there is an
nd= tag present) then no match is performed.</t>

<t>A Verifier then needs to check the Chain of Custody from start
to finish. The steps for this are set out in <xref target="rdm-uses"/>
Item <xref format="counter" target="cc-rdm"></xref> and are not repeated here.</t>

<t>If out-of-band arrangements (as explained in <xref target="imaginary-hops"/>) apply
then there may not be a "next DKIM2-Signature" in the message -- it
is about to be added. Hence, although the message is not presently
a Fully Verified DKIM2 Message, the intention is that the receiving
system will add a DKIM2-Signature header field whose d= matches the
nd= value, to fix this.</t>

<t>Possible errors:</t>

<figure><artwork><![CDATA[
FAIL: DKIM2-Signature i=<x> MAIL FROM <value> did not match
FAIL: DKIM2-Signature i=<x> RCPT TO <value> did not match
FAIL: DKIM2-Signature i=<x> MAIL FROM and d= do not match
FAIL: DKIM2-Signature i=<x> nd= does not match
FAIL: DKIM2-Signature i=<x> unexpected nd= tag
FAIL: DKIM2-Signature i=<x> mf= does not match the rt= of i=<y>
FAIL: DKIM2-Signature i=<x> d= does not match the rt= of i=<y>
]]></artwork></figure>

</section>
<section anchor="fetch-the-public-key"><name>Fetch the public key</name>

<t>The public keys of the signatures in DKIM2-Signature fields are
needed to complete the verification process. Details of key management and
representation are described in <xref target="key_management"/> and <xref target="DKIMKEYS"></xref>.
A key record that is malformed cannot be used and the result
is a PERMERROR.</t>

<t>Note that DNS timeouts are considered to be a TEMPERROR but a DNS
result that indicates the key is absent is considered to be a
PERMERROR. Additionally, as <xref target="DKIMKEYS"></xref> makes clear, if more than
one record is returned this is an error. Any human-readable error
message that results from key fetching errors <bcp14>SHOULD</bcp14> provide the
Selector value so that it is clear which key has a problem.</t>

<t><xref target="FIPS-204"/> notes that an ML-DSA-44 key that is not exactly 1312
octets (1752 characters once encoded as a base64string) is to be
considered malformed. Similarly, Ed25519 keys are exactly 32
octets (44 characters as a base64string), see <xref target="RFC8032"></xref>.</t>

<t>Note that <xref target="DKIMKEYS"></xref> has retired the h= field and DKIM2 takes no
notice of it should it be present.</t>

<t>Possible errors:</t>

<figure><artwork><![CDATA[
TEMPERROR: DKIM2-Signature i=<x> public key <s1> could not be fetched
PERMERROR: DKIM2-Signature i=<x> public key <s1> does not exist
PERMERROR: DKIM2-Signature i=<x> public key <s1> has multiple records
PERMERROR: DKIM2-Signature i=<x> public key <s1> has a syntax error
PERMERROR: DKIM2-Signature i=<x> public key <s1> algorithm mismatch
PERMERROR: DKIM2-Signature i=<x> public key <s1> has been revoked
PERMERROR: DKIM2-Signature i=<x> public key <s1> is malformed
]]></artwork></figure>

</section>
<section anchor="sigcheck"><name>Perform the signature verification calculation</name>

<t>Verifying a signature consists of actions semantically equivalent to the
following steps:</t>

<t><list style="numbers" type="1">
  <t>Prepare a canonicalized version of the Message-Instance and DKIM2-Signature
header fields as described in <xref target="calculate-signature"/>. When checking a
DKIM2-Signature header field only the Message-Instance header fields
numbered up to and including its m= value and the DKIM2-Signature header
fields numbered below its i= value are considered.</t>
  <t>The highest numbered DKIM2-Signature header field being checked needs
to be put back to the state it was in when the signature was created.
That is, the signature value(s) themselves are set to a null string
(leaving everything else in the s= tag unchanged) and this "unsigned"
version of the header field is used in the signature calculation.</t>
  <t>Use the relevant public key value(s) to check the signature(s). If the
signature is correct then the intermediate result for that signature
is PASS. If the
signature does not match then the intermediate result is FAIL. If the
value cannot be checked because of an issue with the key then the
intermediate result is either TEMPERROR or PERMERROR.</t>
  <t>An algorithm which a Verifier has not implemented is given a PERMERROR
intermediate result.</t>
  <t>Determine whether the signatures specified in the s= tag provide an
overall PASS for the signing of the message. The "sig-all" (comma
separated list) is checked and then the "sig-any" groups (lists
separated by "|" characters). Of course there may be just one
signature and no groups, which means there is no need to combine
results to do the following steps.</t>
  <t>Examine each "sig-all" list of signatures. If every signature is
a PASS then the intermediate result is PASS. If every signature
that is not a PASS is a TEMPERROR then the intermediate result is
TEMPERROR. If any signature is a FAIL then the intermediate result
is FAIL, otherwise the intermediate result is PERMERROR.</t>
  <t>Now examine the "sig-any" groups. If any group is a PASS the result
is PASS. If any group is TEMPERROR the result is TEMPERROR. If
any group is FAIL then the result is FAIL, otherwise the result
is PERMERROR.</t>
  <t>The human-readable text for any error <bcp14>SHOULD</bcp14> provide the relevant
Selector values.</t>
</list></t>

<t>The different "AND/OR" rules for combining signatures are to allow
phased deployment of new algorithms alongside "hybrid" schemes should
algorithms not be fully trusted.</t>

<t>Note that the way in which results are reported means that if a retry
could result in a PASS then TEMPERROR is reported and FAIL is reported
when a signature does not match and no (sig-any) PASS overrides this.</t>

<t>Possible errors (noting that there are many possible ways in
which a complex combination of signatures can fail to give a PASS
result and so this document does not try to provide text for all
of them):</t>

<figure><artwork><![CDATA[
FAIL: DKIM2-Signature i=<x> selector <s1> incorrect signature
FAIL: DKIM2-Signature i=<x> no group of signatures passed
PERMERROR: DKIM2-Signature i=<x> selector <s1> algorithm unknown
]]></artwork></figure>

</section>
<section anchor="hashcheck"><name>Validating body and header hashes</name>

<t>Verifying a hash value requires a Verifier to repeat the hash calculation
performed by the Signer as set out in <xref target="computing-header-hash"/>
and <xref target="computing-body-hash"/>. The hash values (for each relevant
hash algorithm) can then be directly compared with the values in a
Message-Instance header field and the PASS/FAIL calculated as follows:</t>

<t><list style="numbers" type="1">
  <t>Compare the header and body hashes with the values in each of the
hash-sets in the h= value in turn. If both match the intermediate
result is PASS, otherwise the intermediate result is FAIL.</t>
  <t>A hash algorithm which a Verifier has not implemented has a PERMERROR
intermediate result.</t>
  <t>If there is just one hash-set then the intermediate result is the
result.</t>
  <t>Otherwise examine each "hash-all" list of hash-sets separated by
"," in the h= value. If every hash-set has an intermediate result
of PASS then the intermediate result for that list is PASS. If any
hash-set has an intermediate result of FAIL then the intermediate
result for that list is FAIL, otherwise the intermediate result
is PERMERROR.</t>
  <t>Now examine the "hash-any" groups. If any group has an intermediate
result of PASS the result is PASS. If any group has an intermediate
result of FAIL then the result is FAIL, otherwise the
result is PERMERROR.</t>
  <t>Since there may be more than one hash algorithm present, the
human-readable error message <bcp14>SHOULD</bcp14> indicate which algorithm's
result failed to match and possibly also a fragment of its value.</t>
</list></t>

<t>The different "AND/OR" rules for combining hashes are to allow
phased deployment of new algorithms alongside "hybrid" schemes should
algorithms not be fully trusted.</t>

<t>Note that the way in which results are reported means that FAIL is
reported when a hash-set does not match and no (hash-any) PASS
overrides this.</t>

<t>Possible errors (noting that there are many possible ways in
which a complex combination of hash-sets can fail to give a PASS
result and so this document does not try to provide text for all
of them):</t>

<figure><artwork><![CDATA[
FAIL: Message-Instance m=<x> header hash <value> mismatch
FAIL: Message-Instance m=<x> body hash <value> mismatch
FAIL: Message-Instance m=<x> no group of hashes passed
PERMERROR: Message-Instance m=<x> algorithm <value> unknown
]]></artwork></figure>

</section>
<section anchor="check-for-authentic-from-header-fields"><name>Check for Authentic From header fields</name>

<t>The From header fields within a Fully Verified DKIM2 Message are
required to be Authentic.</t>

<t>A Verifier will need to inspect the currently present From header
field and any previous From header fields that Recipes show have
been present since the message was first signed. To determine if
a From header field is Authentic
the relaxed domain match comparison (<xref target="relaxed-domain-match"/>) is used
to compare the domain(s) in the From header field(s) with the
relevant DKIM2-Signature field(s).</t>

<t>Details of how to identify the relevant header fields are given
in <xref target="authentic-from"/>. Note that a From header field with more
than one address, or with a domain-literal, can never be Authentic.</t>

<t>Possible errors:</t>

<figure><artwork><![CDATA[
FAIL: DKIM2-Signature i=<x> matching From is not authentic
]]></artwork></figure>

</section>
</section>
<section anchor="DKIM-Replay"><name>DKIM Replay attacks</name>

<t>In a DKIM Replay attack a message with a valid signature but
containing malicious content is sent to large numbers of recipients.
The original Signer may only have signed one message but, without
their knowledge, the malicious message is "replayed" at scale by
a third party. However, since the signature on the message is valid,
reputation systems may allow the messages to be delivered.</t>

<t>Clearly, a Signer that wishes to preserve their good name will want
to avoid signing malicious content, but the reality is that identifying
that an individual message is malicious can be difficult.</t>

<t>Receivers hosting numerous mailboxes can expect to see large
numbers of identical messages sent to them directly from the
originating system. Mechanisms for dealing with DKIM Replay
need to be aware of this and act appropriately.</t>

<t>What distinguishes a DKIM Replay attack, where a third party forwards
signed messages, from an attack by a Signer that sends many malicious
messages itself is that the original Signer may have limited the
number of messages it allows to be sent, and the replay sidesteps
that limit.</t>

<section anchor="preventing-and-detecting-dkim-replay-attacks"><name>Preventing and detecting DKIM Replay attacks</name>

<t>In DKIM2 a number of mechanisms make DKIM Replay much more difficult
to achieve than has been the case with DKIM1. The Chain of Custody
ensures that any system that is replaying will have provided
cryptographic proof that they were an intermediary, and this
information can inform decisions about whether or not to accept
a message.</t>

<t>Systems that provide service for large numbers of mailboxes can
track whether the same message has been received more than once,
having passed via an intermediary, without an "exploded" flag
being added to indicate that multiple copies are
to be expected. A message will have passed via an intermediary
if there is more than one DKIM2-Signature header field present.
A message will be "the same" if the header and body hash values
of the original message (Message-Instance m=1) both match.</t>

<t>Alternatively, if an exploded flag is present this will pin down
where a system is claiming to have sent multiple copies. Assessing
whether the flag was expected can affect decisions about delivery.</t>

<t>If a system only learns the details of a single replayed message
then of course counting is of no value, but if the system
doing bulk replay has added an exploded flag then this can
still affect decisions regarding delivery.</t>

<t>A Receiver can attempt to distinguish a DKIM Replay attack from
bulk sending (if they view this as valuable) by considering whether
the messages arrived via an unexpected route, via a third party.</t>

<t>Receivers need to be aware that they may receive multiple copies
of the same message if different recipients of an original all
choose to forward the message to the receiver. Malicious DKIM
Replay attacks generally happen at such volume that distinguishing
this re-convergence case is unlikely to be especially complex.</t>

<t>It should be noted, as <xref target="RFC1047"></xref> explains, that
duplicated messages can result from a protocol level issue but, with
appropriately set timer values, duplication is rare on today's
Internet.</t>

</section>
</section>
<section anchor="bounce"><name>Delivery Status Notifications in the DKIM2 ecosystem</name>

<t>In the DKIM2 ecosystem, when a message cannot be delivered then
this is reported to the sending machine by means of an <xref target="RFC5321"></xref>
return code or, if the SMTP session has completed, by generating
a Delivery Status Notification (DSN), as defined in <xref target="RFC6522"></xref>.</t>

<t>A DSN is sent to the MAIL FROM address in the usual manner. This
address can be found in the mf= tag value (decoded from base64) of
the highest numbered DKIM2-Signature header field. If this value
has no address ("&lt;&gt;") then a DSN <bcp14>MUST NOT</bcp14> be sent.</t>

<t>DKIM2 requires that there is a relaxed domain match between the
Signing Domain and the mf= value in the same DKIM2-Signature header
field. Hence a DSN for a message that has been Provisionally
Verified will not be "backscatter" to the forged address of a
third party that was not involved in handling the message.</t>

<t>DKIM2 expects failure reports (DSNs) to be passed back in turn to
each previous (validated) hop that was taken on the message's
outward journey until a system is reached that is prepared to
take full responsibility for the failure event. This method of
propagating DSNs gives MTAs that were involved in passing the
message forward the opportunity to adjust their future sending
behavior.</t>

<section anchor="dsn-contents"><name>DSN contents</name>

<t>As set out in <xref target="RFC6522"></xref>, a DSN has a top-level MIME part of
type <spanx style="verb">multipart/report</spanx>.</t>

<t>A valid DSN generated by a DKIM2 system <bcp14>MUST</bcp14> always contain three
sections, the human-readable text, the machine readable status (in a
message/delivery-status MIME part) and either a MIME part of type
<spanx style="verb">message/rfc822</spanx> that holds the original message exactly as it was
submitted by the sending system or <spanx style="verb">text/rfc822-headers</spanx> which has
just the header fields of that message.</t>

</section>
<section anchor="dsn-header-and-smtp-parameters"><name>DSN header and SMTP parameters</name>

<t>The DSN itself <bcp14>MUST</bcp14> have appropriate Message-Instance and
DKIM2-Signature fields, noting that the MAIL FROM to be used
will be null ("&lt;&gt;").</t>

<t>The assurances in this section depend on the message being
reported upon having been Provisionally Verified. It is not
necessary to determine that it is a Fully Verified DKIM2 Message
and of course some DSNs will be sent precisely because that
is not the case.</t>

<t>When creating a DSN there <bcp14>MUST</bcp14> be a relaxed domain match between
the Signing Domain (placed into the d= value of the DKIM2-Signature
header field of the DSN) and a recipient address in the rt= value
of the highest numbered DKIM2-Signature header field of the message
being reported upon
(see <xref target="rdm-uses"/> Item <xref format="counter" target="dsn-rdm"></xref>).</t>

</section>
<section anchor="dsn-propagation"><name>DSN propagation</name>

<t>A Forwarder which receives a DSN <bcp14>MAY</bcp14> propagate this DSN to the
MAIL FROM address used to deliver the message to it
(which can be found in the highest numbered DKIM2-Signature
header field).</t>

<t>When propagating the DSN back along the forwarding chain
the first and second parts of the DSN <bcp14>MUST</bcp14> be rewritten so
as to remove any information about the destination to
which the message was sent.</t>

<t>Additionally, the original message in the third part of the
DSN <bcp14>MUST</bcp14> be converted back to the state the message was in
when it originally arrived -- before it was forwarded.</t>

<t>If the message was modified by the Forwarder on the outward
journey, those modifications <bcp14>MUST</bcp14> be undone and the Message-Instance
header field documenting those changes <bcp14>MUST</bcp14> be removed.</t>

<t>All DKIM2-Signature header fields added by this Forwarder
(including any with an nd= tag) <bcp14>MUST</bcp14> be removed. A good faith
effort <bcp14>SHOULD</bcp14> also be made to remove any header fields that are
not signed by DKIM2, such as Received header fields, that were
not present when the message arrived on its outward journey.</t>

<t>If it is impossible to regenerate the body of the message, because
a "null Recipe" means that the previous version cannot be
reconstructed, then the body <bcp14>MUST</bcp14> be removed from the third
part of the DSN and a <spanx style="verb">text/rfc822-headers</spanx> MIME part <bcp14>MUST</bcp14>
be supplied.</t>

<t>The resultant DSN is sent to the MAIL FROM address from the now
highest numbered DKIM2-Signature header field. The DSN itself
<bcp14>MUST</bcp14> have only one DKIM2-Signature field and only one
Message-Instance header field: i.e. it is a new message.</t>

<t>Following these procedures will ensure that no details
of where the message was forwarded to will be revealed to
the previous hop and the previous hop will be able to
apply the same procedure to return the DSN to its previous
hop, if that is required.</t>

</section>
<section anchor="authentication-of-inbound-dsns"><name>Authentication of inbound DSNs</name>

<t>When a system receives a DKIM2 signed DSN, and the included
original message is also DKIM2 signed, it <bcp14>SHOULD</bcp14> verify that
the returned message (or just the header fields if the body
is not present) has not been altered.</t>

<t>This means:</t>

<t><list style="numbers" type="1">
  <t>There is a relaxed domain match (see <xref target="rdm-uses"/> Item
<xref format="counter" target="dsn-rdm"></xref>)
between the Signing Domain (d=) of the i=1 DKIM2-Signature header field
of the DSN and a recipient address of the returned message.
Recipient addresses are located in the rt= tag of the
last (highest i= tag) DKIM2-Signature in the returned message.</t>
  <t>The last (highest i= tag) DKIM2-Signature header field of the
returned message will be one that was generated by the system
receiving the DSN, determined by examining the
d= and mf= tags of that DKIM2-Signature header field.</t>
  <t>The header fields of the embedded message (in the message/rfc822
MIME part) can be verified by checking the header hash values in
the highest numbered Message-Instance header field. The h= value
is evaluated as in <xref target="hashcheck"/>, except that if the body is
not present a hash-set passes if its header hash matches.</t>
</list></t>

<t>If the verification fails then the DSN <bcp14>MUST NOT</bcp14> be propagated
any further. If verification has been performed prior to
accepting the DSN from the sender the DSN <bcp14>SHOULD</bcp14> be rejected
with a 550/5.7.x return code. If the verification cannot be completed
because of a temporary issue (with DNS lookups) then a 4xx
return code <bcp14>SHOULD</bcp14> be used.</t>

<t>If the returned message does not contain DKIM2-Signature
and Message-Instance header fields then this specification
does not apply and there is no expectation that the DSN
will be sent to any other system.</t>

</section>
</section>
<section anchor="signer_normalize"><name>Preventing transport conversions</name>

<t>DKIM2's design is predicated on valid input.</t>

<t>In order to be signed a message <bcp14>MUST</bcp14> be in "network normal" format,
so that lines are separated with CRLF and any transfer encoding
has been applied.</t>

<t>A message that is not compliant with <xref target="RFC5322"></xref>, <xref target="RFC2045"></xref>, <xref target="RFC2047"></xref>
and other relevant message format standards can be subject to attempts
by intermediaries to correct or interpret such content.  See Section 8
of <xref target="RFC6409"></xref> for examples of changes that are commonly made.  Such
"corrections" may invalidate DKIM2 signatures or have other undesirable
effects, including some that involve changes to the way a message is
presented to an end user.</t>

<t>When calculating the hash on messages that will be transmitted using
base64 or quoted-printable encoding, Signers <bcp14>MUST</bcp14> compute the hash
after the encoding, and Verifiers will check the hash of the encoded
form of text. However, the hash <bcp14>MUST</bcp14> be computed before transport-level
encodings such as SMTP "dot-stuffing" (the modification of lines
beginning with a "." to avoid confusion with the SMTP end-of-message
marker, as specified in <xref target="RFC5321"></xref>).</t>

<t>Further, if the message contains local encoding that will be modified before transmission,
that modification to canonical <xref target="RFC5322"></xref> form <bcp14>MUST</bcp14> be done before signing.
In particular, bare CR or LF characters (used by some systems as a local line
separator convention) <bcp14>MUST</bcp14> be converted to the SMTP-standard CRLF
sequence before the message is signed.  Any conversion of this sort
<bcp14>MUST</bcp14> be applied to the message actually sent to the recipient(s),
not just to the version presented to the signing algorithm.</t>

<t>More generally, the Signer <bcp14>MUST</bcp14> sign the message as it is expected to
be received by the Verifier rather than in some local or internal form.</t>

</section>
<section anchor="EAI"><name>EAI (<xref target="RFC6530"></xref>) considerations for DKIM2</name>

<t>SMTPUTF8 lets MTAs send and receive non-ASCII characters. For the most
part DKIM2 works only in ASCII. Domain values used in the SMTP protocol
(MAIL FROM and RCPT TO) <bcp14>MUST</bcp14> be mapped from U-labels to A-labels before
being recorded in DKIM2-Signature header fields or used in comparisons (see
<xref target="RFC5890"></xref> and <xref target="RFC5891"></xref>). Local parts are recorded unchanged (the base64
encoding means no difficulties will arise).</t>

<t>Non-ASCII characters can also appear in From header fields, which are
recorded and compared when checking if they are Authentic. Again, a
U-label must be mapped to an A-label before comparisons are made. Local
parts are only ever compared in exact matches.</t>

<t>It should be noted that although email standards generally require
messages to be transported in simple ASCII (and provide numerous
encoding mechanisms to ensure this can be done) nevertheless messages
may contain non-ASCII characters. This is irrelevant for hashing
functions which treat messages as a simple array of bytes, but it
does have an impact on Recipes (see <xref target="JSONrecipe"/>). Accordingly,
Recipes handle header fields and body lines as being in UTF-8 (a
superset of ASCII) and provide "u" steps within Recipes for handling
sequences of byte values that are not valid UTF-8.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>IANA is requested to add the following two header fields to the
"Permanent Message Header Field Names" table of the "Message
Headers" registry (see <xref target="RFC3864"></xref>).</t>

<dl>
  <dt>Header field name:</dt>
  <dd>
    <t>DKIM2-Signature</t>
  </dd>
  <dt>Applicable protocol:</dt>
  <dd>
    <t>mail</t>
  </dd>
  <dt>Status:</dt>
  <dd>
    <t>standard</t>
  </dd>
  <dt>Trace:</dt>
  <dd>
    <t>yes</t>
  </dd>
  <dt>Author/Change controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
  <dt>Specification document(s):</dt>
  <dd>
    <t>RFC XXXX (this document)</t>
  </dd>
  <dt>Header field name:</dt>
  <dd>
    <t>Message-Instance</t>
  </dd>
  <dt>Applicable protocol:</dt>
  <dd>
    <t>mail</t>
  </dd>
  <dt>Status:</dt>
  <dd>
    <t>standard</t>
  </dd>
  <dt>Trace:</dt>
  <dd>
    <t>yes</t>
  </dd>
  <dt>Author/Change controller:</dt>
  <dd>
    <t>IETF</t>
  </dd>
  <dt>Specification document(s):</dt>
  <dd>
    <t>RFC XXXX (this document)</t>
  </dd>
</dl>

<t>No other IANA actions are requested.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>Unsigned header fields can be added or removed without detection, and so
they cannot safely be relied upon for security decisions. In particular,
conclusions may be drawn about whether email messages are authentic
based on Authentication-Results header fields which are unsigned. Of
course, a Fully Verified DKIM2 Message provides unambiguous information
about authenticity.</t>

<t>Although a DKIM2 message may only have a single Message-Instance header
field and just one DKIM2-Signature field, this specification allows for
many such header fields, multiple hashes and signatures and places no
limits on the complexity of Recipes. Even if limits were set,
malicious messages could ignore them. <xref target="RFC4732"></xref> surveys denial-of-service
attacks and provides guidance as to how to address them. Implementers
should take notice of this document and much other advice.</t>

<t>If a message has a null Recipe then it will be impossible to verify
the nature of any modifications made to the message when the null Recipe
was added. The expectation is that null Recipes will only
be used when there is a contractual relationship between the operators
doing the modification (perhaps a security gateway of some kind) and
the next recipient of the message. It is unlikely that this contractual
relationship will extend any further, so attempting to forward the
message any further could be unsuccessful.</t>

<t>This specification requires RSA keys to be at least 1024 bits. Longer
keys may be more appropriate in the future, and the algorithms
specified here may, in the course of time, become deprecated. Signers
will need to pay attention to community advice as to whether cryptographic
primitives are appropriate to use, regardless of what this specification
might say.</t>

</section>


  </middle>

  <back>


<references title='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC1034">
  <front>
    <title>Domain names - concepts and facilities</title>
    <author fullname="P. Mockapetris" initials="P." surname="Mockapetris"/>
    <date month="November" year="1987"/>
    <abstract>
      <t>This RFC is the revised basic definition of The Domain Name System. It obsoletes RFC-882. This memo describes the domain style names and their used for host address look up and electronic mail forwarding. It discusses the clients and servers in the domain name system and the protocol used between them.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="13"/>
  <seriesInfo name="RFC" value="1034"/>
  <seriesInfo name="DOI" value="10.17487/RFC1034"/>
</reference>
<reference anchor="RFC2045">
  <front>
    <title>Multipurpose Internet Mail Extensions (MIME) Part One: Format of Internet Message Bodies</title>
    <author fullname="N. Freed" initials="N." surname="Freed"/>
    <author fullname="N. Borenstein" initials="N." surname="Borenstein"/>
    <date month="November" year="1996"/>
    <abstract>
      <t>This initial document specifies the various headers used to describe the structure of MIME messages. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="2045"/>
  <seriesInfo name="DOI" value="10.17487/RFC2045"/>
</reference>
<reference anchor="RFC2047">
  <front>
    <title>MIME (Multipurpose Internet Mail Extensions) Part Three: Message Header Extensions for Non-ASCII Text</title>
    <author fullname="K. Moore" initials="K." surname="Moore"/>
    <date month="November" year="1996"/>
    <abstract>
      <t>This particular document is the third document in the series. It describes extensions to RFC 822 to allow non-US-ASCII text data in Internet mail header fields. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="2047"/>
  <seriesInfo name="DOI" value="10.17487/RFC2047"/>
</reference>
<reference anchor="RFC3463">
  <front>
    <title>Enhanced Mail System Status Codes</title>
    <author fullname="G. Vaudreuil" initials="G." surname="Vaudreuil"/>
    <date month="January" year="2003"/>
    <abstract>
      <t>This document defines a set of extended status codes for use within the mail system for delivery status reports, tracking, and improved diagnostics. In combination with other information provided in the Delivery Status Notification (DSN) delivery report, these codes facilitate media and language independent rendering of message delivery status. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3463"/>
  <seriesInfo name="DOI" value="10.17487/RFC3463"/>
</reference>
<reference anchor="RFC4648">
  <front>
    <title>The Base16, Base32, and Base64 Data Encodings</title>
    <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
    <date month="October" year="2006"/>
    <abstract>
      <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4648"/>
  <seriesInfo name="DOI" value="10.17487/RFC4648"/>
</reference>
<reference anchor="RFC5234">
  <front>
    <title>Augmented BNF for Syntax Specifications: ABNF</title>
    <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
    <author fullname="P. Overell" initials="P." surname="Overell"/>
    <date month="January" year="2008"/>
    <abstract>
      <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="68"/>
  <seriesInfo name="RFC" value="5234"/>
  <seriesInfo name="DOI" value="10.17487/RFC5234"/>
</reference>
<reference anchor="RFC5321">
  <front>
    <title>Simple Mail Transfer Protocol</title>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <date month="October" year="2008"/>
    <abstract>
      <t>This document is a specification of the basic protocol for Internet electronic mail transport. It consolidates, updates, and clarifies several previous documents, making all or parts of most of them obsolete. It covers the SMTP extension mechanisms and best practices for the contemporary Internet, but does not provide details about particular extensions. Although SMTP was designed as a mail transport and delivery protocol, this specification also contains information that is important to its use as a "mail submission" protocol for "split-UA" (User Agent) mail reading systems and mobile environments. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5321"/>
  <seriesInfo name="DOI" value="10.17487/RFC5321"/>
</reference>
<reference anchor="RFC5322">
  <front>
    <title>Internet Message Format</title>
    <author fullname="P. Resnick" initials="P." role="editor" surname="Resnick"/>
    <date month="October" year="2008"/>
    <abstract>
      <t>This document specifies the Internet Message Format (IMF), a syntax for text messages that are sent between computer users, within the framework of "electronic mail" messages. This specification is a revision of Request For Comments (RFC) 2822, which itself superseded Request For Comments (RFC) 822, "Standard for the Format of ARPA Internet Text Messages", updating it to reflect current practice and incorporating incremental changes that were specified in other RFCs. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5322"/>
  <seriesInfo name="DOI" value="10.17487/RFC5322"/>
</reference>
<reference anchor="RFC5890">
  <front>
    <title>Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework</title>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <date month="August" year="2010"/>
    <abstract>
      <t>This document is one of a collection that, together, describe the protocol and usage context for a revision of Internationalized Domain Names for Applications (IDNA), superseding the earlier version. It describes the document collection and provides definitions and other material that are common to the set. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5890"/>
  <seriesInfo name="DOI" value="10.17487/RFC5890"/>
</reference>
<reference anchor="RFC5891">
  <front>
    <title>Internationalized Domain Names in Applications (IDNA): Protocol</title>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <date month="August" year="2010"/>
    <abstract>
      <t>This document is the revised protocol definition for Internationalized Domain Names (IDNs). The rationale for changes, the relationship to the older specification, and important terminology are provided in other documents. This document specifies the protocol mechanism, called Internationalized Domain Names in Applications (IDNA), for registering and looking up IDNs in a way that does not require changes to the DNS itself. IDNA is only meant for processing domain names, not free text. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5891"/>
  <seriesInfo name="DOI" value="10.17487/RFC5891"/>
</reference>
<reference anchor="RFC6376">
  <front>
    <title>DomainKeys Identified Mail (DKIM) Signatures</title>
    <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
    <author fullname="T. Hansen" initials="T." role="editor" surname="Hansen"/>
    <author fullname="M. Kucherawy" initials="M." role="editor" surname="Kucherawy"/>
    <date month="September" year="2011"/>
    <abstract>
      <t>DomainKeys Identified Mail (DKIM) permits a person, role, or organization that owns the signing domain to claim some responsibility for a message by associating the domain with the message. This can be an author's organization, an operational relay, or one of their agents. DKIM separates the question of the identity of the Signer of the message from the purported author of the message. Assertion of responsibility is validated through a cryptographic signature and by querying the Signer's domain directly to retrieve the appropriate public key. Message transit from author to recipient is through relays that typically make no substantive change to the message content and thus preserve the DKIM signature.</t>
      <t>This memo obsoletes RFC 4871 and RFC 5672. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="76"/>
  <seriesInfo name="RFC" value="6376"/>
  <seriesInfo name="DOI" value="10.17487/RFC6376"/>
</reference>
<reference anchor="RFC6409">
  <front>
    <title>Message Submission for Mail</title>
    <author fullname="R. Gellens" initials="R." surname="Gellens"/>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <date month="November" year="2011"/>
    <abstract>
      <t>This memo splits message submission from message relay, allowing each service to operate according to its own rules (for security, policy, etc.), and specifies what actions are to be taken by a submission server.</t>
      <t>Message relay is unaffected, and continues to use SMTP over port 25.</t>
      <t>When conforming to this document, message submission uses the protocol specified here, normally over port 587.</t>
      <t>This separation of function offers a number of benefits, including the ability to apply specific security or policy requirements. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="72"/>
  <seriesInfo name="RFC" value="6409"/>
  <seriesInfo name="DOI" value="10.17487/RFC6409"/>
</reference>
<reference anchor="RFC6522">
  <front>
    <title>The Multipart/Report Media Type for the Reporting of Mail System Administrative Messages</title>
    <author fullname="M. Kucherawy" initials="M." role="editor" surname="Kucherawy"/>
    <date month="January" year="2012"/>
    <abstract>
      <t>The multipart/report Multipurpose Internet Mail Extensions (MIME) media type is a general "family" or "container" type for electronic mail reports of any kind. Although this memo defines only the use of the multipart/report media type with respect to delivery status reports, mail processing programs will benefit if a single media type is used for all kinds of reports.</t>
      <t>This memo obsoletes "The Multipart/Report Content Type for the Reporting of Mail System Administrative Messages", RFC 3462, and marks RFC 3462 and its predecessor as "Historic". [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="73"/>
  <seriesInfo name="RFC" value="6522"/>
  <seriesInfo name="DOI" value="10.17487/RFC6522"/>
</reference>
<reference anchor="RFC6530">
  <front>
    <title>Overview and Framework for Internationalized Email</title>
    <author fullname="J. Klensin" initials="J." surname="Klensin"/>
    <author fullname="Y. Ko" initials="Y." surname="Ko"/>
    <date month="February" year="2012"/>
    <abstract>
      <t>Full use of electronic mail throughout the world requires that (subject to other constraints) people be able to use close variations on their own names (written correctly in their own languages and scripts) as mailbox names in email addresses. This document introduces a series of specifications that define mechanisms and protocol extensions needed to fully support internationalized email addresses. These changes include an SMTP extension and extension of email header syntax to accommodate UTF-8 data. The document set also includes discussion of key assumptions and issues in deploying fully internationalized email. This document is a replacement for RFC 4952; it reflects additional issues identified since that document was published. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6530"/>
  <seriesInfo name="DOI" value="10.17487/RFC6530"/>
</reference>
<reference anchor="RFC6648">
  <front>
    <title>Deprecating the "X-" Prefix and Similar Constructs in Application Protocols</title>
    <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
    <author fullname="D. Crocker" initials="D." surname="Crocker"/>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <date month="June" year="2012"/>
    <abstract>
      <t>Historically, designers and implementers of application protocols have often distinguished between standardized and unstandardized parameters by prefixing the names of unstandardized parameters with the string "X-" or similar constructs. In practice, that convention causes more problems than it solves. Therefore, this document deprecates the convention for newly defined parameters with textual (as opposed to numerical) names in application protocols. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="178"/>
  <seriesInfo name="RFC" value="6648"/>
  <seriesInfo name="DOI" value="10.17487/RFC6648"/>
</reference>
<reference anchor="RFC7372">
  <front>
    <title>Email Authentication Status Codes</title>
    <author fullname="M. Kucherawy" initials="M." surname="Kucherawy"/>
    <date month="September" year="2014"/>
    <abstract>
      <t>This document registers code points to allow status codes to be returned to an email client to indicate that a message is being rejected or deferred specifically because of email authentication failures.</t>
      <t>This document updates RFC 7208, since some of the code points registered replace the ones recommended for use in that document.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7372"/>
  <seriesInfo name="DOI" value="10.17487/RFC7372"/>
</reference>
<reference anchor="RFC7405">
  <front>
    <title>Case-Sensitive String Support in ABNF</title>
    <author fullname="P. Kyzivat" initials="P." surname="Kyzivat"/>
    <date month="December" year="2014"/>
    <abstract>
      <t>This document extends the base definition of ABNF (Augmented Backus-Naur Form) to include a way to specify US-ASCII string literals that are matched in a case-sensitive manner.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7405"/>
  <seriesInfo name="DOI" value="10.17487/RFC7405"/>
</reference>
<reference anchor="RFC8017">
  <front>
    <title>PKCS #1: RSA Cryptography Specifications Version 2.2</title>
    <author fullname="K. Moriarty" initials="K." role="editor" surname="Moriarty"/>
    <author fullname="B. Kaliski" initials="B." surname="Kaliski"/>
    <author fullname="J. Jonsson" initials="J." surname="Jonsson"/>
    <author fullname="A. Rusch" initials="A." surname="Rusch"/>
    <date month="November" year="2016"/>
    <abstract>
      <t>This document provides recommendations for the implementation of public-key cryptography based on the RSA algorithm, covering cryptographic primitives, encryption schemes, signature schemes with appendix, and ASN.1 syntax for representing keys and for identifying the schemes.</t>
      <t>This document represents a republication of PKCS #1 v2.2 from RSA Laboratories' Public-Key Cryptography Standards (PKCS) series. By publishing this RFC, change control is transferred to the IETF.</t>
      <t>This document also obsoletes RFC 3447.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8017"/>
  <seriesInfo name="DOI" value="10.17487/RFC8017"/>
</reference>
<reference anchor="RFC8032">
  <front>
    <title>Edwards-Curve Digital Signature Algorithm (EdDSA)</title>
    <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
    <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
    <date month="January" year="2017"/>
    <abstract>
      <t>This document describes elliptic curve signature scheme Edwards-curve Digital Signature Algorithm (EdDSA). The algorithm is instantiated with recommended parameters for the edwards25519 and edwards448 curves. An example implementation and test vectors are provided.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8032"/>
  <seriesInfo name="DOI" value="10.17487/RFC8032"/>
</reference>
<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>
<reference anchor="RFC8601">
  <front>
    <title>Message Header Field for Indicating Message Authentication Status</title>
    <author fullname="M. Kucherawy" initials="M." surname="Kucherawy"/>
    <date month="May" year="2019"/>
    <abstract>
      <t>This document specifies a message header field called "Authentication-Results" for use with electronic mail messages to indicate the results of message authentication efforts. Any receiver-side software, such as mail filters or Mail User Agents (MUAs), can use this header field to relay that information in a convenient and meaningful way to users or to make sorting and filtering decisions.</t>
      <t>This document obsoletes RFC 7601.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8601"/>
  <seriesInfo name="DOI" value="10.17487/RFC8601"/>
</reference>

<reference anchor="DKIMKEYS">
   <front>
      <title>Domain Name Specification for DKIM2</title>
      <author fullname="Wei Chuang" initials="W." surname="Chuang">
         <organization>Google</organization>
      </author>
      <date day="21" month="October" year="2026"/>
      <abstract>
	 <t>   The updated DomainKeys Identified Mail (DKIM2) permits an
   organization that owns the signing domain to claim some
   responsibility for a message by associating the domain with the
   message through a digital signature.  This is done by publishing to
   Domain Name Service (DNS) of the domain a public key that is then
   associated to the domain and where messages can be signed by the
   corresponding private key.  Assertion of responsibility is validated
   through a cryptographic signature and by querying the Signer&#x27;s domain
   directly to retrieve the appropriate public key.  This document
   describes DKIM2 DNS record format and how to find the record.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-dkim-dkim2-dns-02"/>
   
</reference>
<reference anchor="FIPS-180-4" target="https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf">
  <front>
    <title>Secure Hash Standard</title>
    <author fullname="Quynh H. Dang" surname="Dang">
      <organization>Information Technology Laboratory</organization>
    </author>
    <author>
      <organization abbrev="NIST">National Institute of Standards and Technology</organization>
      <address>
        <postal>
          <country>US</country>
          <city>Gaithersburg</city>
        </postal>
      </address>
    </author>
    <date month="July" year="2015"/>
  </front>
  <seriesInfo name="NIST Federal Information Processing Standards Publications" value="180-4"/>
  <seriesInfo name="DOI" value="10.6028/NIST.FIPS.180-4"/>
</reference>

<reference anchor="FIPS-204" target="https://doi.org/10.6028/NIST.FIPS.204">
  <front>
    <title>Module-Lattice-Based Digital Signature Standard</title>
    <author >
      <organization>National Institute of Standards and Technology</organization>
    </author>
    <date year="2024" month="August"/>
  </front>
  <seriesInfo name="NIST FIPS" value="204"/>
  <seriesInfo name="DOI" value="10.6028/NIST.FIPS.204"/>
</reference>


<reference anchor="RFC2119">
  <front>
    <title>Key words for use in RFCs to Indicate Requirement Levels</title>
    <author fullname="S. Bradner" initials="S." surname="Bradner"/>
    <date month="March" year="1997"/>
    <abstract>
      <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="2119"/>
  <seriesInfo name="DOI" value="10.17487/RFC2119"/>
</reference>
<reference anchor="RFC8174">
  <front>
    <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
    <author fullname="B. Leiba" initials="B." surname="Leiba"/>
    <date month="May" year="2017"/>
    <abstract>
      <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="14"/>
  <seriesInfo name="RFC" value="8174"/>
  <seriesInfo name="DOI" value="10.17487/RFC8174"/>
</reference>



    </references>

    <references title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC1047">
  <front>
    <title>Duplicate messages and SMTP</title>
    <author fullname="C. Partridge" initials="C." surname="Partridge"/>
    <date month="February" year="1988"/>
    <abstract>
      <t>An examination of a synchronization problem in the Simple Mail Transfer Protocol (SMTP) is presented. This synchronization problem can cause a message to be delivered multiple times. A method for avoiding this problem is suggested. Nodding familiarity with the SMTP specification, RFC-821, is required.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1047"/>
  <seriesInfo name="DOI" value="10.17487/RFC1047"/>
</reference>
<reference anchor="RFC3864">
  <front>
    <title>Registration Procedures for Message Header Fields</title>
    <author fullname="G. Klyne" initials="G." surname="Klyne"/>
    <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
    <author fullname="J. Mogul" initials="J." surname="Mogul"/>
    <date month="September" year="2004"/>
    <abstract>
      <t>This specification defines registration procedures for the message header fields used by Internet mail, HTTP, Netnews and other applications. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="90"/>
  <seriesInfo name="RFC" value="3864"/>
  <seriesInfo name="DOI" value="10.17487/RFC3864"/>
</reference>
<reference anchor="RFC4732">
  <front>
    <title>Internet Denial-of-Service Considerations</title>
    <author fullname="M. Handley" initials="M." role="editor" surname="Handley"/>
    <author fullname="E. Rescorla" initials="E." role="editor" surname="Rescorla"/>
    <author>
      <organization abbrev="IAB">Internet Architecture Board</organization>
    </author>
    <date month="December" year="2006"/>
    <abstract>
      <t>This document provides an overview of possible avenues for denial-of-service (DoS) attack on Internet systems. The aim is to encourage protocol designers and network engineers towards designs that are more robust. We discuss partial solutions that reduce the effectiveness of attacks, and how some solutions might inadvertently open up alternative vulnerabilities. This memo provides information for the Internet community.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="4732"/>
  <seriesInfo name="DOI" value="10.17487/RFC4732"/>
</reference>
<reference anchor="RFC5598">
  <front>
    <title>Internet Mail Architecture</title>
    <author fullname="D. Crocker" initials="D." surname="Crocker"/>
    <date month="July" year="2009"/>
    <abstract>
      <t>Over its thirty-five-year history, Internet Mail has changed significantly in scale and complexity, as it has become a global infrastructure service. These changes have been evolutionary, rather than revolutionary, reflecting a strong desire to preserve both its installed base and its usefulness. To collaborate productively on this large and complex system, all participants need to work from a common view of it and use a common language to describe its components and the interactions among them. But the many differences in perspective currently make it difficult to know exactly what another participant means. To serve as the necessary common frame of reference, this document describes the enhanced Internet Mail architecture, reflecting the current service. This memo provides information for the Internet community.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="5598"/>
  <seriesInfo name="DOI" value="10.17487/RFC5598"/>
</reference>
<reference anchor="RFC7208">
  <front>
    <title>Sender Policy Framework (SPF) for Authorizing Use of Domains in Email, Version 1</title>
    <author fullname="S. Kitterman" initials="S." surname="Kitterman"/>
    <date month="April" year="2014"/>
    <abstract>
      <t>Email on the Internet can be forged in a number of ways. In particular, existing protocols place no restriction on what a sending host can use as the "MAIL FROM" of a message or the domain given on the SMTP HELO/EHLO commands. This document describes version 1 of the Sender Policy Framework (SPF) protocol, whereby ADministrative Management Domains (ADMDs) can explicitly authorize the hosts that are allowed to use their domain names, and a receiving host can check such authorization.</t>
      <t>This document obsoletes RFC 4408.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="7208"/>
  <seriesInfo name="DOI" value="10.17487/RFC7208"/>
</reference>
<reference anchor="RFC8301">
  <front>
    <title>Cryptographic Algorithm and Key Usage Update to DomainKeys Identified Mail (DKIM)</title>
    <author fullname="S. Kitterman" initials="S." surname="Kitterman"/>
    <date month="January" year="2018"/>
    <abstract>
      <t>The cryptographic algorithm and key size requirements included when DomainKeys Identified Mail (DKIM) was designed a decade ago are functionally obsolete and in need of immediate revision. This document updates DKIM requirements to those minimally suitable for operation with currently specified algorithms.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8301"/>
  <seriesInfo name="DOI" value="10.17487/RFC8301"/>
</reference>
<reference anchor="RFC8617">
  <front>
    <title>The Authenticated Received Chain (ARC) Protocol</title>
    <author fullname="K. Andersen" initials="K." surname="Andersen"/>
    <author fullname="B. Long" initials="B." role="editor" surname="Long"/>
    <author fullname="S. Blank" initials="S." role="editor" surname="Blank"/>
    <author fullname="M. Kucherawy" initials="M." role="editor" surname="Kucherawy"/>
    <date month="July" year="2019"/>
    <abstract>
      <t>The Authenticated Received Chain (ARC) protocol provides an authenticated "chain of custody" for a message, allowing each entity that handles the message to see what entities handled it before and what the message's authentication assessment was at each step in the handling.</t>
      <t>ARC allows Internet Mail Handlers to attach assertions of message authentication assessment to individual messages. As messages traverse ARC-enabled Internet Mail Handlers, additional ARC assertions can be attached to messages to form ordered sets of ARC assertions that represent the authentication assessment at each step of the message-handling paths.</t>
      <t>ARC-enabled Internet Mail Handlers can process sets of ARC assertions to inform message disposition decisions, identify Internet Mail Handlers that might break existing authentication mechanisms, and convey original authentication assessments across trust boundaries.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="8617"/>
  <seriesInfo name="DOI" value="10.17487/RFC8617"/>
</reference>
<reference anchor="RFC9228">
  <front>
    <title>Delivered-To Email Header Field</title>
    <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
    <date month="April" year="2022"/>
    <abstract>
      <t>The address to which email is delivered might be different than any of the addresses shown in any of the content header fields that were created by the email's author. For example, the address used by the email transport service is provided separately, such as through SMTP's "RCPT TO" command, and might not match any address in the To: or cc: fields. In addition, before final delivery, handling can entail a sequence of submission/delivery events, using a sequence of different destination addresses that (eventually) lead to the recipient. As well, a receiving system's delivery process can produce local address transformations.</t>
      <t>It can be helpful for a message to have a common way to record each delivery in such a sequence, noting each address used in the sequence to that recipient, such as for (1) analyzing the path a message has taken, (2) loop detection, or (3) formulating the author's address in a reply message. This document defines a header field for this information.</t>
      <t>Email handling information discloses details about the email infrastructure, as well as about a particular recipient; this can raise privacy concerns.</t>
      <t>A header field such as this is not automatically assured of widespread use. Therefore, this document is being published as an Experimental RFC, looking for constituency and for operational utility. This document was produced through the Independent Submission Stream and was not subject to the IETF's approval process.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9228"/>
  <seriesInfo name="DOI" value="10.17487/RFC9228"/>
</reference>

<reference anchor="AUTHRESULTS">
   <front>
      <title>Reporting DKIM2 Verification Results in Authentication-Results</title>
      <author fullname="Bron Gondwana" initials="B." surname="Gondwana">
         <organization>Fastmail Pty Ltd</organization>
      </author>
      <date day="5" month="September" year="2026"/>
      <abstract>
	 <t>   DomainKeys Identified Mail Signatures v2 (DKIM2) produces a
   verification result for an email message.  This document defines how
   that result is reported in the Authentication-Results header field,
   registering the &quot;dkim2&quot; authentication method, the result values it
   can take, and two properties which identify the signing domain and
   the point in the chain at which verification failed.  Diagnostic
   detail about each hop is carried in a human-readable comment.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-gondwana-dkim2-authres-00"/>
   
</reference>

<reference anchor="CONCLUDEARC">
   <front>
      <title>Reclassifying ARC as Historic</title>
      <author fullname="J. Trent Adams" initials="J. T." surname="Adams">
         <organization>Proofpoint</organization>
      </author>
      <author fullname="John R. Levine" initials="J. R." surname="Levine">
         <organization>Taughannock Networks</organization>
      </author>
      <date day="21" month="October" year="2026"/>
      <abstract>
	 <t>   This document calls for a conclusion to the experiment defined by
   “The Authenticated Received Chain (ARC) Protocol” [RFC8617], and
   recommends that ARC no longer be deployed or relied upon between
   disparate senders and receivers.  The document summarizes what ARC
   set out to do, reports on operational experience, and explains how
   the experience gained during the experiment is being incorporated
   into the proposed DKIM2 work as the successor to DomainKeys
   Identified Mail [RFC6376].  To avoid any future confusion, it is
   therefore requested that ARC [RFC8617] be reclassified as “Historic”.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-dmarc-arc-to-historic-01"/>
   
</reference>

<reference anchor="HDRMAINT">
   <front>
      <title>Maintenance of the IANA Message Header Field Registries</title>
      <author fullname="Bron Gondwana" initials="B." surname="Gondwana">
         <organization>Fastmail</organization>
      </author>
      <date day="4" month="October" year="2026"/>
      <abstract>
	 <t>   The IANA &quot;Message Headers&quot; registries record, for each registered
   header field, the protocol it belongs to, its status, whether it is a
   trace field, and the documents that specify it.  Many documents have
   added entries over more than two decades, and the metadata in the
   registries is less complete than the metadata those documents
   supplied.  RFC 4021, which performed the largest single bulk
   registration, gave IANA an explicit status and an explicit
   specification document for each of the roughly ninety fields it
   registered.  Neither was recorded.  Those entries carry a blank
   status and cite RFC 4021 itself in place of the specification.  This
   document updates RFC 4021 by directing IANA to record the values its
   registration templates supplied.  The &quot;Trace&quot; column, added to both
   registries by the revision of RFC 5322, was deliberately left empty
   for existing entries so that it could be filled in later.

   This document reviews the definition of each registered header field
   and every subsequent update to it, and gives IANA a single set of
   instructions for completing and correcting each entry.  Each
   recommended change, and each decision to leave a non-obvious entry
   unchanged, is justified from the instructions or the clear intent of
   the documents that defined or modified the field.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-gondwana-email-header-maintenance-03"/>
   
</reference>

<reference anchor="DKIM2BCP">
   <front>
      <title>DKIM2 Best Practices</title>
      <author fullname="Todd Herr" initials="T." surname="Herr">
         <organization>GreenArrow Email</organization>
      </author>
      <date day="9" month="September" year="2026"/>
      <abstract>
	 <t>   [DKIM2] and its associated documents describe the DomainKeys
   Identified Mail v2 (DKIM2) email authentication protocol.  DKIM2 is
   designed to address shortcomings in email authentication protocols
   and mechanisms released prior to DKIM2, specifically SPF [RFC7208],
   DKIM [RFC6376], DMARC [RFC9989], and ARC [RFC8617].  This document
   discusses best practices for signing, handling, and validating
   messages that carry DKIM2 signatures, and for interoperating with the
   authentication protocols and mechanisms that preceded DKIM2.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-dkim-dkim2-bcp-01"/>
   
</reference>



    </references>

</references>


<?line 2589?>

<section numbered="false" anchor="changes-from-earlier-versions"><name>Changes from Earlier Versions</name>

<t>RFC Editor: please remove this section before publication.</t>

<section numbered="false" anchor="draft-ietf-dkim-dkim2-spec-08"><name>draft-ietf-dkim-dkim2-spec-08</name>

<t><list style="symbols">
  <t>Switched to using "pure" ML-DSA-44 and specified it properly.</t>
  <t>Signatures now have AND/OR algebra. Inconsistent text removed.</t>
  <t>Hashes now have AND/OR algebra.</t>
  <t>Clarification on signing non-value parts of a signature.</t>
  <t>"Validly Signed DKIM2 Message" renamed "Fully Verified DKIM2 Message".</t>
  <t>IANA section added.</t>
  <t>Changes to the list of ignored header fields.</t>
  <t>Clarifications to DSN validation and constraints on creation.</t>
  <t>Multiple other improvements and corrections.</t>
</list></t>

</section>
<section numbered="false" anchor="draft-ietf-dkim-dkim2-spec-07"><name>draft-ietf-dkim-dkim2-spec-07</name>

<t><list style="symbols">
  <t>Removed donotmodify and donotexplode.</t>
  <t>Added the composite PQ algorithm MLDSA44-Ed25519-SHA512.</t>
  <t>Required From header fields to be Authentic.</t>
  <t>Outlawed duplicate JSON keys.</t>
  <t>Added "u" steps in Recipes to handle non UTF-8 characters. Also
added patterns to the JSON schema to aid validity checking.</t>
  <t>Resurrected tag=value definition.</t>
  <t>Substantial rework of verification text to ensure it only
states how to check for a Validly Signed DKIM2 Message, moving
consideration of what that means into its own section.</t>
  <t>Rework of several Signer requirements, tying down several loose ends.</t>
  <t>Substantial rework of the description of the relaxed domain match.</t>
  <t>Substantial rework of the description of DKIM Replay.</t>
  <t>Chain of Custody checking now deals with null MAIL FROM and nd=.</t>
  <t>New glossary entries.</t>
  <t>An EAI section has been added.</t>
  <t>A security considerations section has been added.</t>
  <t>Multiple other improvements and corrections.</t>
</list></t>

</section>
<section numbered="false" anchor="draft-ietf-dkim-dkim2-spec-06"><name>draft-ietf-dkim-dkim2-spec-06</name>

<t><list style="symbols">
  <t>Corrected mentions of non-existent PERMFAIL.</t>
  <t>Clarified that PASS (etc) does not mean a message is valuable or
that modifications are benign.</t>
  <t>Added instructions for Verifiers to check for DKIM Replay.</t>
  <t>Tweaks to text and errors relating to too many algorithms
or selectors; or for when signatures/hashes fail.</t>
</list></t>

</section>
<section numbered="false" anchor="draft-ietf-dkim-dkim2-spec-05"><name>draft-ietf-dkim-dkim2-spec-05</name>

<t><list style="symbols">
  <t>Updated list of unsigned header fields to align with <xref target="HDRMAINT"></xref>.</t>
  <t>Added sha512 to allow testing of hash function agility.</t>
  <t>Removed <bcp14>SHOULD NOT</bcp14> for speciously added Message-Instance fields,
we now just point out they are pointless.</t>
  <t>Added text to forbid repetition of the same hash algorithm or
the same Selector in any given header field. Provided messages
for reporting infractions.</t>
  <t>Now specifies that header field names in the JSON Recipes
<bcp14>MUST</bcp14> be lower case; and Verifiers should now report JSON
issues specifically.</t>
  <t>Made Capitalization Consistent.</t>
</list></t>

</section>
<section numbered="false" anchor="draft-ietf-dkim-dkim2-spec-04"><name>draft-ietf-dkim-dkim2-spec-04</name>

<t><list style="symbols">
  <t>Provided summary of unsigned header fields.</t>
  <t>Added text for situation when the highest DKIM2-Signature field
of a message has an nd= tag.</t>
  <t>Added text to clarify checking of Message-Instance in a DSN.</t>
</list></t>

</section>
<section numbered="false" anchor="draft-ietf-dkim-dkim2-spec-03"><name>draft-ietf-dkim-dkim2-spec-03</name>

<t><list style="symbols">
  <t>Move list of ignored header fields into its own section.</t>
  <t>Added the experimental Delivered-To: header field to the list.</t>
  <t>Remove possibility of a null Recipe for header field changes.</t>
  <t>Add nd= tag as an alternative to mf= rt= for imaginary hops.</t>
  <t>Change DSN propagation rules so that a DSN always contains
the message headers up to the point at which the DSN creator
saw the message on the outward journey.</t>
  <t>"feedhere" flag added.</t>
</list></t>

</section>
<section numbered="false" anchor="draft-ietf-dkim-dkim2-spec-02"><name>draft-ietf-dkim-dkim2-spec-02</name>

<t><list style="symbols">
  <t>Made explicit that base64strings must be padded with zero bits.</t>
  <t>Fixed header field description in JSON to be single string and moved
the removed info into the textual discussion. Removed the z body Recipe
since DSNs do not actually need this.</t>
  <t>Added text to emphasize that semi-colons are (easy to parse) separators
in Message-Instance and DKIM2-Signature. Also fixed the syntax for
extension tags.</t>
  <t>Added Authentication-Results to the list of headers that are
excluded from being signed.</t>
  <t>Added text about what donotmodify means and added text to the
verification section about this and the donotexplode flag.</t>
</list></t>

</section>
<section numbered="false" anchor="draft-ietf-dkim-dkim2-spec-01"><name>draft-ietf-dkim-dkim2-spec-01</name>

<t><list style="symbols">
  <t>Additions to terminology.</t>
  <t>Improved ABNF.</t>
  <t>Removed definition of tag-list and placed relevant text in the two
header field definitions. Untangled the description of what needs to
be verified from the description of how to verify and provided a
list of human-readable strings to generate for errors.</t>
</list></t>

</section>
<section numbered="false" anchor="draft-ietf-dkim-dkim2-spec-00"><name>draft-ietf-dkim-dkim2-spec-00</name>

<t><list style="symbols">
  <t>Removed JSON for hashes, signatures and SMTP parameters.</t>
  <t>Provided valid JSON for Recipes and added "z" for truncated body.</t>
  <t>Changed algorithm names for signing.</t>
  <t>Simplified the canonicalization performed for the header fields
signed by DKIM2-Signature.</t>
  <t>Changed v= to m= for message instance numbering.</t>
  <t>General tidying up of specifying tag=value specifications and
associated ABNF.</t>
  <t>Various other fixes for issues flagged in WG.</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
WgHX/Rdr5ItvbzD7BfNTQoxHXRbZK+z+XYSI+zn61G3/R4xVaW+uPXxwRtHD
X8Zf1e1rPV8UK8MpMd4loDNddEek+1ZsV6vWCIJP7137WxvfAJh7a50+I+4b
2/vwe6C59+F82j/P8Gf59b0/Y7hAMe1Gq9XaZp1HWlVpayNzvDJbz+/d3+5S
dxf7ESYDUeDxbc3FpLuMEXi6i3z4eMgTew5s8MScT8X+mfbN2T+PoulFhsZC
PJD5ervGo9gmNGsBnnkmjRzjK+kn+9jzwpfOdz3txts+H7wf7z39S9BPM3dN
i9fv1GPM3OOd8qla2Trv3YG/xR4tftketfnCtll+N8FxD26yP0d/mw1Z/B02
5CVc/W/Pn373d92U7d9mU9iZ/Hfflu1Xb0v0+b3r+yW8Mj2xHb46XxUSlIyy
W/apGZul5dEbVHOeP+0XCdj9Hv8GSmXf5Qq7SRYr6u8/3/3nf1T/Ubz/5h8G
+y6j8OIPdufwPB6lRVlQUoWglmG2hMzt8AyAB7PG/6TgWHH8kRv5JdM7nfzf
6eTPdybf//Pt99+cfL4zPv7yDx3Kar00nH6+92X0zfXPvfvPk/ff/GX6zbvT
f724en9yQn8+efbiX9/+fn7xoayv7oACdzLav7Yu/O+Xdjx8KwFuyfK3yL9s
Nckp/t/7zemJM3rCtYBVxHxmEMUt46qiXECzK/RgccAHtepEmNeESIHIDUYj
Xgj6hrxbQ+EYEk4wsjBDeBldvYzMF0QKws+I57Ut8v/amkUHddpA51AbU7VF
PBcvellETQhEGoyOglnaGQtRYAtiNQp0DEk+ASIuUCPZfgvMjnrtvUVzUoLh
/VocvYz32JROXuSpFOygOJNUAhgcDYzNwwQgQu5tik5ZItuehIE50+RHECoJ
OBp4ADmaA1aieadB3kTq4S1kz/AJRlVPhHYdo2ALgDt/J7MNUgINKrGMMk2U
DYWDxIAe8kFbRkJsW0oVCo8CHYAnsO6IIU1s1+BkFgr1dLQE7GwFtszoeXmQ
kNKL4pUSbB4+y2qsztSnsRThmkSTJVqW8CXKHuRxDMK4JooND/JTKdjdMqC+
BGZhPmL4FoewO/RT4cVCFvGfgPQ/Yoop2wklM1Z9wHPJqm91baZGPwGLseNg
BMxc4X3OBDNY50tNGFiTZg0JtkeBNSFgD5FPu7yutwQ3NU81HitW99l0FINQ
RlHSLs6GDhVZZT+43PImR8OhoZVMcjgFtE1e0jKY03olm2f+WDmObSubJPEA
61pzAHDMScMdQVsdUDEOKCJjOSbQsNKd0zMwxEgwZlRszaYpjNi/nHJIExCg
pmpRLIZ16HoYVbRHykGf+VWG57NF9yySEcZOhT6sK9pc5XPEeCoZJCgy8cJZ
q9LQGR200w2Uc1cM96aHKrkqt7DG9Xa5pC4CDCdvtJKkD1YgKWIgfkbQ0kgy
7KBcpBLwr9UeNICkBcRhRiexk7ftnXpDyKgojlObDqko9MOzF89M9gIhuHB1
KRjikQ3DgL3Iun6VGkBbmM9fs5senRpTpytkqXjKk4g1Fjt/I/dhM8VhGF8o
A25P3AQSmbY1Ms7KZmlEKJ3C8rC/k+IHfGAYLM0CRx4cmC7yR9OG7nA9tg+k
4qVnbkVJ+KomNrSZSiOJdBWjrxelC1dRN6odef1Te9frqG2LrlHIg3ayuVOR
usouEMwRuQpwtWkS7ZQcBx/K5FfehStvQJuzTNNh+rduNDVMGhdY6MPONPJl
zc4CckLReXu27HW6yMWpr+1bYbgk+s9R2vQ06qHKq4yFS9tVPcl8hvlq7zag
lBcPy4XDyhGOb0Mwdjw+4gYoY4mvuT0yHpSjQbH7iw4mvdU2f0ck63Hnfuq6
MATMAHG6mgYu3u1mkAwpaHFDUH2ZBKYzMTq1YbJiPZKEqJyxadKdAEdcpSur
9BEfGAuda8pNOxrI4AQXvYeNFopxtjH1JwYo0XwPvAi2iCdmgI14w3uRtZ+A
dBGOxh0AtCB7gqI9Og2MELLpo225s8aO+cYHHkpY5+ed+Sg35BGTWBeFOG0L
vvzdUKi64AAMn5jPoZx+F8ZE57J4m8tdbQCBclJJbjAEwTZ5ObkcMdLZ6rlI
8B1jDfLkZDYtR8ncIvr5jvHaFnqqfCKyC8gvY3QRrYoiuDA9xZ9ErqOldvDX
Ku88ZyUSFCHG0/2TNhZ13ockFYFSAwt9iPf3YC73/6XkQdASfiYr6X+8I3vs
GEn2P95/Ybm79ypz/mwbfdBRCA26LELXcPOOAw4kS8Rh/vw4y42wzSS32wgD
/TKt5xkHndteOP35gpYnyPzDrq3JlMIXQQCgt7VtTTvP6z0CR9BIyM0lMy0t
BFPcRk+ouiZNEiDi2OLY95ztvG4vCe7Pon9/FrQ/A+rsCE0q9Ncx/DWdTmmz
kCicKj28EszUqYZZgHkoNeJKEZMaAu3pk1cC8EfCbpQbYMOhGvwDQkvgTJCg
7Wt/TMgqYYoYXQ0628TkeVpMhDY2TD5NVa6ysHqdXMJ7kpJHLojRKVCXgFe6
2jxCuFQwWtRuJNSZ7BY9LDoghyBZxwsT7pAGndAF7+ceXI644gS1QqwgX1PB
tAbd/gy50T8QycBYEfc9jTRpRfammJMI/CQQ+AX1hBY8VJAN78BylxKrkzYz
zUhlYtAlpmIbwFF6SKGgJz2ZDJQm2r/XTuzkMn7OMrIY6H6w8lRfkpYSq09p
SwmhRA+vQ6q85ESxpkurodmg4aWrPBqCD4sFrAuFDknQhCg1PtSDgt+/Rgsy
eHd8nWkdh/8L9BEX6CMdCX32V0voEb5nEqvegR1O4b5qBVVA5QBV59lATp0P
ahaBMxgc3h6wL8PGoJZg8LLoIxuoiYGuTwzkWIg+xSWIv269ojFYkkRjuUpj
hqrNPMyhQDMzyjmD3GRYqkUssMK9tDAnHjDNjKaIMDG9jCPoOzWaYMvO7GAC
0gkcBTnIlsPHqoo0PYXVh0X80YTVlryLAuiivCquFXcjKWPE7I2hn81LoULx
MORNHlA3QNkVcCXWNb2p0e8m6T1xly4SUX+p8OWldrdf8uKFCiUuSm5IVOLi
9/8XkbRCgpaRdWSq8WGhKukKVe5rhKpkn1DlbiJU/TdITp01+UVSE75IQhP+
cSOZ6ZIkJRJubiTZRBvwNxUWcCkcDyXs6P/vIkB4//43CACGGhiWM/58S8iR
xdMwkC8GWhrwA4PeqqcG7eoi4vZAPQH6YRZKwqEtHo/k5YlmvF0HEazenINP
RbHfbPdQ2VtsH2px8msy9neF4U2GD8lFG8jwWLGoP6KdgelYsm81S+h0HZAi
vji4wvLSB07H6s46o4B4O1wBzjunRvqAa3ZQiByTU155XkzoMBNqYfLi2Ysn
nDXS/GC5LOnKUXfqaU2XS4YIRWghfEF831MjKUpJv7RKKPiQ41YD7ozOJ+/k
UsRxPSYCXsMrwJGRfrXQQhwuuDd7SKqsVpD7pzoZMCjlgM8KBq2eIug4sR+R
Mpq2FSsm2zBf4LQIXiWt0GQKRKhTjw5JEmz1Sw1Ri8UJA2xA2EoRah0LtVpK
G3EdFOCOuGKr7o2gehvHpEh7NilhS4Nv8IdBz7yoA8I4VoAhdBzR0+R9kmBy
K3Mj4reyHO7XahgR8/aSjLjdvaIdgcMNVRAjRU9VUT1R9oHOnBtGAxR+jQQ0
sn5jSIehJCWOGD6JMP0IA3poEvLIs3LtfnDpU2rx80GcLKNMBvIQQeq2oiXQ
BRehynW0e0cDt2ewsHueRdUiaEA8RCv9JvO8rbPq4yMxk+swlNCI0GfWpBeM
E1JcRUGpnqmiY9GpFVfjpUJ9Uz4pBR7I8FnIIi8Xug0MpD2KWlgwa0elCmbK
GOzShveXEtxvDPTbWPqsObtygeedN4wQ+4ipppOmK/6WoV690W98840k24XC
PNixQgl3ptEIRSaDs7c//gv0+DA5nT0iDXBQb0lO5m94JG/JENwdCHK5vNjy
Kgv3aQHhwCDMXNyq0Dc2aZ8iEZSRoMgELy/sfemllR+td/ywUdMz8Q/Fnq9D
WFxs5eez12EEjC8Aq54oXEpsAhlZK06FImOgDRSN2fdhT/ewpe4oeRWfWQJK
i2CxjJJCQLUcVpwA9HPP3R53I6xnlwzap34gOUuDVjp+O4/MlmZfLlloDe+5
8Ty/S7xPzvxx2ACdwIPQ6pLuE2T3tCKGsJk80D4KSwdU3ztoaHLLS2nesGoX
vq7560jMsb84xI8PStzLmaSMKbQkEM9qHU9PdRJjV1asSCMEchDeQF2I8+Ps
NRG3/jhN2g8LVC/NLmHAARHoyZJLd3JKpxxvYgVb1TQ4HuRjuL4awvZotx7T
LSkX6u+JPQfQQUDE2iCQWqvBCvPIKI+rM0qWiFYlHWcBEOklY7pNzUXXc5AY
/Y+YAtq3DYzEyDfwl8JoXxPASvfE9SjTcnhJ1rQ5qyEqr5Ih8dIJMtPFqIcf
yxkP7HqhB7k1mWtceti/GdO6Ir/pFcE1ZZb4RrLsOFzEk3FLGWlVCxqbPICr
L/2zn7Nb/mm7oQKMQ5sADYHsYZYZRSc1eksNRlrwKg5V+TIaMa/jkn4I7EDF
ZZJ6ewHCmymShPhABU6rbEL94kutNVKi2+nlGqZYPVtquUoKxmLpkC5xaMho
YU/MS/9+JUOW+kqOUe5xH+5jmIGYIvbTXKqeSu4twzfV+Qzk52aneqlUAPJF
l2wl5OwZAhoXR2zXntTKhGzDVHPtahdw68AprlULrcQnaomaQ70oOSs+hDHm
s6Da8BDlETleiIUFwmNBmk6Xsr10qdBW/0e8/qvFa/UKp59gAaxaJCJie1i/
z7fkgQk/MKEHvii278F31WaCJvMaQyuBHjfbCgNqzVRryARU/0vMp9120nq3
hoNfYZUXjrh0GEVKsFCRa3AjZTeY55k5bEB28UEyfA3Xwhov/qMRQcCYljeo
qSxF+MjxSIgtzdcSSaKFmbq1cgIoVcrSRgmEstSxOEHe1NlqSRGIhDtBK6Jg
STWltiukgGLaYOsfsgCUg5KgI1w0IiWMB/VNjdn+RZ1IuLEecjdACWCeTbTF
QQDyIG01wEz+HLYnUZ0kZuNBuCqrD1wGBPOuefd0kWy/uPAnWxLb5W6bwLml
qpJmcWuYa4jB7pHa2NHAsLKYysvNlxM0lMKpGAiiFsVBfsqwPvU5MUK/YjIw
FTAG/OiA7EXmOYpxjOhWRQt3iI2VAKVIsVuyYjRUI1middFFlF2BMErWscF5
uUmeEyIYk0otid7wLPvwY0qCtfyZVqiJVvSSgx35YFTNCYmRyxOVRUgw6ojQ
UVhZaOD1hQDCevVZEqSJaKlUPwREM1sHjqFdIEKIWZlV9re1r9h2PXNZrCeI
efr1DGVZbivjJg+dO5omnx/ems8n0OSXBONsa6xNQxId103SfQ/qCCLjgUO7
9mwIoz9rlp47dcHI9Ydlh6O0bPGQKYPzBIsSYS3iDmn6OoBOwwy2kfZOnxrw
+HEsC+Fa5SdHh5UmMcJT1wgaWqDtsyaY7SQ5/GpUjpMqxnDEWlIsyFQ9VWnb
y/bXlBdik6yedAGMU0kbW4LjnSF7N1iUJDGx2dN6VLfpGqWR5y9ZPOSebjhy
msmKhMntxSX6mpsrBef2PXFUjBVtk3ZaNbiwKpjkzJgj9Br8PG7nPOoLxuIv
JgPuM8LXRCc6Uk3fS8f7V8x887/69egGKyBdtS644eJk1F6R/Wtha/61K9I/
uWtWZHF4QU4PU0mLsonVord7eaKYLgkNi6j+9CDt7FkzpZybrNzeNZNG/n4r
J+3S0G60kVGwtTAdaUi0JBJMZBh4ZcINmi6oTGU4EI+Uyc5hdsgHo665/Dmv
nL2pcd3r9IIKBUwuyw0FduvVsF7y1cB6pM++MDvsQQ5Ghi6KqWYKOLTvfQib
QD5GDKQkWK06YfZDoDhxHbTrufXRQpvTyYJTcEGNoSuoheWxmwd3OSxFh+38
mykep4JUf02xiirr7csb4MLu5umGhGKsGBRWdttTjdBfbkNL47k5k4xIWq7N
NlX/fNnh88Yf4StkkSha5SwtDJUpSOgTK39EAHJrRbKJ4KovmOTOI/t+ek3x
Shk904IaupxcOAR5osTUbUeVvE5OhZacxOteAJpNLmPn1eEa8XykDBluguPi
IyXbxCtodrneKV7LjA5yIj67i7owuc7qKNOqPj57qeNk9QbGp3sB3V1YgcjO
Uqg7H5FFmfChKVMlRfTs4dkiGQeWECZtxpvCVNEiDHtv72nAqX1L15143fu9
PRINUEspJ13y+I0S/PpyQ9cJj2TyWuqy+PJLWLj37KWCgVGWM/VDfgiE6MZx
LU5+UPtaVUtL9lbe9Hi+cOn54m1Yo+Ct6+MHAcnhSsYEJibMDk8wu22HvkBh
eRxDmR7WQW6kp5CzOGO0UZGiWUN5Jk6AZaiOiSVIDDMSg+qpxOy9fgzM20TN
XnjQdkFyFEINLEJ++QI5gYzuCJSVbOF0rzhKi1hIrTWyltieUtP0K6cQj4am
wVCyTPOydqF2bVtkWp7x20yiaAgPEV/fUNQdR6CsKQRjnFCHG91eLL3jC5Zi
S7+xGmApelrILApa+4esqUet+Acdnha6HmZTkP/++KtPv3l39P3x9M70eHr0
/td/JDjKAlU/P8wYQ9fnxPj4J1SDtquwVjBJOUm9K5r0k+DKRsuXeYhNXOWV
901pGeG0yulMVoTPKmu85XB4XSFJ+9lW84wg5ck5cTSNnBNkFsbBDFF/xWC/
UUvkCc6bCDT+RPVQKxqgGgMnrLdzFLyWW63JyzF4PA7CI8XKDWOUJYJ+JOKO
JPNFGVuRAtoM3g+8sats2VB5X0adJ+9E4J7CytmlziTOFedgWuhwxAwnnjm6
lPD04B2CkXJ32aaaXpxQicHkeV43GGoGAgQRNnpzfYk+qQotpWQH8NAJPTVQ
KpCj21ds5mAd6nocIpR6sHxv4xdAYEf3poccH/niiFxjo87IsozgpxICKfuA
6yPRVRpUlbqo1IhP8PCJ+D2BMShbkfTizW90GgRdRAL+MASffBPijlSv41PK
OlvtmMtTaVNZOwahSBms1XNg0iDSiwnuBBUmxQ8kW30zTAY/DPznUfKOvnhv
79DXvpgpfkUzCUqJ2g/Mx7ioqb5PD1tlUi1JGlY0xfKp9DTGUtH/4Omjb4b/
+On4aHIXH/3HT3cfTb59MupF3kmSH+j+PHvy4tmjV89fvbSueTg4dG4bJgvN
/kzVeWGMI/52FCHlxO2C2nCZUzUzfAt3hSAB8LIGbcvK64AkFSb347MKcUxR
tzsxdFWEdw9Dw+INz+LQDzRPUSfmIMa1Vb6Nv4gni+hHgkMoePmHgeXcQnsu
vFN+QNRWBnegQZEVKr5yqKIG+qkww+EsW+fsSB5Cs6OQXVgodDmfbys9pUjI
EkdJ9dwc+ySlKnNtFCS3WG3td6NElEAdXfEMeaTx60aINApmoMFtTEeAad8S
2RktwNmbeVgOVco2xKU2PQ6G+BBcF5IaA343WPoN0SP8sMLgX+QysKR/5gAm
j9Z82gK3US8GckPPPOmISul2LpbCAMRinXd6pEhUMSJXX1lYV9Vs9KezmkF2
BR+QsOxFYuRsjWrHJaNyxpjtNCWbFw7focuT3C2oI1J4E88oqC5uEJ3+MFrs
u1+Xc6wcS61xfoNA7LA9NKFf6Q5dbPn61/q0MUF6PFCJJlFy+oHrzSOhEisi
HzfTcJzRzsWGUOGr/NscUk4x4DpUzgOnOg8aLCqGU4m/CW01pSR18Jk/LVz4
ApauyOc5R9KEMPLSrJYZrv2JpTaCRluxwggUL3e41q3S08lCGAX+ZU6BhlkM
S5swIVuJmtae72YpLERPWjl41+lFSyv6ACQ4SDnCoFyIu968rwfjuBG3YylP
6AMUqn74LUWLkupoUmHKoLqlJo7lpnEqCj8r6ZOICfQRxCiE2pfiASEWhjM0
ZSMBUtrCGFrEtV7jHvgMnOvnS3HGXQxpkiac1h68O30w/VarD5JkPbp54y0G
Qw1//hxLaCiovCyJVHly0eZK6SM0likLcr34WTKo9QnH0p9wgx5ohJPp2Hh7
ojQcMPygHtE6n/AcSCboRPI9HPhLAxVa6JIVWTb1BWXAegXKSO+nMQvqMoZP
hSjEzKX9rQkStxa06ZS37FoNgyLnmrlMGqcxn5BaxSDiMQsOp0WgYV4RY7CD
i3RDF4PxSos34AYlOYdAmq6zSMb7sJ7gTtE+/GM9WA868t/RNyTQ0UbAvu6D
2zVADE0ib8Xki53hxEsWErPSBnlq4UnH+aFp40x1wl9tNGQ8swzlawejkCOa
VififQCFTVbBeKmqaKmqcKlCXYFW6pJJNszRMfU/XJDLcEGUN4VxlXXWWMl2
zGVNqQjIAsUV5Xx7SqnTtTj2oClB3Co7vig91X8bVDju+NVFX5omj9qxufC4
0zyrVtGmz5/jpKQvpvKHRcyrzMdRO3orqP9ORbdLq/LEtZzkV5zrBQeLxQGI
eKlZlXse29htJQTMu7ODisp8vVkh6DAx5SAjoLySVmXmg+g6LpRkDrKAH9T7
EG7IlURSuJqhb2DFr9QGsynzoqFcRgoulthhnq63YkheQI61rbN6u6YSExh5
BIKJlNTEfDUuL61BYohng2V3iRZVB6DEkcF4oEgnF6AEbST8aENFoEhAkxKz
l/a+LC4/jg9Ok9/i31J9LWr9LwMlGVdSNMJKzCt8+eHb1Anc5dyefY0cFAc3
y4sFB6i6BlhwwwUMCmp6iDFF49lf5nFrJDFzbt6Mv8TgOZIvR4qOZCkSauS1
8G3SCwOasJWnfeTRO2PVPFQ1RiuNYmGcOAsHLWJOkfJw7GIXaPzZCEAKA2BF
GyjsOJGiVnEoGXiGCpr5EVxdkty/pHT53azKFwO3h71wDISNaTzoYnvhSrrW
eSeqtDGT8ca7R2k52mz3MmK7l90biktCF1pygz/wC1ItmkwE8tpf4tfgt33m
h5bNIKQ2e5cpPeh5tQp6xhRM3/M46hl/+9qeMS3FDhJ+6zvG5nzHoSXHipFR
IhF9tkxF/z6bc3iNpTY1Gmjow/2jY/zwaWJP8ntBqyfxFYg/WyfUbOfnoDX4
Gc1uohb9QGyes+QzraKh+sVB/x6qF/SAL0TdLoucM74qCd6tCzkJjOvBYw4B
avW6E8y1IGSYvP1cFGTHVbWpdBwaYLSyojsc1xPmSh4I/fnlikQbSuh/kuKQ
n4xBkgdtHP6/YCWiPqBEVJl+7cQ0GwS1aC1s9HqT5ZoDWsQaJZWusGWq49Sr
g8BWRkpIa/0jHaQfLPMq0wI/QW5OagKsIHglyROqE4hZM4ya8OwFZoZSZgFo
71fCrTkcHl0jRcNJPfk6hE1kHdXFrXN+fo52S1BPs04YCEX8S/E5EWpKNiWS
PrsBCsfmLZoVRn9yDEf948nd1jwMlZNqPo+dDBemNrcF6U8HIC8FmzFwJHdJ
KIcn2VmZs6CseUUt3e6gS/cXqnaHokr/FprdwbPep9i5SLFL/haKHRJ3Tvcm
MfT8sFon+nXHaX+tZg0jE4WCIys9rA2BL4sLpA1YQ+VavWHKmV7fm7ATlN1i
xJ9z21SNS6pZxPyq4bcjEFheciRFJ2zunEuM1+EgsVTzuDsbsPYbcI1eXZzA
DuMIOdSHV5Y8UWLlg8tfeCOVXNSbi9TXct9pacVLlySsKQ6sRBqzPIYpLtM4
bzZvJMbVkV2dgbBBvMs+GRB42qR4q5M10GKTrWLtY70UzxoYTY1ulMDkrrnA
4haxGxQd9IiWzXrfIq/n5baS82yFIXFZJY+yD58bl0IeJ8E/3XCVNpRLW45F
dqdS6r+soUc6USAOzph5cC8GIRevkJKi3mDi/jw9e/TsmYetQZ1QQVbMVdIl
mEIkXSKZoksyRCMTCwcLP8M73zy49zWuNViQgiGheLCCwGLDw+iDTzrtmsgU
LlkvSVHSWgPUwnwYP6ra0RY48IwY9BU+LJgSYgAylu84ZaVml1Ny585D+gfD
gf4lLbZ4qx2Nk6Pvv72jp/ft+SPu+c/AoKdBDJfjy0kAsJlMtlp9WgrnkC8Z
OAgifdIaaOV1a0Gw6LGKIxk1gA6WePHxAbh7NEGudPd4MuMvsVGGhulcjSIx
iW++AaLDjMOjO/95JIWs2XMx5MKnIFQ66uTenYS8lIZ5wxlxhgxCJgaOdiEq
/wSTIUisu3fH38LKnT4edcmsiRSq5pq7YcmXg4/vJH5wZXGHepulPBoNB1Bb
Fj7jA0h8K2ECdVr3N+quuLoxFmEmxwhNHnaSRGyUy30UWi0xqy/OT0NQOOvQ
CeAL4TcNfvXrQYR8JqGwLZ6VhDxLpNggrFcC99OuGTMowO3nXqETss4mIHRd
OkW+t2xBHMUnHzATPW0IAB6WT+RNFzhy+UcW09SGU6TIE+GurTXYrfcucxHk
GsUSWSBRB/mFgec5BR+49cTHJw2cyMWVt395t3c0o9BUpg333KBLJlW+Q5cH
La6kAqBJ+NHr8+T8Fa/ZsB79VfTaacxP8G9KsX8tbcHVjfrEDWkrfPp/Wdp6
M980N6ataEZ7aOtnSRXx0dxRbd/YhuzDZM2AJzqmQ2uxghWg9mthlvJGbUh/
ZumdY325lgtCMohoIhyY0NNSzqPx1ehTwQE79SIPxgtZ9iz0lGcdVEkxcF9k
BUdYjsmP4JjMuKIsxzHGBB/FLWJYHkwjrCuSJjMg6QVWp5lhTVqc5XA2n49a
oZK2IRYJ4IIF5YrJu75FUrlQXM5B8lIYmAHDmM+DHeMwMAtTDM0jd3uuw6rx
cnrV7OMxyTdDsicHX41Ydl8w35GoNA8J4sMeSMhBaf46dVZkWw0YDaF1zGQq
wHV9OXcYFxOQN4fFLPloZAvNqvQeED9kAVgoCHRUUoixzkOFMrokU/LDemJ1
HI9fnnH8BeOY87upMNUPDEyA6HKIJrqlzApLeZcWGRteVknsO9SLQldyWFDT
ekOCzRdGQ3tXmYRuMS8M85ORpeR5MYEXz9uXcl9QoGNn0hUoFe+Q5b0NKrve
XMOBJL5jUUaMwxwOeWxncQXFXrRFwqrfFrOqROxoD/IR5R0S6C+bxgQTKCvU
stEZgZxxca92TGtddWUR6SuLriDJmQl0TOSUtFKLQG8s53mq6EQyQ1NgnZQS
omcDxELGU4TmYCmk7BO5fTljGqguJFl3I5I1/fnrifYwzVbodvLhuhav0qVl
lrU5GTUu9bCH9uV56ZmNpMFhOdF3DAO24mWwdHiNKfSPEq643JU6JL/+HL40
BNbA8fc0QhSmRxyjKxa/RkJvKMX/kEwNYgfmUYzGfMtq8HMrP7hFdhHVHSa6
+sQkLSZxk+N6nfH1tc54bajjiIfjdJat4KYpud7WQae8+cFbA3MGctp1tLce
bTvb3efPhqgx8e6PX+pyx5Mq01FRAIkm/6hhpmTup2BAXUmhEi7O5WEy+Ly3
cbrxCK7K8gOsXffwOtZ044yaDyfBItoSaPaiNBKk97ed+XiuMNTMpnW9sz4J
nfWHbGvmq29tUq137eKvd8B/dRSEjUVjH3oiH+pxO/Zhmrzob0UasbgIv9JD
uPkuMT5JDOa+H+SkbF0bST9OV9rCeUVQ9i/ZBoVpM3jaCCvWzt/hMAQOcOG/
Mdzf3nNxaELZ2rda0Vj64hPQQOUfPBStkOyLVnA3jVZI9kcruL9HtILfdz+F
60IWPPX/n7gFvKjq8KKquxcVPqNhC/J3wmY5+tQftaA/3SB0IA5Z0BeDiAX9
yne6J2BBf/q6ThEukF8MghW0KelTD7uPVfA9toIY5KrG282LoBy1IMpbnU6i
0IVscXz//tH38ZdrEK/Te/fgU89kPk20VRd/TOIYBZ5pGKfQZByngL8EI21H
PqBUAiLVcgUStXNP8T9UQgEo76o0+JcfmNxEpOO0WKBxCk6WyoELUdZCbVnK
8gqUD1ncQ4yYUNYvBQ8IkxFcSsSMvjMUOOlti4UuFiup/UGpk+iXJ7PLNOHB
YzGriA1iilRac0Uu9bxz8sCEBQbxFVo/pUsXC4OboZUxqFKbA4VmEIqqMjV8
MMh4jxI0UHkV3IsM7hXCmSW/g73jg95xaTHDgOcCx3eAchWGog4esj7SUanV
ZhNfuJHNY8qqC3WYkz0GvfkV+yENrXPeKNKM4vcQAvcHSWX7/Bl/mvBPHJHa
OwvKKJEttFkss2wxg7Z0FiJ42GP6O1b6gpW+pNDZeLa8+wu32BLRm5NObjmj
BNHSpKazVX5VGZMpF0GwnHW6zhlsBAmRk6iwnq9+aWYfSeUMVjKdaY5C4acg
wrDkXDAtmPpAK4Fd7FsJFkGARV6/JE6WJDm8JKzAwKZhPHOeikus3MhS4Vyc
wcYCM5zh1ZJ/TOe7Cbqb5hS7LDZNvt4i0yWXgPA77GhxsCGVP+xdvxsMY4hx
OAvxxKNgZIeQ1eCInbCjWYxHGjH9MUtXmRUNkjVkF7SOpyfORj1OxquX/dch
PThBz/K+m2bP7eRfHMW90nfWq64YXwVGGHJd6LnvvRqC+6E1yvaXh8LZ9Jpw
t7rgEnVHroAVN0CN5POtFnCFc09aKdVMyWZ37Olh6GPDVF13i7zeMK3OsDb6
aS2xAhRd1ERohJyzZlKaeRmwakecq48kCsMF8Qn58WQipp0oU04dtFK/KK3l
JoLpr62mAJFzHw7HwJZmQJrdYTwSc9VIVng/Npmw3V6IyC+jCCQnni9rma47
Bj2RLcPXkjJGIwOSM/P/DbBM2MBls8N6kqCGNVQlYJGt2WfdGLo/cDSDVVXR
V62/jO8YGn26s4iwLEhih6ZrK7QSer/Ex65qPUd1UN45OurHXBnY/Gb5yVHH
DtkJGhirXgLkQGPT+t6dV1PJo+2tGhjEzRCwQ16TV5dgcjlkUCSnKiMM4bp/
MbSSgh4fOG8paa4zLBOIFN6GfL4OEHjsTO/CqMkwhons1YcDkAiMdx3gzUQV
klB5xspFFlzVAms5HCRlSBNSzwbnPHYtFArU/XpWada7FS7Yimgb+g4wdXFA
yhrj9Eop9uUo5E+OrMBcwJo/ex0wSAk9xMkLIOhoTDoqQ16E/FYqH4V3rmB/
dsaJwZAhWJiFbXJUgemybNtRmHON+XTXBvbdUpGFvX+12MWlKBAVbmBald+5
cUUjnYmhm4tMCj/gBl0YMkksZaeFcUi/kJTdMIBKfSfR4uS+PFJe5Bi+yuaY
KCLT1y/IGyAhINLFzrsbehSUg7jDtWH/haUu0J5HaLWhHLMtKC3mJoutRzTE
eMYDitB5TYAoAuLhpFxOZmRn4lJ4a05K/cgxm2xDabhihDuA5Qb64OmCsQB8
7O7hakiy+MKs8MCzX1f73b8FaFVbSuiu5cSqplezOdtyYbvVFpHv3oaViJlq
I2DetAFcvIRPflB8qVUrI6yU6qsmeWM1vdRbBr7V0v6aq76qo/mSVRLWSLxr
alPxxNBVZw4krtfzjFPLdLmjFSqrfXePdu8ucsFxYYj1MN8OFxODMkNQUFoD
CW2VkGw3XMOtcIPBs13uYApbEk/OuTNmcodbl73mdQxSQhleQfIqgyxOXSMq
MYE47wuxddtu+1pteCsFQO1fF9bbiYzAOFYNW+Fdd4SOJxdax/anY5fNtUxS
Xfq+SlN9vH+avPTdkM0R997qyhWEd49JrS0Ifj1/sBNv1bYajFfq8m7SueBs
fGrEGCGe93Z8iQKx7+FsjF/BnISwGoAXxRfuNVHUmH3gULdkAkCQ/FK91epR
ZRAENfx065EQ35ntHJspyd0iQ+LrS00L7K26Wf5k5N7HobAMCifn6Lqj8+L0
965N2zRPZJs01bBsHoWuCM9UwAAfhsGVcnHsVR2siAFu4/ovpMJqZ1SBEOSr
z2oJhm3t9jORLDlwgroyH3UUwgzOcuAGRYAyw5NHN7bzlvhO1iniotdSBzcX
PyfeTRc7cVqtSACC86ng2q8trKUXnTo8ap9vzfERvHfn/MiXG2ROReniPhoU
R9aKdYqK+fQHDeZRcN/YUaAXFg/ykXiDrADGA8rYQNs1BvsRJFeF1B/CNQr8
djsnOXG2G5kgM1VEPsYbjC/wwDPKgfyCbcZe0KGhfTnWJbDOJiZaWEBYC4Mt
1mh9cO5tXRvnJ6YlDcLkL40Q0DiRiIl36W5IYRA4M4QevV69VWBS2xUKKvBA
OEohfqLJMABT+g0jPBMICNaLCF4LIzCGPozwNyP0xIUCZQjOSUaKNpk63g0a
IWHBEWVzSFBQdlmGSmVx8RYgHqsE2EbGC69/DmslPDyS77n8slwiNA0KDuTK
ILUUf9YgyojCfWkIeruVc2elhgUa2jmfzNOmun64yMO2E3cDYOnQLJG3aVJB
0n5uH0qxybPZQfUKNpEejLcbkiVCPAX6Hhk4wgBei9VHvhVU/g6IxMVEkrXs
tP3xehQwQyVatw2LxFY6ACGd4e57934o8P+jzw8lZeJkAMIMXiaDL2JL7tIj
Ij/ls23jZXhM77OySXwBoZcBYbV6fA9MvqIGim3cVxFiBH7KKwQKI8dJO5Uq
DBYWc57rl0Q7prIxnoK8ETznQHoTQzTdQ4UTRVyKhkoIgS9bqJAIymy5RpDI
S1IhSMUk1Uol1qpFdOE1QaeAw/oCfVjKECL8tw4LGQ4HAeGqifSJWLICI1WS
lHVdUjAGfGjMn9qnrjAYDJl+kCVKxCoWKGIFslR0KEjGcGQJEPmURBROdk1S
eC4bSGHKvuvXFFZ0XiD0Y0uD7ZoB2jGndl78mkpRVKD7ixKvKrMPhDcKASkS
HfnAfM3M8dUN8fx4cghrsnTnI8INx0sGoHA50bqbBedXa8VEqK0+yXspWnYM
COViBhaVCioWbWVR8n/b0GIMAumz8Po6EjeZh6nSiwOlUievTuEdL4brWsdy
hEafU1ywvldk6Cx9VTDXQIRKZG48/H1Ly0UzauZ0zo4fELpGnLOkAqR6XU0X
An8lQ55KZRITKIbjNAjNXKazijS3BYeDxzhhdKcyOVLIg8Q/o0rjLd92sEDG
jvIEB0CEHM4zgBtx4OMCNRfC3J20RXosHJ3GpU9g1gXv6ZtNp59wuSOdlX4Y
FAvpVRgx4bAz3LvGUGkDLGhVrpVDfV15A5+ySDenlAH2WP880uCkmL2/Ukw8
qSphkfy8Qt5SFtRE0tAZz1JasEj+hwHwlkEkLywChPMlmVhQOG6fqZYEIcHC
zl8d032Z/OQTCEwW+6i1JUAElZUoUJsrVZuExTiN4meTizCUHSRK3KWEIMwZ
DuQGBvrD0LlWZKXcsiY0wjW/s0jgSN2UuH2yjrPAJveD+Op0a4HwrGtir2Hv
ee1KEIyBvYAMnn30riQZfctM4l/EbWBzen2ZcjItrPwrQfW8Kvn6TAmWOxfz
IdumkUw43Nra9RHdHPpASjzf1kpR8XN8jcTBqyM9brKS5RXavjFmjB1MnEQc
nH4MT6X1laSlIL84yL4WG3qjzeA60zgcjsPa8HCZUeEt+NmXniKhDXSrFgnz
QDUEHYXJRy9PXzxhrZuMBiwgiM7I3HYlqadMzbkotkHkYrdCjNwkyAEpZlYD
idC2IJYYrU/Sl2DBx0FjdsKqSj5VqFZcVhgfaWRDxc416zlGV1gRT5KKuZYn
+020EqRZ1UeRXkxTcpa/0a+BHmaIIgYQb43y9mB3Cva1CLyhsR9ZnNAAiEIn
0gRdhoqO1y9RCjYZ54tl8eUs1sLD7oofrMhv3lY4BYV6gxDG5V6HhcL38jTo
RmikOryYZQ7e1xrxy4tOdBYlQGS+qA2XGyJTl8pr3ZofRKQrz5NncK4+6GZ2
NB3N4DN0FxBjnwSq2J4AC+805zj3vsqHxL+lSJ2W+arJ0qpeTxcEKnj1EZZ5
ZQCsxiH36YAo7TEoCZoDxhpFbrVOu4FndFWPJXqPJhhviIUHsoG1VSxE56g3
/xydDVhz0B2KtCi6xBn6Sd2BqiqgHYAI0OodDdMUsdbfX1xBxm42NqAn6qa9
1mf6rFAsBkQhqXvXQeeiDnJaWL0s4fYbc3R1fICFNVukVWcCklqjt0RnN7lK
Z8ZX5J41x6Bn3kAqJl5wHfd1tsix4LW3URnP7YoQLhQh9o0S7ZCReJCDvCK+
ipvtEd32SOwp+4p1YPC763+ZPI2Ri8Eq0VRWXkYd+FbRRKBkKJg5CUK1NC5Q
w6ZApolXy9w6GbnJ07a4WJB+VseZs0Z2h6M8CeZLCrTS3RUMDIWeZ1YvlK48
NkDwAzzwWJH1DoI9WdRJb7FdK9Hap+oJh6eQw7A3oL7CGE77HUnHCONNw3QZ
Mltxd0F4z8GBD/OTI41fVegZkYR0B1FdRAnLKu1EYG2C/bol0BcFm2G9vJE4
CElBb5mzkn2htEBXb9SFgwdoS4pqAGviDaCaixT8TFbua0qLwdXbLSE2aMoy
KVdAIUDuA0MDWG6xBSmmOl/hHNlkFcr2LGLcoO4Y7nkthc1qh7eeuaYIJDeI
+6zTJSqdCLWDWtI8pZJbIQCeF1NNFxXvrYSHUy2kslLQp3kT7gMmjGcEwx6H
apiI0bf4ybA5GSn4UbqCOTfBdlC2Ou8JajsXaHzg62uVr/MmtKtigAA+OPEb
R7EBEVNhjT7WGQjsgYPlPt+ie7f6g3BWYKxfvOwgaTXeIdhtp/9ku7bDA89E
O+tO6zOHMUTLDEMVA5WHn+WDbhcDypCie7PRMlD1Mhc74kP1DYVtzSQUgVsG
PEQzJ0j0jnRFEjdFM7TkoDVmslVy7bTjPcXQaI2nnaTGz7f6khgpbU+UTv25
jt6uyxXSsOkIX19jpmWv8VjImSXsagSMwAv2lBEsGapAtCd5W7w0rRCO5AYh
HASznnHxjTC3kGMAfIFmNeJ07CG4SKDlrlAeeoGutzglis0VtVb3wnEzJ58H
uadpWIDeX5lBd/73lt9/n92Ejq+VJibmRwJSixrEwbHOUo1oI7sS4zLRDYX4
cRjy2gZKZmwPgrZgNCSMVyThDgQrkiLFuSM7FS8LFpLKC/UrSf3D4GgR90JN
mV/majwknTfZxnDZOf0eL7RCsVXU2AuCih6toPInvx1E6pGo7DciQPHm1L5v
kuQRef0I+bw/7EhKagzVxhz9Jq4LtJElCeN1ElxnEiPBzaUTQci0XaLEucHi
Q74Ov+SBvYXrY8XgoB1vfF6w/s7pPJ3YMBiKxaj/kORxMR1+hXUwKZVTVpiX
Di8v7H0t8L7om28Qh/jozfOnhqegdZWILKi05tlr72kgiXJTZYpUUAqhYxNY
80cTKiWihdyC0AYKTEHlLuqwWyGnO0pexcewpQ2DzGCVnwB/Ljwa3Z+1opDU
APP+bS7RI+larSBlTy8eokhEOGgjGNu4r8egNt+W9r61+L5goYHGViBI4xj6
x+4X91wHjm3I2Cn2YeHXVLepwtKHHFwC6/earUeXbV6vuCrT5Cnzu3Kd9d4b
7cK0dVTl21cXIGYuTZ4Rhp1Gol9XmbzVYi9OCTTxnDzQnFOZCxQj4zo118S/
DGUQGiUt97LFjqqRYiTGHIbz9fAnDAvIZU2FcnvgFMLSjLVKbpIi3QiDIUsQ
hrJpSbXBYKTVoyKhh3X1GDKB6Fh2/GEyTv4CWkQxF0ugOKC4sWBh2gSoVKIU
OuZvBKrFCJJPqWI30q9Ao1IdvvzIcRmEI2c8HH1lwsd7e6fcV3FG4W1b10qj
TN0FurEKUua6ckXDuW6WdOVzs5OgYC9JZ68KTrBk3cxXcQhij2QXHCdJReKX
VHmgZikTicyvdk0KCpk020mdp0D1fwvCC0Gci6INUY4zOdbQYWuzYbK/JPYn
i57j9us5rBC32gjFoHWWNbUVIojMdoGe0JOeBP9Ifvk4uIRgMByki0JuEHnd
SUUp9oaqSgS7N/+NNcPvYGx6HH3mDGx8fK2JOcwF8LZMsthfE7N1HXL5T3GA
IK69YYl12mrHjYNGrwMjzT9NXp+enUWyN6LXINLKwZUU6VuKtVpeihKAL/My
27HglqM4CLICCh7CeYnX8kpazGdB5sa94fjSuZ8euWHZVJRLJaQYWYJQ1w6y
67Acuaozh3N0aj8Aq/wZlP1EKFHL+VEOevhGsvZmGSqfBEZ6EtaI6Z7PfSRL
tEC2QI+2AUcn3G2WrS1XgBfqpjOmETq828QVEcZKi8l4ZitKnhaNHfI5vTcA
10bHe+BnIdstfMbAVxc4XYbLUHBWHMbGJx1yWT6K4nMYKEfS4mW+MV/XyFBt
VI+W4MYSlP2dLJayKbHvJO0AKLTcakAuhT1SyXpSSIDoBe+qNCP8mhGB8nq+
rWtNq5C48eoPklOEVpMo64j4CGUnX8YWCkSvZYhcI7Uo3vnWLV1WHbnoRYd2
oDZYXarjh5g5+xbJ7oI0DhG8LvVHV21nYDTsetQKjb3XE+29+Hs0Qihii+38
h73pTtedclSt8wCHJZ6Li+fShDk5ZrUVpMk42XEo6oyrUQrmhQxTmlhqMfpU
D2haWwWNvFYvM8M69npHg3A8Dwxv77QSya7ZKU3/pL4l3si7jj2FaGKmyK2W
y4GZ+E4D7NCCGIbX+TWO0/hirwJ6eAcbinvdbgYBUcTAlIem4fQIKqI0sDHi
UGgRZUAox1h3FL4SLNPYVNBNlePY/HaNJd4QyyU7qnZObGBB0LuSfViTijrX
MK1FlV4VqvPB4AWCHaPAsNL2tsJoRjEPk0VIxEueTMfkjbVIq4bO2wWHVzeY
5ZtQ4gUXQM1SxcmEf5kbTLfHwaaCMtDBAlV0iLEwVCMrDC11naA0HYbGSHDQ
xDR5iQeOo0txlcl77CJz6YxKiJm4TZaq2iq7dr3K7mDa/gH3qOY/1BLv6gll
7blegAHKxmDvH0FMSeOkQD8bjrXL0DKGSKgwR0d2ewTfIlIjKubsQIIBqtcW
FiQQS/llWfqoKHfzq57ojNhhyAjPObHfusot24fuSS69vVdivEZW0mzBa/Nb
Oq/hPYb6HlCUna/SiT1b68fL9To2NYGkDTZ/EMhRI8Gt4SqpOxBooH9vfWKi
pXg0igfDCtEYWApesKuyphubU8oxrr9vW27CL8kABKPQyIEdR9oQx2fWFzB0
BQsRH4/saXgSJxOnmG+oE2L1WVjVdLWrBeqmqX15VoJ+4HUiQnQ+JvQgNiRB
Q3JaADpo+a4gdBY5l4HCI97Y3nhdDhxboGFoVVsJCdLCF6SnGVzG58+zcosl
aRUCUcSrtMo8VDRvLdEwCFKiULeihFCorBtC9d9kPlQgCGVgW9WfuEAAu9Cb
APUGNWWYvQTvRVeLRXjs4RzEyS5KR6EAmkVHZFOWHzgCzRynvEB053C5DxaX
0RzmBrjUwPNRxBpwbZCekRgmRDQar603QSQoC951DdwXa7zi9sMUDZPamymN
um2uJmahA/Ki5DgH2Ec4tjijHYMgKB0QDAUs3QUV8y4srLjgdJcSrnT0bM69
Z5KsG8hCGDVD09V6L/WrlGDz2JlAeChYqolLSa92Gk2bi0eQ6pbC4g5FP7n/
6VOSVRWIe4ifOgpoyOz3nXwe5lZETgX56acWxkona+YzoTTU3KdPhlV4aNOA
3AsJ0WX4psgsY2AvcMANZde7OFThCNp1on0ELKmfNB86dyT6o4FV3MzoEMc4
obhJEEbzvagWX1tu10YWqOtkx9w3wD5YjniUgYqrIgA0TuvHl/9RZOcYXh7q
rc9XeG132HK3v4NmIrajxPYhWt6b5/hdYy+CUbxlOAayFTOM8GJEPRykicOi
AJ5N1PyHv/r1aOy5jmWquShTLQotb9tGbCQGBtSTl7Ve7s3L6qJuXkjg0fmT
F6+fvHnz6o3Cgg57dA3KRGgu40qFEmrRPs/7TJ7uWmkNZRqcG0g1oANNgKIa
QqKB1+59+uSIQyW4NcnZT6/ePn9sMZGyO10eZcn/IRvC/KcIsVNMxmK3N0FL
eQcnariAf8QGZbaESx030ZFY9J01qUAHEAg7aax+/UzXYdmTPUxY+kdhCHDA
NHK4kmhUVlChv5eodQ7iB+pDzYkvvWCvWW2BxVvSfuBCbi6qVGSJ1MFjL/hJ
GRcr3GEOKNok8K7Ua4hqJEo19gyT8fJ6Hce8tJFGQCmGFSVFIYgEdmEksFcw
wh0MVQxjB19V8k5tHqSKBaHhFBsqocDhMFja0sjvngxsJPZ+ccPoqadBxw0i
DTIWmwmsQQ3GlpTG0o0TBzjtBUkeB4XtkEbdvrBrn4QC920mBxtxMnGJGZSS
s7hhfEPF2D0oLQcQLyTRgwSfjVxggvR6bL3H3xFFsS8wKLbJWEul415lsLcF
cYUaoyx3yCqwP5Rpgh+JQreqg2pwYrpqCwqywFJHkY+Gr/chUbLC4cRGC71U
OznNPtk6NLZJqqoHpLAprkQ40/jynMows4TG6+vzV7MY653i55itUK3GklaJ
s0oxrO3+/Tu370+/nX4il9muj3EqzlhrdAFqZTy2SLp2YR1Qiv6yVBMK2QoK
/nAiS8or6pB1lRUGwWK6CcxgK/QJbP7+0e17MOb7B8f8pLhEWYOMOkhyDPrP
APJLrfOO4Rp37z24+37s/Q7u36ntYRxaI6al0ZTe+fbut8fvUWjXdsl6jvG1
zqwlUqlXqgKOVYlIcLmP72BgC10a6oDzAN2MsCdWFi39Wc4Qa1diNKDd0D3Z
wQvqxNJLAhxqtxbUbVljjQY8X2PGpUO2rTmNPyvIJhqF97kBjLscJOxkjIFS
SAbLuCLdFhQLco1t0I5AzLofo4aD4cMomrRro0XFihFCSzHXUBM2T7zt2u0m
pwHATXhfHXZ7+tsYJ8ooY2ziGioqvMPEwcCTk1s8AhsE0iK0KRFF080OAwxy
8lwn9J5QKa83Y0VBRy7M8juMMdlj77Jk4RiSq8ccgEthOVTqXOFLcydGmpAl
FYsQ9cVJ9UYmmtKwFem5Nfy3a6ZlSWzN/Gfn1DDCYbU+6RSkFmKjaCoyy2PI
dFUgjVKEb7TyruPeRkMgefM0Uy5sPNyHGPvB3xq4+O5wxhQvpSiybbsvUZHU
wo6RkmjN+txioyDuITOIPot9CB5twfapw60WawwaqJQ2DMhPMftSF7CI/UpA
X+zEnvVmzviKFICEFQAYdKwQcDa6FopmBFGTAk8jHj15QzpNq/Kn3BJObonv
Htw5ep+kEd/V9FiuMsBJFggmXG4rGZZ6PXmMhoa+N+Djkmvwfcw8UDF6+huM
FuQO+ZChWjJfUcxAl80yxmVqVjJHpeW6iWCdIGdGURQZAbWHmrBV8BRrlFDZ
S8sqEsLkpTgmD90XNmOsbFZ+il1r0GKTUy+YTS1l76I6WWdZwWiv52TYsUUW
2HA0IDxMIi//FSNfYtASqzAfvSX76emz5/B4pKS12BvhuEpM1IK8mIqBKTZd
gVbOuRDojSpdm87UGirfLCLCGvLZgteSWBhrtkG/mKxd4OWF8PMzdNuriJF6
n05E05KAwTjk3AjWB0pXyNw5WFiVv68ZXpqYtKZDKwLUXhR90TkRSX6YCSba
DKuplMPKb8NdutiixhPUVuFTFlv80Dc0zzA9iQVadshI3CQcEwqOlD2N5CVY
uQ9FeVW0oILMcYCFALaFQutl0jmZ4KPzj4o1KUsRUhWlWQXCCQHLMYqN+AwN
/QWOG1ozlhhz82zJHi+VZXwi6+UWXphgmibJXBKESMxUYOpTlTOdx4wZEiZd
Q241vmLxhAgOUB745oJsdLdOP+Xr7dobdThjKZWAAtStBQ5upyK3KmkIHO4k
Di/xWAyqsCnqhCb4tCZlbsOoxJPA6J788Veffv1H8gClF/BhBx9IKb7EYMiq
/oHEV34IOSA/4SNrJRjQ+L8ZrDnQfuW4ZQ4hHoZB0n/8lbQI7flI3xGWb1nn
HFL3x18Rz+vrEG8/35nsm1WN8nLaWm94Hnx9ZPOoj/e1G+T8a+aNo5B576WL
aNVS78Q8nlklAM0VV5g0F1vHLjt7JRPxKleADuDus2Z9jzRrTNOp9YXQfWjn
qTPO1OxIwSlkW5K7kRmBcOIf3CeceBzQdYMP6qyG4LRe05XkqHDgbDPQHVYe
4sTIsg7tKTeVN4YmZYzICGphrxapIsmHU7lTLJRK5Oi2anv69vynN0/O3j4/
P3tPaPj1pWovEX5IXsdBgeikuCjKSlEE92RyaOoWrVq0g7pIHFsgulVjMOia
a0Yb4HIDld5DZt3k+GZfBAdHA+eLDgCcisnrjE4cY0tGKAdS1h0PnQ8SBkXX
2entS8w6HI3I8hQHaKSr2gPKhKBrqQdYWVhUfu3jDWP9Mw1LCKt7MGqikco2
8WP4JaehsuVKPMdNecEymch8dFOhm4NuR98WaxhCFS5tZSnCY7RmK7goOEXx
ZXlYU5V68HuxjD0qB95+HJtqfjLOZ8a8y9oszH2oHiwoCuAPrX8UQF0WUm1l
I1AHDPfsy2YBP1XGWnPMlWTvLrLZ9uKCAnFJJuNhJP9y9uplUs7IbcpnkwQS
sTI4z3DQoIdu2G0Tm/hUtcWLlGIR2DMrLTjKskrkBiBOwxKhGblR8PO3gue2
NLBcMK4sz82kKHXjVBkHIfvk2IayLakEtxRdaYIYY7HGieCh1fg8Z+R+XDRI
ZbsY16e1AqVwqiZE0K6zposD5/drDGMFUh9sC4tZ3Wl58IE4Kig4i5RHCgV0
ElOJzpKaczgfsc973IZfKcp+hsJnS6slsPqWLVjCNkEehXqVlniwUj4mEPU7
FL4+AWHFLLM3e1oK0LEP/mavoLgEstBXdiQUwfEAN3yHASMXWzTKIFONT9MN
G7EYUyV9ooCbvSv2NhHGOI+Sb4Obva+npI/C2k10yjQf2s3+hw9tZv8b1+zl
4ZdQP90WjK7U3dP+d9tbqrlO7bdf9p8esmILQGMPBgFiIrey21G5+7rwMCkQ
yIFb19Wl9lVZAmCMo3vJIt3VLsjdiwx/Gr5jKStqKaV8/USBfNQn2sJ3IGwL
LFbF+criRxKFtxdzwEw8jJROih5nztRqIDeGTxoojP6farokVwhnuMrZLl8s
9DsJ7oIBPkM3P6MkPgtKlilVeOkq2KayHwBA1zSrpNRGkAko2YRmZl2TIiqw
DSxpuHR1BauefMiyDbafVxgzSPE5UjwUzsf8siq5Jp74FlO0KIwZnAKnclVW
H0KMZV6yjKDd6+1sUks+I2E0zHcR1gqs44vz01rSsDD0EW8Fj+IgFcUxBdkD
XYDIxGAXTqzMPt5ZKqTQjRZup8wbloOC8j3I/VcRuB9XzuNxMbTLAs1zl1Ie
poP9vZeQ9ykFdDKJ9DwhyMrVBnnhwkACLjvXKvbW3y/bKL1RWEVS77oxh7B6
g/desWzE28Nh7TMQOO35zd/Iw13nHY8ZWQfRy53GVa0JvaOF+f6FiCQAow6w
tVwQ/x0CAofqSxc93XWjgvqjpDD1eJ01XPdWNTsxEHOCiUEviBRqGJdBta8w
mIqUg30xa9cCpBOsy465D6JVig4bIHkHsAwohLXDvSI48SVB0ottoBMQz4qQ
4m9L5SatAhVZPjyefoTMHiLQuwA/SbPdsH58hkqe+ENKn9KriLphmp+5yqrs
gsO3GWOJ0SdFU6V9FUS6aXJaMzQngn1hMh6NREctybupxyWKx54WXegnDGZd
I/psqblIQw5XFlXp8+cnp8+ofJAg/IWI/NEgnQ0yLloh8XF9AXhhsDMWABO8
vdAUkFKZjBmw7Q+UAlsRGdoueMT52CLc1bVpj8bsnyfy6NUVx4YUdKjG3tfg
xC9O2pBtnSi9EMmZbWe9QYUaHwhf/erXIzLYw4+51hOlNHmt7mQokuZzJi2t
UIJCK5Ka/+KV4+c0hHa+l9ExX6QMFUrxyYu8vpQIVFJQzVylKfRmJ/DRiO4m
KPF8T4jvh9V08mdUotruDVAaph1W3Clfxcm0VrxO2JFGECWDPrDQQRtQcDKR
UBy+/ZjdSKUlBY5a4VG/iLN6vcZdc7DLdRGP7IeXjB/DRW0ug4w1F2asXQ/S
LmHnQC0B2iVRj/Bd2ttPiUC0fv3t668h1cgWOTuQmGtc977y+1/2dnwJwqzE
wHWztwt6QSoG3OwVr1tpmOC1r+Apjnuxuw/1GVTbrm2jM9BuExRElOlP3gGn
gHb6uQcWoQ8nzhsinQ8ANOCIjjVfICOmCFmmWSwfCI6tSCVLE8V5ON58GLwP
oFUrDV76g39Jghre4eh+9+T3Z++nwMuwXbPVp5KwJa7NIKOabh9lxmyr5qjj
0KLj7zJCOwYxGE54EGW+yHzCXBgeTeIKvuMkLIBHInW6+KZmiGpl33nd06J3
EzPyrC8rAbzNz1oSfymVgy4R0wooFMXjzZtVzvDPCj7K0DyoFy3DOxslogwS
tekT9yd4zkwK3IgJVAx7oS8xBoRjQUIrR0o5Xk7oxvbY2CApLrABnz8/ffb6
bHJ85x7sNaomVuw6efF88vjsdHLvHoO+BQkuiuB7dPfo2JVwGvE2OPr2/nGI
0kMeYuDOJJ1Qr2GZ+5Hkv3DwrG6Ld5F7x984ebI4vn//6Hs+PSkpGtz/Xd87
jDLou9sdh7OT7+fO3eP3EekFG43LA5vIJn6UuE+ClECti/KBOAEGnCK0GhlF
VL/Lm1gU7mfogfe/n98EkZvopYzDAogkbmpcardkbIzKnPyyNgieVaPfpfjG
L28p/QU2unY7Hglondf+JvlF46HYmCr7WH74pWscMkRO4Q0ypQJEnZCBm/eP
QHEsD0hcbDsOP/bvSpQRu88kEqwGkZ1znjBu9L+2OfADCa9GNtFCoeNcq+Q1
uyMIf7Yo0Qu8IlOQghDKZXUTrxwtVsuy363F2YPe+EWqVpg5hIumH5SrLCH4
cDAtNXQd+klyQ/QTamwvAkqSWyvR7cUpTZzJ9VVg8+KdF+WXdAYagajbmG0c
5LpyBIqESFEQjGhIASqkt8xOmQ8pzF2LMA3d9DJb19nqY+a1DHK8Bxhd1M4Q
LhkKFSbVjys+ZavaMrVqVpa2BZeFWmgpL8S63Rbs/xhQSy2ya8fRhglGwWHw
Z0cW+23dyphsQ6EKdqvXv2IIU/bo0YgiYxVhos4bH3HgAR8aFXJEMwsLKjgJ
I2Psot7Gu+Ll/g6gJRRWo5aY8jp4Nq3Af47vt/gcvtclQ53jyXp7y3LyE3rx
C2YYSnG45KdFwIW10qipvZqrkCsKIkfiMvhlIBLuG4V08rgT1dqSpFvxUEZ6
HkqYeqBQPqBhSoa0zFixI/ThvA7gxwm8MUiGGC7DDEqQBqEzdMmPIlNVsfB7
yC8Xu0FyUZVb0N2H5MJvtTHbJYO/DOLoJ4PXCJRn2FxClsNg8JiGOEtcOtEa
9AqO2q23AxOZ5dKIyp0N1WflSI3oupANeEKIDBmnFfhFwfmQ/8VDvSFxsiUo
PEHUmSShXkfjdlpazTATjEBUqL08zqC8pvlYEONS7kU8WHQaoIJ7qCU92vjg
2FvSD86rdXJewv2Rybr2kYuNjT7yuHQBW6OwJYsej9YkGEg0e96Z8LV47jHv
aU+1NYzWDM+7QUcUfMEm9p0EWHRVG+Pf1HAL+FoClH3o6uD05ePbr94Mkmq7
klQhJnGtixHkalku6uaS4CkW2WZV7jQfAwsRBhEqFOiNt3kyuNzNqnwxMGBk
Fvtd8LAK6VuuvAcnNetWGo7KLcZxXBL7EGAao2+K89oE3d5Hwocnye9yXvt2
kCfQRgZfOvEf7b19hJEMhRBH3AsyzUoAmfusVYQhHOZ4SEwQ+SV99jL6Iw1j
LFXXv2yVxYcH+4XZL4RTFIMAquZP9nSpTmUl12xCmA0Yxt4a2a1Wkqy0Ht3E
yaW0xwJ+oYJAzJQOGruEMbcmJ/nMN4tliAbhb9stx5GRqvFvHG2H22Bo5BEu
NGgXPu0/Vi8CeGzvhYxw5dk8zKIZPhxIXs7Hu8ZVwNphbLjhCJ99MeFxTbCl
L18cZ8/4X3H48pvHQTCEZnI0pHR6hEXEkTBUo4QPBmZO5bhbEmgSQ0B6sIL0
BqhA+AYS3206U6bMkIGDb0xVrB5xT6EYiw2EKIY9Y6AplV6swycnddZ4NIUQ
BGFbcYI81aDxdsnw3glud70gbnhNkYgpsl0rzOhm8t1lHL91jWjHsizfuyrf
2PSvlRV0vaImX9k0s0hsoVYjucUvcyiPUYuD8aC99oFQYgOkyRZ7JQTo43qZ
xxQHGlbrOo/I4UB32NV+qSUkh053N5Rh9t3yHTmG13mvINMzh3B4wZL1CYVf
085XSDLt89Ka41lQ4FKE8ThCpHVQxBI49ge6xwTcjtpUM7YeM23tn+po+wRK
ogwubblld+ybTZNllV6oUIMmCkWO/wrBSXjV/25Ck8g8PphUZB47QXtEHqVZ
lnnc31Xm8Vzo7yvy7As1DZIQ1D0YmVcPvm0X3S94N5SVhP765aQ97/vzp32H
ItIjC+/xEIw9kI10SHoKBFqtzsNJ4pUBiXcAH3tiKVQnFyg/oncPe6E5BsFo
nJdJiNQUuLRnwESaGk2OUCYMR8NFNKVlK9wbBZVxrRe2z4EMFmYV50v0ph/M
dReo1574DokNQjjB4d4wD7X3OXF8qjDFjwVFkzqj0HIDxHTNBNjrYR1SnZTA
aYrLg/tA8GFSEb63bgqzHjJgOZJr2/CdYaBO31Jxyl1ZETxaVOWOMBi1cGZU
625MnKHQEochRX196AAtNPIuGpvaUnzpy1u9tdI+3wrLpBFwRNrzYDv0X4Pw
vM4522K1NgP+WacIM1BuDRdSYYxwO1ZpdaFFq2mbLOO5ZvBGQxMQpQPvZnIR
MIolI+7hEhsswLYxjFwk1LyiVFW4UTUQxA8oiCcZUG7gDqv3oYEXFAAEKnUR
1GBfPexg3mUHrohWZoxX1VYc8xrFi9PwiEshkmuIhBNnXMgKMHquJdfRQa+4
yAzM9QIhXCkNk9gPIhYSHuTHUvaod0t89SYJErYYGT0vDEnE/mMUY+AG2sZl
SoNGBdVCyzTBNN4YcO1lWdO9CnueVbQJcEJn5SexB3AUCKfKZkweLiAPj/5n
a1Z7V9ja64MafapAII0HPJkCLxfkrFrAu9OVxTMGFO+CIMj0ipLpBSmDAW+b
MF1otaMASaywndMMt1q3uXuGxoIzFANZChpt7YSqdYZjngyHSuMJpJzJkBq4
iiWJJrYLzhYI5MNstYyinvpOFR0oCspnF7ksewQDljdMtUqpLAL7WBCO2Eax
iipaiRKypvLrhHiMpScZcgnDirh8o+D3tPgRMSC+etMkHIptHaEah2+uMXuf
pHYjPaJ9hvZlUd4cwY2GfNquC0piJzKZsw0tfGIXQauy9Q16tzh6WkdDs4lB
kOBrrcPeUKo6UUEML67rmddRgPicHiNvsyZk1T5qvAnxMBS41wclw/KfadlH
7FxFSOQcGOpAOPptVhwdTIe1Cz7E3hnkMh3EJAGKWUTq0zwbI+wwZU+TvJd8
zNPuxIMy4q0yr06QFxYLFacWii4A07GYBSnkmnIef5CagWgJEdgG79LesUjx
TrZaxIrgQdeuBYi0uoOhDHTNBla1rsd6pIHc5Z560MMeyfhoFBiKUAb1Nevx
5mBotLj4rEdVYoZGg9wA3S9QmFbuFJSKWqVwjLXy50epKNBadwyzxhwEvCtC
QqEerziolEP8qGIwaKnzpkPMAYD4/9fctfW2jVzh90F/BKE81A4sby7eTZo2
BVQ32QRIgm0u2/YhaCiTstnIolak4k0W/e895zuXmaEoOwH60H1YxLZEDocz
Z87lO9+XdpPjzOezcJVy5ghMgk/j86XZn2g5BZ3aeqkNyFhAA/C9VZti5PWd
yO1CBU3c+Xb50awakhFYfjuTqQmIRjaK0PXuPJ1g1RPKos+IFuxglClJGpvi
ITLuhqGJBQM0vsYDeYTPtJ7rKz2nJDPAGYlDPjZSbinTtsgckJKC4k9xSySo
TJZGpKnCHzKnKD3cdw7MXD9WbcNw3dhizwwKPUxKXmJeoda7fV9w7Ht20TIW
d1wwwWAURmBFp787KqCNG7jBQkq9hIe5BoV3L7Qwn9rl9lKfKHk7ztW4qafC
+3CORiWcLWiHBLf+Z52WGoVsXF+TBaNtRIJTfP309O6dkwfvDY3dCQ188JbC
6CRg/VgCCe5CbMqgIKdeKkTA3eOQ+S4CAWnIJXMhNruJIqY3pbq40jAXkl64
W9fSU3qGeyAHQwGHcq7jqB/5xNGwHyqiICLtVy/ke4LK9KSQYWd0a1yyD7CC
9ICkkmQVqdjk3fch5bBso3YLmltg0lpxHZzN6IivFSXAwtcQ2h8JbCojTwTP
hpO+N5k7O0JzbzqLaGQRFhwRhPS2GnW+d9qOGCwhBQZrkpB1ImDKQ1O6/TYR
MEnuN5p/DFIs8MEeTP7054l2UAjj+1CThkN0vHMvS31VG0nSJxJuahJxvAgb
l+t0ymOH4TfR70fC+5RDNaPQt9cpvPRR8p7WYEgDAInsrOCyIoOjgoOgExhI
/PrUiYXunEdA9kCHJSdgqLl7OsCVaYGJ+SaNRFJSTAfG6FEdsk5OHI9Q0eXx
LZkAOhFgbf/dMjb6c8Gn6zJzGza1SIqbq5xwJAS+KBLDRnNjLHMG27EHQszg
sqfkIXKTJjdvrctz1d9jEXKh2uaeVB24tNbGWTSy0D6RGUgPjHbNE7ddKetW
WZnOY2Ndq2ZPyBtlb7bdqJo4rRfTvEAfY1IW9T1+pAtLimd9u56KWX75/OUT
6zQL/ed1XXyQ45F+9Z28yw+wD5JmyXUTEAkqm41MuigUS3OwEYT0F5u6Dso9
qKDAEdSGZUfEVCYsMjBnByik6rx9Zz7MVP/qTyEIQMWVldnTFfx04YNdYrM4
e3jv3gfdW60kNEc8XsOEl52CIEO3necizgPpA1o/H/iB9BZaju4+aIWB3kBw
Cc8RJXAOKFKeRLy16KpLw6O3g0o6GcZb4uxEVzShmBrD2e7028sojopB6SE5
B2Q3I3vqNNJoboOp1QKQC20kbM9GPFmvIT6cp6pEI80PT0jQaLh2jd4IOJEk
uxhWNXeplFKgyEW+tF/hBkGsUiSR1VMHXx92tT0ljkWmu226ehlpj+EOaYbT
InpvVFV5W914cqgYFdj1J0swmENyshykzDH9RSIfoO7rtZoQ9hnTtSmjTzs8
3L3R0/zib0MX5yjHYJTyybu9Tt2g6lbXyhvofnDry+TJM5aIYTNab7yIB2e7
s2N/9k//hvLV4I0Ifn2PmA8W0tJEklJ3vumDyqqPOTvfpChyaIslPU70Rclp
KWSgenxfaQiHznQsEqmkSOsvyBIyJkP3eUDsc7Vhq7Wi1R1KJUaDPDjnlHa5
ACTKjdSldGSqfOOgmKOOVN7mNGpKdYaiz2GIlHSckfJ+F4U+vDVKnyI3aDdj
S61B5HRqugaKXtcZTIWw0qs52baa9biq1F6pwxHU4eCn3CXKjkrPYJg2h/B6
DRUrtsrr54sKor1LXh/0n5FeWd6goip5AjwFgxHsMcJB7E4AJyzqJ66LcLhz
r2Im+XzyhChgqxcLZr9VLAGAAEZbnK+lkSoh2g2dkoiHhieIjKevLW2Xffko
ulIh6bjdZciwV86xYt8VA89QXreyvVymjPab2iXB+HJIg+UGzLVUA3cVR2Lw
SQoK4M+7G2utBlHFIeFN58jNASO43WDSI28FtklICQx4m4jxHvcvorfDFw18
bG3XFEXXyqWmATqKll8T7flQVu1V+MbILPdKQvRKkEkbS2TGwrN95Hrc3KOi
Oa6P/XhnmEj0m546yrwHDZ+LrumRnlL4rVpL5wVhXxnhEXLTAQpldQq4nFAu
NZy4yFU+feNnvxzokQZ0scf4MErDCe0uwiSdSBw8XSJV2a41T2BlAAEFyCGZ
M1YKG90cxxS7NXroeKiUnpfizcs+pc/G8orxbO5y2/P8szlIvws1U7UVSmib
yLRqN6tnlcll3uMSayaEt4o5Ws6NkMnAlZx11pWOSI12p+t+fRUrRO6OhBvd
kYwvYuitVY8PnYH/8d1rN0vY2d67vllrxKv5zB2H18OPKqaK+T762K6ijC92
4C5LmuwD29KN2v+dcv5qz01N0evrLjPiHoadJeAU5Oa2867LIs0kPR41JHTe
ohaAfDYKfPLNKmEw0TRUDLNuFgx7Ox6iMYvJvMYp60s455ZQ2xySwFSdRSff
5ny48zTF+6RoZHXydkzvtXZRR21OPLdZIQmvaGJgShKBtqPCBRzKPt1uheqT
OxFpxLghnYO92UQaXAxc2Sj2cBgvUDPx82+YknMfvQrsR6iSEbJ82WU8Exah
4aJGDCFVfpjUjfZTTMiv/feR0NPkMI2xNBXV8bysKzwN2mu9Mc5SsyFtjYvM
6poAFzVGJiVYtu3H7brzBCWrn6V54DEVn1Hr6QA9S7gMIw5e/Ddow8QaUiYp
EPzaclLpWeAtX5L8M6Jp4/Z98ypkcTN6Y11JxMXY03o8OPKgrqDk1apkgcNk
868VG19uIP6Pph1/3xk7n6T1Kq1HsLIOElXNar3tj3MR47kjdmJq1dwvmrbJ
iux5u/lYyN0mavKPgjEfLFkiVztWDc2N13n6+sVTh8zhURZ0R3AUcGYjiom6
NzbLc7uNvUAWRSlN4kHrA5y843/eu3Pyffzng/eStOhFQ1eRZElikfmQoXzH
oA6zPt1WCG75lai8XJh/TmvPjeB6rBGFxUb5jzTHWojSVCODlmvmLpfMzkM+
xZBtPLnzh/fC10RGeL0UMmQLZywaADk4/DwOIPhadOkw0bvyy5+gZKccoOyg
R+9CW1zajXqUmAKW1OgaCClwqMI56UQUSlI6SuaBnGwckri/UMhIXJqgdk9c
Pi660mzTTtx4fifh1YaVZvsXecwtDawbQUkgkTaEqlqQygc/xS9brrlNyYat
ekFv68o5UoCMhoHSw1L73YLr1ibf4EUxoM+O3cgyxkX8CpkrFwaikCKBmPnH
Y2COu1cWVPuWlUxysCF0HtQhVTmpWhZ1YVW21fkEbFdZxMy3xsYiu0lu5cqR
UBRvHaN2IeAxIWd0hmEvj9FrYRopyzddlpuPPPxy0LPrtTZOuagol9fZokqG
8tcKW5o9Uf4mY5ogmQel91Qesuz5QA+nFAhxS4sek80tUgV6PUXJHQ+ls+a8
bU7RI03WJiElOUC+inYx1rhB/EonUsb0BjVZwOCvPgkV1eFI1kW3A8/t1MwH
DBxd4ZctSlQjXKuggBY4LxhpohV30FpHSyV4/lMsoYvoWhxvtIBpYOre8EF3
eASXRGKF1o7jTpiKku3aX8S2awdt04t/yeP2EvuRe+4sRsIjw4mSDajTADOS
rLZh7uV8d0wddU1TLLgTIHrklchbMEtqmmY4Ap/Mnpvgwf077w8dIaHJJDaj
Yvd+u8WEfiHwe3n39unDYsl4fpSboFGu+mzAN9Bim87enD5/nqwS0dGWzdf1
klaQK/ORJ/pXPGB879jCmJTwL9VfdamJg1G6yriuLhnEoEmNd9NlOa+XsLgz
+7espbCrPHp9iouexQYVQd+d6Gdhjz38w533wjElP/HGL14kJIiZuoEzSIh9
EtPsFk1TPZwnMGBfY4kEvnN9iJ6S3UkXVA1aZlzqfRdIbx31Au3XEfHQY1Nh
xmJiOBt+gojULmbn9MbI8AWd5+KSd0l8B3KK6cTbHk4nT/pL+DR+IfzrPk9Y
HACH+5AaZTBNPf49bLTOoSfUj9EniVgXTV5E0Kh4a37EyA2hGVfLEhW+SwMS
Gpo3fWUO1EwVG5oIDyaTeyiQd5pC6EK7hg17HuZMj2+mt4r4aDbuei1aiYH4
bF/QgpIdrDlzrgXlTP/2NEx9iKTj/HPPuBeAwXpxvKWMt1JiZHYurN1CcxZM
eg7zWLMaXDE7O4MizjnZtmAfVTGAXRk+BHnq05q4DD0wWZfpQ5re0G0pvkIt
eSFzLqUjm/PJdqKUkdq5YjeUiRDIgB8anT1i5GhVTxCCpvDZcWeYxeezV7Pi
NLOFtL74l5rpYoSvLOmq0uqIJ/yu2mFwI4WeyU/k45arOoqBFM/kc0+RmnjF
6jvkccAFUydpYgVC+ST9eUNeSsetUAdG/HX/4Q8ncCuepYkOBsE/Cjs9EuT6
rwFs4puYGeXPgRI2CHiHf7ZtEsJbWnW41Geo39KObzffncJeYZVu6NHrDX/g
+ZO3T+kambSulRbo8OSP0HiLf9B/bOiSLq/DPaPfKVv83w7/lWp5ydox7iqx
8rpesLQoYNluGGMxXF7vlDBosHjUXEhNpd14nt7Awooib1dH2j4nKmCaGOjK
hdSLQe1uxW3eIZ2NwzGax0Xu8QVRq5NQWJtCq015tRrgrsWsJhjKOum2maOj
ku75FRpGXTyICqNPYq6YIGXxo5t609QyQIPhct6cbzntnVQWg4zbB9cAvjmz
48GSz+Z75b02DrPdk8lIGte8zXucK3gkz2FtBUxELXT3HMIMTmmHjVrr6qrK
6D/YNnKNHiR+aDtw+v1chUUN5XHxhFmKmkWhHwZkiAzuUdjpETLpWtHw4Wte
ipLxyYP7FEzQ6faJSQyretWUS46HFFofDFeaWG46eLcUUgMFAuOovWmWa5aL
P/eO+00X9FwHZirSE+Z9okix8rTJNiwrvr/BqFOcfpkJ7PZawE1EAJICnZQO
kAW1NqfFiAKlVSGzso2lGZO7hSuDUUuWNM1fWYNK8nH18aANa8yjdlkrKcCE
SdyC8gIGdNGsM1L3dl0j9uoU2b0TBB/QBy7KNfwCMwycCb0S3wBhBDl/wnAm
08Htt4lA54BcSrAxEf3rWmHJeEM2XqmL/drXmsdaWJDcea5IEfgJas2RbMk3
UpXlqN5phZl83znw8vWbmfBwKny7Z7Q9beO7d+6dFHPaHeyV0pGxCfhU2iOf
4pw0SBG8XKxdxZbwELMC1mx/ZN9S9A9PZXMplV+e94rJbZFePLZ8TMiaa9eC
31Z656g/Se9QdsFAejVrygk0ctr9jZHhpU9D39my3RXw/lILQVf+LvNcrQiC
dCUb1SmDH2jj84l3qokuBGFPys2S49SfNccafntkZYXHkwXFKvWEokw+Zp9U
Da3YR2TTINGpBf4MzqVBhJDgGU/erVt8Si36aVP3i2n1sbnE/+5NebTTOw/H
73i7eEMnqqA1W8mQFZM1WLsjXywsbszqoJGINg73vt0u3kRTvNJe5EIICPj1
1/NNyQdsIqPbyw5SXMXt4pmY9X1fpk+c0rGcJK5WnmPgIEHAWI6/SWiQ+KsT
EOjQTnyjpdX05GSvkj2uqphcd8BO+EJwb+wFiCnjkeXJTOMfMSHAXNdu+CT4
GpdENNeKKyP+ZNQCBUFykJngPH//pZ2FYuzJaNPZovzt8lVP5N68JB7sWxKv
1deiWK3tYS+lBIGftQmGRzOrVKIQB23bNbR3fvpb0q7/8gWtoJOTqTL+Tt88
m31/994xbqG99GMN7sP2+tssWr0sr3hILqsE4Sk2SnEkMTRKwqKoy0arRaOs
NKScLcl3LNTRXAO6vfIXipuA56LEUd1U8rLYxlhiQB6n22Lma6gGPpZFCdB/
Y+/uzXbOnhNU4Tc1Kh47wri8NWLczPgqPgMLU2xWjyHVQrlufZPv1H4SUs8s
wZVYs7LXLAvwjXCdyNHVdS5PZiPtarAsWuIuVQUk3w6dkJV8WT63RHsO96ju
f/r+whjL16mS9Bhe4JsuknRO6TbN1Rg8qcNWhxuBlb0JTkieW1tVj/kSr+qr
4nzZCtqVnpkLNlh5KyQTzTLEmpOZiFn0LAZZxv3f+Z9u8x/2bfPT1pbspZyh
2h+3moJMmm01c3MIcZTbLksvgcznoO7PDhPuFZYSzBTprQ+tABX0Tpa+U91a
USi3fdwoastzsbGwkq3+wVt+e1WXH2Xr8j4CIl1YXcThEi+qb1vpmU6cE+h5
Gx1b90f+aSHS66sk1PhOAxAup9887d/vm/Z368pJRnnCt+MBMNh5OC8uNcln
f31N6/LV2/dxmrqLkqyp0/gUfS099sqyUlg2rCjP0WJxnJj2RFASUTGf7qLv
KoZwJ9rTaIym6grANIn21uRWS9ODp0bxK/aZkhNCzRrdad5UYJ3rm3S/A4U1
oFrSBaN/dLJIlS4Vptkcf/GTdl/HhGKBhxMUtKTZFpvS9s1tMFyZX6NRyMUw
G+P4bBwFpkpaeKadJh5tnJ3KUMelqsEbz5WMwGQZgUjoMhFTbHoOpk7LddNz
yV0M9am7TTcvuJN9C87npdteXrL52rvoBq8MKyMqjFpgZ7iY0TA/FOKFZZGn
g11318QZrEpikVlhbrj4Gu0ku3kS7u+bhJftpxv8s71HYHRzOG6lsIEFN5bW
+VdX07fto3zhJO5g3HTKHyXdTpijNB5H9ja9htbJdQA2gYVMZxl7vcEYtngM
qBlfxDV7GPnYRSd1COBXdjADWQhkP28h6nQH+ruUZKzyrgNlif3PVVrHqKMt
il1WbOCuzLhOBpDuiBQmT31BYR3HhtL6b4fhTS/83t4XztuJnVVOeMkzpgoS
nddp1mLxYGa/1JtWwl66wtPm18EaydwMWpSwCYZwQZZMZdKRlGFDqzNo2UvO
ysVWEt4DnL+omu5si0L2sRto/vsXqRVoDqVQ+hk0yKgwjxduJSYGp9lwh9WX
zO/WfFEcRldfNtOzdmmH7wGFmUIwVlIUflh4wZrfPj3j10gFiBfNykc6cpWA
WGANILmBYjHDAOMA96RGB7GULToHtPMFBRKrray1EQKrwxWf3hK23LudxDLi
8QI4lM1UD1K/zCP3iE+bM5QFBi5nEg1hyd68WO/uW6zWxaHeCyMq6Q2dY2M8
F++P5usvr56mZ3gML3COludTzJknRKuIT8ITWh/IFcc7g2VtV+pYxryHjFw1
5lhjLk3vjC6TIisd8Tf4jkYtCkdOMqIVlCH8RY/J2GNCvFkA8CYRtr5xru/c
FN1i81r1kEuAg6TyoOPvOD1Jo8wyrmCxZlxSky8T6WjdkBMmUFraytEaV4mn
I26GHLaKQeG0CmPS1N2uUzUPVYhyDKY1zg6FMgZNH8luTUbx6THODzk6YsOQ
bnWZPx3Rj1I2LvqmQrCn3MdRsj0GvlmCDNPCEXbXtWcN5sJW8s909nO2XcIc
Nh8yD+oh8aY6lxr03388Dr8L/wXV/gwFyMMBAA==

-->

</rfc>

