<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-meunier-web-bot-auth-architecture-04" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="HTTP Message Signatures for Bots">HTTP Message Signatures for automated traffic Architecture</title>
    <seriesInfo name="Internet-Draft" value="draft-meunier-web-bot-auth-architecture-04"/>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <date year="2025" month="October" day="20"/>
    <area>Web and Internet Transport</area>
    <workgroup>Web Bot Auth</workgroup>
    <keyword>not-yet</keyword>
    <abstract>
      <?line 44?>

<t>This document describes an architecture for identifying automated
traffic using <xref target="HTTP-MESSAGE-SIGNATURES"/>. The goal
is to allow automated HTTP clients to cryptographically sign outbound
requests, allowing HTTP servers to verify their identity with confidence.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://thibmeu.github.io/http-message-signatures-directory/draft-meunier-web-bot-auth-architecture.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-meunier-web-bot-auth-architecture/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web Bot Auth Working Group mailing list (<eref target="mailto:web-bot-auth@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/web-bot-auth/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/web-bot-auth/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/thibmeu/http-message-signatures-directory"/>.</t>
    </note>
  </front>
  <middle>
    <?line 52?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Agents are increasingly used in business and user workflows, including AI assistants,
search indexing, content aggregation, and automated testing. These agents need to reliably identify
themselves to origins for several reasons:</t>
      <ol spacing="normal" type="1"><li>
          <t>Regulatory compliance requiring transparency of automated systems</t>
        </li>
        <li>
          <t>Origin resource management and access control</t>
        </li>
        <li>
          <t>Protection against impersonation and reputation management</t>
        </li>
        <li>
          <t>Service level differentiation between human and automated traffic</t>
        </li>
      </ol>
      <t>Current identification methods such as IP allowlisting, User-Agent strings, or shared API keys have
significant limitations in security, scalability, and manageability. This document defines an
architecture enabling agents to cryptographically identify themselves using <xref target="HTTP-MESSAGE-SIGNATURES"/>.
It proposes that every request from bots to be signed by a private key owned by its provider.
This way, every origin can validate the service identity.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>There is an increase in agent traffic on the Internet. Many agents
choose to identify their traffic today via IP Address lists and/or unique
User-Agents. This is often done to demonstrate trust and safety claims, support
allowlisting/denylisting the traffic in a granular manor, and enable sites to
monitor and rate limit per agent operator. However, these mechanisms have drawbacks:</t>
      <ol spacing="normal" type="1"><li>
          <t>User-Agent, when used alone, can be spoofed meaning anyone may attempt to
act as that agent. It is also overloaded - an agent may be using Chromium and
wish to present itself as such to ensure rendering works, yet it still wants to
differentiate its traffic to the site.</t>
        </li>
        <li>
          <t>IP blocks alone can present a confusing story. IPs on cloud plaforms have
layers of ownership - the platform owns the IP and registers it in their
published IP blocks, only to be re-published by the agent with little to bind
the publication to the actual service provider that may be renting infra. Purchasing
dedicated IP blocks is expensive, time consuming, and requires significant
specialist knowledge to set up. These IP blocks may have prior reputation
history that needs to be carefully inspected and managed before purchase and
use.</t>
        </li>
        <li>
          <t>An agent may go to every website on the Internet and share a secret with
them like a Bearer from  <xref target="OAUTH-BEARER"/>. This is impractical to scale for any
agent beyond select partnerships, and insecure, as key rotation is challenging
and becomes less secure as the consumers scale.</t>
        </li>
      </ol>
      <t>Using well-established cryptography, we can instead define a simple and secure
mechanism that empowers small and large agents to share their identity.</t>
      <section anchor="http-layer-choice">
        <name>HTTP layer choice</name>
        <t>This architecture operates solely at the HTTP layer.
It allows signatures to be generated and
verified without modifying the transport layer or TLS stack. It enables
flexible deployment across proxies, gateways, and origin servers, and aligns
with existing tooling and infrastructure that already inspect and manipulate
HTTP headers.</t>
        <t>Because the signature is embedded in the request itself, it travels with the
message through intermediaries, preserving end-to-end verifiability even when
requests are forwarded or transformed within the HTTP layer.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <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>The following terms are used throughout this document:</t>
      <dl>
        <dt><strong>User</strong></dt>
        <dd>
          <t>An entity initiating requests through an agent. May be a human operator or another system.</t>
        </dd>
        <dt><strong>Agent</strong></dt>
        <dd>
          <t>An orchestrated user agent (e.g. Chromium, CURL). It implements the HTTP protocol and constructs valid HTTP requests with <xref target="HTTP-MESSAGE-SIGNATURES"/> signatures.</t>
        </dd>
        <dt><strong>Origin</strong></dt>
        <dd>
          <t>An HTTP server receiving signed requests that implements the HTTP protocol and verifies <xref target="HTTP-MESSAGE-SIGNATURES"/> signatures. It acts as a verifier of the signature as defined by <xref target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        </dd>
      </dl>
    </section>
    <section anchor="architecture">
      <name>Architecture</name>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="608" viewBox="0 0 608 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,176" fill="none" stroke="black"/>
            <path d="M 80,32 L 80,176" fill="none" stroke="black"/>
            <path d="M 208,32 L 208,176" fill="none" stroke="black"/>
            <path d="M 288,32 L 288,176" fill="none" stroke="black"/>
            <path d="M 512,32 L 512,176" fill="none" stroke="black"/>
            <path d="M 600,32 L 600,176" fill="none" stroke="black"/>
            <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
            <path d="M 208,32 L 288,32" fill="none" stroke="black"/>
            <path d="M 512,32 L 600,32" fill="none" stroke="black"/>
            <path d="M 296,62 L 336,62" fill="none" stroke="black"/>
            <path d="M 296,66 L 336,66" fill="none" stroke="black"/>
            <path d="M 464,62 L 504,62" fill="none" stroke="black"/>
            <path d="M 464,66 L 504,66" fill="none" stroke="black"/>
            <path d="M 80,96 L 104,96" fill="none" stroke="black"/>
            <path d="M 184,96 L 200,96" fill="none" stroke="black"/>
            <path d="M 288,112 L 312,112" fill="none" stroke="black"/>
            <path d="M 488,112 L 504,112" fill="none" stroke="black"/>
            <path d="M 296,128 L 360,128" fill="none" stroke="black"/>
            <path d="M 448,128 L 512,128" fill="none" stroke="black"/>
            <path d="M 88,144 L 104,144" fill="none" stroke="black"/>
            <path d="M 192,144 L 208,144" fill="none" stroke="black"/>
            <path d="M 8,176 L 80,176" fill="none" stroke="black"/>
            <path d="M 208,176 L 288,176" fill="none" stroke="black"/>
            <path d="M 512,176 L 600,176" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="512,112 500,106.4 500,117.6" fill="black" transform="rotate(0,504,112)"/>
            <polygon class="arrowhead" points="512,64 500,58.4 500,69.6" fill="black" transform="rotate(0,504,64)"/>
            <polygon class="arrowhead" points="304,128 292,122.4 292,133.6" fill="black" transform="rotate(180,296,128)"/>
            <polygon class="arrowhead" points="304,64 292,58.4 292,69.6" fill="black" transform="rotate(180,296,64)"/>
            <polygon class="arrowhead" points="208,96 196,90.4 196,101.6" fill="black" transform="rotate(0,200,96)"/>
            <polygon class="arrowhead" points="96,144 84,138.4 84,149.6" fill="black" transform="rotate(180,88,144)"/>
            <g class="text">
              <text x="396" y="52">Exchange</text>
              <text x="400" y="68">Cryptographic</text>
              <text x="396" y="84">material</text>
              <text x="44" y="100">User</text>
              <text x="144" y="100">Request</text>
              <text x="248" y="100">Agent</text>
              <text x="556" y="100">Origin</text>
              <text x="352" y="116">Request</text>
              <text x="392" y="116">+</text>
              <text x="440" y="116">Signature</text>
              <text x="404" y="132">Response</text>
              <text x="148" y="148">Response</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
+--------+               +---------+                           +----------+
|        |               |         |         Exchange          |          |
|        |               |         |<===== Cryptographic =====>|          |
|        |               |         |         material          |          |
|  User  +--- Request -->|  Agent  |                           |  Origin  |
|        |               |         +--- Request + Signature -->|          |
|        |               |         |<-------- Response --------+          |
|        |<-- Response --+         |                           |          |
|        |               |         |                           |          |
+--------+               +---------+                           +----------+
]]></artwork>
      </artset>
      <t>A User initiates an action requiring the Agent to perform an HTTP request.
The Agent constructs the request, generates a signature using its signing key,
and includes it in the request as defined in <xref section="3.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>
along with the <tt>Signature-Agent</tt> header for discovery for its
verification key.
Upon receiving the request, the Origin ensures it has the verification key for the Agent,
validates the signature, and processes the request if the signature is valid.</t>
      <section anchor="deployment-models">
        <name>Deployment Models</name>
        <t>Signature verification can be performed either directly by origins or delegated
to a fronting proxy. Direct verification by origins provides simplicity and
control. Proxy verification offloads processing and enables shared caching across
multiple origins. The choice depends on traffic volume and operational
requirements.</t>
      </section>
      <section anchor="generating-http-message-signature">
        <name>Generating HTTP Message Signature</name>
        <t><xref target="HTTP-MESSAGE-SIGNATURES"/> defines components to be signed.</t>
        <t>Agents <bcp14>MUST</bcp14> include at least one of the following components:</t>
        <dl>
          <dt><tt>@authority</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>@target-uri</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
        </dl>
        <t>Agents <bcp14>MUST</bcp14> include the following <tt>@signature-params</tt> as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
        <dl>
          <dt><tt>created</tt></dt>
          <dd>
            <t>as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>expires</tt></dt>
          <dd>
            <t>as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>keyid</tt></dt>
          <dd>
            <t><bcp14>MUST</bcp14> be a base64url JWK SHA-256 Thumbprint as defined in <xref section="3.2" sectionFormat="of" target="JWK-THUMBPRINT"/> for RSA and EC, and in <xref section="A.3" sectionFormat="of" target="JWK-OKP"/> for ed25519.</t>
          </dd>
          <dt><tt>tag</tt></dt>
          <dd>
            <t><bcp14>MUST</bcp14> be <tt>web-bot-auth</tt></t>
          </dd>
        </dl>
        <t>The signing key is available to the agent at request time. Algorithms should be registered with IANA as part of HTTP Message Signatures Algorithm registry.</t>
        <t>The creation of the signature is defined in <xref section="3.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> the expiry to be no more than 24 hours.</t>
        <section anchor="signature-agent">
          <name>Signature-Agent</name>
          <t><tt>Signature-Agent</tt> is an HTTP Method context header defined in Section 4.1 of <xref target="DIRECTORY"/>.
It is <bcp14>RECOMMENDED</bcp14> that the Agent sends requests with <tt>Signature-Agent</tt> header, as described in <xref target="sending-request"/>.
If the header is to be sent, one of its members <bcp14>MUST</bcp14> be signed as a component as defined in <xref section="2.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          <t>This results in the following components to be signed</t>
          <artwork><![CDATA[
("@authority" "signature-agent";key="sig1")
]]></artwork>
          <t>It is <bcp14>RECOMMENDED</bcp14> that the <tt>key</tt> matches the signature label.</t>
        </section>
        <section anchor="anti-replay">
          <name>Anti-replay</name>
          <t>Origins <bcp14>MAY</bcp14> want to prevent signatures from being spoofed or used multiple times by bad actors and thus require a <tt>nonce</tt> to be added to the <tt>@signature-params</tt>.
This is described in <xref section="7.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          <t>Agents <bcp14>SHOULD</bcp14> extend <tt>@signature-parameters</tt> defined in <xref target="generating-http-message-signature"/> as follows:</t>
          <dl>
            <dt><tt>nonce</tt></dt>
            <dd>
              <t>base64url encoded random byte array. It is <bcp14>RECOMMENDED</bcp14> to use a 64-byte array.</t>
            </dd>
          </dl>
          <t>Client <bcp14>MUST</bcp14> ensure that this <tt>nonce</tt> is unique for the validity window of the signature, as defined by created and expires attributes.</t>
        </section>
        <section anchor="additional-headers">
          <name>Additional headers</name>
          <t>Agents <bcp14>MAY</bcp14> include additional components, such as specific HTTP headers, in the signature.
This can be prompted by the origin requesting additional headers, as described in <xref target="requesting-message-signature"/>,
or initiated by the agent to provide more information within the signature scope.
For example, an agent might include an HTTP header expressing its intent and sign it.</t>
          <t>Origins <bcp14>MAY</bcp14> ignore certain headers at their own discretion,
and request a new signature, as described in <xref target="requesting-message-signature"/>.</t>
        </section>
        <section anchor="sending-request">
          <name>Sending a request</name>
          <t>An Agent <bcp14>SHOULD</bcp14> send a request with the signature generated above. Updating the architecture diagram, the flow looks as follow.</t>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="848" viewBox="0 0 848 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,160" fill="none" stroke="black"/>
                <path d="M 88,32 L 88,160" fill="none" stroke="black"/>
                <path d="M 136,112 L 136,256" fill="none" stroke="black"/>
                <path d="M 680,112 L 680,256" fill="none" stroke="black"/>
                <path d="M 752,32 L 752,160" fill="none" stroke="black"/>
                <path d="M 840,32 L 840,160" fill="none" stroke="black"/>
                <path d="M 8,32 L 88,32" fill="none" stroke="black"/>
                <path d="M 752,32 L 840,32" fill="none" stroke="black"/>
                <path d="M 96,62 L 352,62" fill="none" stroke="black"/>
                <path d="M 96,66 L 352,66" fill="none" stroke="black"/>
                <path d="M 496,62 L 744,62" fill="none" stroke="black"/>
                <path d="M 496,66 L 744,66" fill="none" stroke="black"/>
                <path d="M 136,112 L 680,112" fill="none" stroke="black"/>
                <path d="M 88,128 L 128,128" fill="none" stroke="black"/>
                <path d="M 688,128 L 744,128" fill="none" stroke="black"/>
                <path d="M 8,160 L 88,160" fill="none" stroke="black"/>
                <path d="M 752,160 L 840,160" fill="none" stroke="black"/>
                <path d="M 136,256 L 680,256" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="752,128 740,122.4 740,133.6" fill="black" transform="rotate(0,744,128)"/>
                <polygon class="arrowhead" points="752,64 740,58.4 740,69.6" fill="black" transform="rotate(0,744,64)"/>
                <polygon class="arrowhead" points="104,64 92,58.4 92,69.6" fill="black" transform="rotate(180,96,64)"/>
                <g class="text">
                  <text x="420" y="52">Exchange</text>
                  <text x="424" y="68">Cryptographic</text>
                  <text x="420" y="84">material</text>
                  <text x="48" y="100">Agent</text>
                  <text x="796" y="100">Origin</text>
                  <text x="160" y="132">GET</text>
                  <text x="248" y="132">/path/to/resource</text>
                  <text x="188" y="148">Signature:</text>
                  <text x="256" y="148">abc==</text>
                  <text x="212" y="164">Signature-Input:</text>
                  <text x="352" y="164">sig=("@authority"</text>
                  <text x="548" y="164">"signature-agent";key="sig");\</text>
                  <text x="364" y="180">created=1700000000;\</text>
                  <text x="364" y="196">expires=1700011111;\</text>
                  <text x="356" y="212">keyid="ba3e64==";\</text>
                  <text x="356" y="228">tag="web-bot-auth"</text>
                  <text x="212" y="244">Signature-Agent:</text>
                  <text x="412" y="244">sig="https://signer.example.com"</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+---------+                                                                                  +----------+
|         |                                     Exchange                                     |          |
|         |<================================  Cryptographic  ===============================>|          |
|         |                                     material                                     |          |
|  Agent  |                                                                                  |  Origin  |
|         |     .-------------------------------------------------------------------.        |          |
|         +-----| GET /path/to/resource                                             |------->|          |
|         |     | Signature: abc==                                                  |        |          |
+---------+     | Signature-Input: sig=("@authority" "signature-agent";key="sig");\ |        +----------+
                |                  created=1700000000;\                             |
                |                  expires=1700011111;\                             |
                |                  keyid="ba3e64==";\                               |
                |                  tag="web-bot-auth"                               |
                | Signature-Agent: sig="https://signer.example.com"                 |
                '-------------------------------------------------------------------'
]]></artwork>
          </artset>
          <t>The Agent <bcp14>SHOULD</bcp14> send requests with two headers</t>
          <ol spacing="normal" type="1"><li>
              <t><tt>Signature</tt> defined in <xref target="generating-http-message-signature"/></t>
            </li>
            <li>
              <t><tt>Signature-Input</tt> defined in <xref target="generating-http-message-signature"/></t>
            </li>
          </ol>
          <t>Mentioned in <xref target="signature-agent"/>, the Agent <bcp14>MAY</bcp14> send requests with <tt>Signature-Agent</tt> header.</t>
        </section>
      </section>
      <section anchor="requesting-message-signature">
        <name>Requesting a Message signature</name>
        <t><xref section="5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> defines the <tt>Accept-Signature</tt> field which can be used to request a Message Signature from a client by an origin.
An Origin <bcp14>MAY</bcp14> choose to request signatures from clients that did not initially provide them. If requesting, Origins <bcp14>MUST</bcp14> use the same parameters as those defined by the <xref target="generating-http-message-signature"/>.
The status code <bcp14>SHOULD</bcp14> be 403 Forbidden as defined in <xref section="15.5.4" sectionFormat="of" target="HTTP"/>.</t>
        <t>Origin <bcp14>MAY</bcp14> request a new signature with tag "web-bot-auth" even if a nonce is provided, for example if it believes the nonce is a replay, or if it doesn't store nonces and thus requests new signatures every time.
The status code <bcp14>SHOULD</bcp14> be 429 Too Many Requests as defined in <xref section="4" sectionFormat="of" target="HTTP-MORE-STATUS-CODE"/>.</t>
      </section>
      <section anchor="validating-message-signature">
        <name>Validating Message signature</name>
        <t>Upon receiving an HTTP request, the origin has to verify the signature. The algorithm is provided in <xref section="3.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Similar to a regular User-Agent check, this happens at the HTTP layer, once headers are received.</t>
        <t>Additional requirements are placed on this validation:</t>
        <ul spacing="normal">
          <li>
            <t>During step 1 to 3 included, if the Origin fails to parse the provided <tt>Signature</tt>, <tt>Signature-Input</tt>, or <tt>Signature-Agent</tt> headers, it <bcp14>MAY</bcp14> respond with status code 400 Bad Request as defined in <xref section="15.5.1" sectionFormat="of" target="HTTP"/>.</t>
          </li>
          <li>
            <t>During step 4, the Origin <bcp14>MAY</bcp14> discard signatures for which the <tt>tag</tt> is not set to <tt>web-bot-auth</tt>.</t>
          </li>
          <li>
            <t>During step 5, the Origin <bcp14>MAY</bcp14> discard signatures for which they do not know the <tt>keyid</tt>.</t>
          </li>
          <li>
            <t>During step 5, if the keyid is unknown to the origin, they <bcp14>MAY</bcp14> fetch the provider directory as indicated by <tt>Signature-Agent</tt> header defined in Section 4 of <xref target="DIRECTORY"/>.</t>
          </li>
        </ul>
        <t>Origin <bcp14>MAY</bcp14> require the <tt>nonce</tt> to satisfy certain constraint: be globally unique using a global nonce store, be unique to a specific location or time window using a local cache, or not constraint at all.</t>
      </section>
      <section anchor="key-distribution-and-discovery">
        <name>Key Distribution and Discovery</name>
        <t>This section describes the discovery mechanism for the agent directory.</t>
        <t>The reference for discovery is a FQDN. It <bcp14>SHOULD</bcp14> provide a directory hosted on the well known registered in Section 4 of <xref target="DIRECTORY"/>.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "keys": {
    "kty": "OKP",
    "crv": "Ed25519",
    "kid": "NFcWBst6DXG-N35nHdzMrioWntdzNZghQSkjHNMMSjw",
    "x": "JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw3c5D0bs",
    "use": "sig",
    "nbf": 1712793600,
    "exp": 1715385600
  }
}
]]></sourcecode>
        <section anchor="out-of-band-communication-between-client-and-origin">
          <name>Out-of-band communication between client and origin</name>
          <t>A service submitting their key to an origin, or the origin manually adding a service to their trusted list.</t>
        </section>
        <section anchor="public-list">
          <name>Public list</name>
          <t>Could be a GitHub repository like the public suffix list. The issue is the gating of such repositories, and therefore its governance.</t>
        </section>
        <section anchor="signature-agent-header">
          <name>Signature-Agent header</name>
          <t>This allows for backward compatibility with existing header agent filtering, and an upgrade to a cryptographically secured protocol.
See <xref target="signature-agent"/> for more details.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="use-of-tls">
        <name>Use of TLS</name>
        <t>We reassess <xref section="7.1.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Clients <bcp14>SHOULD</bcp14> use TLS <xref target="RFC8446"/>
(https) or equivalent transport security when making requests with
Message signatures. Failing to do so exposes the Message signature to numerous
attacks that could give attackers unintended access.</t>
        <t>This include reverse proxy and their consideration presented in <xref target="reverse-proxy"/>.</t>
        <t>An origin <bcp14>SHOULD</bcp14> refuse Signature headers when communicated over an unsecured channel.</t>
      </section>
      <section anchor="performance-impact">
        <name>Performance Impact</name>
        <t>Origins should account for the overhead of signature verification in their operations. A local cache of public keys reduces network requests and verification latency. The choice of signing algorithm impacts CPU requirements. Origins should monitor verification latency and set appropriate timeouts to maintain service levels under load.</t>
      </section>
      <section anchor="nonce-validation">
        <name>Nonce validation</name>
        <t>Clients are the one controlling the nonce. While <xref target="anti-replay"/> mandates that clients <bcp14>MUST</bcp14> provide a globally unique nonce, it is the origin's responsibility to enforce it.</t>
        <t>Different validation policies have different performance and operational considerations. Global uniqueness requires a global nonce store. Some origins may find that their use case can tolerate sharding on location, timing, or other properties.</t>
      </section>
      <section anchor="key-compromise-response">
        <name>Key Compromise Response</name>
        <t>An agent signing key might get compromised.</t>
        <t>If that happens, the agent <bcp14>SHOULD</bcp14> cease using the compromised key as soon as possible, notify affected origins if possible, and generate a new key pair.</t>
        <t>To minimise the impact of a key compromise, the origin should support rapid key rotation and monitor for suspicious signature patterns.</t>
      </section>
      <section anchor="shared-secrets-considered-harmful">
        <name>Shared Secrets Considered Harmful</name>
        <t>Implementations <bcp14>MUST NOT</bcp14> use shared HMAC defined in <xref section="3.3.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Shared secrets break non-repudiation and make auditing
difficult. Each automated client <bcp14>SHOULD</bcp14> use a unique asymmetric keypair to
ensure attribution, support key rotation, and enable effective revocation if
needed.</t>
      </section>
      <section anchor="key-reuse-considered-harmful">
        <name>Key Reuse Considered Harmful</name>
        <t>Implementations <bcp14>SHOULD NOT</bcp14> reuse a signing key for different purposes. For
example, if an agent implementor has two agents they want to differentiate,
these should use distinct signing keys and signing key directories.</t>
      </section>
      <section anchor="reverse-proxy">
        <name>Reverse proxy consideration</name>
        <t>An origin may be placed behind a reverse proxy, which means the proxy will see
the <tt>Signature</tt> and <tt>Signature-Agent</tt> headers before the origin does.
A proxy <bcp14>SHOULD NOT</bcp14> strip the <tt>Signature</tt> or <tt>Signature-Agent</tt> headers from
requests.</t>
        <t>A proxy <bcp14>SHOULD NOT</bcp14> replay signatures against other reverse proxies used by the
origin, as this allows impersonation of the principal signature agent.</t>
        <t>Origins <bcp14>MAY</bcp14> require a specific nonce policy to prevent such malicious behaviour
and decide to validate the signature themselves. This has to be done in
accordance with <xref target="nonce-validation"/>. For example, an origin could
require a nonce derived from public information (such as the current date),
mandate nonce chaining (where each nonce is the hash of the previous one),
or provide its own nonce in an <tt>Accept-Signature</tt> response to challenge the agent.</t>
        <t>Such policies <bcp14>MAY</bcp14> incur additional round-trip between the client and the origin
to convey <tt>accept-signature</tt> header, or deployment specific exchanges.</t>
        <section anchor="signature-agent-labeling">
          <name>Signature-Agent labeling</name>
          <t>An intermediary is allowed to relabel an existing signature when processing the
message, per <xref section="7.2.5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          <t>This <bcp14>MAY</bcp14> apply to <tt>Signature-Agent</tt>, when included in the request as defined in
<xref target="signature-agent"/>,
An intermediary updating the member key <bcp14>MUST</bcp14> update the components of the
associated signatures accordingly.</t>
          <t>For instance, an intermediary updating the <tt>Signature-Agent</tt> from <tt>sig2</tt> to
<tt>sig3</tt> on the example provided in <xref target="example-signature-agent-included"/> would
result in the following <tt>Signature</tt>, <tt>Signature-Input</tt>, and <tt>Signature-Agent</tt>
header.</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: sig3="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="sig3")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=1735693200\
 ;nonce="XSHtZVCThSIAksXsH9WBs6AtxtXC0eQGiIcUGSoJstFs8lAWakjhrfwzLhyjtme5iXMZvmFWqDEs6cT3Jf+BbQ=="\
 ;tag="web-bot-auth"
Signature: sig2=:I1QWNzGXdP1a4dSvOHLCVOOanEYHDk+ZsVxM9MLX/p4ko69ghKwR5EOtAD96g7g4GWP7lmpM/jFAf9q8EFRDTPLjUXySwMv4YPgabv2LQihTJG2y8a2m6IGltyruwQNiqSJVUuRaG9+b17CGmAMFZh30X6GXLdQJrCARpeTqPwp2DC+a8haDE/VE5EruqzjA5/2mKwvrkzkSqeW5tOVtFwWRRHIOidquf/8Je6kM9mhgkg4arudLA5SL4wyyYE1jURIgcOl8agrfdJ5Def23DIRtiOLRa8jT9cpTLFAuFHN+mrZA/LH9h0gSIg1cPb+0cMASee5uku1KjWcFer7jWA==:
]]></artwork>
          <t><tt>Signature</tt> is unchanged as the base is similar. Both <tt>Signature-Agent</tt> and
<tt>Signature-Input</tt> reflect the update from <tt>sig2</tt> to <tt>sig3</tt>.
.
# Privacy Considerations</t>
        </section>
      </section>
      <section anchor="public-identity">
        <name>Public Identity</name>
        <t>This architecture assumes that automated clients identify themselves
explicitly using digital signatures. The identity associated with a signing
key is expected to be publicly discoverable for verification purposes. This
reduces anonymity and allows receivers to associate requests with specific
agents. If an agent wishes not to identify itself, this is not the right
choice of protocol for it.</t>
      </section>
      <section anchor="no-human-correlation">
        <name>No Human Correlation</name>
        <t>The key used for signing <bcp14>MUST NOT</bcp14> be tied to a specific human individual.
Keys <bcp14>SHOULD</bcp14> represent a role, company, or automation identity (e.g., "news-aggregator-
bot", "example-crawler-v1"). This avoids accidental exposure of personally
identifiable information and prevents the misuse of keys for user tracking or
profiling.</t>
      </section>
      <section anchor="minimizing-tracking-risks">
        <name>Minimizing Tracking Risks</name>
        <t>To limit tracking risks, implementations <bcp14>SHOULD</bcp14> avoid long-lived, globally
unique key identifiers unless strictly necessary. Key rotation <bcp14>SHOULD</bcp14> be
supported, and clients <bcp14>SHOULD</bcp14> take care to avoid signing information that
could be used to correlate activity across contexts, especially where
sensitive user data is involved.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="DIRECTORY">
          <front>
            <title>HTTP Message Signatures Directory</title>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <date day="20" month="October" year="2025"/>
            <abstract>
              <t>   This document describes a method for clients using
   [HTTP-MESSAGE-SIGNATURES] to advertise their signing keys.

   It defines a key directory format based on JWKS as defined in
   Section 5 of [JWK], as well as new HTTP Method Context to allow for
   in-band key discovery.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-http-message-signatures-directory-04"/>
        </reference>
        <reference anchor="HTTP-MESSAGE-SIGNATURES">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="HTTP-CACHE">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="HTTP-MORE-STATUS-CODE">
          <front>
            <title>Additional HTTP Status Codes</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>This document specifies additional HyperText Transfer Protocol (HTTP) status codes for a variety of common situations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6585"/>
          <seriesInfo name="DOI" value="10.17487/RFC6585"/>
        </reference>
        <reference anchor="JWK-OKP">
          <front>
            <title>CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE)</title>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document defines how to use the Diffie-Hellman algorithms "X25519" and "X448" as well as the signature algorithms "Ed25519" and "Ed448" from the IRTF CFRG elliptic curves work in JSON Object Signing and Encryption (JOSE).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8037"/>
          <seriesInfo name="DOI" value="10.17487/RFC8037"/>
        </reference>
        <reference anchor="JWK-THUMBPRINT">
          <front>
            <title>JSON Web Key (JWK) Thumbprint</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>This specification defines a method for computing a hash value over a JSON Web Key (JWK). It defines which fields in a JWK are used in the hash computation, the method of creating a canonical form for those fields, and how to convert the resulting Unicode string into a byte sequence to be hashed. The resulting hash value can be used for identifying or selecting the key represented by the JWK that is the subject of the thumbprint.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7638"/>
          <seriesInfo name="DOI" value="10.17487/RFC7638"/>
        </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 anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="OAUTH-BEARER">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
      </references>
    </references>
    <?line 463?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <section anchor="rsassa-pss-using-sha-512">
        <name>RSASSA-PSS Using SHA-512</name>
        <t>The test vectors in this section use the RSA-PSS key defined in <xref section="B.1.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
This section includes non-normative test vectors that may be used as test cases to validate implementation correctness.</t>
        <section anchor="signature-agent-absent-from-the-request">
          <name>Signature-Agent absent from the request</name>
          <t>This example presents a minimal signature using the rsa-pss-sha512 algorithm over test-request. The request does not contain
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"@signature-params": ("@authority")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=1735693200\
 ;nonce="yT+sZR1glKOTemVLbmPDFwPScbB1Zj/sMNPEFZcjwJW5jK/taa7HviOXovVwiZOfrrLHS2SbLFUQBxPYZChf7g=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig1</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Input: sig1=("@authority")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=1735693200\
 ;nonce="yT+sZR1glKOTemVLbmPDFwPScbB1Zj/sMNPEFZcjwJW5jK/taa7HviOXovVwiZOfrrLHS2SbLFUQBxPYZChf7g=="\
 ;tag="web-bot-auth"
Signature: sig1=:ppXhcGjVp7xaoHGIa7V+hsSxuRgFt8i04K4FWz9ORJtn57t8duD3cyavsnh9grdWWOJHER8ITNBaqe4mKmPq193S+7hSW31IzXSH4/9WfsdrjUBwyJ0fhBU7oNn3UGDqwdhr5TMgVI2/EX8saV5GrOunM09zMEA+d4QWYyKRFJmg+asCs253l2IYPpVp4N55H0uRK7qhb7acng8LNiEPTQZD2s+Kha95LgeciKQSO0jgR/h59fX/dXqLdFIvRMn8Ggs2VUzF/f/MMEXH83gufVnh4SYl/rKMSKWDBsK+OiLpobAVIuIz+HLCVlMnxlkXkhCW2J/Pmo8jht9N5k/y1A==:
]]></artwork>
        </section>
        <section anchor="example-signature-agent-included">
          <name>Signature-Agent included present on the request</name>
          <t>This example presents a minimal signature using the rsa-pss-sha512 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent": sig2="https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="sig2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=1735693200\
 ;nonce="XSHtZVCThSIAksXsH9WBs6AtxtXC0eQGiIcUGSoJstFs8lAWakjhrfwzLhyjtme5iXMZvmFWqDEs6cT3Jf+BbQ=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig2</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: sig2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="sig2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=1735693200\
 ;nonce="XSHtZVCThSIAksXsH9WBs6AtxtXC0eQGiIcUGSoJstFs8lAWakjhrfwzLhyjtme5iXMZvmFWqDEs6cT3Jf+BbQ=="\
 ;tag="web-bot-auth"
Signature: sig2=:I1QWNzGXdP1a4dSvOHLCVOOanEYHDk+ZsVxM9MLX/p4ko69ghKwR5EOtAD96g7g4GWP7lmpM/jFAf9q8EFRDTPLjUXySwMv4YPgabv2LQihTJG2y8a2m6IGltyruwQNiqSJVUuRaG9+b17CGmAMFZh30X6GXLdQJrCARpeTqPwp2DC+a8haDE/VE5EruqzjA5/2mKwvrkzkSqeW5tOVtFwWRRHIOidquf/8Je6kM9mhgkg4arudLA5SL4wyyYE1jURIgcOl8agrfdJ5Def23DIRtiOLRa8jT9cpTLFAuFHN+mrZA/LH9h0gSIg1cPb+0cMASee5uku1KjWcFer7jWA==:
]]></artwork>
        </section>
      </section>
      <section anchor="eddsa-using-curve-edwards25519">
        <name>EdDSA Using Curve edwards25519</name>
        <t>The test vectors in this section use the Ed25519 key defined in <xref section="B.1.4" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
This section include non-normative test vectors that may be used as test cases to validate implementation correctness.</t>
        <section anchor="signature-agent-absent-from-the-request-1">
          <name>Signature-Agent absent from the request</name>
          <t>This example presents a minimal signature using the ed25519 algorithm over test-request. The request does not contain
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"@signature-params": ("@authority")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="mYotfW3CUjI68sbGw6oKd7kyXqPjZEtU8xFPGWFrqOAf5qC6MDe3pys3SWWCudB0MvwslHy32WXUpkR7u0lt/w=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig1</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Input: sig1=("@authority")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="mYotfW3CUjI68sbGw6oKd7kyXqPjZEtU8xFPGWFrqOAf5qC6MDe3pys3SWWCudB0MvwslHy32WXUpkR7u0lt/w=="\
 ;tag="web-bot-auth"
Signature: sig1=:+NA/cssf4Y2bQTMTkyvTGRCaVzp9quyUevdwwMtMOWhhOOZ2T1subBj0BtvdnrpDEuwSAbiTeElXDzHL3WWKCw==:
]]></artwork>
        </section>
        <section anchor="signature-agent-included-present-on-the-request">
          <name>Signature-Agent included present on the request</name>
          <t>This example presents a minimal signature using the ed25519 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent": sig2="https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="sig2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="e8N7S2MFd/qrd6T2R3tdfAuuANngKI7LFtKYI/vowzk4lAZYadIX6wW25MwG7DCT9RUKAJ0qVkU0mEeLElW1qg=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig2</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: sig2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="sig2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="e8N7S2MFd/qrd6T2R3tdfAuuANngKI7LFtKYI/vowzk4lAZYadIX6wW25MwG7DCT9RUKAJ0qVkU0mEeLElW1qg=="\
 ;tag="web-bot-auth"
Signature: sig2=:jdq0SqOwHdyHr9+r5jw3iYZH6aNGKijYp/EstF4RQTQdi5N5YYKrD+mCT1HA1nZDsi6nJKuHxUi/5Syp3rLWBA==:
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="implementations">
      <name>Implementations</name>
      <t>This draft has a couple of public implementations. A demonstration server has been deployed to <eref target="https://http-message-signatures-example.research.cloudflare.com/">https://http-message-signatures-example.research.cloudflare.com/</eref>.</t>
      <t>It uses ed25519 example signing and verifying keys defined in <xref section="B.1.4" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
      <section anchor="clients">
        <name>Clients</name>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Chrome MV3</eref> (TypeScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Cloudflare Workers</eref> (TypeScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/stytchauth/web-bot-auth-example">Puppeteer script</eref> (JavaScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/olipayne/guzzle-web-bot-auth-middleware">Guzzle middleware</eref> (PHP)</t>
          </li>
          <li>
            <t><eref target="https://zenn.dev/oymk/articles/944069e5eddc27">Python script</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cyberstormdotmu/bot-authentication">Bot-Authentication</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">HTPie plugin</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cyberstormdotmu/bot-authentication">Web scrapers (scrapy/crawl4ai)</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/HumanSecurity/human-verified-ai-agent">HUMAN Verified AI Agents</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/nomadium/linzer/blob/master/spec/integration/cloudflare_example_research_spec.rb">Linzer</eref> (Ruby)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Rust binaries</eref> (Rust)</t>
          </li>
        </ul>
      </section>
      <section anchor="servers">
        <name>Servers</name>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Caddy plugin</eref> (Go)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Cloudflare Workers</eref> (TypeScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/garyillyes/web-bot-auth-apache">Apache module</eref> (C)</t>
          </li>
        </ul>
      </section>
      <section anchor="test-vectors-1">
        <name>Test vectors</name>
        <ul spacing="normal">
          <li>
            <t>In <eref target="https://github.com/cloudflare/web-bot-auth/blob/main/packages/web-bot-auth/test/test_data/web_bot_auth_architecture_v1.json">JSON format</eref></t>
          </li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The editor would also like to thank the following individuals (listed in alphabetical order) for feedback, insight, and implementation of this document -
Marwan Fayed,
Maxime Guerreiro,
Scott Hendrickson,
Jonathan Hoyland,
Alex Sandor Major,
Mark Nottingham,
Eugenio Panero,
Lucas Pardue,
Malte Ubl,
Loganaden Velvindron,
Tanya Verma.</t>
    </section>
    <section numbered="false" anchor="changelog">
      <name>Changelog</name>
      <t>v04</t>
      <ul spacing="normal">
        <li>
          <t>Change Signature-Agent to a sf-dictionary</t>
        </li>
        <li>
          <t>Add security consideration around intermediary re-keying Signature-Agent</t>
        </li>
        <li>
          <t>Add <tt>target-uri</tt> as a valid replacement for <tt>@authority</tt></t>
        </li>
        <li>
          <t>Add more contributors</t>
        </li>
        <li>
          <t>Add new implementations of architecture drafts</t>
        </li>
        <li>
          <t>Remove "purpose" field from web-bot-auth architecture example</t>
        </li>
      </ul>
      <t>v03</t>
      <ul spacing="normal">
        <li>
          <t>Update linzer example url</t>
        </li>
        <li>
          <t>Fix section and name of status code 429</t>
        </li>
        <li>
          <t>Fix typos</t>
        </li>
      </ul>
      <t>v02</t>
      <ul spacing="normal">
        <li>
          <t>Add response status code</t>
        </li>
        <li>
          <t>Add a few reference to improve readability</t>
        </li>
        <li>
          <t>Add consideration to sign additional headers</t>
        </li>
        <li>
          <t>Add use of TLS in security considerations</t>
        </li>
        <li>
          <t>Add RSASSA-PSS example</t>
        </li>
        <li>
          <t>Update acknowledgement section</t>
        </li>
        <li>
          <t>Reference new implementations: PHP, Python, Ruby, Rust</t>
        </li>
        <li>
          <t>Fix signature-agent in the arch diagram to use structured fields</t>
        </li>
        <li>
          <t>Fix test vectors to use signature-agent with structured fields</t>
        </li>
        <li>
          <t>Fix some typos</t>
        </li>
      </ul>
      <t>v01</t>
      <ul spacing="normal">
        <li>
          <t>Add mandatory signing of Signature-Agent by clients if present</t>
        </li>
        <li>
          <t>Add test vectors for request with and without Signature-Agent</t>
        </li>
        <li>
          <t>Update example diagram to be correct</t>
        </li>
        <li>
          <t>Add security consideration about reverse proxy</t>
        </li>
        <li>
          <t>Update why origin may request a new signature</t>
        </li>
        <li>
          <t>Update nonce validation wording and global uniqueness</t>
        </li>
        <li>
          <t>Acknowledgements</t>
        </li>
      </ul>
      <t>v00</t>
      <ul spacing="normal">
        <li>
          <t>Initial draft</t>
        </li>
        <li>
          <t>How to leverage HTTP Message Signature to sign request</t>
        </li>
        <li>
          <t>How to verify these Signature</t>
        </li>
        <li>
          <t>Define web-bot-auth tag to scope this signature</t>
        </li>
        <li>
          <t>Derive keyid using JWK Thumbprint</t>
        </li>
        <li>
          <t>High level Security and Privacy considerations</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+196VYjSZLu/3gKH+pHVRZakITYurKnhRAgQCAkgSC75ySu
CJcUEIoQsUiIrOxnmWe5T3bNzN1jEQIyq3p66vQ0p04lxOKLuS2fmZt55PN5
I7RDR+yxteNer81aIgj4SLCuPXJ5GPkiYEPPZzwKvQkPhcVCnw+Htslqvjm2
Q2HiM2sGHwx8MXunkX0vDNYME5oZef5ij9nu0DMMyzNdPoEBWNBymJ+IyLWF
n5+LQX7ghXnoeZznqc7yG5tGEA0mdhDYnhsupvBqs9E7NNxoMhD+nmFBB3uG
6bmBcIMo2IMhR8KAwVUM7gsOg+yLAeOuxZpuKHxXhKznczeYen64Zsw9/2Hk
e9FUPQeDZjUYw5rxIBZw09ozWJ65MLKFCI2ZcCPojLHVrzAmx7fWh1Ztd8SO
8DG8PuG2A9fTs/yLLcJhwfNHeB9nDPfHYTgN9opFfJyIMBMF/VgRLxQHvjcP
RDHdUBEbGNnhOBpAE+HYHgBRi9gUUJdWJh/EK5O3bB8ICwuCbzlAuyBMdaze
LsjmCrb3fjvFb1zIwjicOGuGgTc8H8kKA2BsGDmOZIge9M0jJwR+oqboNkyc
u/YzD2Hx91jd8SJrCKQRdFNIskJvSKS/hKqBQvRgGK7nAwcDAXG5DpqdRr13
0bkF3skfFLIjfneG0ADyeb7V6HZrR418t3l0XutddRrdPdY5rO9ulkvqEfl3
qbShX6nX6scNfbUUN3TRgVZ60EY3X784kA9sVXeq8MBJ/zR/cSpb2tmobKtL
veOr1n670zzv0Z3trcqOYRgoUqlpXtSuesf5/Uat0+jINrerOBRsanNza88w
8vk844MApNoMDQMoHjAQyGgi3JBZIjB9ewDSy12WXjmSZtuCZ+zhAtk6Vg+G
Vg9RgNe/fHmFTl+/FmB5BRt53DGgz9Bj3HG8eUrRkCYxHRt6ofumv5iG3sjn
07FtwsMLhkvDvCgceJFrGb54jIB3g5xsCbunJgLhz4RPTcC/MGAWjoWtxx8u
2BxYm4G6GOIVUxQMSZWJbVmOMIwfUE34nhWZyHKGURvRiIDlQIGZoFBwpjCa
KIBB2y4b4NSBeUjDwEWfoUoZwpBgaPCGE1k4tlqTcdBgQcihtZwRCCQw3LfE
E9zO4YBCXAQ+GvliROyeoyZTqhimC88SJQMBT9LAXIG3POYLx+YDGJheKAPm
PQmEMxNEDM+3R7YrNXMggDTcYTgb0JvAF6UC64hRBPoA+B0GM5lCa0AdhmS2
fZxBSEoT6OCaC+YNUwMLFkEIXRnlArugXuCtwIt8eH3CXRgnsRdNxjSRVDhZ
33OMSoG1fQ+5DKYLE+IwwJDZkyksoOdyeRVe88U0CuWfSYPGZoF1YbFt6MaB
CTnMsodD4ePs5bMDEc6FcNk4mnB3mZiScQ2jHvn4iiYb8JrsR4CWsgIWRLBM
PGDNtuQzx6ZFyLErWOo8MQcDcYJLsNxI2jFQyGK1dpOBAQnYmM+EgZxLTcPD
jj2x5VwCZJ9AmJEPbJljAXA5H9gO/YGDlVNVl3DVs8I6RLaDB42MqAoXmIBk
dPS6JGkWYSkWeV+CjWbIpr439QLkqDEPGbLRgilJZEPfmzBQ/dTpQJC8AikG
C8bhPXsGdEeaMG+uLtvwKDQ4g+H4BamM5hwmL5uVDMuAaGzGHRvNPI6XBBzX
XAt0AWW25YXYAUksiAcKK6kxJbIou5IiMaCBNcbWNCYosBZ3F4pqhjn2YJY4
jzSpQIvot0PP4gs2szkyRs2yfGRr5A3SA0VgBLAtQBYjYZNALSH85w1B1mEt
XerCEhNgBmgZJ+hHgRSVgA8FaCvT4fYEWCuIpghYjDQTFmFsC/U7TUaPDicL
EIW7INA+8pHnS5Yi7sCVCUkpGNCxHSLeQyHD/ok7GcifopYHv6JOKLBjb47r
ksOOgDQTYY7BMAcTyeKI5uYDbj6gMmGgTZJ559h8DLMlfckdmHOO1hQZZOp5
Q7g6EdASsqy7QJJMgLI8BI0yDXGMaOjBWqEQEtPRwAoMmBGX2AlAtcG4HI9b
0FSebBcNHZuBTiRf18fAnHY0wZlSi3M7GCPxp7ByJP4hyMEQOyGJhzuIJn1U
gKCjSQGiXoeVABwIT4PQ244D/CqFjNpM6x9B3J2wi2RdoHvBYKAngWsGjgfk
kiQhiuihcLJOctwB6mN8PECGNRH+sKnD0eor3YIdO3yBJg+UMsqWH4ztKVAC
e4RnQ3wYbwSS4dtKpY6AcfAtmIvtSvamxqYRKJBgDMSMBwmazQW1IcUaIHny
yIAEQ1GcLCsoK/Av6Flb0ZoGgq8o3aqoAYsagRHS8qw1gVxltXpETaADAB2f
g7UAozImCywJLixsMz1UZArxNIXFA0wEzGpPBJIziCakteXU0aSBAKTUMjUX
TIVpcxQo9uCClAlrRBMJYMWjqba7SVc4RmJ+0G4gRImVotZA1smY0nTQSmu9
aIKFQNQLCtDFLnH8ib4HmgpYMaQYzVXELAsSBMwDNrOWZvGRR8xKKhOwN7LY
sm6T+gQNE/AWGBxfyLXSizOBRXvAe/uASmABSJGDKUjDSYngpPoCA434EY0J
kQf+lRgRBFiKK41uIECcoWPhwBwZIIdQ8WYg1wFmj8YPVgmkDg0DQAHJINAH
TN1xhDvSS40vDAQAE1g3B5WtfFdqBb3EyM40GrAJVyQ/c+E4eTBOXDNsyhiC
pZlLyUPYIbiljCoSCaboCEk36seI9Z2yfJMp6EPsbgLjpAdB1Y5EyuxKgmfB
J9qqHyROJZmFaXrA+wqJZwy51LzIpZ4jHNSINNHkXbLHZA4kJyvPW/IYjIJe
J84yCAjb8AeuOiBoNvEsBeWV2ZDusBoUrGTvrAu6B/Q5KVppNgJj6ABaRQNi
ianjLSSsM30vIDv+ZAtYWcCuAqy4WmNlxBUoV4jWgdEGBmkLaE+ZL8+TsIUY
A4QdDGIkKSG1vgN23IpFRguMPUXMKgwiyxiegF6AyPvC5FGg8IKmDamGyUBY
lkTueFNjF6n+c6gMgRoAJgOpzeAZQ7mG8Dt48yME7SBWE1A93KcZk94GHQaj
B1uRD708/COdD1uhN5RPl+xg7LeQRwFCM+c+jsfz5TKgslYLpYaYXnFAOnXP
nSEzIX5EIhwgz9r0N0EfkiQMXARsrXXV7a3l5L/s/IJ+7zQur8AbPsDfu8e1
s7P4F0M90T2+uDo7SH5L3qxftFqN8wP5MlxlmUvGWqt2uybXeO2i3WtenNfO
1iSl09CVxIK4lCgJ5CM+DQztgNLq7Nfb/++/S5ughv4D3NdyqbT79av6Y6e0
vQl/IDkVl6F1kn8CxRYGn05BkxEMAuE0+RQQtxOQngnGYAkZIkSg5s9/Rcr8
1x77ZWBOS5t/VhdwwpmLmmaZi0Szl1devCyJuOLSim5iamauL1E6O97abeZv
TffUxV/+00Gtli/t/OefDckjQ0/7zMjKkhcJoCkeRx2RWTRAdT//jJju55+N
PTRAypkm1uMkwTFjaznRSAyhNRlzrjwxDSoZmQwPlsxXPiSuyc+EGnU/HuhE
IcGxcq+lcflJFMAT1rAux+pXnbMPEhWi6p5ILazFB7RT6JmeVNQmoW1QLoF0
LOQj8fBJ7t/wg1LKloYrXV493lQMApo0hU16QblCKRLxbxioUtvBt44GZ89x
WsDnXL/tIyzM6kG4LS0d4bc3XT5QOOnIr2H8/e9/5zyYjYz1vPpZZ9mf+MaL
O6ufyq8bv+qrvy499euK3xpPaIlBH6+4x379prZ++Yg/rJ52jBld+/N3txX/
hnEFH+Dj6+NC+ZEzZx1ld/J57FGGEV70stSjiq1827gyvawnoXnV4/fN8Re9
VNAiAAXAbWzFGqfb+iX77PqKVlfO8fvG9a1t/SN5FQTAMGpyLZX2UxFTGcVK
BcxA6OTKop8pfPLDuJtRNwVSx/KplF5KQZNcjOUCAqZ6HaV/iE4muTHwOxj+
nCHxE0YdRcq1i3FOSvThzpcvXRV7qxRKqCde1QQGuqmjGBOxu5ihpJN/p8AX
uQGWHZgeOSQUOA4DBUCV+wfjLBhXU6KVVpCZCeMfitmlE04zGSuov9wWdRLT
OmfoYFGQ1XoSKYB+xQikCLLob1lD2so0SLx+kKDdlmcBNjSMRJ4yw1GBDbXY
QGRhk3WTWwkAUgaLOBCLhALXaCTj6B4sLvhd0ttFMA1e/wG9le0h1YBymAPp
rdgm2mNE+yq6SrHVp0X2dW84xEhJoAmhIbdC+Dp8aXLQ+XiLwL0xiZzQRodI
dS2D+dJ3QV8A8C7FJ3S4Y+Y5gBokNCNbD11zx1CON5k8Sdkjydpx8P7FTiL7
8sMofuaVnZqvhvGWgdSRUgxqe672zuL4ZCEO8RP0U7KD7pYjwAlhGJ1RFjRB
TUlbAIzu/iK3tID+dwACXhOxcqFcqLwtZNBUiF5kmI98+722yu+0tWpW2Vnc
/SWmYR7ccz4J7t7o8d2xY6QVePntcb/biniaYnDmd7YCesGmkdD0CXsOeCC2
NiPfwf00Blg9X65uASNHk8EU9PVbupFInd2FA8ZCvdPp1ojNG3Ud04AXa1OU
CPuJ1eRA1ZaeekVY5Wq1tAt8dxfyUXqMd+m90zuJ1FPKneKdM9wZHsgAWxJ5
A27VugwjXgVWc0bIkOMJeTyRY8lgmoz5Kf+SNWvnNZw1hmY0QVdt5seNqRZ8
jGOQBsAVl2rlpQL9TXYGGpaB3ZS/Q00TW+gQpOuxiScjA8ANmwxm6EuN8gNb
MkygQBImJ2Ihe7ywXnK3QBEAd37khtxTqO1aajZ6LptyLl++xLvLapPkxfBV
7EbtFpG2zLobr5nTnGTKlFv85Qu+j8pQtUB9SvKrodqxgqPou1JgiBQmGP7w
g5jhlFtC7kKs0t4Qu3fXjsJYwDJgLwINPVZpzYwGJqfC+GktUaNrbG1p0db+
BALwEa+W1j5IDPYGoVH87xCQo++4xJkgPcJRvFIDcwt0nDrgn375gSd/AY9c
KCsLDjZF+dVmwYyWMJXoQptegpw8tZ2Bmz/oS8dWE0UyQMs94LgFCp6vDN2E
4yjQ0WhYgTvXc01xp2jDKUylpHyFplYbZvYL/tDLtf2ujUhMnwpIAL9j6OpF
bwI3Cu6yXPG+Wf6KnCRXn8yknB7ou0QTC9f0cJo+kAPpuAhh4r7PF3p/J7O8
HtIVCLW1mU89aRh1yhqQXK12bRQrQAuaqvCr3JKL8SIhPJkRAL3PXyix3JKj
rOybxEvSSuE+FZA+CoVWPzXLsiXc0eHIxBIDJ8XwInkskYpcvNtMOxGIpNJx
zZyWqHiEigc06gRWnIbJpoyn9+JJTxCcezG4VQomeWHVouYML3F8ljaASEQI
lEr9HKenADumIpqJMIKfMIVZHKJZfOIYD8mlNvDs0ThMKOamiYEL4Cv8apOu
CXWOAaWJ2OBZZUQYLuKITOGH3Hb19FVU3fZxf4z8Fl9Q6oWhN4rIaWKumL/g
i++gmTZNUnNDe7plME5L2hy4xVWGQgklPpF6JXbBEiqmgv0D8LsK7Gpq8XhT
OLOrYNl8BAItfSxMUmGO5z0EiaQWVoV43vSOf+PP6gDQmz598vMyBvTGz+qw
go4CvfHDliJE7J3nXwmsfOOcXsaPvmNO3xBB+o0/qwNPqqdC/vf/FF6bk/qR
jPIrO2r0WHHKw3Ex9IpxgtF3TUX1+PY6/ZpASHBBBibywff+rApe/fpCnlI9
5ZvuNAr3UKg/fisSWvvwp78lHWTk6dXxJD/Kmn0sbW+oH2jtzTl9S6vKLspW
S/jzj2iVvLmPawNeAdzw8ePaO21+Y6vgfX3MZOSu/YZWl4C7XME4nZYArl9Q
tq0Apv5lHy9b/fEfIFU/SpCcRBfT1iTrfIRzL8EqpULKGfl+yIc5gHdLXP0b
WjFacosz9nmWXLivuZRDheZ9xbRe86lk5KmTQkWxz5uY1C8/vGnRMeKkcXb1
TYwdh58IxtdMU0zDfIrAQ1uAcz4H8zLWOE5uxHkp+PEyLEZuB1f5spRi5yq8
V0AAoTQ2UiZJZdPtLXsvcdItYmbLtjDbXSE8TFLRiA4TRQCWD1OAMsdiiIXY
O95xB4+BJY6DzNHAQaTAND73TbwgI+RBCH9iDA8GojgZKLW5UWGAHQc2+Eru
q35rqVqoFjb1KhEaS9HnFZCnRIOP2JKKoJ18e4jPo2OBfoWikJWT8R0p7PiM
jUkwQN2ZWv/4DYRz6GdSyqh80PJE4P4YUsaXenLJSyTWzgwyUHk/FPN5i07l
XdbzPJni2IkTEF6h12bC0Et56grJsmsZYkfheSE6xnJof2nHI5f2TSimn07U
Tvk2FGPmcegpReeV4bk3vNyuPcFyCso6xxAWZUWm8nfNsTAfctJdHGPugBu8
TLfBQIopEseBUgNxjjKEnHhW6Sg3PQYLbWJYQOVBqP0JrGcwjDw7iHyZ6Cem
rIRDrGiXB/hJbUwodh1y2yF6gWwpUYtJklLauZcamPjsNYUYUNqLlAXcsVPR
wTQrbW5ssH1uxRuKb4paKS1q2QluZjZ3sEv0ubhvZZQSjFUqRNKZGCTF1Uet
hJl4MP9soHS5k+p3d7IA6aP2Me0vjiDZ1qqm1ZLQfRlUwJfipEbJ2DIPhfoe
ilDNJE5wjAtLkI62q3MYQSu+uq22Kvy4Ivi4rNhsmYGWDi0FwHoBCJv2hOWu
I/wG2AUTxxxvQGpfBUvkNiNX15UGIx2VI1slnyLJioMWjqd3m3yZgKkCLLot
vO/QHpMgxkTKJ8NglO2FITpUNadAxgOMOWOURdcDHOgNRhVxDBRJkgoWnHSy
DZkk7+nYj4wwxAuh4tm+oPxdUyxtY5LGPrw8OKewlNKr2i7y1HqClQu1qAtK
PmSSO1Kh9/eWsCHtxx454veB5xpfACGuYTXB2h77Qmhx7QFcgz22dnHaXsvJ
K6Y/wysNubugrz7YFl49PzT7+0G4dXBzlD+vVN1j67nl217fDa3n80+j8WX3
4f74vNXq3s/1m0/43ol/eXZfbX/e2bVvGt3d/Oxw5DcX5V3TOdyt1z977XYw
r5jVg41BoN8DEIBvon+irriDIVwpbZfK27uVrY0NdRlcBXm5WtmpwmW4+tX4
KmErhUsuojDvDfMDmbMzmQCvmdnCDgV/kkRDoxanE1PNYKijILZPOyjIp24s
o4oXlC2acDcizscoGfGpbkqKNmX/R7S+mCKsYjptymumK4ZR1zstnB3Z4XE0
QDPvBTbxBuXYJqnQMMDh0H6SbZGts4MgInSAD42keQX+oJhg3A5lHEpYANxE
icIY/xoho7pc1jOt2gZReuTFbkhe3viqU1BlPimyP2bzY3IiBShhNCqTMZu2
qZqV4jS0nZBS5VWep8ui6cjnltIPKyq6KLfWirOewFQLsQru04AopGiJEK0g
ZSZ1Ve0M5kQGqFm5SoOE+YN5R+L1zrqG0RdU6RRg2nA6Pl56FznUFTRWIo8A
FzNjv3xRFXXgqvxEvt4HZCZUuGDdVZWJSqnVBT6yCmLCHzK5cpSG/QJDBQV2
CLOUebFomwIPPWtP5y289FfgMRfzn70oMHiIibsKz5vEkiOAKUxeR/ACkoTx
UsQNsiJLb93oYCvucyDEoEQEzW4gAGaa0LpgIYmB0kt5eknuLmhZ0wTExPcg
7cdoOEXESYQcdShm0CELuZpLUIe7au+GtWWKBdWoNYE/sZxROyNqxxOm5kXI
llrOoUXsj4Rqdf6GLoRI0hZgKWppg4UvKwGm+i4YWIRI3QWV5PkPycomCXyq
bcxTds1FJndCjYTUTYJ0aToBq7evMmCywJYmqKt3VnWjctdBOU6xZsunkhQ0
xl4kt98maGu5ys2Oa+iQN1CgMUlEEvqcLH4CWkGFEAjIJ5e+GrGgqJR32nRU
eSiODkTTawXWH9sOCnl6u+0ral+dtINcq5ojtzIxtMvghFok9Kq0puS2HwOF
ZAOttKicB/gAvS/U3Ae6Uic9samHSTRCFzTFj0xTrLaU0pIVCFihIwmT5Pio
LDSuNlmFoQqs603itBqq5wCcZ8U7mTZtJQLnBbJQIfQcivRTng5ZKVxxBbeo
2oW0L6bWUt4RLj3gPFttTxGaqoM6x6xZaFJn6JGkSh2ezjeQGzAjEZIJkO8g
V9B2Mw+1r5RLISol5ybV3Em8J8sz4vepZdzi8jxy2UGrBVhTkEMYiF4gB7pT
TYymCiDu5CFcAL3foXx2bHDKbQzs9ICvbdemyWG/UpSoWpUeS8aRcUOVPKka
OwYWyrayFSlUbqDEjSpoo2AKzALqNqVKpli15ruK1l2ZStWlepsgtlFY6sz9
yTBygJA6A1jVg+rkc1p0lYp13KrVX8ulqLyTCAP2VDYSqEEMwA4+IAOi4EWW
nZocxwqgCL1Yd2Qg89smltKzBsctybhuVkGulEHkWhp5sJhMBCB1Uo24IlgY
pzZk9UYp8akmdJrEmQJFQTyARguMivYm7KGBZVTCSni5I3AE30LaJOUempTD
TrO6xPuxxEc+GdsCRpeMeGcSoz5aTuLkbXiRohhzL679QddPpwxkagJzhiye
VPyGw7AISJkZwQvifUw9PO1hxILcyRjorFnG2GXaEqftsCqrUyGJgRjbanMx
1VxOOcZYlhloz/UJkZ+D1XrCyCaA3tFoXw0u6HK2lLhhqKsAUF02m1oZdPOm
bLn5t0IXFMGMa2oQcrxsVSV4pJx/XWkulWR68jZVQschSkO7ChTCTPBxtkRd
JQ5gFplpT7GkMUm1pwKI7FZ0kvERe8zSJJABWmQSTRD7T7ijVA2sF5/Bbz5t
T1vwssTW2froBBTG1d2qdk+F24ABqPYY/CXESL5Fpk3VPbww7l9JCjL787o0
G7nYSKYjZ4HVsjOgIMWWFVRKJwL8pJMcyDCo6nsc/YecoVCAagkAn00i8NOc
SroFqqI4hkoZTzwYJ+QXM6ISTO0DZSlo4IAOEjrh6lVUeKtC8b7OV8eaeVV+
KBLbBqvYxZHHMEHlc0R+Oq/Cx8Mp8sTH2kuleSaeaiIImPVrYjnXgt1xOZwg
GY7OAKM84TgBOWYZobbAX8t7ozwn1OUo/amSNRnNQDaOz43AJ5EmsVeXioIj
Lk/lCqfq4XJUJp7NN3p7L0R7GUg4gA6yoviFaKt6cR0EfTOD3Vi1NfRiwlE6
HULmwJFWlZsW01hyUvlpkqcMcBo9Uya6pNUHCQ0dAwJTOqR8GDzYw5TS8Xrf
L9UYCckdtF3G4JyBv1XudPxI7yRk497qan7ZkdcEw8o4JZiYh/cyDe+9UPFK
dW7Em2cYoAG12thjP/7tR0alZXNATFNKXAfKgmvMdrZ3y6kk+dTeaCW7OZqa
QAHPN1kzlsZDL5W/eU+8svbhbwb7U7K5Xalu7exubWzgVbWN7B1sHM89s73f
HU7PF9V+ZTA9EYvDo9vPzcvPt9PHp+79ZeXWytfPamv4GnhmH9f8gOenQZAH
VFYtlel6stcNnexWyrITUjIf1266x+Gn63pv3G3WHoKb4Hi3vx9s1cKn8Ka+
IS6P7KZ5ddT1ToLwMNhxan3+cD/2h/Pns/HiPpyIqn3T+jSbHPYfDxrBltmr
nAzX9weXHz9Szy93rhOyKYLtNUuX/fPnoxurXeKbVnd2cXxWv7644G7j9vjg
Yf1TcP3U2m2d3RSnmw/e1u5ofDrvVBsXYe1gd2u0Pdo86re3ncm0Vbw/rA13
H3cah52DXvvs/upm0Z23Zpu37REfzMpnl/a4d3JUXuzw8mSreeSECz+aX57b
j92T66uow4921wel7frRpNY6/DSubNxsHd2cWZcnfr3WmYreY3s+LR/U1/nO
mB80iteNasOPHp/va9VieXI6n/kPzw/dR9GvhhfX4eG83+kcNy9s6zEaFndO
xNZDa3cyHj2MNrkfWWe1avdsc75Y3DZK91ed5si8cHb4yB9aJ9UDMSxXDpqd
0L446/Cd+96uOe2dHdaiw+Pz9Yn/qVY8O94db4y6zVHJbA/WN8xWrStENXqI
Sqf3ffNQ+Nv3/drHj3syQpkGKLQLILWxpQ3bgA4dodoM3Hsq4Clhq/aksWDj
5Ya5L4ZUNI8tKQWV1RRMaoqCUTB+YG08XMVcGQZT4cmmqj9fVWgOOi6aaMd7
GegHq86KAUQs603oGCSUewvMWZgGPqpEJD50KaVICWfE6NtQie14ZgN5fRKf
SNzgLOIgPLkFw+VgRwLUcV6GDsZwEMLFRNXDaMymduvk0VDxeJaSBrR5Nbg6
sqWZwvx4ZoiQG1Hpk2F07Xio8nHpPlosdJ+NJNIT13bKqigdXmHHVBRb93w0
xfERNmShCIqSv6mcgdhDHGA0R5IrhSNlfS1uKYHBiLhTME7RnYijb8kRI76H
WI5Cu67chlZLT56WXjaqss2xNXCzg7w+msrz8wYoHqwB17bI9PncEX5+Vlr7
oLAmn3m2RbaSWgPmoAgmHW0wZAo+O87C0Acv0QqngaKs1yIgLGUK/PZIhnXJ
SRrKRGsqnDcprArOGhB5SJFTSd4WRQOe8WZPP9Wxg4eAYgXytJv4dR9v5BLX
Lus60oQYlsHlHQS4uTgcZSgHmFhZzUaGWeVJFegSo6y4AmEUxwNdTtPBhXij
3lCOMTZOux7Z8HOIPrqpyuflcDRfpOmGgmyYeitCZ5OYir/o3BVgDxQOeXSD
qnSAmQt1AoqspvdhPHiOCvnhRGhQRJwOAHFnniM3vvG8NCwjWdY92dOq0PFw
PVVwYspYmTp3DbcZsJUegrtr8nKl6up0awAh8+1ul8mzPLBkB2yvlA4EC6AL
ZDK9PmJA7wPqRJSOep9c6HQIJa7Q2f+GTYDMFmNcW4lBlPiMwexw0gfYyGOP
AvkAxvGCjMOW5TW5SGboypD8KljPByTAZA1SsFgRPEGMJOcYdKR4WMYnTcJy
WVCTCkFT8B2HrPOSpTrXGBwdeL1rizFkg7+VbUXxbpwYJRdk/QtlJve+B1am
oeAeS+XWwZ3lMgl4IAMd/yDocNFbDz51SiPn9KInJtdng0n74HDe7pqD/dKn
+2LQOm83Dj+Z9/OTfvX+tBhyvn08sy9uvNn13P50MfT9s+NuuTs4O7y63H9q
336qj4fbo9fRocoFfKs4ZwmDkP5Z3qeR2WqBqnfJVKjoQ1Lk9gFekW4l4pTS
3Xet7yoPoPTx38u4DPJLH/em05uxeXR/Pd1+4t7xUZNvX6+Pg+5T1Bkdhjv2
xubp5mH/efeicxK61e1wx4oOKuaCzwJ3vDvyrX7/4uS40dlp9s73+aPYnJxO
2o+l3Up3fXvc7VdKzWdwYzaLu/1hYPn3V/vzxcnGcLx/te2du5Wro4PHuTX2
q73W6LpZLjZudgJ+XT3yLyK3tbH73GrU1q3Ny/7t4rRzeDIZrfOgHpSrFafc
vG1Pr6eb59Xq8UbUOd1+HA+2uemOds7O7Ua7d/npoBysn475bvVsBPbo9LJ7
sXE/6hTH1d3hTdG6eTyzDpuzTsvdORoF5eur58PisNhqNW6OdyqjaHjtjje7
t07RP211T/sH+8Hp+oV9NvUGtetm1HxeR0fIablPzsPNw7jeL58U2xNv534c
7p5XH4qLUgLyVyngOC6hsZSXjU98+eFdB/2fq6yVjg7+MEp62XlXHus7cYH3
dfsbYYHyH0Vj/LPDAv+7ir/8WxV/Ei96ly9+X7zo/yxj/Dte9M+NF4ElaVgH
3ZryZeqRD16DsDDBKqCMve9wa1SO3ztuzeZvcGv+JbwadcDCv90ZVF5T7/Hh
7MheTMaf+xtRe6v96XCet2biuXJ50qt2PefxZr/er+z4G1eJ8lIUfF9rTW69
cNiv1K/um1s7weBovuWdWtsPi5vH9v2nRni183TYPuof+o8XtWH1sb7VOhCV
6SKodPv9emTtb7Rm88A5XlTK/Zur6UNnO9pwwuL8j2rO/jf8mH+t9XvhwKyf
14pmEAw3b8uDy16r97CY9Y46dX79PN19jBZXYmbN562wddEfjy8uPpV7pSAa
7N9v7Iczy/WnB41o3q0N7J5oODcHz8dnlX7/tD7/PQD+n6Rz/o3Kvw18/c/y
v9g53+6WW4dW8dG3tnrlTiW0hrUoqp27o9Pm9tlheHrbLM68+fPDplP7dMut
5s3WvF+utuZH2wf13m7n6rR2svF4/XC1MWmIs4bTLz3+YeMw/xpw/F+LI17g
8HvrcaP7eDE/thbH/u66X72fV+zbT8db/Pzo1L6/nRYb4ANsdi57l5ZdPa/e
3p76B+uTeq90XCu5nw4Ce8s9OY2On67sYrW7mFb8s/5+Coeypcw4HarHT+JQ
nB6PAorosLc403lpRwRTopOPFiDCUwee4usDTHmRCSuSK/+qGea17+xoNYSa
FncmC2b8lR9UTcX/+un3tvBBHisVIU7Vmlor+Dj/WudrL+IsvN+OrRHuq5Ro
w/iZ/ZXOqRWsdV1JJqM+sYTjS4ab+bDTB/ZTbzEVXdO3p+EH2VD8JMNvTAk/
+J0NtiOYVyjwBF66urK5IFyE5pi+NZX5vJOiITR7wmc83exR9PzsCPVRHXBy
xMp2Pcee8oUriiN6PPvtqORdaL993FbjXYAacV8M9lm4bsESs6K3mDwUuR/a
piOC4u7m5sbWrqgKyzLL29gOvS6b2oee8LtduGEn95NX03KBZ2aBCzSxvHAS
FfUAk9eW2j3utW1MsYxG9istvro66Wbw02IwTY5bpewn+m1RpI3WTW5/+AcN
9apVO2fX+nj4WlOW1K9mKtqn1jU3RdpqzuuT5fPclrp8qYMz230W/srmXG/C
LTuaFB16pjhwvEFxwrFKroj7kEXMoxpJBZMi2WfFdJ+1sH/Ghwv+AHruRIOF
7LeDn1EZ2C4d0f6di4DvfpAp3PLYeil5YGYXv21Vj7z/IeGtTakkZeJZkbNa
wkbcX9iOswBZyH6Yjd6EJutypr2Up49NN13215PuxTmT28rfM069kLZbhE4e
gCuyfRcRKND/PuN+Mt77DPc+473P6cyUz7NSAesfP9Auc83U3+SgYhjjy578
ACDAhLUhdwKx9lXiZWFRlv5c1gDh92Fk5R3iI+4+LMGtJFcChAxr8aS+5850
DLhJfuPC8wFLfaB8g6EQFu5Y41lcAeZ3qGMfswEPyh5M73/njRb359xlhxys
Yg7+esK62KNIALa3fS9ndE0vDNkxmBjfNh8CPILqBPOL8YTDY2/hQC85o+aI
J9bFs9J81uL3no8t+Q/s3KNCxzGf5IxGBGJoe6zNXYENn0UmWOU2961I4ONO
KNjVwIEb3oi7HA9OuBbODOjgY6c97i44aoQJl58boLQmxxutJvhsYxOL2OVT
L1wtmZwyzFs2RZmAF+HZmmUlRXHZzHVO2bPZBEpoDIFfBhlT66qpu9SJqerg
czrUnbK+TfnpMVy5zCmt8lUqKKQqJaxMQM6X17GoZDkJBEtIMgdpIV7CFzoA
hGaCralUpDV1ogeFstJsn31dKTEkYAUJeCWTvKQqjLFJ5Dtw7xBAh47TIbPh
1xKpcixdoF/eVU+GCxgGtls21HTivObUC+oWB4aep8qeMa0JK2So8IJb6usV
6uHsWmEpOSzIijPl1ONRXIGZ/s7ZUsWUejaV66EpE9OEx4IvF1ORgkivx71i
xfYYYIYck8Yox9A04P+DUFM064NoR4w+y6dOSdMnDsafIrGU46VJnQmPqmeX
mlVHKaxuIEBQGC9YSS+YzILHmmENToGOy7KFBxLqFL2hDlOoBjIDG9KniVKH
x3E3+RDMS5lSVNcsmCLFQOhI7jtSPMCWMyUlSbvz8SJdi/LK6SvJ8+5y+eFc
pl7LQrDlajscWJZdiLIbSNmmPNFGSi78fYxHPXhU9uijx/zKAdSaz3V4KH4x
ObQkXdGKB0bIrwhlhB8PkqFPJXlToYL6mTewZEKdKSGDSnhGcXI2MfYK1kZ9
5zCue0Ya6OTPJbn6/w2npArqdwAA

-->

</rfc>
