<?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.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-pfeiffenberger-prtokens-00" category="info" submissionType="independent" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title>Probabilistic Reveal Tokens</title>
    <seriesInfo name="Internet-Draft" value="draft-pfeiffenberger-prtokens-00"/>
    <author initials="P." surname="Pfeiffenberger" fullname="Philipp Pfeiffenberger">
      <organization>Google</organization>
      <address>
        <email>philippp@gmail.com</email>
      </address>
    </author>
    <author initials="J." surname="Katz" fullname="Jonathan Katz">
      <organization>Google</organization>
      <address>
        <email>jkcrypto@google.com</email>
      </address>
    </author>
    <author initials="T." surname="Olsauskus-Warren" fullname="Theodore Olsauskus-Warren">
      <organization>Google</organization>
      <address>
        <email>sauski@google.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="21"/>
    <keyword>token</keyword>
    <keyword>anti-fraud</keyword>
    <abstract>
      <?line 53?>

<t>Fraud detection often relies on high-entropy signals that can also be used to track users across sites. Probabilistic Reveal Tokens (PRTs) attempt to balance the needs of fraud detection and tracking prevention by sampling at a rate that is too low for scaled cross-site tracking, but sufficient for fraud detection in aggregate scenarios. This document describes the PRT protocol, which allows browsers to reveal sensitive signals (e.g., IP address) on a per-site basis with provable probability p_reveal, while websites can use PRTs to measure traffic quality and update denylists.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://philippp.github.io/id-template/draft-pfeiffenberger-prtokens.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-pfeiffenberger-prtokens/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/philippp/id-template"/>.</t>
    </note>
  </front>
  <middle>
    <?line 57?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Cross-site tracking threatens user privacy, yet websites require access to certain signals for legitimate fraud detection and security purposes. IP addresses, in particular, serve as critical signals for identifying and mitigating fraudulent activity, but their universal availability enables large-scale tracking across websites.</t>
      <t>Probabilistic Reveal Tokens (PRTs) provide a solution that balances these competing needs. PRTs allow browsers to share sensitive signals with websites at a controlled probability rate that is too low for effective cross-site tracking but sufficient for aggregate fraud detection and analysis.</t>
      <t>The PRT protocol enables:</t>
      <ul spacing="normal">
        <li>
          <t>Browsers to reveal sensitive signals on a per-site basis with provable probability p_reveal</t>
        </li>
        <li>
          <t>Websites to measure traffic quality for a sample of entities or combinations of entities</t>
        </li>
        <li>
          <t>Users to validate that the reveal rate is as expected after tokens have been spent</t>
        </li>
        <li>
          <t>Prevention of scaled cross-site tracking while preserving fraud detection capabilities</t>
        </li>
      </ul>
      <t>PRTs utilize ElGamal encryption <xref target="ELGAMAL"/> <xref target="RFC3526"/> with re-randomization properties to ensure that tokens remain unlinkable beyond the probabilistically-included high-entropy signals. Tokens are unforgeable while eligible to be spent and become refutable after the spending period (epoch) ends through the publication of decryption keys.</t>
      <t>This document specifies the PRT protocol, including token generation, transmission, validation, and the associated cryptographic operations. The protocol is designed to provide verifiable privacy properties while enabling legitimate fraud detection use cases.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>Key Coordinator:  The entity that generates the cryptographic keypair necessary for token encryption and decryption, and is responsible for keeping the secret key material secret while tokens are eligible to be spent. This may be implemented as part of the Issuer.</t>
      <t>Epoch:  A time period during which tokens are eligible to be spent by a browser. After the epoch ends, the Key Coordinator reveals the key material needed to decrypt and verify the tokens. This key material also allows anyone to generate tokens of this now-revealed epoch, creating deniability for token bearers.</t>
      <t>Embargo Period:  An additional duration after the epoch has ended, and before keys are released. Without an embargo period, keys minted at the exact end of the epoch are at risk of having been minted with recently released keys.</t>
      <t>Issuer:  An internet-facing service from which the browser fetches PRTs. The issuer computes an array of N = N_signal + N_NULL tokens (where N_signal tokens contain the signal, and N_NULL tokens do not) so that p_reveal = N_signal/N. The issuer shuffles these tokens and passes them to the browser.</t>
      <t>Browser:  The client software that fetches tokens from the issuer, re-randomizes them to prevent linkability, and sends the tokens to websites. After the key material is published, the browser helps the user validate the privacy properties of the tokens.</t>
      <t>Website:  The recipient of tokens from the browser. After the key material is published, websites validate the legitimacy of the tokens and leverage sampled signals.</t>
      <t>Signal:  The sensitive data (such as an IP address) that is probabilistically included in tokens.</t>
      <t>p_reveal:  The probability that any given token contains the signal rather than a NULL value.</t>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <t>The PRT protocol involves four main participants: the Key Coordinator, Issuer, Browser, and Websites. The protocol operates in epochs, with each epoch having a defined start and end time.</t>
      <t>During each epoch:</t>
      <ol spacing="normal" type="1"><li>
          <t>The Key Coordinator generates an asymmetric keypair for ElGamal encryption</t>
        </li>
        <li>
          <t>The Issuer generates a plaintext value containing signals with probability p_reveal, signs them with an HMAC key, and encrypts them using the public key to create tokens.</t>
        </li>
        <li>
          <t>Browsers fetch token batches, re-randomize individual tokens, and send them to websites in HTTP headers</t>
        </li>
        <li>
          <t>Websites store received tokens for later decryption</t>
        </li>
      </ol>
      <t>After the epoch ends and the embargo period has expired:</t>
      <ol spacing="normal" type="1"><li>
          <t>The Key Coordinator publishes the private key and HMAC secret</t>
        </li>
        <li>
          <t>All parties can decrypt tokens and validate their contents</t>
        </li>
        <li>
          <t>Users can verify the actual reveal rate matches the expected p_reveal</t>
        </li>
        <li>
          <t>Websites can extract signals for fraud analysis</t>
        </li>
      </ol>
      <section anchor="trust-model">
        <name>Trust Model</name>
        <t>The PRT protocol relies on the following trust relationships:</t>
        <ul spacing="normal">
          <li>
            <t>Websites need to trust that the issuer is writing the correct signal into the token</t>
          </li>
          <li>
            <t>The issuer needs to independently establish trust in the signal</t>
          </li>
          <li>
            <t>Browsers must trust the issuer to correctly mint tokens for the
duration of the epoch (i.e. until validation)</t>
          </li>
        </ul>
      </section>
      <section anchor="protocol-requirements">
        <name>Protocol Requirements</name>
        <t>The protocol satisfies the following requirements:</t>
        <ul spacing="normal">
          <li>
            <t>Ratio Inspection:  Users <bcp14>MUST</bcp14> be able to verify the token reveal rate (p_reveal) after epoch completion.</t>
          </li>
          <li>
            <t>Content Inspection:  Users <bcp14>MUST</bcp14> be able to verify after-the-fact that the tokens do not contain additional identifying information beyond the expected signal.</t>
          </li>
          <li>
            <t>Unlinkability:  The website and issuer <bcp14>MUST NOT</bcp14> be able to re-identify the user (e.g., by colluding and matching tokens).</t>
          </li>
          <li>
            <t>Robustness:  Browsers <bcp14>MUST NOT</bcp14> be able to intentionally reduce their aggregate token reveal rate below p_reveal, and websites <bcp14>MUST NOT</bcp14> be able to increase the likelihood of a browser revealing its signal.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="protocol-specification">
      <name>Protocol Specification</name>
      <section anchor="token-scope">
        <name>Token Scope</name>
        <t>PRTs reduce access to re-identifiable information in the absence of other cross-visit identifiers. PRT implementations <bcp14>MUST</bcp14> allocate only one token to each website during a visit, where a visit is defined as a period during which the user expects to be re-identified by a website (e.g., a sequence of navigations or a cookied session).</t>
        <t>If this requirement is not met, a website could collect multiple tokens for the same user and the same signal, and increase their chance of recovering the signal beyond p_reveal.</t>
      </section>
      <section anchor="epochs-and-sequencing">
        <name>Epochs and Sequencing</name>
        <t>Epochs <bcp14>SHOULD</bcp14> be approximately one day in length, but this is not required by the protocol. In practice, epochs <bcp14>SHOULD</bcp14> be long enough to avoid leakage through user re-identification within a browsing session, and short enough that the signal in the token is still likely to be valid. A minimum epoch length of four hours is <bcp14>RECOMMENDED</bcp14>.</t>
        <t>Each epoch <bcp14>MUST</bcp14> end after the following epoch has started. This allows browsers to start using tokens from the new epoch before the current epoch ends, avoiding both a lapse in the availability of valid tokens and a thundering herd problem when new tokens become available.</t>
        <t>The Key Coordinator <bcp14>SHOULD</bcp14> wait an additional embargo period after the epoch ends before revealing the keys. This ensures that any tokens sent at the end of an epoch cannot be decrypted shortly afterwards when the epoch changeover occurs. It is <bcp14>RECOMMENDED</bcp14> that the embargo duration be equal to that of the epoch length to ensure that no token can be decrypted sooner than one epoch duration in length regardless of when during an epoch it is sent to the website.</t>
      </section>
      <section anchor="token-generation">
        <name>Token Generation</name>
        <section anchor="cryptographic-parameters">
          <name>Cryptographic Parameters</name>
          <t>The following cryptographic parameters <bcp14>MUST</bcp14> be used:</t>
          <ul spacing="normal">
            <li>
              <t>Elliptic Curve: secp256r1 (NIST P-256) as defined in <xref target="RFC5114"/></t>
            </li>
            <li>
              <t>Point Compression: All elliptic curve points <bcp14>MUST</bcp14> use compressed
encoding as defined in <xref target="SEC1"/></t>
            </li>
            <li>
              <t>HMAC Algorithm: HMAC-SHA256 as defined in <xref target="RFC2104"/></t>
            </li>
            <li>
              <t>HMAC Secret Length: 32 bytes (256 bits)</t>
            </li>
            <li>
              <t>Message Padding: 3 bytes appended for valid curve point encoding</t>
            </li>
          </ul>
        </section>
        <section anchor="key-generation">
          <name>Key Generation</name>
          <t>The Key Coordinator generates an asymmetric keypair (pk_e, sk_e) to be rotated every epoch E, with sk_e published to all participants after the epoch has ended. Key generation <bcp14>MUST</bcp14> follow these steps:</t>
          <ol spacing="normal" type="1"><li>
              <t>Generate a random private key x uniformly from [1, n-1] where n is the order of the secp256r1 base point</t>
            </li>
            <li>
              <t>Compute the public key point Y = x * G where G is the secp256r1 generator point</t>
            </li>
            <li>
              <t>The ElGamal public key pk_e consists of (G, Y)</t>
            </li>
            <li>
              <t>The ElGamal private key sk_e is x</t>
            </li>
          </ol>
          <t>The public key pk_e is shared as a JSON Web Key (JWK) <xref target="JWK"/>:</t>
          <artwork><![CDATA[
   {
     "kty": "EC",
     "crv": "P-256",
     "x": "DROn9TZojl70_6lhtcLxItT2qskNDGk97wjz0N5qdiE",
     "y": "k6EtdGm_jW3b7Le9zM2LgcO7b9Q_qwjS2jL0MFn6V4"
   }
]]></artwork>
        </section>
        <section anchor="token-structure">
          <name>Token Structure</name>
          <t>The Issuer receives pk_e and generates an epoch-scoped secret S_e (32 bytes) that ensures only this issuer can mint tokens.</t>
          <t>When a browser requests a batch of N tokens, the Issuer constructs each token message with the following fixed structure:</t>
          <artwork><![CDATA[
   +----------+----------+----------+----------+----------+
   | Field    | Version  | t_ord    | signal   | H        |
   +----------+----------+----------+----------+----------+
   | Size     | 1 byte   | 1 byte   | 16 bytes | 8 bytes  |
   +----------+----------+----------+----------+----------+
   | Offset   | 0        | 1        | 2        | 18       |
   +----------+----------+----------+----------+----------+
]]></artwork>
          <t>Field definitions:</t>
          <ul spacing="normal">
            <li>
              <t>Version: <bcp14>MUST</bcp14> be set to 1 for this specification</t>
            </li>
            <li>
              <t>t_ord: Sequential ordinal from 1 to N (assigned before shuffling)</t>
            </li>
            <li>
              <t>signal: Either 16 zero bytes (NULL) or the actual signal</t>
            </li>
            <li>
              <t>H: First 8 bytes of <tt>HMAC-SHA256(S_e, Version || t_ord || signal)</tt></t>
            </li>
          </ul>
        </section>
        <section anchor="token-generation-algorithm">
          <name>Token Generation Algorithm</name>
          <t>When a browser requests a batch of N tokens, the Issuer:</t>
          <ol spacing="normal" type="1"><li>
              <t>Observes the signal (e.g., IP address) from the browser's
 connection</t>
            </li>
            <li>
              <t>Determines N_signal = floor(N * p_reveal) and N_NULL = N -
 N_signal</t>
            </li>
            <li>
              <t>For i = 1 to N:
 a. Set t_ord = i
 b. If i &lt;= N_signal: set signal to the actual signal value
 c. If i &gt; N_signal: set signal to a number of zero bytes which matches the signal size
 d. Construct message M_i as defined in Section 4.3.3
 e. Compute HMAC-SHA256(S_e, Version || t_ord || signal)
 f. Set H to the first 8 bytes of the HMAC result</t>
            </li>
            <li>
              <t>For each message M_i:
 a. Interpret the 26-byte message as a big-endian integer
 b. Left-shift the message by three bytes and increment the value of the three-byte padding until the (29-byte) padded message is a valid x-coordinate on the curve.
 c. Encrypt the point using ElGamal: (u, e) = (r<em>G, M_point + r</em>Y) where r is a random scalar
 d. Serialize u and e using compressed point encoding</t>
            </li>
            <li>
              <t>Shuffle the encrypted tokens with cryptographically secure randomness.</t>
            </li>
            <li>
              <t>Provide the shuffled tokens to the browser along with pk_e, t_epoch_end, and t_next_epoch_start</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="token-re-randomization-and-spending">
        <name>Token Re-randomization and Spending</name>
        <section anchor="re-randomization-algorithm">
          <name>Re-randomization Algorithm</name>
          <t>To prevent linkability attacks, the browser <bcp14>MUST</bcp14> re-randomize each token before use. Re-randomization exploits the malleable property of ElGamal encryption to produce a new ciphertext that decrypts to the same plaintext but is unlinkable to the original ciphertext.</t>
          <t>Given an ElGamal ciphertext (u, e) where:</t>
          <ul spacing="normal">
            <li>
              <t>u is a compressed elliptic curve point</t>
            </li>
            <li>
              <t>e is a compressed elliptic curve point</t>
            </li>
          </ul>
          <t>The browser re-randomizes by:</t>
          <ol spacing="normal" type="1"><li>
              <t>Parse u and e from their compressed encodings to curve points U and E</t>
            </li>
            <li>
              <t>Generate a random scalar z uniformly from [1, n-1] where n is the order of the secp256r1 curve</t>
            </li>
            <li>
              <t>Compute the re-randomized ciphertext:  </t>
              <ul spacing="normal">
                <li>
                  <t>U' = U + z * G</t>
                </li>
                <li>
                  <t>E' = E + z * Y      </t>
                  <t>
where G is the generator point and Y is the public key point</t>
                </li>
              </ul>
            </li>
            <li>
              <t>Serialize U' and E' using compressed point encoding</t>
            </li>
          </ol>
          <t>The browser <bcp14>MUST</bcp14> re-randomize each token before it is used and each
time the token is re-used to defend against linkability attacks.</t>
          <t>The browser maintains a local database with the following schema:</t>
          <artwork><![CDATA[
   +------------+------------+------------+------------+------------+
   | Field Name | u          | e          | t_epoch_   | epoch_id   |
   |            |            |            | end        |            |
   +------------+------------+------------+------------+------------+
   | Field Type | bytes      | bytes      | timestamp  | bytes      |
   +------------+------------+------------+------------+------------+
]]></artwork>
          <t>Additional implementation-specific fields for token management:</t>
          <artwork><![CDATA[
   +------------+------------+------------+------------+------------+
   | Field Name | version    | public_key | num_signal | context_id |
   |            |            |            | _tokens    |            |
   +------------+------------+------------+------------+------------+
   | Field Type | integer    | text       | integer    | string     |
   +------------+------------+------------+------------+------------+
]]></artwork>
          <t>The context_id field defaults to NULL for new tokens and is set to an
   identifier of the context (e.g., the top-level domain name) when the token is spent.</t>
          <t>When the browser wishes to assert its willingness to probabilistically reveal a signal:</t>
          <ol spacing="normal" type="1"><li>
              <t>It checks for any token already assigned to the requesting context whose t_epoch_end has not passed</t>
            </li>
            <li>
              <t>If such a token exists, the browser reuses it for this connection</t>
            </li>
            <li>
              <t>If no such token exists, the browser assigns a non-spent, current-epoch token to the context by setting the context_id field</t>
            </li>
            <li>
              <t>The assigned token is re-randomized and sent to the relevant party</t>
            </li>
          </ol>
        </section>
      </section>
      <section anchor="key-disclosure-and-validation">
        <name>Key Disclosure and Validation</name>
        <t>At the end of each epoch and after the embargo period has ended, the Key Coordinator <bcp14>MUST</bcp14> publish (pk_e, sk_e, S_e) as JSON Web Keys (JWKs). The ElGamal key is stored with key type "eg", where "x" and "y" hold the public key (pk_e) and "d" holds the secret key (sk_e). The HMAC secret S_e is stored as "hmac.k". All values are converted to big-endian byte arrays and base64url-encoded <xref target="RFC4648"/>.</t>
        <t>Example key disclosure format:</t>
        <artwork><![CDATA[
   {
     "epoch_id": 12,
     "epoch_start_time": "20241125T10:00:00",
     "epoch_end_time": "20241126T12:00:00",
     "invalidated_at": null,
     "eg": {
       "kty": "EC",
       "crv": "P-256",
       "x": "DROn9TZojl70_6lhtcLxItT2qskNDGk97wjz0N5qdiE",
       "y": "k6EtdGm_jW3b7Le9zM2LgcO7b9Q_qwjS2jL0MFn6V4",
       "d": "S7_oLScyL_W2ob71hx6kHFv5nTmAt2CvqzmKeF7lLGA"
     },
     "hmac": {
       "kty": "oct",
       "k": "AyM1SysPpbyDfgZld3umj1qzKObwVMkoqQ-EstJQLr_T-1qS0gZH75aKtMN3Yj0iPS4hcgUuTwjAzZr1Z9CAow",
       "alg": "HS256"
     }
   }
]]></artwork>
        <t>Users and websites can then:</t>
        <ol spacing="normal" type="1"><li>
            <t>Decrypt tokens using sk_e</t>
          </li>
          <li>
            <t>Validate HMAC values using S_e</t>
          </li>
          <li>
            <t>Verify that the distribution of t_ord values is uniformly distributed</t>
          </li>
          <li>
            <t>Confirm that the actual reveal rate matches the expected p_reveal</t>
          </li>
        </ol>
      </section>
    </section>
    <section anchor="http-integration">
      <name>HTTP Integration</name>
      <section anchor="http-header-format">
        <name>HTTP Header Format</name>
        <t>PRTs are transmitted in the "Sec-Probabilistic-Reveal-Token" HTTP header <xref target="RFC7231"/>. The header value is a Structured Header Byte Sequence <xref target="RFC8941"/> containing a TLS Presentation Language <xref target="RFC8446"/> serialized PRTStruct:</t>
        <artwork><![CDATA[
   struct {
     uint8 version;
     uint16 u_length;
     opaque u[u_length];
     uint16 e_length;
     opaque e[e_length];
     opaque epoch_id[8];
   } PRTStruct;
]]></artwork>
        <t>Where:</t>
        <ul spacing="normal">
          <li>
            <t>version identifies the token format version</t>
          </li>
          <li>
            <t>u and e are the ElGamal ciphertext components</t>
          </li>
          <li>
            <t>epoch_id identifies the corresponding key material for decryption</t>
          </li>
        </ul>
        <t>For version 1, u and e are each 33 bytes in length (compressed secp256r1 points).</t>
      </section>
      <section anchor="token-transmission">
        <name>Token Transmission</name>
        <t>Example HTTP header:</t>
        <t>Sec-Probabilistic-Reveal-Token: :AQAhA0YcSOPXwN8JkGJz2Rxe349sEOzwLcXnrU0/e5P1QUEEACECjvPnzEReeDlIkrDocZA5ZtiIptiG02YOOaNMJKyKZTdIXbE63QJtYA==:</t>
        <t>Browsers <bcp14>SHOULD</bcp14> include this header on requests where:</t>
        <ol spacing="normal" type="1"><li>
            <t>The request is being sent through a proxy for privacy purposes</t>
          </li>
          <li>
            <t>The destination origin has registered to receive PRTs</t>
          </li>
          <li>
            <t>A valid PRT is available for the current epoch</t>
          </li>
        </ol>
        <t>If no valid PRTs are available when composing a proxied request, the browser <bcp14>SHOULD</bcp14> make the request without the header. Well-behaved clients <bcp14>SHOULD</bcp14> only fail to attach a PRT in exceptional circumstances (e.g., Issuer unavailability).</t>
      </section>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <section anchor="epoch-length">
        <name>Epoch Length</name>
        <t>The epoch length affects both privacy and utility:</t>
        <ul spacing="normal">
          <li>
            <t>Epochs <bcp14>SHOULD</bcp14> be long enough to prevent leakage through user re-
identification within browsing sessions</t>
          </li>
          <li>
            <t>Epochs <bcp14>SHOULD</bcp14> be short enough that signals remain valid and users
can verify issuer behavior in reasonable time</t>
          </li>
          <li>
            <t>A minimum epoch length of four hours is <bcp14>RECOMMENDED</bcp14></t>
          </li>
          <li>
            <t>Typical implementations <bcp14>MAY</bcp14> use epoch lengths of approximately one
day</t>
          </li>
        </ul>
      </section>
      <section anchor="privacy-considerations">
        <name>Privacy Considerations</name>
        <t>Tokens from the same browser <bcp14>MUST NOT</bcp14> be joinable by the website. If the receiving party can link multiple tokens from the same browser (e.g., through storing them in partitioned storage), the website's chance of recovering the signal increases beyond p_reveal.</t>
        <t>Browsers <bcp14>MUST</bcp14> enforce reasonable bounds on the epoch length to ensure privacy requirements are met.</t>
        <t>Implementations <bcp14>MUST</bcp14> track context assignments to ensure that only one token per context per epoch is allocated. The context_id field in the browser database is <bcp14>REQUIRED</bcp14> to prevent websites from obtaining multiple tokens and exceeding the intended p_reveal rate.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="token-ordinal-metadata">
        <name>Token Ordinal Metadata</name>
        <t>Token ordinals prevent a malicious client from choosing one token and using it for every session. This would allow an attacker to generate an unbounded set of tokens with the same message. Although the attacker does not know which property this set of tokens has, this re-use would create a high likelihood that the signal would never be revealed.</t>
        <t>For each requested batch of tokens, the issuer records the order of the token in the generation sequence as the token's "ordinal" and then shuffles the tokens. This field does not convey information about the client requesting tokens, since each batch of tokens has the full set of ordinal IDs.</t>
        <t>Websites can monitor the distribution of token ordinal values and detect spikes that may indicate an attacker re-randomizing the same token across different sessions.</t>
      </section>
      <section anchor="ciphertext-re-randomization">
        <name>Ciphertext Re-randomization</name>
        <t>The ability to re-randomize a token's ciphertext without changing the underlying contents (a property of the ElGamal encryption scheme) underpins many of the security and privacy properties of PRTs. The issuer cannot link a re-randomized token's ciphertext back to any tokens it issued, and origins that receive re-randomized versions of the same token cannot link them together.</t>
        <t>Before sending a token on a connection to a particular site for the first time, the client re-randomizes the ciphertext for that token to make it unlinkable to any other usage of the token for other pairs. The client caches the ciphertexts for each pairing and reuses them on subsequent requests while the underlying token remains valid.</t>
        <t>The client does not re-randomize the token when the token is re-used on the same site. This allows the site to distinguish between a client with many visits using the same token and a client that is re-randomizing the same token across multiple visits (see section above).</t>
      </section>
      <section anchor="ip-address-mismatch">
        <name>IP Address Mismatch</name>
        <t>The IP address a client uses to fetch tokens may differ from the IP address used to connect to websites later. This can occur due to network changes, dynamic IP assignment, or other factors. This drift may result in a PRT revealing an IP address that is unexpected from the user's perspective.</t>
        <t>Browsers can reduce the chance of IP address mismatch by fetching tokens close to when they are spent and aligned with user expectations.</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="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="ELGAMAL" target="https://scispace.com/pdf/a-public-key-cryptosystem-and-a-signature-scheme-based-on-1d0i870rfp.pdf">
          <front>
            <title>ELGAMAL</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
          <seriesInfo name="WHATWG" value="Living Standard"/>
        </reference>
        <reference anchor="SEC1" target="https://www.secg.org/sec1-v2.pdf">
          <front>
            <title>SEC1</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
          <seriesInfo name="WHATWG" value="Living Standard"/>
        </reference>
        <reference anchor="RFC3526">
          <front>
            <title>More Modular Exponential (MODP) Diffie-Hellman groups for Internet Key Exchange (IKE)</title>
            <author fullname="T. Kivinen" initials="T." surname="Kivinen"/>
            <author fullname="M. Kojo" initials="M." surname="Kojo"/>
            <date month="May" year="2003"/>
            <abstract>
              <t>This document defines new Modular Exponential (MODP) Groups for the Internet Key Exchange (IKE) protocol. It documents the well known and used 1536 bit group 5, and also defines new 2048, 3072, 4096, 6144, and 8192 bit Diffie-Hellman groups numbered starting at 14. The selection of the primes for theses groups follows the criteria established by Richard Schroeppel. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3526"/>
          <seriesInfo name="DOI" value="10.17487/RFC3526"/>
        </reference>
        <reference anchor="RFC5114">
          <front>
            <title>Additional Diffie-Hellman Groups for Use with IETF Standards</title>
            <author fullname="M. Lepinski" initials="M." surname="Lepinski"/>
            <author fullname="S. Kent" initials="S." surname="Kent"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>This document describes eight Diffie-Hellman groups that can be used in conjunction with IETF protocols to provide security for Internet communications. The groups allow implementers to use the same groups with a variety of security protocols, e.g., SMIME, Secure SHell (SSH), Transport Layer Security (TLS), and Internet Key Exchange (IKE).</t>
              <t>All of these groups comply in form and structure with relevant standards from ISO, ANSI, NIST, and the IEEE. These groups are compatible with all IETF standards that make use of Diffie-Hellman or Elliptic Curve Diffie-Hellman cryptography.</t>
              <t>These groups and the associated test data are defined by NIST on their web site [EX80056A], but have not yet (as of this writing) been published in a formal NIST document. Publication of these groups and associated test data, as well as describing how to use Diffie-Hellman and Elliptic Curve Diffie-Hellman for key agreement in all of the protocols cited below, in one RFC, will facilitate development of interoperable implementations and support the Federal Information Processing Standard (FIPS) validation of implementations that make use of these groups. This memo provides information for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5114"/>
          <seriesInfo name="DOI" value="10.17487/RFC5114"/>
        </reference>
        <reference anchor="RFC2104">
          <front>
            <title>HMAC: Keyed-Hashing for Message Authentication</title>
            <author fullname="H. Krawczyk" initials="H." surname="Krawczyk"/>
            <author fullname="M. Bellare" initials="M." surname="Bellare"/>
            <author fullname="R. Canetti" initials="R." surname="Canetti"/>
            <date month="February" year="1997"/>
            <abstract>
              <t>This document describes HMAC, a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g., MD5, SHA-1, in combination with a secret shared key. The cryptographic strength of HMAC depends on the properties of the underlying hash function. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2104"/>
          <seriesInfo name="DOI" value="10.17487/RFC2104"/>
        </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="RFC4648">
          <front>
            <title>The Base16, Base32, and Base64 Data Encodings</title>
            <author fullname="S. Josefsson" initials="S." surname="Josefsson"/>
            <date month="October" year="2006"/>
            <abstract>
              <t>This document describes the commonly used base 64, base 32, and base 16 encoding schemes. It also discusses the use of line-feeds in encoded data, use of padding in encoded data, use of non-alphabet characters in encoded data, use of different encoding alphabets, and canonical encodings. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4648"/>
          <seriesInfo name="DOI" value="10.17487/RFC4648"/>
        </reference>
        <reference anchor="RFC7231">
          <front>
            <title>Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2014"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless \%application- level protocol for distributed, collaborative, hypertext information systems. This document defines the semantics of HTTP/1.1 messages, as expressed by request methods, request header fields, response status codes, and response header fields, along with the payload of messages (metadata and body content) and mechanisms for content negotiation.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7231"/>
          <seriesInfo name="DOI" value="10.17487/RFC7231"/>
        </reference>
        <reference anchor="RFC8941">
          <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="February" year="2021"/>
            <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 that wish to use a common syntax that is more restrictive than traditional HTTP field values.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8941"/>
          <seriesInfo name="DOI" value="10.17487/RFC8941"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
      </references>
    </references>
    <?line 469?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>We thank Scott Hendrickson for his thoughtful review and constructive criticism of earlier drafts of this proposal.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
87YYNOe5JfDd+V8USyScqlUAAA==

-->

</rfc>
