<?xml version="1.0" encoding="utf-8"?>
<rfc version="3" ipr="trust200902" docName="draft-cure-core-00" category="exp" submissionType="IETF" xmlns:xi="http://www.w3.org/2001/XInclude">
  <front>
    <title abbrev="CURE">CURE: Consent Upon Recipient Engagement</title>
    <author initials="M." surname="Balakrishna" fullname="Madhu Balakrishna">
      <organization></organization>
      <address><email>madhugb04@gmail.com</email></address>
    </author>
    <date year="2026" month="January" day="24"/>
    <area>Applications</area>
    <workgroup>Network Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>This document specifies CURE (Consent Upon Recipient Engagement), a fully native, asynchronous mechanism for expressing and enforcing recipient consent in email without introducing mailbox enumeration, synchronous negotiation, or new SMTP commands. CURE does not guarantee delivery, consent, or sender legitimacy; rather, it provides a privacy-preserving signal that mailbox providers MAY use to improve enforcement and sender accountability.</t>
    </abstract>
  </front>
  <middle>
<section anchor="introduction"><name>Introduction</name>
<t>Current email standards lack a native mechanism for recipients to express consent to senders without exposing their mailbox existence or opening themselves to spam. Existing mechanisms often rely on out-of-band subscriptions, synchronous SMTP extensions (which disclose recipient existence), or content filtering (which is opaque to legitimate senders).</t>
<t>The CURE protocol provides a minimal, email-native consent signal that preserves SMTP's ambiguity regarding recipient existence while enabling mailbox providers to enforce recipient intent. This protocol does not attempt to fix email delivery guarantees, but constrains how consent can safely emerge within the existing email delivery architecture.</t>

<section anchor="core-invariants"><name>Core Invariants</name>
<t>The protocol adheres to the following design invariants:</t>

<ol spacing="compact">
<li><strong>Asynchronous</strong>: No request/response semantics are introduced over SMTP.</li>
<li><strong>Recipient-initiated</strong>: Consent moves from the recipient to the sender based on meaningful action, not unilaterally from sender requests.</li>
<li><strong>Non-enumerable</strong>: No signal in the protocol reveals mailbox existence or state to a sender.</li>
<li><strong>Ignorable</strong>: All components may be safely ignored by non-participating senders or receivers without breaking email delivery.</li>
</ol>
</section>
</section>

<section anchor="conventions-and-definitions"><name>Conventions and Definitions</name>
<t>The key words &quot;MUST&quot;, &quot;MUST NOT&quot;, &quot;REQUIRED&quot;, &quot;SHALL&quot;, &quot;SHALL NOT&quot;, &quot;SHOULD&quot;, &quot;SHOULD NOT&quot;, &quot;RECOMMENDED&quot;, &quot;NOT RECOMMENDED&quot;, &quot;MAY&quot;, and &quot;OPTIONAL&quot; in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.</t>

<section anchor="terminology"><name>Terminology</name>

<ul spacing="compact">
<li><strong>Sender</strong>: The domain sending email, authenticated via mechanisms such as SPF, DKIM, and DMARC.</li>
<li><strong>Recipient Domain</strong>: The mailbox provider or system responsible for receiving email and enforcing local policy.</li>
<li><strong>Recipient</strong>: The end user or entity whose actions may implicitly grant consent.</li>
<li><strong>CURE-Ask</strong>: Consent Request, a header sent by the Sender.</li>
<li><strong>CURE-Allow</strong>: Consent Token, a header minted by the Recipient Domain and returned to the Sender.</li>
</ul>
</section>
</section>

<section anchor="protocol-description"><name>Protocol Description</name>

<section anchor="objects"><name>Objects</name>
<t>The protocol defines two primary header objects:</t>

<section anchor="cure-ask-consent-request"><name>CURE-Ask (Consent Request)</name>
<t>The CURE-Ask object is transported as an [RFC5322] header. It is declarative, non-authoritative, and safe to ignore.</t>
<t>Example:</t>

<artwork><![CDATA[CURE-Ask: v=1; id=uuid; sender=sender.com; scope=transactional; \
          rate=3/1h; purpose=account-notifications; \
          expires=2026-02-01T00:00:00Z
]]></artwork>
<t>The Recipient Domain acts as the sole arbiter of scope. The scope granted in a subsequent <tt>CURE-Allow</tt> token MAY differ from the scope requested in <tt>CURE-Ask</tt>.</t>
</section>

<section anchor="cure-allow-consent-token"><name>CURE-Allow (Consent Token)</name>
<t>The CURE-Allow object is cryptographically minted by the recipient domain. It is never granted due to message delivery alone. The token is bound to the recipient (typically hashed), sender identity, scope, rate, and expiry.</t>

<section anchor="token-semantics-and-construction"><name>Token Semantics and Construction</name>
<t>To allow stateless validation, it is RECOMMENDED that Recipient Domains construct tokens using a keyed-hash message authentication code (HMAC):</t>
<t><tt>Token = Base64( HMAC-SHA256(SecretKey, SenderDomain + HashedRecipient + Expiry + Scope) )</tt></t>
<t>This construction prevents the need for a stateful database of all active tokens.</t>
</section>
</section>
</section>

<section anchor="granting-rule"><name>Granting Rule</name>
<t>Consent is granted <strong>only</strong> when the recipient <strong>replies</strong> to the message. A reply is a universally observable email-native action that can be detected by the Recipient MTA via outbound SMTP, regardless of email architecture.</t>
<t>Consent is <strong>never</strong> granted by:</t>

<ul spacing="compact">
<li>Message delivery</li>
<li>Message open</li>
<li>Tracking pixels</li>
<li>Passive rendering of content</li>
<li>Clicking links (web-based, not email-native)</li>
<li>Any action outside the email protocol</li>
</ul>
</section>

<section anchor="exchange-flow"><name>Exchange Flow</name>

<ol spacing="compact">
<li><strong>Request</strong>: The sender transmits an initial message containing the <tt>CURE-Ask</tt> header.</li>
<li><strong>Processing</strong>: The Recipient Domain receives the message. It MUST validate the authentication status of the sender (DMARC alignment). It MAY store the request properties internally but sends NO response (neither SMTP nor email) to the sender at this stage.</li>
<li><t><strong>Action</strong>: If the Recipient later acts meaningfully (per Section 3.2):</t>

<ul spacing="compact">
<li>The Recipient Domain mints a <tt>CURE-Allow</tt>.</li>
<li>The token is stored server-side.</li>
</ul></li>
<li><t><strong>Token Return/Refresh (Optional)</strong>:</t>

<ul spacing="compact">
<li><strong>Explicit</strong>: The Recipient Domain MAY send a machine-readable notification (see Section 5.4) to the sender. This notification MUST be a separate message from any user-generated reply. It MUST be sent to the address specified in the <tt>rpt</tt> parameter of <tt>CURE-Ask</tt>, or the <tt>From</tt> address if <tt>rpt</tt> is absent.</li>
<li><strong>Refresh</strong>: If an incoming message contains a valid <tt>CURE-Allow</tt> token nearing expiry, the Recipient Domain MAY silently mint and return a refreshed token to extend the consent window.</li>
</ul></li>
</ol>
<t>The absence of a token return is indistinguishable from denial or a non-existent recipient.</t>
</section>

<section anchor="receiver-handling-guidelines"><name>Receiver Handling Guidelines</name>
<t>To mitigate the &quot;Cold Start&quot; problem while preventing abuse, Receivers are advised to implement intelligent handling for unsolicited messages containing valid <tt>CURE-Ask</tt> headers:</t>

<section anchor="prioritization"><name>Prioritization</name>
<t>Receivers SHOULD NOT process incoming <tt>CURE-Ask</tt> requests on a strictly First-Come-First-Serve (FCFS) basis. Doing so allows abusive senders to flood the user's view, effectively starving legitimate introduction requests (a Denial-of-Service attack).</t>
<t>Instead, Receivers SHOULD prioritize the presentation of requests based on:
1.  <strong>Domain Reputation</strong>: Age and historical volume consistency of the Sender Domain.
2.  <strong>Authentication</strong>: Strength of DMARC policies (e.g., <tt>p=reject</tt> is preferred).
3.  <strong>User Signals</strong>: Implicit signals such as whether the user has previously interacted with the domain.</t>
</section>

<section anchor="probationary-presentation"><name>Probationary Presentation</name>
<t>Receivers MAY route verified <tt>CURE-Ask</tt> messages to a dedicated &quot;Consent Review&quot; interface or a distinct folder (e.g., &quot;Requests&quot;). Within this interface, Receivers SHOULD offer explicit controls:</t>

<ul spacing="compact">
<li><t><strong>Allow</strong>: If the user explicitly accepts the request, the Receiver has two implementation options:</t>

<ul spacing="compact">
<li><strong>Integrated providers</strong> (controlling both MUA and MTA): MAY directly mint a <tt>CURE-Allow</tt> token without requiring an actual reply, since they can observe the user's explicit consent action.</li>
<li><strong>Standard providers</strong>: MAY automatically send a reply on the user's behalf to trigger the consent mechanism, then mint the token upon detecting the outbound reply.</li>
</ul></li>
<li><strong>Deny/Ignore</strong>: If the user declines, the Receiver removes the request. No signal is sent to the sender (indistinguishable from non-delivery).</li>
</ul>
<t>This explicit interaction model provides a better user experience than requiring manual replies, while remaining compatible with the email-native reply-based granting rule.</t>
<t><strong>Low-Friction Fallback</strong>: Receivers unwilling to implement custom UI controls MAY simply render the message as standard content. In this mode, the Receiver relies on the user manually replying to grant consent. This ensures backward compatibility with existing MUAs.</t>
</section>
</section>

<section anchor="dns-based-discovery"><name>DNS-Based Discovery</name>
<t>To enable senders to discover whether a recipient domain supports CURE before sending messages, recipient domains SHOULD publish a DNS TXT record at the subdomain <tt>_cure</tt> under their primary domain.</t>

<section anchor="dns-record-format"><name>DNS Record Format</name>
<t>The DNS TXT record MUST use the following format:</t>

<artwork><![CDATA[_cure.example.com. IN TXT "v=CURE1; capabilities=ask,allow; \
  policy=default-scope:transactional; default-expiry:90d"
]]></artwork>
<t><strong>Parameters:</strong></t>

<ul spacing="compact">
<li><strong>v</strong> (required): Protocol version. MUST be <tt>CURE1</tt> for this specification.</li>
<li><t><strong>capabilities</strong> (optional): Comma-separated list of supported features. Valid values:</t>

<ul spacing="compact">
<li><tt>ask</tt>: Domain processes <tt>CURE-Ask</tt> headers</li>
<li><tt>allow</tt>: Domain mints and validates <tt>CURE-Allow</tt> tokens</li>
<li><tt>refresh</tt>: Domain supports token refresh</li>
<li><tt>explicit</tt>: Domain sends explicit token return notifications</li>
</ul></li>
<li><t><strong>policy</strong> (optional): Semicolon-separated list of default policy parameters:</t>

<ul spacing="compact">
<li><tt>default-scope</tt>: Default scope granted if not specified in <tt>CURE-Ask</tt> (e.g., <tt>transactional</tt>, <tt>promotional</tt>, <tt>relationship</tt>)</li>
<li><tt>default-expiry</tt>: Default token expiry duration (e.g., <tt>30d</tt>, <tt>90d</tt>, <tt>1y</tt>)</li>
<li><tt>max-rate</tt>: Maximum allowed rate limit (e.g., <tt>10/1d</tt>, <tt>100/1w</tt>)</li>
<li><tt>require-dmarc</tt>: If present, requires <tt>p=reject</tt> or <tt>p=quarantine</tt> DMARC policy</li>
</ul></li>
</ul>
<t>If the <tt>capabilities</tt> parameter is omitted, senders SHOULD assume the domain supports all features defined in this specification.</t>
<t>If policy parameters are omitted, senders SHOULD NOT make assumptions about domain policy and rely on explicit <tt>CURE-Allow</tt> token parameters.</t>
</section>

<section anchor="discovery-process"><name>Discovery Process</name>
<t>Senders SHOULD perform DNS discovery as follows:</t>

<ol spacing="compact">
<li>Extract the recipient domain from the email address (e.g., <tt>example.com</tt> from <tt>user@example.com</tt>)</li>
<li>Query for TXT records at <tt>_cure.&lt;domain&gt;</tt> (e.g., <tt>_cure.example.com</tt>)</li>
<li>If a valid CURE record is found, the domain supports CURE</li>
<li>If no record is found or the record is invalid, the sender MAY still send <tt>CURE-Ask</tt> headers (per the Ignorable invariant)</li>
</ol>
</section>

<section anchor="example-dns-records"><name>Example DNS Records</name>
<t><strong>Full support with strict policy:</strong></t>

<artwork><![CDATA[_cure.gmail.com. IN TXT "v=CURE1; capabilities=ask,allow,refresh,explicit; \
  policy=default-scope:transactional; default-expiry:90d; \
  max-rate:10/1d; require-dmarc"
]]></artwork>
<t><strong>Basic support with permissive policy:</strong></t>

<artwork><![CDATA[_cure.example.org. IN TXT "v=CURE1; capabilities=ask,allow; \
  policy=default-scope:relationship; default-expiry:1y"
]]></artwork>
<t><strong>Minimal declaration (no policy advertised):</strong></t>

<artwork><![CDATA[_cure.example.net. IN TXT "v=CURE1"
]]></artwork>
<t><strong>Enterprise gateway with custom policy:</strong></t>

<artwork><![CDATA[_cure.corporate.com. IN TXT "v=CURE1; capabilities=ask,allow; \
  policy=default-scope:promotional; default-expiry:30d; \
  max-rate:5/1w; require-dmarc"
]]></artwork>
</section>

<section anchor="caching-and-ttl"><name>Caching and TTL</name>
<t>Senders SHOULD cache DNS discovery results according to the TTL specified in the DNS record. A recommended TTL is 86400 seconds (24 hours) to balance freshness with query load.</t>
</section>

<section anchor="dns-security"><name>DNS Security</name>
<t>DNS discovery is subject to standard DNS security considerations. Senders SHOULD use DNSSEC when available to validate the authenticity of CURE DNS records. The absence of a CURE DNS record MUST NOT be interpreted as the domain rejecting CURE-Ask headers.</t>
</section>
</section>
</section>

<section anchor="state-machines-normative"><name>State Machines (Normative)</name>
<t>This section defines the sender-side and recipient-domain-side state machines for CURE. These state machines are normative and intended to eliminate ambiguity in implementation.</t>
<t>State transitions MUST NOT expose mailbox existence, consent status, or enforcement decisions to the sender.</t>

<section anchor="sender-state-machine"><name>Sender State Machine</name>

<section anchor="sender-states"><name>Sender States</name>

<ul spacing="compact">
<li><strong>S0: No-Consent</strong>: The sender possesses no valid CURE-Allow for the recipient.</li>
<li><strong>S1: Consent-Requested</strong>: The sender has transmitted one or more messages containing a CURE-Ask.</li>
<li><strong>S2: Consent-Granted</strong>: The sender possesses a valid CURE-Allow.</li>
<li><strong>S3: Consent-Expired</strong>: The sender previously possessed a CURE-Allow, but it is no longer valid due to expiry.</li>
<li><strong>S4: Consent-Revoked</strong>: The sender possessed a CURE-Allow that has been revoked by recipient policy.</li>
</ul>
</section>

<section anchor="sender-transitions"><name>Sender Transitions</name>
<table>
<thead>
<tr>
<th>From</th>
<th>Event</th>
<th>To</th>
<th>Notes</th>
</tr>
</thead>

<tbody>
<tr>
<td>S0</td>
<td>Send message with CURE-Ask</td>
<td>S1</td>
<td>No acknowledgment expected</td>
</tr>

<tr>
<td>S1</td>
<td>Send additional messages</td>
<td>S1</td>
<td>Ask MAY be repeated or omitted</td>
</tr>

<tr>
<td>S1</td>
<td>Receive CURE-Allow (explicit)</td>
<td>S2</td>
<td>Allow MUST be validated</td>
</tr>

<tr>
<td>S2</td>
<td>Allow expires</td>
<td>S3</td>
<td>Expiry handled locally</td>
</tr>

<tr>
<td>S2</td>
<td>Allow rejected during SMTP</td>
<td>S4</td>
<td>Rejection is indistinguishable from other failures</td>
</tr>

<tr>
<td>S3</td>
<td>Send message with CURE-Ask</td>
<td>S1</td>
<td>Fresh request</td>
</tr>

<tr>
<td>S4</td>
<td>Send message with CURE-Ask</td>
<td>S1</td>
<td>Revocation does not prevent re-request</td>
</tr>
</tbody>
</table></section>

<section anchor="sender-invariants"><name>Sender Invariants</name>

<ul spacing="compact">
<li>The sender MUST NOT assume consent based on message delivery or lack of rejection.</li>
<li>The sender MUST treat all SMTP failures identically.</li>
<li>The sender MUST NOT probe for consent state.</li>
<li>The sender MUST be prepared for CURE-Allow loss or revocation at any time.</li>
</ul>
</section>
</section>

<section anchor="recipient-domain-state-machine"><name>Recipient Domain State Machine</name>

<section anchor="recipient-states"><name>Recipient States</name>

<ul spacing="compact">
<li><strong>R0: Unknown</strong>: No prior CURE interaction exists for the sender-recipient pair.</li>
<li><strong>R1: Pending</strong>: A CURE-Ask has been observed but no consent has been granted.</li>
<li><strong>R2: Consented</strong>: A valid CURE-Allow exists and is enforceable.</li>
<li><strong>R3: Revoked</strong>: Consent has been explicitly or implicitly revoked.</li>
</ul>
</section>

<section anchor="recipient-transitions"><name>Recipient Transitions</name>
<table>
<thead>
<tr>
<th>From</th>
<th>Event</th>
<th>To</th>
<th>Notes</th>
</tr>
</thead>

<tbody>
<tr>
<td>R0</td>
<td>Receive message with CURE-Ask</td>
<td>R1</td>
<td>State MAY be transient</td>
</tr>

<tr>
<td>R0</td>
<td>Recipient meaningful action</td>
<td>R2</td>
<td>Ask presence not required</td>
</tr>

<tr>
<td>R1</td>
<td>Recipient meaningful action</td>
<td>R2</td>
<td>Allow minted</td>
</tr>

<tr>
<td>R2</td>
<td>Allow expires</td>
<td>R0</td>
<td>Expiry does not imply revocation</td>
</tr>

<tr>
<td>R2</td>
<td>Abuse signal / unsubscribe</td>
<td>R3</td>
<td>Revocation is immediate</td>
</tr>

<tr>
<td>R3</td>
<td>Recipient meaningful action</td>
<td>R2</td>
<td>Fresh consent minted</td>
</tr>
</tbody>
</table></section>

<section anchor="recipient-invariants"><name>Recipient Invariants</name>

<ul spacing="compact">
<li>Receipt of CURE-Ask MUST NOT alter SMTP behavior.</li>
<li>CURE-Ask MUST NOT grant consent by itself.</li>
<li>Absence of CURE-Ask MUST NOT prevent consent granting.</li>
<li>Revocation MUST be silent and indistinguishable from non-existence.</li>
</ul>
</section>
</section>

<section anchor="observability-constraints"><name>Observability Constraints</name>
<t>At no point MAY the sender reliably distinguish between:</t>

<ul spacing="compact">
<li>R0 (Unknown)</li>
<li>R1 (Pending)</li>
<li>R3 (Revoked)</li>
<li>Non-existent recipient</li>
</ul>
<t>SMTP responses, timing, and message acceptance MUST remain ambiguous across these states.</t>
</section>

<section anchor="forbidden-transitions"><name>Forbidden Transitions</name>
<t>The following transitions MUST NOT occur:</t>

<ul spacing="compact">
<li>R0 -&gt; R2 solely due to message delivery.</li>
<li>R1 -&gt; R2 due to message open or passive rendering.</li>
<li>Any sender state transition based on SMTP success.</li>
<li>Any recipient transition that emits a synchronous signal.</li>
</ul>
</section>
</section>

<section anchor="header-syntax"><name>Header Syntax</name>
<t>This section defines the formal syntax and processing rules for CURE headers. All ABNF is defined using the Augmented Backus-Naur Form (ABNF) as specified in [RFC5234].</t>
<t>CURE introduces two new message headers:</t>

<ul spacing="compact">
<li><tt>CURE-Ask</tt>: Consent Request</li>
<li><tt>CURE-Allow</tt>: Consent Token</li>
</ul>
<t>Header field names are case-insensitive.</t>

<section anchor="common-grammar-elements"><name>Common Grammar Elements</name>

<sourcecode type="abnf"><![CDATA[ALPHA          = %x41-5A / %x61-7A
DIGIT          = %x30-39
SP             = %x20
HTAB           = %x09
WSP            = SP / HTAB
DQUOTE         = %x22

field-name     = ALPHA *(ALPHA / DIGIT / "-")
field-value    = *(WSP / VCHAR)

version        = 1*DIGIT "." 1*DIGIT
uri            = "<" 1*(VCHAR) ">"
base64url      = 1*(ALPHA / DIGIT / "-" / "_")

timestamp      = 1*DIGIT
]]></sourcecode>
</section>

<section anchor="cure-ask-header"><name>CURE-Ask Header</name>
<t>The <tt>CURE-Ask</tt> header signals the sender’s request for recipient consent. Presence of this header does not imply delivery preference or enforcement.</t>

<section anchor="syntax"><name>Syntax</name>

<sourcecode type="abnf"><![CDATA[CURE-Ask       = "CURE-Ask:" WSP ask-params

ask-params    = ask-version *( ";" WSP ask-param )

ask-version   = "v=" version

ask-param     = ask-scope / ask-rate / ask-context / ask-rpt / ask-ext

ask-scope     = "scope=" scope-token
scope-token   = 1*(ALPHA / DIGIT / "-" / "_")

ask-rate      = "rate=" 1*DIGIT "/" 1*DIGIT [ALPHA]

ask-context   = "ctx=" uri

ask-rpt       = "rpt=" uri

ask-ext       = field-name "=" field-value
]]></sourcecode>
</section>

<section anchor="processing-rules"><name>Processing Rules</name>

<ul spacing="compact">
<li>Senders MAY include <tt>CURE-Ask</tt> in any message.</li>
<li>Absence of <tt>CURE-Ask</tt> MUST NOT prevent consent granting.</li>
<li>Receivers MUST ignore unknown parameters.</li>
<li>Presence of <tt>CURE-Ask</tt> MUST NOT affect SMTP responses.</li>
</ul>
</section>
</section>

<section anchor="cure-allow-header"><name>CURE-Allow Header</name>
<t>The <tt>CURE-Allow</tt> header conveys a previously granted consent token. Tokens are opaque to senders and only verifiable by the recipient domain.</t>

<section anchor="syntax-1"><name>Syntax</name>

<sourcecode type="abnf"><![CDATA[CURE-Allow     = "CURE-Allow:" WSP allow-params

allow-params  = allow-version ";" WSP allow-token *( ";" WSP allow-param )

allow-version = "v=" version

allow-token   = "token=" base64url

allow-param   = allow-expiry / allow-scope / allow-ext

allow-expiry  = "exp=" timestamp

allow-scope   = "scope=" scope-token

allow-ext     = field-name "=" field-value
]]></sourcecode>
</section>

<section anchor="processing-rules-1"><name>Processing Rules</name>

<ul spacing="compact">
<li>Senders MUST treat tokens as opaque.</li>
<li>Senders MUST NOT attempt to infer recipient state from token rejection.</li>
<li>Receivers MUST validate tokens locally.</li>
<li>Invalid, expired, or revoked tokens MUST be silently ignored.</li>
</ul>
</section>
</section>

<section anchor="token-return-format"><name>Token Return Format</name>
<t>To enable automated processing by Senders, explicit token returns MUST use the media type <tt>application/cure-token+json</tt>. The body of the return message MUST contain a JSON object with the following properties:</t>

<ul spacing="compact">
<li><strong>token</strong> (string, required): The Base64 encoded <tt>CURE-Allow</tt> token.</li>
<li><strong>scope</strong> (string, required): The scope granted.</li>
<li><strong>expiry</strong> (string, required): ISO 8601 UTC timestamp of expiry.</li>
<li><strong>issuer</strong> (string, optional): The domain minting the token.</li>
</ul>
<t>Example:</t>

<sourcecode type="json"><![CDATA[{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "scope": "transactional",
  "expiry": "2026-07-28T00:00:00Z",
  "issuer": "google.com"
}
]]></sourcecode>
</section>
</section>

<section anchor="security-considerations"><name>Security Considerations</name>
<t>This section analyzes CURE against the identified threats. CURE is explicitly designed to avoid introducing new enumeration, probing, or amplification vectors beyond those already present in SMTP.</t>

<section anchor="recipient-enumeration"><name>Recipient Enumeration</name>
<t>CURE MUST NOT enable a sender to distinguish between existing and non-existing recipients, nor between consented and non-consented recipients.</t>
<t>CURE achieves this by:</t>

<ul spacing="compact">
<li>Prohibiting synchronous consent signaling.</li>
<li>Requiring identical SMTP behavior regardless of CURE state.</li>
<li>Mandating silent rejection of invalid, expired, or revoked tokens.</li>
</ul>
</section>

<section anchor="token-replay-and-forgery"><name>Token Replay and Forgery</name>
<t>CURE-Allow tokens are opaque and domain-scoped. Senders MUST treat tokens as unstructured data. Recipient domains MUST ensure:</t>

<ul spacing="compact">
<li>Tokens are bound to the recipient domain.</li>
<li>Tokens are not transferable across recipients.</li>
<li>Replay is bounded via expiry and local rate limits.</li>
</ul>
</section>

<section anchor="timing-side-channels"><name>Timing Side-Channels</name>
<t>Recipient domains MUST ensure that CURE processing does not introduce observable timing differences. SMTP response timing MUST NOT vary based on CURE state.</t>
</section>
</section>

<section anchor="deployment-considerations"><name>Deployment Considerations</name>
<t>To maximize coverage across diverse email architectures, CURE support is divided into three deployment models:</t>

<section anchor="integrated-environments-webmail"><name>Integrated Environments (Webmail)</name>
<t>Providers that control both the MTA and the MUA (e.g., Gmail, Yahoo) CAN reliably detect all &quot;Meaningful Actions,&quot; including clicks, views, and replies. These providers SHOULD implement the &quot;Probationary Presentation&quot; (Requests Folder) model described in Section 3.4.2 to offer the best user experience.</t>
</section>

<section anchor="enterprise-gateways"><name>Enterprise Gateways</name>
<t>Corporate environments using Secure Email Gateways (SEGs) CAN detect clicks via Link Rewriting and replies via outbound inspection. SEGs SHOULD intercept <tt>CURE-Ask</tt> headers and afford administrative or end-user controls to manage consent policies.</t>
</section>

<section anchor="standalone-clients-imap-pop"><name>Standalone Clients (IMAP/POP)</name>
<t>Users on decoupled clients (Outlook Desktop, Thunderbird) connecting to basic ISPs often cannot signal clicks to the Recipient Domain. For these users, <strong>Replying</strong> remains the only universally observable consent signal. Senders targeting these environments SHOULD encourage reply-based consent workflows (e.g., &quot;Reply to this email to start receiving notifications&quot;).</t>
</section>
</section>

<section anchor="privacy-considerations"><name>Privacy Considerations</name>
<t>CURE is designed to improve recipient privacy by moving consent negotiation out of the content layer (tracking pixels) and into the protocol layer (headers).</t>

<section anchor="data-minimization"><name>Data Minimization</name>
<t>Senders receive NO information until the recipient explicitly acts. The simple presence of a <tt>CURE-Ask</tt> header leaks no data.</t>
</section>

<section anchor="tracking-pixel-replacement"><name>Tracking Pixel Replacement</name>
<t>By providing a reliable channel for consent, CURE removes the justification for &quot;Open Tracking&quot; pixels. Future receiver policies MAY strictly block tracking pixels for senders who do not implement CURE.</t>
</section>

<section anchor="token-opaqueness"><name>Token Opaqueness</name>
<t>Tokens MUST NOT contain PII visible to the sender. Senders MUST treat tokens as opaque strings.</t>
</section>
</section>

<section anchor="iana-considerations"><name>IANA Considerations</name>
<t>This document requests the registration of two new message headers in the &quot;Permanent Message Header Field Names&quot; registry, a new media type, and a new registry for CURE scopes.</t>

<section anchor="cure-ask"><name>CURE-Ask</name>

<ul spacing="compact">
<li><strong>Header field name</strong>: CURE-Ask</li>
<li><strong>Applicable protocol</strong>: mail</li>
<li><strong>Status</strong>: experimental</li>
<li><strong>Author/Change controller</strong>: IETF</li>
<li><strong>Specification document</strong>: this document</li>
</ul>
</section>

<section anchor="cure-allow"><name>CURE-Allow</name>

<ul spacing="compact">
<li><strong>Header field name</strong>: CURE-Allow</li>
<li><strong>Applicable protocol</strong>: mail</li>
<li><strong>Status</strong>: experimental</li>
<li><strong>Author/Change controller</strong>: IETF</li>
<li><strong>Specification document</strong>: this document</li>
</ul>
</section>

<section anchor="cure-scope-registry"><name>CURE Scope Registry</name>
<t>This document creates the &quot;CURE Scope&quot; registry. Initial entries:</t>

<ul spacing="compact">
<li><strong>transactional</strong>: Strictly for transactional notifications (receipts, alerts).</li>
<li><strong>promotional</strong>: For marketing or promotional content.</li>
<li><strong>relationship</strong>: For ongoing relational updates (newsletters, digests).</li>
</ul>
</section>

<section anchor="media-type-registration"><name>Media Type Registration</name>

<ul spacing="compact">
<li><strong>Type name</strong>: application</li>
<li><strong>Subtype name</strong>: cure-token+json</li>
<li><strong>Required parameters</strong>: None</li>
<li><strong>Encoding considerations</strong>: UTF-8</li>
<li><strong>Security considerations</strong>: See Section 6</li>
<li><strong>Interoperability considerations</strong>: See Section 5.4</li>
</ul>
</section>
</section>


  </middle>
  <back>
<section anchor="references"><name>References</name>

<section anchor="normative-references"><name>Normative References</name>
<t>[RFC2119]  Bradner, S., &quot;Key words for use in RFCs to Indicate Requirement Levels&quot;, BCP 14, RFC 2119, DOI 10.17487/RFC2119, March 1997.</t>
<t>[RFC5234]  Crocker, D., Ed. and P. Overell, &quot;Augmented BNF for Syntax Specifications: ABNF&quot;, STD 68, RFC 5234, DOI 10.17487/RFC5234, January 2008.</t>
<t>[RFC5322]  Resnick, P., Ed., &quot;Internet Message Format&quot;, RFC 5322, DOI 10.17487/RFC5322, October 2008.</t>
<t>[RFC8174]  Leiba, B., &quot;Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words&quot;, BCP 14, RFC 8174, DOI 10.17487/RFC8174, May 2017.</t>
</section>
</section>

<section anchor="protocol-examples"><name>Protocol Examples</name>

<section anchor="introduction-request-cold-start"><name>Introduction Request (Cold Start)</name>
<t>The sender <tt>sender@example.com</tt> sends a first message to <tt>receiver@example.net</tt>. Note the use of <tt>rpt</tt> to direct tokens to a machine-readable endpoint.</t>

<artwork><![CDATA[From: sender@example.com
To: receiver@example.net
Subject: Welcome to Sender Service
Date: Mon, 25 Jan 2026 09:00:00 -0000
Message-ID: <msg1@example.com>
CURE-Ask: v=1; scope=relationship; rpt=mailto:tokens@example.com; rate=1/1d

Hello! Please reply to this email to subscribe to our updates.
]]></artwork>
</section>

<section anchor="explicit-token-return"><name>Explicit Token Return</name>
<t>The recipient chooses to &quot;Allow&quot; or &quot;Reply&quot;. The Recipient Domain <tt>example.net</tt> generates a separate notification to <tt>tokens@example.com</tt>.</t>

<artwork><![CDATA[From: no-reply@example.net
To: tokens@example.com
Subject: CURE Token Delivery
Date: Mon, 25 Jan 2026 09:05:00 -0000
Content-Type: application/cure-token+json

{
  "token": "dGhpcyBpcyBhIHZhbGlkIHRva2Vu...",
  "scope": "relationship",
  "expiry": "2026-07-25T00:00:00Z",
  "issuer": "example.net"
}
]]></artwork>
</section>

<section anchor="consented-delivery"><name>Consented Delivery</name>
<t>The sender uses the token to deliver a subsequent message.</t>

<artwork><![CDATA[From: sender@example.com
To: receiver@example.net
Subject: Your Weekly Digest
Date: Tue, 01 Feb 2026 09:00:00 -0000
Message-ID: <msg2@example.com>
CURE-Allow: v=1; token=dGhpcyBpcyBhIHZhbGlkIHRva2Vu...

Here is the update you requested.
]]></artwork>
</section>
</section>


  </back>
</rfc>
