<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
]>
<rfc submissionType="IETF" category="std" ipr="trust200902" docName="draft-wiley-ztaaat-00" consensus="true">
	<!-- Generated by id2xml 1.5.2 on 2026-04-22T00:17:09Z -->
	<?rfc strict="yes"?>
	<?rfc compact="yes"?>
	<?rfc subcompact="no"?>
	<?rfc symrefs="yes"?>
	<?rfc sortrefs="yes"?>
	<?rfc text-list-symbols="o*+-"?>
	<!--
   draft-wiley-ztaaat-00.txt(6): Warning: Did not expect any more top left text,
   found 'draft-wiley-ztaaat-00'
   --><front>
	<title abbrev="ZTAAT">Zero Trust Attribute Assertion Tokens</title>
	<author initials="D." surname="Wiley" fullname="Devin Wiley">
	<address>
	<postal>
	<country>US</country>
	</postal>
	<email>devin.d.wiley@gmail.com</email>
	</address>
	</author>

	<date year="2026" month="April" day="21"/>
	<abstract><t>
   This document defines a mechanism for verifying boolean eligibility
   claims using cryptographically signed assertion tokens. A relying
   party can verify authoritative answers to predefined claims without
   trusting the presenting subject and without learning the subject's
   identity.</t>

	<t>
   Each assertion token encodes exactly one boolean claim. The system
   guarantees authenticity and integrity of claim assertions. It does
   not provide identity, authentication, or subject uniqueness.</t>

	</abstract>
	</front>

	<middle>
	<section title="Introduction" anchor="sect-1"><t>
   Many services require verification of user attributes rather than
   identity. Existing mechanisms frequently disclose unnecessary
   information and enable cross-service tracking.</t>

	<t>
   This document specifies a zero-trust attribute assertion system in
   which:</t>

	<t><list style="symbols"><t>A relying party requests a single boolean claim.</t>

	<t>An issuer evaluates that claim.</t>

	<t>The issuer produces a signed assertion token.</t>

	<t>The subject presents the token to the relying party.</t>

	<t>The relying party verifies the token without contacting the issuer.</t>

	</list>
	</t>

	<t>
   The subject is untrusted. All claim validity derives solely from the
   issuer's signature.</t>

	</section>

	<section title="Terminology" anchor="sect-2"><t>
   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 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they appear in all
   capitals.</t>

	<t><list style="hanging" hangIndent="3"><t hangText="Subject:">
	<vspace blankLines="0"/>
	An individual presenting an assertion token.
	</t>

	<t hangText="Issuer:">
	<vspace blankLines="0"/>
	An authority capable of evaluating and asserting claims.
	</t>

	<t hangText="Relying Party (RP):">
	<vspace blankLines="0"/>
	An entity requesting verification of claims.
	</t>

	<t hangText="Claim:">
	<vspace blankLines="0"/>
	A boolean predicate defined by the issuer.
	</t>

	<t hangText="Assertion Token:">
	<vspace blankLines="0"/>
	A cryptographically signed structure containing one claim result.
	</t>

	</list>
	</t>

	</section>

	<section title="Privacy Model" anchor="sect-3"><section title="Issuance and Presentation" anchor="sect-3.1"><t>
   Token issuance and token presentation are distinct phases.</t>

	<t>
   During issuance, the issuer MAY verify subject identity using
   authoritative records. The issuer MAY learn that a token is being
   requested but MUST NOT learn the intended relying party.</t>

	<t>
   During presentation, the relying party MAY learn that a subject is
   requesting access to a resource but MUST NOT learn the subject's
   identity from the token.</t>

	<t>
   The issuer MUST NOT observe token presentation.</t>

	</section>

	<section title="Privacy Invariants" anchor="sect-3.2"><t>
   The following invariants are REQUIRED:</t>

	<t><list style="numbers"><t>Assertion tokens MUST NOT contain identifiers, pseudonyms, or
       stable entropy.</t>

	<t>Tokens intended for different relying parties MUST be unlinkable.</t>

	<t>The issuer MUST NOT learn the intended relying party.</t>

	<t>Tokens MUST reveal only the requested claim.</t>

	<t>Tokens MUST NOT enable cross-service tracking.</t>

	</list>
	</t>

	</section>

	</section>

	<section title="Claim Model" anchor="sect-4"><section title="Claim Registry" anchor="sect-4.1"><t>
   Claims MUST be defined in an issuer-controlled registry.</t>

	<t>
   Claims:</t>

	<t><list style="symbols"><t>MUST be boolean</t>

	<t>MUST be coarse-grained</t>

	<t>MUST NOT encode identifying information</t>

	</list>
	</t>

	<t>
   Example claims include:</t>

	<t><list style="symbols"><t>is_over_18</t>

	<t>is_us_citizen</t>

	<t>is_us_resident</t>

	</list>
	</t>

	</section>

	<section title="Claim Restrictions" anchor="sect-4.2"><t>
   Each AssertionToken MUST encode exactly one claim result.</t>

	<t>
   A relying party requiring multiple claims MUST obtain and verify
   separate tokens for each claim.</t>

	<t>
   Relying parties MUST NOT request arbitrary claims outside the
   registry.</t>

	</section>

	</section>

	<section title="Assertion Token Format" anchor="sect-5"><figure><artwork><![CDATA[
AssertionToken = {
   claim: claim_name,
   value: boolean,
   exp: timestamp,
   aud: audience_value,
   iss: issuer_identifier,
   sig: signature
}

Field definitions:
]]></artwork>
	</figure>
	<t><list style="hanging" hangIndent="3"><t hangText="claim:">
	<vspace blankLines="0"/>
	The requested boolean claim.
	</t>

	<t hangText="value:">
	<vspace blankLines="0"/>
	The asserted truth value.
	</t>

	<t hangText="exp:">
	<vspace blankLines="0"/>
	Expiration time.
	</t>

	<t hangText="aud:">
	<vspace blankLines="0"/>
	An opaque value bound to a single relying party. The value MUST be
      meaningful only to the relying party and MUST NOT reveal relying
      party identity to the issuer.
	</t>

	<t hangText="iss:">
	<vspace blankLines="0"/>
	Identifier of the issuer.
	</t>

	<t hangText="sig:">
	<vspace blankLines="0"/>
	Digital signature over all fields.
	</t>

	</list>
	</t>

	<t>
   Requirements:</t>

	<t><list style="symbols"><t>Tokens MUST be audience-bound.</t>

	<t>Tokens MUST be unmodifiable.</t>

	<t>Tokens MUST NOT contain identifiers.</t>

	<t>The expiration time MUST be no more than 10 minutes after issuance.</t>

	</list>
	</t>

	</section>

	<section title="Protocol" anchor="sect-6"><section title="Claim Request" anchor="sect-6.1"><figure><artwork><![CDATA[
ClaimRequest = {
   claim: claim_name,
   audience: audience_value
}

The audience value MUST:
]]></artwork>
	</figure>
	<t><list style="symbols"><t>be meaningful only to the relying party</t>

	<t>not reveal relying party identity to the issuer</t>

	<t>not be derivable by the issuer</t>

	</list>
	</t>

	</section>

	<section title="Issuance" anchor="sect-6.2"><t>
   The issuer evaluates the requested claim and produces a signed
   assertion token.</t>

	<t>
   The issuance process MUST prevent the issuer from learning the
   intended relying party.</t>

	<t>
   The issuer MAY learn that a request occurred but MUST NOT learn the
   audience value.</t>

	</section>

	<section title="Token Presentation" anchor="sect-6.3"><t>
   The subject provides the AssertionToken to the relying party.</t>

	</section>

	<section title="Verification" anchor="sect-6.4"><t>
   The relying party MUST:</t>

	<t><list style="numbers"><t>Verify the token signature using issuer verification material.</t>

	<t>Verify expiration.</t>

	<t>Verify that the audience value matches a relying-party-local
       value.</t>

	<t>Apply relying-party replay policy.</t>

	<t>Evaluate the claim.</t>

	</list>
	</t>

	<t>
   Verification MUST NOT require real-time issuer interaction.</t>

	</section>

	<section title="Issuer Trust" anchor="sect-6.5"><t>
   Relying parties MUST maintain a local trust configuration of accepted
   issuers.</t>

	<t>
   Trust MUST be scoped per issuer and per claim. An issuer MUST NOT
   assert claims outside its authoritative domain.</t>

	</section>

	</section>

	<section title="Token Lifetime" anchor="sect-7"><t>
   Tokens MUST expire within 10 minutes of issuance.</t>

	<t>
   Tokens MUST NOT be renewable.</t>

	</section>

	<section title="Cryptographic Requirements" anchor="sect-8"><t>
   Assertion tokens MUST be digitally signed by the issuer.</t>

	<t>
   A relying party MUST verify the issuer signature using trusted
   verification material.</t>

	<t>
   Issuers MUST make verification material available through a trusted
   distribution mechanism.</t>

	<t>
   This specification does not mandate specific cryptographic
   algorithms or key formats.</t>

	</section>

	<section title="Security Considerations" anchor="sect-9"><t>
   The primary threat is unauthorized claim assertion.</t>

	<t>
   This protocol mitigates:</t>

	<t><list style="symbols"><t>forgery through signature verification</t>

	<t>tampering through integrity checks</t>

	<t>cross-relying-party misuse through audience binding</t>

	</list>
	</t>

	<t>
   Replay is handled by relying-party policy.</t>

	</section>

	<section title="Trust Model" anchor="sect-10"><t>
   The subject is untrusted.</t>

	<t>
   The issuer is trusted only for correctness of claim evaluation.</t>

	<t>
   The relying party trusts only issuer signatures and local policy.</t>

	<t>
   The protocol guarantees claim authenticity and integrity, but does
   not guarantee identity or subject uniqueness.</t>

	</section>

	<section title="IANA Considerations" anchor="sect-11"><t>
   This document has no IANA actions.</t>

	</section>

	</middle>

	<back>
	<references title="Normative References">
	&RFC2119;
	&RFC8174;
	</references>
	</back>

	</rfc>
	
