| Internet-Draft | rttp URI Scheme | September 2026 |
| Li | Expires 24 March 2027 | [Page] |
This document specifies the "rttp" URI scheme. An "rttp" URI names a claim of intent directed at an identified subject; the address of that subject is derived by computation from the URI authority, and no lookup service, registry, or name-resolution system is consulted at resolution time. The document also states the requirements a client MUST satisfy when it handles such a URI, in order to avoid two failure modes that short, user-embeddable strings otherwise invite: using the authority as a navigation target (open redirect), and using a registered protocol handler as a general-purpose launcher.¶
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 24 March 2027.¶
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.¶
Most URI schemes name a location: the authority identifies a host to be contacted. This document specifies a scheme that names something else: a claim of intent directed at an identified subject. What a client does with that claim is defined by the scheme; where the subject might be reached is not part of the URI and is not resolved through any lookup service.¶
Three properties follow from that choice and are normative in this document:¶
The scheme is subject to registration with IANA under [RFC7595]. Its registration status is recorded in Section 8; as of this writing the request is submitted and pending, and the name is not registered.¶
Readers familiar with other "agent" or identity addressing schemes should note what is not claimed here. This document does not define a discovery mechanism, a transport, a key directory, or an authorization decision. It defines a URI scheme and the minimum client behaviour that makes the scheme safe to embed.¶
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 ABNF notation of [RFC5234] and the URI syntax of [RFC3986].¶
Terminology:¶
<intent>.<pillar>.<root> defined in
Section 3.1. It is a name, not a host name, and is never
resolved.¶
authority.¶
intent, a human-readable token
identifying a subject. In the hash form, a fixed-width derived
value.¶
The general form of an rttp URI is:¶
rttp://<intent>.<pillar>.<root>[/<action>]¶
The authority comprises exactly three dot-separated segments, in this order:¶
intent: either 8 lowercase hexadecimal digits, or a
readable token matching 1*( %x61-7A / DIGIT / "-" ). The
hash form is a derived value; the readable form is an operator-chosen
label. Both are opaque to a client.¶
pillar: an operator-chosen label matching
1*( %x61-7A / DIGIT / "-" ). This document defines
no enumeration of pillar labels and no registry for
them; the label is meaningful to the operator that assigned it.¶
root: an operator-chosen label matching
1*( %x61-7A / DIGIT / "-" ).¶
The action, when present, is a single path segment:
"/" 1*( %x61-7A / DIGIT / "-" ).¶
ABNF:¶
rttp-URI = "rttp://" authority [ "/" action ] authority = intent "." pillar "." root intent = hash-intent / name-intent hash-intent = 8 lowhex name-intent = 1*( %x61-7A / DIGIT / "-" ) pillar = 1*( %x61-7A / DIGIT / "-" ) root = 1*( %x61-7A / DIGIT / "-" ) action = 1*( %x61-7A / DIGIT / "-" ) lowhex = %x30-39 / %x61-66¶
Examples (the example labels are reserved names per
[RFC2606]; operators use labels they control):¶
rttp://f3b2a1c4.pillar.example/vessel rttp://organ.pillar.example/verify rttp://f3b2a1c4.pillar.example¶
The fragment component is not part of this scheme and MUST NOT be used to address an action.¶
., / and :// are the delimiters defined
by this scheme.¶
userinfo, no port, no
query, and no fragment. A URI containing any of them is not a
valid rttp URI. In particular, credentials cannot appear in an
rttp URI, and there is no field in which to exfiltrate
data.¶
Dereferencing an rttp URI without an action requests the
default operation: one stateful, single round-trip
semantic request against the subject named by the authority.¶
The default operation is safe in the sense of Section 3.1 of [RFC3986]: it creates no obligations and mutates no state of the subject.¶
When an action is present, the default operation is not implied for it. An action names what is claimed to be intended; the safety of a given action is not defined by this document, and a client MUST NOT infer safety from this section (Section 5).¶
The routing address of an rttp URI is derived from the
authority alone:¶
canonical_authority = intent "." pillar "." root
(lowercase, US-ASCII)
ROUTE_SHARD = SHA-256(ASCII(canonical_authority))[0:16]
¶
The authority only: the scheme name is excluded,
// is excluded, and any action is excluded.¶
| Property | Meaning |
|---|---|
| Deterministic | The same authority always yields the same address. |
| Pure computation | No DNS, no registry, no network access, no lookup service. |
| One-way | The authority cannot be recovered from the address. |
| Action-independent | Different actions on one authority yield the same address. |
The last property is the reason an action is not part of the addressing component: an address is where, not what. Were the action to participate in derivation, two different actions on one subject would become two different addresses, splitting one subject into several.¶
Because the derivation is a computation on a string, the URI is
usable without network access, and no third party is consulted when it
is used. A client MUST NOT perform a lookup in order to use an
rttp URI (Section 4).¶
A client that handles an rttp URI (including a resolver
page, a protocol handler, and a library that renders one) MUST satisfy
the requirements below. They follow from Section 5: an
rttp URI may be supplied by an untrusted party, its authority is
a claim rather than a proof, and the strings are short enough to be
embedded anywhere.¶
A protocol handler MUST reject any input whose scheme is neither
rttp nor the exact scheme name under which that handler was
itself registered. Without this check, the handler becomes a
general-purpose launcher that any page can use to open an arbitrary URI
of any scheme.¶
The ability to handle rttp URIs MUST NOT be acquired without
an explicit action by the user, and a client MUST NOT simulate,
pre-select, or otherwise bypass that consent. Where the platform exposes
the list of registered handlers, that list MUST NOT be exposed to the
network.¶
rttp://<intent>.<pillar>.<root>/<action>
is a short, human-readable string that any page can embed in a link.
Without the rules above, the scheme would hand third parties two
primitive attacks: using an operator's own domain as a redirector, and
using a registered handler as a launcher for URIs the user never
intended to open. Both are properties of the embedding context,
not of the URI syntax, which is why they are stated as client
requirements rather than as grammar rules.¶
rttp URI is a claim of intent against a
subject. The derived address is an entry fingerprint,
not a proof of identity. Identity is carried by the subject's
AID, and any attestation of it is carried separately.¶
rttps and no fallback: clients that do not
implement the scheme fail closed, and an unrecognised form is rejected
rather than approximated.¶
userinfo is not defined, credentials cannot be
carried in an rttp URI. Operators MUST NOT place secrets in any
component: the URI is expected to be logged, quoted, and rendered.¶
rttp URI establishes nothing about the subject.
A client MUST NOT present a parsed or rendered URI as if it were
evidence of anything.¶
rttp URI does not, by itself, cause any network
traffic to a third party. Any traffic that follows is caused by the
client's own, separately defined handling of the claim.¶
intent labels rather than
derived hashes should be aware that they are choosing names that are
meaningful to humans, which is a privacy trade-off made at assignment
time.¶
rttp URI SHOULD avoid prefetching,
handing the string to third-party services, or otherwise distributing it
beyond what the user's action requires.¶
The canonical form of an rttp URI is lowercase US-ASCII, and
no international form is defined. Characters outside the permitted set are
invalid input rather than input to be converted: a client MUST NOT map a
Unicode label to its ASCII form (for example, by case folding or by
applying an IDNA-style transformation) in order to accept it, and MUST NOT
render an rttp URI as an IRI.¶
This is deliberate. The scheme has no host to resolve, so there is no need for a label-to-ASCII transformation; permitting one would introduce a second way to write one address.¶
IANA is requested to register the URI scheme rttp in the
"Uniform Resource Identifier (URI) Schemes" registry, following the
template of Section 7.4 of [RFC7595]
and the guidance of [RFC8126].¶
Registration status at the time of writing: a registration request was submitted to IANA (ticket #1459939); the request is pending, and the scheme is not registered. It is inaccurate to describe the scheme as "registered", "assigned", or "standardised" until IANA publishes the registration.¶
If this document is approved for publication as an RFC, IANA is requested to update the reference in the registry entry to point at that RFC.¶
The author thanks the reviewers of the URI review process for their attention to the client-behaviour requirements, which are the part of this specification most likely to be misimplemented.¶
rttp://f3b2a1c4.pillar.example/vessel (hash form) rttp://organ.pillar.example/verify (readable form) rttp://f3b2a1c4.pillar.example (default operation)¶
| Input | Reason |
|---|---|
| RTTP://f3b2a1c4.pillar.example/vessel | Uppercase scheme or components are invalid input, not normalisable. |
| rttp://f3b2a1c4.pillar.example/ | Trailing slash with an empty action is not a valid action. |
| rttp://f3b2a1c4.pillar.example?v=1 | No query component is defined. |
| rttp://f3b2a1c4.pillar.example#top | No fragment component is defined. |
| rttp://user@f3b2a1c4.pillar.example/v | No userinfo component is defined. |
| rttp://f3b2a1c4.pillar.example:80/v | No port component is defined. |
| rttp://f3b2a1c4.pillar/v | Authority does not have exactly three segments. |
| rttp://f3b2a1c4.pillar.example/vessel/extra | Action is a single path segment. |
The reference specification at https://rttp.com/RFC-002/ is accompanied by a published set of deterministic conformance vectors, replayed by independent implementations that share no code. Implementations of this scheme are encouraged to replay the URI-parsing portion of that set; agreement is a statement about parsing only, and no performance property is claimed.¶