← RFC Reference

ARC — Authenticated Received Chain

Email Authentication ExperimentalAuthenticationForwarding
ELI5: Imagine a chain of custody form for evidence. Each person who handles the evidence signs the form and records its condition when they received it. Even if the evidence changes slightly during handling, the final recipient can trace back through the chain to see that it started in a verified state and was handled only by trusted parties. ARC does the same thing for email authentication results as a message passes through intermediaries.

Why This RFC Exists

Email forwarding is the Achilles' heel of SPF and DKIM. When a message is forwarded through a mailing list, an alias, or a .forward rule:

When both SPF and DKIM fail at the final destination, DMARC also fails, and the message may be rejected or quarantined — even though it was legitimately sent and forwarded through trusted infrastructure.

ARC (Authenticated Received Chain), defined in RFC 8617, solves this by having each intermediary record a snapshot of the authentication results it observed, then sign that snapshot. The final receiver can examine the chain to determine that the message was authenticated at the point of origin, even if direct SPF and DKIM checks now fail.

How It Works

The Three ARC Header Sets

Each intermediary that processes a message adds a set of three headers, numbered with an instance counter (i=) that increments at each hop:

Header Purpose
ARC-Authentication-Results (AAR) Records the authentication results (SPF, DKIM, DMARC) as observed by this intermediary. Follows the same format as the standard Authentication-Results header.
ARC-Message-Signature (AMS) A DKIM-like signature over the message headers and body as the intermediary sees them. Uses the same signing syntax as DKIM.
ARC-Seal (AS) A signature over all previous ARC header sets plus the current AAR. This seals the chain, preventing anyone from tampering with or reordering previous entries.

Chain of Custody Example

# Original message from alice@example.com
# SPF: pass, DKIM: pass, DMARC: pass

# Hop 1: Mailing list at lists.org receives the message
ARC-Authentication-Results: i=1; lists.org;
dkim=pass header.d=example.com;
spf=pass smtp.mailfrom=example.com;
dmarc=pass header.from=example.com
ARC-Message-Signature: i=1; a=rsa-sha256; d=lists.org; s=arc; ...
ARC-Seal: i=1; a=rsa-sha256; d=lists.org; s=arc; cv=none; ...

# lists.org adds a footer, modifies Subject, re-sends
# Original DKIM signature now invalid (body changed)
# SPF now references lists.org IP, not example.com

# Hop 2: Final destination mx.receiver.com
Direct DKIM check: FAIL (body modified by list)
Direct SPF check: FAIL (IP is lists.org, not example.com)
Direct DMARC check: FAIL (neither aligned)

ARC chain validation:
i=1 ARC-Seal: valid (signed by lists.org)
i=1 AAR: dkim=pass, spf=pass, dmarc=pass at lists.org
Chain verdict: cv=pass
Receiver trusts lists.org => override DMARC failure

Key Technical Details

The Chain Validation (cv) Tag

The ARC-Seal header includes a cv= (chain validation) tag with one of three values:

ARC and DMARC Override

ARC does not replace DMARC. Instead, it provides additional information that a receiver can use when making a DMARC override decision. The receiver's logic might be:

  1. Check DMARC directly. If it passes, deliver normally.
  2. If DMARC fails, check the ARC chain. If the chain is valid (cv=pass) and the receiver trusts the intermediaries in the chain, override the DMARC failure.
  3. If the ARC chain is invalid or the intermediaries are untrusted, apply the DMARC policy as usual.

The decision to trust an intermediary is local policy. Gmail, for instance, maintains a list of trusted ARC signers (major mailing list providers, university mail systems, etc.).

Signing Requirements

ARC signatures use the same cryptographic format as DKIM (RSA-SHA256 or Ed25519). The signing domain publishes its ARC public key in DNS at a selector under _domainkey, identical to DKIM key publication:

arc._domainkey.lists.org. IN TXT "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEB..."

Instance Numbering

ARC sets are numbered sequentially starting from i=1. Each intermediary adds a set with the next number. The final receiver validates the chain by checking all seals in order. If any seal fails or any instance is missing, the entire chain is invalid.

What ARC Does Not Do

Common Mistakes

Deliverability Impact

Related RFCs