<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-webbotauth-httpsig-protocol-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="HTTP Message Signatures for Bots">HTTP Message Signatures for automated traffic</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-webbotauth-httpsig-protocol-00"/>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <author fullname="Sandor Major">
      <organization>Google</organization>
      <address>
        <email>ietf@sandormajor.com</email>
      </address>
    </author>
    <date year="2026" month="September" day="01"/>
    <area>Web and Internet Transport</area>
    <workgroup>Web Bot Auth</workgroup>
    <keyword>not-yet</keyword>
    <abstract>
      <?line 68?>

<t>This document describes a protocol 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>
      <t>It defines the <tt>Signature-Agent</tt> header field for in-band key discovery, a
key directory format based on JWKS, and a well-known URI at which that
directory is served.</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-ietf-webbotauth-httpsig-protocol.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-webbotauth-httpsig-protocol/"/>.
      </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 80?>

<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</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 a
protocol enabling agents to cryptographically identify themselves using <xref target="HTTP-MESSAGE-SIGNATURES"/>.
It proposes that every request from bots be signed by a private key owned by its provider.
This way, every origin can validate the service identifier. <xref target="trust-model"/>
defines what that identifier is and what validation it establishes.</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 platforms 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="objectives">
        <name>Objectives and Constraints</name>
        <t>This protocol has two objectives:</t>
        <ol spacing="normal" type="1"><li>
            <t>Continuity of bot trust, so that an origin can tell it is dealing with the
same party it dealt with before.</t>
          </li>
          <li>
            <t>Optional binding to another anchor, such as a domain.</t>
          </li>
        </ol>
        <t>It works under two constraints:</t>
        <ol spacing="normal" type="1"><li>
            <t>Preserve the simplicity of usage for bots, and the simplicity of action for
websites.</t>
          </li>
          <li>
            <t>Require no pre-established relationship between the two.</t>
          </li>
        </ol>
        <t>The second constraint is what rules out shared secrets and per-site
onboarding. The first is a statement about operational cost on both ends: a
site today greps its logs for an IP address and a User-Agent, and with this
protocol it greps for a handle it can verify.</t>
      </section>
      <section anchor="http-layer-choice">
        <name>HTTP Layer Choice</name>
        <t>This protocol 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="trust-model">
      <name>Identifiers and Trust Model</name>
      <t>This section defines the identifiers produced by this protocol and what a
verifier can conclude from a valid signature.</t>
      <section anchor="url-is-identifier">
        <name>The Signature-Agent URL is the identifier</name>
        <t>An Agent identifies itself with the HTTPS URL it publishes its keys at, carried
in <tt>Signature-Agent</tt> (<xref target="signature-agent"/>). A verifier resolves that member
value (<xref target="key-distribution-and-discovery"/>) and checks the signature against the
keys it returns. The identifier is the URL the verifier fetched, which for a
<tt>directory</tt> member is the well-known URI rather than the value the client sent.
What the verifier ends up with is a pair: that URL, and a key the URL provides.
Origins can log, rate limit, allowlist, or block the URL the way they do IP
addresses and User-Agent today.</t>
        <t>The URL on its own carries nothing. A client picks the value it sends, so an
unresolved <tt>Signature-Agent</tt> is a claim rather than an identity. It becomes an
identifier once the verifier fetches it and finds that it provides a key that
verifies the request (<xref target="discovery-is-not-trust"/>). Until then, verifiers <bcp14>MUST
NOT</bcp14> attach policy to it.</t>
        <t>A valid signature over a resolved URL proves that a holder of a key that URL
publishes signed the covered message. The message can still be replayed.
Signature lifetimes and covered components bound the duration and scope of that
replay (<xref target="generating-http-message-signature"/>). It says nothing about who
operates the Agent, whether the Agent is benign, or whether the request is
authorized. Those are origin policy.</t>
        <t>Nothing stops an Agent from abandoning a URL and standing up another one, and
the protocol does not try to prevent this. It targets honest clients that want
to be recognised across requests.</t>
      </section>
      <section anchor="rotation">
        <name>Rotation</name>
        <t>Because the identifier is the URL and not the key, an Agent can rotate keys
without losing continuity. It publishes the new key alongside the old one, then
drops the old one (<xref target="key-rotation"/>). The URL does not change, so a verifier
that recognised it before still recognises it after. No name and no third party
are involved.</t>
        <t><tt>keyid</tt> selects which key verifies a given request. Verifiers cannot use it to
carry continuity across a rotation, as that value is derived from the key
material.</t>
      </section>
      <section anchor="no-url">
        <name>When No URL Is Available</name>
        <t>A signed request <bcp14>MUST</bcp14> carry <tt>Signature-Agent</tt> (<xref target="signature-agent"/>). A verifier
can still be left with no URL to attribute to: discovery failed with nothing
cached (<xref target="discovery-failure"/>), redistributed material carried no proof
(<xref target="redistributed-key-material"/>), or the header is absent. The identifier is
then the <tt>keyid</tt> thumbprint defined in
<xref target="generating-http-message-signature"/>. A verifier that already holds that key
verifies the request, and attributes it no further than the holder of that key.</t>
        <t>This mode has no rotation. A new key is a new identifier, and the verifier has
no way to connect the two.</t>
      </section>
      <section anchor="discovery-is-not-trust">
        <name>What the URL Endorses</name>
        <t>Resolving a <tt>Signature-Agent</tt> URL over TLS establishes that the host named in
the URL served this key set at fetch time.
Whoever controls that URL says this key signs for it. That
is what makes the URL usable as an identifier, and all it gives you. It does
not say that the operator of that URL is honest, or that it is the same party
everyone knows about.</t>
        <t>What matters is the association between a URL and the keys published there. A
verifier that already holds the keys does not need to fetch it. A verifier <bcp14>MUST
NOT</bcp14> attribute a request to a <tt>Signature-Agent</tt> URL unless it made this
association. This can be either by resolving the URL itself, at request time or
ahead of it, or from <xref target="redistributed-key-material"/>. Verifiers may refetch a URL
to handle key additions and removals, bounded by <xref target="cache-behaviour"/>.</t>
        <t>Where a verifier obtains the same pair from more than one source, the newer
pair wins, including when it omits a key that older resolution included.
Pairs are ordered by when they were produced, not when the verifier obtained
them: the <tt>created</tt> parameter for a directory response signature
(<xref target="origin-binding-appendix"/>), and the time of the fetch for a directory the
verifier resolved itself.</t>
      </section>
      <section anchor="origin-binding">
        <name>Binding a Key to a Web Origin</name>
        <t>A well-known URL is a special case of the above. When a
<tt>Signature-Agent</tt> value resolves through the <tt>directory</tt> type
(<xref target="key-distribution-and-discovery"/>), the identifier is still the URL, but that
URL now names a domain rather than an arbitrary path on one. <xref target="WELLKNOWN-URI"/>
reserves the path, so the domain operator stands behind the key set.</t>
        <t>In practice, this is meant to allow additional information to be carried against
a name. That mechanism lives in <xref target="origin-binding-appendix"/>. A verifier that
wants to use this case may also recognise the shape of the URL and apply those
checks itself.</t>
      </section>
      <section anchor="out-of-scope">
        <name>Out of Scope</name>
        <t>This protocol does not authenticate human users, does not provide anonymous
authentication, and does not define authorization or delegation. It does not
define how trust is accrued, held, or exchanged, and it defines no
mechanism for one origin to convey an opinion about an Agent to another. See
<xref target="privacy-considerations"/>.</t>
        <t>A client has a choice whether to sign its requests, and an origin has a choice
how it treats signed and unsigned requests. Multiple factors could influence
either decision, but the decisions themselves are outside the scope of this
document.</t>
      </section>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <figure>
        <name>Web Bot Auth architecture</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="496" viewBox="0 0 496 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,112" fill="none" stroke="black"/>
              <path d="M 56,64 L 56,96" fill="none" stroke="black"/>
              <path d="M 88,96 L 88,160" fill="none" stroke="black"/>
              <path d="M 120,64 L 120,96" fill="none" stroke="black"/>
              <path d="M 144,32 L 144,112" fill="none" stroke="black"/>
              <path d="M 224,144 L 224,176" fill="none" stroke="black"/>
              <path d="M 320,144 L 320,176" fill="none" stroke="black"/>
              <path d="M 416,64 L 416,96" fill="none" stroke="black"/>
              <path d="M 448,96 L 448,160" fill="none" stroke="black"/>
              <path d="M 488,64 L 488,96" fill="none" stroke="black"/>
              <path d="M 8,32 L 144,32" fill="none" stroke="black"/>
              <path d="M 56,64 L 120,64" fill="none" stroke="black"/>
              <path d="M 416,64 L 488,64" fill="none" stroke="black"/>
              <path d="M 120,80 L 184,80" fill="none" stroke="black"/>
              <path d="M 368,80 L 408,80" fill="none" stroke="black"/>
              <path d="M 56,96 L 120,96" fill="none" stroke="black"/>
              <path d="M 416,96 L 488,96" fill="none" stroke="black"/>
              <path d="M 8,112 L 144,112" fill="none" stroke="black"/>
              <path d="M 224,144 L 320,144" fill="none" stroke="black"/>
              <path d="M 88,160 L 104,160" fill="none" stroke="black"/>
              <path d="M 200,160 L 216,160" fill="none" stroke="black"/>
              <path d="M 328,160 L 344,160" fill="none" stroke="black"/>
              <path d="M 432,160 L 448,160" fill="none" stroke="black"/>
              <path d="M 224,176 L 320,176" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="416,80 404,74.4 404,85.6" fill="black" transform="rotate(0,408,80)"/>
              <polygon class="arrowhead" points="336,160 324,154.4 324,165.6" fill="black" transform="rotate(180,328,160)"/>
              <polygon class="arrowhead" points="224,160 212,154.4 212,165.6" fill="black" transform="rotate(0,216,160)"/>
              <g class="text">
                <text x="36" y="52">User</text>
                <text x="88" y="84">Agent</text>
                <text x="220" y="84">signed</text>
                <text x="280" y="84">request</text>
                <text x="320" y="84">+</text>
                <text x="344" y="84">URL</text>
                <text x="452" y="84">Origin</text>
                <text x="152" y="164">publishes</text>
                <text x="272" y="164">Directory</text>
                <text x="388" y="164">resolves</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+----------------+
| User           |
|     +-------+  |                                 +--------+
|     | Agent +--+----- signed request + URL ----->| Origin |
|     +---+---+  |                                 +---+----+
+---------+------+                                     |
          |                                            |
          |                +-----------+               |
          +-- publishes -->| Directory |<-- resolves --+
                           +-----------+
]]></artwork>
        </artset>
      </figure>
      <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 of 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.
How a User directs an Agent is outside the scope of this document.</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> that expiry be no more than 24 hours.</t>
        <t>The components above bind the signature to an authority, not to a request. A
signature covering <tt>@authority</tt> alone verifies against any method, path, or body
sent to that authority until it expires, so anyone who observes one request can
reuse it against the same origin until then.
<tt>expires</tt> bounds how long that lasts; the covered components bound what it
reaches. <xref target="field-compression"/> covers what that costs on the wire.</t>
        <t>Agents that want to narrow the scope of their signature <bcp14>SHOULD</bcp14> also cover the
following components. A signer that omits them remains conformant.</t>
        <dl>
          <dt><tt>@method</tt></dt>
          <dd>
            <t>narrows the signature to one method. Defined in <xref section="2.2.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>@path</tt></dt>
          <dd>
            <t>narrows the signature to one resource. <xref target="example-multiple-signatures"/> shows
it in use. Defined in <xref section="2.2.6" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          </dd>
          <dt><tt>@target-uri</tt></dt>
          <dd>
            <t>narrows the signature to one resource, including the query string. The
signature is invalidated by intermediary reordering, which might happen for
caching purposes for instance. Defined in <xref section="2.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          </dd>
          <dt><tt>@query-param</tt></dt>
          <dd>
            <t>narrows the signature to individual query parameters. This is a more robust
alternative to cover query parameters. Defined in <xref section="2.2.8" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          </dd>
        </dl>
        <t>No component covers the body. An Agent that needs one <bcp14>MUST</bcp14> send and cover
<tt>Content-Digest</tt> <xref target="DIGEST-FIELDS"/>. This document does not require it. Most
automated traffic is <tt>GET</tt>, and a mandatory digest would force every Agent to
buffer request bodies it would otherwise stream.</t>
        <section anchor="signature-agent">
          <name>Signature-Agent</name>
          <t><tt>Signature-Agent</tt> is a Dictionary Structured Header as defined in
<xref section="3.2" sectionFormat="of" target="STRUCTURED-HEADERS"/>. Its member values <bcp14>MUST</bcp14> be String Items
that contain a <xref target="URI"/>, whose scheme <bcp14>MUST</bcp14> be <tt>https</tt>. If dictionary values are
not valid URI-references, the entire header field <bcp14>MAY</bcp14> be ignored.</t>
          <t>Each member carries a <tt>type</tt> parameter, a Token Item as defined in
<xref section="3.3.4" sectionFormat="of" target="STRUCTURED-HEADERS"/>, naming the discovery mechanism that
resolves the value to key material. <xref target="key-distribution-and-discovery"/> defines
the types. When <tt>type</tt> is absent, its value is <tt>directory</tt>. A verifier that
does not support a <tt>type</tt> value <bcp14>MUST</bcp14> ignore that member, and <bcp14>MUST NOT</bcp14> infer the
mechanism from the URI path, media type, or response body.</t>
          <t>Earlier versions of this protocol defined <tt>Signature-Agent</tt> as a bare String,
and deployments still send it (<xref target="example-legacy"/>). A verifier <bcp14>MAY</bcp14> accept that
form and treat it as a dictionary with a single member whose key is the label
of the signature covering it. Signers <bcp14>MUST</bcp14> send the dictionary form. The two
are distinguishable on the wire: a String Item begins with a double quote <tt>"</tt>
while a Dictionary member key does not.</t>
          <t>A signed request <bcp14>MUST</bcp14> carry the <tt>Signature-Agent</tt> header, as described in <xref target="sending-request"/>.
Its member keyed to the signature label <bcp14>MUST</bcp14> be signed as a component as defined in <xref section="2.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
The <tt>Signature-Agent</tt> member identifies where candidate key material can be found.
The key used to verify the signature is selected by the <tt>keyid</tt> parameter of the
corresponding <tt>Signature-Input</tt> member.</t>
          <t>This results in the following components to be signed</t>
          <artwork><![CDATA[
("@authority" "signature-agent";key="sig1")
]]></artwork>
        </section>
        <section anchor="multiple-signatures">
          <name>Multiple Signatures</name>
          <t>A request <bcp14>MAY</bcp14> contain more than one Web Bot Auth signature. Each signature is
identified by its HTTP Message Signatures label. Each signer <bcp14>MUST</bcp14> provide a
<tt>Signature-Agent</tt> member for its label. A verifier <bcp14>MUST NOT</bcp14> attribute a
signature to a member that signature does not cover.</t>
          <t>A signer <bcp14>MAY</bcp14> cover members from another signature label, which preserves
evidence that another signer contributed to the request. A signer that covers
<tt>"signature";key=X</tt> <bcp14>MUST</bcp14> also cover <tt>"signature-input";key=X</tt>, and <bcp14>MUST</bcp14> cover
every component identifier listed in <tt>"signature-input";key=X</tt>.</t>
          <t>A signature value on its own does not identify the message it was computed
over, which is why <xref section="7.3.7" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> recommends
against signing one. Covering <tt>signature-input</tt> is not sufficient:
it lists component identifiers, whose values resolve against whatever
message the verifier holds. An outer signature that named those identifiers
without covering them would still verify after the whole header set was lifted
onto a different message, the ambiguity
<xref section="7.3.7" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> describes. Covering the union
addresses this: the outer signer commits to a message on which the inner signature
is checkable, under which key, and over which validity window.</t>
          <t>A signer that cannot cover one of those components, because it changed the
value the inner signature was computed over, <bcp14>MUST NOT</bcp14> cover the inner
<tt>signature</tt> member. It signs the request on its own terms, and the inner
signature is left untouched.</t>
          <t>Verifiers <bcp14>MUST</bcp14> validate each signature independently against its own covered
components and its own key. An outer signature that covers an inner one is
evidence that those bytes, over that set of components, were present. It does
not make the inner signature valid, and it does not express authorization,
delegation, or consent. Those meanings are deployment policy, or are carried in
separately signed fields.</t>
        </section>
        <section anchor="replay-protection">
          <name>Replay Protection</name>
          <t>Replay protection, including use of the <tt>nonce</tt> signature parameter, is
described in <xref section="7.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>. This document defines
no additional nonce requirements.</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.</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

GET /path/to/resource HTTP/1.1
Host: origin.example.com
Signature: sig=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>
          <t>A signed request carries three 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>
            <li>
              <t><tt>Signature-Agent</tt> defined in <xref target="signature-agent"/></t>
            </li>
          </ol>
          <t>The Origin learns the URL from the request, so it resolves keys after the
first request rather than before it. Later requests verify from cache
(<xref target="cache-behaviour"/>).</t>
          <figure>
            <name>Key resolution follows the first request</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="456" viewBox="0 0 456 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                  <path d="M 40,64 L 40,256" fill="none" stroke="black"/>
                  <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
                  <path d="M 232,32 L 232,64" fill="none" stroke="black"/>
                  <path d="M 232,128 L 232,208" fill="none" stroke="black"/>
                  <path d="M 264,64 L 264,112" fill="none" stroke="black"/>
                  <path d="M 264,144 L 264,200" fill="none" stroke="black"/>
                  <path d="M 264,216 L 264,256" fill="none" stroke="black"/>
                  <path d="M 304,32 L 304,64" fill="none" stroke="black"/>
                  <path d="M 352,32 L 352,64" fill="none" stroke="black"/>
                  <path d="M 400,64 L 400,112" fill="none" stroke="black"/>
                  <path d="M 400,144 L 400,200" fill="none" stroke="black"/>
                  <path d="M 400,216 L 400,256" fill="none" stroke="black"/>
                  <path d="M 448,32 L 448,64" fill="none" stroke="black"/>
                  <path d="M 448,128 L 448,208" fill="none" stroke="black"/>
                  <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                  <path d="M 232,32 L 304,32" fill="none" stroke="black"/>
                  <path d="M 352,32 L 448,32" fill="none" stroke="black"/>
                  <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
                  <path d="M 232,64 L 304,64" fill="none" stroke="black"/>
                  <path d="M 352,64 L 448,64" fill="none" stroke="black"/>
                  <path d="M 40,94 L 56,94" fill="none" stroke="black"/>
                  <path d="M 40,98 L 56,98" fill="none" stroke="black"/>
                  <path d="M 240,94 L 256,94" fill="none" stroke="black"/>
                  <path d="M 240,98 L 256,98" fill="none" stroke="black"/>
                  <path d="M 232,128 L 248,128" fill="none" stroke="black"/>
                  <path d="M 432,128 L 448,128" fill="none" stroke="black"/>
                  <path d="M 264,160 L 288,160" fill="none" stroke="black"/>
                  <path d="M 368,160 L 392,160" fill="none" stroke="black"/>
                  <path d="M 272,176 L 304,176" fill="none" stroke="black"/>
                  <path d="M 360,176 L 400,176" fill="none" stroke="black"/>
                  <path d="M 232,208 L 448,208" fill="none" stroke="black"/>
                  <path d="M 48,238 L 112,238" fill="none" stroke="black"/>
                  <path d="M 48,242 L 112,242" fill="none" stroke="black"/>
                  <path d="M 200,238 L 264,238" fill="none" stroke="black"/>
                  <path d="M 200,242 L 264,242" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="400,160 388,154.4 388,165.6" fill="black" transform="rotate(0,392,160)"/>
                  <polygon class="arrowhead" points="280,176 268,170.4 268,181.6" fill="black" transform="rotate(180,272,176)"/>
                  <polygon class="arrowhead" points="264,96 252,90.4 252,101.6" fill="black" transform="rotate(0,256,96)"/>
                  <polygon class="arrowhead" points="56,240 44,234.4 44,245.6" fill="black" transform="rotate(180,48,240)"/>
                  <g class="text">
                    <text x="40" y="52">Agent</text>
                    <text x="268" y="52">Origin</text>
                    <text x="400" y="52">Directory</text>
                    <text x="92" y="100">Signed</text>
                    <text x="152" y="100">request</text>
                    <text x="192" y="100">+</text>
                    <text x="216" y="100">URL</text>
                    <text x="268" y="132">if</text>
                    <text x="300" y="132">keys</text>
                    <text x="336" y="132">not</text>
                    <text x="388" y="132">resolved</text>
                    <text x="328" y="164">Resolve</text>
                    <text x="332" y="180">Keys</text>
                    <text x="156" y="244">Response</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
+-------+                   +--------+     +-----------+
| Agent |                   | Origin |     | Directory |
+---+---+                   +---+----+     +-----+-----+
    |                           |                |
    +== Signed request + URL ==>|                |
    |                           |                |
    |                       .-- if keys not resolved --.
    |                       |   |                |     |
    |                       |   +--- Resolve --->|     |
    |                       |   |<---- Keys -----+     |
    |                       |   |                |     |
    |                       '--------------------------'
    |                           |                |
    |<======== Response ========+                |
    |                           |                |
]]></artwork>
            </artset>
          </figure>
        </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. A resulting signature <bcp14>MUST</bcp14> satisfy this profile. The Origin <bcp14>MAY</bcp14>
request additional parameters defined by <xref target="HTTP-MESSAGE-SIGNATURES"/>, including
<tt>nonce</tt>.
The status code <bcp14>SHOULD</bcp14> be 403 Forbidden as defined in <xref section="15.5.4" sectionFormat="of" target="HTTP"/>.</t>
        <t>An Origin that detects a signature or nonce has been used more often than its
policy permits <bcp14>MAY</bcp14> request a new signature and respond with 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 it does not know the <tt>keyid</tt> for the <tt>Signature-Agent</tt> URL the signature covers.</t>
          </li>
          <li>
            <t>During step 5, if the <tt>keyid</tt> is not known for that URL, the Origin <bcp14>MAY</bcp14> fetch key material as indicated by the <tt>Signature-Agent</tt> header defined in <xref target="signature-agent"/>. Fetching key material affects only whether verification is possible, not what a valid signature means (<xref target="discovery-is-not-trust"/>).</t>
          </li>
        </ul>
        <t>Key lookup <bcp14>MUST</bcp14> be keyed on the (URL, key) pair, not on the key alone. A
verifier that indexes by <tt>keyid</tt> alone will verify a request as coming from one URL
that provides a key it learned from another, and attribute that request to the URL the client
asserted. The party whose URL is asserted cannot detect or stop this: its own
directory is never fetched, so no rotation or removal has any effect.</t>
      </section>
      <section anchor="key-distribution-and-discovery">
        <name>Key Distribution and Discovery</name>
        <t>This section describes how a verifier resolves a <tt>Signature-Agent</tt> URL to key
material. <xref target="discovery-is-not-trust"/> covers what the fetch does and does not
establish.</t>
        <t>The reference for discovery is an HTTPS URL, carried in a <tt>Signature-Agent</tt>
member as defined in <xref target="signature-agent"/>. The member's <tt>type</tt> parameter names
how the URL resolves to key material. This protocol defines three types:</t>
        <dl>
          <dt><tt>directory</tt></dt>
          <dd>
            <t>The member value <bcp14>MUST</bcp14> be the ASCII serialization of an origin as defined in
<xref section="6.2" sectionFormat="of" target="ORIGIN"/>, and a verifier <bcp14>MUST</bcp14> ignore a member carrying
anything else (an empty path <tt>/</tt> <bcp14>MAY</bcp14> be accepted though).
Resolve the HTTP Message Signatures Directory at the well-known
URI registered in <xref target="wkuri-reg"/>, at that origin. This is the default when no
<tt>type</tt> parameter is present.</t>
          </dd>
          <dt><tt>jwks_uri</tt></dt>
          <dd>
            <t>Resolve the member value as a direct JWK Set URI.</t>
          </dd>
          <dt><tt>cimd</tt></dt>
          <dd>
            <t>Resolve the member value as a Client ID Metadata Document <xref target="CIMD"/> URI. The
document then provides key material through <tt>jwks</tt> or <tt>jwks_uri</tt>.</t>
          </dd>
        </dl>
        <t>Each resource fetched under this section <bcp14>MUST</bcp14> be served with a <tt>200 (OK)</tt> HTTP
status code. A verifier <bcp14>MUST</bcp14> treat all other HTTP status codes as discovery
failures and <bcp14>MUST NOT</bcp14> automatically follow HTTP redirects.</t>
        <t>All three types produce an identifier: the URL the verifier resolved, with any
query and fragment discarded. For <tt>directory</tt> that is the well-known URI, one
per origin. For <tt>jwks_uri</tt> and <tt>cimd</tt> it is the member value; the verifier
fetches that value as sent, so the query is dropped from the identifier and not
from the request. Otherwise one key set would yield an identifier per spelling,
and an Agent could mint them at will.</t>
        <t>Identifiers are compared after normalization as described in
<xref section="6.2.2" sectionFormat="of" target="URI"/> and <xref section="6.2.3" sectionFormat="of" target="URI"/>. Two identifiers are the
same when their normalized forms are equal octet for octet.</t>
        <t>The types differ in what additional information the verifier learns from the URL.
TLS authenticates the host but not the path, and nothing reserves the <tt>jwks_uri</tt> or <tt>cimd</tt> path to the host's operator. The well-known URI is reserved, so <tt>directory</tt>
additionally names a domain (<xref target="origin-binding"/>).</t>
        <t>For all types, the key is selected using the <tt>keyid</tt> parameter in
<tt>Signature-Input</tt>.</t>
        <t>Note: when a JWK set is served at the well-known URI registered in
<xref target="wkuri-reg"/>, JWK <bcp14>MAY</bcp14> carry a <tt>kid</tt>. In this case, it <bcp14>MUST</bcp14> be set to the
thumbprint defined in <xref target="generating-http-message-signature"/>, so a verifier
selects a key by matching <tt>keyid</tt> against <tt>kid</tt>. Deriving <tt>kid</tt> from the key
material keeps it globally unique and lets a verifier check the directory's own
labelling rather than trusting it.</t>
        <t><tt>jwks_uri</tt> and <tt>cimd</tt> resolve to key sets that may serve other consumers, where
<tt>kid</tt> is an operator-chosen label. A verifier that cannot match <tt>keyid</tt> against
<tt>kid</tt> there computes thumbprints instead.</t>
        <artwork><![CDATA[
Signature-Agent: sig1="https://signature-agent.test"
Signature-Agent: sig1="https://signature-agent.test/jwks.json";type=jwks_uri
Signature-Agent: sig1="https://signature-agent.test/card";type=cimd
]]></artwork>
        <section anchor="configuration">
          <name>Directory Format</name>
          <t>All three types resolve to a JSON Web Key Set (JWKS) as defined in
<xref section="5" sectionFormat="of" target="JWK"/>. The <tt>alg</tt> parameter is restricted to algorithms
registered in the HTTP Signature Algorithms section of
<xref target="HTTP-MESSAGE-SIGNATURES-IANA"/>.</t>
          <t>The directory <bcp14>MUST</bcp14> be served over HTTPS. A directory served at the well-known
URI registered in <xref target="wkuri-reg"/> <bcp14>MUST</bcp14> be served with media type
<tt>application/http-message-signatures-directory+json</tt>.</t>
          <t>A verifier <bcp14>SHOULD</bcp14> validate the directory format and reject malformed entries.</t>
          <artwork><![CDATA[
GET /.well-known/http-message-signatures-directory HTTP/1.1
Host: example.com
Accept: application/http-message-signatures-directory+json

HTTP/1.1 200 OK
Content-Type: application/http-message-signatures-directory+json
Cache-Control: max-age=86400
{
  "keys": [{
    "kty": "OKP",
    "crv": "Ed25519",
    "kid": "NFcWBst6DXG-N35nHdzMrioWntdzNZghQSkjHNMMSjw",
    "x": "JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw3c5D0bs",
    "use": "sig",
    "nbf": 1712793600,
    "exp": 1715385600
  }]
}
]]></artwork>
        </section>
        <section anchor="key-rotation">
          <name>Key Rotation</name>
          <t>Directory operators <bcp14>SHOULD</bcp14> rotate keys by publishing the old and the new key
together, then removing the old one:</t>
          <ol spacing="normal" type="1"><li>
              <t>Add the new key to the directory before its intended use date</t>
            </li>
            <li>
              <t>Continue to include the old key until its expiration date</t>
            </li>
            <li>
              <t>Remove expired keys from the directory</t>
            </li>
          </ol>
          <t>Removing a key from the directory deactivates it. Verifiers stop accepting it
once their cached copy expires, so the directory's cache lifetime bounds how
long a removed key keeps verifying. Verifiers <bcp14>SHOULD</bcp14> cache the directory
contents and refresh upon expiration, as described in <xref target="cache-behaviour"/>.</t>
          <t>It is not a revocation mechanism, and this document does not define any.</t>
        </section>
        <section anchor="redistributed-key-material">
          <name>Redistributed Key Material</name>
          <t>IP addresses and user-agent have been aggregated and distributed via lists.
This section says what a verifier may conclude from key material it did not
fetch itself.
Defining a format for redistribution is out of scope.</t>
          <t>A verifier <bcp14>MUST NOT</bcp14> attribute a request to a <tt>Signature-Agent</tt> URL on the basis
of redistributed key material unless it carries, for the key in question, a
valid directory response signature as described in <xref target="origin-binding-appendix"/>
whose <tt>expires</tt> has not passed. Without that proof the material stays usable
for verifying signatures, but it carries no URL, so the identifier falls back
to the key thumbprint (<xref target="no-url"/>).</t>
          <t>The main requirement is to terminate the TLS connection.
A verifier polling a directory on its own schedule is resolving it. So is a
control plane polling on behalf of the verifiers it serves. None of these options
constitute redistribution. Nor is a list that names directory URLs rather than embedding
keys. For instance, <xref target="REGISTRY"/> works that way, and the verifier still resolves them.</t>
        </section>
      </section>
      <section anchor="sessions">
        <name>Session Considerations</name>
        <t>Per-request signing and verification costs CPU; uncached key discovery adds
latency. For high request rates, an origin can verify a request-specific
signature once and issue a session credential for later requests. This can
amortize asymmetric verification and reduce bytes, but adds the risks of token
theft and replay.</t>
        <t>A reused signature already has token semantics until <tt>expires</tt>. A session
established from one extends that window past <tt>expires</tt> unless the credential is
bounded to it: no longer-lived, and no wider in scope than the components the
signature covered. Session establishment and binding are out of scope.</t>
      </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.
See <xref target="sessions"/>: a session amortizes that cost by replacing verification with a
bearer credential. <xref target="field-compression"/> covers the byte cost.</t>
      </section>
      <section anchor="key-compromise-response">
        <name>Key Compromise Response</name>
        <t>This document defines no revocation. Removing a compromised key from the
directory is the only remedy, and it takes effect at each verifier on its next
refresh, so the key can keep verifying for as long as <xref target="key-rotation"/> allows.
The protocol carries no channel back to verifiers, so an
Agent cannot reach them sooner. Signature lifetimes
(<xref target="generating-http-message-signature"/>) are the only lever that acts faster.</t>
        <t>Agents <bcp14>SHOULD</bcp14> remove a compromised key and publish a replacement immediately.
Origins 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 rotation 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 implementer 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>
        <section anchor="signature-agent-labeling">
          <name>Signature-Agent Labeling</name>
          <t><xref section="7.2.5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> allows an intermediary to relabel
a signature, because the label of a <tt>Signature</tt> dictionary member is not part
of the signature base. The key of a <tt>Signature-Agent</tt> member is different: when
a signature covers <tt>"signature-agent";key="agent2"</tt>, that key appears in the
signature base, so changing it invalidates the signature. Only the holder of
the signing key can produce a signature over the new member key.</t>
          <t>An intermediary <bcp14>MUST NOT</bcp14> alter the key of a <tt>Signature-Agent</tt> member that is
covered by a signature it is not able to recompute. Relabeling the <tt>Signature</tt>
dictionary member remains permitted.</t>
          <t>A signer acting as an intermediary on its own signature is not restricted by
this, since it can sign the result.</t>
        </section>
      </section>
      <section anchor="ssrf">
        <name>Server-Side Request Forgery (SSRF)</name>
        <t>As described in <xref target="key-distribution-and-discovery"/>, verifiers may fetch key directories based on
the value conveyed in <tt>Signature-Agent</tt> when included in a request. Since
clients control the <tt>Signature-Agent</tt> header value, this introduces a risk of
server-side request forgery (SSRF) attacks by malicious clients.</t>
        <t>Verifiers <bcp14>SHOULD</bcp14> take appropriate precautions as follows:</t>
        <dl>
          <dt><tt>Response size</tt></dt>
          <dd>
            <t>a directory can be arbitrarily large. Verifiers <bcp14>SHOULD</bcp14> reject responses
exceeding a defined byte limit after content decoding.</t>
          </dd>
          <dt><tt>Key count</tt></dt>
          <dd>
            <t>a JWKS with many keys forces O(n) key search. Verifiers <bcp14>SHOULD</bcp14> enforce
a maximum key count.</t>
          </dd>
          <dt><tt>Fetch latency</tt></dt>
          <dd>
            <t>no timeout allows slowloris-style exhaustion. Verifiers <bcp14>SHOULD</bcp14> apply
a wall-clock timeout to directory fetches.</t>
          </dd>
          <dt><tt>Redirect chains</tt></dt>
          <dd>
            <t>unbounded HTTP redirects can be used to amplify requests. Verifiers
<bcp14>SHOULD</bcp14> limit redirect depth.</t>
          </dd>
          <dt><tt>Network address ranges</tt></dt>
          <dd>
            <t>no address filtering can target internal services. Verifiers <bcp14>SHOULD</bcp14>
prevent directory fetches to private, loopback, and link-local
address ranges.</t>
          </dd>
        </dl>
        <t>Further recommendations can be found in the Open Worldwide Application
Security Project (OWASP) SSRF Prevention Cheat Sheet <xref target="OWASP-SSRF"/>.</t>
      </section>
      <section anchor="test-and-demonstration-keys">
        <name>Test and Demonstration Keys</name>
        <t>Test keys, including the example keys in <xref target="HTTP-MESSAGE-SIGNATURES"/>, <bcp14>MUST NOT</bcp14>
be used in production. Verifiers <bcp14>SHOULD</bcp14> reject known test keys when they are
detected in key directories or out-of-band configuration.</t>
      </section>
      <section anchor="static-signatures">
        <name>Static Signatures</name>
        <t>Deployments <bcp14>MUST NOT</bcp14> treat a precomputed Web Bot Auth signature as a long-lived
access credential. A reusable static signature has bearer-token semantics and can
be replayed until the covered signature parameters, key, or verifier policy make
it unusable.</t>
        <t>Agents <bcp14>SHOULD</bcp14> generate signatures for the request being sent, with bounded
<tt>created</tt> and <tt>expires</tt> values. Long expiration windows increase replay risk.</t>
      </section>
      <section anchor="discovery-failure">
        <name>Discovery Failure</name>
        <t>Resolving a <tt>Signature-Agent</tt> URL can fail in several ways: the name does not
resolve, the connection or TLS handshake fails, the response is not a directory
or contains no key matching <tt>keyid</tt>, or the fetch is refused by the verifier's
own limits (<xref target="ssrf"/>). All have the same outcome for the request in hand. The
verifier holds no association between that URL and the signing key, so under
<xref target="discovery-is-not-trust"/> it <bcp14>MUST NOT</bcp14> attribute the request to that URL. It may
still verify the signature if it holds the key by other means, in which case the
identifier is the thumbprint (<xref target="no-url"/>); otherwise the request is unverified.</t>
        <t>They differ in what they say about cached state, and verifiers <bcp14>MUST</bcp14> keep them
apart. A directory that resolves and does not contain the key is evidence: it is
newer than whatever the verifier holds, and under <xref target="discovery-is-not-trust"/>
replaces it. That is how a removed key stops verifying. A directory that fails
to resolve is not evidence and <bcp14>MUST NOT</bcp14> evict a cached entry, or an
operator's outage revokes its keys at every verifier at once.</t>
        <t>A failed fetch says nothing about the signer. It does not prove the signer is
malicious, and it does not make the request trusted. What an origin does with
an unverified request is local policy, and treating it as a distinct outcome
rather than as success or failure is discussed in <xref target="verifier-outcomes"/>.
Verifiers should also expect failures to be correlated: a single operator's
directory going down takes out every request naming it at once, across every
verifier whose cache expires in the same window.</t>
      </section>
      <section anchor="unsigned-requests">
        <name>Unsigned Requests</name>
        <t>Most HTTP requests carry no signature. A verifier that sees none has learned
nothing about the sender: not that it is automated, not that it is human, not
that it is evading anything. Absence of a signal is not evidence about the
party that did not send it, in the same way that a failed fetch
(<xref target="discovery-failure"/>) is not evidence about the signer.</t>
        <t>What an origin does with a request it cannot attribute is its own decision, as
it was before this protocol existed. This document neither requires an origin
to treat unsigned requests differently nor gives it grounds to.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <section anchor="public-identity">
        <name>Public Identity</name>
        <t>This protocol 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>A key tied to a specific human individual exposes personally identifiable
information and makes the key usable for user tracking or profiling. A key that
represents a role, company, or automation identity (e.g., "news-aggregator-bot",
"example-crawler-v1") avoids this.</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 anchor="directory-content-and-access-patterns">
        <name>Directory Content and Access Patterns</name>
        <t>A key directory should only contain keys actively used for signing. Additional
keys or metadata expose more about the signing service than verification
requires. Verifiers fetching a directory also reveal something about their
verification patterns, so directory servers should avoid logging personally
identifiable information from directory requests.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This section contains considerations for IANA.</t>
      <section anchor="wkuri-reg">
        <name>Well-Known 'http-message-signatures-directory' URI</name>
        <t>This document updates the "Well-Known URIs" Registry <xref target="WellKnownURIs"/> with the
following values.</t>
        <table anchor="wellknownuri-values">
          <name>'http-message-signatures-directory' Well-Known URI</name>
          <thead>
            <tr>
              <th align="left">URI Suffix</th>
              <th align="left">Change Controller</th>
              <th align="left">Reference</th>
              <th align="left">Status</th>
              <th align="left">Related information</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">http-message-signatures-directory</td>
              <td align="left">IETF</td>
              <td align="left">this document</td>
              <td align="left">permanent</td>
              <td align="left">None</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="media-types">
        <name>Media Types</name>
        <t>The following entries should be added to the IANA "media types"
registry:</t>
        <ul spacing="normal">
          <li>
            <t>"application/http-message-signatures-directory+json"</t>
          </li>
        </ul>
        <t>The templates for these entries are listed below and the
reference should be this RFC.</t>
        <section anchor="applicationhttp-message-signatures-directoryjson-media-type">
          <name>"application/http-message-signatures-directory+json" Media Type</name>
          <dl spacing="compact">
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>http-message-signatures-directory</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>"binary"</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="security-considerations"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>Services that implement the signer role for HTTP Message
Signatures and verifiers that interact with the signer for
the purpose of validating signatures.</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl spacing="compact">
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IETF</t>
            </dd>
          </dl>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="CIMD">
          <front>
            <title>OAuth Client ID Metadata Document</title>
            <author fullname="Aaron Parecki" initials="A." surname="Parecki">
              <organization>Okta</organization>
            </author>
            <author fullname="Emelia Smith" initials="E." surname="Smith">
         </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   This specification defines a mechanism through which an OAuth client
   can identify itself to authorization servers, without prior dynamic
   client registration or other existing registration.  This is through
   the usage of a URL as a client_id in an OAuth flow, where the URL
   refers to a document containing the necessary client metadata,
   enabling the authorization server to fetch the metadata about the
   client as needed.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-client-id-metadata-document-02"/>
        </reference>
        <reference anchor="DIGEST-FIELDS">
          <front>
            <title>Digest Fields</title>
            <author fullname="R. Polli" initials="R." surname="Polli"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
              <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9530"/>
          <seriesInfo name="DOI" value="10.17487/RFC9530"/>
        </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-MESSAGE-SIGNATURES-IANA" target="https://www.iana.org/assignments/http-message-signature/http-message-signature.xhtml">
          <front>
            <title>HTTP Message Signatures</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </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">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </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="ORIGIN">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents. Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites. In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string. It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </reference>
        <reference anchor="STRUCTURED-HEADERS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="September" year="2024"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
        <reference anchor="URI">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="WellKnownURIs" target="https://www.iana.org/assignments/well-known-uris/well-known-uris.xhtml">
          <front>
            <title>Well-Known URIs</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </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="HPACK">
          <front>
            <title>HPACK: Header Compression for HTTP/2</title>
            <author fullname="R. Peon" initials="R." surname="Peon"/>
            <author fullname="H. Ruellan" initials="H." surname="Ruellan"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines HPACK, a compression format for efficiently representing HTTP header fields, to be used in HTTP/2.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7541"/>
          <seriesInfo name="DOI" value="10.17487/RFC7541"/>
        </reference>
        <reference anchor="HTTP-BEST-PRACTICES">
          <front>
            <title>Building Protocols with HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>Applications often use HTTP as a substrate to create HTTP-based APIs. This document specifies best practices for writing specifications that use HTTP to define new application protocols. It is written primarily to guide IETF efforts to define application protocols using HTTP for deployment on the Internet but might be applicable in other situations.</t>
              <t>This document obsoletes RFC 3205.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="56"/>
          <seriesInfo name="RFC" value="9205"/>
          <seriesInfo name="DOI" value="10.17487/RFC9205"/>
        </reference>
        <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="QPACK">
          <front>
            <title>QPACK: Field Compression for HTTP/3</title>
            <author fullname="C. Krasic" initials="C." surname="Krasic"/>
            <author fullname="M. Bishop" initials="M." surname="Bishop"/>
            <author fullname="A. Frindell" initials="A." role="editor" surname="Frindell"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification defines QPACK: a compression format for efficiently representing HTTP fields that is to be used in HTTP/3. This is a variation of HPACK compression that seeks to reduce head-of-line blocking.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9204"/>
          <seriesInfo name="DOI" value="10.17487/RFC9204"/>
        </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>
        <reference anchor="REGISTRY">
          <front>
            <title>Registry and Signature Agent card for Web bot auth</title>
            <author fullname="Maxime Guerreiro" initials="M." surname="Guerreiro">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Ulas Kirazci" initials="U." surname="Kirazci">
              <organization>Amazon</organization>
            </author>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <date day="26" month="June" year="2026"/>
            <abstract>
              <t>   This document defines the "Signature Agent Card", a JSON metadata
   document that a signature agent using [DIRECTORY] publishes to
   describe itself: its identity, purpose, rate expectations, and
   cryptographic keys.  Its parameters are drawn from the OAuth Dynamic
   Client Registration Metadata registry [DCR], the same namespace used
   by [CIMD], extended with a single web_bot_auth object.  This document
   registers that object with IANA and establishes a registry for its
   members.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-webbotauth-registry-03"/>
        </reference>
        <reference anchor="OWASP-SSRF" target="https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html">
          <front>
            <title>OWASP Server-Side Request Forgery Prevention Cheat Sheet</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="USE-CASES">
          <front>
            <title>Use Cases for Authentication of Web Bots</title>
            <author fullname="Mark Nottingham" initials="M." surname="Nottingham">
         </author>
            <date day="1" month="April" year="2026"/>
            <abstract>
              <t>   This draft outlines use cases for authentication for bot clients on
   the Web, to help inform discussions regarding the scope and intent of
   the WebBotAuth Working Group.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-nottingham-webbotauth-use-cases-02"/>
        </reference>
        <reference anchor="WELLKNOWN-URI">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
              <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
      </references>
    </references>
    <?line 1000?>

<section anchor="use-cases">
      <name>Use Cases and What They Need</name>
      <t><xref target="USE-CASES"/> collects the use cases this group has discussed. Most are served
by the URL alone. The table below records which ones need the domain binding in
<xref target="origin-binding-appendix"/>, and why.</t>
      <table>
        <name>Use cases and the identifier they need</name>
        <thead>
          <tr>
            <th align="left">Use case</th>
            <th align="left">What the origin does</th>
            <th align="left">Needs</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Mitigating volumetric abuse</td>
            <td align="left">Rate limit per URL</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">Controlling access by bots</td>
            <td align="left">Set policy per URL</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">Providing different content to bots</td>
            <td align="left">Recognise a given URL</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">Auditing bot behaviour</td>
            <td align="left">Group logs by URL</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">Classifying traffic</td>
            <td align="left">Correlate observed behaviour with a URL</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">IP address mobility and sharing</td>
            <td align="left">Nothing: the signature does not depend on the IP</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">Robots.txt alignment</td>
            <td align="left">Match the crawler against a name in the file</td>
            <td align="left">Domain</td>
          </tr>
          <tr>
            <td align="left">Conveying contextual information</td>
            <td align="left">Read signed headers alongside the identifier</td>
            <td align="left">Domain</td>
          </tr>
        </tbody>
      </table>
      <t>The last two are the pattern from <xref target="origin-binding"/>. Both consume something
held against a name rather than against the key: a robots.txt file names
crawlers, and contextual assertions are only worth as much as the party making
them. End-user authentication and anonymous authentication are out of scope.</t>
    </section>
    <section anchor="origin-binding-appendix">
      <name>Validating the Domain Binding</name>
      <t>This appendix describes what a verifier checks when it wants the domain a key
is published under, rather than the URL on its own. It applies to the
<tt>directory</tt> type in <xref target="key-distribution-and-discovery"/>. Verification,
rotation, and continuity do not depend on any of it, and a verifier that only
needs the URL as an identifier can skip the whole appendix.</t>
      <t>Authority over the domain comes from the TLS connection to the directory.
Nothing below adds to that.</t>
      <section anchor="possession-proof-on-the-directory-response">
        <name>Possession Proof on the Directory Response</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that a directory server construct and include one HTTP
Message Signature per key with the response, as defined in
<xref target="HTTP-MESSAGE-SIGNATURES"/>. Each key <bcp14>SHOULD</bcp14> be used to provide one signature.
These signatures prove possession of the advertised keys and, by covering
<tt>@authority</tt>, prevent the key set from being re-served under a different
authority. This matters for a domain-bound identifier, where the verifier is
about to consume information it holds against the name: it distinguishes a key set
the key holders assembled from one that was copied.</t>
        <t>Directory server <bcp14>MUST</bcp14> include the following covered components:</t>
        <dl>
          <dt><tt>@authority</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>. <tt>req</tt> flag defined in <xref section="2.4" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> <bcp14>MUST</bcp14> be set.</t>
          </dd>
          <dt><tt>content-digest</tt></dt>
          <dd>
            <t>as defined in <xref target="DIGEST-FIELDS"/>.</t>
          </dd>
        </dl>
        <t>Directory server <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>
        </dl>
        <t>Without them the signature is a permanent assertion that these keys were bound
to this authority at some unstated time, of no use to a verifier
consuming it through <xref target="redistributed-key-material"/>.</t>
        <dl>
          <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>http-message-signatures-directory</tt></t>
          </dd>
        </dl>
        <t>A verifier using a corresponding directory response signature as proof <bcp14>MUST</bcp14>
validate it using the key provided by the directory and <bcp14>MUST</bcp14> validate the
<tt>Content-Digest</tt> field against the response body. If either validation fails,
the proof is invalid. A verifier <bcp14>MAY</bcp14> use a key obtained by resolving the
directory itself whether or not it has valid proof. Attribution from
redistributed key material is governed by <xref target="redistributed-key-material"/>. A
verifier <bcp14>MUST</bcp14> reject a directory response signature whose <tt>created</tt> is in the
future, as it would a certificate that is not yet valid.
<xref target="discovery-is-not-trust"/> orders competing evidence by <tt>created</tt>, so a
future-dated signature would outrank every later fetch.</t>
      </section>
      <section anchor="what-the-binding-attaches-to">
        <name>What the Binding Attaches To</name>
        <t>The binding is not exclusive. Several domains may publish the same key, and the
binding attaches to the pair the verifier validated, not to the key on its own.
A verifier that recognises a key under one domain has learned nothing about the
same key served under another.</t>
      </section>
    </section>
    <section anchor="deployment-guidance">
      <name>Deployment Guidance</name>
      <t>This appendix is operational guidance. It does not define new protocol
requirements.</t>
      <section anchor="verifier-outcomes">
        <name>Verifier Outcomes</name>
        <t>Verifiers should keep three outcomes distinct:</t>
        <dl>
          <dt><tt>verified</tt></dt>
          <dd>
            <t>the signature and key material validate.</t>
          </dd>
          <dt><tt>invalid</tt></dt>
          <dd>
            <t>the signature, covered components, key, or freshness checks fail.</t>
          </dd>
          <dt><tt>unverified</tt></dt>
          <dd>
            <t>the verifier cannot obtain enough information to decide, for example because
directory discovery failed or the key is unknown.</t>
          </dd>
        </dl>
        <t>Origins can apply local policy to each outcome. During deployment, treating
<tt>unverified</tt> as one bot-management signal is safer than treating it as either
<tt>verified</tt> or <tt>invalid</tt>.</t>
      </section>
      <section anchor="directory-availability">
        <name>Directory Availability</name>
        <t>Directory resources are bootstrap material. Operators serving a directory should
make it reachable without requiring Web Bot Auth on the directory request. They
should also avoid bot protection rules that block ordinary verifier fetches of
the well-known resource.</t>
        <t>The directory endpoint should support <tt>GET</tt>. Supporting <tt>HEAD</tt>, <tt>ETag</tt>,
<tt>Last-Modified</tt>, <tt>Cache-Control</tt>, and conditional requests can reduce fetch
load. Cache is specifically discussed in <xref target="cache-behaviour"/>.</t>
      </section>
      <section anchor="bounded-directory-fetches">
        <name>Bounded Directory Fetches</name>
        <t>Verifiers fetch directories named by untrusted requests, and should bound those
fetches as described in <xref target="ssrf"/>.</t>
        <t>Verifiers should also coalesce concurrent fetches for the same directory and
apply per-directory or per-origin concurrency limits. This avoids a fetch storm
when many requests reference the same uncached directory.</t>
      </section>
      <section anchor="cache-behaviour">
        <name>Cache Behaviour</name>
        <t>Verifiers should use normal HTTP caching semantics <xref target="HTTP-CACHE"/> for key
directories. In particular, verifiers should respect <tt>Cache-Control</tt>, <tt>Expires</tt>,
<tt>Date</tt>, <tt>ETag</tt>, and <tt>Last-Modified</tt> when present.</t>
        <t>A verifier should not fetch the directory for every request. It should refresh
cached directories when they become stale, and can use background refresh with
jitter to avoid synchronized refetches.</t>
      </section>
      <section anchor="negative-caching-and-retry">
        <name>Negative Caching and Retry</name>
        <t>Verifiers can cache unsuccessful discovery outcomes for a short period to reduce
repeated fetches. Negative cache entries should expire after no more than five
minutes. They are operational throttling state, not proof that a signature is
invalid.</t>
        <t>Network failures, TLS failures, and <tt>5xx</tt> responses should be treated as
transient unless local policy says otherwise. Verifiers should retry with bounded
exponential backoff and jitter. When a directory response includes
<tt>Retry-After</tt>, verifiers should respect it as described by <xref target="HTTP"/> and
<xref target="HTTP-BEST-PRACTICES"/>.</t>
      </section>
      <section anchor="freshness-and-replay">
        <name>Freshness and Replay</name>
        <t>Shorter signature lifetimes reduce replay risk but increase sensitivity to clock
skew and signing failures. Whether a verifier requires and enforces nonces is
deployment policy. Rejecting duplicate nonces requires an atomic check-and-record
across the enforcement scope. Verifiers need to bound retention and admission of
nonce state. If that state is unavailable, the verifier should not treat
signature validation as evidence that replay was detected or prevented. Replay
protection is described in
<xref section="7.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        <t>Verifiers should avoid accepting signatures with freshness windows longer than
their risk model permits.</t>
      </section>
      <section anchor="field-compression">
        <name>Field Compression</name>
        <t>Covering per-request components costs bytes when a connection is reused. HPACK
<xref target="HPACK"/> and QPACK <xref target="QPACK"/> can index a repeated <tt>Signature</tt>,
<tt>Signature-Input</tt>, or <tt>Signature-Agent</tt> value, so a signature reused across
requests on one connection is sent once and referenced afterwards. A per-request
value cannot be referenced; it is sent as a literal every time. Huffman coding
and an indexed field name reduce that literal, they do not replace the
reference.</t>
        <t>This is not a reason to widen the covered components. The bytes saved are the
bytes of a credential anyone who observes it can replay until <tt>expires</tt>
(<xref target="generating-http-message-signature"/>), and one static signature for many
requests is an anti-pattern (<xref target="deployment-anti-patterns"/>). An encoder that
treats a signature as a credential may also decline to index it
(<xref section="7.1.3" sectionFormat="of" target="HPACK"/>).</t>
      </section>
      <section anchor="directory-response-signature-lifetimes">
        <name>Directory Response Signature Lifetimes</name>
        <t>Where the key set is redistributed, revocation latency is already floored by
how often the redistributor republishes, so a short <tt>expires</tt> on a directory
response signature (<xref target="origin-binding-appendix"/>) buys nothing and costs
availability: at expiry every consumer drops that operator's keys to unverified
at once, with no serving stale. Operators should set <tt>expires</tt> well beyond the
republication interval of any list they expect to appear in. The lever for
faster revocation is publishing more often, not signing shorter.</t>
      </section>
      <section anchor="rollout-and-fallback">
        <name>Rollout and Fallback</name>
        <t>Web Bot Auth deployments will coexist with existing bot identification signals
during rollout. Verifiers can continue to use existing methods such as IP-based
checks, forward-confirmed reverse DNS, local allowlists, and reputation systems.</t>
        <t>Fallback should not turn an unsupported or unverifiable Web Bot Auth signature
into a trusted identity. It should leave the request in the origin's existing
bot-management path.</t>
      </section>
      <section anchor="proxies-and-intermediaries">
        <name>Proxies and Intermediaries</name>
        <t>Proxies and intermediaries need to preserve the fields covered by a signature if
the origin will verify that signature. If a proxy rewrites the authority, path,
or signed header fields, the origin may no longer see the message that was
signed.</t>
        <t>A deployment can instead verify at the proxy and pass the result to the origin
through a deployment-local trusted channel. That assertion is local policy; it is
not a replacement for the original HTTP Message Signature.</t>
      </section>
      <section anchor="cors">
        <name>CORS</name>
        <t>Key directories contain public key material. If browser-based verifiers need to
fetch them cross-origin, a directory server can use a permissive CORS policy such
as <tt>Access-Control-Allow-Origin: *</tt> without credentials. CORS is not key
authentication and does not replace signature validation.</t>
      </section>
      <section anchor="deployment-anti-patterns">
        <name>Deployment Anti-Patterns</name>
        <t>Deployments should avoid:</t>
        <ul spacing="normal">
          <li>
            <t>using test or demonstration keys in production</t>
          </li>
          <li>
            <t>issuing one static signature for many requests</t>
          </li>
          <li>
            <t>asking users to copy long-lived signatures into third-party tools</t>
          </li>
          <li>
            <t>sharing one signing key across unrelated agents or purposes</t>
          </li>
          <li>
            <t>relying on manual key rotation as the only revocation mechanism</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <section anchor="delegation-and-chaining">
        <name>Delegation and Chaining</name>
        <t>Delegation and chaining are out of scope for this document and are expected
to be specified separately. Input is welcome on the associated
<eref target="https://github.com/thibmeu/http-message-signatures-directory/issues/27">GitHub issue</eref>.</t>
      </section>
      <section anchor="example-multiple-signatures">
        <name>Multiple Signatures with a Remote Browser</name>
        <t>This example shows Alice's agent using a remote browser to fetch a resource. The
agent signs selected request fields. The remote browser signs the request it
sends to the origin and also covers the agent's signature fields. The signature
values are illustrative; this is not a test vector.</t>
        <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

GET /resource HTTP/1.1
Host: origin.example
Signature-Agent: agent="https://agent.alice.example",\
 browser="https://browser.example"
Signature-Input: agent=("@method" "@authority" "@path"\
 "signature-agent";key="agent");created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;tag="web-bot-auth",\
 browser=("@method" "@authority" "@path"\
 "signature-agent";key="browser"\
 "signature-agent";key="agent"\
 "signature-input";key="agent"\
 "signature";key="agent");created=1735689601\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;tag="web-bot-auth"
Signature: agent=:YWdlbnQtc2lnbmF0dXJl:,\
 browser=:YnJvd3Nlci1zaWduYXR1cmU=:
]]></artwork>
        <t>The origin verifies each signature on its own. The <tt>agent</tt> signature covers the
fields selected by Alice's agent. The <tt>browser</tt> signature covers the request
sent by the remote browser, its own <tt>Signature-Agent</tt> member, and all three of
the <tt>agent</tt> label's fields, as <xref target="multiple-signatures"/> requires. This records
that the remote browser forwarded a request carrying the agent's signature. It
does not say that Alice's agent authorized the remote browser to act for it.</t>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>Except where noted, these vectors exercise the minimum this document requires:
<tt>@authority</tt> and a <tt>Signature-Agent</tt> member and nothing else, with an <tt>expires</tt>
far enough out that they do not age. That combination is a parsing and
verification exercise, not a
configuration to copy: as <xref target="generating-http-message-signature"/> explains, a
signature covering <tt>@authority</tt> alone is reusable against that authority for
any method, path, and body until it expires. Deployments should cover more and
expire sooner.</t>
      <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="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";key="agent2": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="wcfPQPh7SzkvrIVvhD00vNk9PkxJNY2NVbYl2PVBB4zmUoluSwE7W6bPtF60QA3k8g06FU7PPCD+J58YofY1zg=="\
 ;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: agent2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="wcfPQPh7SzkvrIVvhD00vNk9PkxJNY2NVbYl2PVBB4zmUoluSwE7W6bPtF60QA3k8g06FU7PPCD+J58YofY1zg=="\
 ;tag="web-bot-auth"
Signature: sig2=:gHzpLNeHaHIO19NaJH9YMW5dcVSi2s0wOMBr6p18vcofS106sfC4KBIS0/szPlBBd1vIcyQ88B6CTEWIhRAiVrb9zfX0mx1aG12CSGWcYkSirHeyTxhbuJvXd27ed6skWoy4PjXItq38936ivUQjfdIwXh1aX6HxkAC3vRnEdSNfntkLWeEuIQ5BLIOBGE39fSwg27Qjq6OVWYas/9/aFUr3HA34MXWYdp+//cvlEKDp3kRoLOw9ro0AOr6srHrTeEtxon2afcws1aZVSlPdd2fZSEIGmw9HAHLDCEkFTERu1gH2k/zIEqgy7CAYXI9E5slog0cLg/Vc6+f8gih33g==:
]]></artwork>
        </section>
        <section anchor="example-legacy">
          <name>Legacy Signature-Agent, sf-string</name>
          <t>Retained for implementers migrating to the dictionary form (<xref target="signature-agent"/>). Do not copy it into new deployments.</t>
          <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": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent")\
 ;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: "https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent")\
 ;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-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";key="agent2": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="n9p433xm+NJ3ph3upfBIGmsuwHw387YV7Q/F+6BSpGCVjYCqQw6rznNA8PVVLySrAWsv0hQtFioQb6E1YsauiA=="\
 ;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: agent2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="n9p433xm+NJ3ph3upfBIGmsuwHw387YV7Q/F+6BSpGCVjYCqQw6rznNA8PVVLySrAWsv0hQtFioQb6E1YsauiA=="\
 ;tag="web-bot-auth"
Signature: sig2=:RdNFx5Bj6au3YgAMQL/RzmUlZE8QZLIaXGRpw985hWnwPfMxT228NMk6ehRS1PSl4e8PhbNZACSanGdhEwYCCg==:
]]></artwork>
        </section>
        <section anchor="legacy-signature-agent-sf-string">
          <name>Legacy Signature-Agent, sf-string</name>
          <t>Retained for implementers migrating to the dictionary form (<xref target="signature-agent"/>). Do not copy it into new deployments.</t>
          <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": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent")\
 ;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: "https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent")\
 ;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 anchor="signed-directory-response">
          <name>Signed Directory Response</name>
          <t>This example presents the possession proof described in
<xref target="origin-binding-appendix"/>, using the ed25519 algorithm. The directory server
signs its own response with the key it publishes. The signature covers
<tt>@authority</tt> from the request that fetched the directory, so the key set cannot
be re-served under another authority, and <tt>content-digest</tt> over the response
body, so the key set cannot be swapped under a captured signature.</t>
          <t>The proof is bound to the request that fetched the directory:</t>
          <artwork><![CDATA[
GET /.well-known/http-message-signatures-directory HTTP/1.1
Host: signature-agent.test
Accept: application/http-message-signatures-directory+json
]]></artwork>
          <t>The response body is the following JSON Web Key Set, signed exactly as shown,
with no trailing newline:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

{"keys":[{"kty":"OKP","crv":"Ed25519","kid":"poqkLGiymh_W0uP6PZFw-\
 dvez3QJT5SolqXBCW38r0U","x":"JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw\
 3c5D0bs","use":"sig"}]}
]]></artwork>
          <t>Those bytes give the following <tt>Content-Digest</tt> field value:</t>
          <artwork><![CDATA[
Content-Digest: sha-256=:CADMT2aBdV/rqQr/NIru64ERQkCobVvllA4V0fLFDu0=:
]]></artwork>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority";req: signature-agent.test
"content-digest": sha-256=:CADMT2aBdV/rqQr/NIru64ERQkCobVvllA4V0fLFDu0=:
"@signature-params": ("@authority";req "content-digest")\
 ;created=1735689600\
 ;expires=4889289600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;tag="http-message-signatures-directory"
]]></artwork>
          <t>This results in the following Content-Digest, Signature-Input and Signature
header fields being added to the response under the label <tt>binding</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Content-Digest: sha-256=:CADMT2aBdV/rqQr/NIru64ERQkCobVvllA4V0fLFDu0=:
Signature-Input: binding=("@authority";req "content-digest")\
 ;created=1735689600\
 ;expires=4889289600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;tag="http-message-signatures-directory"
Signature: binding=:l6P8R67tm3kujAxbHWio7ll01qrEZ0dKD/WWlGhNYEmTnFZM8Wt0VQ9zqGfvo7T/UMkBxsigzChM1Gpz7gOVBg==:
]]></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>
        <t>draft-meunier-webbotauth-httpsig-protocol-00</t>
        <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/cloudflare/web-bot-auth">Rust binaries</eref> (Rust)</t>
          </li>
        </ul>
        <t>draft-meunier-web-bot-auth-architecture-03</t>
        <ul spacing="normal">
          <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">HTTPie 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>
        </ul>
      </section>
      <section anchor="servers">
        <name>Servers</name>
        <t>draft-meunier-webbotauth-httpsig-protocol-00</t>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Cloudflare Workers</eref> (TypeScript)</t>
          </li>
        </ul>
        <t>draft-meunier-web-bot-auth-architecture-03</t>
        <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/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_v2.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,
Nikhil Kandoi,
Akshat Mahajan,
Mark Nottingham,
Eugenio Panero,
Lucas Pardue,
Malte Ubl,
Loganaden Velvindron,
Tanya Verma.</t>
    </section>
    <section numbered="false" anchor="changelog">
      <name>Changelog</name>
      <t>draft-meunier-webbotauth-httpsig-protocol-02</t>
      <ul spacing="normal">
        <li>
          <t>Require <tt>Signature-Agent</tt> on every signed request, and require each signature
to cover the member keyed to its own label. Drop the test vectors that omitted
the header. Recast the no-URL identifier as a verifier state, not an Agent
mode.</t>
        </li>
        <li>
          <t>Defer <tt>Signature-Key</tt> to draft-hardt-httpbis-signature-key.</t>
        </li>
        <li>
          <t>List the components an Agent may cover beyond the required set.</t>
        </li>
        <li>
          <t>Drop the 2119 keywords from the human binding guidance in Privacy
Considerations.</t>
        </li>
        <li>
          <t>Require discovery to return <tt>200 (OK)</tt> and prohibit redirects.</t>
        </li>
        <li>
          <t>Make directory response signatures optional for directly resolved keys.</t>
        </li>
        <li>
          <t>Defer replay protection, including nonce handling, to
<xref target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        </li>
        <li>
          <t>Add a signed directory response test vector.</t>
        </li>
        <li>
          <t>Redraw the figures. The overview figure now shows the architecture, naming
who publishes and who resolves, rather than a message order, and places the
Agent inside the User. The sending figure shows key resolution following the
first request, conditional on the keys not already being resolved, and the
request example moves out of it.</t>
        </li>
      </ul>
      <t>draft-meunier-webbotauth-httpsig-protocol-01</t>
      <ul spacing="normal">
        <li>
          <t>Add an Identifiers and Trust Model section: opaque and domain binding modes.</t>
        </li>
        <li>
          <t>Describe the document as a protocol throughout (was: architecture).</t>
        </li>
        <li>
          <t>Fold <tt>draft-meunier-webbotauth-httpsig-directory</tt> into this document with its
IANA registrations, and move to Standards Track.</t>
        </li>
        <li>
          <t>Anchor identity on the resolved <tt>Signature-Agent</tt> URL rather than the key.
Rotation is the same URL serving a new key; the thumbprint identifies only
when no URL is sent. A <tt>directory</tt> value is an origin, identifiers are
normalized before comparison, and <tt>kid</tt> equals the key thumbprint.</t>
        </li>
        <li>
          <t>Define attribution: lookup on the (URL, key) pair, what redistributed key
material must carry, which source wins when two disagree, what a failed
resolution means, a bound on the resolution behind it, and rejection
of directory response signatures dated in the future.</t>
        </li>
        <li>
          <t>When chaining, an outer signature covering an inner <tt>signature</tt> <bcp14>MUST</bcp14> also
cover its <tt>signature-input</tt>, <tt>signature-agent</tt>, and every component the inner
signature covered. Verifiers validate each signature independently.</t>
        </li>
        <li>
          <t>Say what a signature does not reach: not the body without <tt>Content-Digest</tt>,
and not the method or path when only <tt>@authority</tt> is covered. Correct the
relabeling guidance, and note how to migrate from the sf-string form.</t>
        </li>
        <li>
          <t>Move the domain binding to an appendix. Add objectives, the relationship with
anonymous bot authentication, a use case to identifier mapping, what an
unsigned request tells a verifier, and the worst case for a compromised key.</t>
        </li>
        <li>
          <t>Note how field compression treats reused and per-request signatures, and why
that is not a reason to widen coverage.</t>
        </li>
      </ul>
      <t>draft-meunier-webbotauth-httpsig-protocol-00</t>
      <ul spacing="normal">
        <li>
          <t>Rename draft from <tt>draft-meunier-web-bot-auth-architecture</tt>.</t>
        </li>
        <li>
          <t>Add SSRF guidance for <tt>Signature-Agent</tt> directory fetches.</t>
        </li>
        <li>
          <t>Add deployment guidance for verifier outcomes, directory fetches, caching,
retry, rollout, proxies, CORS, and observability.</t>
        </li>
        <li>
          <t>Add guidance for test keys, static signatures, and discovery failures.</t>
        </li>
        <li>
          <t>Add multiple Web Bot Auth signatures and an example.</t>
        </li>
        <li>
          <t>Add typed <tt>Signature-Agent</tt> discovery examples for <tt>directory</tt>, <tt>jwks_uri</tt>,
and <tt>cimd</tt>.</t>
        </li>
        <li>
          <t>Group implementations by the draft version that added them.</t>
        </li>
        <li>
          <t>Clarify that <tt>Signature-Input</tt> <tt>keyid</tt> selects the key and <tt>Signature-Agent</tt>
points to candidate key material.</t>
        </li>
        <li>
          <t>Note <tt>Signature-Key</tt> as an optional discovery header.</t>
        </li>
        <li>
          <t>Align examples with published test-vector fixtures.</t>
        </li>
        <li>
          <t>Fix typos.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-05</t>
      <ul spacing="normal">
        <li>
          <t>Add Sandor Major as an author.</t>
        </li>
        <li>
          <t>Add session protocol considerations.</t>
        </li>
        <li>
          <t>Update HTTP Message Signatures test vectors.</t>
        </li>
        <li>
          <t>Keep legacy <tt>Signature-Agent</tt> string examples for implementers migrating to
dictionary members.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-04</t>
      <ul spacing="normal">
        <li>
          <t>Change <tt>Signature-Agent</tt> to a Structured Fields dictionary.</t>
        </li>
        <li>
          <t>Add a security consideration for intermediaries that relabel
<tt>Signature-Agent</tt> members.</t>
        </li>
        <li>
          <t>Allow <tt>@target-uri</tt> as a replacement for <tt>@authority</tt>.</t>
        </li>
        <li>
          <t>Add contributors.</t>
        </li>
        <li>
          <t>Add implementations.</t>
        </li>
        <li>
          <t>Remove the <tt>purpose</tt> field from the Web Bot Auth example.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-03</t>
      <ul spacing="normal">
        <li>
          <t>Update the Linzer example URL.</t>
        </li>
        <li>
          <t>Fix the section reference and name for status code 429.</t>
        </li>
        <li>
          <t>Fix typos.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-02</t>
      <ul spacing="normal">
        <li>
          <t>Add response status codes.</t>
        </li>
        <li>
          <t>Add references for readability.</t>
        </li>
        <li>
          <t>Add text about signing extra headers.</t>
        </li>
        <li>
          <t>Add TLS guidance to Security Considerations.</t>
        </li>
        <li>
          <t>Add RSASSA-PSS examples.</t>
        </li>
        <li>
          <t>Update acknowledgments.</t>
        </li>
        <li>
          <t>Add PHP, Python, Ruby, and Rust implementations.</t>
        </li>
        <li>
          <t>Fix <tt>Signature-Agent</tt> in the architecture diagram to use Structured Fields.</t>
        </li>
        <li>
          <t>Fix test vectors to use Structured Fields for <tt>Signature-Agent</tt>.</t>
        </li>
        <li>
          <t>Fix typos.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-01</t>
      <ul spacing="normal">
        <li>
          <t>Require clients to sign <tt>Signature-Agent</tt> when it is present.</t>
        </li>
        <li>
          <t>Add test vectors for requests with and without <tt>Signature-Agent</tt>.</t>
        </li>
        <li>
          <t>Fix the example diagram.</t>
        </li>
        <li>
          <t>Add reverse proxy security considerations.</t>
        </li>
        <li>
          <t>Update text about why an origin may request a new signature.</t>
        </li>
        <li>
          <t>Update nonce validation wording and uniqueness requirements.</t>
        </li>
        <li>
          <t>Add acknowledgments.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-00</t>
      <ul spacing="normal">
        <li>
          <t>Initial draft.</t>
        </li>
        <li>
          <t>Describe how to use HTTP Message Signatures to sign requests.</t>
        </li>
        <li>
          <t>Describe signature verification.</t>
        </li>
        <li>
          <t>Define the <tt>web-bot-auth</tt> tag.</t>
        </li>
        <li>
          <t>Derive <tt>keyid</tt> from the JWK Thumbprint.</t>
        </li>
        <li>
          <t>Add initial Security and Privacy Considerations.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
FZq1vWk97Q6JCstxx+KZF5dKwD5G0mXIQW9pmNRU9JskgzjU5MeXQBRi3A1Q
iMNYzeigRnFDdtQhZSB3OB6Tl3kVTobt2mKSUnZFwGnzZQRGMWrcjg4Dtol7
YeGqkEUu0w3SEn//pUwLuJ0LNwpkGcZbXX4ia6Eic6GX1uOpD485bhp81ZzU
7m/fcJFoNMtQXGybOy/mYGd1z2grDWfRTl/yChvp8rBZ9pRufzV3CTqf0aaE
Tihu2MMMpkAX+TqpFORj6aNW2jLZ+JxZ7QIFVK0RzouxlYA6U8IG65h+VC/N
+BKRQuPM9jgZl2a2Ol0BfgpKWa4ddfNU0Yq3gbzT6tmCNSUWvIWaPFr4Deb2
Cj9dXnhOvyc5ZnzsjmX27Zd5OiHSkSEguHNakFRDrBUXqc3z9YjTu3tncxpN
kfVDliKRjzOExM1tmGaOpJXj57wFM0Qt8u7VIu+qopH5ehBip/Yrm5KFrMDe
r0y2BbUwfjKXVDqdKV+9EFobHevgnwrvGHJCzDnnMZ2oIRlAcsOsZVkxS1hR
UzeWBPjwP9zwqh1Lx/lNM0JS1L905AYrcKw12fvqhEkxCZev7YPDmV0S9yaJ
LCfT1uypW3JuMjlRGfPZ14bLVynVYvPuUTLK1GEYL0ENePkoy6BI42iE/kWl
7VztEaH47K4xzmvLIdnNQhj1zojqK6JCit/nbU6u1StRnETDMPY1mrS4tU6t
kptxhDklpGinZVGhIFa5Ke+HwqHuK03KopFVZKKyPsvSVRgaJQSy/IFXGW0N
04Vww+OoT9ud0G0wFd76XFjR80fdaIDZfOqnzsDgyDjbjcOVGLF0srVRr+Bc
CLsFdBtGbHzzPeW9SxODkYJpjIm7Y4rqasPeLUrdhhRhmnxGqUa6M5+RYsto
MEmQTtxbzneMcxv5FhlvLh6E5dENTOH2xaEiwVzOqDDp87VJVsjcYzI3jMr4
JvgpZYnTyA9KLqaELTeW4dwzKhqyCSA8UEWkUSpjCSdeYkoirNtm9NBMDMhF
WOPoCbvsYeFY86ghUHQmPTuAlOtJI/2Ov8b4z4NULnYnlSonsttRnVny3nen
BdofslHItUPyQbpnIqk4Ya6RFEwaGuazzT0VWrMNw2teFd6PucbUDfw3lA37
k/LMmH6FzsMWvAcORzvVmJyUTU/4mc3EAAsnD1GdKEJBOMJUWLSmcrFELzn/
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
1hNahO8WOHWdJiSMgEBdbSp1KjPQDZF2AWTFLPYEgs2xAkINyvtzPSB2IHMD
OMTozk5L6JsHSono3ysLNw1Pt1LwuDWfBiVQ1VmRlKISV7bPHUCmGtYRqEHU
TXno9GtQ+hf61nFHaMmCqPcP0o5ViznBumrlUKzvKNYlzk/vmeRCKA1XRj3h
nRJX6/8TrDwqJMfgG6omsVBV/Rqp2VPWaGGcYV1wWq+uL0aXK2sRdUpzHSNu
za5UiegAVHeq8Mo0EOGkZ3qYUkkfZ0tgVrz2G2C/u2YHs+Z1wi1w3gEa+s86
ncuD52ip5VkfedmMa+spIBy3VxTyP5tj6rBVoh/0nRMVcFoIQ1gLpsDMaTE+
vyQuc4qcyQDp4JKVrhPQzqFHM1fplRovHX/PJoFPDgGkTm4K2CRUV+3m6Fc3
SRttFOqORTuRWVRqqIU7FiTyHd0elGfgFtIPIdc1IZhSd2mdjF9DArB0vE1S
h6Fx5iPU3xBsbY53XMJm2meZK6z464FYF/ebqWfQLdYkn0U86IipnVL/XpgT
agBknfF8MHoqEUFM7+SAA2Jt5d75s+S5BMsRMHnOvMKEfgrTQdyu+2hUsoeZ
xseXUeawNowIQy3VppDpoout4ICa8mZeTFGHuR/6Zc42w8wLCUSeXjeBx5s9
7hwnA5LiYIKOnLDUolOQTDlgcnBzcRplop0u1YyuenEM6jDo/bIuKzMlmIVM
indcj4GF4QUmjd6ciWGq+xlniCKQyy7oD/sRMjkCiEF/DqHtMedIbIv5fHYr
4PW6L9fMorkOmWI/DcyZHqNlwooiMLnbJhnVuIuViWGmjLTlMSAboge6CDs6
FH6OAHzXaRYH6Jjy2jYkqozjCBQtItxn59ftzsVzDy8cNsqWXrre7hAT9TrD
MMSsQ/pRE3+jC0iuKOWa+u2OuHs1PYb1amB14pdIr3W8QVE9mZaJ2T1S46OF
jdKnHmnx9QAJyl3knJ5Cz8HpF4L4apyAzaPVeSZmcZVFM+03u9IY1WY/CGdH
/bvnJKcqteeAbBn5KHmOxIA08MR8EB9O+kQLl52Kip1PFXcAe0hJPOY8Afs4
1x2hB6FZ95TSGsDIdRr1WaRRgx46B6YgbzB6h3GjcEgBq5fQqkJsljLhCc1Y
sLriu16q4WQUwnwpmkIpitwHnq+8xSVmHdw4aBnmpeWdoCPAic2yO5dcdOjM
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
ynTTXxltHB/GxTQrJ2/Poi+d1+/flZf+4daL7vLL3cNR+/Tg9+Hq0oeNww8n
wdvX2W77chxefbmYjFf2dl/4m0N/b3/x/f76flZ++fq5vb64Mnozuctuv952
voTX68X5++Jgcn15CSI1Cr6U/cXN1+HG7enWaDi4Haz5WRmctNc7J2uT6fTj
/vLnd5fHg955vOkPsn7wen0v7K+s7h1fFtH5yaW/+flqqze+OjlolwdHZy9G
2e/txZOjreHSoHM8WO5ddF8s9U7bnTBcL2/L5Tefr3sHYfby83XbEUHefrDX
aYttt1timC0MKNmDqoJ+wsyTTrhPmHmP183NN/P+m1p5f04gSrnVv5Ak/G9n
uv2s25hYo5zL02p5sjVeW129H704e706Hq6W4/4OqIN5OTmarG6+/Pj+5dvF
gxcbO53x4e77zx93v7ydbGRfk7P25sX79yfTTta+zu+Whm+Lgyh9293YX/6Y
+2XU/lcVjv99bLZ/LaqYkZSXwdnB/frO5w2/XP04aJ++PVm8BLsw/n1/8+3v
J8f+h8PL8WRrc314nUwu+qf3Vysrm2entxvh8LKzfNGJ18LNi2H37Pf2bsdP
DoPh/uTj7u5PGiv/s0yTfz1O/L/JJvmn3ay5Omi4efays3J6ECx+yYKNq5XL
1SLot8uyfZYM3hy/PDko3nw8XrxLJ19v1+L27x/94PjDxuR6Zf10cvhyb/dq
6/Ldm/brpS/vb98tjfbDk/34evnLv6yP7H+PMfKvRQEzvPVz8GWp8+V8chRM
j7KtF9n658lq9PH3ow3/7PBN9PnjeHEfLKC1y7dXb4No/Wz948c32d6L0e7V
8lF7Ofl9L482ktdvyqP7d9Hiemc6Xs1OrnfaFd7a4RyzeZgq83kbJYhZDBIu
dqll4z+C9fUIG2SmV0+pUpxLoWOnJg/WwLFQDWlhsHrqaRISpK3G/wxIjQG4
J6B/KhkKquVVlb6hmLzKaefc6aQ5r0rZzeWjOp4aCocFztGLURg5e+BFlLYz
wS20iCw9f4xLc5KdhP8bsACpHEx/cJFy9ynlo2ULOJ9O5qnnhcy7/apNhRUV
9MsfxNK0Af8KaoLuhmE54+vO+Rllm2LyXydE5YAJG+iXsJR9ij1OkobSicpF
Ji2eQaojq/sp/vdtAbPZFrb/Af9A+bhw/uZiobHQy+7g32KRwt+3UQB/z+VS
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

-->

</rfc>
