| Internet-Draft | MoLE HTTP Transport | June 2026 |
| Meunier | Expires 25 December 2026 | [Page] |
MoLE targets browser deployments, so Clients, Anchors, Moderators, and Sites need an HTTP transport for the protocol flows defined by the architecture.¶
This document defines HTTP authentication scheme for endorsement, credential issuance, and credential presentation. It also defines configuration material exposed by Anchors and Moderators.¶
This note is to be removed before publishing as an RFC.¶
The latest revision of this draft can be found at https://moderation-of-unlinkable-endorsements.github.io/internet-drafts/draft-schlesinger-mole-http-transport.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-schlesinger-mole-http-transport/.¶
Source for this draft and an issue tracker can be found at https://github.com/Moderation-of-unLinkable-Endorsements/internet-drafts.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 25 December 2026.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
TODO¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" 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.¶
This document uses the TLS presentation language [TLS13] to describe the structure of protocol messages. In addition to the base syntax, it uses two additional features: the ability for fields to be optional and the ability for vectors to have variable-size length headers.¶
An optional value is encoded with a presence-signaling octet, followed by the value itself if present. When decoding, a presence octet with a value other than 0 or 1 MUST be rejected as malformed.¶
struct {
uint8 present;
select (present) {
case 0: struct{};
case 1: T value;
};
} optional<T>;
¶
In the TLS presentation language, vectors are encoded as a sequence of encoded elements prefixed with a length. The length field has a fixed size set by specifying the minimum and maximum lengths of the encoded sequence of elements.¶
In this document, there are several vectors whose sizes vary over significant
ranges. So instead of using a fixed-size length field, it uses a variable-size
length using a variable-length integer encoding based on the one described in
Section 16 of [QUIC]. They differ only in that the one here requires a
minimum-size encoding. Instead of presenting min and max values, the vector
description simply includes a V. For example:¶
struct {
uint32 fixed<0..255>;
opaque variable<V>;
} StructWithVectors;
¶
We describe the HTTP authentication method used by a Client that has an Endorsement from an Anchor and obtains a Credential from a Moderator.¶
The Mole authentication scheme follows the HTTP authentication framework
defined in [HTTP]. The same scheme is used for three protocol exchanges:
Client to Anchor endorsement, Client to Moderator credential issuance, and
Client to Site credential presentation.¶
Mole-Issuance is a placeholder header. We might want Mole-Presentation as well.¶
TODO(thibault) 1. if protocol section goes into its own draft, this should follow 2. I suspect we'll use JSON here. If we use key material, I think re-using JWKS is important (even if there are feelings).¶
Anchors and Moderators publish configuration used by Clients and Sites before running the HTTP authentication flows. Configuration includes endpoint URLs, supported protocol types, public key material, and the Anchor set associated with each Moderator policy.¶
Sites can use MoLE as optional authentication. A 200 response MAY include a
WWW-Authenticate: Mole challenge. This tells the Client that a later request
can include a presentation, for example to get a higher limit or avoid other
friction.¶
A 401 response with a WWW-Authenticate: Mole challenge means that the Site
requires MoLE, or another acceptable authentication scheme, before serving the
resource. A 403 response means that the Site understood the presented MoLE
material but did not accept it under policy.¶
The criteria to provide an endorsement is left to the Anchor. This document only defines the HTTP carriage for the Endorsement protocol messages.¶
struct {
uint16 endorsement_type;
opaque anchor_context<V>;
} EndorsementChallenge;
¶
WWW-Authenticate: Mole challenge="<endorsement-challenge>", realm="anchor"¶
struct {
uint16 endorsement_type;
opaque request<V>;
} EndorsementRequest;
¶
Authorization: Mole endorsement-request="<endorsement-request>"¶
struct {
uint16 endorsement_type;
opaque response<V>;
} EndorsementResponse;
¶
Mole-Endorsement: response="<endorsement-response>"¶
struct {
uint16 endorsement_type; // We always want endorsement type to be present
opaque challenge<V>;
} ModeratorChallenge;
¶
The challenge field is interpreted by the selected endorsement type.¶
The following structure is an example refinement of ModeratorChallenge.¶
struct {
opaque policy_context<V>; // Moderator-generated policy identifier
opaque anchor_set<V>; // Endorsement-type-specific Anchor material
} MoleModeratorChallenge;
¶
In MoleModeratorChallenge, anchor_set is opaque. Clients MUST NOT assume
array semantics unless the endorsement type defines them.¶
WWW-Authenticate: Mole challenge="<moderator-challenge>", realm="moderator"¶
MUST be prefixed by endorsement_type.¶
Authorization: Mole endorsement="..."¶
struct {
uint16 credential_type; // We always want credential type to be present
opaque challenge<V>;
} CredentialChallenge;
¶
The challenge field is interpreted by the selected credential type.¶
The following structures are example refinements of CredentialChallenge.¶
struct {
opaque moderator_uri<1..2^16-1>; // URI of the moderator
opaque presentation_context<V>;
} MoleCredentialChallenge;
struct {
opaque policy_context<V>; // Moderator-generated policy identifier
opaque site_context<V>; // Site-chosen binding value, analogous to redemption_context in RFC9577
} MolePresentationContext;
¶
The moderator_uri field contains a URI (defined by [URI]).¶
In MolePresentationContext, policy_context is generated by the Moderator. It
identifies the Moderator policy and accepted Anchor set used for this Site.
Different sites MAY use different policy contexts while sharing the same
Moderator. The value MUST be non-empty.¶
The site_context field is chosen by the Site. It binds the presentation to a
request, session, or time window. A non-empty value affects credential caching
and replay handling.¶
TODO(thibault): 1. decide exact construction rules for site_context. maybe it should include policy_context. These two are separate from now to showcase the site is likely to proxy content from the moderator.¶
WWW-Authenticate: Mole challenge="<credential-challenge>", realm="site"¶
struct {
uint16 credential_type; // We always want credential type to be present
opaque presentation_and_update<V>;
} CredentialPresentation;
¶
The presentation_and_update field is interpreted by the selected credential
type.¶
The following structure is an example refinement of CredentialPresentation.¶
struct {
opaque presentation_context<V>;
opaque presentation_proof[Npp];
opaque update_request[Nur];
} MolePresentationAndUpdate;
¶
TODO(thibault):
1. decide exact construction rules for presentation_and_update.¶
Authorization: Mole presentation="<credential-presentation>"¶
For Credential types that require private verification, the Site MUST validate
the presentation with the Moderator identified by moderator_uri before
granting access to a protected resource.¶
The exact validation method is TBD.¶
TODO(thibault): provide an actual instantiation example.¶
struct {
uint16 credential_type;
opaque presentation_and_update<V>;
} ValidationRequest;
¶
struct {
uint16 credential_type;
uint8 valid;
opaque update_response<V>;
} ValidationResult;
¶
TODO(thibault) 1. This is the only place where we don't have an established pattern. We need to define a new header. [REVERSE-FLOW] uses PrivacyPass-Reverse. Here is a Mole-Update. I'd like something clearer. 2. Headers do not have a fixed protocol limit, but large values are hard to deploy. Other instantiations may define another method, such as returning a URL that the client can fetch. TBD¶
struct {
uint16 credential_type;
opaque update_response<V>;
} CredentialUpdate;
struct {
optional<CredentialUpdate> update;
} OptionalCredentialUpdate;
¶
The Site MUST send Mole-Update. The Site sets the update when the Credential
remains usable after presentation. The Site marks the update as absent to
intentionally consume the Credential. Clients MUST follow the Credential type
semantics for reuse after an omitted update.¶
Mole-Update: update="<optional-credential-update>"¶
Each credential type MUST define the challenge fields that partition cached Credentials, or state that Credentials of that type are not cacheable.¶
In Section 4, we define two protocol registries: endorsement and site.¶
0x0001 - Anchor-Hiding endorsement¶
This is the first protocol¶
0x0001 - ACT¶
See [PRIVACYPASS_ACT]. Will need to be adapted to be specific here.¶
0x0002 - ReverseFlow(VOPRF(P384))¶
Presenting a VOPRF token, with the update being a request for a new VOPRF token.¶
TODO acknowledge.¶