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

<t>This document describes an architecture for identifying automated
traffic using <xref target="HTTP-MESSAGE-SIGNATURES"/>. The goal
is to allow automated HTTP clients to cryptographically sign outbound
requests, allowing HTTP servers to verify their identity with confidence.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://thibmeu.github.io/http-message-signatures-directory/draft-meunier-web-bot-auth-architecture.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-meunier-web-bot-auth-architecture/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        WG Web Bot Auth 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 50?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Agents are increasingly used in business and user workflows, including AI assistants,
search indexing, content aggregation, and automated testing. These agents need to reliably identify
themselves to origins for several reasons:</t>
      <ol spacing="normal" type="1"><li>
          <t>Regulatory compliance requiring transparency of automated systems</t>
        </li>
        <li>
          <t>Origin resource management and access control</t>
        </li>
        <li>
          <t>Protection against impersonation and reputation management</t>
        </li>
        <li>
          <t>Service level differentiation between human and automated traffic</t>
        </li>
      </ol>
      <t>Current identification methods such as IP allowlisting, User-Agent strings, or shared API keys have
significant limitations in security, scalability, and manageability. This document defines an
architecture enabling agents to cryptographically identify themselves using <xref target="HTTP-MESSAGE-SIGNATURES"/>.
It proposes that every request from bots to be signed by a private key owned by its provider.
This way, every origin can validate the service identity.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>There is an increase in agent traffic on the Internet. Many agents
choose to identify their traffic today via IP Address lists and/or unique
User-Agents. This is often done to demonstrate trust and safety claims, support
allowlisting/denylisting the traffic in a granular manor, and enable sites to
monitor and rate limit per agent operator. However, these mechanisms have drawbacks:</t>
      <ol spacing="normal" type="1"><li>
          <t>User-Agent, when used alone, can be spoofed meaning anyone may attempt to
act as that agent. It is also overloaded - an agent may be using Chromium and
wish to present itself as such to ensure rendering works, yet it still wants to
differentiate its traffic to the site.</t>
        </li>
        <li>
          <t>IP blocks alone can present a confusing story. IPs on cloud plaforms have
layers of ownership - the platform owns the IP and registers it in their
published IP blocks, only to be re-published by the agent with little to bind
the publication to the actual service provider that may be renting infra. Purchasing
dedicated IP blocks is expensive, time consuming, and requires significant
specialist knowledge to set up. These IP blocks may have prior reputation
history that needs to be carefully inspected and managed before purchase and
use.</t>
        </li>
        <li>
          <t>An agent may go to every website on the Internet and share a secret with
them like a Bearer from  <xref target="OAUTH-BEARER"/>. This is impractical to scale for any
agent beyond select partnerships, and insecure, as key rotation is challenging
and becomes less secure as the consumers scale.</t>
        </li>
      </ol>
      <t>Using well-established cryptography, we can instead define a simple and secure
mechanism that empowers small and large agents to share their identity.</t>
      <section anchor="http-layer-choice">
        <name>HTTP layer choice</name>
        <t>This architectures operates solely at the HTTP layer.
It allows signatures to be generated and
verified without modifying the transport layer or TLS stack. It enables
flexible deployment across proxies, gateways, and origin servers, and aligns
with existing tooling and infrastructure that already inspect and manipulate
HTTP headers.</t>
        <t>Because the signature is embedded in the request itself, it travels with the
message through intermediaries, preserving end-to-end verifiability even when
requests are forwarded or transformed within the HTTP layer.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The following terms are used throughout this document:</t>
      <dl>
        <dt><strong>User</strong></dt>
        <dd>
          <t>An entity initiating requests through an agent. May be a human operator or another system.</t>
        </dd>
        <dt><strong>Agent</strong></dt>
        <dd>
          <t>An orchestrated user agent (e.g. Chromium, CURL). It implements the HTTP protocol and constructs valid HTTP requests with <xref target="HTTP-MESSAGE-SIGNATURES"/> signatures.</t>
        </dd>
        <dt><strong>Origin</strong></dt>
        <dd>
          <t>An HTTP server receiving signed requests that implements the HTTP protocol and verifies <xref target="HTTP-MESSAGE-SIGNATURES"/> signatures. It acts as a verifier of the signature as defined by <xref target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        </dd>
      </dl>
    </section>
    <section anchor="architecture">
      <name>Architecture</name>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="608" viewBox="0 0 608 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,176" fill="none" stroke="black"/>
            <path d="M 80,32 L 80,176" fill="none" stroke="black"/>
            <path d="M 208,32 L 208,176" fill="none" stroke="black"/>
            <path d="M 288,32 L 288,176" fill="none" stroke="black"/>
            <path d="M 512,32 L 512,176" fill="none" stroke="black"/>
            <path d="M 600,32 L 600,176" fill="none" stroke="black"/>
            <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
            <path d="M 208,32 L 288,32" fill="none" stroke="black"/>
            <path d="M 512,32 L 600,32" fill="none" stroke="black"/>
            <path d="M 296,62 L 336,62" fill="none" stroke="black"/>
            <path d="M 296,66 L 336,66" fill="none" stroke="black"/>
            <path d="M 464,62 L 504,62" fill="none" stroke="black"/>
            <path d="M 464,66 L 504,66" fill="none" stroke="black"/>
            <path d="M 80,96 L 104,96" fill="none" stroke="black"/>
            <path d="M 184,96 L 200,96" fill="none" stroke="black"/>
            <path d="M 288,112 L 312,112" fill="none" stroke="black"/>
            <path d="M 488,112 L 504,112" fill="none" stroke="black"/>
            <path d="M 296,128 L 360,128" fill="none" stroke="black"/>
            <path d="M 448,128 L 512,128" fill="none" stroke="black"/>
            <path d="M 88,144 L 104,144" fill="none" stroke="black"/>
            <path d="M 192,144 L 208,144" fill="none" stroke="black"/>
            <path d="M 8,176 L 80,176" fill="none" stroke="black"/>
            <path d="M 208,176 L 288,176" fill="none" stroke="black"/>
            <path d="M 512,176 L 600,176" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="512,112 500,106.4 500,117.6" fill="black" transform="rotate(0,504,112)"/>
            <polygon class="arrowhead" points="512,64 500,58.4 500,69.6" fill="black" transform="rotate(0,504,64)"/>
            <polygon class="arrowhead" points="304,128 292,122.4 292,133.6" fill="black" transform="rotate(180,296,128)"/>
            <polygon class="arrowhead" points="304,64 292,58.4 292,69.6" fill="black" transform="rotate(180,296,64)"/>
            <polygon class="arrowhead" points="208,96 196,90.4 196,101.6" fill="black" transform="rotate(0,200,96)"/>
            <polygon class="arrowhead" points="96,144 84,138.4 84,149.6" fill="black" transform="rotate(180,88,144)"/>
            <g class="text">
              <text x="396" y="52">Exchange</text>
              <text x="400" y="68">Cryptographic</text>
              <text x="396" y="84">material</text>
              <text x="44" y="100">User</text>
              <text x="144" y="100">Request</text>
              <text x="248" y="100">Agent</text>
              <text x="556" y="100">Origin</text>
              <text x="352" y="116">Request</text>
              <text x="392" y="116">+</text>
              <text x="440" y="116">Signature</text>
              <text x="404" y="132">Response</text>
              <text x="148" y="148">Response</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
+--------+               +---------+                           +----------+
|        |               |         |         Exchange          |          |
|        |               |         |<===== Cryptographic =====>|          |
|        |               |         |         material          |          |
|  User  +--- Request -->|  Agent  |                           |  Origin  |
|        |               |         +--- Request + Signature -->|          |
|        |               |         |<-------- Response --------+          |
|        |<-- Response --+         |                           |          |
|        |               |         |                           |          |
+--------+               +---------+                           +----------+
]]></artwork>
      </artset>
      <t>A User initiates an action requiring the Agent to perform an HTTP request.
The Agent constructs the request, generates a signature using its signing key,
and includes it in the request as defined in <xref section="3.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>
along with <tt>Signature-Agent</tt> header for discovery for its
verification key.
Upon receiving the request, the Origin ensures it has the verification key for the Agent,
validates the signature, and processes the request if the signature is valid.</t>
      <section anchor="deployment-models">
        <name>Deployment Models</name>
        <t>Signature verification can be performed either directly by origins or delegated to a fronting proxy. Direct verification by origins provides simplicity and control. Proxy verification offloads processing and enables shared caching across multiple origins. The choice depends on traffic volume and operational requirements.</t>
      </section>
      <section anchor="generating-http-message-signature">
        <name>Generating HTTP Message Signature</name>
        <t><xref target="HTTP-MESSAGE-SIGNATURES"/> defines components to be signed.</t>
        <t>Agents <bcp14>MUST</bcp14> include the following component:</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>
        </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"/> foe 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 RECOMMEND the expiry to be no more than 24 hours.</t>
        <section anchor="signature-agent">
          <name>Signature-Agent</name>
          <t><tt>Signature-Agent</tt> is an HTTP Method context header defined in Section 4.1 of <xref target="DIRECTORY"/>.
It is <bcp14>RECOMMENDED</bcp14> that the Agent sends requests with <tt>Signature-Agent</tt> header, as described in <xref target="sending-request"/>.
If the header is to be sent, it <bcp14>MUST</bcp14> be signed as a component as defined in <xref section="2.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          <t>This results in the following components to be signed</t>
          <artwork><![CDATA[
("@authority" "signature-agent")
]]></artwork>
        </section>
        <section anchor="anti-replay">
          <name>Anti-replay</name>
          <t>Origins <bcp14>MAY</bcp14> want to prevent signatures from being spoofed or used multiple times by bad actors and thus require a <tt>nonce</tt> to be added to the <tt>@signature-params</tt>.</t>
          <t>Agents <bcp14>SHOULD</bcp14> extend <tt>@signature-parameters</tt> defined in <xref target="generating-http-message-signature"/> as follow</t>
          <dl>
            <dt><tt>nonce</tt></dt>
            <dd>
              <t>base64url encoded random byte array. It is <bcp14>RECOMMENDED</bcp14> to use a 64-byte array.</t>
            </dd>
          </dl>
          <t>Client <bcp14>MUST</bcp14> ensure that this <tt>nonce</tt> is unique for the validity window of the signature, as defined by created and expires attributes.</t>
        </section>
        <section anchor="sending-request">
          <name>Sending a request</name>
          <t>An Agent <bcp14>SHOULD</bcp14> send a request with the signature generated above. Updating the architecture diagram, the flow look as follow.</t>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="736" viewBox="0 0 736 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,160" fill="none" stroke="black"/>
                <path d="M 88,32 L 88,160" fill="none" stroke="black"/>
                <path d="M 136,112 L 136,256" fill="none" stroke="black"/>
                <path d="M 568,112 L 568,256" fill="none" stroke="black"/>
                <path d="M 640,32 L 640,160" fill="none" stroke="black"/>
                <path d="M 728,32 L 728,160" fill="none" stroke="black"/>
                <path d="M 8,32 L 88,32" fill="none" stroke="black"/>
                <path d="M 640,32 L 728,32" fill="none" stroke="black"/>
                <path d="M 96,62 L 296,62" fill="none" stroke="black"/>
                <path d="M 96,66 L 296,66" fill="none" stroke="black"/>
                <path d="M 440,62 L 632,62" fill="none" stroke="black"/>
                <path d="M 440,66 L 632,66" fill="none" stroke="black"/>
                <path d="M 136,112 L 568,112" fill="none" stroke="black"/>
                <path d="M 88,128 L 128,128" fill="none" stroke="black"/>
                <path d="M 576,128 L 632,128" fill="none" stroke="black"/>
                <path d="M 8,160 L 88,160" fill="none" stroke="black"/>
                <path d="M 640,160 L 728,160" fill="none" stroke="black"/>
                <path d="M 136,256 L 568,256" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="640,128 628,122.4 628,133.6" fill="black" transform="rotate(0,632,128)"/>
                <polygon class="arrowhead" points="640,64 628,58.4 628,69.6" fill="black" transform="rotate(0,632,64)"/>
                <polygon class="arrowhead" points="104,64 92,58.4 92,69.6" fill="black" transform="rotate(180,96,64)"/>
                <g class="text">
                  <text x="364" y="52">Exchange</text>
                  <text x="368" y="68">Cryptographic</text>
                  <text x="364" y="84">material</text>
                  <text x="48" y="100">Agent</text>
                  <text x="684" y="100">Origin</text>
                  <text x="160" y="132">GET</text>
                  <text x="248" y="132">/path/to/resource</text>
                  <text x="188" y="148">Signature:</text>
                  <text x="256" y="148">abc==</text>
                  <text x="212" y="164">Signature-Input:</text>
                  <text x="344" y="164">sig=(@authority</text>
                  <text x="484" y="164">signature-agent);\</text>
                  <text x="364" y="180">created=1700000000;\</text>
                  <text x="364" y="196">expires=1700011111;\</text>
                  <text x="356" y="212">keyid="ba3e64==";\</text>
                  <text x="356" y="228">tag="web-bot-auth"</text>
                  <text x="212" y="244">Signature-Agent:</text>
                  <text x="356" y="244">signer.example.com</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+---------+                                                                    +----------+
|         |                              Exchange                              |          |
|         |<=========================  Cryptographic  ========================>|          |
|         |                              material                              |          |
|  Agent  |                                                                    |  Origin  |
|         |     .-----------------------------------------------------.        |          |
|         +-----| GET /path/to/resource                               |------->|          |
|         |     | Signature: abc==                                    |        |          |
+---------+     | Signature-Input: sig=(@authority signature-agent);\ |        +----------+
                |                  created=1700000000;\               |
                |                  expires=1700011111;\               |
                |                  keyid="ba3e64==";\                 |
                |                  tag="web-bot-auth"                 |
                | Signature-Agent: signer.example.com                 |
                '-----------------------------------------------------'
]]></artwork>
          </artset>
          <t>The Agent <bcp14>SHOULD</bcp14> send requests with two headers</t>
          <ol spacing="normal" type="1"><li>
              <t><tt>Signature</tt> defined in <xref target="generating-http-message-signature"/></t>
            </li>
            <li>
              <t><tt>Signature-Input</tt> defined in <xref target="generating-http-message-signature"/></t>
            </li>
          </ol>
          <t>Mentioned in a section <xref target="signature-agent"/>, the Agent <bcp14>MAY</bcp14> send request with <tt>Signature-Agent</tt> header.</t>
        </section>
      </section>
      <section anchor="requesting-message-signature">
        <name>Requesting a Message signature</name>
        <t><xref section="5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> defines the <tt>Accept-Signature</tt> field which can be used to request a Message Signature from a client by an origin. Origin <bcp14>MAY</bcp14> choose to request signatures from clients that did not initially provide them. If requesting, Origins <bcp14>MUST</bcp14> use the same parameters as those defined by the <xref target="generating-http-message-signature"/>.</t>
        <t>Origin <bcp14>MAY</bcp14> request a new signature with tag "web-bot-auth" even if a nonce is provided, for example if it believes the nonce is a replay, or if it doesn't store nonces and thus requests new signatures every time.</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 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 4, the Origin <bcp14>MAY</bcp14> discard signatures for which the <tt>tag</tt> is not set to <tt>web-bot-auth</tt>.</t>
          </li>
          <li>
            <t>During step 5, the Origin <bcp14>MAY</bcp14> discard signatures for which they do not know the <tt>keyid</tt>.</t>
          </li>
          <li>
            <t>During step 5, if the keyid is unknown to the origin, they <bcp14>MAY</bcp14> fetch the provider directory as indicated by <tt>Signature-Agent</tt> header defined in Section 4 of <xref target="DIRECTORY"/>.</t>
          </li>
        </ul>
        <t>Origin <bcp14>MAY</bcp14> require the <tt>nonce</tt> to satisfy certain constraint: be globally unique using a global nonce store, be unique to a specific location or time window using a local cache, or not constraint at all.</t>
      </section>
      <section anchor="key-distribution-and-discovery">
        <name>Key Distribution and Discovery</name>
        <t>This section describes the discovery mechanism for the agent directory.</t>
        <t>The reference for discovery is a FQDN. It <bcp14>SHOULD</bcp14> provide a directory hosted on the well known registered in Section 4 of <xref target="DIRECTORY"/>.</t>
        <t>We add one field to the directory defined in the other draft:
"purpose": Ideally matches some IANA registry for preferences</t>
        <t>Example</t>
        <sourcecode type="json"><![CDATA[
{
  "keys": {
    "kty": "OKP",
    "crv": "Ed25519",
    "kid": "NFcWBst6DXG-N35nHdzMrioWntdzNZghQSkjHNMMSjw",
    "x": "JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw3c5D0bs",
    "use": "sig",
    "nbf": 1712793600,
    "exp": 1715385600
  },
  "signature_agent": "https://directory.test",
  "purpose": "rag"
}
]]></sourcecode>
        <section anchor="out-of-band-communication-between-client-and-origin">
          <name>Out-of-band communication between client and origin</name>
          <t>A service submitting their key to an origin, or the origin manually adding a service to their trusted list</t>
        </section>
        <section anchor="public-list">
          <name>Public list</name>
          <t>Could be a GitHub repository like the public suffix list. The issue is the gating of such repositories, and therefore its governance.</t>
        </section>
        <section anchor="signature-agent-header">
          <name>Signature-Agent header</name>
          <t>This allows for backward compatibility with existing header agent filtering, and an upgrade to cryptographically secured protocol.
See section <xref target="signature-agent"/> for more details.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="performance-impact">
        <name>Performance Impact</name>
        <t>Origins should account for the overhead of signature verification in their operations. A local cache of public keys reduces network requests and verification latency. The choice of signing algorithm impacts CPU requirements. Origins should monitor verification latency and set appropriate timeouts to maintain service levels under load.</t>
      </section>
      <section anchor="nonce-validation">
        <name>Nonce validation</name>
        <t>Clients are the one controlling the nonce. While <xref target="anti-replay"/> mandates that clients <bcp14>MUST</bcp14> provide a globally unique nonce, it is the origin responsibility to enforce it.</t>
        <t>Different validation policies have different performance and operational considerations. Global uniqueness requires a global nonce store. Some origins may find that their use case can tolerate sharding on location, timing, or other properties.</t>
      </section>
      <section anchor="key-compromise-response">
        <name>Key Compromise Response</name>
        <t>An agent signing key might get compromised.</t>
        <t>If that happens, the agent <bcp14>SHOULD</bcp14> cease using the compromised key as soon as possible, notify affected origins if possible, and generate a new key pair.</t>
        <t>To minimise the impact of a key compromise, the origin should support rapid key rotation and monitor for suspicious signature patterns.</t>
      </section>
      <section anchor="shared-secrets-considered-harmful">
        <name>Shared Secrets Considered Harmful</name>
        <t>Implementations <bcp14>MUST NOT</bcp14> use shared HMAC defined in <xref section="3.3.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Shared secrets break non-repudiation and make auditing
difficult. Each automated client <bcp14>SHOULD</bcp14> use a unique asymmetric keypair to
ensure attribution, support key rotation, and enable effective revocation if
needed.</t>
      </section>
      <section anchor="key-reuse-considered-harmful">
        <name>Key Reuse Considered Harmful</name>
        <t>Implementations <bcp14>MUST NOT</bcp14> reuse a signing key for different purposes. For
example, if an agent implementor has two agents they want to differentiate,
these should use distinct signing keys and signing key directories.</t>
      </section>
      <section anchor="reverse-proxy-consideration">
        <name>Reverse proxy consideration</name>
        <t>An origin may be placed behind a reverse proxy. This means that the proxy is seeing the signature before the origin.</t>
        <t>It implies that the proxy sees the Signature before the origin does, may strip it, or even attempt to replay it against other reverse proxies used by the origin.</t>
        <t>Origins may require a specific nonce policy to prevent such malicious behaviour and decide to validate the signature themselves.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <section anchor="public-identity">
        <name>Public Identity</name>
        <t>This architecture assumes that automated clients identify themselves
explicitly using digital signatures. The identity associated with a signing
key is expected to be publicly discoverable for verification purposes. This
reduces anonymity and allows receivers to associate requests with specific
agents. If an agent wishes not to identify itself, this is not the right
choice of protocol for it.</t>
      </section>
      <section anchor="no-human-correlation">
        <name>No Human Correlation</name>
        <t>The key used for signing <bcp14>MUST NOT</bcp14> be tied to a specific human individual.
Keys <bcp14>SHOULD</bcp14> represent a role, company, or automation identity (e.g., "news-aggregator-
bot", "example-crawler-v1"). This avoids accidental exposure of personally
identifiable information and prevents the misuse of keys for user tracking or
profiling.</t>
      </section>
      <section anchor="minimizing-tracking-risks">
        <name>Minimizing Tracking Risks</name>
        <t>To limit tracking risks, implementations <bcp14>SHOULD</bcp14> avoid long-lived, globally
unique key identifiers unless strictly necessary. Key rotation <bcp14>SHOULD</bcp14> be
supported, and clients <bcp14>SHOULD</bcp14> take care to avoid signing information that
could be used to correlate activity across contexts, especially where
sensitive user data is involved.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="DIRECTORY">
          <front>
            <title>HTTP Message Signatures Directory</title>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <date day="15" month="April" year="2025"/>
            <abstract>
              <t>   This document describes a method for clients using
   [HTTP-MESSAGE-SIGNATURES] to advertise their signing keys.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-http-message-signatures-directory-00"/>
        </reference>
        <reference anchor="HTTP-MESSAGE-SIGNATURES">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="HTTP-CACHE">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="JWK-OKP">
          <front>
            <title>CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE)</title>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document defines how to use the Diffie-Hellman algorithms "X25519" and "X448" as well as the signature algorithms "Ed25519" and "Ed448" from the IRTF CFRG elliptic curves work in JSON Object Signing and Encryption (JOSE).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8037"/>
          <seriesInfo name="DOI" value="10.17487/RFC8037"/>
        </reference>
        <reference anchor="JWK-THUMBPRINT">
          <front>
            <title>JSON Web Key (JWK) Thumbprint</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>This specification defines a method for computing a hash value over a JSON Web Key (JWK). It defines which fields in a JWK are used in the hash computation, the method of creating a canonical form for those fields, and how to convert the resulting Unicode string into a byte sequence to be hashed. The resulting hash value can be used for identifying or selecting the key represented by the JWK that is the subject of the thumbprint.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7638"/>
          <seriesInfo name="DOI" value="10.17487/RFC7638"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="OAUTH-BEARER">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </reference>
      </references>
    </references>
    <?line 386?>

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

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

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

"@authority": example.com
"signature-agent": signature-agent.test
"@signature-params": ("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="ZO3/XMEZjrvSnLtAP9M7jK0WGQf3J+pbmQRUpKDhF9/jsNCWqUh2sq+TH4WTX3/GpNoSZUa8eNWMKqxWp2/c2g=="\
 ;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: signature-agent.test
Signature-Input: sig2=("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="ZO3/XMEZjrvSnLtAP9M7jK0WGQf3J+pbmQRUpKDhF9/jsNCWqUh2sq+TH4WTX3/GpNoSZUa8eNWMKqxWp2/c2g=="\
 ;tag="web-bot-auth"
Signature: sig2=:bcWij+p0SZDQ0hF7Bk8scjEVRMJZlk1EzEHEHUzT58VbPWRrdIRYJgYerlC4fZ01v/hlsbnLvLDrrA5fBeb1CA==:
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="implementations">
      <name>Implementations</name>
      <t>This draft has a couple of <eref target="https://github.com/cloudflareresearch/web-bot-auth">implementations</eref></t>
      <t>Clients:</t>
      <ul spacing="normal">
        <li>
          <t>Chrome MV3</t>
        </li>
        <li>
          <t>Cloudflare Workers</t>
        </li>
      </ul>
      <t>Servers:</t>
      <ul spacing="normal">
        <li>
          <t>Caddy plugin</t>
        </li>
        <li>
          <t>Cloudflare Workers</t>
        </li>
      </ul>
      <t>Test vectors:</t>
      <ul spacing="normal">
        <li>
          <t>In JSON format</t>
        </li>
      </ul>
      <t>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>
    <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,
Mark Nottingham,
Eugenio Panero,
Lucas Pardue,
Tanya Verma.</t>
    </section>
    <section numbered="false" anchor="changelog">
      <name>Changelog</name>
      <t>v01</t>
      <ul spacing="normal">
        <li>
          <t>Add mandatory signing of Signature-Agent by clients if present</t>
        </li>
        <li>
          <t>Add test vectors for request with and without Signature-Agent</t>
        </li>
        <li>
          <t>Update example diagram to be correct</t>
        </li>
        <li>
          <t>Add security consideration about reverse proxy</t>
        </li>
        <li>
          <t>Update why origin may request a new signature</t>
        </li>
        <li>
          <t>Update nonce validation wording and global uniqueness</t>
        </li>
        <li>
          <t>Acknowledgements</t>
        </li>
      </ul>
      <t>v00</t>
      <ul spacing="normal">
        <li>
          <t>Initial draft</t>
        </li>
        <li>
          <t>How to leverage HTTP Message Signature to sign request</t>
        </li>
        <li>
          <t>How to verify these Signature</t>
        </li>
        <li>
          <t>Define web-bot-auth tag to scope this signature</t>
        </li>
        <li>
          <t>Derive keyid using JWK Thumbprint</t>
        </li>
        <li>
          <t>High level Security and Privacy considerations</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1c6XLbSJL+j6eoZf/odpukRB0+NK2ZpnVYsnVZh2V7ZqJV
AIokLBAFowBStNv9LPss+2SbRxUOipLV3o2YidhVOMIkUGeeX2ZlsdPpeHmU
x2pDtPbOz0/EoTJGDpU4i4aJzItMGTHQmZBFrscyV6HIMzkYRIHoZ8EoylWA
bVqe9P1MTb4xyAudm5YXwDBDnc02RJQMtOeFOkjkGBYQwsh5Z6yKJFJZZ6r8
jq/zDsw86sjaZJ3lnmcKfxwZE+kkn6XQdX/nfNdLirGvsg0vhAk2vEAnRiWm
MBuw5EJ5sLhVT2ZKbohL5QuZhGI/yVWWqFycZzIxqc5yb6qz62Gmi5RbwYpF
HxbgXasZvAo3PNERCaxqpnJvopICJhLCdXgJn3k9jb5CjGUUA23qW/o1Uvmg
q7NhC97j9uD9KM9Ts7G0hM1pxxPVdc2W8MGSn+mpUUv1gZZwgGGUjwofhshH
kQ8UXMKhgJTEho4p2dAJowyoCNTHXjEQyuS1iW3vLg/XjfS3x1l6INe6o3wc
tzwPX+gM6QgLEGJQxDFz/xzmlkWcg/DQUPQaNi6T6LPMgdMbYivWRTgA0ih6
qZisMBsS6dfcDtAtrj0v0RmIKxAQ+bO9f7qzdX58+h4EpbPdba74mzuEAVCo
O4c7Z2f9lzuds/2XR/3zi9Odsw1xurv1fG2lZ5vw915v2XXZ6m/t7bin2OrV
5evO8Wtu+Gx59al9dL53cfji5HT/6JzePH2y+szzPFSP2i6O+xfne50XO/3T
nVNq9uTp+rLndTodIX0DahnkngdUNAI0qhirJBehMkEW+aB+MhF1bpA6RiG0
iQazKBlW+u05/S4MPv/y5Y69f/3aBZYpMdQy9mDOXAsZx3pasxRkCoI4glno
fZDN0lwPM5mOogAazwSSW+gi93WRhF6mPhUgj6bNI+H0NIRR2URlNAT8DwsW
+UhFbv35TExBXAXo+wCfBKrrMVXGURjGyvN+QEXPdFgEKEae1x/SikCMwAIF
YBFwp7CawsCio0T4uHUQCLIR8DATaBUGsCRYGvSIixDX1t8XEkyQySWM1vaM
QgLD+1DdwOs2LihHJsjhMFNDEuE2DVmzpbBdaEuUNApa0sISha+0yFQcSR8W
5hjlwb7HRsUTRcTQWTSMEjatRgFpZCxwN2D4Njyv1xWnaliAjoMMw2LGKYwG
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
PSTH/RlfnrtWp5G5NuTW+YZf2T3DF+3KDlsrb6lHGxJY+deJMRvXLnGjZ30V
ibLdDcpZkfDtHPReqCuJwkoziZfYXtdxgJ3AV571YTg4xatWB22DHN1pYG8M
8HKcXNTphorsBS6KdInywMoX3TUD8UDl4KI2Wz8CO1f21hdfIMhgPXh3jFwm
ERpMkaRLT8lEx5yQxDvimMuYtz3NG7rozhJti3gChrX2rjlGiDjKOSat35JL
YtNl0xisDBjrg+pzrYO7ROGiPJdVtz3YvdXBTVnk9KLb6659A900UlmuGA3R
TfnLCM3V1K/o8cVOww0QYJuGFW9KFrMkyBHR3xFwS5/UlQ4hanWalrwuM2+1
GqMBAqp1Q1zDy7aYqxb+oWGltbp6BLba7ggB/afLCmL85sn7zoso1sQdIfwP
XaG/9c107Rjvw2JiBuzXzob48R8/CrqLMQVonFK1J6zmdHdLPHv6fMXz6lU3
G6J2Lghv5qtXoEGjSufRPzzxl+rEdXX9ybPnT5aX8ak990z1p+uDl9FsPPrt
crk4eXLyYXfaCSfq8+qbV+frZzr+9O7F1uXqs2z5ooXdgGibLUtBelCdw8Lo
z1dXeHTy95utYeHfzKZvb56OPvvvX8v8YPi5eL0dx9v9/Xf9689rvZNZePFU
Hr9/Ojl/fOivvnx1dHO5/Gl77fOrx/vHb3pHb/Ph4xdH/vnW6cVh3jv+mK2/
GPY3N2nm2yeu7jzzvhKnuYNHsi8VeHJFy5jpNLb+qFEx5O59ccyOT2Lpq1hc
ASt6V3+KsYuO3Xub/6f5V6tyIGJsFJ9XzvqTx2/31Xj6+Fg/e77sj96Pnrwb
rH/6EB5cDCdPlk786M1ga/dd8G5pkvf6z04GT4+D4cHK7GL74v273XwwOEqv
d7L1yydhHH7aza63h5ubG1Wx2rytsaYuLO9e6+RfYHOsqTH/NrZmvtxvY74q
hPLQD7BJCyoH/8VS/uF4dend4c6Hj9nkLDnI+yfPD59+fL18+fLNYPXV49Qf
vzm9SF9vj3afL300R1uXny5GK+bT4/O9tcvzd6tLL9MjffbhQj5TR5eHrz/d
XKYrS8HK8N/VSq18r5WqFajcYvsiW7ay+f98v8e6rWxu+MFl9PFxunz2YfvN
8mj36YvrZyb4uPP29PDVh/i6t/N5Z29n7+Lz+fqzt/7J5WkW7p++fzV8r7J4
a23wYbk3WRrFxk8OJgfbWdZfH7xQfm+rX1k3MZeocXAUz+YIi2JRcUH3OAbi
73N4/58/uaMm+2NeYAaWgvIHtNDu0S+K1ff4qExV491QvompxOHbVfpW9hWX
OrumUqIzvgPOrUGEZyKNCzx6uqP9eQ1xUqf9RLw6Oz4SDPvxElb10ymILe2t
S9ysj4dcfEmdNeXvboN3/YKXM4Bur91q+0SNikTfO8Ijzu4UiJCdj3CupTym
cMcaszKJ9f2oHu9uBu6XLOiMw/uywb97B0rYGsjYqNZX9iwqpJTslI928FdV
+NhNUxn/9ZzJqqJtI37CgzhbmBWnI7A9/MsQOgN79Igi1oFSIcY8+INYBjME
9jJGMzSgAuR6BNXxDmU2heB+VwIX2/DtBo/0XxYKvGCU6bZ3Fug8F3tAEgg3
ryG6bnuv8Iej8ObBnp7FMAt2y67FkaYTzZEct72dAkxSpMWJTBSOclBA2ALf
srBQbe9cJjMJURnIGN+3p+LcWA8XE2+y3MNSk34Y2oMXPLJ07IQtzUMOrKR2
aaaBgxR2gEaMNaCfFKnVrSHJ3O83zI0K/akgWpUCZaug3U+OcNRlp3G/OdVM
eGJldZE3k5rVuNPRrJ4NvaPiqmqfzJ1r0S8SOAkfzh/u4MJKSeXjOKQs/mAd
aD3VnLElg+97WCej6TwtQ793x90xrDfBH4xzUK7sWJVDmVp7rLbhX/+o2zgq
HqOfONGpsgF4o0eGoTEX5DAAxLtL1Z0lnBXk3f4+WXngijRwCczmwZf336xu
fEBjUwAA

-->

</rfc>
